summaryrefslogtreecommitdiffstats
path: root/vespalib/src
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /vespalib/src
Publish
Diffstat (limited to 'vespalib/src')
-rw-r--r--vespalib/src/.gitignore5
-rw-r--r--vespalib/src/Doxyfile215
-rw-r--r--vespalib/src/apps/eval_expr/.gitignore4
-rw-r--r--vespalib/src/apps/eval_expr/CMakeLists.txt8
-rw-r--r--vespalib/src/apps/eval_expr/eval_expr.cpp27
-rw-r--r--vespalib/src/apps/make_fixture_macros/.gitignore4
-rw-r--r--vespalib/src/apps/make_fixture_macros/CMakeLists.txt7
-rw-r--r--vespalib/src/apps/make_fixture_macros/make_fixture_macros.cpp153
-rw-r--r--vespalib/src/testlist.txt100
-rw-r--r--vespalib/src/tests/.gitignore4
-rw-r--r--vespalib/src/tests/alignedmemory/.cvsignore3
-rw-r--r--vespalib/src/tests/alignedmemory/.gitignore4
-rw-r--r--vespalib/src/tests/alignedmemory/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/alignedmemory/DESC1
-rw-r--r--vespalib/src/tests/alignedmemory/FILES1
-rw-r--r--vespalib/src/tests/alignedmemory/alignedmemory_test.cpp69
-rw-r--r--vespalib/src/tests/alloc/.gitignore3
-rw-r--r--vespalib/src/tests/alloc/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/alloc/DESC1
-rw-r--r--vespalib/src/tests/alloc/FILES1
-rw-r--r--vespalib/src/tests/alloc/alloc_test.cpp94
-rw-r--r--vespalib/src/tests/alloc/allocate_and_core.cpp14
-rw-r--r--vespalib/src/tests/approx/.gitignore1
-rw-r--r--vespalib/src/tests/approx/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/approx/FILES1
-rw-r--r--vespalib/src/tests/approx/approx_test.cpp103
-rw-r--r--vespalib/src/tests/array/.gitignore3
-rw-r--r--vespalib/src/tests/array/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/array/DESC1
-rw-r--r--vespalib/src/tests/array/FILES1
-rw-r--r--vespalib/src/tests/array/array_test.cpp348
-rw-r--r--vespalib/src/tests/arrayqueue/.cvsignore3
-rw-r--r--vespalib/src/tests/arrayqueue/.gitignore4
-rw-r--r--vespalib/src/tests/arrayqueue/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/arrayqueue/DESC1
-rw-r--r--vespalib/src/tests/arrayqueue/FILES1
-rw-r--r--vespalib/src/tests/arrayqueue/arrayqueue.cpp384
-rw-r--r--vespalib/src/tests/atomic/.gitignore6
-rw-r--r--vespalib/src/tests/atomic/CMakeLists.txt15
-rw-r--r--vespalib/src/tests/atomic/DESC1
-rw-r--r--vespalib/src/tests/atomic/FILES1
-rw-r--r--vespalib/src/tests/atomic/atomic_bench.cpp104
-rw-r--r--vespalib/src/tests/atomic/atomic_test.cpp338
-rw-r--r--vespalib/src/tests/barrier/.gitignore2
-rw-r--r--vespalib/src/tests/barrier/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/barrier/FILES1
-rw-r--r--vespalib/src/tests/barrier/barrier_test.cpp59
-rw-r--r--vespalib/src/tests/benchmark_timer/.gitignore1
-rw-r--r--vespalib/src/tests/benchmark_timer/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/benchmark_timer/benchmark_timer_test.cpp43
-rw-r--r--vespalib/src/tests/box/.gitignore2
-rw-r--r--vespalib/src/tests/box/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/box/FILES1
-rw-r--r--vespalib/src/tests/box/box_test.cpp32
-rw-r--r--vespalib/src/tests/closure/.gitignore6
-rw-r--r--vespalib/src/tests/closure/CMakeLists.txt15
-rw-r--r--vespalib/src/tests/closure/autoclosurecaller_test.cpp47
-rw-r--r--vespalib/src/tests/closure/closure_test.cpp263
-rw-r--r--vespalib/src/tests/component/.gitignore4
-rw-r--r--vespalib/src/tests/component/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/component/DESC1
-rw-r--r--vespalib/src/tests/component/FILES1
-rw-r--r--vespalib/src/tests/component/component.cpp204
-rw-r--r--vespalib/src/tests/compress/.gitignore1
-rw-r--r--vespalib/src/tests/compress/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/compress/DESC1
-rw-r--r--vespalib/src/tests/compress/FILES1
-rw-r--r--vespalib/src/tests/compress/compress_test.cpp141
-rwxr-xr-xvespalib/src/tests/create-test.sh53
-rw-r--r--vespalib/src/tests/delegatelist/.cvsignore3
-rw-r--r--vespalib/src/tests/delegatelist/.gitignore4
-rw-r--r--vespalib/src/tests/delegatelist/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/delegatelist/DESC1
-rw-r--r--vespalib/src/tests/delegatelist/FILES1
-rw-r--r--vespalib/src/tests/delegatelist/delegatelist.cpp822
-rw-r--r--vespalib/src/tests/dual_merge_director/.gitignore2
-rw-r--r--vespalib/src/tests/dual_merge_director/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/dual_merge_director/FILES1
-rw-r--r--vespalib/src/tests/dual_merge_director/dual_merge_director_test.cpp65
-rw-r--r--vespalib/src/tests/eval/compile_cache/.gitignore1
-rw-r--r--vespalib/src/tests/eval/compile_cache/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/compile_cache/compile_cache_test.cpp145
-rw-r--r--vespalib/src/tests/eval/compiled_function/.gitignore1
-rw-r--r--vespalib/src/tests/eval/compiled_function/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/compiled_function/FILES1
-rw-r--r--vespalib/src/tests/eval/compiled_function/compiled_function_test.cpp177
-rw-r--r--vespalib/src/tests/eval/function/.gitignore1
-rw-r--r--vespalib/src/tests/eval/function/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/function/FILES1
-rw-r--r--vespalib/src/tests/eval/function/function_test.cpp778
-rw-r--r--vespalib/src/tests/eval/function_speed/.gitignore1
-rw-r--r--vespalib/src/tests/eval/function_speed/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/function_speed/function_speed_test.cpp132
-rw-r--r--vespalib/src/tests/eval/gbdt/.gitignore3
-rw-r--r--vespalib/src/tests/eval/gbdt/CMakeLists.txt15
-rw-r--r--vespalib/src/tests/eval/gbdt/gbdt_benchmark.cpp277
-rw-r--r--vespalib/src/tests/eval/gbdt/gbdt_test.cpp256
-rw-r--r--vespalib/src/tests/eval/gbdt/model.cpp99
-rw-r--r--vespalib/src/tests/eval/interpreted_function/.gitignore1
-rw-r--r--vespalib/src/tests/eval/interpreted_function/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/interpreted_function/FILES1
-rw-r--r--vespalib/src/tests/eval/interpreted_function/interpreted_function_test.cpp116
-rw-r--r--vespalib/src/tests/eval/node_types/.gitignore1
-rw-r--r--vespalib/src/tests/eval/node_types/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/node_types/node_types_test.cpp241
-rw-r--r--vespalib/src/tests/eval/simple_tensor/.gitignore1
-rw-r--r--vespalib/src/tests/eval/simple_tensor/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/simple_tensor/simple_tensor_test.cpp199
-rw-r--r--vespalib/src/tests/eval/tensor/.gitignore1
-rw-r--r--vespalib/src/tests/eval/tensor/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/tensor/eval_tensor_test.cpp101
-rw-r--r--vespalib/src/tests/eval/value_type/.gitignore1
-rw-r--r--vespalib/src/tests/eval/value_type/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eval/value_type/value_type_test.cpp327
-rw-r--r--vespalib/src/tests/eventbarrier/.gitignore4
-rw-r--r--vespalib/src/tests/eventbarrier/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/eventbarrier/DESC1
-rw-r--r--vespalib/src/tests/eventbarrier/FILES1
-rw-r--r--vespalib/src/tests/eventbarrier/eventbarrier.cpp205
-rw-r--r--vespalib/src/tests/exception_classes/.gitignore1
-rw-r--r--vespalib/src/tests/exception_classes/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/exception_classes/FILES1
-rw-r--r--vespalib/src/tests/exception_classes/exception_classes_test.cpp36
-rw-r--r--vespalib/src/tests/executor/.cvsignore3
-rw-r--r--vespalib/src/tests/executor/.gitignore8
-rw-r--r--vespalib/src/tests/executor/CMakeLists.txt22
-rw-r--r--vespalib/src/tests/executor/DESC1
-rw-r--r--vespalib/src/tests/executor/FILES1
-rw-r--r--vespalib/src/tests/executor/executor_test.cpp43
-rw-r--r--vespalib/src/tests/executor/stress_test.cpp150
-rw-r--r--vespalib/src/tests/executor/threadstackexecutor_test.cpp119
-rw-r--r--vespalib/src/tests/explore_modern_cpp/.gitignore1
-rw-r--r--vespalib/src/tests/explore_modern_cpp/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/explore_modern_cpp/FILES1
-rw-r--r--vespalib/src/tests/explore_modern_cpp/explore_modern_cpp_test.cpp31
-rw-r--r--vespalib/src/tests/false/.gitignore4
-rw-r--r--vespalib/src/tests/false/CMakeLists.txt7
-rw-r--r--vespalib/src/tests/false/DESC1
-rw-r--r--vespalib/src/tests/false/FILES1
-rw-r--r--vespalib/src/tests/false/false.cpp15
-rw-r--r--vespalib/src/tests/fiddle/.gitignore1
-rw-r--r--vespalib/src/tests/fiddle/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/fiddle/FILES1
-rw-r--r--vespalib/src/tests/fiddle/fiddle_test.cpp156
-rw-r--r--vespalib/src/tests/gencnt/.gitignore4
-rw-r--r--vespalib/src/tests/gencnt/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/gencnt/DESC2
-rw-r--r--vespalib/src/tests/gencnt/FILES1
-rw-r--r--vespalib/src/tests/gencnt/gencnt_test.cpp86
-rw-r--r--vespalib/src/tests/guard/.gitignore6
-rw-r--r--vespalib/src/tests/guard/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/guard/DESC1
-rw-r--r--vespalib/src/tests/guard/FILES1
-rw-r--r--vespalib/src/tests/guard/guard_test.cpp268
-rw-r--r--vespalib/src/tests/hashmap/.gitignore6
-rw-r--r--vespalib/src/tests/hashmap/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/hashmap/DESC1
-rw-r--r--vespalib/src/tests/hashmap/FILES1
-rw-r--r--vespalib/src/tests/hashmap/hashmap_test.cpp202
-rw-r--r--vespalib/src/tests/hashmap/in.txt235882
-rw-r--r--vespalib/src/tests/host_name/.gitignore1
-rw-r--r--vespalib/src/tests/host_name/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/host_name/FILES1
-rw-r--r--vespalib/src/tests/host_name/host_name_test.cpp18
-rw-r--r--vespalib/src/tests/io/fileutil/.gitignore9
-rw-r--r--vespalib/src/tests/io/fileutil/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/io/fileutil/DESC1
-rw-r--r--vespalib/src/tests/io/fileutil/FILES1
-rw-r--r--vespalib/src/tests/io/fileutil/fileutiltest.cpp686
-rw-r--r--vespalib/src/tests/left_right_heap/.gitignore3
-rw-r--r--vespalib/src/tests/left_right_heap/CMakeLists.txt15
-rw-r--r--vespalib/src/tests/left_right_heap/FILES1
-rw-r--r--vespalib/src/tests/left_right_heap/left_right_heap_bench.cpp358
-rw-r--r--vespalib/src/tests/left_right_heap/left_right_heap_test.cpp271
-rw-r--r--vespalib/src/tests/linkedptr/.gitignore4
-rw-r--r--vespalib/src/tests/linkedptr/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/linkedptr/DESC1
-rw-r--r--vespalib/src/tests/linkedptr/FILES1
-rw-r--r--vespalib/src/tests/linkedptr/linkedptr_test.cpp233
-rw-r--r--vespalib/src/tests/make_fixture_macros/.gitignore2
-rw-r--r--vespalib/src/tests/make_fixture_macros/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/make_fixture_macros/FILES1
-rw-r--r--vespalib/src/tests/make_fixture_macros/make_fixture_macros_test.cpp21
-rw-r--r--vespalib/src/tests/memory/.gitignore4
-rw-r--r--vespalib/src/tests/memory/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/memory/DESC1
-rw-r--r--vespalib/src/tests/memory/FILES1
-rw-r--r--vespalib/src/tests/memory/memory_test.cpp164
-rw-r--r--vespalib/src/tests/net/socket/.gitignore5
-rw-r--r--vespalib/src/tests/net/socket/CMakeLists.txt20
-rw-r--r--vespalib/src/tests/net/socket/socket_client.cpp66
-rw-r--r--vespalib/src/tests/net/socket/socket_server.cpp72
-rw-r--r--vespalib/src/tests/net/socket/socket_test.cpp91
-rw-r--r--vespalib/src/tests/objects/nbostream/.gitignore1
-rw-r--r--vespalib/src/tests/objects/nbostream/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/objects/nbostream/FILES1
-rw-r--r--vespalib/src/tests/objects/nbostream/nbostream_test.cpp267
-rw-r--r--vespalib/src/tests/optimized/.gitignore1
-rw-r--r--vespalib/src/tests/optimized/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/optimized/DESC1
-rw-r--r--vespalib/src/tests/optimized/FILES1
-rw-r--r--vespalib/src/tests/optimized/optimized_test.cpp75
-rw-r--r--vespalib/src/tests/placement-delete/.gitignore7
-rw-r--r--vespalib/src/tests/placement-delete/CMakeLists.txt13
-rw-r--r--vespalib/src/tests/placement-delete/DESC4
-rw-r--r--vespalib/src/tests/placement-delete/FILES4
-rw-r--r--vespalib/src/tests/placement-delete/fail.cpp2
-rw-r--r--vespalib/src/tests/placement-delete/hello.cpp7
-rw-r--r--vespalib/src/tests/placement-delete/placement-delete.cpp29
-rw-r--r--vespalib/src/tests/placement-delete/undef.cpp34
-rw-r--r--vespalib/src/tests/printable/.gitignore4
-rw-r--r--vespalib/src/tests/printable/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/printable/DESC1
-rw-r--r--vespalib/src/tests/printable/FILES1
-rw-r--r--vespalib/src/tests/printable/printabletest.cpp153
-rw-r--r--vespalib/src/tests/priority_queue/.gitignore1
-rw-r--r--vespalib/src/tests/priority_queue/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/priority_queue/DESC1
-rw-r--r--vespalib/src/tests/priority_queue/FILES1
-rw-r--r--vespalib/src/tests/priority_queue/priority_queue_test.cpp191
-rw-r--r--vespalib/src/tests/random/.gitignore6
-rw-r--r--vespalib/src/tests/random/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/random/DESC1
-rw-r--r--vespalib/src/tests/random/FILES1
-rw-r--r--vespalib/src/tests/random/Tr.java13
-rw-r--r--vespalib/src/tests/random/friendfinder.cpp58
-rw-r--r--vespalib/src/tests/random/random_test.cpp166
-rw-r--r--vespalib/src/tests/referencecounter/.gitignore4
-rw-r--r--vespalib/src/tests/referencecounter/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/referencecounter/DESC1
-rw-r--r--vespalib/src/tests/referencecounter/FILES1
-rw-r--r--vespalib/src/tests/referencecounter/referencecounter_test.cpp57
-rw-r--r--vespalib/src/tests/regex/.gitignore4
-rw-r--r--vespalib/src/tests/regex/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/regex/DESC1
-rw-r--r--vespalib/src/tests/regex/FILES1
-rw-r--r--vespalib/src/tests/regex/regex.cpp128
-rw-r--r--vespalib/src/tests/rendezvous/.gitignore1
-rw-r--r--vespalib/src/tests/rendezvous/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/rendezvous/FILES1
-rw-r--r--vespalib/src/tests/rendezvous/rendezvous_test.cpp85
-rw-r--r--vespalib/src/tests/runnable_pair/.gitignore1
-rw-r--r--vespalib/src/tests/runnable_pair/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/runnable_pair/FILES1
-rw-r--r--vespalib/src/tests/runnable_pair/runnable_pair_test.cpp30
-rw-r--r--vespalib/src/tests/rwlock/.gitignore4
-rw-r--r--vespalib/src/tests/rwlock/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/rwlock/DESC1
-rw-r--r--vespalib/src/tests/rwlock/FILES1
-rw-r--r--vespalib/src/tests/rwlock/rwlock_test.cpp80
-rw-r--r--vespalib/src/tests/sha1/.gitignore1
-rw-r--r--vespalib/src/tests/sha1/CMakeLists.txt9
-rw-r--r--vespalib/src/tests/sha1/FILES1
-rw-r--r--vespalib/src/tests/sha1/rfc_sha1.cpp355
-rw-r--r--vespalib/src/tests/sha1/rfc_sha1.h71
-rw-r--r--vespalib/src/tests/sha1/sha1_test.cpp103
-rw-r--r--vespalib/src/tests/sharedptr/.gitignore5
-rw-r--r--vespalib/src/tests/sharedptr/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/sharedptr/DESC1
-rw-r--r--vespalib/src/tests/sharedptr/FILES2
-rw-r--r--vespalib/src/tests/sharedptr/ptrholder.cpp101
-rw-r--r--vespalib/src/tests/signalhandler/.gitignore6
-rw-r--r--vespalib/src/tests/signalhandler/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/signalhandler/DESC1
-rw-r--r--vespalib/src/tests/signalhandler/FILES2
-rw-r--r--vespalib/src/tests/signalhandler/signalhandler_test.cpp35
-rw-r--r--vespalib/src/tests/signalhandler/victim.cpp21
-rw-r--r--vespalib/src/tests/simple_thread_bundle/.gitignore2
-rw-r--r--vespalib/src/tests/simple_thread_bundle/CMakeLists.txt15
-rw-r--r--vespalib/src/tests/simple_thread_bundle/FILES1
-rw-r--r--vespalib/src/tests/simple_thread_bundle/simple_thread_bundle_test.cpp191
-rw-r--r--vespalib/src/tests/simple_thread_bundle/threading_speed_test.cpp78
-rw-r--r--vespalib/src/tests/slaveproc/.gitignore4
-rw-r--r--vespalib/src/tests/slaveproc/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/slaveproc/DESC2
-rw-r--r--vespalib/src/tests/slaveproc/FILES1
-rw-r--r--vespalib/src/tests/slaveproc/slaveproc_test.cpp186
-rw-r--r--vespalib/src/tests/slime/.cvsignore3
-rw-r--r--vespalib/src/tests/slime/.gitignore9
-rw-r--r--vespalib/src/tests/slime/CMakeLists.txt37
-rw-r--r--vespalib/src/tests/slime/DESC1
-rw-r--r--vespalib/src/tests/slime/FILES1
-rw-r--r--vespalib/src/tests/slime/json_slime_benchmark.cpp49
-rw-r--r--vespalib/src/tests/slime/large_json.txt1
-rw-r--r--vespalib/src/tests/slime/slime_binary_format_test.cpp754
-rw-r--r--vespalib/src/tests/slime/slime_inject_test.cpp179
-rw-r--r--vespalib/src/tests/slime/slime_json_format_test.cpp363
-rw-r--r--vespalib/src/tests/slime/slime_test.cpp365
-rw-r--r--vespalib/src/tests/slime/summary-feature-benchmark/.gitignore2
-rw-r--r--vespalib/src/tests/slime/summary-feature-benchmark/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/slime/summary-feature-benchmark/FILES1
-rw-r--r--vespalib/src/tests/slime/summary-feature-benchmark/summary-feature-benchmark.cpp70
-rw-r--r--vespalib/src/tests/slime/type_traits.cpp15
-rw-r--r--vespalib/src/tests/slime/type_traits.h59
-rw-r--r--vespalib/src/tests/stash/.gitignore4
-rw-r--r--vespalib/src/tests/stash/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/stash/DESC1
-rw-r--r--vespalib/src/tests/stash/FILES1
-rw-r--r--vespalib/src/tests/stash/stash.cpp330
-rw-r--r--vespalib/src/tests/stllike/.gitignore15
-rw-r--r--vespalib/src/tests/stllike/CMakeLists.txt49
-rw-r--r--vespalib/src/tests/stllike/DESC2
-rw-r--r--vespalib/src/tests/stllike/FILES2
-rw-r--r--vespalib/src/tests/stllike/asciistream_test.cpp517
-rw-r--r--vespalib/src/tests/stllike/hash_test.cpp479
-rw-r--r--vespalib/src/tests/stllike/hashtable_test.cpp96
-rw-r--r--vespalib/src/tests/stllike/lookup_benchmark.cpp103
-rw-r--r--vespalib/src/tests/stllike/string_test.cpp427
-rw-r--r--vespalib/src/tests/stllike/test.txt2
-rw-r--r--vespalib/src/tests/stllike/uniq_by_sort_map_hash.cpp337
-rw-r--r--vespalib/src/tests/stllike/vector_map_test.cpp24
-rw-r--r--vespalib/src/tests/stringfmt/.gitignore4
-rw-r--r--vespalib/src/tests/stringfmt/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/stringfmt/DESC1
-rw-r--r--vespalib/src/tests/stringfmt/FILES1
-rw-r--r--vespalib/src/tests/stringfmt/fmt.cpp102
-rw-r--r--vespalib/src/tests/sync/.gitignore4
-rw-r--r--vespalib/src/tests/sync/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/sync/DESC1
-rw-r--r--vespalib/src/tests/sync/FILES1
-rw-r--r--vespalib/src/tests/sync/sync_test.cpp323
-rw-r--r--vespalib/src/tests/systemstate/.gitignore3
-rw-r--r--vespalib/src/tests/systemstate/DESC1
-rw-r--r--vespalib/src/tests/systemstate/FILES1
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_builder/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_builder/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_builder/FILES1
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_builder/compact_tensor_builder_test.cpp58
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_v2_builder/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_v2_builder/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_v2_builder/FILES1
-rw-r--r--vespalib/src/tests/tensor/compact_tensor_v2_builder/compact_tensor_v2_builder_test.cpp79
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_builder/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_builder/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_builder/FILES1
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp208
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_operations/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_operations/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_operations/FILES1
-rw-r--r--vespalib/src/tests/tensor/dense_tensor_operations/dense_tensor_operations_test.cpp473
-rw-r--r--vespalib/src/tests/tensor/join_tensor_addresses/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/join_tensor_addresses/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/join_tensor_addresses/FILES1
-rw-r--r--vespalib/src/tests/tensor/join_tensor_addresses/join_tensor_addresses_test.cpp317
-rw-r--r--vespalib/src/tests/tensor/simple_tensor_builder/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/simple_tensor_builder/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/simple_tensor_builder/FILES1
-rw-r--r--vespalib/src/tests/tensor/simple_tensor_builder/simple_tensor_builder_test.cpp52
-rw-r--r--vespalib/src/tests/tensor/tensor/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor/tensor_test.cpp49
-rw-r--r--vespalib/src/tests/tensor/tensor_address/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_address/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_address/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor_address/tensor_address_test.cpp39
-rw-r--r--vespalib/src/tests/tensor/tensor_address_element_iterator/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_address_element_iterator/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_address_element_iterator/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor_address_element_iterator/tensor_address_element_iterator_test.cpp343
-rw-r--r--vespalib/src/tests/tensor/tensor_function/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_function/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_function/tensor_function_test.cpp170
-rw-r--r--vespalib/src/tests/tensor/tensor_mapper/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_mapper/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_mapper/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp226
-rw-r--r--vespalib/src/tests/tensor/tensor_operations/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_operations/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_operations/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor_operations/tensor_operations_test.cpp627
-rw-r--r--vespalib/src/tests/tensor/tensor_performance/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_performance/CMakeLists.txt12
-rw-r--r--vespalib/src/tests/tensor/tensor_performance/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor_performance/tensor_performance_test.cpp371
-rw-r--r--vespalib/src/tests/tensor/tensor_serialization/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_serialization/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_serialization/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor_serialization/tensor_serialization_test.cpp267
-rw-r--r--vespalib/src/tests/tensor/tensor_slime_serialization/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_slime_serialization/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_slime_serialization/FILES1
-rw-r--r--vespalib/src/tests/tensor/tensor_slime_serialization/tensor_slime_serialization_test.cpp209
-rw-r--r--vespalib/src/tests/tensor/tensor_type/.gitignore1
-rw-r--r--vespalib/src/tests/tensor/tensor_type/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tensor/tensor_type/tensor_type_test.cpp312
-rw-r--r--vespalib/src/tests/testapp-debug/.gitignore9
-rw-r--r--vespalib/src/tests/testapp-debug/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/testapp-debug/DESC1
-rw-r--r--vespalib/src/tests/testapp-debug/FILES1
-rw-r--r--vespalib/src/tests/testapp-debug/debugtest.cpp32
-rw-r--r--vespalib/src/tests/testapp-debug/diff.ref18
-rw-r--r--vespalib/src/tests/testapp-debug/testapp-debug.cpp11
-rw-r--r--vespalib/src/tests/testapp-generic/.gitignore4
-rw-r--r--vespalib/src/tests/testapp-generic/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/testapp-generic/DESC1
-rw-r--r--vespalib/src/tests/testapp-generic/FILES1
-rw-r--r--vespalib/src/tests/testapp-generic/testapp-generic.cpp191
-rw-r--r--vespalib/src/tests/testapp-main/.gitignore1
-rw-r--r--vespalib/src/tests/testapp-main/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/testapp-main/FILES1
-rw-r--r--vespalib/src/tests/testapp-main/testapp-main_test.cpp11
-rw-r--r--vespalib/src/tests/testapp-state/.cvsignore3
-rw-r--r--vespalib/src/tests/testapp-state/.gitignore8
-rw-r--r--vespalib/src/tests/testapp-state/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/testapp-state/DESC1
-rw-r--r--vespalib/src/tests/testapp-state/FILES1
-rw-r--r--vespalib/src/tests/testapp-state/expect.txt22
-rw-r--r--vespalib/src/tests/testapp-state/statetest.cpp54
-rw-r--r--vespalib/src/tests/testapp-state/testapp-state.cpp11
-rw-r--r--vespalib/src/tests/testkit-mt/.gitignore1
-rw-r--r--vespalib/src/tests/testkit-mt/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/testkit-mt/FILES1
-rw-r--r--vespalib/src/tests/testkit-mt/testkit-mt_test.cpp88
-rw-r--r--vespalib/src/tests/testkit-subset/.gitignore2
-rw-r--r--vespalib/src/tests/testkit-subset/CMakeLists.txt9
-rw-r--r--vespalib/src/tests/testkit-subset/FILES4
-rw-r--r--vespalib/src/tests/testkit-subset/out.ref.txt20
-rw-r--r--vespalib/src/tests/testkit-subset/testkit-subset_extra.cpp12
-rw-r--r--vespalib/src/tests/testkit-subset/testkit-subset_test.cpp14
-rwxr-xr-xvespalib/src/tests/testkit-subset/testkit-subset_test.sh6
-rw-r--r--vespalib/src/tests/testkit-testcase/.gitignore0
-rw-r--r--vespalib/src/tests/testkit-testhook/.gitignore1
-rw-r--r--vespalib/src/tests/testkit-testhook/CMakeLists.txt9
-rw-r--r--vespalib/src/tests/testkit-testhook/DESC1
-rw-r--r--vespalib/src/tests/testkit-testhook/FILES1
-rw-r--r--vespalib/src/tests/testkit-testhook/testkit-testhook_test.cpp181
-rw-r--r--vespalib/src/tests/text/lowercase/.gitignore1
-rw-r--r--vespalib/src/tests/text/lowercase/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/text/lowercase/DESC1
-rw-r--r--vespalib/src/tests/text/lowercase/FILES1
-rw-r--r--vespalib/src/tests/text/lowercase/lowercase-table.dat664
-rw-r--r--vespalib/src/tests/text/lowercase/lowercase_test.cpp38
-rwxr-xr-xvespalib/src/tests/text/lowercase/to-c-code.pl74
-rw-r--r--vespalib/src/tests/text/lowercase/yell-want.dat792
-rw-r--r--vespalib/src/tests/text/stringtokenizer/.gitignore4
-rw-r--r--vespalib/src/tests/text/stringtokenizer/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/text/stringtokenizer/DESC1
-rw-r--r--vespalib/src/tests/text/stringtokenizer/FILES1
-rw-r--r--vespalib/src/tests/text/stringtokenizer/stringtokenizer_test.cpp72
-rw-r--r--vespalib/src/tests/text/utf8/.gitignore3
-rw-r--r--vespalib/src/tests/text/utf8/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/text/utf8/DESC1
-rw-r--r--vespalib/src/tests/text/utf8/FILES1
-rw-r--r--vespalib/src/tests/text/utf8/make_url.cpp34
-rw-r--r--vespalib/src/tests/text/utf8/regular-utf8.dat1
-rw-r--r--vespalib/src/tests/text/utf8/utf8_test.cpp79
-rw-r--r--vespalib/src/tests/thread/.gitignore1
-rw-r--r--vespalib/src/tests/thread/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/thread/FILES1
-rw-r--r--vespalib/src/tests/thread/thread_test.cpp54
-rw-r--r--vespalib/src/tests/time_tracker/.gitignore1
-rw-r--r--vespalib/src/tests/time_tracker/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/time_tracker/FILES1
-rw-r--r--vespalib/src/tests/time_tracker/time_tracker_test.cpp94
-rw-r--r--vespalib/src/tests/trace/.gitignore4
-rw-r--r--vespalib/src/tests/trace/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/trace/DESC1
-rw-r--r--vespalib/src/tests/trace/FILES1
-rw-r--r--vespalib/src/tests/trace/trace.cpp410
-rw-r--r--vespalib/src/tests/traits/.gitignore1
-rw-r--r--vespalib/src/tests/traits/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/traits/FILES1
-rw-r--r--vespalib/src/tests/traits/traits_test.cpp46
-rw-r--r--vespalib/src/tests/true/.gitignore4
-rw-r--r--vespalib/src/tests/true/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/true/DESC1
-rw-r--r--vespalib/src/tests/true/FILES1
-rw-r--r--vespalib/src/tests/true/true.cpp15
-rw-r--r--vespalib/src/tests/tutorial/.gitignore5
-rw-r--r--vespalib/src/tests/tutorial/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/tutorial/checks/.gitignore2
-rw-r--r--vespalib/src/tests/tutorial/checks/CMakeLists.txt7
-rw-r--r--vespalib/src/tests/tutorial/checks/checks_test.cpp27
-rw-r--r--vespalib/src/tests/tutorial/fixtures/.gitignore2
-rw-r--r--vespalib/src/tests/tutorial/fixtures/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tutorial/fixtures/fixtures_test.cpp20
-rwxr-xr-xvespalib/src/tests/tutorial/make_example.sh19
-rwxr-xr-xvespalib/src/tests/tutorial/make_source.sh7
-rw-r--r--vespalib/src/tests/tutorial/make_tutorial.cpp81
-rw-r--r--vespalib/src/tests/tutorial/minimal/.gitignore2
-rw-r--r--vespalib/src/tests/tutorial/minimal/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tutorial/minimal/minimal_test.cpp4
-rw-r--r--vespalib/src/tests/tutorial/simple/.gitignore2
-rw-r--r--vespalib/src/tests/tutorial/simple/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tutorial/simple/simple_test.cpp12
-rw-r--r--vespalib/src/tests/tutorial/style.inc51
-rw-r--r--vespalib/src/tests/tutorial/threads/.gitignore2
-rw-r--r--vespalib/src/tests/tutorial/threads/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/tutorial/threads/threads_test.cpp17
-rw-r--r--vespalib/src/tests/tutorial/tutorial.html628
-rw-r--r--vespalib/src/tests/tutorial/tutorial_source.html234
-rw-r--r--vespalib/src/tests/tutorial/xml_escape.cpp19
-rw-r--r--vespalib/src/tests/util/generationhandler/.gitignore4
-rw-r--r--vespalib/src/tests/util/generationhandler/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/util/generationhandler/DESC1
-rw-r--r--vespalib/src/tests/util/generationhandler/FILES1
-rw-r--r--vespalib/src/tests/util/generationhandler/generationhandler_test.cpp159
-rw-r--r--vespalib/src/tests/util/generationhandler_stress/.gitignore1
-rw-r--r--vespalib/src/tests/util/generationhandler_stress/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/util/generationhandler_stress/DESC1
-rw-r--r--vespalib/src/tests/util/generationhandler_stress/FILES1
-rw-r--r--vespalib/src/tests/util/generationhandler_stress/generation_handler_stress_test.cpp169
-rw-r--r--vespalib/src/tests/valgrind/.gitignore4
-rw-r--r--vespalib/src/tests/valgrind/CMakeLists.txt11
-rw-r--r--vespalib/src/tests/valgrind/DESC1
-rw-r--r--vespalib/src/tests/valgrind/FILES1
-rw-r--r--vespalib/src/tests/valgrind/valgrind_test.cpp68
-rw-r--r--vespalib/src/tests/weakref/.gitignore4
-rw-r--r--vespalib/src/tests/weakref/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/weakref/DESC1
-rw-r--r--vespalib/src/tests/weakref/FILES1
-rw-r--r--vespalib/src/tests/weakref/weakref_test.cpp46
-rw-r--r--vespalib/src/tests/websocket/.gitignore3
-rw-r--r--vespalib/src/tests/websocket/CMakeLists.txt14
-rw-r--r--vespalib/src/tests/websocket/FILES1
-rw-r--r--vespalib/src/tests/websocket/favicon.icobin0 -> 32038 bytes
-rw-r--r--vespalib/src/tests/websocket/index.html5
-rw-r--r--vespalib/src/tests/websocket/test.html70
-rw-r--r--vespalib/src/tests/websocket/websocket_server.cpp62
-rw-r--r--vespalib/src/tests/websocket/websocket_test.cpp145
-rw-r--r--vespalib/src/tests/zcurve/.gitignore5
-rw-r--r--vespalib/src/tests/zcurve/CMakeLists.txt15
-rw-r--r--vespalib/src/tests/zcurve/DESC1
-rw-r--r--vespalib/src/tests/zcurve/FILES1
-rw-r--r--vespalib/src/tests/zcurve/zcurve_ranges_test.cpp57
-rw-r--r--vespalib/src/tests/zcurve/zcurve_test.cpp399
-rw-r--r--vespalib/src/vespa/vespalib/.gitignore3
-rw-r--r--vespalib/src/vespa/vespalib/CMakeLists.txt23
-rw-r--r--vespalib/src/vespa/vespalib/component/.gitignore4
-rw-r--r--vespalib/src/vespa/vespalib/component/CMakeLists.txt7
-rw-r--r--vespalib/src/vespa/vespalib/component/version.cpp145
-rw-r--r--vespalib/src/vespa/vespalib/component/version.h151
-rw-r--r--vespalib/src/vespa/vespalib/component/versionspecification.cpp148
-rw-r--r--vespalib/src/vespa/vespalib/component/versionspecification.h184
-rw-r--r--vespalib/src/vespa/vespalib/cppunit/.gitignore3
-rw-r--r--vespalib/src/vespa/vespalib/data/CMakeLists.txt6
-rw-r--r--vespalib/src/vespa/vespalib/data/memorydatastore.cpp56
-rw-r--r--vespalib/src/vespa/vespalib/data/memorydatastore.h119
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/.gitignore5
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/CMakeLists.txt39
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/array_traverser.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/array_traverser.h20
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/array_value.cpp31
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/array_value.h58
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/basic_value.cpp31
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/basic_value.h69
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/basic_value_factory.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/basic_value_factory.h44
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/binary_format.cpp265
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/binary_format.h152
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/buffered_input.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/buffered_input.h80
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/buffered_output.cpp34
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/buffered_output.h71
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/convenience.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/convenience.h40
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/cursor.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/cursor.h45
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h32
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inject.cpp81
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inject.h28
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inserter.cpp46
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inserter.h97
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inspector.cpp93
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inspector.h48
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/json_format.cpp499
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/json_format.h26
-rwxr-xr-xvespalib/src/vespa/vespalib/data/slime/make_dist.sh120
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/memory.cpp22
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/memory.h44
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.h30
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.h30
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/nix_value.cpp12
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/nix_value.h27
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/object_traverser.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/object_traverser.h32
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/object_value.cpp79
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/object_value.h88
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/output.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/output.h20
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/resolved_symbol.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/resolved_symbol.h35
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/root_value.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/root_value.h49
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/simple_buffer.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/simple_buffer.h45
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/slime.cpp18
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/slime.h176
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/slime.txt213
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/stored_memory.cpp11
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/stored_memory.h41
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/strfmt.cpp28
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/strfmt.h19
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol.h31
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol_inserter.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol_inserter.h21
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol_lookup.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol_lookup.h20
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol_table.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/symbol_table.h65
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/type.cpp21
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/type.h46
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/value.cpp141
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/value.h85
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/value_factory.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/value_factory.h24
-rw-r--r--vespalib/src/vespa/vespalib/eval/CMakeLists.txt29
-rw-r--r--vespalib/src/vespa/vespalib/eval/basic_nodes.cpp129
-rw-r--r--vespalib/src/vespa/vespalib/eval/basic_nodes.h339
-rw-r--r--vespalib/src/vespa/vespalib/eval/call_nodes.cpp44
-rw-r--r--vespalib/src/vespa/vespalib/eval/call_nodes.h142
-rw-r--r--vespalib/src/vespa/vespalib/eval/check_type.h37
-rw-r--r--vespalib/src/vespa/vespalib/eval/compile_cache.cpp66
-rw-r--r--vespalib/src/vespa/vespalib/eval/compile_cache.h68
-rw-r--r--vespalib/src/vespa/vespalib/eval/compiled_function.cpp50
-rw-r--r--vespalib/src/vespa/vespalib/eval/compiled_function.h64
-rw-r--r--vespalib/src/vespa/vespalib/eval/deinline_forest.cpp48
-rw-r--r--vespalib/src/vespa/vespalib/eval/deinline_forest.h34
-rw-r--r--vespalib/src/vespa/vespalib/eval/delete_node.cpp35
-rw-r--r--vespalib/src/vespa/vespalib/eval/delete_node.h19
-rw-r--r--vespalib/src/vespa/vespalib/eval/eval_spec.cpp351
-rw-r--r--vespalib/src/vespa/vespalib/eval/eval_spec.h159
-rw-r--r--vespalib/src/vespa/vespalib/eval/function.cpp726
-rw-r--r--vespalib/src/vespa/vespalib/eval/function.h70
-rw-r--r--vespalib/src/vespa/vespalib/eval/gbdt.cpp132
-rw-r--r--vespalib/src/vespa/vespalib/eval/gbdt.h115
-rw-r--r--vespalib/src/vespa/vespalib/eval/interpreted_function.cpp399
-rw-r--r--vespalib/src/vespa/vespalib/eval/interpreted_function.h98
-rw-r--r--vespalib/src/vespa/vespalib/eval/key_gen.cpp96
-rw-r--r--vespalib/src/vespa/vespalib/eval/key_gen.h21
-rw-r--r--vespalib/src/vespa/vespalib/eval/llvm_wrapper.cpp607
-rw-r--r--vespalib/src/vespa/vespalib/eval/llvm_wrapper.h66
-rw-r--r--vespalib/src/vespa/vespalib/eval/node_traverser.h28
-rw-r--r--vespalib/src/vespa/vespalib/eval/node_types.cpp304
-rw-r--r--vespalib/src/vespa/vespalib/eval/node_types.h32
-rw-r--r--vespalib/src/vespa/vespalib/eval/node_visitor.h140
-rw-r--r--vespalib/src/vespa/vespalib/eval/operation.cpp89
-rw-r--r--vespalib/src/vespa/vespalib/eval/operation.h136
-rw-r--r--vespalib/src/vespa/vespalib/eval/operation_visitor.h103
-rw-r--r--vespalib/src/vespa/vespalib/eval/operator_nodes.cpp48
-rw-r--r--vespalib/src/vespa/vespalib/eval/operator_nodes.h178
-rw-r--r--vespalib/src/vespa/vespalib/eval/simple_tensor.cpp467
-rw-r--r--vespalib/src/vespa/vespalib/eval/simple_tensor.h84
-rw-r--r--vespalib/src/vespa/vespalib/eval/simple_tensor_engine.cpp95
-rw-r--r--vespalib/src/vespa/vespalib/eval/simple_tensor_engine.h31
-rw-r--r--vespalib/src/vespa/vespalib/eval/tensor.h38
-rw-r--r--vespalib/src/vespa/vespalib/eval/tensor_engine.cpp10
-rw-r--r--vespalib/src/vespa/vespalib/eval/tensor_engine.h51
-rw-r--r--vespalib/src/vespa/vespalib/eval/tensor_nodes.cpp17
-rw-r--r--vespalib/src/vespa/vespalib/eval/tensor_nodes.h103
-rw-r--r--vespalib/src/vespa/vespalib/eval/tensor_spec.cpp10
-rw-r--r--vespalib/src/vespa/vespalib/eval/tensor_spec.h45
-rw-r--r--vespalib/src/vespa/vespalib/eval/value.cpp46
-rw-r--r--vespalib/src/vespa/vespalib/eval/value.h75
-rw-r--r--vespalib/src/vespa/vespalib/eval/value_type.cpp171
-rw-r--r--vespalib/src/vespa/vespalib/eval/value_type.h84
-rw-r--r--vespalib/src/vespa/vespalib/eval/value_type_spec.cpp211
-rw-r--r--vespalib/src/vespa/vespalib/eval/value_type_spec.h18
-rw-r--r--vespalib/src/vespa/vespalib/eval/vm_forest.cpp255
-rw-r--r--vespalib/src/vespa/vespalib/eval/vm_forest.h35
-rw-r--r--vespalib/src/vespa/vespalib/geo/.gitignore6
-rw-r--r--vespalib/src/vespa/vespalib/geo/CMakeLists.txt6
-rw-r--r--vespalib/src/vespa/vespalib/geo/zcurve.cpp189
-rw-r--r--vespalib/src/vespa/vespalib/geo/zcurve.h254
-rw-r--r--vespalib/src/vespa/vespalib/io/.gitignore6
-rw-r--r--vespalib/src/vespa/vespalib/io/CMakeLists.txt6
-rw-r--r--vespalib/src/vespa/vespalib/io/fileutil.cpp754
-rw-r--r--vespalib/src/vespa/vespalib/io/fileutil.h451
-rw-r--r--vespalib/src/vespa/vespalib/net/CMakeLists.txt9
-rw-r--r--vespalib/src/vespa/vespalib/net/server_socket.cpp37
-rw-r--r--vespalib/src/vespa/vespalib/net/server_socket.h29
-rw-r--r--vespalib/src/vespa/vespalib/net/socket.cpp58
-rw-r--r--vespalib/src/vespa/vespalib/net/socket.h31
-rw-r--r--vespalib/src/vespa/vespalib/net/socket_address.cpp157
-rw-r--r--vespalib/src/vespa/vespalib/net/socket_address.h58
-rw-r--r--vespalib/src/vespa/vespalib/net/socket_handle.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/net/socket_handle.h50
-rw-r--r--vespalib/src/vespa/vespalib/objects/CMakeLists.txt6
-rw-r--r--vespalib/src/vespa/vespalib/objects/nbostream.cpp82
-rw-r--r--vespalib/src/vespa/vespalib/objects/nbostream.h334
-rw-r--r--vespalib/src/vespa/vespalib/stllike/.gitignore3
-rw-r--r--vespalib/src/vespa/vespalib/stllike/CMakeLists.txt8
-rw-r--r--vespalib/src/vespa/vespalib/stllike/asciistream.cpp581
-rw-r--r--vespalib/src/vespa/vespalib/stllike/asciistream.h148
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hash_fun.h92
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hash_map.h79
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hash_set.h97
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hashtable.cpp54
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hashtable.h554
-rw-r--r--vespalib/src/vespa/vespalib/stllike/lexical_cast.h18
-rw-r--r--vespalib/src/vespa/vespalib/stllike/string.cpp58
-rw-r--r--vespalib/src/vespa/vespalib/stllike/string.h840
-rw-r--r--vespalib/src/vespa/vespalib/stllike/vector_map.h88
-rw-r--r--vespalib/src/vespa/vespalib/tensor/CMakeLists.txt19
-rw-r--r--vespalib/src/vespa/vespalib/tensor/cell_function.h21
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/CMakeLists.txt17
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp210
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.h63
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.cpp132
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.h76
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.cpp38
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.h36
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_ref.h72
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.cpp82
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.h42
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.cpp60
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.h27
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.cpp128
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.h46
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.cpp65
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.h83
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp207
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.h63
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_builder.h49
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_decoder.h44
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_padder.h69
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.cpp99
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h45
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.cpp89
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.h26
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.cpp125
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.h31
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.cpp148
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.h47
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_builder.h108
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_v2_builder.h135
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/join_compact_tensors_v2.h62
-rw-r--r--vespalib/src/vespa/vespalib/tensor/decoded_tensor_address_store.h57
-rw-r--r--vespalib/src/vespa/vespalib/tensor/default_tensor.h17
-rw-r--r--vespalib/src/vespa/vespalib/tensor/default_tensor_engine.cpp195
-rw-r--r--vespalib/src/vespa/vespalib/tensor/default_tensor_engine.h31
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/CMakeLists.txt9
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp360
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.h112
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.cpp166
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.h41
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.cpp106
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.h36
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.cpp204
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.h32
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dimensions_vector_iterator.h46
-rw-r--r--vespalib/src/vespa/vespalib/tensor/direct_tensor_builder.h15
-rw-r--r--vespalib/src/vespa/vespalib/tensor/join_tensor_addresses.h128
-rw-r--r--vespalib/src/vespa/vespalib/tensor/join_tensors.h48
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/CMakeLists.txt9
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.cpp127
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.h25
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.cpp60
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.h24
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.cpp107
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.h27
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.cpp58
-rw-r--r--vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.h28
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/CMakeLists.txt9
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/direct_simple_tensor_builder.h93
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp222
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.h60
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.cpp72
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.h42
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.cpp56
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.h27
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.cpp117
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.h47
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor.cpp24
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor.h50
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_address.cpp87
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_address.h81
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_address_builder.h31
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_address_element_iterator.h218
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_apply.cpp24
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_apply.h29
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_builder.h34
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_factory.cpp76
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_factory.h30
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_function.cpp359
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_function.h110
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_mapper.cpp292
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_mapper.h43
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_operation.h55
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_type.cpp214
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_type.h87
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_type_spec.cpp223
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_type_spec.h16
-rw-r--r--vespalib/src/vespa/vespalib/tensor/tensor_visitor.h24
-rw-r--r--vespalib/src/vespa/vespalib/tensor/types.h19
-rw-r--r--vespalib/src/vespa/vespalib/test/CMakeLists.txt5
-rw-r--r--vespalib/src/vespa/vespalib/test/insertion_operators.h45
-rw-r--r--vespalib/src/vespa/vespalib/testkit/.gitignore4
-rw-r--r--vespalib/src/vespa/vespalib/testkit/CMakeLists.txt10
-rwxr-xr-xvespalib/src/vespa/vespalib/testkit/create-test.sh71
-rwxr-xr-xvespalib/src/vespa/vespalib/testkit/generate-test-makefile.sh71
-rwxr-xr-xvespalib/src/vespa/vespalib/testkit/generate-test-report.sh210
-rw-r--r--vespalib/src/vespa/vespalib/testkit/generated_fixture_macros.h691
-rwxr-xr-xvespalib/src/vespa/vespalib/testkit/progctl.sh180
-rwxr-xr-xvespalib/src/vespa/vespalib/testkit/run-test.sh240
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_comparators.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_comparators.h73
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_hook.cpp140
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_hook.h113
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_kit.h12
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_macros.h89
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_master.cpp351
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_master.h123
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_master.hpp35
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_state_guard.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/testkit/test_state_guard.h19
-rw-r--r--vespalib/src/vespa/vespalib/testkit/testapp.cpp32
-rw-r--r--vespalib/src/vespa/vespalib/testkit/testapp.h197
-rwxr-xr-xvespalib/src/vespa/vespalib/testkit/testrun.sh465
-rw-r--r--vespalib/src/vespa/vespalib/text/.gitignore6
-rw-r--r--vespalib/src/vespa/vespalib/text/CMakeLists.txt8
-rw-r--r--vespalib/src/vespa/vespalib/text/lowercase.cpp681
-rw-r--r--vespalib/src/vespa/vespalib/text/lowercase.h110
-rw-r--r--vespalib/src/vespa/vespalib/text/stringtokenizer.cpp98
-rw-r--r--vespalib/src/vespa/vespalib/text/stringtokenizer.h68
-rw-r--r--vespalib/src/vespa/vespalib/text/utf8.cpp233
-rw-r--r--vespalib/src/vespa/vespalib/text/utf8.h346
-rw-r--r--vespalib/src/vespa/vespalib/trace/CMakeLists.txt7
-rw-r--r--vespalib/src/vespa/vespalib/trace/trace.cpp68
-rw-r--r--vespalib/src/vespa/vespalib/trace/trace.h125
-rw-r--r--vespalib/src/vespa/vespalib/trace/tracelevel.h34
-rw-r--r--vespalib/src/vespa/vespalib/trace/tracenode.cpp362
-rw-r--r--vespalib/src/vespa/vespalib/trace/tracenode.h253
-rw-r--r--vespalib/src/vespa/vespalib/trace/tracevisitor.h44
-rw-r--r--vespalib/src/vespa/vespalib/util/.gitignore6
-rw-r--r--vespalib/src/vespa/vespalib/util/CMakeLists.txt48
-rw-r--r--vespalib/src/vespa/vespalib/util/active.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/util/active.h37
-rw-r--r--vespalib/src/vespa/vespalib/util/alignedmemory.cpp30
-rw-r--r--vespalib/src/vespa/vespalib/util/alignedmemory.h71
-rw-r--r--vespalib/src/vespa/vespalib/util/alloc.cpp159
-rw-r--r--vespalib/src/vespa/vespalib/util/alloc.h183
-rw-r--r--vespalib/src/vespa/vespalib/util/approx.cpp2
-rw-r--r--vespalib/src/vespa/vespalib/util/approx.h32
-rw-r--r--vespalib/src/vespa/vespalib/util/array.h354
-rw-r--r--vespalib/src/vespa/vespalib/util/arrayqueue.hpp373
-rw-r--r--vespalib/src/vespa/vespalib/util/arraysize.h10
-rw-r--r--vespalib/src/vespa/vespalib/util/atomic.cpp222
-rw-r--r--vespalib/src/vespa/vespalib/util/atomic.h469
-rw-r--r--vespalib/src/vespa/vespalib/util/autoclosurecaller.h32
-rw-r--r--vespalib/src/vespa/vespalib/util/backtrace.cpp84
-rw-r--r--vespalib/src/vespa/vespalib/util/backtrace.h41
-rw-r--r--vespalib/src/vespa/vespalib/util/barrier.cpp40
-rw-r--r--vespalib/src/vespa/vespalib/util/barrier.h46
-rw-r--r--vespalib/src/vespa/vespalib/util/benchmark_timer.cpp3
-rw-r--r--vespalib/src/vespa/vespalib/util/benchmark_timer.h134
-rw-r--r--vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.cpp34
-rw-r--r--vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.h33
-rw-r--r--vespalib/src/vespa/vespalib/util/bobhash.h159
-rw-r--r--vespalib/src/vespa/vespalib/util/box.cpp10
-rw-r--r--vespalib/src/vespa/vespalib/util/box.h52
-rw-r--r--vespalib/src/vespa/vespalib/util/buffer.h48
-rw-r--r--vespalib/src/vespa/vespalib/util/closure.h1405
-rw-r--r--vespalib/src/vespa/vespalib/util/closuretask.h29
-rw-r--r--vespalib/src/vespa/vespalib/util/compress.cpp87
-rw-r--r--vespalib/src/vespa/vespalib/util/compress.h92
-rw-r--r--vespalib/src/vespa/vespalib/util/delegatelist.hpp310
-rw-r--r--vespalib/src/vespa/vespalib/util/dual_merge_director.cpp72
-rw-r--r--vespalib/src/vespa/vespalib/util/dual_merge_director.h74
-rw-r--r--vespalib/src/vespa/vespalib/util/error.cpp20
-rw-r--r--vespalib/src/vespa/vespalib/util/error.h13
-rw-r--r--vespalib/src/vespa/vespalib/util/eventbarrier.hpp122
-rw-r--r--vespalib/src/vespa/vespalib/util/exception.cpp153
-rw-r--r--vespalib/src/vespa/vespalib/util/exception.h239
-rw-r--r--vespalib/src/vespa/vespalib/util/exceptions.cpp138
-rw-r--r--vespalib/src/vespa/vespalib/util/exceptions.h118
-rw-r--r--vespalib/src/vespa/vespalib/util/executor.h46
-rw-r--r--vespalib/src/vespa/vespalib/util/fiddle.h84
-rw-r--r--vespalib/src/vespa/vespalib/util/gen_closure.py171
-rw-r--r--vespalib/src/vespa/vespalib/util/gencnt.cpp67
-rw-r--r--vespalib/src/vespa/vespalib/util/gencnt.h110
-rw-r--r--vespalib/src/vespa/vespalib/util/generationhandler.cpp201
-rw-r--r--vespalib/src/vespa/vespalib/util/generationhandler.h183
-rw-r--r--vespalib/src/vespa/vespalib/util/generationholder.cpp93
-rw-r--r--vespalib/src/vespa/vespalib/util/generationholder.h109
-rw-r--r--vespalib/src/vespa/vespalib/util/guard.h375
-rw-r--r--vespalib/src/vespa/vespalib/util/hashmap.cpp230
-rw-r--r--vespalib/src/vespa/vespalib/util/hashmap.h374
-rw-r--r--vespalib/src/vespa/vespalib/util/hashmapdata.h17
-rw-r--r--vespalib/src/vespa/vespalib/util/host_name.cpp25
-rw-r--r--vespalib/src/vespa/vespalib/util/host_name.h21
-rw-r--r--vespalib/src/vespa/vespalib/util/inline.h25
-rw-r--r--vespalib/src/vespa/vespalib/util/joinable.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/util/joinable.h23
-rw-r--r--vespalib/src/vespa/vespalib/util/left_right_heap.cpp4
-rw-r--r--vespalib/src/vespa/vespalib/util/left_right_heap.h95
-rw-r--r--vespalib/src/vespa/vespalib/util/left_right_heap.hpp175
-rw-r--r--vespalib/src/vespa/vespalib/util/linkedptr.h181
-rw-r--r--vespalib/src/vespa/vespalib/util/macro.h26
-rw-r--r--vespalib/src/vespa/vespalib/util/memory.h375
-rw-r--r--vespalib/src/vespa/vespalib/util/noncopyable.hpp26
-rw-r--r--vespalib/src/vespa/vespalib/util/optimized.h94
-rw-r--r--vespalib/src/vespa/vespalib/util/overview.h84
-rw-r--r--vespalib/src/vespa/vespalib/util/printable.cpp44
-rw-r--r--vespalib/src/vespa/vespalib/util/printable.h137
-rw-r--r--vespalib/src/vespa/vespalib/util/priority_queue.cpp11
-rw-r--r--vespalib/src/vespa/vespalib/util/priority_queue.h60
-rw-r--r--vespalib/src/vespa/vespalib/util/ptrholder.h129
-rw-r--r--vespalib/src/vespa/vespalib/util/random.cpp113
-rw-r--r--vespalib/src/vespa/vespalib/util/random.h139
-rw-r--r--vespalib/src/vespa/vespalib/util/referencecounter.h63
-rw-r--r--vespalib/src/vespa/vespalib/util/regexp.cpp152
-rw-r--r--vespalib/src/vespa/vespalib/util/regexp.h101
-rw-r--r--vespalib/src/vespa/vespalib/util/rendezvous.h89
-rw-r--r--vespalib/src/vespa/vespalib/util/rendezvous.hpp50
-rw-r--r--vespalib/src/vespa/vespalib/util/runnable.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/util/runnable.h27
-rw-r--r--vespalib/src/vespa/vespalib/util/runnable_pair.cpp21
-rw-r--r--vespalib/src/vespa/vespalib/util/runnable_pair.h24
-rw-r--r--vespalib/src/vespa/vespalib/util/rwlock.cpp43
-rw-r--r--vespalib/src/vespa/vespalib/util/rwlock.h252
-rw-r--r--vespalib/src/vespa/vespalib/util/sequence.cpp4
-rw-r--r--vespalib/src/vespa/vespalib/util/sequence.h25
-rw-r--r--vespalib/src/vespa/vespalib/util/sha1.cpp153
-rw-r--r--vespalib/src/vespa/vespalib/util/sha1.h71
-rw-r--r--vespalib/src/vespa/vespalib/util/signalhandler.cpp121
-rw-r--r--vespalib/src/vespa/vespalib/util/signalhandler.h111
-rw-r--r--vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp168
-rw-r--r--vespalib/src/vespa/vespalib/util/simple_thread_bundle.h137
-rw-r--r--vespalib/src/vespa/vespalib/util/slaveproc.cpp337
-rw-r--r--vespalib/src/vespa/vespalib/util/slaveproc.h208
-rw-r--r--vespalib/src/vespa/vespalib/util/stash.cpp113
-rw-r--r--vespalib/src/vespa/vespalib/util/stash.h113
-rw-r--r--vespalib/src/vespa/vespalib/util/string_hash.cpp20
-rw-r--r--vespalib/src/vespa/vespalib/util/string_hash.h16
-rw-r--r--vespalib/src/vespa/vespalib/util/stringfmt.cpp68
-rw-r--r--vespalib/src/vespa/vespalib/util/stringfmt.h19
-rw-r--r--vespalib/src/vespa/vespalib/util/sync.h729
-rw-r--r--vespalib/src/vespa/vespalib/util/syncable.h27
-rw-r--r--vespalib/src/vespa/vespalib/util/thread.cpp92
-rw-r--r--vespalib/src/vespa/vespalib/util/thread.h52
-rw-r--r--vespalib/src/vespa/vespalib/util/thread_bundle.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/util/thread_bundle.h39
-rw-r--r--vespalib/src/vespa/vespalib/util/threadexecutor.h21
-rw-r--r--vespalib/src/vespa/vespalib/util/threadstackexecutor.cpp32
-rw-r--r--vespalib/src/vespa/vespalib/util/threadstackexecutor.h50
-rw-r--r--vespalib/src/vespa/vespalib/util/threadstackexecutorbase.cpp184
-rw-r--r--vespalib/src/vespa/vespalib/util/threadstackexecutorbase.h170
-rw-r--r--vespalib/src/vespa/vespalib/util/time_tracker.cpp83
-rw-r--r--vespalib/src/vespa/vespalib/util/time_tracker.h89
-rw-r--r--vespalib/src/vespa/vespalib/util/traits.h42
-rw-r--r--vespalib/src/vespa/vespalib/util/trinary.h12
-rw-r--r--vespalib/src/vespa/vespalib/util/valgrind.cpp32
-rw-r--r--vespalib/src/vespa/vespalib/util/valgrind.h33
-rw-r--r--vespalib/src/vespa/vespalib/util/vstringfmt.h19
-rw-r--r--vespalib/src/vespa/vespalib/util/weakref.h259
-rw-r--r--vespalib/src/vespa/vespalib/websocket/CMakeLists.txt15
-rw-r--r--vespalib/src/vespa/vespalib/websocket/README22
-rw-r--r--vespalib/src/vespa/vespalib/websocket/acceptor.cpp34
-rw-r--r--vespalib/src/vespa/vespalib/websocket/acceptor.h27
-rw-r--r--vespalib/src/vespa/vespalib/websocket/buffer.cpp22
-rw-r--r--vespalib/src/vespa/vespalib/websocket/buffer.h46
-rw-r--r--vespalib/src/vespa/vespalib/websocket/connection.cpp208
-rw-r--r--vespalib/src/vespa/vespalib/websocket/connection.h54
-rw-r--r--vespalib/src/vespa/vespalib/websocket/frame.cpp11
-rw-r--r--vespalib/src/vespa/vespalib/websocket/frame.h22
-rw-r--r--vespalib/src/vespa/vespalib/websocket/handler.cpp19
-rw-r--r--vespalib/src/vespa/vespalib/websocket/handler.h22
-rw-r--r--vespalib/src/vespa/vespalib/websocket/key.cpp52
-rw-r--r--vespalib/src/vespa/vespalib/websocket/key.h27
-rw-r--r--vespalib/src/vespa/vespalib/websocket/request.cpp142
-rw-r--r--vespalib/src/vespa/vespalib/websocket/request.h36
-rw-r--r--vespalib/src/vespa/vespalib/websocket/server_socket.cpp44
-rw-r--r--vespalib/src/vespa/vespalib/websocket/server_socket.h30
-rw-r--r--vespalib/src/vespa/vespalib/websocket/socket.cpp44
-rw-r--r--vespalib/src/vespa/vespalib/websocket/socket.h27
-rw-r--r--vespalib/src/vespa/vespalib/websocket/websocket_server.cpp158
-rw-r--r--vespalib/src/vespa/vespalib/websocket/websocket_server.h34
-rw-r--r--vespalib/src/vespa/vespalib/xxhash/CMakeLists.txt6
-rw-r--r--vespalib/src/vespa/vespalib/xxhash/xxhash.c935
-rw-r--r--vespalib/src/vespa/vespalib/xxhash/xxhash.h157
976 files changed, 309305 insertions, 0 deletions
diff --git a/vespalib/src/.gitignore b/vespalib/src/.gitignore
new file mode 100644
index 00000000000..8859e7233e9
--- /dev/null
+++ b/vespalib/src/.gitignore
@@ -0,0 +1,5 @@
+*.dsp
+*.mak
+Makefile.ini
+config_command.sh
+project.dsw
diff --git a/vespalib/src/Doxyfile b/vespalib/src/Doxyfile
new file mode 100644
index 00000000000..85fbd144f03
--- /dev/null
+++ b/vespalib/src/Doxyfile
@@ -0,0 +1,215 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = vespalib
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = ../doc/doxygen
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH = ./
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = YES
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+TYPEDEF_HIDES_STRUCT = NO
+SYMBOL_CACHE_SIZE = 0
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = NO
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+INPUT = vespalib/util \
+ vespalib/component \
+ vespalib/cppunit \
+ vespalib/geo \
+ vespalib/io \
+ vespalib/text \
+ vespalib/testkit
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS =
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_TIMESTAMP = NO
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+HTML_DYNAMIC_SECTIONS = NO
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE =
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+USE_INLINE_TREES = NO
+TREEVIEW_WIDTH = 250
+FORMULA_FONTSIZE = 10
+SEARCHENGINE = NO
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+GENERATE_AUTOGEN_DEF = NO
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED = IAM_DOXYGEN
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+TAGFILES =
+GENERATE_TAGFILE = ../doc/doxygen/vespalib.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = NO
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = NO
+INCLUDED_BY_GRAPH = NO
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/vespalib/src/apps/eval_expr/.gitignore b/vespalib/src/apps/eval_expr/.gitignore
new file mode 100644
index 00000000000..04661a7889c
--- /dev/null
+++ b/vespalib/src/apps/eval_expr/.gitignore
@@ -0,0 +1,4 @@
+/.depend
+/Makefile
+/eval_expr
+vespalib_eval_expr_app
diff --git a/vespalib/src/apps/eval_expr/CMakeLists.txt b/vespalib/src/apps/eval_expr/CMakeLists.txt
new file mode 100644
index 00000000000..41f6b34c9d6
--- /dev/null
+++ b/vespalib/src/apps/eval_expr/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_eval_expr_app
+ SOURCES
+ eval_expr.cpp
+ INSTALL bin
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/apps/eval_expr/eval_expr.cpp b/vespalib/src/apps/eval_expr/eval_expr.cpp
new file mode 100644
index 00000000000..9d3f0992867
--- /dev/null
+++ b/vespalib/src/apps/eval_expr/eval_expr.cpp
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/interpreted_function.h>
+
+using namespace vespalib::eval;
+
+int main(int argc, char **argv) {
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <expr>\n", argv[0]);
+ fprintf(stderr, " the expression must be self-contained (no arguments)\n");
+ fprintf(stderr, " quote the expression to make it a single parameter\n");
+ fprintf(stderr, " use let to simulate parameters: let(x, 1, x + 3)\n");
+ return 1;
+ }
+ Function function = Function::parse({}, argv[1]);
+ if (function.has_error()) {
+ fprintf(stderr, "expression error: %s\n", function.get_error().c_str());
+ return 1;
+ }
+ InterpretedFunction::Context ctx;
+ InterpretedFunction interpreted(SimpleTensorEngine::ref(), function);
+ double result = interpreted.eval(ctx).as_double();
+ fprintf(stdout, "%.32g\n", result);
+ return 0;
+}
diff --git a/vespalib/src/apps/make_fixture_macros/.gitignore b/vespalib/src/apps/make_fixture_macros/.gitignore
new file mode 100644
index 00000000000..7ee1cae6d6b
--- /dev/null
+++ b/vespalib/src/apps/make_fixture_macros/.gitignore
@@ -0,0 +1,4 @@
+/.depend
+/Makefile
+/make_fixture_macros
+vespalib_make_fixture_macros_app
diff --git a/vespalib/src/apps/make_fixture_macros/CMakeLists.txt b/vespalib/src/apps/make_fixture_macros/CMakeLists.txt
new file mode 100644
index 00000000000..33709d7c047
--- /dev/null
+++ b/vespalib/src/apps/make_fixture_macros/CMakeLists.txt
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_make_fixture_macros_app
+ SOURCES
+ make_fixture_macros.cpp
+ INSTALL bin
+ DEPENDS
+)
diff --git a/vespalib/src/apps/make_fixture_macros/make_fixture_macros.cpp b/vespalib/src/apps/make_fixture_macros/make_fixture_macros.cpp
new file mode 100644
index 00000000000..52ff7faca1f
--- /dev/null
+++ b/vespalib/src/apps/make_fixture_macros/make_fixture_macros.cpp
@@ -0,0 +1,153 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <algorithm>
+
+void out(const char *str) { fprintf(stdout, "%s", str); }
+void out_n(const char *str, int n) { fprintf(stdout, str, n); }
+void out_nn(const char *str, int n) { fprintf(stdout, str, n, n); }
+void out_nnn(const char *str, int n) { fprintf(stdout, str, n, n, n); }
+void out_if(const char *str, bool cond) { if (cond) { out(str); } }
+void out_opt(bool cond, const char *str1, const char *str2) {
+ if (cond) {
+ out(str1);
+ } else {
+ out(str2);
+ }
+}
+void out_list(const char *pre, const char *str, const char *sep, const char *post, int n, int x) {
+ out_if(pre, n > 0);
+ for (int i = 0; i < n; ++i) {
+ out_if(sep, i > 0);
+ switch (x) {
+ case 0: out(str); break;
+ case 1: out_n(str, i + 1); break;
+ case 2: out_nn(str, i + 1); break;
+ default: abort();
+ }
+ }
+ out_if(post, n > 0);
+}
+void out_fff(int n) {
+ out_list("_", "F", "", "", n, 0);
+}
+void out_list_n(const char *pre, const char *str, const char *post, int n) {
+ out_list(pre, str, ", ", post, n, 1);
+}
+void out_list_nn(const char *pre, const char *str, const char *post, int n) {
+ out_list(pre, str, ", ", post, n, 2);
+}
+
+void make_wrapper(int n) {
+ out_list_n(" template <", "typename F%d", "> \\\n", n);
+ out(" struct Test : vespalib::TestFixtureWrapper { \\\n");
+ out_if(" F1 &f; \\\n", n == 1);
+ out_list("", " F%d &f%d; \\\n", "", "", n, 2);
+ out_list_nn(" Test(", "F%d &f%d_in", ") : ", n);
+ out_if("f(f1_in), ", n == 1);
+ out_list_nn("", "f%d(f%d_in)", " {} \\\n", n);
+ out(" virtual void test_entry_point(); \\\n");
+ out(" }; \\\n");
+}
+
+void make_perform(int n) {
+ out(" Test");
+ out_list_n("<", "F%d", ">", n);
+ out(" test");
+ out_list_n("(", "f%d", ")", n);
+ out("; \\\n");
+ out(" return runTest(test, threads); \\\n");
+}
+
+void make_dispatch(int n) {
+ for (int i = n; i > 0; --i) {
+ out_list_n(" template <", "typename F%d", "> \\\n", i);
+ out_n(" bool dispatch%d(", i);
+ out_list_nn("", "F%d &f%d", ", ", i - 1);
+ out_nn("F%d *_f%d_ptr_) { \\\n", i);
+ out_nnn(" std::unique_ptr<F%d> _f%d_ap_(_f%d_ptr_); \\\n", i);
+ out_nnn(" F%d &f%d = *_f%d_ap_; \\\n", i);
+ out_if(" size_t num_threads(threads); (void) num_threads; \\\n", i < n);
+ if (i < n) {
+ out_n(" return dispatch%d(", i + 1);
+ out_list_n("", "f%d", ", ", i);
+ out_n("new fixture%d); \\\n", i + 1);
+ } else {
+ make_perform(n);
+ }
+ out(" } \\\n");
+ }
+}
+
+void make_macro_impl(int n) {
+ fprintf(stdout, "// common test macro implementation for %d test fixtures BEGIN\n\n", n);
+ out("#define TEST");
+ out_fff(n);
+ out("_IMPL(name, ignore, threads");
+ out_list_n(", ", "fixture%d", "", n);
+ out(") \\\n");
+ out("namespace { \\\n");
+ out("struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \\\n");
+ out(" TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \\\n");
+ make_wrapper(n);
+ make_dispatch(n);
+ out(" virtual bool run() { \\\n");
+ out(" TEST_STATE(name); \\\n");
+ out_if(" size_t num_threads(threads); (void) num_threads; \\\n", n > 0);
+ if (n > 0) {
+ out(" return dispatch1(new fixture1); \\\n");
+ } else {
+ make_perform(0);
+ }
+ out(" } \\\n");
+ out("}; \\\n");
+ out("TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \\\n");
+ out("} /* end of unnamed namespace */ \\\n");
+ out_list_n("template <", "typename F%d", "> \\\n", n);
+ out("void TEST_CAT(TestKitHook, __LINE__)::Test");
+ out_list_n("<", "F%d", ">", n);
+ out("::test_entry_point()\n");
+ fprintf(stdout, "\n// common test macro implementation for %d test fixtures END\n\n", n);
+}
+
+void make_macro_wire(int n) {
+ fprintf(stdout, "// test macro variants for %d test fixtures BEGIN\n\n", n);
+ for (int ignore = 0; ignore < 2; ++ignore) {
+ for (int mt = 0; mt < 2; ++mt) {
+ out("#define ");
+ out_if("IGNORE_", ignore);
+ out("TEST");
+ out_if("_MT", mt);
+ out_fff(n);
+ out("(name");
+ out_if(", threads", mt);
+ out_list_n(", ", "fixture%d", "", n);
+ out(") TEST");
+ out_fff(n);
+ out("_IMPL(name");
+ out_opt(ignore, ", true", ", false");
+ out_opt(mt, ", threads", ", 1");
+ out_list_n(", ", "fixture%d", "", n);
+ out(")\n");
+ }
+ }
+ fprintf(stdout, "\n// test macro variants for %d test fixtures END\n\n", n);
+}
+
+int main(int argc, char **argv) {
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <N>\n", argv[0]);
+ fprintf(stderr, " produce macros for up to N (minimum 3) test fixtures\n");
+ return 1;
+ }
+ int n = std::max(3, atoi(argv[1]));
+ fprintf(stdout, "// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.\n");
+ fprintf(stdout, "// macros for up to %d test fixtures, generated by "
+ "vespalib/testkit/make_fixture_macros\n\n", n);
+ for (int i = 0; i <= n; ++i) {
+ make_macro_impl(i);
+ make_macro_wire(i);
+ }
+ return 0;
+}
diff --git a/vespalib/src/testlist.txt b/vespalib/src/testlist.txt
new file mode 100644
index 00000000000..bd5c2e0d735
--- /dev/null
+++ b/vespalib/src/testlist.txt
@@ -0,0 +1,100 @@
+!tests/false
+?tests/tutorial
+?tests/valgrind
+tests/alignedmemory
+tests/alloc
+tests/approx
+tests/array
+tests/arrayqueue
+tests/atomic
+tests/barrier
+tests/benchmark_timer
+tests/box
+tests/closure
+tests/component
+tests/compress
+tests/delegatelist
+tests/dual_merge_director
+tests/eval/compile_cache
+tests/eval/compiled_function
+tests/eval/function
+tests/eval/function_speed
+tests/eval/gbdt
+tests/eval/interpreted_function
+tests/eval/node_types
+tests/eval/simple_tensor
+tests/eval/tensor
+tests/eval/value_type
+tests/eventbarrier
+tests/exception_classes
+tests/executor
+tests/explore_modern_cpp
+tests/fiddle
+tests/gencnt
+tests/guard
+tests/hashmap
+tests/host_name
+tests/io/fileutil
+tests/left_right_heap
+tests/linkedptr
+tests/make_fixture_macros
+tests/memory
+tests/net/socket
+tests/objects/nbostream
+tests/optimized
+tests/placement-delete
+tests/printable
+tests/priority_queue
+tests/random
+tests/referencecounter
+tests/regex
+tests/rendezvous
+tests/runnable_pair
+tests/rwlock
+tests/sha1
+tests/sharedptr
+tests/signalhandler
+tests/simple_thread_bundle
+tests/slaveproc
+tests/slime
+tests/slime/summary-feature-benchmark
+tests/stash
+tests/stllike
+tests/stringfmt
+tests/sync
+tests/tensor/compact_tensor_builder
+tests/tensor/compact_tensor_v2_builder
+tests/tensor/dense_tensor_builder
+tests/tensor/dense_tensor_operations
+tests/tensor/join_tensor_addresses
+tests/tensor/simple_tensor_builder
+tests/tensor/tensor
+tests/tensor/tensor_address
+tests/tensor/tensor_address_element_iterator
+tests/tensor/tensor_function
+tests/tensor/tensor_mapper
+tests/tensor/tensor_operations
+tests/tensor/tensor_performance
+tests/tensor/tensor_serialization
+tests/tensor/tensor_slime_serialization
+tests/tensor/tensor_type
+tests/testapp-debug
+tests/testapp-generic
+tests/testapp-main
+tests/testapp-state
+tests/testkit-mt
+tests/testkit-subset
+tests/testkit-testhook
+tests/text/lowercase
+tests/text/stringtokenizer
+tests/text/utf8
+tests/thread
+tests/time_tracker
+tests/trace
+tests/traits
+tests/true
+tests/util/generationhandler
+tests/util/generationhandler_stress
+tests/weakref
+tests/websocket
+tests/zcurve
diff --git a/vespalib/src/tests/.gitignore b/vespalib/src/tests/.gitignore
new file mode 100644
index 00000000000..c473b24b98a
--- /dev/null
+++ b/vespalib/src/tests/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+testrunner
+*_test
diff --git a/vespalib/src/tests/alignedmemory/.cvsignore b/vespalib/src/tests/alignedmemory/.cvsignore
new file mode 100644
index 00000000000..0cc06a2789a
--- /dev/null
+++ b/vespalib/src/tests/alignedmemory/.cvsignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+alignedmemory_test
diff --git a/vespalib/src/tests/alignedmemory/.gitignore b/vespalib/src/tests/alignedmemory/.gitignore
new file mode 100644
index 00000000000..8777f6e4632
--- /dev/null
+++ b/vespalib/src/tests/alignedmemory/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+alignedmemory_test
+vespalib_alignedmemory_test_app
diff --git a/vespalib/src/tests/alignedmemory/CMakeLists.txt b/vespalib/src/tests/alignedmemory/CMakeLists.txt
new file mode 100644
index 00000000000..685705b0761
--- /dev/null
+++ b/vespalib/src/tests/alignedmemory/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_alignedmemory_test_app
+ SOURCES
+ alignedmemory_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_alignedmemory_test_app COMMAND vespalib_alignedmemory_test_app)
diff --git a/vespalib/src/tests/alignedmemory/DESC b/vespalib/src/tests/alignedmemory/DESC
new file mode 100644
index 00000000000..4f3b4f32604
--- /dev/null
+++ b/vespalib/src/tests/alignedmemory/DESC
@@ -0,0 +1 @@
+alignedmemory test. Take a look at alignedmemory.cpp for details.
diff --git a/vespalib/src/tests/alignedmemory/FILES b/vespalib/src/tests/alignedmemory/FILES
new file mode 100644
index 00000000000..d0363c78367
--- /dev/null
+++ b/vespalib/src/tests/alignedmemory/FILES
@@ -0,0 +1 @@
+alignedmemory.cpp
diff --git a/vespalib/src/tests/alignedmemory/alignedmemory_test.cpp b/vespalib/src/tests/alignedmemory/alignedmemory_test.cpp
new file mode 100644
index 00000000000..73814d3284e
--- /dev/null
+++ b/vespalib/src/tests/alignedmemory/alignedmemory_test.cpp
@@ -0,0 +1,69 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("alignedmemory_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/alignedmemory.h>
+
+using namespace vespalib;
+
+TEST_SETUP(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("alignedmemory_test");
+ { // aligned alloc
+ AlignedMemory mem8(32, 8);
+ AlignedMemory mem16(32, 16);
+ AlignedMemory mem512(32, 512);
+ AlignedMemory mem7(32, 7);
+
+ EXPECT_EQUAL(0u, ((uintptr_t)mem8.get()) % 8);
+ EXPECT_EQUAL(0u, ((uintptr_t)mem16.get()) % 16);
+ EXPECT_EQUAL(0u, ((uintptr_t)mem512.get()) % 512);
+ EXPECT_EQUAL(0u, ((uintptr_t)mem7.get()) % 7);
+ }
+ { // swap
+ AlignedMemory a(32, 8);
+ AlignedMemory b(32, 8);
+ char *pa = a.get();
+ char *pb = b.get();
+
+ EXPECT_EQUAL(pa, a.get());
+ EXPECT_EQUAL(pb, b.get());
+ a.swap(b);
+ EXPECT_EQUAL(pb, a.get());
+ EXPECT_EQUAL(pa, b.get());
+ b.swap(a);
+ EXPECT_EQUAL(pa, a.get());
+ EXPECT_EQUAL(pb, b.get());
+ }
+ { // std::swap
+ AlignedMemory a(32, 8);
+ AlignedMemory b(32, 8);
+ char *pa = a.get();
+ char *pb = b.get();
+
+ EXPECT_EQUAL(pa, a.get());
+ EXPECT_EQUAL(pb, b.get());
+ std::swap(a, b);
+ EXPECT_EQUAL(pb, a.get());
+ EXPECT_EQUAL(pa, b.get());
+ std::swap(a, b);
+ EXPECT_EQUAL(pa, a.get());
+ EXPECT_EQUAL(pb, b.get());
+ }
+ { // construct with zero size
+ AlignedMemory null(0, 0);
+ char *expect = 0;
+ EXPECT_EQUAL(expect, null.get());
+ }
+ { // const get()
+ const AlignedMemory null(0, 0);
+ const char *expect = 0;
+ const char *got = null.get();
+ EXPECT_EQUAL(expect, got);
+ }
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/alloc/.gitignore b/vespalib/src/tests/alloc/.gitignore
new file mode 100644
index 00000000000..d9fbafce9b4
--- /dev/null
+++ b/vespalib/src/tests/alloc/.gitignore
@@ -0,0 +1,3 @@
+allocate_and_core
+vespalib_alloc_test_app
+vespalib_allocate_and_core_app
diff --git a/vespalib/src/tests/alloc/CMakeLists.txt b/vespalib/src/tests/alloc/CMakeLists.txt
new file mode 100644
index 00000000000..9b1a2493dce
--- /dev/null
+++ b/vespalib/src/tests/alloc/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_alloc_test_app
+ SOURCES
+ alloc_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_alloc_test_app NO_VALGRIND COMMAND vespalib_alloc_test_app)
+vespa_add_executable(vespalib_allocate_and_core_app
+ SOURCES
+ allocate_and_core.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/alloc/DESC b/vespalib/src/tests/alloc/DESC
new file mode 100644
index 00000000000..47c438e7ee9
--- /dev/null
+++ b/vespalib/src/tests/alloc/DESC
@@ -0,0 +1 @@
+alloc test. Take a look at alloc_test.cpp for details.
diff --git a/vespalib/src/tests/alloc/FILES b/vespalib/src/tests/alloc/FILES
new file mode 100644
index 00000000000..48c4645810d
--- /dev/null
+++ b/vespalib/src/tests/alloc/FILES
@@ -0,0 +1 @@
+alloc_test.cpp
diff --git a/vespalib/src/tests/alloc/alloc_test.cpp b/vespalib/src/tests/alloc/alloc_test.cpp
new file mode 100644
index 00000000000..5f1ba897f61
--- /dev/null
+++ b/vespalib/src/tests/alloc/alloc_test.cpp
@@ -0,0 +1,94 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <stddef.h>
+#include <vespa/log/log.h>
+LOG_SETUP("alloc_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/alloc.h>
+#include <vespa/vespalib/util/exceptions.h>
+
+using namespace vespalib;
+
+class Test : public TestApp
+{
+public:
+ int Main();
+ void testAlignedAllocation();
+ void testBasic();
+ template <typename T>
+ void testSwap(T & a, T & b);
+};
+
+int
+Test::Main()
+{
+ TEST_INIT("alloc_test");
+ testBasic();
+ testAlignedAllocation();
+ TEST_DONE();
+}
+
+template <typename T>
+void
+Test::testSwap(T & a, T & b)
+{
+ void * tmpA(a.get());
+ void * tmpB(b.get());
+ EXPECT_EQUAL(100u, a.size());
+ EXPECT_EQUAL(200u, b.size());
+ swap(a, b);
+ EXPECT_EQUAL(100u, b.size());
+ EXPECT_EQUAL(200u, a.size());
+ EXPECT_EQUAL(tmpA, b.get());
+ EXPECT_EQUAL(tmpB, a.get());
+}
+
+void
+Test::testBasic()
+{
+ {
+ HeapAlloc h(100);
+ EXPECT_EQUAL(100u, h.size());
+ EXPECT_TRUE(h.get() != NULL);
+ }
+ {
+ EXPECT_EXCEPTION(AlignedHeapAlloc(100, 0), IllegalArgumentException, "posix_memalign(100, 0) failed with code 22");
+ AlignedHeapAlloc h(100, 1024);
+ EXPECT_EQUAL(100u, h.size());
+ EXPECT_TRUE(h.get() != NULL);
+ }
+ {
+ MMapAlloc h(100);
+ EXPECT_EQUAL(100u, h.size());
+ EXPECT_TRUE(h.get() != NULL);
+ }
+ {
+ HeapAlloc a(100), b(200);
+ testSwap(a, b);
+ }
+ {
+ MMapAlloc a(100), b(200);
+ testSwap(a, b);
+ }
+ {
+ AlignedHeapAlloc a(100, 1024), b(200, 1024);
+ testSwap(a, b);
+ }
+}
+
+void
+Test::testAlignedAllocation()
+{
+ {
+ AutoAlloc<2048, 1024> buf(10);
+ EXPECT_TRUE(reinterpret_cast<ptrdiff_t>(buf.get()) % 1024 == 0);
+ }
+
+ {
+ // Mmapped pointers are page-aligned, but sanity test anyway.
+ AutoAlloc<1024, 512> buf(3000);
+ EXPECT_TRUE(reinterpret_cast<ptrdiff_t>(buf.get()) % 512 == 0);
+ }
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/alloc/allocate_and_core.cpp b/vespalib/src/tests/alloc/allocate_and_core.cpp
new file mode 100644
index 00000000000..2cb4d447fd1
--- /dev/null
+++ b/vespalib/src/tests/alloc/allocate_and_core.cpp
@@ -0,0 +1,14 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/util/alloc.h>
+
+using namespace vespalib;
+
+int main(int argc, char *argv[]) {
+ (void) argc;
+ (void) argv;
+ MMapAlloc small( 0x400000); //4M
+ memset(small.get(), 0x55, small.size());
+ MMapAlloc large(0x4000000); //640M
+ memset(large.get(), 0x66, large.size());
+ assert(false);
+}
diff --git a/vespalib/src/tests/approx/.gitignore b/vespalib/src/tests/approx/.gitignore
new file mode 100644
index 00000000000..bdb0c97ea68
--- /dev/null
+++ b/vespalib/src/tests/approx/.gitignore
@@ -0,0 +1 @@
+vespalib_approx_test_app
diff --git a/vespalib/src/tests/approx/CMakeLists.txt b/vespalib/src/tests/approx/CMakeLists.txt
new file mode 100644
index 00000000000..e58117c0761
--- /dev/null
+++ b/vespalib/src/tests/approx/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_approx_test_app
+ SOURCES
+ approx_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_approx_test_app COMMAND vespalib_approx_test_app)
diff --git a/vespalib/src/tests/approx/FILES b/vespalib/src/tests/approx/FILES
new file mode 100644
index 00000000000..75c865a7d33
--- /dev/null
+++ b/vespalib/src/tests/approx/FILES
@@ -0,0 +1 @@
+approx_test.cpp
diff --git a/vespalib/src/tests/approx/approx_test.cpp b/vespalib/src/tests/approx/approx_test.cpp
new file mode 100644
index 00000000000..8181669db60
--- /dev/null
+++ b/vespalib/src/tests/approx/approx_test.cpp
@@ -0,0 +1,103 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/approx.h>
+#include <limits>
+#include <cfloat>
+#include <vespa/vespalib/util/stringfmt.h>
+
+using vespalib::approx_equal;
+
+TEST("require that equal numbers are also approximately equal") {
+ EXPECT_TRUE(approx_equal(2.0, 2.0));
+ EXPECT_TRUE(approx_equal(1.0, 1.0));
+ EXPECT_TRUE(approx_equal(0.5, 0.5));
+ EXPECT_TRUE(approx_equal(0.0, 0.0));
+ EXPECT_TRUE(approx_equal(0.0, -0.0));
+ EXPECT_TRUE(approx_equal(-0.0, -0.0));
+ EXPECT_TRUE(approx_equal(-0.5, -0.5));
+ EXPECT_TRUE(approx_equal(-1.0, -1.0));
+ EXPECT_TRUE(approx_equal(-2.0, -2.0));
+ EXPECT_TRUE(approx_equal(1e10, 1e10));
+ EXPECT_TRUE(approx_equal(1e20, 1e20));
+ EXPECT_TRUE(approx_equal(1e30, 1e30));
+ EXPECT_TRUE(approx_equal(-1e10, -1e10));
+ EXPECT_TRUE(approx_equal(-1e20, -1e20));
+ EXPECT_TRUE(approx_equal(-1e30, -1e30));
+ EXPECT_TRUE(approx_equal(std::numeric_limits<double>::infinity(),
+ std::numeric_limits<double>::infinity()));
+}
+
+TEST("require that very different numbers are not approximately equal") {
+ EXPECT_FALSE(approx_equal(2.0, 1.0));
+ EXPECT_FALSE(approx_equal(1.0, 0.0));
+ EXPECT_FALSE(approx_equal(0.5, 0.25));
+ EXPECT_FALSE(approx_equal(0.0, -0.07));
+ EXPECT_FALSE(approx_equal(-0.0, -0.5));
+ EXPECT_FALSE(approx_equal(-0.5, -1.0));
+ EXPECT_FALSE(approx_equal(-1.0, -2.0));
+ EXPECT_FALSE(approx_equal(1e30, 1e31));
+ EXPECT_FALSE(approx_equal(-1e30, -1e31));
+}
+
+TEST("require that numbers with very small differences are approximately equal") {
+ double epsilon = FLT_EPSILON * 0.3;
+ double larger = 1.0 + epsilon;
+ double smaller = 1.0 - epsilon;
+ for (double d: { 1e40, 1e20, 1e10, 2.0, 1.0, 0.5, 1e-20 }) {
+ TEST_STATE(vespalib::make_string("d = %.17g", d).c_str());
+ EXPECT_TRUE(approx_equal(d, d * larger));
+ EXPECT_TRUE(approx_equal(d, d * smaller));
+ EXPECT_TRUE(approx_equal(d * larger, d));
+ EXPECT_TRUE(approx_equal(d * smaller, d));
+ EXPECT_TRUE(approx_equal(d * smaller, d * larger));
+ EXPECT_TRUE(approx_equal(d * larger, d * smaller));
+ double nd = -d;
+ EXPECT_TRUE(approx_equal(nd, nd * larger));
+ EXPECT_TRUE(approx_equal(nd, nd * smaller));
+ EXPECT_TRUE(approx_equal(nd * larger, nd));
+ EXPECT_TRUE(approx_equal(nd * smaller, nd));
+ EXPECT_TRUE(approx_equal(nd * smaller, nd * larger));
+ EXPECT_TRUE(approx_equal(nd * larger, nd * smaller));
+ }
+}
+
+TEST("require that numbers with slightly larger differences are not approximately equal") {
+ double epsilon = FLT_EPSILON * 1.5;
+ double larger = 1.0 + epsilon;
+ double smaller = 1.0 - epsilon;
+ for (double d: { 1e40, 1e20, 1e10, 2.0, 1.0, 0.5, 1e-20 }) {
+ TEST_STATE(vespalib::make_string("d = %.17g", d).c_str());
+ EXPECT_FALSE(approx_equal(d, d * larger));
+ EXPECT_FALSE(approx_equal(d, d * smaller));
+ EXPECT_FALSE(approx_equal(d * larger, d));
+ EXPECT_FALSE(approx_equal(d * smaller, d));
+ EXPECT_FALSE(approx_equal(d * smaller, d * larger));
+ EXPECT_FALSE(approx_equal(d * larger, d * smaller));
+ double nd = -d;
+ EXPECT_FALSE(approx_equal(nd, nd * larger));
+ EXPECT_FALSE(approx_equal(nd, nd * smaller));
+ EXPECT_FALSE(approx_equal(nd * larger, nd));
+ EXPECT_FALSE(approx_equal(nd * smaller, nd));
+ EXPECT_FALSE(approx_equal(nd * smaller, nd * larger));
+ EXPECT_FALSE(approx_equal(nd * larger, nd * smaller));
+ }
+}
+
+TEST("require that specific numbers with almost 2 ULP differences are approximately equal") {
+ double base = 0.25111f;
+ double epsilon = nextafterf(base, 1.0) - base;
+ double larger = base + epsilon*1.499;
+ double smaller = base - epsilon*0.499;
+ EXPECT_TRUE(approx_equal(larger, smaller));
+ EXPECT_TRUE(approx_equal(smaller, larger));
+ larger = base + epsilon*1.501;
+ smaller = base - epsilon*0.499;
+ EXPECT_FALSE(approx_equal(larger, smaller));
+ EXPECT_FALSE(approx_equal(smaller, larger));
+ larger = base + epsilon*1.499;
+ smaller = base - epsilon*0.501;
+ EXPECT_FALSE(approx_equal(larger, smaller));
+ EXPECT_FALSE(approx_equal(smaller, larger));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/array/.gitignore b/vespalib/src/tests/array/.gitignore
new file mode 100644
index 00000000000..952bc0ecdf2
--- /dev/null
+++ b/vespalib/src/tests/array/.gitignore
@@ -0,0 +1,3 @@
+/sort_benchmark
+/allocinarray_benchmark
+vespalib_array_test_app
diff --git a/vespalib/src/tests/array/CMakeLists.txt b/vespalib/src/tests/array/CMakeLists.txt
new file mode 100644
index 00000000000..28ebedecba0
--- /dev/null
+++ b/vespalib/src/tests/array/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_array_test_app
+ SOURCES
+ array_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_array_test_app COMMAND vespalib_array_test_app)
diff --git a/vespalib/src/tests/array/DESC b/vespalib/src/tests/array/DESC
new file mode 100644
index 00000000000..59c59c2c50a
--- /dev/null
+++ b/vespalib/src/tests/array/DESC
@@ -0,0 +1 @@
+Array test. Take a look at array_test.cpp for details.
diff --git a/vespalib/src/tests/array/FILES b/vespalib/src/tests/array/FILES
new file mode 100644
index 00000000000..fa3825f832f
--- /dev/null
+++ b/vespalib/src/tests/array/FILES
@@ -0,0 +1 @@
+array_test.cpp
diff --git a/vespalib/src/tests/array/array_test.cpp b/vespalib/src/tests/array/array_test.cpp
new file mode 100644
index 00000000000..03b00769e7a
--- /dev/null
+++ b/vespalib/src/tests/array/array_test.cpp
@@ -0,0 +1,348 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+#include <vespa/vespalib/util/array.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/testkit/testapp.h>
+#include <deque>
+
+LOG_SETUP("array_test");
+
+using namespace vespalib;
+
+class Test : public TestApp
+{
+public:
+ int Main();
+private:
+ template <typename T>
+ void testArray(const T & a, const T & b);
+ void testComplicated();
+ void testBeginEnd();
+ void testThatOrganicGrowthIsBy2InNAndReserveResizeAreExact();
+ template<class T>
+ void testBeginEnd(T & v);
+ void testMoveConstructor();
+ void testMoveAssignment();
+};
+
+namespace vespalib {
+
+template <typename T, typename B>
+std::ostream & operator << (std::ostream & os, const Array<T,B> & a)
+{
+ os << '{';
+ if (! a.empty()) {
+ for (size_t i(0), m(a.size()-1); i < m; i++) {
+ os << a[i] << ", ";
+ }
+ os << a[a.size()-1];
+ }
+ os << '}';
+ return os;
+}
+
+}
+
+class Clever {
+public:
+ Clever() : _counter(&_global) { (*_counter)++; }
+ Clever(volatile size_t * counter) :
+ _counter(counter)
+ {
+ (*_counter)++;
+ }
+ Clever(const Clever & rhs) :
+ _counter(rhs._counter)
+ {
+ (*_counter)++;
+ }
+ Clever & operator = (const Clever & rhs)
+ {
+ if (&rhs != this) {
+ Clever tmp(rhs);
+ swap(tmp);
+ }
+ return *this;
+ }
+ void swap(Clever & rhs)
+ {
+ std::swap(_counter, rhs._counter);
+ }
+ ~Clever() { (*_counter)--; }
+ static size_t getGlobal() { return _global; }
+ bool operator == (const Clever & b) const { return _counter == b._counter; }
+private:
+ volatile size_t * _counter;
+ static size_t _global;
+};
+
+std::ostream & operator << (std::ostream & os, const Clever & clever)
+{
+ (void) clever;
+ return os;
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("array_test");
+ testArray<int>(7, 9);
+ testArray<vespalib::string>("7", "9");
+ const char * longS1 = "more than 48 bytes bytes that are needed to avoid the small string optimisation in vespalib::string";
+ const char * longS2 = "even more more than 48 bytes bytes that are needed to avoid the small string optimisation in vespalib::string";
+ EXPECT_EQUAL(64ul, sizeof(vespalib::string));
+ EXPECT_TRUE(strlen(longS1) > sizeof(vespalib::string));
+ EXPECT_TRUE(strlen(longS2) > sizeof(vespalib::string));
+ testArray<vespalib::string>(longS1, longS2);
+ Array<int> a(2);
+ a[0] = 8;
+ a[1] = 13;
+ Array<int> b(3);
+ b[0] = 8;
+ b[1] = 13;
+ b[2] = 15;
+ testArray(a, b);
+ EXPECT_TRUE(a == a);
+ EXPECT_FALSE(a == b);
+ size_t counter(0);
+ testArray(Clever(&counter), Clever(&counter));
+ EXPECT_EQUAL(0ul, counter);
+ testComplicated();
+ testBeginEnd();
+ testThatOrganicGrowthIsBy2InNAndReserveResizeAreExact();
+ testMoveConstructor();
+ testMoveAssignment();
+ TEST_DONE();
+}
+
+void Test::testThatOrganicGrowthIsBy2InNAndReserveResizeAreExact()
+{
+ Array<char, DefaultAlloc> c(256);
+ EXPECT_EQUAL(256u, c.size());
+ EXPECT_EQUAL(256u, c.capacity());
+ c.reserve(258);
+ EXPECT_EQUAL(256u, c.size());
+ EXPECT_EQUAL(258u, c.capacity());
+ c.resize(258);
+ EXPECT_EQUAL(258u, c.size());
+ EXPECT_EQUAL(258u, c.capacity());
+ c.resize(511);
+ EXPECT_EQUAL(511u, c.size());
+ EXPECT_EQUAL(511u, c.capacity());
+ c.push_back('j');
+ EXPECT_EQUAL(512u, c.size());
+ EXPECT_EQUAL(512u, c.capacity());
+ c.push_back('j');
+ EXPECT_EQUAL(513u, c.size());
+ EXPECT_EQUAL(1024u, c.capacity());
+ for(size_t i(513); i < 1024; i++) {
+ c.push_back('a');
+ }
+ EXPECT_EQUAL(1024u, c.size());
+ EXPECT_EQUAL(1024u, c.capacity());
+ c.reserve(1025);
+ EXPECT_EQUAL(1024u, c.size());
+ EXPECT_EQUAL(1025u, c.capacity());
+ c.push_back('b'); // Within, no growth
+ EXPECT_EQUAL(1025u, c.size());
+ EXPECT_EQUAL(1025u, c.capacity());
+ c.push_back('b'); // Above, grow.
+ EXPECT_EQUAL(1026u, c.size());
+ EXPECT_EQUAL(2048u, c.capacity());
+}
+
+template <typename T>
+void Test::testArray(const T & a, const T & b)
+{
+ Array<T> array;
+
+ ASSERT_EQUAL(sizeof(array), 24u);
+ ASSERT_EQUAL(array.size(), 0u);
+ ASSERT_EQUAL(array.capacity(), 0u);
+ for(size_t i(0); i < 5; i++) {
+ array.push_back(a);
+ array.push_back(b);
+ for (size_t j(0); j <= i; j++) {
+ ASSERT_EQUAL(array[j*2 + 0], a);
+ ASSERT_EQUAL(array[j*2 + 1], b);
+ }
+ }
+ ASSERT_EQUAL(array.size(), 10u);
+ ASSERT_EQUAL(array.capacity(), 16u);
+ for (size_t i(array.size()), m(array.capacity()); i < m; i+=2) {
+ array.push_back(a);
+ array.push_back(b);
+ for (size_t j(0); j <= (i/2); j++) {
+ ASSERT_EQUAL(array[j*2 + 0], a);
+ ASSERT_EQUAL(array[j*2 + 1], b);
+ }
+ }
+ ASSERT_EQUAL(array.size(), array.capacity());
+}
+
+size_t Clever::_global = 0;
+
+void Test::testComplicated()
+{
+ volatile size_t counter(0);
+ {
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ Clever c(&counter);
+ EXPECT_EQUAL(1ul, counter);
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ {
+ Array<Clever> h;
+ EXPECT_EQUAL(0ul, h.size());
+ h.resize(1);
+ EXPECT_EQUAL(1ul, Clever::getGlobal());
+ h[0] = c;
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ h.resize(10000);
+ EXPECT_EQUAL(9999ul, Clever::getGlobal());
+ for (size_t i(0); i < 10000; i++) {
+ h[i] = c;
+ EXPECT_EQUAL(2+i, counter);
+ }
+ EXPECT_EQUAL(10001ul, counter);
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ for (size_t i(0); i < 10000; i++) {
+ h[i] = c;
+ EXPECT_EQUAL(10001ul, counter);
+ }
+ EXPECT_EQUAL(10001ul, counter);
+ h.clear();
+ EXPECT_EQUAL(1ul, counter);
+ for (size_t i(0); i < 10000; i++) {
+ h.push_back(c);
+ EXPECT_EQUAL(2+i, counter);
+ }
+ EXPECT_EQUAL(10001ul, counter);
+ h.pop_back();
+ EXPECT_EQUAL(10000ul, counter);
+ }
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ EXPECT_EQUAL(1ul, counter);
+ }
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ EXPECT_EQUAL(0ul, counter);
+}
+
+template<class T>
+void Test::testBeginEnd(T & v)
+{
+ EXPECT_EQUAL(0u, v.end() - v.begin());
+ EXPECT_EQUAL(0u, v.rend() - v.rbegin());
+ v.push_back(1);
+ v.push_back(2);
+ v.push_back(3);
+
+ EXPECT_EQUAL(1u, *(v.begin()));
+ EXPECT_EQUAL(3u, *(v.end() - 1));
+
+ typename T::iterator i(v.begin());
+ EXPECT_EQUAL(1u, *i);
+ EXPECT_EQUAL(2u, *(i+1));
+ EXPECT_EQUAL(1u, *i++);
+ EXPECT_EQUAL(2u, *i);
+ EXPECT_EQUAL(3u, *++i);
+ EXPECT_EQUAL(3u, *i);
+ EXPECT_EQUAL(3u, *i--);
+ EXPECT_EQUAL(2u, *i);
+ EXPECT_EQUAL(1u, *--i);
+
+ typename T::const_iterator ic(v.begin());
+ EXPECT_EQUAL(1u, *ic);
+ EXPECT_EQUAL(2u, *(ic+1));
+ EXPECT_EQUAL(1u, *ic++);
+ EXPECT_EQUAL(2u, *ic);
+ EXPECT_EQUAL(3u, *++ic);
+ EXPECT_EQUAL(3u, *ic);
+ EXPECT_EQUAL(3u, *ic--);
+ EXPECT_EQUAL(2u, *ic);
+ EXPECT_EQUAL(1u, *--ic);
+
+ EXPECT_EQUAL(3u, *(v.rbegin()));
+ EXPECT_EQUAL(1u, *(v.rend() - 1));
+
+ typename T::reverse_iterator r(v.rbegin());
+ EXPECT_EQUAL(3u, *r);
+ EXPECT_EQUAL(2u, *(r+1));
+ EXPECT_EQUAL(3u, *r++);
+ EXPECT_EQUAL(2u, *r);
+ EXPECT_EQUAL(1u, *++r);
+ EXPECT_EQUAL(1u, *r);
+ EXPECT_EQUAL(1u, *r--);
+ EXPECT_EQUAL(2u, *r);
+ EXPECT_EQUAL(3u, *--r);
+
+ typename T::const_reverse_iterator rc(v.rbegin());
+ EXPECT_EQUAL(3u, *rc);
+ EXPECT_EQUAL(2u, *(rc+1));
+ EXPECT_EQUAL(3u, *rc++);
+ EXPECT_EQUAL(2u, *rc);
+ EXPECT_EQUAL(1u, *++rc);
+ EXPECT_EQUAL(1u, *rc);
+ EXPECT_EQUAL(1u, *rc--);
+ EXPECT_EQUAL(2u, *rc);
+ EXPECT_EQUAL(3u, *--rc);
+
+ EXPECT_EQUAL(3u, v.end() - v.begin());
+ EXPECT_EQUAL(3u, v.rend() - v.rbegin());
+}
+
+void Test::testBeginEnd()
+{
+ std::vector<size_t> v;
+ Array<size_t> a;
+ testBeginEnd(v);
+ testBeginEnd(a);
+}
+
+void Test::testMoveConstructor()
+{
+ Array<size_t> orig;
+ orig.push_back(42);
+ EXPECT_EQUAL(1u, orig.size());
+ EXPECT_EQUAL(42u, orig[0]);
+ {
+ Array<size_t> copy(orig);
+ EXPECT_EQUAL(1u, orig.size());
+ EXPECT_EQUAL(42u, orig[0]);
+ EXPECT_EQUAL(1u, copy.size());
+ EXPECT_EQUAL(42u, copy[0]);
+ }
+ ++orig[0];
+ {
+ Array<size_t> copy(std::move(orig));
+ EXPECT_EQUAL(0u, orig.size());
+ EXPECT_EQUAL(1u, copy.size());
+ EXPECT_EQUAL(43u, copy[0]);
+ }
+}
+
+void Test::testMoveAssignment()
+{
+ Array<size_t> orig;
+ orig.push_back(44);
+ EXPECT_EQUAL(1u, orig.size());
+ EXPECT_EQUAL(44u, orig[0]);
+ {
+ Array<size_t> copy;
+ copy = orig;
+ EXPECT_EQUAL(1u, orig.size());
+ EXPECT_EQUAL(44u, orig[0]);
+ EXPECT_EQUAL(1u, copy.size());
+ EXPECT_EQUAL(44u, copy[0]);
+ }
+ ++orig[0];
+ {
+ Array<size_t> copy;
+ copy = std::move(orig);
+ EXPECT_EQUAL(0u, orig.size());
+ EXPECT_EQUAL(1u, copy.size());
+ EXPECT_EQUAL(45u, copy[0]);
+ }
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/arrayqueue/.cvsignore b/vespalib/src/tests/arrayqueue/.cvsignore
new file mode 100644
index 00000000000..4d4833ece61
--- /dev/null
+++ b/vespalib/src/tests/arrayqueue/.cvsignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+arrayqueue_test
diff --git a/vespalib/src/tests/arrayqueue/.gitignore b/vespalib/src/tests/arrayqueue/.gitignore
new file mode 100644
index 00000000000..9c9b7b1af67
--- /dev/null
+++ b/vespalib/src/tests/arrayqueue/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+arrayqueue_test
+vespalib_arrayqueue_test_app
diff --git a/vespalib/src/tests/arrayqueue/CMakeLists.txt b/vespalib/src/tests/arrayqueue/CMakeLists.txt
new file mode 100644
index 00000000000..57fd14dc536
--- /dev/null
+++ b/vespalib/src/tests/arrayqueue/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_arrayqueue_test_app
+ SOURCES
+ arrayqueue.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_arrayqueue_test_app COMMAND vespalib_arrayqueue_test_app)
diff --git a/vespalib/src/tests/arrayqueue/DESC b/vespalib/src/tests/arrayqueue/DESC
new file mode 100644
index 00000000000..a2af702fb9f
--- /dev/null
+++ b/vespalib/src/tests/arrayqueue/DESC
@@ -0,0 +1 @@
+arrayqueue test. Take a look at arrayqueue.cpp for details.
diff --git a/vespalib/src/tests/arrayqueue/FILES b/vespalib/src/tests/arrayqueue/FILES
new file mode 100644
index 00000000000..9d1e5634437
--- /dev/null
+++ b/vespalib/src/tests/arrayqueue/FILES
@@ -0,0 +1 @@
+arrayqueue.cpp
diff --git a/vespalib/src/tests/arrayqueue/arrayqueue.cpp b/vespalib/src/tests/arrayqueue/arrayqueue.cpp
new file mode 100644
index 00000000000..be411e27f35
--- /dev/null
+++ b/vespalib/src/tests/arrayqueue/arrayqueue.cpp
@@ -0,0 +1,384 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/arrayqueue.hpp>
+
+using namespace vespalib;
+
+// 'instrumented' int
+struct Int
+{
+ static int ctorCnt;
+ static int aliveCnt;
+ static int dtorCnt;
+ static int ddCnt;
+
+ bool alive;
+ int value;
+
+ Int(int val) : alive(true), value(val)
+ {
+ ++ctorCnt;
+ ++aliveCnt;
+ }
+ Int(const Int &val) : alive(true), value(val.value)
+ {
+ ++ctorCnt;
+ ++aliveCnt;
+ }
+ operator int() const { return value; }
+ ~Int() {
+ ++dtorCnt;
+ if (alive) {
+ --aliveCnt;
+ alive = false;
+ } else {
+ ++ddCnt;
+ }
+ }
+};
+int Int::ctorCnt = 0;
+int Int::aliveCnt = 0;
+int Int::dtorCnt = 0;
+int Int::ddCnt = 0;
+
+struct FunkyItem {
+ int extra;
+ std::unique_ptr<Int> mine;
+ FunkyItem(const FunkyItem &) = delete;
+ FunkyItem &operator=(const FunkyItem &) = delete;
+ FunkyItem(int e, int m) : extra(e), mine(new Int(m)) {}
+ FunkyItem(FunkyItem &&rhs) : extra(rhs.extra), mine(std::move(rhs.mine)) {}
+};
+
+struct Copy {
+ typedef ArrayQueue<Int> Q;
+ static void push(Q &q, int v) { Int value(v); q.push(value); }
+ static void pushFront(Q &q, int v) { Int value(v); q.pushFront(value); }
+ static void set(Q &q, int idx, int val) { q.access(idx) = val; }
+};
+
+struct Move {
+ typedef ArrayQueue<std::unique_ptr<Int> > Q;
+ static void push(Q &q, int v) { q.push(std::unique_ptr<Int>(new Int(v))); }
+ static void pushFront(Q &q, int v) { q.pushFront(std::unique_ptr<Int>(new Int(v))); }
+ static void set(Q &q, int idx, int val) { *q.access(idx) = val; }
+};
+
+struct Emplace {
+ typedef ArrayQueue<FunkyItem> Q;
+ static void push(Q &q, int v) { q.emplace(v, v); }
+ static void pushFront(Q &q, int v) { q.emplaceFront(v, v); }
+ static void set(Q &q, int idx, int val) {
+ q.access(idx).extra = val;
+ *q.access(idx).mine = val;
+ }
+};
+
+void checkStatics(int alive) {
+ EXPECT_EQUAL(Int::ctorCnt, alive + Int::dtorCnt);
+ EXPECT_EQUAL(Int::aliveCnt, alive);
+ EXPECT_EQUAL(Int::ddCnt, 0);
+ Int::ctorCnt = alive;
+ Int::aliveCnt = alive;
+ Int::dtorCnt = 0;
+ Int::ddCnt = 0;
+}
+
+template<typename T> int unwrap(const T &);
+template<> int unwrap<Int>(const Int &x) { return x; }
+template<> int unwrap<std::unique_ptr<Int> >(const std::unique_ptr<Int> &x) { return *x; }
+template<> int unwrap<FunkyItem>(const FunkyItem &x) {
+ EXPECT_EQUAL(x.extra, *(x.mine));
+ return unwrap(x.mine);
+}
+
+template <typename T> void checkInts(T &q, std::initializer_list<int> il) {
+ size_t idx = 0;
+ EXPECT_EQUAL(il.size() == 0, q.empty());
+ for (auto itr = il.begin(); itr != il.end(); ++itr, ++idx) {
+ int val = *itr;
+ EXPECT_EQUAL(val, unwrap(q.peek(idx)));
+ EXPECT_EQUAL(val, unwrap(q.access(idx)));
+ if (idx == 0) {
+ EXPECT_EQUAL(val, unwrap(q.front()));
+ }
+ if (idx == (il.size() - 1)) {
+ EXPECT_EQUAL(val, unwrap(q.back()));
+ }
+ }
+}
+
+template <typename T> void testBasic() {
+ typename T::Q q;
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+ T::push(q, 1);
+ TEST_DO(checkStatics(1));
+ TEST_DO(checkInts(q, { 1 }));
+ T::push(q, 2);
+ TEST_DO(checkStatics(2));
+ TEST_DO(checkInts(q, { 1, 2 }));
+ T::push(q, 3);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q, { 1, 2, 3 }));
+ q.clear();
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+}
+
+template <typename T> void testNormal() {
+ typename T::Q q;
+ for (uint32_t i = 0; i < 100; ++i) {
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+ T::push(q, 1);
+ TEST_DO(checkStatics(1));
+ TEST_DO(checkInts(q, { 1 }));
+ T::push(q, 2);
+ TEST_DO(checkStatics(2));
+ TEST_DO(checkInts(q, { 1, 2 }));
+ T::push(q, 3);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q, { 1, 2, 3 }));
+ q.pop();
+ TEST_DO(checkStatics(2));
+ TEST_DO(checkInts(q, { 2, 3 }));
+ q.pop();
+ TEST_DO(checkStatics(1));
+ TEST_DO(checkInts(q, { 3 }));
+ q.pop();
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+ }
+ T::push(q, 1);
+ T::push(q, 2);
+ T::push(q, 3);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q, { 1, 2, 3 }));
+ q.clear();
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+}
+
+template <typename T> void testReverse() {
+ typename T::Q q;
+ for (uint32_t i = 0; i < 100; ++i) {
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+ T::pushFront(q, 1);
+ TEST_DO(checkStatics(1));
+ TEST_DO(checkInts(q, { 1 }));
+ T::pushFront(q, 2);
+ TEST_DO(checkStatics(2));
+ TEST_DO(checkInts(q, { 2, 1 }));
+ T::pushFront(q, 3);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q, { 3, 2, 1 }));
+ q.popBack();
+ TEST_DO(checkStatics(2));
+ TEST_DO(checkInts(q, { 3, 2 }));
+ q.popBack();
+ TEST_DO(checkStatics(1));
+ TEST_DO(checkInts(q, { 3 }));
+ q.popBack();
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+ }
+ T::pushFront(q, 1);
+ T::pushFront(q, 2);
+ T::pushFront(q, 3);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q, { 3, 2, 1 }));
+ q.clear();
+ TEST_DO(checkStatics(0));
+ TEST_DO(checkInts(q, {}));
+}
+
+template <typename T> void subTestCopy() { TEST_ERROR("undefined"); }
+template <> void subTestCopy<Emplace>() {}
+template <> void subTestCopy<Move>() {}
+template <> void subTestCopy<Copy>() {
+ typedef Copy T;
+ { // copy construct queue
+ T::Q q1;
+ T::push(q1, 1);
+ T::push(q1, 2);
+ T::push(q1, 3);
+ T::Q q2(q1);
+ TEST_DO(checkStatics(6));
+ TEST_DO(checkInts(q1, { 1, 2, 3 }));
+ TEST_DO(checkInts(q2, { 1, 2, 3 }));
+ T::push(q1, 4);
+ T::push(q1, 5);
+ T::push(q2, 40);
+ T::push(q2, 50);
+ TEST_DO(checkStatics(10));
+ TEST_DO(checkInts(q1, { 1, 2, 3, 4, 5 }));
+ TEST_DO(checkInts(q2, { 1, 2, 3, 40, 50 }));
+ }
+ { // copy assign queue
+ T::Q q1;
+ T::Q q2;
+ T::push(q1, 1);
+ T::push(q1, 2);
+ T::push(q1, 3);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q1, { 1, 2, 3 }));
+ TEST_DO(checkInts(q2, {}));
+ q2 = q1;
+ TEST_DO(checkStatics(6));
+ TEST_DO(checkInts(q1, { 1, 2, 3 }));
+ TEST_DO(checkInts(q2, { 1, 2, 3 }));
+ T::push(q1, 4);
+ T::push(q1, 5);
+ T::push(q2, 40);
+ T::push(q2, 50);
+ TEST_DO(checkStatics(10));
+ TEST_DO(checkInts(q1, { 1, 2, 3, 4, 5 }));
+ TEST_DO(checkInts(q2, { 1, 2, 3, 40, 50 }));
+ }
+}
+
+template <typename T> void testEdit() {
+ { // modify value in queue
+ typename T::Q q;
+ T::push(q, 5);
+ TEST_DO(checkStatics(1));
+ TEST_DO(checkInts(q, { 5 }));
+ T::set(q, 0, 10);
+ TEST_DO(checkStatics(1));
+ TEST_DO(checkInts(q, { 10 }));
+ }
+ subTestCopy<T>(); // only test copy if elements of T::Q are copyable
+ { // move construct queue
+ typename T::Q q1;
+ T::push(q1, 1);
+ T::push(q1, 2);
+ T::push(q1, 3);
+ typename T::Q q2(std::move(q1));
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q1, {}));
+ TEST_DO(checkInts(q2, { 1, 2, 3 }));
+ T::push(q1, 4);
+ T::push(q1, 5);
+ T::push(q2, 40);
+ T::push(q2, 50);
+ TEST_DO(checkStatics(7));
+ TEST_DO(checkInts(q1, { 4, 5 }));
+ TEST_DO(checkInts(q2, { 1, 2, 3, 40, 50 }));
+ }
+ { // move assign queue
+ typename T::Q q1;
+ typename T::Q q2;
+ T::push(q1, 1);
+ T::push(q1, 2);
+ T::push(q1, 3);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q1, { 1, 2, 3 }));
+ TEST_DO(checkInts(q2, {}));
+ q2 = std::move(q1);
+ TEST_DO(checkStatics(3));
+ TEST_DO(checkInts(q1, {}));
+ TEST_DO(checkInts(q2, { 1, 2, 3 }));
+ T::push(q1, 4);
+ T::push(q1, 5);
+ T::push(q2, 40);
+ T::push(q2, 50);
+ TEST_DO(checkStatics(7));
+ TEST_DO(checkInts(q1, { 4, 5 }));
+ TEST_DO(checkInts(q2, { 1, 2, 3, 40, 50 }));
+ }
+ { // swap queues
+ typename T::Q q1;
+ typename T::Q q2;
+ T::push(q1, 1);
+ T::push(q1, 2);
+ T::push(q1, 3);
+ T::push(q2, 10);
+ T::push(q2, 20);
+ T::push(q2, 30);
+ TEST_DO(checkStatics(6));
+ TEST_DO(checkInts(q1, { 1, 2, 3 }));
+ TEST_DO(checkInts(q2, { 10, 20, 30 }));
+ q1.swap(q2);
+ TEST_DO(checkStatics(6));
+ TEST_DO(checkInts(q1, { 10, 20, 30 }));
+ TEST_DO(checkInts(q2, { 1, 2, 3 }));
+ }
+}
+
+template <typename T> void testCapacity() {
+ { // start with zero capacity
+ typename T::Q q;
+ EXPECT_EQUAL(q.capacity(), 0u);
+ q.reserve(1);
+ EXPECT_EQUAL(q.capacity(), 16u);
+ q.reserve(16);
+ EXPECT_EQUAL(q.capacity(), 16u);
+ q.reserve(17);
+ EXPECT_EQUAL(q.capacity(), 32u);
+ q.reserve(33);
+ EXPECT_EQUAL(q.capacity(), 64u);
+ q.reserve(500);
+ EXPECT_EQUAL(q.capacity(), 512u);
+ }
+ { // start with given capacity < 16
+ typename T::Q q(10);
+ EXPECT_EQUAL(q.capacity(), 10u);
+ q.reserve(10);
+ EXPECT_EQUAL(q.capacity(), 10u);
+ q.reserve(11);
+ EXPECT_EQUAL(q.capacity(), 16u);
+ q.reserve(17);
+ EXPECT_EQUAL(q.capacity(), 32u);
+ q.reserve(33);
+ EXPECT_EQUAL(q.capacity(), 64u);
+ q.reserve(500);
+ EXPECT_EQUAL(q.capacity(), 512u);
+ }
+ { // start with given capacity > 16
+ typename T::Q q(20);
+ EXPECT_EQUAL(q.capacity(), 20u);
+ q.reserve(20);
+ EXPECT_EQUAL(q.capacity(), 20u);
+ q.reserve(21);
+ EXPECT_EQUAL(q.capacity(), 40u);
+ q.reserve(41);
+ EXPECT_EQUAL(q.capacity(), 80u);
+ q.reserve(81);
+ EXPECT_EQUAL(q.capacity(), 160u);
+ q.reserve(500);
+ EXPECT_EQUAL(q.capacity(), 640u);
+ }
+}
+
+template <typename T> void testExpansion() {
+ typename T::Q q(32);
+ T::push(q, 111);
+ T::push(q, 222);
+ T::push(q, 333);
+ q.pop();
+ q.pop();
+ q.pop();
+ for (int i = 0; i < 200; ++i) {
+ T::push(q, i);
+ }
+ for (int i = 0; i < 200; ++i) {
+ EXPECT_EQUAL(unwrap(q.peek(i)), i);
+ }
+}
+
+template <typename T> void dispatchTypedTests() {
+ TEST_DO(testBasic<T>());
+ TEST_DO(testNormal<T>());
+ TEST_DO(testReverse<T>());
+ TEST_DO(testEdit<T>());
+ TEST_DO(testCapacity<T>());
+ TEST_DO(testExpansion<T>());
+}
+
+TEST("test with copyable items") { dispatchTypedTests<Copy>(); }
+TEST("test with movable items") { dispatchTypedTests<Move>(); }
+TEST("test with emplaced items") { dispatchTypedTests<Emplace>(); }
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/atomic/.gitignore b/vespalib/src/tests/atomic/.gitignore
new file mode 100644
index 00000000000..7ec00432065
--- /dev/null
+++ b/vespalib/src/tests/atomic/.gitignore
@@ -0,0 +1,6 @@
+.depend
+Makefile
+atomic_test
+/atomic_bench
+vespalib_atomic_test_app
+vespalib_atomic_bench_app
diff --git a/vespalib/src/tests/atomic/CMakeLists.txt b/vespalib/src/tests/atomic/CMakeLists.txt
new file mode 100644
index 00000000000..c7cffde606c
--- /dev/null
+++ b/vespalib/src/tests/atomic/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_atomic_test_app
+ SOURCES
+ atomic_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_atomic_test_app COMMAND vespalib_atomic_test_app)
+vespa_add_executable(vespalib_atomic_bench_app
+ SOURCES
+ atomic_bench.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_atomic_bench_app COMMAND vespalib_atomic_bench_app BENCHMARK)
diff --git a/vespalib/src/tests/atomic/DESC b/vespalib/src/tests/atomic/DESC
new file mode 100644
index 00000000000..ec5b4379673
--- /dev/null
+++ b/vespalib/src/tests/atomic/DESC
@@ -0,0 +1 @@
+atomic test. Take a look at atomic.cpp for details.
diff --git a/vespalib/src/tests/atomic/FILES b/vespalib/src/tests/atomic/FILES
new file mode 100644
index 00000000000..83c6c518c67
--- /dev/null
+++ b/vespalib/src/tests/atomic/FILES
@@ -0,0 +1 @@
+atomic.cpp
diff --git a/vespalib/src/tests/atomic/atomic_bench.cpp b/vespalib/src/tests/atomic/atomic_bench.cpp
new file mode 100644
index 00000000000..499af1daa65
--- /dev/null
+++ b/vespalib/src/tests/atomic/atomic_bench.cpp
@@ -0,0 +1,104 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("atomic_bench");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/atomic.h>
+#include <vector>
+#include <algorithm>
+#include <sstream>
+
+
+class Test : public vespalib::TestApp
+{
+public:
+ template<typename C, typename T>
+ void testInc(size_t threads, size_t loops);
+ int Main();
+};
+
+template <typename T>
+class Changer : public FastOS_Runnable
+{
+protected:
+ volatile T * const _idata;
+ const int _times;
+public:
+ Changer(int times, T *data)
+ : _idata(data), _times(times) {}
+};
+
+template <typename T>
+class Incrementer : public Changer<T>
+{
+public:
+ Incrementer(int times, T *data) : Changer<T>(times, data) {}
+ void Run(FastOS_ThreadInterface *, void *) {
+ using vespalib::Atomic;
+ for (int i = 0; i < this->_times; ++i) {
+ Atomic::postInc(this->_idata);
+ }
+ }
+};
+
+template <typename T>
+class IncrementerByCmpSwap : public Changer<T>
+{
+public:
+ IncrementerByCmpSwap(int times, T *data) : Changer<T>(times, data) {}
+ void Run(FastOS_ThreadInterface *, void *) {
+ using vespalib::Atomic;
+ T oldVal(0);
+ for (int i = 0; i < this->_times; ++i) {
+ do {
+ oldVal = *this->_idata;
+ } while ( ! Atomic::cmpSwap(this->_idata, oldVal+1, oldVal));
+ }
+ }
+};
+
+int
+Test::Main()
+{
+ TEST_INIT("atomic_bench");
+ size_t concurrency(1);
+ size_t numRuns(10000000ul);
+ size_t benchType(0);
+ if (_argc > 1) {
+ benchType = strtoul(_argv[1], NULL, 0);
+ if (_argc > 2) {
+ numRuns = strtoul(_argv[2], NULL, 0);
+ if (_argc > 3) {
+ concurrency = strtoul(_argv[3], NULL, 0);
+ }
+ }
+ }
+ LOG(info, "Running test number %ld with %ld loops and concurrency of %ld", benchType, numRuns, concurrency);
+ if (benchType == 1) {
+ testInc<IncrementerByCmpSwap<uint64_t>, uint64_t>(concurrency, numRuns);
+ } else {
+ testInc<Incrementer<uint64_t>, uint64_t>(concurrency, numRuns);
+ }
+
+ TEST_FLUSH();
+ TEST_DONE();
+}
+
+
+template<typename C, typename T>
+void
+Test::testInc(size_t numThreads, size_t loopCount)
+{
+ std::vector<std::unique_ptr<C>> threads3(numThreads);
+ T uintcounter = 0;
+ FastOS_ThreadPool tpool3(65000, numThreads);
+ for (size_t i = 0; i < numThreads; i++) {
+ threads3[i] = std::make_unique<C>(loopCount, &uintcounter);
+ tpool3.NewThread(threads3[i].get());
+ }
+ tpool3.Close();
+ EXPECT_TRUE(uintcounter == numThreads * loopCount);
+ TEST_FLUSH();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/atomic/atomic_test.cpp b/vespalib/src/tests/atomic/atomic_test.cpp
new file mode 100644
index 00000000000..6a84e7a32fc
--- /dev/null
+++ b/vespalib/src/tests/atomic/atomic_test.cpp
@@ -0,0 +1,338 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("atomic_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/atomic.h>
+#include <vector>
+#include <algorithm>
+#include <sstream>
+
+
+class Test : public vespalib::TestApp
+{
+public:
+ template<typename T, typename U>
+ void testAdd();
+ template<typename T, typename U>
+ void testAddSub();
+ template<typename T>
+ void testInc();
+ template<typename T>
+ void testDec();
+ template<typename T>
+ void testSemantics();
+ int Main();
+};
+
+static const int numadders = 7;
+static const int loopcnt = 100000;
+
+int
+Test::Main()
+{
+ TEST_INIT("atomic_test");
+
+ testSemantics<int32_t>();
+ testSemantics<int64_t>();
+ testAdd<int32_t, uint32_t>();
+ testAdd<int64_t, uint64_t>();
+ testAddSub<int32_t, uint32_t>();
+ testAddSub<int64_t, uint64_t>();
+ testInc<uint32_t>();
+ testInc<uint64_t>();
+ testDec<uint32_t>();
+ testDec<uint64_t>();
+
+ TEST_FLUSH();
+ TEST_DONE();
+}
+
+template<typename T>
+void
+Test::testSemantics()
+{
+ using vespalib::Atomic;
+ volatile T value(0);
+ EXPECT_EQUAL(0, value);
+ EXPECT_EQUAL(0, Atomic::postInc(&value));
+ EXPECT_EQUAL(1, Atomic::postInc(&value));
+ EXPECT_EQUAL(2, value);
+ EXPECT_EQUAL(2, Atomic::postDec(&value));
+ EXPECT_EQUAL(1, value);
+ EXPECT_EQUAL(1, Atomic::postAdd(&value, 17));
+ EXPECT_EQUAL(18, value);
+ EXPECT_EQUAL(18, Atomic::postAdd(&value, 17));
+ EXPECT_EQUAL(35, value);
+ EXPECT_EQUAL(35, Atomic::postAdd(&value, -7));
+ EXPECT_EQUAL(28, value);
+}
+
+class NotAtomic
+{
+public:
+ static inline void add(volatile int *data, int xdelta) {
+ (*data) += xdelta;
+ }
+ static inline void sub(volatile int *data, int xdelta) {
+ (*data) -= xdelta;
+ }
+ static inline void add(volatile unsigned int *data, unsigned int xdelta) {
+ (*data) += xdelta;
+ }
+ static inline void sub(volatile unsigned int *data, unsigned int xdelta) {
+ (*data) -= xdelta;
+ }
+ static inline unsigned int postDec(volatile unsigned int *data) {
+ return (*data)--;
+ }
+ static inline unsigned int postInc(volatile unsigned int *data) {
+ return (*data)++;
+ }
+};
+
+template<typename T, typename U>
+class Adder : public FastOS_Runnable
+{
+private:
+ int _added;
+ const T _toadd;
+ const int _times;
+ volatile T * const _idata;
+ volatile U * const _udata;
+public:
+ Adder(T toadd, int times, T *i, U *u) :
+ _added(0),
+ _toadd(toadd),
+ _times(times),
+ _idata(i),
+ _udata(u)
+ {}
+ void Run(FastOS_ThreadInterface *, void *) {
+ using vespalib::Atomic;
+ for (int i = 0; i < _times; ++i) {
+ Atomic::add(_idata, _toadd);
+ Atomic::add(_udata, _toadd);
+ _added += _toadd;
+ }
+ }
+ int getAdded() { return _added; }
+};
+
+
+template<typename T, typename U>
+class Subtracter : public FastOS_Runnable
+{
+private:
+ int _subed;
+ const T _tosub;
+ const int _times;
+ volatile T * const _idata;
+ volatile U * const _udata;
+public:
+ Subtracter(T tosub, int times, T *i, U *u) :
+ _subed(0),
+ _tosub(tosub),
+ _times(times),
+ _idata(i),
+ _udata(u)
+ {}
+ void Run(FastOS_ThreadInterface *, void *) {
+ using vespalib::Atomic;
+ for (int i = 0; i < _times; ++i) {
+ Atomic::sub(_idata, _tosub);
+ Atomic::sub(_udata, _tosub);
+ _subed += _tosub;
+ }
+ }
+ int getSubtracted() { return _subed; }
+};
+
+template <typename T>
+class Changer : public FastOS_Runnable
+{
+protected:
+ std::vector<T> _counts;
+ volatile T * const _idata;
+ const int _times;
+public:
+ Changer(int times, T *data)
+ : _counts(), _idata(data), _times(times) {}
+ const std::vector<T> & getCounts() const { return _counts; }
+};
+
+
+template <typename T>
+class Incrementer : public Changer<T>
+{
+public:
+ Incrementer(int times, T *data) : Changer<T>(times, data) {}
+ void Run(FastOS_ThreadInterface *, void *) {
+ using vespalib::Atomic;
+ for (int i = 0; i < this->_times; ++i) {
+ this->_counts.push_back(Atomic::postInc(this->_idata));
+ }
+ }
+};
+
+
+template <typename T>
+class Decrementer : public Changer<T>
+{
+public:
+ Decrementer(int times, T *data) : Changer<T>(times, data) {}
+ void Run(FastOS_ThreadInterface *, void *) {
+ using vespalib::Atomic;
+ for (int i = 0; i < this->_times; ++i) {
+ this->_counts.push_back(Atomic::postDec(this->_idata));
+ }
+ }
+};
+
+
+template<typename T, typename U>
+void
+Test::testAdd()
+{
+ Adder<T, U> *threads1[numadders];
+
+ T intcounter = 0;
+ U uintcounter = 0;
+
+ FastOS_ThreadPool tpool1(65000, numadders);
+ for (int i = 0; i < numadders; i++) {
+ threads1[i] = new Adder<T, U>(2+i, loopcnt, &intcounter, &uintcounter);
+ tpool1.NewThread(threads1[i]);
+ }
+ tpool1.Close();
+ T intcorrect = 0;
+ U uintcorrect = 0;
+ for (int i = 0; i < numadders; i++) {
+ intcorrect += threads1[i]->getAdded();
+ uintcorrect += threads1[i]->getAdded();
+ }
+ for (int i = 0; i < numadders; i++) {
+ delete threads1[i];
+ }
+ std::ostringstream os;
+ os << "intcounter = " << intcounter << ", intcorrect = " << intcorrect;
+ LOG(debug, "%s", os.str().c_str());
+ EXPECT_TRUE( intcounter == intcorrect);
+ std::ostringstream uos;
+ uos << "uintcounter = " << uintcounter << ", uintcorrect = " << uintcorrect;
+ LOG(debug, "%s", uos.str().c_str());
+ EXPECT_TRUE(uintcounter == uintcorrect);
+}
+
+
+template<typename T, typename U>
+void
+Test::testAddSub()
+{
+ FastOS_Runnable *threads2[numadders*2];
+ T intcounter = 0;
+ U uintcounter = 0;
+
+ FastOS_ThreadPool tpool2(65000, 2*numadders);
+ for (int i = 0; i < numadders; i++) {
+ threads2[i] = new Adder<T, U>(2+i, loopcnt, &intcounter, &uintcounter);
+ threads2[numadders+i] = new Subtracter<T, U>(2+i, loopcnt,
+ &intcounter, &uintcounter);
+ }
+ for (int i = 0; i < numadders*2; i++) {
+ tpool2.NewThread(threads2[i]);
+ }
+ tpool2.Close();
+
+ for (int i = 0; i < numadders*2; i++) {
+ delete threads2[i];
+ }
+ std::ostringstream os;
+ os << "intcounter = " << intcounter << ", uintcounter = " << uintcounter;
+ LOG(debug, "%s", os.str().c_str());
+ EXPECT_TRUE( intcounter == 0);
+ EXPECT_TRUE(uintcounter == 0);
+}
+
+
+template<typename T>
+void
+Test::testInc()
+{
+ Incrementer<T> *threads3[numadders];
+ T uintcounter = 0;
+ FastOS_ThreadPool tpool3(65000, numadders);
+ for (int i = 0; i < numadders; i++) {
+ threads3[i] = new Incrementer<T>(loopcnt, &uintcounter);
+ tpool3.NewThread(threads3[i]);
+ }
+ tpool3.Close();
+ std::vector<T> all;
+ for (int i = 0; i < numadders; i++) {
+ const std::vector<T> & cnts = threads3[i]->getCounts();
+ typename std::vector<T>::const_iterator it = cnts.begin();
+ while (it != cnts.end()) {
+ all.push_back(*it);
+ ++it;
+ }
+ }
+ for (int i = 0; i < numadders; i++) {
+ delete threads3[i];
+ }
+ std::sort(all.begin(), all.end());
+ for (unsigned int n = 0; n < all.size(); ++n) {
+ EXPECT_TRUE(all[n] == n);
+ if (all[n] != n) {
+ std::ostringstream os;
+ os << all[n];
+ LOG(info, "all[%d] = %s", n, os.str().c_str());
+ break;
+ }
+ }
+ TEST_FLUSH();
+ EXPECT_TRUE(uintcounter == numadders * loopcnt);
+ TEST_FLUSH();
+}
+
+template<typename T>
+void
+Test::testDec()
+{
+ T uintcounter = numadders * loopcnt;
+ Decrementer<T> *threads4[numadders];
+ FastOS_ThreadPool tpool4(65000, numadders);
+ for (int i = 0; i < numadders; i++) {
+ threads4[i] = new Decrementer<T>(loopcnt, &uintcounter);
+ tpool4.NewThread(threads4[i]);
+ }
+ tpool4.Close();
+ std::vector<T> all;
+ for (int i = 0; i < numadders; i++) {
+ const std::vector<T> & cnts = threads4[i]->getCounts();
+ typename std::vector<T>::const_iterator it = cnts.begin();
+ while (it != cnts.end()) {
+ all.push_back(*it);
+ ++it;
+ }
+ }
+ for (int i = 0; i < numadders; i++) {
+ delete threads4[i];
+ }
+ std::sort(all.begin(), all.end());
+ for (size_t n = 0; n < all.size(); ++n) {
+ EXPECT_TRUE(all[n] == n+1);
+ if (all[n] != n+1) {
+ for (size_t i = n; i < std::min(n+20, all.size()); ++i) {
+ std::ostringstream os;
+ os << std::dec << "all[" << i << "] = " << std::hex << all[i];
+ LOG(warning, "%s", os.str().c_str());
+ }
+ break;
+ }
+ }
+ TEST_FLUSH();
+ EXPECT_TRUE(uintcounter == 0);
+}
+
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/barrier/.gitignore b/vespalib/src/tests/barrier/.gitignore
new file mode 100644
index 00000000000..c34ea278112
--- /dev/null
+++ b/vespalib/src/tests/barrier/.gitignore
@@ -0,0 +1,2 @@
+vespalib_barrier_test_app
+Testing
diff --git a/vespalib/src/tests/barrier/CMakeLists.txt b/vespalib/src/tests/barrier/CMakeLists.txt
new file mode 100644
index 00000000000..db0e98b04c5
--- /dev/null
+++ b/vespalib/src/tests/barrier/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_barrier_test_app
+ SOURCES
+ barrier_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_barrier_test_app COMMAND vespalib_barrier_test_app)
diff --git a/vespalib/src/tests/barrier/FILES b/vespalib/src/tests/barrier/FILES
new file mode 100644
index 00000000000..30cf7423b56
--- /dev/null
+++ b/vespalib/src/tests/barrier/FILES
@@ -0,0 +1 @@
+barrier_test.cpp
diff --git a/vespalib/src/tests/barrier/barrier_test.cpp b/vespalib/src/tests/barrier/barrier_test.cpp
new file mode 100644
index 00000000000..680c0bbac1d
--- /dev/null
+++ b/vespalib/src/tests/barrier/barrier_test.cpp
@@ -0,0 +1,59 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/barrier.h>
+
+using namespace vespalib;
+
+struct Fixture {
+ Barrier barrier;
+ CountDownLatch latch;
+ Fixture(size_t n) : barrier(n), latch(n) {}
+};
+
+TEST_MT_F("require that barriers are satisfied by the appropriate number of threads", 3, Fixture(num_threads)) {
+ if (thread_id == 0) {
+ f1.latch.countDown();
+ EXPECT_FALSE(f.latch.await(250));
+ EXPECT_TRUE(f.barrier.await());
+ EXPECT_TRUE(f.latch.await(25000));
+ } else {
+ EXPECT_TRUE(f1.barrier.await());
+ f1.latch.countDown();
+ }
+}
+
+TEST_MT_F("require that barriers can be used multiple times", 3, Fixture(num_threads)) {
+ EXPECT_TRUE(f1.barrier.await());
+ EXPECT_TRUE(f1.barrier.await());
+ if (thread_id == 0) {
+ f1.latch.countDown();
+ EXPECT_FALSE(f.latch.await(250));
+ EXPECT_TRUE(f.barrier.await());
+ EXPECT_TRUE(f.latch.await(25000));
+ } else {
+ EXPECT_TRUE(f1.barrier.await());
+ f1.latch.countDown();
+ }
+}
+
+TEST_MT_F("require that barriers can be broken", 3, Fixture(num_threads)) {
+ EXPECT_TRUE(f1.barrier.await());
+ if (thread_id == 0) {
+ f1.latch.countDown();
+ EXPECT_FALSE(f.latch.await(250));
+ f1.barrier.destroy();
+ EXPECT_TRUE(f.latch.await(25000));
+ } else {
+ EXPECT_FALSE(f1.barrier.await());
+ f1.latch.countDown();
+ }
+ EXPECT_FALSE(f1.barrier.await());
+}
+
+TEST_MT_F("require that barriers cannot be retroactively broken", 100, Barrier(num_threads)) {
+ EXPECT_TRUE(f1.await());
+ f1.destroy();
+ EXPECT_FALSE(f1.await());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/benchmark_timer/.gitignore b/vespalib/src/tests/benchmark_timer/.gitignore
new file mode 100644
index 00000000000..6837dcd2afe
--- /dev/null
+++ b/vespalib/src/tests/benchmark_timer/.gitignore
@@ -0,0 +1 @@
+vespalib_benchmark_timer_test_app
diff --git a/vespalib/src/tests/benchmark_timer/CMakeLists.txt b/vespalib/src/tests/benchmark_timer/CMakeLists.txt
new file mode 100644
index 00000000000..605e1723d19
--- /dev/null
+++ b/vespalib/src/tests/benchmark_timer/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_benchmark_timer_test_app
+ SOURCES
+ benchmark_timer_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_benchmark_timer_test_app COMMAND vespalib_benchmark_timer_test_app BENCHMARK)
diff --git a/vespalib/src/tests/benchmark_timer/benchmark_timer_test.cpp b/vespalib/src/tests/benchmark_timer/benchmark_timer_test.cpp
new file mode 100644
index 00000000000..42f6af0e1ea
--- /dev/null
+++ b/vespalib/src/tests/benchmark_timer/benchmark_timer_test.cpp
@@ -0,0 +1,43 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/benchmark_timer.h>
+
+using namespace vespalib;
+
+TEST("require that the benchmark timer can be used as advertised") {
+ BenchmarkTimer timer(1.0);
+ while (timer.has_budget()) {
+ timer.before();
+ FastOS_Thread::Sleep(5);
+ timer.after();
+ }
+ EXPECT_TRUE(timer.min_time() >= 0.0);
+ fprintf(stderr, "5 ms sleep takes: %g ms\n", timer.min_time() * 1000.0);
+}
+
+TEST("require that the benchmark timer all-in-one benchmarking works") {
+ uint32_t sleep_time = 5;
+ double t = BenchmarkTimer::benchmark([sleep_time](){FastOS_Thread::Sleep(sleep_time);}, 1.0);
+ fprintf(stderr, "5 ms sleep takes: %g ms\n", t * 1000.0);
+}
+
+TEST("require that the benchmark timer all-in-one benchmarking with baseline works") {
+ uint32_t work_time = 10;
+ uint32_t baseline_time = 5;
+ double t = BenchmarkTimer::benchmark([&](){FastOS_Thread::Sleep(work_time);},
+ [&](){FastOS_Thread::Sleep(baseline_time);}, 1.0);
+ fprintf(stderr, "10 ms sleep - 5 ms sleep takes: %g ms\n", t * 1000.0);
+}
+
+TEST("require that the benchmark timer all-in-one benchmarking with baseline and specified loop count works") {
+ uint32_t work_time = 2;
+ uint32_t baseline_time = 1;
+ uint32_t loop_cnt = 0;
+ double t = BenchmarkTimer::benchmark([&](){FastOS_Thread::Sleep(work_time); ++loop_cnt;},
+ [&](){FastOS_Thread::Sleep(baseline_time);}, 7, 0.0);
+ EXPECT_EQUAL(loop_cnt, 7u);
+ fprintf(stderr, "2 ms sleep - 1 ms sleep takes: %g ms\n", t * 1000.0);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/box/.gitignore b/vespalib/src/tests/box/.gitignore
new file mode 100644
index 00000000000..76ae8a62fd2
--- /dev/null
+++ b/vespalib/src/tests/box/.gitignore
@@ -0,0 +1,2 @@
+vespalib_box_test_app
+Testing
diff --git a/vespalib/src/tests/box/CMakeLists.txt b/vespalib/src/tests/box/CMakeLists.txt
new file mode 100644
index 00000000000..c115383fcd2
--- /dev/null
+++ b/vespalib/src/tests/box/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_box_test_app
+ SOURCES
+ box_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_box_test_app COMMAND vespalib_box_test_app)
diff --git a/vespalib/src/tests/box/FILES b/vespalib/src/tests/box/FILES
new file mode 100644
index 00000000000..df0cdaa9666
--- /dev/null
+++ b/vespalib/src/tests/box/FILES
@@ -0,0 +1 @@
+box_test.cpp
diff --git a/vespalib/src/tests/box/box_test.cpp b/vespalib/src/tests/box/box_test.cpp
new file mode 100644
index 00000000000..a3683758097
--- /dev/null
+++ b/vespalib/src/tests/box/box_test.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/box.h>
+
+using namespace vespalib;
+
+void checkValues(const std::vector<int> &values, size_t n) {
+ ASSERT_EQUAL(n, values.size());
+ for (size_t i = 0; i < n; ++i) {
+ EXPECT_EQUAL(int(10 + (10 * i)), values[i]);
+ }
+}
+
+TEST("require that boxes can be created and converted to vector") {
+ Box<int> box;
+ box.add(10).add(20).add(30);
+ checkValues(box, 3);
+}
+
+TEST("require that boxes can be created in place") {
+ checkValues(Box<int>().add(10).add(20).add(30), 3);
+}
+
+TEST("require that make_box works") {
+ checkValues(make_box(10), 1);
+ checkValues(make_box(10, 20), 2);
+ checkValues(make_box(10, 20, 30), 3);
+ checkValues(make_box(10, 20, 30, 40), 4);
+ checkValues(make_box(10, 20, 30, 40, 50), 5);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/closure/.gitignore b/vespalib/src/tests/closure/.gitignore
new file mode 100644
index 00000000000..9fa3ea2e68d
--- /dev/null
+++ b/vespalib/src/tests/closure/.gitignore
@@ -0,0 +1,6 @@
+.depend
+Makefile
+autoclosurecaller_test
+closure_test
+vespalib_autoclosurecaller_test_app
+vespalib_closure_test_app
diff --git a/vespalib/src/tests/closure/CMakeLists.txt b/vespalib/src/tests/closure/CMakeLists.txt
new file mode 100644
index 00000000000..174c1e8700b
--- /dev/null
+++ b/vespalib/src/tests/closure/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_closure_test_app
+ SOURCES
+ closure_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_closure_test_app COMMAND vespalib_closure_test_app)
+vespa_add_executable(vespalib_autoclosurecaller_test_app
+ SOURCES
+ autoclosurecaller_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_autoclosurecaller_test_app COMMAND vespalib_autoclosurecaller_test_app)
diff --git a/vespalib/src/tests/closure/autoclosurecaller_test.cpp b/vespalib/src/tests/closure/autoclosurecaller_test.cpp
new file mode 100644
index 00000000000..c6363b4bd49
--- /dev/null
+++ b/vespalib/src/tests/closure/autoclosurecaller_test.cpp
@@ -0,0 +1,47 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Unit tests for autoclosurecaller.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("autoclosurecaller_test");
+
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/autoclosurecaller.h>
+
+using namespace vespalib;
+
+namespace {
+
+class Test : public vespalib::TestApp {
+ void requireThatClosureIsCalledInDtor();
+
+public:
+ int Main();
+};
+
+int
+Test::Main()
+{
+ TEST_INIT("autoclosurecaller_test");
+
+ TEST_DO(requireThatClosureIsCalledInDtor());
+
+ TEST_DONE();
+}
+
+void setBool(bool *b) {
+ *b = true;
+}
+
+void Test::requireThatClosureIsCalledInDtor() {
+ bool is_called = false;
+ {
+ AutoClosureCaller caller(makeClosure(setBool, &is_called));
+ EXPECT_TRUE(!is_called);
+ }
+ EXPECT_TRUE(is_called);
+}
+
+} // namespace
+
+TEST_APPHOOK(Test);
diff --git a/vespalib/src/tests/closure/closure_test.cpp b/vespalib/src/tests/closure/closure_test.cpp
new file mode 100644
index 00000000000..5de4d424c60
--- /dev/null
+++ b/vespalib/src/tests/closure/closure_test.cpp
@@ -0,0 +1,263 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Unit tests for closure.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("closure_test");
+
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/closure.h>
+#include <string>
+
+using std::shared_ptr;
+using std::unique_ptr;
+using std::string;
+using namespace vespalib;
+
+namespace {
+
+class Test : public vespalib::TestApp {
+ void testClosure0_0();
+ void testClosure0_1();
+ void testClosure0_2();
+ void testClosure1_0();
+ void testClosure1_1();
+ void testClosure1_2();
+ void testMemberClosure0_0();
+ void testMemberClosure0_1();
+ void testMemberClosure0_2();
+ void testMemberClosure1_0();
+ void testMemberClosure1_1();
+ void testMemberClosure1_2();
+
+public:
+ int Main();
+};
+
+int
+Test::Main()
+{
+ TEST_INIT("callback_test");
+
+ TEST_DO(testClosure0_0());
+ TEST_DO(testClosure0_1());
+ TEST_DO(testClosure0_2());
+ TEST_DO(testClosure1_0());
+ TEST_DO(testClosure1_1());
+ TEST_DO(testClosure1_2());
+ TEST_DO(testMemberClosure0_0());
+ TEST_DO(testMemberClosure0_1());
+ TEST_DO(testMemberClosure0_2());
+ TEST_DO(testMemberClosure1_0());
+ TEST_DO(testMemberClosure1_1());
+ TEST_DO(testMemberClosure1_2());
+
+ TEST_DONE();
+}
+
+bool called = false;
+void setCalled() { called = true; }
+void setBool(bool *p) { *p = true; }
+void setInt(int *p, int i) { *p = i; }
+void setIntSum(int *p, int i, int j) { *p = i + j; }
+
+int setCalledReturnInt() { called = true; return 42; }
+int setBoolReturnInt(bool *p) { *p = true; return 42; }
+int setIntReturnInt(int *p, int i) { *p = i; return i; }
+int setIntSumReturnInt(int *p, int i, int j) { *p = i + j; return i + j; }
+
+void Test::testClosure0_0() {
+ called = false;
+ unique_ptr<Closure> void_closure = makeClosure(setCalled);
+ void_closure->call();
+ EXPECT_TRUE(called);
+
+ called = false;
+ unique_ptr<Closure0<int> > closure = makeClosure(setCalledReturnInt);
+ EXPECT_EQUAL(42, closure->call());
+ EXPECT_TRUE(called);
+}
+
+void Test::testClosure0_1() {
+ bool is_called = false;
+ unique_ptr<Closure> void_closure = makeClosure(setBool, &is_called);
+ void_closure->call();
+ EXPECT_TRUE(is_called);
+
+ is_called = false;
+ unique_ptr<Closure0<int> > closure =
+ makeClosure(setBoolReturnInt, &is_called);
+ EXPECT_EQUAL(42, closure->call());
+ EXPECT_TRUE(is_called);
+}
+
+void Test::testClosure0_2() {
+ int i = 0;
+ unique_ptr<Closure> void_closure = makeClosure(setInt, &i, 42);
+ void_closure->call();
+ EXPECT_EQUAL(42, i);
+
+ unique_ptr<Closure0<int> > closure = makeClosure(setIntReturnInt, &i, 23);
+ EXPECT_EQUAL(23, closure->call());
+ EXPECT_EQUAL(23, i);
+}
+
+void Test::testClosure1_0() {
+ bool is_called = false;
+ unique_ptr<Closure1<bool *> > void_closure = makeClosure(setBool);
+ void_closure->call(&is_called);
+ EXPECT_TRUE(is_called);
+
+ is_called = false;
+ unique_ptr<Closure1<bool *, int> > closure = makeClosure(setBoolReturnInt);
+ EXPECT_EQUAL(42, closure->call(&is_called));
+ EXPECT_TRUE(is_called);
+}
+
+void Test::testClosure1_1() {
+ int i = 0;
+ unique_ptr<Closure1<int> > void_closure = makeClosure(setInt, &i);
+ void_closure->call(42);
+ EXPECT_EQUAL(42, i);
+
+ unique_ptr<Closure1<int, int> > closure = makeClosure(setIntReturnInt, &i);
+ EXPECT_EQUAL(23, closure->call(23));
+ EXPECT_EQUAL(23, i);
+}
+
+void Test::testClosure1_2() {
+ int i = 0;
+ unique_ptr<Closure1<int> > void_closure = makeClosure(setIntSum, &i, 42);
+ void_closure->call(8);
+ EXPECT_EQUAL(50, i);
+
+ unique_ptr<Closure1<int, int> > closure =
+ makeClosure(setIntSumReturnInt, &i, 23);
+ EXPECT_EQUAL(42, closure->call(19));
+ EXPECT_EQUAL(42, i);
+}
+
+
+struct MyObj {
+ bool is_called;
+ MyObj() : is_called(false) {}
+
+ void setCalled() { is_called = true; }
+ void setBool(bool *p) { *p = true; }
+ void setInt(int *p, int i) { *p = i; }
+ void setInt3Arg(int *p, int i, string) { *p = i; }
+
+ string message() { return "Hello world"; }
+ int twice(int i) { return 2 * i; }
+ double multiply(double x, double y) { return x * y; }
+ int sum(int a, int b, int c) { return a + b + c; }
+};
+
+void Test::testMemberClosure0_0() {
+ MyObj obj;
+ unique_ptr<Closure0<string> > closure = makeClosure(&obj, &MyObj::message);
+ EXPECT_EQUAL("Hello world", closure->call());
+
+ unique_ptr<Closure> void_closure = makeClosure(&obj, &MyObj::setCalled);
+ void_closure->call();
+ EXPECT_TRUE(obj.is_called);
+
+ shared_ptr<MyObj> obj_sp(new MyObj);
+ void_closure = makeClosure(obj_sp, &MyObj::setCalled);
+ void_closure->call();
+ EXPECT_TRUE(obj_sp->is_called);
+}
+
+void Test::testMemberClosure0_1() {
+ MyObj obj;
+ unique_ptr<Closure0<int> > closure = makeClosure(&obj, &MyObj::twice, 21);
+ EXPECT_EQUAL(42, closure->call());
+
+ bool is_called = false;
+ unique_ptr<Closure> void_closure =
+ makeClosure(&obj, &MyObj::setBool, &is_called);
+ void_closure->call();
+ EXPECT_TRUE(is_called);
+
+ is_called = false;
+ shared_ptr<MyObj> obj_sp(new MyObj);
+ void_closure = makeClosure(obj_sp, &MyObj::setBool, &is_called);
+ void_closure->call();
+ EXPECT_TRUE(is_called);
+}
+
+void Test::testMemberClosure0_2() {
+ MyObj obj;
+ unique_ptr<Closure0<double> > closure =
+ makeClosure(&obj, &MyObj::multiply, 1.5, 2.5);
+ EXPECT_APPROX(3.75, closure->call(), 0.001);
+
+ int i = 0;
+ unique_ptr<Closure> void_closure = makeClosure(&obj, &MyObj::setInt, &i, 42);
+ void_closure->call();
+ EXPECT_EQUAL(42, i);
+
+ shared_ptr<MyObj> obj_sp(new MyObj);
+ void_closure = makeClosure(obj_sp, &MyObj::setInt, &i, 21);
+ void_closure->call();
+ EXPECT_EQUAL(21, i);
+}
+
+
+void Test::testMemberClosure1_0() {
+ MyObj obj;
+ unique_ptr<Closure1<int, int> > closure = makeClosure(&obj, &MyObj::twice);
+ EXPECT_EQUAL(8, closure->call(4));
+
+ bool is_called = false;
+ unique_ptr<Closure1<bool *, void> > void_closure =
+ makeClosure(&obj, &MyObj::setBool);
+ void_closure->call(&is_called);
+ EXPECT_TRUE(is_called);
+
+ is_called = false;
+ shared_ptr<MyObj> obj_sp(new MyObj);
+ void_closure = makeClosure(obj_sp, &MyObj::setBool);
+ void_closure->call(&is_called);
+ EXPECT_TRUE(is_called);
+}
+
+void Test::testMemberClosure1_1() {
+ MyObj obj;
+ unique_ptr<Closure1<double, double> > closure =
+ makeClosure(&obj, &MyObj::multiply, 1.5);
+ EXPECT_APPROX(3.15, closure->call(2.1), 0.001);
+
+ int i = 0;
+ unique_ptr<Closure1<int, void> > void_closure =
+ makeClosure(&obj, &MyObj::setInt, &i);
+ void_closure->call(42);
+ EXPECT_EQUAL(42, i);
+
+ shared_ptr<MyObj> obj_sp(new MyObj);
+ void_closure = makeClosure(obj_sp, &MyObj::setInt, &i);
+ void_closure->call(21);
+ EXPECT_EQUAL(21, i);
+}
+
+void Test::testMemberClosure1_2() {
+ MyObj obj;
+ unique_ptr<Closure1<int, int> > closure =
+ makeClosure(&obj, &MyObj::sum, 1, 2);
+ EXPECT_EQUAL(6, closure->call(3));
+
+ int i = 0;
+ unique_ptr<Closure1<string, void> > void_closure =
+ makeClosure(&obj, &MyObj::setInt3Arg, &i, 23);
+ void_closure->call("hello");
+ EXPECT_EQUAL(23, i);
+
+ unique_ptr<MyObj> obj_sp(new MyObj);
+ void_closure = makeClosure(std::move(obj_sp), &MyObj::setInt3Arg, &i, 42);
+ void_closure->call("world");
+ EXPECT_EQUAL(42, i);
+}
+
+} // namespace
+
+TEST_APPHOOK(Test);
diff --git a/vespalib/src/tests/component/.gitignore b/vespalib/src/tests/component/.gitignore
new file mode 100644
index 00000000000..2cc2b6d4073
--- /dev/null
+++ b/vespalib/src/tests/component/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+component_test
+vespalib_component_test_app
diff --git a/vespalib/src/tests/component/CMakeLists.txt b/vespalib/src/tests/component/CMakeLists.txt
new file mode 100644
index 00000000000..0f30f398db2
--- /dev/null
+++ b/vespalib/src/tests/component/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_component_test_app
+ SOURCES
+ component.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_component_test_app COMMAND vespalib_component_test_app)
diff --git a/vespalib/src/tests/component/DESC b/vespalib/src/tests/component/DESC
new file mode 100644
index 00000000000..176a43ab3bf
--- /dev/null
+++ b/vespalib/src/tests/component/DESC
@@ -0,0 +1 @@
+component test. Take a look at component.cpp for details.
diff --git a/vespalib/src/tests/component/FILES b/vespalib/src/tests/component/FILES
new file mode 100644
index 00000000000..bf84bdd6d20
--- /dev/null
+++ b/vespalib/src/tests/component/FILES
@@ -0,0 +1 @@
+component.cpp
diff --git a/vespalib/src/tests/component/component.cpp b/vespalib/src/tests/component/component.cpp
new file mode 100644
index 00000000000..ee21f816588
--- /dev/null
+++ b/vespalib/src/tests/component/component.cpp
@@ -0,0 +1,204 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("component_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/exceptions.h>
+
+#include <vespa/vespalib/component/version.h>
+#include <vespa/vespalib/component/versionspecification.h>
+
+using namespace vespalib;
+
+void
+EXPECT_LT(const VersionSpecification::string &lhs,
+ const VersionSpecification::string &rhs)
+{
+ EXPECT_TRUE(VersionSpecification(lhs) < VersionSpecification(rhs));
+ EXPECT_FALSE(VersionSpecification(lhs) == VersionSpecification(rhs));
+ EXPECT_FALSE(VersionSpecification(rhs) < VersionSpecification(lhs));
+}
+
+void
+EXPECT_EQ(const VersionSpecification::string &lhs,
+ const VersionSpecification::string &rhs)
+{
+ EXPECT_FALSE(VersionSpecification(lhs) < VersionSpecification(rhs));
+ EXPECT_TRUE(VersionSpecification(lhs) == VersionSpecification(rhs));
+ EXPECT_FALSE(VersionSpecification(rhs) < VersionSpecification(lhs));
+}
+
+void
+EXPECT_NE(const VersionSpecification::string &lhs,
+ const VersionSpecification::string &rhs)
+{
+ EXPECT_TRUE(VersionSpecification(lhs) < VersionSpecification(rhs) ||
+ VersionSpecification(rhs) < VersionSpecification(lhs));
+ EXPECT_FALSE(VersionSpecification(lhs) == VersionSpecification(rhs));
+}
+
+void
+EXPECT_GT(const VersionSpecification::string &lhs,
+ const VersionSpecification::string &rhs)
+{
+ EXPECT_FALSE(VersionSpecification(lhs) < VersionSpecification(rhs));
+ EXPECT_FALSE(VersionSpecification(lhs) == VersionSpecification(rhs));
+ EXPECT_TRUE(VersionSpecification(rhs) < VersionSpecification(lhs));
+}
+
+TEST("requireThatCompareToIsSymmetric")
+{
+ EXPECT_LT("1", "2");
+ EXPECT_EQ("2", "2");
+ EXPECT_GT("2", "1");
+
+ EXPECT_LT("1.2", "3.4");
+ EXPECT_EQ("3.4", "3.4");
+ EXPECT_GT("3.4", "1.2");
+
+ EXPECT_LT("1.2.3", "4.5.6");
+ EXPECT_EQ("4.5.6", "4.5.6");
+ EXPECT_GT("4.5.6", "1.2.3");
+
+ EXPECT_LT("1.2.3.4", "5.6.7.8");
+ EXPECT_EQ("5.6.7.8", "5.6.7.8");
+ EXPECT_GT("5.6.7.8", "1.2.3.4");
+}
+
+TEST("requireThatCompareToIsTransitive")
+{
+ EXPECT_LT("1", "2");
+ EXPECT_LT("2", "3");
+ EXPECT_LT("1", "3");
+
+ EXPECT_LT("1.1", "1.2");
+ EXPECT_LT("1.2", "1.3");
+ EXPECT_LT("1.1", "1.3");
+
+ EXPECT_LT("1.1.1", "1.1.2");
+ EXPECT_LT("1.1.2", "1.1.3");
+ EXPECT_LT("1.1.1", "1.1.3");
+
+ EXPECT_LT("1.1.1.1", "1.1.1.2");
+ EXPECT_LT("1.1.1.2", "1.1.1.3");
+ EXPECT_LT("1.1.1.1", "1.1.1.3");
+}
+
+TEST("requireThatUnspecifiedComponentDoesNotMatchSpecified")
+{
+ EXPECT_EQ("1", "1");
+ EXPECT_NE("1", "1.2");
+ EXPECT_NE("1", "1.2.3");
+ EXPECT_NE("1", "1.2.3.4");
+
+ EXPECT_NE("1.2", "1");
+ EXPECT_EQ("1.2", "1.2");
+ EXPECT_NE("1.2", "1.2.3");
+ EXPECT_NE("1.2", "1.2.3.4");
+
+ EXPECT_NE("1.2.3", "1");
+ EXPECT_NE("1.2.3", "1.2");
+ EXPECT_EQ("1.2.3", "1.2.3");
+ EXPECT_NE("1.2.3", "1.2.3.4");
+
+ EXPECT_NE("1.2.3.4", "1");
+ EXPECT_NE("1.2.3.4", "1.2");
+ EXPECT_NE("1.2.3.4", "1.2.3");
+ EXPECT_EQ("1.2.3.4", "1.2.3.4");
+}
+
+TEST("testText")
+{
+ VersionSpecification v("0.1.2.3");
+ EXPECT_EQUAL(0, v.getMajor());
+ EXPECT_EQUAL(1, v.getMinor());
+ EXPECT_EQUAL(2, v.getMicro());
+ EXPECT_EQUAL("3", v.getQualifier());
+ v = VersionSpecification("1.2.3.4");
+ EXPECT_EQUAL(1, v.getMajor());
+ EXPECT_EQUAL(2, v.getMinor());
+ EXPECT_EQUAL(3, v.getMicro());
+ EXPECT_EQUAL("4", v.getQualifier());
+ v = VersionSpecification("1");
+ EXPECT_EQUAL(1, v.getMajor());
+ EXPECT_EQUAL(0, v.getMinor());
+ EXPECT_EQUAL(0, v.getMicro());
+ EXPECT_EQUAL("", v.getQualifier());
+ EXPECT_EXCEPTION(v = VersionSpecification("-1"), IllegalArgumentException, "integer must start with a digit");
+ EXPECT_EXCEPTION(v = VersionSpecification("1.-1"), IllegalArgumentException, "integer must start with a digit");
+ EXPECT_EXCEPTION(v = VersionSpecification("1.2.-1"), IllegalArgumentException, "integer must start with a digit");
+ EXPECT_EXCEPTION(v = VersionSpecification("1.2.3.-1"), IllegalArgumentException, "Invalid character in qualifier");
+}
+
+TEST("testText2")
+{
+ Version v("0.1.2.3");
+ EXPECT_EQUAL(0, v.getMajor());
+ EXPECT_EQUAL(1, v.getMinor());
+ EXPECT_EQUAL(2, v.getMicro());
+ EXPECT_EQUAL("3", v.getQualifier());
+ v = Version("1.2.3.4");
+ EXPECT_EQUAL(1, v.getMajor());
+ EXPECT_EQUAL(2, v.getMinor());
+ EXPECT_EQUAL(3, v.getMicro());
+ EXPECT_EQUAL("4", v.getQualifier());
+ v = Version("1");
+ EXPECT_EQUAL(1, v.getMajor());
+ EXPECT_EQUAL(0, v.getMinor());
+ EXPECT_EQUAL(0, v.getMicro());
+ EXPECT_EQUAL("", v.getQualifier());
+ EXPECT_EXCEPTION(v = Version("-1"), IllegalArgumentException, "integer must start with a digit");
+ EXPECT_EXCEPTION(v = Version("1.-1"), IllegalArgumentException, "integer must start with a digit");
+ EXPECT_EXCEPTION(v = Version("1.2.-1"), IllegalArgumentException, "integer must start with a digit");
+ EXPECT_EXCEPTION(v = Version("1.2.3.-1"), IllegalArgumentException, "Invalid character in qualifier");
+}
+
+TEST("testEmpty")
+{
+ Version ev;
+ VersionSpecification evs;
+
+ EXPECT_EQUAL("", ev.toString());
+ EXPECT_EQUAL("*.*.*", evs.toString());
+
+ EXPECT_TRUE(ev == Version(0,0,0,""));
+
+ EXPECT_TRUE(evs.matches(ev));
+ EXPECT_TRUE(evs.matches(Version(1,2,3)));
+ EXPECT_TRUE(!evs.matches(Version(1,2,3,"foo")));
+}
+
+TEST("testSimple")
+{
+ // test Version:
+
+ Version v(1, 2, 3, "qualifier");
+ EXPECT_EQUAL(1, v.getMajor());
+ EXPECT_EQUAL(2, v.getMinor());
+ EXPECT_EQUAL(3, v.getMicro());
+ EXPECT_EQUAL("qualifier", v.getQualifier());
+
+ EXPECT_EQUAL("1.2.3.qualifier", v.toString());
+
+ // test VersionSpecification:
+
+ VersionSpecification vs(1, 2, 3, "qualifier");
+ EXPECT_EQUAL(1, vs.getMajor());
+ EXPECT_EQUAL(2, vs.getMinor());
+ EXPECT_EQUAL(3, vs.getMicro());
+ EXPECT_EQUAL("qualifier", vs.getQualifier());
+
+ EXPECT_EQUAL(1, vs.getSpecifiedMajor());
+ EXPECT_EQUAL(2, vs.getSpecifiedMinor());
+ EXPECT_EQUAL(3, vs.getSpecifiedMicro());
+
+ EXPECT_EQUAL("1.2.3.qualifier", vs.toString());
+
+ // test cross-class function
+ EXPECT_TRUE(vs.matches(v));
+}
+
+TEST_MAIN()
+{
+ TEST_RUN_ALL();
+}
diff --git a/vespalib/src/tests/compress/.gitignore b/vespalib/src/tests/compress/.gitignore
new file mode 100644
index 00000000000..439cf005e2f
--- /dev/null
+++ b/vespalib/src/tests/compress/.gitignore
@@ -0,0 +1 @@
+vespalib_compress_test_app
diff --git a/vespalib/src/tests/compress/CMakeLists.txt b/vespalib/src/tests/compress/CMakeLists.txt
new file mode 100644
index 00000000000..eb6c403f1d9
--- /dev/null
+++ b/vespalib/src/tests/compress/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_compress_test_app
+ SOURCES
+ compress_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_compress_test_app COMMAND vespalib_compress_test_app)
diff --git a/vespalib/src/tests/compress/DESC b/vespalib/src/tests/compress/DESC
new file mode 100644
index 00000000000..f7e01ae9c4a
--- /dev/null
+++ b/vespalib/src/tests/compress/DESC
@@ -0,0 +1 @@
+commpress test. Take a look at commpress.cpp for details.
diff --git a/vespalib/src/tests/compress/FILES b/vespalib/src/tests/compress/FILES
new file mode 100644
index 00000000000..be7a6df2fee
--- /dev/null
+++ b/vespalib/src/tests/compress/FILES
@@ -0,0 +1 @@
+compress_test.cpp
diff --git a/vespalib/src/tests/compress/compress_test.cpp b/vespalib/src/tests/compress/compress_test.cpp
new file mode 100644
index 00000000000..7cc458e2290
--- /dev/null
+++ b/vespalib/src/tests/compress/compress_test.cpp
@@ -0,0 +1,141 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("compress_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/compress.h>
+#include <vespa/vespalib/util/exceptions.h>
+
+using namespace vespalib;
+using compress::Integer;
+
+class CompressTest : public TestApp
+{
+private:
+ void verifyPositiveNumber(uint64_t n, const uint8_t * expected, size_t sz);
+ void verifyNumber(int64_t n, const uint8_t * expected, size_t sz);
+ void requireThatPositiveNumberCompressCorrectly();
+ void requireThatNumberCompressCorrectly();
+public:
+ int Main();
+};
+
+void
+CompressTest::verifyPositiveNumber(uint64_t n, const uint8_t * expected, size_t sz) {
+ uint8_t buf[8];
+ EXPECT_EQUAL(sz, Integer::compressPositive(n, buf));
+ EXPECT_EQUAL(sz, Integer::compressedPositiveLength(n));
+ for (size_t i(0); i < sz; i++) {
+ EXPECT_EQUAL(expected[i], buf[i]);
+ }
+ uint64_t v(0);
+ EXPECT_EQUAL(sz, Integer::decompressPositive(v, expected));
+ EXPECT_EQUAL(n, v);
+}
+
+void
+CompressTest::verifyNumber(int64_t n, const uint8_t * expected, size_t sz) {
+ uint8_t buf[8];
+ EXPECT_EQUAL(sz, Integer::compress(n, buf));
+ EXPECT_EQUAL(sz, Integer::compressedLength(n));
+ for (size_t i(0); i < sz; i++) {
+ EXPECT_EQUAL(expected[i], buf[i]);
+ }
+ int64_t v(0);
+ EXPECT_EQUAL(sz, Integer::decompress(v, expected));
+ EXPECT_EQUAL(n, v);
+}
+
+#define VERIFY_POSITIVE(n, p) verifyPositiveNumber(n, p, sizeof(p))
+void
+CompressTest::requireThatPositiveNumberCompressCorrectly()
+{
+ const uint8_t zero[1] = {0};
+ VERIFY_POSITIVE(0, zero);
+ const uint8_t one[1] = {0x01};
+ VERIFY_POSITIVE(1, one);
+ const uint8_t x3f[1] = {0x3f};
+ VERIFY_POSITIVE(0x3f, x3f);
+ const uint8_t x40[2] = {0x80,0x40};
+ VERIFY_POSITIVE(0x40, x40);
+ const uint8_t x3fff[2] = {0xbf, 0xff};
+ VERIFY_POSITIVE(0x3fff, x3fff);
+ const uint8_t x4000[4] = {0xc0, 0x00, 0x40, 0x00};
+ VERIFY_POSITIVE(0x4000, x4000);
+ const uint8_t x3fffffff[4] = {0xff, 0xff, 0xff, 0xff};
+ VERIFY_POSITIVE(0x3fffffff, x3fffffff);
+ const uint8_t x40000000[4] = {0,0,0,0};
+ try {
+ VERIFY_POSITIVE(0x40000000, x40000000);
+ EXPECT_TRUE(false);
+ } catch (const IllegalArgumentException & e) {
+ EXPECT_EQUAL("Number '1073741824' too big, must extend encoding", e.getMessage());
+ }
+ try {
+ VERIFY_POSITIVE(-1, x40000000);
+ EXPECT_TRUE(false);
+ } catch (const IllegalArgumentException & e) {
+ EXPECT_EQUAL("Number '18446744073709551615' too big, must extend encoding", e.getMessage());
+ }
+}
+
+#define VERIFY_NUMBER(n, p) verifyNumber(n, p, sizeof(p))
+void
+CompressTest::requireThatNumberCompressCorrectly()
+{
+ const uint8_t zero[1] = {0};
+ VERIFY_NUMBER(0, zero);
+ const uint8_t one[1] = {0x01};
+ VERIFY_NUMBER(1, one);
+ const uint8_t x1f[1] = {0x1f};
+ VERIFY_NUMBER(0x1f, x1f);
+ const uint8_t x20[2] = {0x40,0x20};
+ VERIFY_NUMBER(0x20, x20);
+ const uint8_t x1fff[2] = {0x5f, 0xff};
+ VERIFY_NUMBER(0x1fff, x1fff);
+ const uint8_t x2000[4] = {0x60, 0x00, 0x20, 0x00};
+ VERIFY_NUMBER(0x2000, x2000);
+ const uint8_t x1fffffff[4] = {0x7f, 0xff, 0xff, 0xff};
+ VERIFY_NUMBER(0x1fffffff, x1fffffff);
+ const uint8_t x20000000[4] = {0,0,0,0};
+ try {
+ VERIFY_NUMBER(0x20000000, x20000000);
+ EXPECT_TRUE(false);
+ } catch (const IllegalArgumentException & e) {
+ EXPECT_EQUAL("Number '536870912' too big, must extend encoding", e.getMessage());
+ }
+ const uint8_t mzero[1] = {0x81};
+ VERIFY_NUMBER(-1, mzero);
+ const uint8_t mone[1] = {0x82};
+ VERIFY_NUMBER(-2, mone);
+ const uint8_t mx1f[1] = {0x9f};
+ VERIFY_NUMBER(-0x1f, mx1f);
+ const uint8_t mx20[2] = {0xc0,0x20};
+ VERIFY_NUMBER(-0x20, mx20);
+ const uint8_t mx1fff[2] = {0xdf, 0xff};
+ VERIFY_NUMBER(-0x1fff, mx1fff);
+ const uint8_t mx2000[4] = {0xe0, 0x00, 0x20, 0x00};
+ VERIFY_NUMBER(-0x2000, mx2000);
+ const uint8_t mx1fffffff[4] = {0xff, 0xff, 0xff, 0xff};
+ VERIFY_NUMBER(-0x1fffffff, mx1fffffff);
+ const uint8_t mx20000000[4] = {0,0,0,0};
+ try {
+ VERIFY_NUMBER(-0x20000000, mx20000000);
+ EXPECT_TRUE(false);
+ } catch (const IllegalArgumentException & e) {
+ EXPECT_EQUAL("Number '-536870912' too big, must extend encoding", e.getMessage());
+ }
+}
+
+int
+CompressTest::Main()
+{
+ TEST_INIT("compress_test");
+
+ requireThatPositiveNumberCompressCorrectly();
+ requireThatNumberCompressCorrectly();
+
+ TEST_DONE();
+}
+
+TEST_APPHOOK(CompressTest)
diff --git a/vespalib/src/tests/create-test.sh b/vespalib/src/tests/create-test.sh
new file mode 100755
index 00000000000..ef8ee35c72c
--- /dev/null
+++ b/vespalib/src/tests/create-test.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+gen_project_file() {
+ echo "generating '$1' ..."
+ echo "APPLICATION ${test}_test" > $1
+ echo "OBJS ${test}_test" >> $1
+ echo "LIBS vespa/vespalib/vespalib" >> $1
+ echo "EXTERNALLIBS vespalog" >> $1
+ echo "" >> $1
+ echo "CUSTOMMAKE" >> $1
+ echo "test: all" >> $1
+ echo -e "\t\$(HIDE) \$(LDL) \$(VALGRIND) ./${test}_test" >> $1
+}
+
+gen_source() {
+ echo "generating '$1' ..."
+ echo "#include <vespa/vespalib/testkit/test_kit.h>" > $1
+ echo "" >> $1
+ echo "using namespace vespalib;" >> $1
+ echo "" >> $1
+ echo "TEST(\"require something\") {" >> $1
+ echo " EXPECT_TRUE(true);" >> $1
+ echo "}" >> $1
+ echo "" >> $1
+ echo "TEST_MAIN() { TEST_RUN_ALL(); }" >> $1
+}
+
+gen_file_list() {
+ echo "generating '$1' ..."
+ echo "${test}_test.cpp" > $1
+}
+
+if [ $# -ne 1 ]; then
+ echo "usage: $0 <name>"
+ echo " name: name of the test to create"
+ exit 1
+fi
+
+test=$1
+if [ -e $test ]; then
+ echo "$test already present, don't want to mess it up..."
+ exit 1
+fi
+
+echo "creating directory '$test' ..."
+mkdir -p $test || exit 1
+cd $test || exit 1
+test=`basename $test`
+
+gen_project_file fastos.project
+gen_source ${test}_test.cpp
+gen_file_list FILES
diff --git a/vespalib/src/tests/delegatelist/.cvsignore b/vespalib/src/tests/delegatelist/.cvsignore
new file mode 100644
index 00000000000..0e8f4d0be0b
--- /dev/null
+++ b/vespalib/src/tests/delegatelist/.cvsignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+delegatelist_test
diff --git a/vespalib/src/tests/delegatelist/.gitignore b/vespalib/src/tests/delegatelist/.gitignore
new file mode 100644
index 00000000000..42ac4beb0c3
--- /dev/null
+++ b/vespalib/src/tests/delegatelist/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+delegatelist_test
+vespalib_delegatelist_test_app
diff --git a/vespalib/src/tests/delegatelist/CMakeLists.txt b/vespalib/src/tests/delegatelist/CMakeLists.txt
new file mode 100644
index 00000000000..ad7d22a2ceb
--- /dev/null
+++ b/vespalib/src/tests/delegatelist/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_delegatelist_test_app
+ SOURCES
+ delegatelist.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_delegatelist_test_app COMMAND vespalib_delegatelist_test_app)
diff --git a/vespalib/src/tests/delegatelist/DESC b/vespalib/src/tests/delegatelist/DESC
new file mode 100644
index 00000000000..35975cc86f1
--- /dev/null
+++ b/vespalib/src/tests/delegatelist/DESC
@@ -0,0 +1 @@
+delegatelist test. Take a look at delegatelist.cpp for details.
diff --git a/vespalib/src/tests/delegatelist/FILES b/vespalib/src/tests/delegatelist/FILES
new file mode 100644
index 00000000000..7f599b34af8
--- /dev/null
+++ b/vespalib/src/tests/delegatelist/FILES
@@ -0,0 +1 @@
+delegatelist.cpp
diff --git a/vespalib/src/tests/delegatelist/delegatelist.cpp b/vespalib/src/tests/delegatelist/delegatelist.cpp
new file mode 100644
index 00000000000..2efb08e22df
--- /dev/null
+++ b/vespalib/src/tests/delegatelist/delegatelist.cpp
@@ -0,0 +1,822 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("delegatelist_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/delegatelist.hpp>
+#include <vespa/vespalib/util/guard.h>
+
+#include <memory>
+#include <algorithm>
+#include <vector>
+#include <queue>
+
+using namespace vespalib;
+
+//-----------------------------------------------------------------------------
+
+class Test : public TestApp
+{
+public:
+ void testEmpty();
+ void testAdd();
+ void testRemove();
+ void testOneShot();
+ void testMultiSnapshot();
+ void testActors();
+ void testWaitSnapshots();
+ void stressTest();
+ int Main();
+};
+
+//-----------------------------------------------------------------------------
+
+namespace {
+
+class Handler
+{
+private:
+ int _num;
+public:
+ Handler() : _num(0) {}
+ void add() { _num++; }
+ int getNum() { return _num; }
+};
+
+typedef DelegateList<Handler> DL;
+
+void multicast(DL &dl) {
+ for (DL::Snapshot snap(dl) ; snap.valid(); snap.next()) {
+ snap.get()->add();
+ }
+}
+
+void multicast_clear(DL &dl) {
+ DL::Snapshot snap(dl);
+ dl.clear();
+ for (; snap.valid(); snap.next()) {
+ snap.get()->add();
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+enum {
+ CMD_MULTICAST,
+ CMD_MULTICAST_CLEAR,
+ CMD_ADD,
+ CMD_REMOVE,
+ CMD_CLEAR,
+ CMD_WAIT_SNAP,
+ CMD_DO,
+ CMD_DONE,
+ CMD_EXIT
+};
+
+struct Command
+{
+ DL *dl;
+ int cmd;
+ int cnt;
+ Handler *handler;
+ Command(DL *dl_, int cmd_, int cnt_, Handler *handler_)
+ : dl(dl_), cmd(cmd_), cnt(cnt_), handler(handler_) {}
+ Command(const Command &rhs)
+ : dl(rhs.dl), cmd(rhs.cmd), cnt(rhs.cnt), handler(rhs.handler) {}
+ Command &operator=(const Command &rhs) {
+ memcpy(this, &rhs, sizeof(Command));
+ return *this;
+ }
+ bool operator==(const Command &rhs) {
+ return memcmp(this, &rhs, sizeof(Command)) == 0;
+ }
+};
+
+Command
+cmd_multicast(DL *dl) {
+ return Command(dl, CMD_MULTICAST, 0, 0);
+}
+
+Command
+cmd_multicast_clear(DL *dl) {
+ return Command(dl, CMD_MULTICAST_CLEAR, 0, 0);
+}
+
+Command
+cmd_add(DL *dl, Handler *handler) {
+ return Command(dl, CMD_ADD, 0, handler);
+}
+
+Command
+cmd_remove(DL *dl, Handler *handler) {
+ return Command(dl, CMD_REMOVE, 0, handler);
+}
+
+Command
+cmd_clear(DL *dl) {
+ return Command(dl, CMD_CLEAR, 0, 0);
+}
+
+Command
+cmd_wait_snap(DL *dl) {
+ return Command(dl, CMD_WAIT_SNAP, 0, 0);
+}
+
+Command
+cmd_do(int cnt) {
+ return Command(0, CMD_DO, cnt, 0);
+}
+
+Command
+cmd_done() {
+ return Command(0, CMD_DONE, 0, 0);
+}
+
+Command
+cmd_exit() {
+ return Command(0, CMD_EXIT, 0, 0);
+}
+
+typedef std::vector<Command> CmdList;
+typedef std::pair<Command, int> HistEntry;
+typedef std::vector<HistEntry> HistList;
+
+//-----------------------------------------------------------------------------
+
+struct History {
+ Lock lock;
+ HistList list;
+ History() : lock(), list() {}
+ void add(const HistEntry &entry) {
+ LockGuard guard(lock);
+ list.push_back(entry);
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+class Queue {
+private:
+ std::queue<T> _q;
+ Monitor _cond;
+ int _waitCnt;
+ Queue(const Queue &);
+ Queue &operator=(const Queue &);
+public:
+ Queue() : _q(), _cond(), _waitCnt(0) {}
+ void enqueue(const T &entry) {
+ MonitorGuard guard(_cond);
+ _q.push(entry);
+ if (_waitCnt > 0) {
+ guard.signal();
+ }
+ }
+ T dequeue() {
+ MonitorGuard guard(_cond);
+ CounterGuard cntGuard(_waitCnt);
+ while (_q.empty()) {
+ guard.wait();
+ }
+ T tmp = _q.front();
+ _q.pop();
+ return tmp;
+ }
+ size_t size() const { return _q.size(); }
+};
+
+typedef Queue<CmdList> CmdListQueue;
+
+//-----------------------------------------------------------------------------
+
+class Actor : public FastOS_Runnable
+{
+public:
+ enum {
+ STATE_INIT,
+ STATE_IDLE,
+ STATE_BUSY,
+ STATE_DONE
+ };
+private:
+ int _id;
+ History *_hist;
+ CmdListQueue _queue;
+ Monitor _cond;
+ int _state;
+ int _waitCnt;
+ int _opCnt;
+ bool _exit;
+ Actor(const Actor &);
+ Actor &operator=(const Actor &);
+ void setState(int state, MonitorGuard &guard);
+ void doneOp(const Command &cmd);
+ int perform(int cnt, int start, const CmdList &cmdList);
+public:
+ Actor(int id, History *hist)
+ : _id(id), _hist(hist), _queue(), _cond(), _state(STATE_INIT),
+ _waitCnt(0), _opCnt(0), _exit(false) {}
+ int getOpCnt() const { return _opCnt; }
+ int getState() const { return _state; }
+ void doIt(const CmdList &cmdList);
+ void doIt(const Command &cmd);
+ void waitState(int state);
+ void Run(FastOS_ThreadInterface *, void *);
+};
+
+
+void
+Actor::setState(int state, MonitorGuard &guard) {
+ _state = state;
+ if (_waitCnt > 0) {
+ guard.broadcast();
+ }
+}
+
+
+void
+Actor::doneOp(const Command &cmd)
+{
+ ++_opCnt;
+ if (_hist != 0) {
+ _hist->add(HistEntry(cmd, _id));
+ }
+}
+
+
+int
+Actor::perform(int cnt, int start, const CmdList &cmdList)
+{
+ int doneIdx = cmdList.size();
+ for (int i = 0; i < cnt; ++i) {
+ for (uint32_t idx = start; idx < cmdList.size(); ++idx) {
+ Command cmd = cmdList[idx];
+ switch (cmd.cmd) {
+ case CMD_MULTICAST:
+ multicast(*cmd.dl);
+ doneOp(cmd);
+ break;
+ case CMD_MULTICAST_CLEAR:
+ multicast_clear(*cmd.dl);
+ doneOp(cmd);
+ break;
+ case CMD_ADD:
+ cmd.dl->add(cmd.handler);
+ doneOp(cmd);
+ break;
+ case CMD_REMOVE:
+ cmd.dl->remove(cmd.handler);
+ doneOp(cmd);
+ break;
+ case CMD_CLEAR:
+ cmd.dl->clear();
+ doneOp(cmd);
+ break;
+ case CMD_WAIT_SNAP:
+ cmd.dl->waitSnapshots();
+ doneOp(cmd);
+ break;
+ case CMD_DO:
+ idx = perform(cmd.cnt, idx + 1, cmdList);
+ break;
+ case CMD_DONE:
+ doneIdx = idx;
+ idx = cmdList.size();
+ break;
+ case CMD_EXIT:
+ _exit = true;
+ return cmdList.size();
+ break;
+ default:
+ abort(); // that does not seem to work
+ }
+ }
+ }
+ return doneIdx;
+}
+
+
+void
+Actor::doIt(const CmdList &cmdList)
+{
+ MonitorGuard guard(_cond);
+ setState(STATE_BUSY, guard);
+ _queue.enqueue(cmdList);
+}
+
+
+void
+Actor::doIt(const Command &cmd)
+{
+ CmdList cmdList;
+ cmdList.push_back(cmd);
+ doIt(cmdList);
+}
+
+
+void
+Actor::waitState(int state) {
+ MonitorGuard guard(_cond);
+ CounterGuard cntGuard(_waitCnt);
+ while (_state != state) {
+ guard.wait();
+ }
+}
+
+
+void
+Actor::Run(FastOS_ThreadInterface *, void *)
+{
+ while (!_exit) {
+ {
+ MonitorGuard guard(_cond);
+ if (_queue.size() == 0) {
+ setState(STATE_IDLE, guard);
+ }
+ }
+ CmdList cmdList = _queue.dequeue();
+ perform(1, 0, cmdList);
+ }
+ {
+ MonitorGuard guard(_cond);
+ setState(STATE_DONE, guard);
+ }
+}
+
+} // namespace <unnamed>
+
+//-----------------------------------------------------------------------------
+
+void
+Test::testEmpty()
+{
+ DL multicaster;
+ multicast(multicaster);
+ multicast_clear(multicaster);
+ DL::Snapshot empty_snap(multicaster);
+ EXPECT_TRUE(!empty_snap.valid());
+}
+
+
+void
+Test::testAdd()
+{
+ DL multicaster;
+ Handler h1;
+ Handler h2;
+ Handler h3;
+ Handler h4;
+ Handler h5;
+
+ // ensure correct initial state
+ EXPECT_TRUE(h1.getNum() == 0);
+ EXPECT_TRUE(h2.getNum() == 0);
+ EXPECT_TRUE(h3.getNum() == 0);
+ EXPECT_TRUE(h4.getNum() == 0);
+ EXPECT_TRUE(h5.getNum() == 0);
+
+ // test basic adding
+ multicaster.add(&h1);
+ multicast(multicaster);
+ multicaster.add(&h2);
+ multicast(multicaster);
+ multicaster.add(&h3);
+ multicast(multicaster);
+ multicaster.add(&h4);
+ multicast(multicaster);
+ multicaster.add(&h5);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 5);
+ EXPECT_TRUE(h2.getNum() == 4);
+ EXPECT_TRUE(h3.getNum() == 3);
+ EXPECT_TRUE(h4.getNum() == 2);
+ EXPECT_TRUE(h5.getNum() == 1);
+
+ // duplicate adds
+ multicaster.add(&h1);
+ multicaster.add(&h1);
+ multicaster.add(&h1);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 6);
+ EXPECT_TRUE(h2.getNum() == 5);
+ EXPECT_TRUE(h3.getNum() == 4);
+ EXPECT_TRUE(h4.getNum() == 3);
+ EXPECT_TRUE(h5.getNum() == 2);
+}
+
+
+void
+Test::testRemove()
+{
+ DL multicaster;
+ Handler h1;
+ Handler h2;
+ Handler h3;
+ Handler h4;
+ Handler h5;
+
+ multicaster.add(&h1).add(&h2).add(&h3).add(&h4).add(&h5);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 1);
+ EXPECT_TRUE(h2.getNum() == 1);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 1);
+ EXPECT_TRUE(h5.getNum() == 1);
+
+ // remove middle
+ multicaster.remove(&h3);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 2);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 2);
+ EXPECT_TRUE(h5.getNum() == 2);
+
+ // remove head
+ multicaster.remove(&h1);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 3);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 3);
+ EXPECT_TRUE(h5.getNum() == 3);
+
+ // remove tail
+ multicaster.remove(&h5);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 4);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 4);
+ EXPECT_TRUE(h5.getNum() == 3);
+
+ // duplicate removes
+ multicaster.remove(&h1).remove(&h3).remove(&h5);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 5);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 5);
+ EXPECT_TRUE(h5.getNum() == 3);
+
+ // remove all
+ multicaster.clear();
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 5);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 5);
+ EXPECT_TRUE(h5.getNum() == 3);
+}
+
+
+void
+Test::testOneShot()
+{
+ DL multicaster;
+ Handler h1;
+ Handler h2;
+ Handler h3;
+ Handler h4;
+ Handler h5;
+
+ // oneshot multicast removes handlers
+ multicaster.add(&h1).add(&h2).add(&h3).add(&h4).add(&h5);
+ multicast_clear(multicaster);
+ multicast(multicaster);
+ EXPECT_TRUE(h1.getNum() == 1);
+ EXPECT_TRUE(h2.getNum() == 1);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 1);
+ EXPECT_TRUE(h5.getNum() == 1);
+}
+
+
+void
+Test::testMultiSnapshot()
+{
+ DL multicaster;
+ Handler h1;
+ Handler h2;
+ Handler h3;
+ Handler h4;
+ Handler h5;
+
+ DL::Snapshot empty_snap(multicaster);
+ multicaster.add(&h1).add(&h2).add(&h3).add(&h4).add(&h5);
+ DL::Snapshot snap1(multicaster);
+ multicaster.remove(&h3);
+ DL::Snapshot snap2(multicaster);
+ multicaster.remove(&h1);
+ DL::Snapshot snap3(multicaster);
+ multicaster.remove(&h5);
+ DL::Snapshot snap4(multicaster);
+
+ EXPECT_TRUE(!empty_snap.valid());
+ for (; snap1.valid(); snap1.next()) {
+ snap1.get()->add();
+ }
+ EXPECT_TRUE(h1.getNum() == 1);
+ EXPECT_TRUE(h2.getNum() == 1);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 1);
+ EXPECT_TRUE(h5.getNum() == 1);
+ for (; snap2.valid(); snap2.next()) {
+ snap2.get()->add();
+ }
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 2);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 2);
+ EXPECT_TRUE(h5.getNum() == 2);
+ for (; snap3.valid(); snap3.next()) {
+ snap3.get()->add();
+ }
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 3);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 3);
+ EXPECT_TRUE(h5.getNum() == 3);
+ for (; snap4.valid(); snap4.next()) {
+ snap4.get()->add();
+ }
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 4);
+ EXPECT_TRUE(h3.getNum() == 1);
+ EXPECT_TRUE(h4.getNum() == 4);
+ EXPECT_TRUE(h5.getNum() == 3);
+}
+
+
+void
+Test::testActors()
+{
+ FastOS_ThreadPool pool(65000);
+ History hist;
+ Actor a1(1, &hist);
+ Actor a2(2, &hist);
+ DL dl;
+ Handler h1;
+ Handler h2;
+
+ ASSERT_TRUE(pool.NewThread(&a1, 0) != 0);
+ ASSERT_TRUE(pool.NewThread(&a2, 0) != 0);
+
+ {
+ CmdList prog;
+ prog.push_back(cmd_add(&dl, &h1));
+ prog.push_back(cmd_multicast(&dl));
+ prog.push_back(cmd_add(&dl, &h2));
+ prog.push_back(cmd_multicast(&dl));
+ a1.doIt(prog);
+ a1.waitState(Actor::STATE_IDLE);
+ }
+
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 1);
+
+ {
+ CmdList prog;
+ prog.push_back(cmd_remove(&dl, &h1));
+ prog.push_back(cmd_multicast(&dl));
+ prog.push_back(cmd_clear(&dl));
+ prog.push_back(cmd_multicast(&dl));
+ a2.doIt(prog);
+ a2.waitState(Actor::STATE_IDLE);
+ }
+
+ EXPECT_TRUE(h1.getNum() == 2);
+ EXPECT_TRUE(h2.getNum() == 2);
+
+ {
+ CmdList prog;
+ prog.push_back(cmd_add(&dl, &h1));
+ prog.push_back(cmd_add(&dl, &h2));
+ prog.push_back(cmd_multicast_clear(&dl));
+ prog.push_back(cmd_multicast(&dl));
+ a1.doIt(prog);
+ a1.waitState(Actor::STATE_IDLE);
+ }
+
+ EXPECT_TRUE(h1.getNum() == 3);
+ EXPECT_TRUE(h2.getNum() == 3);
+
+ {
+ CmdList prog;
+ prog.push_back(cmd_add(&dl, &h1));
+ prog.push_back(cmd_add(&dl, &h2));
+ prog.push_back(cmd_do(10));
+ prog.push_back(cmd_do(10));
+ prog.push_back(cmd_multicast(&dl));
+ prog.push_back(cmd_done());
+ prog.push_back(cmd_done());
+ prog.push_back(cmd_exit());
+ a2.doIt(prog);
+ a2.waitState(Actor::STATE_DONE);
+ }
+
+ EXPECT_TRUE(h1.getNum() == 103);
+ EXPECT_TRUE(h2.getNum() == 103);
+
+ EXPECT_TRUE(hist.list.size() == 114);
+
+ EXPECT_TRUE(hist.list[0].first == cmd_add(&dl, &h1));
+ EXPECT_TRUE(hist.list[1].first == cmd_multicast(&dl));
+ EXPECT_TRUE(hist.list[2].first == cmd_add(&dl, &h2));
+ EXPECT_TRUE(hist.list[3].first == cmd_multicast(&dl));
+ for (int i = 0; i < 4; i++) {
+ EXPECT_TRUE(hist.list[i].second == 1);
+ }
+
+ EXPECT_TRUE(hist.list[4].first == cmd_remove(&dl, &h1));
+ EXPECT_TRUE(hist.list[5].first == cmd_multicast(&dl));
+ EXPECT_TRUE(hist.list[6].first == cmd_clear(&dl));
+ EXPECT_TRUE(hist.list[7].first == cmd_multicast(&dl));
+ for (int i = 4; i < 8; i++) {
+ EXPECT_TRUE(hist.list[i].second == 2);
+ }
+
+ EXPECT_TRUE(hist.list[8].first == cmd_add(&dl, &h1));
+ EXPECT_TRUE(hist.list[9].first == cmd_add(&dl, &h2));
+ EXPECT_TRUE(hist.list[10].first == cmd_multicast_clear(&dl));
+ EXPECT_TRUE(hist.list[11].first == cmd_multicast(&dl));
+ for (int i = 8; i < 12; i++) {
+ EXPECT_TRUE(hist.list[i].second == 1);
+ }
+
+ EXPECT_TRUE(hist.list[12].first == cmd_add(&dl, &h1));
+ EXPECT_TRUE(hist.list[13].first == cmd_add(&dl, &h2));
+ EXPECT_TRUE(hist.list[12].second == 2);
+ EXPECT_TRUE(hist.list[13].second == 2);
+
+ for (int i = 14; i < 114; i++) {
+ EXPECT_TRUE(hist.list[i].first == cmd_multicast(&dl));
+ EXPECT_TRUE(hist.list[i].second == 2);
+ }
+
+ a1.doIt(cmd_exit());
+ a1.waitState(Actor::STATE_DONE);
+
+ EXPECT_TRUE(a1.getOpCnt() == 8);
+ EXPECT_TRUE(a2.getOpCnt() == 106);
+}
+
+
+void
+Test::stressTest()
+{
+ FastOS_ThreadPool pool(65000);
+ Actor a1(1, 0);
+ Actor a2(2, 0);
+ Actor a3(3, 0);
+ Actor a4(4, 0);
+ Actor a5(5, 0);
+ Actor a6(6, 0);
+ DL dl;
+ Handler h1;
+ Handler h2;
+ Handler h3;
+ Handler h4;
+ Handler h5;
+ int scale = 10000;
+
+ ASSERT_TRUE(pool.NewThread(&a1, 0) != 0);
+ ASSERT_TRUE(pool.NewThread(&a2, 0) != 0);
+ ASSERT_TRUE(pool.NewThread(&a3, 0) != 0);
+ ASSERT_TRUE(pool.NewThread(&a4, 0) != 0);
+ ASSERT_TRUE(pool.NewThread(&a5, 0) != 0);
+ ASSERT_TRUE(pool.NewThread(&a6, 0) != 0);
+
+ CmdList prog_multicast;
+ prog_multicast.push_back(cmd_do(10 * scale));
+ prog_multicast.push_back(cmd_multicast(&dl));
+ prog_multicast.push_back(cmd_done());
+ prog_multicast.push_back(cmd_exit());
+
+ CmdList prog_wait_snap;
+ prog_wait_snap.push_back(cmd_do(10 * scale));
+ prog_wait_snap.push_back(cmd_wait_snap(&dl));
+ prog_wait_snap.push_back(cmd_done());
+ prog_wait_snap.push_back(cmd_exit());
+
+ CmdList prog_add_remove_1;
+ prog_add_remove_1.push_back(cmd_do(scale));
+ prog_add_remove_1.push_back(cmd_add(&dl, &h1));
+ prog_add_remove_1.push_back(cmd_add(&dl, &h3));
+ prog_add_remove_1.push_back(cmd_remove(&dl, &h2));
+ prog_add_remove_1.push_back(cmd_remove(&dl, &h4));
+ prog_add_remove_1.push_back(cmd_add(&dl, &h4));
+ prog_add_remove_1.push_back(cmd_add(&dl, &h2));
+ prog_add_remove_1.push_back(cmd_remove(&dl, &h5));
+ prog_add_remove_1.push_back(cmd_remove(&dl, &h3));
+ prog_add_remove_1.push_back(cmd_add(&dl, &h5));
+ prog_add_remove_1.push_back(cmd_remove(&dl, &h1));
+ prog_add_remove_1.push_back(cmd_done());
+ prog_add_remove_1.push_back(cmd_exit());
+
+ CmdList prog_add_remove_2;
+ prog_add_remove_2.push_back(cmd_do(scale));
+ prog_add_remove_2.push_back(cmd_add(&dl, &h5));
+ prog_add_remove_2.push_back(cmd_add(&dl, &h4));
+ prog_add_remove_2.push_back(cmd_remove(&dl, &h1));
+ prog_add_remove_2.push_back(cmd_remove(&dl, &h3));
+ prog_add_remove_2.push_back(cmd_add(&dl, &h1));
+ prog_add_remove_2.push_back(cmd_remove(&dl, &h2));
+ prog_add_remove_2.push_back(cmd_add(&dl, &h2));
+ prog_add_remove_2.push_back(cmd_add(&dl, &h3));
+ prog_add_remove_2.push_back(cmd_remove(&dl, &h5));
+ prog_add_remove_2.push_back(cmd_remove(&dl, &h4));
+ prog_add_remove_2.push_back(cmd_done());
+ prog_add_remove_2.push_back(cmd_exit());
+
+ CmdList prog_add_remove_3;
+ prog_add_remove_3.push_back(cmd_do(scale));
+ prog_add_remove_3.push_back(cmd_add(&dl, &h3));
+ prog_add_remove_3.push_back(cmd_remove(&dl, &h4));
+ prog_add_remove_3.push_back(cmd_remove(&dl, &h3));
+ prog_add_remove_3.push_back(cmd_add(&dl, &h5));
+ prog_add_remove_3.push_back(cmd_add(&dl, &h2));
+ prog_add_remove_3.push_back(cmd_remove(&dl, &h2));
+ prog_add_remove_3.push_back(cmd_add(&dl, &h1));
+ prog_add_remove_3.push_back(cmd_add(&dl, &h4));
+ prog_add_remove_3.push_back(cmd_remove(&dl, &h1));
+ prog_add_remove_3.push_back(cmd_remove(&dl, &h5));
+ prog_add_remove_3.push_back(cmd_done());
+ prog_add_remove_3.push_back(cmd_exit());
+
+ a1.doIt(prog_multicast);
+ a2.doIt(prog_multicast);
+ a3.doIt(prog_wait_snap);
+ a4.doIt(prog_add_remove_1);
+ a5.doIt(prog_add_remove_2);
+ a6.doIt(prog_add_remove_3);
+
+ a1.waitState(Actor::STATE_DONE);
+ a2.waitState(Actor::STATE_DONE);
+ a3.waitState(Actor::STATE_DONE);
+ a4.waitState(Actor::STATE_DONE);
+ a5.waitState(Actor::STATE_DONE);
+ a6.waitState(Actor::STATE_DONE);
+
+ EXPECT_TRUE(a1.getOpCnt() == 10 * scale);
+ EXPECT_TRUE(a2.getOpCnt() == 10 * scale);
+ EXPECT_TRUE(a3.getOpCnt() == 10 * scale);
+ EXPECT_TRUE(a4.getOpCnt() == 10 * scale);
+ EXPECT_TRUE(a5.getOpCnt() == 10 * scale);
+ EXPECT_TRUE(a6.getOpCnt() == 10 * scale);
+}
+
+
+void
+Test::testWaitSnapshots()
+{
+ FastOS_ThreadPool pool(65000);
+ Actor a1(1, 0);
+ DL dl;
+ std::unique_ptr<DL::Snapshot> s1;
+ std::unique_ptr<DL::Snapshot> s2;
+ ASSERT_TRUE(pool.NewThread(&a1, 0) != 0);
+ s1.reset(new DL::Snapshot(dl)); // create snap 1
+ a1.doIt(cmd_wait_snap(&dl)); // wait for snaps
+ FastOS_Thread::Sleep(1000);
+ EXPECT_TRUE(a1.getState() == Actor::STATE_BUSY); // still waiting...
+ s2.reset(new DL::Snapshot(dl)); // create snap 2
+ s1.reset(); // destroy snap 1
+ FastOS_Thread::Sleep(1000);
+ EXPECT_TRUE(a1.getState() == Actor::STATE_IDLE); // wait done!
+ a1.doIt(cmd_exit());
+ a1.waitState(Actor::STATE_DONE);
+ s2.reset(); // destroy snap 2
+ EXPECT_TRUE(a1.getOpCnt() == 1);
+}
+
+//-----------------------------------------------------------------------------
+
+struct Foo { void completeBarrier() {} };
+
+int
+Test::Main()
+{
+ TEST_INIT("delegatelist_test");
+ LOG(info, "Lock size: %4zu bytes", sizeof(Lock));
+ LOG(info, "ArrayQueue size: %4zu bytes", sizeof(ArrayQueue<Foo>));
+ LOG(info, "std::vector size: %4zu bytes", sizeof(std::vector<Foo>));
+ LOG(info, "EventBarrier size: %4zu bytes", sizeof(EventBarrier<Foo>));
+ LOG(info, "DelegateList size: %4zu bytes", sizeof(DelegateList<Foo>));
+
+ testEmpty();
+ testAdd();
+ testRemove();
+ testOneShot();
+ testMultiSnapshot();
+
+ TEST_FLUSH();
+ testActors();
+ testWaitSnapshots();
+
+ TEST_FLUSH();
+ stressTest();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test);
diff --git a/vespalib/src/tests/dual_merge_director/.gitignore b/vespalib/src/tests/dual_merge_director/.gitignore
new file mode 100644
index 00000000000..b190240063a
--- /dev/null
+++ b/vespalib/src/tests/dual_merge_director/.gitignore
@@ -0,0 +1,2 @@
+vespalib_dual_merge_director_test_app
+Testing
diff --git a/vespalib/src/tests/dual_merge_director/CMakeLists.txt b/vespalib/src/tests/dual_merge_director/CMakeLists.txt
new file mode 100644
index 00000000000..8ea80b46320
--- /dev/null
+++ b/vespalib/src/tests/dual_merge_director/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_dual_merge_director_test_app
+ SOURCES
+ dual_merge_director_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_dual_merge_director_test_app COMMAND vespalib_dual_merge_director_test_app)
diff --git a/vespalib/src/tests/dual_merge_director/FILES b/vespalib/src/tests/dual_merge_director/FILES
new file mode 100644
index 00000000000..8beb1f1337e
--- /dev/null
+++ b/vespalib/src/tests/dual_merge_director/FILES
@@ -0,0 +1 @@
+dual_merge_director_test.cpp
diff --git a/vespalib/src/tests/dual_merge_director/dual_merge_director_test.cpp b/vespalib/src/tests/dual_merge_director/dual_merge_director_test.cpp
new file mode 100644
index 00000000000..72fd17e76d5
--- /dev/null
+++ b/vespalib/src/tests/dual_merge_director/dual_merge_director_test.cpp
@@ -0,0 +1,65 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/dual_merge_director.h>
+
+using namespace vespalib;
+
+struct MySource : public DualMergeDirector::Source {
+
+ bool typeA;
+ std::string data;
+ std::string diff;
+
+ MySource(bool a, size_t num_sources, size_t source_id)
+ : typeA(a),
+ data(num_sources, '0'),
+ diff(num_sources, '5')
+ {
+ if (source_id < num_sources) {
+ data[source_id] = '1';
+ diff[source_id] = '6';
+ }
+ }
+ virtual void merge(Source &mt) {
+ MySource &rhs = static_cast<MySource&>(mt);
+ ASSERT_EQUAL(typeA, rhs.typeA);
+ ASSERT_EQUAL(data.size(), rhs.data.size());
+ for (size_t i = 0; i < data.size(); ++i) {
+ int d = (rhs.data[i] - '0');
+ data[i] += d;
+ diff[i] += d;
+ rhs.diff[i] -= d;
+ }
+ }
+ void verifyFinal() const {
+ EXPECT_EQUAL(std::string(data.size(), '1'), data);
+ EXPECT_EQUAL(std::string(diff.size(), '6'), diff);
+ }
+ void verifyIntermediate() const {
+ EXPECT_EQUAL(std::string(diff.size(), '5'), diff);
+ }
+};
+
+TEST_MT_F("require that merging works", 64, std::unique_ptr<DualMergeDirector>()) {
+ for (size_t use_threads = 1; use_threads <= num_threads; ++use_threads) {
+ MySource sourceA(true, use_threads, thread_id);
+ MySource sourceB(false, use_threads, thread_id);
+ if (thread_id == 0) {
+ f1.reset(new DualMergeDirector(use_threads));
+ }
+ TEST_BARRIER();
+ if (thread_id < use_threads) {
+ f1->dualMerge(thread_id, sourceA, sourceB);
+ }
+ TEST_BARRIER();
+ if (thread_id == 0) {
+ sourceA.verifyFinal();
+ sourceB.verifyFinal();
+ } else if (thread_id < use_threads) {
+ sourceA.verifyIntermediate();
+ sourceB.verifyIntermediate();
+ }
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/compile_cache/.gitignore b/vespalib/src/tests/eval/compile_cache/.gitignore
new file mode 100644
index 00000000000..f7b5a4b55d5
--- /dev/null
+++ b/vespalib/src/tests/eval/compile_cache/.gitignore
@@ -0,0 +1 @@
+vespalib_compile_cache_test_app
diff --git a/vespalib/src/tests/eval/compile_cache/CMakeLists.txt b/vespalib/src/tests/eval/compile_cache/CMakeLists.txt
new file mode 100644
index 00000000000..7fbadc3410b
--- /dev/null
+++ b/vespalib/src/tests/eval/compile_cache/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_compile_cache_test_app
+ SOURCES
+ compile_cache_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_compile_cache_test_app COMMAND vespalib_compile_cache_test_app)
diff --git a/vespalib/src/tests/eval/compile_cache/compile_cache_test.cpp b/vespalib/src/tests/eval/compile_cache/compile_cache_test.cpp
new file mode 100644
index 00000000000..c9eaaf885d6
--- /dev/null
+++ b/vespalib/src/tests/eval/compile_cache/compile_cache_test.cpp
@@ -0,0 +1,145 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/compile_cache.h>
+#include <vespa/vespalib/eval/key_gen.h>
+#include <vespa/vespalib/eval/eval_spec.h>
+#include <set>
+
+using namespace vespalib::eval;
+
+//-----------------------------------------------------------------------------
+
+TEST("require that parameter passing selection affects function key") {
+ EXPECT_NOT_EQUAL(gen_key(Function::parse("a+b"), PassParams::SEPARATE),
+ gen_key(Function::parse("a+b"), PassParams::ARRAY));
+}
+
+TEST("require that the number of parameters affects function key") {
+ EXPECT_NOT_EQUAL(gen_key(Function::parse({"a", "b"}, "a+b"), PassParams::SEPARATE),
+ gen_key(Function::parse({"a", "b", "c"}, "a+b"), PassParams::SEPARATE));
+ EXPECT_NOT_EQUAL(gen_key(Function::parse({"a", "b"}, "a+b"), PassParams::ARRAY),
+ gen_key(Function::parse({"a", "b", "c"}, "a+b"), PassParams::ARRAY));
+}
+
+TEST("require that implicit and explicit parameters give the same function key") {
+ EXPECT_EQUAL(gen_key(Function::parse({"a", "b"}, "a+b"), PassParams::SEPARATE),
+ gen_key(Function::parse("a+b"), PassParams::SEPARATE));
+ EXPECT_EQUAL(gen_key(Function::parse({"a", "b"}, "a+b"), PassParams::ARRAY),
+ gen_key(Function::parse("a+b"), PassParams::ARRAY));
+}
+
+TEST("require that symbol names does not affect function key") {
+ EXPECT_EQUAL(gen_key(Function::parse("a+b"), PassParams::SEPARATE),
+ gen_key(Function::parse("x+y"), PassParams::SEPARATE));
+ EXPECT_EQUAL(gen_key(Function::parse("a+b"), PassParams::ARRAY),
+ gen_key(Function::parse("x+y"), PassParams::ARRAY));
+}
+
+TEST("require that let bind names does not affect function key") {
+ EXPECT_EQUAL(gen_key(Function::parse("let(a,1,a+a)"), PassParams::SEPARATE),
+ gen_key(Function::parse("let(b,1,b+b)"), PassParams::SEPARATE));
+ EXPECT_EQUAL(gen_key(Function::parse("let(a,1,a+a)"), PassParams::ARRAY),
+ gen_key(Function::parse("let(b,1,b+b)"), PassParams::ARRAY));
+}
+
+TEST("require that different values give different function keys") {
+ EXPECT_NOT_EQUAL(gen_key(Function::parse("1"), PassParams::SEPARATE),
+ gen_key(Function::parse("2"), PassParams::SEPARATE));
+ EXPECT_NOT_EQUAL(gen_key(Function::parse("1"), PassParams::ARRAY),
+ gen_key(Function::parse("2"), PassParams::ARRAY));
+}
+
+TEST("require that different strings give different function keys") {
+ EXPECT_NOT_EQUAL(gen_key(Function::parse("\"a\""), PassParams::SEPARATE),
+ gen_key(Function::parse("\"b\""), PassParams::SEPARATE));
+ EXPECT_NOT_EQUAL(gen_key(Function::parse("\"a\""), PassParams::ARRAY),
+ gen_key(Function::parse("\"b\""), PassParams::ARRAY));
+}
+
+//-----------------------------------------------------------------------------
+
+struct CheckKeys : test::EvalSpec::EvalTest {
+ bool failed = false;
+ std::set<vespalib::string> seen_keys;
+ bool check_key(const vespalib::string &key) {
+ bool seen = (seen_keys.count(key) > 0);
+ seen_keys.insert(key);
+ return seen;
+ }
+ virtual void next_expression(const std::vector<vespalib::string> &param_names,
+ const vespalib::string &expression) override
+ {
+ if (check_key(gen_key(Function::parse(param_names, expression), PassParams::ARRAY)) ||
+ check_key(gen_key(Function::parse(param_names, expression), PassParams::SEPARATE)))
+ {
+ failed = true;
+ fprintf(stderr, "key collision for: %s\n", expression.c_str());
+ }
+ }
+ virtual void handle_case(const std::vector<vespalib::string> &,
+ const std::vector<double> &,
+ const vespalib::string &,
+ double) override {}
+};
+
+TEST_FF("require that all conformance expressions have different function keys",
+ CheckKeys(), test::EvalSpec())
+{
+ f2.add_all_cases();
+ f2.each_case(f1);
+ EXPECT_TRUE(!f1.failed);
+ EXPECT_GREATER(f1.seen_keys.size(), 100u);
+}
+
+//-----------------------------------------------------------------------------
+
+void verify_cache(size_t expect_cached, size_t expect_refs) {
+ EXPECT_EQUAL(expect_cached, CompileCache::num_cached());
+ EXPECT_EQUAL(expect_refs, CompileCache::count_refs());
+}
+
+TEST("require that cache is initially empty") {
+ TEST_DO(verify_cache(0, 0));
+}
+
+TEST("require that unused functions are evicted from the cache") {
+ CompileCache::Token::UP token_a = CompileCache::compile(Function::parse("x+y"), PassParams::ARRAY);
+ TEST_DO(verify_cache(1, 1));
+ token_a.reset();
+ TEST_DO(verify_cache(0, 0));
+}
+
+TEST("require that agents can have separate functions in the cache") {
+ CompileCache::Token::UP token_a = CompileCache::compile(Function::parse("x+y"), PassParams::ARRAY);
+ CompileCache::Token::UP token_b = CompileCache::compile(Function::parse("x*y"), PassParams::ARRAY);
+ TEST_DO(verify_cache(2, 2));
+}
+
+TEST("require that agents can share functions in the cache") {
+ CompileCache::Token::UP token_a = CompileCache::compile(Function::parse("x+y"), PassParams::ARRAY);
+ CompileCache::Token::UP token_b = CompileCache::compile(Function::parse("x+y"), PassParams::ARRAY);
+ TEST_DO(verify_cache(1, 2));
+}
+
+TEST("require that cache usage works") {
+ TEST_DO(verify_cache(0, 0));
+ CompileCache::Token::UP token_a = CompileCache::compile(Function::parse("x+y"), PassParams::SEPARATE);
+ EXPECT_EQUAL(5.0, token_a->get().get_function<2>()(2.0, 3.0));
+ TEST_DO(verify_cache(1, 1));
+ CompileCache::Token::UP token_b = CompileCache::compile(Function::parse("x*y"), PassParams::SEPARATE);
+ EXPECT_EQUAL(6.0, token_b->get().get_function<2>()(2.0, 3.0));
+ TEST_DO(verify_cache(2, 2));
+ CompileCache::Token::UP token_c = CompileCache::compile(Function::parse("x+y"), PassParams::SEPARATE);
+ EXPECT_EQUAL(5.0, token_c->get().get_function<2>()(2.0, 3.0));
+ TEST_DO(verify_cache(2, 3));
+ token_a.reset();
+ TEST_DO(verify_cache(2, 2));
+ token_b.reset();
+ TEST_DO(verify_cache(1, 1));
+ token_c.reset();
+ TEST_DO(verify_cache(0, 0));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/compiled_function/.gitignore b/vespalib/src/tests/eval/compiled_function/.gitignore
new file mode 100644
index 00000000000..849f107211e
--- /dev/null
+++ b/vespalib/src/tests/eval/compiled_function/.gitignore
@@ -0,0 +1 @@
+vespalib_compiled_function_test_app
diff --git a/vespalib/src/tests/eval/compiled_function/CMakeLists.txt b/vespalib/src/tests/eval/compiled_function/CMakeLists.txt
new file mode 100644
index 00000000000..04ec6aa3df0
--- /dev/null
+++ b/vespalib/src/tests/eval/compiled_function/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_compiled_function_test_app
+ SOURCES
+ compiled_function_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_compiled_function_test_app COMMAND vespalib_compiled_function_test_app)
diff --git a/vespalib/src/tests/eval/compiled_function/FILES b/vespalib/src/tests/eval/compiled_function/FILES
new file mode 100644
index 00000000000..44a9116c4fe
--- /dev/null
+++ b/vespalib/src/tests/eval/compiled_function/FILES
@@ -0,0 +1 @@
+compiled_function_test.cpp
diff --git a/vespalib/src/tests/eval/compiled_function/compiled_function_test.cpp b/vespalib/src/tests/eval/compiled_function/compiled_function_test.cpp
new file mode 100644
index 00000000000..474f1880f2a
--- /dev/null
+++ b/vespalib/src/tests/eval/compiled_function/compiled_function_test.cpp
@@ -0,0 +1,177 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/compiled_function.h>
+#include <vespa/vespalib/eval/eval_spec.h>
+#include <vespa/vespalib/eval/basic_nodes.h>
+#include <vespa/vespalib/util/stringfmt.h>
+
+using namespace vespalib::eval;
+
+//-----------------------------------------------------------------------------
+
+std::vector<vespalib::string> params_10({"p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10"});
+
+const char *expr_10 = "p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10";
+
+TEST("require that separate parameter passing works") {
+ CompiledFunction cf_10(Function::parse(params_10, expr_10), PassParams::SEPARATE);
+ auto fun_10 = cf_10.get_function<10>();
+ EXPECT_EQUAL(10.0, fun_10(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0));
+ EXPECT_EQUAL(50.0, fun_10(5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0));
+ EXPECT_EQUAL(45.0, fun_10(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0));
+ EXPECT_EQUAL(45.0, fun_10(9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0));
+}
+
+TEST("require that array parameter passing works") {
+ CompiledFunction arr_cf(Function::parse(params_10, expr_10), PassParams::ARRAY);
+ auto arr_fun = arr_cf.get_function();
+ EXPECT_EQUAL(10.0, arr_fun(&std::vector<double>({1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0})[0]));
+ EXPECT_EQUAL(50.0, arr_fun(&std::vector<double>({5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0})[0]));
+ EXPECT_EQUAL(45.0, arr_fun(&std::vector<double>({0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0})[0]));
+ EXPECT_EQUAL(45.0, arr_fun(&std::vector<double>({9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0})[0]));
+}
+
+//-----------------------------------------------------------------------------
+
+struct MyEvalTest : test::EvalSpec::EvalTest {
+ size_t pass_cnt = 0;
+ size_t fail_cnt = 0;
+ bool print_pass = false;
+ bool print_fail = false;
+ virtual void next_expression(const std::vector<vespalib::string> &,
+ const vespalib::string &) override {}
+ virtual void handle_case(const std::vector<vespalib::string> &param_names,
+ const std::vector<double> &param_values,
+ const vespalib::string &expression,
+ double expected_result) override
+ {
+ CompiledFunction cfun(Function::parse(param_names, expression), PassParams::ARRAY);
+ auto fun = cfun.get_function();
+ EXPECT_EQUAL(cfun.num_params(), param_values.size());
+ double result = fun(&param_values[0]);
+ if (is_same(expected_result, result)) {
+ print_pass && fprintf(stderr, "verifying: %s -> %g ... PASS\n",
+ as_string(param_names, param_values, expression).c_str(),
+ expected_result);
+ ++pass_cnt;
+ } else {
+ print_fail && fprintf(stderr, "verifying: %s -> %g ... FAIL: got %g\n",
+ as_string(param_names, param_values, expression).c_str(),
+ expected_result, result);
+ ++fail_cnt;
+ }
+ }
+};
+
+TEST_FF("require that compiled evaluation passes all conformance tests", MyEvalTest(), test::EvalSpec()) {
+ f1.print_fail = true;
+ f2.add_all_cases();
+ f2.each_case(f1);
+ EXPECT_GREATER(f1.pass_cnt, 1000u);
+ EXPECT_EQUAL(0u, f1.fail_cnt);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that large (plugin) set membership checks work") {
+ nodes::Array my_set;
+ for(size_t i = 1; i <= 100; ++i) {
+ my_set.add(nodes::Node_UP(new nodes::Number(i)));
+ }
+ nodes::DumpContext dump_ctx({});
+ vespalib::string expr = vespalib::make_string("if(a in %s,1,0)",
+ my_set.dump(dump_ctx).c_str());
+ // fprintf(stderr, "expression: %s\n", expr.c_str());
+ CompiledFunction cf(Function::parse(expr), PassParams::SEPARATE);
+ CompiledFunction arr_cf(Function::parse(expr), PassParams::ARRAY);
+ auto fun = cf.get_function<1>();
+ auto arr_fun = arr_cf.get_function();
+ for (double value = 0.5; value <= 100.5; value += 0.5) {
+ if (round(value) == value) {
+ EXPECT_EQUAL(1.0, fun(value));
+ EXPECT_EQUAL(1.0, arr_fun(&value));
+ } else {
+ EXPECT_EQUAL(0.0, fun(value));
+ EXPECT_EQUAL(0.0, arr_fun(&value));
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+CompiledFunction pass_fun(CompiledFunction cf) {
+ auto fun = cf.get_function<2>();
+ EXPECT_EQUAL(5.0, fun(2.0, 3.0));
+ return cf;
+}
+
+TEST("require that compiled expression can be passed (moved) around") {
+ CompiledFunction cf(Function::parse("a+b"), PassParams::SEPARATE);
+ auto fun = cf.get_function<2>();
+ EXPECT_EQUAL(4.0, fun(2.0, 2.0));
+ CompiledFunction cf2 = pass_fun(std::move(cf));
+ EXPECT_TRUE(cf.get_function<2>() == nullptr);
+ auto fun2 = cf2.get_function<2>();
+ EXPECT_TRUE(fun == fun2);
+ EXPECT_EQUAL(10.0, fun(3.0, 7.0));
+}
+
+TEST("require that expressions with constant sub-expressions evaluate correctly") {
+ CompiledFunction cf(Function::parse("if(1,2,10)+a+b+max(1,2)/1"), PassParams::SEPARATE);
+ auto fun = cf.get_function<2>();
+ EXPECT_EQUAL(7.0, fun(1.0, 2.0));
+ EXPECT_EQUAL(11.0, fun(3.0, 4.0));
+}
+
+TEST("dump ir code to verify lazy casting") {
+ CompiledFunction cf(Function::parse({"a", "b"}, "12==2+if(a==3&&a<10||b,10,5)"), PassParams::SEPARATE);
+ auto fun = cf.get_function<2>();
+ EXPECT_EQUAL(0.0, fun(0.0, 0.0));
+ EXPECT_EQUAL(1.0, fun(0.0, 1.0));
+ EXPECT_EQUAL(1.0, fun(3.0, 0.0));
+ cf.dump();
+}
+
+TEST_MT("require that multithreaded compilation works", 64) {
+ {
+ CompiledFunction cf(Function::parse({"x", "y", "z", "w"}, "((x+1)*(y-1))/((z+1)/(w-1))"),
+ PassParams::SEPARATE);
+ auto fun = cf.get_function<4>();
+ EXPECT_EQUAL(1.0, fun(0.0, 2.0, 0.0, 2.0));
+ }
+ {
+ CompiledFunction cf(Function::parse({"x", "y", "z", "w"}, "((x+1)*(y-1))/((z+1)/(w-1))"),
+ PassParams::SEPARATE);
+ auto fun = cf.get_function<4>();
+ EXPECT_EQUAL(4.0, fun(1.0, 3.0, 0.0, 2.0));
+ }
+ {
+ CompiledFunction cf(Function::parse({"x", "y", "z", "w"}, "((x+1)*(y-1))/((z+1)/(w-1))"),
+ PassParams::SEPARATE);
+ auto fun = cf.get_function<4>();
+ EXPECT_EQUAL(2.0, fun(1.0, 3.0, 1.0, 2.0));
+ }
+ {
+ CompiledFunction cf(Function::parse({"x", "y", "z", "w"}, "((x+1)*(y-1))/((z+1)/(w-1))"),
+ PassParams::SEPARATE);
+ auto fun = cf.get_function<4>();
+ EXPECT_EQUAL(8.0, fun(1.0, 3.0, 1.0, 5.0));
+ }
+}
+
+TEST("require that tensor operations have sane numeric fallbacks") {
+ CompiledFunction cf1(Function::parse({"a", "b"}, "{{}:42}"), PassParams::SEPARATE);
+ CompiledFunction cf2(Function::parse({"a", "b"}, "sum(a+b)"), PassParams::SEPARATE);
+ CompiledFunction cf3(Function::parse({"a", "b"}, "match(a,b)"), PassParams::SEPARATE);
+ auto fun1 = cf1.get_function<2>();
+ auto fun2 = cf2.get_function<2>();
+ auto fun3 = cf3.get_function<2>();
+ EXPECT_EQUAL(42.0, fun1(5.0, 7.0));
+ EXPECT_EQUAL(12.0, fun2(5.0, 7.0));
+ EXPECT_EQUAL(35.0, fun3(5.0, 7.0));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/function/.gitignore b/vespalib/src/tests/eval/function/.gitignore
new file mode 100644
index 00000000000..a8713610644
--- /dev/null
+++ b/vespalib/src/tests/eval/function/.gitignore
@@ -0,0 +1 @@
+vespalib_function_test_app
diff --git a/vespalib/src/tests/eval/function/CMakeLists.txt b/vespalib/src/tests/eval/function/CMakeLists.txt
new file mode 100644
index 00000000000..2f1d2718a2a
--- /dev/null
+++ b/vespalib/src/tests/eval/function/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_function_test_app
+ SOURCES
+ function_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_function_test_app COMMAND vespalib_function_test_app)
diff --git a/vespalib/src/tests/eval/function/FILES b/vespalib/src/tests/eval/function/FILES
new file mode 100644
index 00000000000..a7421dd2605
--- /dev/null
+++ b/vespalib/src/tests/eval/function/FILES
@@ -0,0 +1 @@
+function_parser_test.cpp
diff --git a/vespalib/src/tests/eval/function/function_test.cpp b/vespalib/src/tests/eval/function/function_test.cpp
new file mode 100644
index 00000000000..8da7a495a67
--- /dev/null
+++ b/vespalib/src/tests/eval/function/function_test.cpp
@@ -0,0 +1,778 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/operator_nodes.h>
+#include <vespa/vespalib/eval/node_traverser.h>
+#include <set>
+#include <vespa/vespalib/eval/eval_spec.h>
+#include <vespa/vespalib/eval/check_type.h>
+
+using namespace vespalib::eval;
+using namespace vespalib::eval::nodes;
+
+std::vector<vespalib::string> params({"x", "y", "z", "w"});
+
+double as_number(const Function &f) {
+ auto number = as<Number>(f.root());
+ if (number) {
+ return number->value();
+ } else {
+ return error_value;
+ }
+}
+
+vespalib::string as_string(const Function &f) {
+ auto string = as<String>(f.root());
+ if (string) {
+ return string->value();
+ } else {
+ return "<error>";
+ }
+}
+
+struct OperatorLayer {
+ Operator::Order order;
+ std::vector<vespalib::string> op_names;
+};
+
+Operator_UP create_op(vespalib::string name) {
+ Operator_UP op = OperatorRepo::instance().create(name);
+ ASSERT_TRUE(op.get() != nullptr);
+ EXPECT_EQUAL(name, op->op_str());
+ return op;
+}
+
+void verify_operator_binding_order(std::initializer_list<OperatorLayer> layers) {
+ std::set<vespalib::string> seen_names;
+ int layer_idx = 0;
+ for (OperatorLayer layer: layers) {
+ ++layer_idx;
+ for (vespalib::string op_name: layer.op_names) {
+ seen_names.insert(op_name);
+ int other_layer_idx = 0;
+ for (OperatorLayer other_layer: layers) {
+ ++other_layer_idx;
+ for (vespalib::string other_op_name: other_layer.op_names) {
+ Operator_UP op = create_op(op_name);
+ Operator_UP other_op = create_op(other_op_name);
+ bool do_op_before_other_op = (layer_idx < other_layer_idx)
+ || ((layer_idx == other_layer_idx)
+ && (layer.order == Operator::Order::LEFT));
+ if (!EXPECT_EQUAL(do_op_before_other_op, op->do_before(*other_op))) {
+ fprintf(stderr, "error: left operator '%s' should %sbind before right operator '%s'\n",
+ op->op_str().c_str(), do_op_before_other_op? "" : "not ", other_op->op_str().c_str());
+ }
+ }
+ }
+ }
+ }
+ auto all_names = OperatorRepo::instance().get_names();
+ for (auto name: all_names) {
+ if (!EXPECT_EQUAL(1u, seen_names.count(name))) {
+ fprintf(stderr, "error: operator '%s' not verified by binding order test\n", name.c_str());
+ }
+ }
+}
+
+bool verify_string(const vespalib::string &str, const vespalib::string &expr) {
+ bool ok = true;
+ ok &= EXPECT_EQUAL(str, as_string(Function::parse(params, expr)));
+ ok &= EXPECT_EQUAL(expr, Function::parse(params, expr).dump());
+ return ok;
+}
+
+
+TEST("require that scientific numbers can be parsed") {
+ EXPECT_EQUAL(1.0, as_number(Function::parse(params, "1")));
+ EXPECT_EQUAL(2.5, as_number(Function::parse(params, "2.5")));
+ EXPECT_EQUAL(100.0, as_number(Function::parse(params, "100")));
+ EXPECT_EQUAL(0.01, as_number(Function::parse(params, "0.01")));
+ EXPECT_EQUAL(1.05e5, as_number(Function::parse(params, "1.05e5")));
+ EXPECT_EQUAL(3e7, as_number(Function::parse(params, "3e7")));
+ EXPECT_EQUAL(1.05e5, as_number(Function::parse(params, "1.05e+5")));
+ EXPECT_EQUAL(3e7, as_number(Function::parse(params, "3e+7")));
+ EXPECT_EQUAL(1.05e-5, as_number(Function::parse(params, "1.05e-5")));
+ EXPECT_EQUAL(3e-7, as_number(Function::parse(params, "3e-7")));
+ EXPECT_EQUAL(1.05e5, as_number(Function::parse(params, "1.05E5")));
+ EXPECT_EQUAL(3e7, as_number(Function::parse(params, "3E7")));
+ EXPECT_EQUAL(1.05e5, as_number(Function::parse(params, "1.05E+5")));
+ EXPECT_EQUAL(3e7, as_number(Function::parse(params, "3E+7")));
+ EXPECT_EQUAL(1.05e-5, as_number(Function::parse(params, "1.05E-5")));
+ EXPECT_EQUAL(3e-7, as_number(Function::parse(params, "3E-7")));
+}
+
+TEST("require that number parsing does not eat +/- operators") {
+ EXPECT_EQUAL("(((1+2)+3)+4)", Function::parse(params, "1+2+3+4").dump());
+ EXPECT_EQUAL("(((1-2)-3)-4)", Function::parse(params, "1-2-3-4").dump());
+ EXPECT_EQUAL("(((1+x)+3)+y)", Function::parse(params, "1+x+3+y").dump());
+ EXPECT_EQUAL("(((1-x)-3)-y)", Function::parse(params, "1-x-3-y").dump());
+}
+
+TEST("require that symbols can be parsed") {
+ EXPECT_EQUAL("x", Function::parse(params, "x").dump());
+ EXPECT_EQUAL("y", Function::parse(params, "y").dump());
+ EXPECT_EQUAL("z", Function::parse(params, "z").dump());
+}
+
+TEST("require that parenthesis can be parsed") {
+ EXPECT_EQUAL("x", Function::parse(params, "(x)").dump());
+ EXPECT_EQUAL("x", Function::parse(params, "((x))").dump());
+ EXPECT_EQUAL("x", Function::parse(params, "(((x)))").dump());
+}
+
+TEST("require that strings are parsed and dumped correctly") {
+ EXPECT_TRUE(verify_string("foo", "\"foo\""));
+ EXPECT_TRUE(verify_string("", "\"\""));
+ EXPECT_TRUE(verify_string(" ", "\" \""));
+ EXPECT_TRUE(verify_string(">\\<", "\">\\\\<\""));
+ EXPECT_TRUE(verify_string(">\"<", "\">\\\"<\""));
+ EXPECT_TRUE(verify_string(">\t<", "\">\\t<\""));
+ EXPECT_TRUE(verify_string(">\n<", "\">\\n<\""));
+ EXPECT_TRUE(verify_string(">\r<", "\">\\r<\""));
+ EXPECT_TRUE(verify_string(">\f<", "\">\\f<\""));
+ for (int c = 0; c < 256; ++c) {
+ vespalib::string raw_expr = vespalib::make_string("\"%c\"", c);
+ vespalib::string hex_expr = vespalib::make_string("\"\\x%02x\"", c);
+ vespalib::string raw_str = vespalib::make_string("%c", c);
+ EXPECT_EQUAL(raw_str, as_string(Function::parse(params, hex_expr)));
+ if (c != 0 && c != '\"' && c != '\\') {
+ EXPECT_EQUAL(raw_str, as_string(Function::parse(params, raw_expr)));
+ } else {
+ EXPECT_TRUE(Function::parse(params, raw_expr).has_error());
+ }
+ if (c == '\\') {
+ EXPECT_EQUAL("\"\\\\\"", Function::parse(params, hex_expr).dump());
+ } else if (c == '\"') {
+ EXPECT_EQUAL("\"\\\"\"", Function::parse(params, hex_expr).dump());
+ } else if (c == '\t') {
+ EXPECT_EQUAL("\"\\t\"", Function::parse(params, hex_expr).dump());
+ } else if (c == '\n') {
+ EXPECT_EQUAL("\"\\n\"", Function::parse(params, hex_expr).dump());
+ } else if (c == '\r') {
+ EXPECT_EQUAL("\"\\r\"", Function::parse(params, hex_expr).dump());
+ } else if (c == '\f') {
+ EXPECT_EQUAL("\"\\f\"", Function::parse(params, hex_expr).dump());
+ } else if ((c >= 32) && (c <= 126)) {
+ if (c >= 'a' && c <= 'z' && c != 't' && c != 'n' && c != 'r' && c != 'f') {
+ EXPECT_TRUE(Function::parse(params, vespalib::make_string("\"\\%c\"", c)).has_error());
+ }
+ EXPECT_EQUAL(raw_expr, Function::parse(params, hex_expr).dump());
+ } else {
+ EXPECT_EQUAL(hex_expr, Function::parse(params, hex_expr).dump());
+ }
+ }
+}
+
+TEST("require that arrays can be parsed") {
+ EXPECT_EQUAL("[]", Function::parse(params, "[]").dump());
+ EXPECT_EQUAL("[1,2,3]", Function::parse(params, "[1,2,3]").dump());
+ EXPECT_EQUAL("[1,2,3]", Function::parse(params, "[ 1 , 2 , 3 ]").dump());
+ EXPECT_EQUAL("[[x],[x,y],[1,2,[z,w]]]", Function::parse(params, "[[x],[x,y],[1,2,[z,w]]]").dump());
+ EXPECT_EQUAL("[(x+1),(y-[3,7]),z,[]]", Function::parse(params, "[x+1,y-[3,7],z,[]]").dump());
+}
+
+TEST("require that negative values can be parsed") {
+ EXPECT_EQUAL("(-1)", Function::parse(params, "-1").dump());
+ EXPECT_EQUAL("(-2.5)", Function::parse(params, "-2.5").dump());
+ EXPECT_EQUAL("(-100)", Function::parse(params, "-100").dump());
+}
+
+TEST("require that negative symbols can be parsed") {
+ EXPECT_EQUAL("(-x)", Function::parse(params, "-x").dump());
+ EXPECT_EQUAL("(-y)", Function::parse(params, "-y").dump());
+ EXPECT_EQUAL("(-z)", Function::parse(params, "-z").dump());
+ EXPECT_EQUAL("(-(-(-x)))", Function::parse(params, "---x").dump());
+}
+
+TEST("require that not can be parsed") {
+ EXPECT_EQUAL("(!x)", Function::parse(params, "!x").dump());
+ EXPECT_EQUAL("(!(!x))", Function::parse(params, "!!x").dump());
+ EXPECT_EQUAL("(!(!(!x)))", Function::parse(params, "!!!x").dump());
+}
+
+TEST("require that not/neg binds to next value") {
+ EXPECT_EQUAL("((!(!(-(-x))))^z)", Function::parse(params, "!!--x^z").dump());
+ EXPECT_EQUAL("((-(-(!(!x))))^z)", Function::parse(params, "--!!x^z").dump());
+ EXPECT_EQUAL("((!(-(-(!x))))^z)", Function::parse(params, "!--!x^z").dump());
+ EXPECT_EQUAL("((-(!(!(-x))))^z)", Function::parse(params, "-!!-x^z").dump());
+}
+
+TEST("require that parenthesis resolves before not/neg") {
+ EXPECT_EQUAL("(!(x^z))", Function::parse(params, "!(x^z)").dump());
+ EXPECT_EQUAL("(-(x^z))", Function::parse(params, "-(x^z)").dump());
+}
+
+TEST("require that operators have appropriate binding order") {
+ verify_operator_binding_order({ { Operator::Order::RIGHT, { "^" } },
+ { Operator::Order::LEFT, { "*", "/" } },
+ { Operator::Order::LEFT, { "+", "-" } },
+ { Operator::Order::LEFT, { "==", "!=", "~=", "<", "<=", ">", ">=", "in" } },
+ { Operator::Order::LEFT, { "&&" } },
+ { Operator::Order::LEFT, { "||" } } });
+}
+
+TEST("require that operators binding left are calculated left to right") {
+ EXPECT_TRUE(create_op("+")->order() == Operator::Order::LEFT);
+ EXPECT_EQUAL("((x+y)+z)", Function::parse(params, "x+y+z").dump());
+}
+
+TEST("require that operators binding right are calculated right to left") {
+ EXPECT_TRUE(create_op("^")->order() == Operator::Order::RIGHT);
+ EXPECT_EQUAL("(x^(y^z))", Function::parse(params, "x^y^z").dump());
+}
+
+TEST("require that operators with higher precedence are resolved first") {
+ EXPECT_TRUE(create_op("*")->priority() > create_op("+")->priority());
+ EXPECT_EQUAL("(x+(y*z))", Function::parse(params, "x+y*z").dump());
+ EXPECT_EQUAL("((x*y)+z)", Function::parse(params, "x*y+z").dump());
+}
+
+TEST("require that multi-level operator precedence resolving works") {
+ EXPECT_TRUE(create_op("^")->priority() > create_op("*")->priority());
+ EXPECT_TRUE(create_op("*")->priority() > create_op("+")->priority());
+ EXPECT_EQUAL("(x+(y*(z^w)))", Function::parse(params, "x+y*z^w").dump());
+ EXPECT_EQUAL("(x+((y^z)*w))", Function::parse(params, "x+y^z*w").dump());
+ EXPECT_EQUAL("((x*y)+(z^w))", Function::parse(params, "x*y+z^w").dump());
+ EXPECT_EQUAL("((x*(y^z))+w)", Function::parse(params, "x*y^z+w").dump());
+ EXPECT_EQUAL("((x^y)+(z*w))", Function::parse(params, "x^y+z*w").dump());
+ EXPECT_EQUAL("(((x^y)*z)+w)", Function::parse(params, "x^y*z+w").dump());
+}
+
+TEST("require that expressions are combined when parenthesis are closed") {
+ EXPECT_EQUAL("((x+(y+z))+w)", Function::parse(params, "x+(y+z)+w").dump());
+}
+
+TEST("require that operators can not bind out of parenthesis") {
+ EXPECT_TRUE(create_op("*")->priority() > create_op("+")->priority());
+ EXPECT_EQUAL("((x+y)*(x+z))", Function::parse(params, "(x+y)*(x+z)").dump());
+}
+
+TEST("require that set membership constructs can be parsed") {
+ EXPECT_EQUAL("(x in [y,z,w])", Function::parse(params, "x in [y,z,w]").dump());
+ EXPECT_EQUAL("(x in [y,z,w])", Function::parse(params, "x in[y,z,w]").dump());
+ EXPECT_EQUAL("(x in [y,z,w])", Function::parse(params, "(x)in[y,z,w]").dump());
+ EXPECT_EQUAL("((x+1) in [y,z,(w-1)])", Function::parse(params, "(x+1)in[y,z,(w-1)]").dump());
+}
+
+TEST("require that function calls can be parsed") {
+ EXPECT_EQUAL("min(max(x,y),sqrt(z))", Function::parse(params, "min(max(x,y),sqrt(z))").dump());
+}
+
+TEST("require that if expressions can be parsed") {
+ EXPECT_EQUAL("if(x,y,z)", Function::parse(params, "if(x,y,z)").dump());
+ EXPECT_EQUAL("if(x,y,z)", Function::parse(params, "if (x,y,z)").dump());
+ EXPECT_EQUAL("if(x,y,z)", Function::parse(params, " if ( x , y , z ) ").dump());
+ EXPECT_EQUAL("if(((x>1)&&(y<3)),(y+1),(z-1))", Function::parse(params, "if(x>1&&y<3,y+1,z-1)").dump());
+ EXPECT_EQUAL("if(if(x,y,z),if(x,y,z),if(x,y,z))", Function::parse(params, "if(if(x,y,z),if(x,y,z),if(x,y,z))").dump());
+ EXPECT_EQUAL("if(x,y,z,0.25)", Function::parse(params, "if(x,y,z,0.25)").dump());
+ EXPECT_EQUAL("if(x,y,z,0.75)", Function::parse(params, "if(x,y,z,0.75)").dump());
+}
+
+TEST("require that if probability can be inspected") {
+ Function fun_1 = Function::parse("if(x,y,z,0.25)");
+ auto if_1 = as<If>(fun_1.root());
+ ASSERT_TRUE(if_1);
+ EXPECT_EQUAL(0.25, if_1->p_true());
+ Function fun_2 = Function::parse("if(x,y,z,0.75)");
+ auto if_2 = as<If>(fun_2.root());
+ ASSERT_TRUE(if_2);
+ EXPECT_EQUAL(0.75, if_2->p_true());
+}
+
+TEST("require that symbols can be implicit") {
+ EXPECT_EQUAL("x", Function::parse("x").dump());
+ EXPECT_EQUAL("y", Function::parse("y").dump());
+ EXPECT_EQUAL("z", Function::parse("z").dump());
+}
+
+TEST("require that implicit parameters are picket up left to right") {
+ Function fun1 = Function::parse("x+y+y");
+ Function fun2 = Function::parse("y+y+x");
+ EXPECT_EQUAL("((x+y)+y)", fun1.dump());
+ EXPECT_EQUAL("((y+y)+x)", fun2.dump());
+ ASSERT_EQUAL(2u, fun1.num_params());
+ ASSERT_EQUAL(2u, fun2.num_params());
+ EXPECT_EQUAL("x", fun1.param_name(0));
+ EXPECT_EQUAL("x", fun2.param_name(1));
+ EXPECT_EQUAL("y", fun1.param_name(1));
+ EXPECT_EQUAL("y", fun2.param_name(0));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that leaf nodes have no children") {
+ EXPECT_TRUE(Function::parse("123").root().is_leaf());
+ EXPECT_TRUE(Function::parse("x").root().is_leaf());
+ EXPECT_TRUE(Function::parse("\"abc\"").root().is_leaf());
+ EXPECT_EQUAL(0u, Function::parse("123").root().num_children());
+ EXPECT_EQUAL(0u, Function::parse("x").root().num_children());
+ EXPECT_EQUAL(0u, Function::parse("\"abc\"").root().num_children());
+}
+
+TEST("require that Array children can be accessed") {
+ Function f = Function::parse("[1,2,3]");
+ const Node &root = f.root();
+ EXPECT_TRUE(!root.is_leaf());
+ ASSERT_EQUAL(3u, root.num_children());
+ EXPECT_EQUAL(1.0, root.get_child(0).get_const_value());
+ EXPECT_EQUAL(2.0, root.get_child(1).get_const_value());
+ EXPECT_EQUAL(3.0, root.get_child(2).get_const_value());
+}
+
+TEST("require that Neg child can be accessed") {
+ Function f = Function::parse("-1");
+ const Node &root = f.root();
+ EXPECT_TRUE(!root.is_leaf());
+ ASSERT_EQUAL(1u, root.num_children());
+ EXPECT_EQUAL(1.0, root.get_child(0).get_const_value());
+}
+
+TEST("require that Not child can be accessed") {
+ Function f = Function::parse("!1");
+ const Node &root = f.root();
+ EXPECT_TRUE(!root.is_leaf());
+ ASSERT_EQUAL(1u, root.num_children());
+ EXPECT_EQUAL(1.0, root.get_child(0).get_const_value());
+}
+
+TEST("require that If children can be accessed") {
+ Function f = Function::parse("if(1,2,3)");
+ const Node &root = f.root();
+ EXPECT_TRUE(!root.is_leaf());
+ ASSERT_EQUAL(3u, root.num_children());
+ EXPECT_EQUAL(1.0, root.get_child(0).get_const_value());
+ EXPECT_EQUAL(2.0, root.get_child(1).get_const_value());
+ EXPECT_EQUAL(3.0, root.get_child(2).get_const_value());
+}
+
+TEST("require that Let children can be accessed") {
+ Function f = Function::parse("let(a,1,2)");
+ const Node &root = f.root();
+ EXPECT_TRUE(!root.is_leaf());
+ ASSERT_EQUAL(2u, root.num_children());
+ EXPECT_EQUAL(1.0, root.get_child(0).get_const_value());
+ EXPECT_EQUAL(2.0, root.get_child(1).get_const_value());
+}
+
+TEST("require that Operator children can be accessed") {
+ Function f = Function::parse("1+2");
+ const Node &root = f.root();
+ EXPECT_TRUE(!root.is_leaf());
+ ASSERT_EQUAL(2u, root.num_children());
+ EXPECT_EQUAL(1.0, root.get_child(0).get_const_value());
+ EXPECT_EQUAL(2.0, root.get_child(1).get_const_value());
+}
+
+TEST("require that Call children can be accessed") {
+ Function f = Function::parse("max(1,2)");
+ const Node &root = f.root();
+ EXPECT_TRUE(!root.is_leaf());
+ ASSERT_EQUAL(2u, root.num_children());
+ EXPECT_EQUAL(1.0, root.get_child(0).get_const_value());
+ EXPECT_EQUAL(2.0, root.get_child(1).get_const_value());
+}
+
+struct MyNodeHandler : public NodeHandler {
+ std::vector<nodes::Node_UP> nodes;
+ virtual void handle(nodes::Node_UP node) {
+ if (node.get() != nullptr) {
+ nodes.push_back(std::move(node));
+ }
+ }
+};
+
+size_t detach_from_root(const vespalib::string &expr) {
+ MyNodeHandler handler;
+ Function function = Function::parse(expr);
+ nodes::Node &mutable_root = const_cast<nodes::Node&>(function.root());
+ mutable_root.detach_children(handler);
+ return handler.nodes.size();
+}
+
+TEST("require that children can be detached") {
+ EXPECT_EQUAL(0u, detach_from_root("1"));
+ EXPECT_EQUAL(0u, detach_from_root("a"));
+ EXPECT_EQUAL(1u, detach_from_root("-a"));
+ EXPECT_EQUAL(1u, detach_from_root("!a"));
+ EXPECT_EQUAL(3u, detach_from_root("if(1,2,3)"));
+ EXPECT_EQUAL(2u, detach_from_root("let(a,1,a)"));
+ EXPECT_EQUAL(5u, detach_from_root("[1,2,3,4,5]"));
+ EXPECT_EQUAL(2u, detach_from_root("a+b"));
+ EXPECT_EQUAL(1u, detach_from_root("isNan(a)"));
+ EXPECT_EQUAL(2u, detach_from_root("max(a,b)"));
+}
+
+//-----------------------------------------------------------------------------
+
+struct MyTraverser : public NodeTraverser {
+ size_t open_true_cnt;
+ std::vector<std::pair<bool, const nodes::Node &> > history;
+ explicit MyTraverser(size_t open_true_cnt_in)
+ : open_true_cnt(open_true_cnt_in), history() {}
+ virtual bool open(const nodes::Node &node) override {
+ history.emplace_back(true, node);
+ if (open_true_cnt == 0) {
+ return false;
+ }
+ --open_true_cnt;
+ return true;
+ }
+ virtual void close(const nodes::Node &node) override {
+ history.emplace_back(false, node);
+ }
+ void verify(const nodes::Node &node, size_t &offset, size_t &open_cnt) {
+ ASSERT_TRUE(history.size() > offset);
+ EXPECT_TRUE(history[offset].first);
+ EXPECT_EQUAL(&node, &history[offset].second);
+ ++offset;
+ if (open_cnt == 0) {
+ return;
+ }
+ --open_cnt;
+ for (size_t i = 0; i < node.num_children(); ++i) {
+ verify(node.get_child(i), offset, open_cnt);
+ }
+ ASSERT_TRUE(history.size() > offset);
+ EXPECT_TRUE(!history[offset].first);
+ EXPECT_EQUAL(&node, &history[offset].second);
+ ++offset;
+ }
+};
+
+size_t verify_traversal(size_t open_true_cnt, const vespalib::string &expression) {
+ Function function = Function::parse(expression);
+ if (!EXPECT_TRUE(!function.has_error())) {
+ fprintf(stderr, "--> %s\n", function.get_error().c_str());
+ }
+ MyTraverser traverser(open_true_cnt);
+ function.root().traverse(traverser);
+ size_t offset = 0;
+ size_t open_cnt = open_true_cnt;
+ traverser.verify(function.root(), offset, open_cnt);
+ EXPECT_EQUAL(offset, traverser.history.size());
+ return offset;
+}
+
+bool verify_expression_traversal(const vespalib::string &expression) {
+ for (size_t open_cnt = 0; true; ++open_cnt) {
+ size_t num_callbacks = verify_traversal(open_cnt, expression);
+ if (num_callbacks == (open_cnt * 2)) { // graph is now fully expanded
+ return EXPECT_EQUAL(open_cnt * 2, verify_traversal(open_cnt + 1, expression));
+ }
+ }
+}
+
+TEST("require that traversal works as expected") {
+ EXPECT_TRUE(verify_expression_traversal("1"));
+ EXPECT_TRUE(verify_expression_traversal("1+2"));
+ EXPECT_TRUE(verify_expression_traversal("1+2*3-4/5"));
+ EXPECT_TRUE(verify_expression_traversal("if(x,1+2*3,[a,b,c]/5)"));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that node types can be checked") {
+ EXPECT_TRUE(nodes::check_type<nodes::Add>(Function::parse("1+2").root()));
+ EXPECT_TRUE(!nodes::check_type<nodes::Add>(Function::parse("1-2").root()));
+ EXPECT_TRUE(!nodes::check_type<nodes::Add>(Function::parse("1*2").root()));
+ EXPECT_TRUE(!nodes::check_type<nodes::Add>(Function::parse("1/2").root()));
+ EXPECT_TRUE((nodes::check_type<nodes::Add, nodes::Sub, nodes::Mul>(Function::parse("1+2").root())));
+ EXPECT_TRUE((nodes::check_type<nodes::Add, nodes::Sub, nodes::Mul>(Function::parse("1-2").root())));
+ EXPECT_TRUE((nodes::check_type<nodes::Add, nodes::Sub, nodes::Mul>(Function::parse("1*2").root())));
+ EXPECT_TRUE((!nodes::check_type<nodes::Add, nodes::Sub, nodes::Mul>(Function::parse("1/2").root())));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that parameter is param, but not const") {
+ EXPECT_TRUE(Function::parse("x").root().is_param());
+ EXPECT_TRUE(!Function::parse("x").root().is_const());
+}
+
+TEST("require that inverted parameter is not param") {
+ EXPECT_TRUE(!Function::parse("-x").root().is_param());
+}
+
+TEST("require that let references are not params") {
+ Function fun = Function::parse("let(foo,bar,foo)");
+ auto let = as<Let>(fun.root());
+ ASSERT_TRUE(let);
+ EXPECT_TRUE(let->value().is_param());
+ EXPECT_TRUE(!let->expr().is_param());
+}
+
+TEST("require that number is const, but not param") {
+ EXPECT_TRUE(Function::parse("123").root().is_const());
+ EXPECT_TRUE(!Function::parse("123").root().is_param());
+}
+
+TEST("require that string is const") {
+ EXPECT_TRUE(Function::parse("\"x\"").root().is_const());
+}
+
+TEST("require that array is const if all elements are const") {
+ EXPECT_TRUE(Function::parse("[1,2,3]").root().is_const());
+ EXPECT_TRUE(!Function::parse("[x,2,3]").root().is_const());
+ EXPECT_TRUE(!Function::parse("[1,y,3]").root().is_const());
+ EXPECT_TRUE(!Function::parse("[1,2,z]").root().is_const());
+ EXPECT_TRUE(!Function::parse("[x,y,z]").root().is_const());
+}
+
+TEST("require that neg is const if sub-expression is const") {
+ EXPECT_TRUE(Function::parse("-123").root().is_const());
+ EXPECT_TRUE(!Function::parse("-x").root().is_const());
+}
+
+TEST("require that not is const if sub-expression is const") {
+ EXPECT_TRUE(Function::parse("!1").root().is_const());
+ EXPECT_TRUE(!Function::parse("!x").root().is_const());
+}
+
+TEST("require that operators are cost if both children are const") {
+ EXPECT_TRUE(!Function::parse("x+y").root().is_const());
+ EXPECT_TRUE(!Function::parse("1+y").root().is_const());
+ EXPECT_TRUE(!Function::parse("x+2").root().is_const());
+ EXPECT_TRUE(Function::parse("1+2").root().is_const());
+}
+
+TEST("require that set membership is const only if array elements are const") {
+ EXPECT_TRUE(!Function::parse("x in [x,y,z]").root().is_const());
+ EXPECT_TRUE(!Function::parse("1 in [x,y,z]").root().is_const());
+ EXPECT_TRUE(!Function::parse("1 in [1,y,z]").root().is_const());
+ EXPECT_TRUE(Function::parse("1 in [1,2,3]").root().is_const());
+}
+
+TEST("require that calls are cost if all parameters are const") {
+ EXPECT_TRUE(!Function::parse("max(x,y)").root().is_const());
+ EXPECT_TRUE(!Function::parse("max(1,y)").root().is_const());
+ EXPECT_TRUE(!Function::parse("max(x,2)").root().is_const());
+ EXPECT_TRUE(Function::parse("max(1,2)").root().is_const());
+}
+
+TEST("require that const let is not const") {
+ EXPECT_TRUE(!Function::parse("let(a,1,a)").root().is_const());
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that feature less than constant is tree if children are trees or constants") {
+ EXPECT_TRUE(Function::parse("if (foo < 2, 3, 4)").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo < 2, if(bar < 3, 4, 5), 6)").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo < 2, if(bar < 3, 4, 5), if(baz < 6, 7, 8))").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo < 2, 3, if(baz < 4, 5, 6))").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo < max(1,2), 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (2 < foo, 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (foo < bar, 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (1 < 2, 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (foo <= 2, 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (foo == 2, 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (foo > 2, 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (foo >= 2, 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (foo ~= 2, 3, 4)").root().is_tree());
+}
+
+TEST("require that feature in set of constants is tree if children are trees or constants") {
+ EXPECT_TRUE(Function::parse("if (foo in [1, 2], 3, 4)").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo in [1, 2], if(bar < 3, 4, 5), 6)").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo in [1, 2], if(bar < 3, 4, 5), if(baz < 6, 7, 8))").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo in [1, 2], 3, if(baz < 4, 5, 6))").root().is_tree());
+ EXPECT_TRUE(Function::parse("if (foo in [min(1,2), max(1,2)], 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (1 in [1, 2], 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (1 in [foo, 2], 3, 4)").root().is_tree());
+ EXPECT_TRUE(!Function::parse("if (foo in [bar, 2], 3, 4)").root().is_tree());
+}
+
+TEST("require that sums of trees and forests are forests") {
+ EXPECT_TRUE(Function::parse("if(foo<1,2,3) + if(bar<4,5,6)").root().is_forest());
+ EXPECT_TRUE(Function::parse("if(foo<1,2,3) + if(bar<4,5,6) + if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) + 10").root().is_forest());
+ EXPECT_TRUE(!Function::parse("10 + if(bar<4,5,6)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) - if(bar<4,5,6)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) * if(bar<4,5,6)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) / if(bar<4,5,6)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) ^ if(bar<4,5,6)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) - if(bar<4,5,6) + if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) * if(bar<4,5,6) + if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) / if(bar<4,5,6) + if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) ^ if(bar<4,5,6) + if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) + if(bar<4,5,6) - if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) + if(bar<4,5,6) * if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) + if(bar<4,5,6) / if(bar<7,8,9)").root().is_forest());
+ EXPECT_TRUE(!Function::parse("if(foo<1,2,3) + if(bar<4,5,6) ^ if(bar<7,8,9)").root().is_forest());
+}
+
+//-----------------------------------------------------------------------------
+
+struct UnWrapped {
+ vespalib::string wrapper;
+ vespalib::string body;
+ vespalib::string error;
+};
+
+UnWrapped unwrap(const vespalib::string &str) {
+ UnWrapped result;
+ bool ok = Function::unwrap(str, result.wrapper, result.body, result.error);
+ EXPECT_EQUAL(ok, result.error.empty());
+ return result;
+}
+
+TEST("require that unwrapping works") {
+ EXPECT_EQUAL("max", unwrap("max(x+y)").wrapper);
+ EXPECT_EQUAL("max", unwrap(" max(x+y)").wrapper);
+ EXPECT_EQUAL("max", unwrap(" max (x+y)").wrapper);
+ EXPECT_EQUAL("x+y", unwrap("max(x+y)").body);
+ EXPECT_EQUAL("x+y", unwrap("max(x+y) ").body);
+ EXPECT_EQUAL("max", unwrap("max()").wrapper);
+ EXPECT_EQUAL("", unwrap("max()").body);
+ EXPECT_EQUAL("", unwrap("max()").error);
+ EXPECT_EQUAL("could not extract wrapper name", unwrap("").error);
+ EXPECT_EQUAL("could not extract wrapper name", unwrap("(x+y)").error);
+ EXPECT_EQUAL("could not extract wrapper name", unwrap(" (x+y)").error);
+ EXPECT_EQUAL("could not match opening '('", unwrap("max").error);
+ EXPECT_EQUAL("could not match opening '('", unwrap("max)").error);
+ EXPECT_EQUAL("could not match opening '('", unwrap("max5(x+y)").error);
+ EXPECT_EQUAL("could not match opening '('", unwrap("max)x+y(").error);
+ EXPECT_EQUAL("could not match closing ')'", unwrap("max(x+y").error);
+ EXPECT_EQUAL("could not match closing ')'", unwrap("max(x+y)x").error);
+ EXPECT_EQUAL("could not match closing ')'", unwrap("max(").error);
+}
+
+//-----------------------------------------------------------------------------
+
+struct MySymbolExtractor : SymbolExtractor {
+ std::vector<char> extra;
+ mutable size_t invoke_count;
+ bool is_extra(char c) const {
+ for (char extra_char: extra) {
+ if (c == extra_char) {
+ return true;
+ }
+ }
+ return false;
+ }
+ MySymbolExtractor() : extra(), invoke_count() {}
+ explicit MySymbolExtractor(std::initializer_list<char> extra_in) : extra(extra_in), invoke_count() {}
+ virtual void extract_symbol(const char *pos_in, const char *end_in,
+ const char *&pos_out, vespalib::string &symbol_out) const
+ {
+ ++invoke_count;
+ for (; pos_in < end_in; ++pos_in) {
+ char c = *pos_in;
+ if ((c >= 'a' && c <= 'z') || is_extra(c)) {
+ symbol_out.push_back(c);
+ } else {
+ break;
+ }
+ }
+ pos_out = pos_in;
+ }
+};
+
+TEST("require that custom symbol extractor may be used") {
+ EXPECT_EQUAL("[x+]...[missing value]...[*y]", Function::parse(params, "x+*y").dump());
+ EXPECT_EQUAL("[x+]...[missing value]...[*y]", Function::parse(params, "x+*y", MySymbolExtractor()).dump());
+ EXPECT_EQUAL("[x+]...[unknown symbol: 'x+']...[*y]", Function::parse(params, "x+*y", MySymbolExtractor({'+'})).dump());
+ EXPECT_EQUAL("[x+*y]...[unknown symbol: 'x+*y']...[]", Function::parse(params, "x+*y", MySymbolExtractor({'+', '*'})).dump());
+}
+
+TEST("require that unknown function works as expected with custom symbol extractor") {
+ EXPECT_EQUAL("[bogus(]...[unknown function: 'bogus']...[x)+y]", Function::parse(params, "bogus(x)+y").dump());
+ EXPECT_EQUAL("[bogus]...[unknown symbol: 'bogus']...[(x)+y]", Function::parse(params, "bogus(x)+y", MySymbolExtractor()).dump());
+ EXPECT_EQUAL("[bogus(x)]...[unknown symbol: 'bogus(x)']...[+y]", Function::parse(params, "bogus(x)+y", MySymbolExtractor({'(', ')'})).dump());
+}
+
+TEST("require that unknown function that is valid parameter works as expected with custom symbol extractor") {
+ EXPECT_EQUAL("[z(]...[unknown function: 'z']...[x)+y]", Function::parse(params, "z(x)+y").dump());
+ EXPECT_EQUAL("[z]...[invalid operator: '(']...[(x)+y]", Function::parse(params, "z(x)+y", MySymbolExtractor()).dump());
+ EXPECT_EQUAL("[z(x)]...[unknown symbol: 'z(x)']...[+y]", Function::parse(params, "z(x)+y", MySymbolExtractor({'(', ')'})).dump());
+}
+
+TEST("require that custom symbol extractor is only invoked for tokens that must be parameters") {
+ MySymbolExtractor my_extractor;
+ EXPECT_EQUAL(0u, Function::parse("max(1,2)", my_extractor).num_params());
+ EXPECT_EQUAL(0u, Function::parse("max(let(a,1,a),2)", my_extractor).num_params());
+ ASSERT_EQUAL(1u, Function::parse("max(let(a,1,b),2)", my_extractor).num_params());
+ EXPECT_EQUAL(1u, my_extractor.invoke_count);
+ EXPECT_EQUAL("b", Function::parse("max(let(a,1,b),2)", my_extractor).param_name(0));
+ EXPECT_EQUAL(2u, my_extractor.invoke_count);
+ EXPECT_EQUAL("[bogus]...[invalid operator: '(']...[(1,2)]", Function::parse("bogus(1,2)", my_extractor).dump());
+ EXPECT_EQUAL(3u, my_extractor.invoke_count);
+}
+
+//-----------------------------------------------------------------------------
+
+void verify_error(const vespalib::string &expr, const vespalib::string &expected_error) {
+ Function function = Function::parse(params, expr);
+ EXPECT_TRUE(function.has_error());
+ EXPECT_EQUAL(expected_error, function.get_error());
+}
+
+TEST("require that valid function does not report parse error") {
+ Function function = Function::parse(params, "x + y");
+ EXPECT_TRUE(!function.has_error());
+ EXPECT_EQUAL("", function.get_error());
+}
+
+TEST("require that an invalid function with explicit paramers retain its parameters") {
+ Function function = Function::parse({"x", "y"}, "x & y");
+ EXPECT_TRUE(function.has_error());
+ ASSERT_EQUAL(2u, function.num_params());
+ ASSERT_EQUAL("x", function.param_name(0));
+ ASSERT_EQUAL("y", function.param_name(1));
+}
+
+TEST("require that an invalid function with implicit paramers has no parameters") {
+ Function function = Function::parse("x & y");
+ EXPECT_TRUE(function.has_error());
+ EXPECT_EQUAL(0u, function.num_params());
+}
+
+TEST("require that unknown operator gives parse error") {
+ verify_error("x&y", "[x]...[invalid operator: '&']...[&y]");
+}
+
+TEST("require that unknown symbol gives parse error") {
+ verify_error("x+a", "[x+a]...[unknown symbol: 'a']...[]");
+}
+
+TEST("require that missing value gives parse error") {
+ verify_error("x+", "[x+]...[missing value]...[]");
+ verify_error("x++y", "[x+]...[missing value]...[+y]");
+ verify_error("x+++y", "[x+]...[missing value]...[++y]");
+ verify_error("x+(y+)+z", "[x+(y+]...[missing value]...[)+z]");
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that tensors can be parsed") {
+ EXPECT_EQUAL("{}", Function::parse("{}").dump());
+ EXPECT_EQUAL("{{}:1}", Function::parse("{{}:1}").dump());
+ EXPECT_EQUAL("{{a:1}:1}", Function::parse("{{a:1}:1}").dump());
+ EXPECT_EQUAL("{{a:1}:1,{a:2}:2}", Function::parse("{{a:1}:1,{a:2}:2}").dump());
+ EXPECT_EQUAL("{{a:1,b:1}:1,{a:2}:2}", Function::parse("{{a:1,b:1}:1,{a:2}:2}").dump());
+ EXPECT_EQUAL("{{a:1,b:1}:-1.5,{a:2}:-2.5}", Function::parse("{{a:1,b:1}:-1.5,{a:2}:-2.5}").dump());
+ EXPECT_EQUAL("{{a:1,b:1}:1,{a:2}:2}", Function::parse(" { { a : 1 , b : 1 } : 1 , { a : 2 } : 2 } ").dump());
+}
+
+TEST("require that tensor sum can be parsed") {
+ EXPECT_EQUAL("sum({{a:1}:1})", Function::parse("sum({{a:1}:1})").dump());
+ EXPECT_EQUAL("sum({{a:1}:1},dim)", Function::parse("sum({{a:1}:1},dim)").dump());
+ EXPECT_EQUAL("sum({{a:1}:1},dim)", Function::parse(params, "sum({{a:1}:1},dim)").dump());
+ EXPECT_EQUAL("sum({{a:1}:1})", Function::parse(" sum ( {{a:1}:1} ) ").dump());
+ EXPECT_EQUAL("sum({{a:1}:1},dim)", Function::parse(" sum ( {{a:1}:1} , dim ) ").dump());
+}
+
+TEST("require that tensor match can be parsed") {
+ EXPECT_EQUAL("match({{a:1}:1},{{a:1}:2})", Function::parse("match({{a:1}:1},{{a:1}:2})").dump());
+ EXPECT_EQUAL("match({{a:1}:1},{{a:1}:2})", Function::parse(" match ( {{a:1}:1} , {{a:1}:2} ) ").dump());
+}
+
+TEST("require that tensor operations can be nested") {
+ EXPECT_EQUAL("sum(sum(match({{a:1}:1},{{a:1}:2}),a))",
+ Function::parse("sum(sum(match({{a:1}:1},{{a:1}:2}),a))").dump());
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/function_speed/.gitignore b/vespalib/src/tests/eval/function_speed/.gitignore
new file mode 100644
index 00000000000..f9516af310f
--- /dev/null
+++ b/vespalib/src/tests/eval/function_speed/.gitignore
@@ -0,0 +1 @@
+vespalib_function_speed_test_app
diff --git a/vespalib/src/tests/eval/function_speed/CMakeLists.txt b/vespalib/src/tests/eval/function_speed/CMakeLists.txt
new file mode 100644
index 00000000000..2c062118136
--- /dev/null
+++ b/vespalib/src/tests/eval/function_speed/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_function_speed_test_app
+ SOURCES
+ function_speed_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_function_speed_test_app NO_VALGRIND COMMAND vespalib_function_speed_test_app)
diff --git a/vespalib/src/tests/eval/function_speed/function_speed_test.cpp b/vespalib/src/tests/eval/function_speed/function_speed_test.cpp
new file mode 100644
index 00000000000..784cfb157df
--- /dev/null
+++ b/vespalib/src/tests/eval/function_speed/function_speed_test.cpp
@@ -0,0 +1,132 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/compiled_function.h>
+#include <vespa/vespalib/util/benchmark_timer.h>
+#include <vespa/vespalib/eval/interpreted_function.h>
+
+using namespace vespalib::eval;
+
+std::vector<vespalib::string> params_5({"p", "o", "q", "f", "w"});
+
+double sum_sum = 0.0;
+
+const char *function_str = "(0.35*p + 0.15*o + 0.30*q + 0.20*f) * w";
+Function function_ast = Function::parse(params_5, function_str);
+InterpretedFunction interpreted_function(SimpleTensorEngine::ref(), function_ast);
+CompiledFunction compiled_function(function_ast, PassParams::SEPARATE);
+auto jit_function = compiled_function.get_function<5>();
+
+double gcc_function(double p, double o, double q, double f, double w) {
+ return (0.35*p + 0.15*o + 0.30*q + 0.20*f) * w;
+}
+
+InterpretedFunction::Context icontext;
+
+double interpret_function(double p, double o, double q, double f, double w) {
+ icontext.clear_params();
+ icontext.add_param(p);
+ icontext.add_param(o);
+ icontext.add_param(q);
+ icontext.add_param(f);
+ icontext.add_param(w);
+ return interpreted_function.eval(icontext).as_double();
+}
+
+//-----------------------------------------------------------------------------
+
+const char *big_function_str = "(0.35*p + 0.15*o + 0.30*q + 0.20*f) * w + "
+ "(0.35*p + 0.15*o + 0.30*q + 0.20*f) * w + "
+ "(0.35*p + 0.15*o + 0.30*q + 0.20*f) * w + "
+ "(0.35*p + 0.15*o + 0.30*q + 0.20*f) * w";
+
+Function big_function_ast = Function::parse(params_5, big_function_str);
+InterpretedFunction big_interpreted_function(SimpleTensorEngine::ref(), big_function_ast);
+CompiledFunction big_compiled_function(big_function_ast, PassParams::SEPARATE);
+auto big_jit_function = big_compiled_function.get_function<5>();
+
+double big_gcc_function(double p, double o, double q, double f, double w) {
+ return (0.35*p + 0.15*o + 0.30*q + 0.20*f) * w +
+ (0.35*p + 0.15*o + 0.30*q + 0.20*f) * w +
+ (0.35*p + 0.15*o + 0.30*q + 0.20*f) * w +
+ (0.35*p + 0.15*o + 0.30*q + 0.20*f) * w;
+}
+
+InterpretedFunction::Context big_icontext;
+
+double big_interpret_function(double p, double o, double q, double f, double w) {
+ big_icontext.clear_params();
+ big_icontext.add_param(p);
+ big_icontext.add_param(o);
+ big_icontext.add_param(q);
+ big_icontext.add_param(f);
+ big_icontext.add_param(w);
+ return big_interpreted_function.eval(big_icontext).as_double();
+}
+
+//-----------------------------------------------------------------------------
+
+double measure_best(CompiledFunction::expand<5>::type function) {
+ double sum = 0.0;
+ vespalib::BenchmarkTimer timer(1.0);
+ while (timer.has_budget()) {
+ timer.before();
+ for (int p = 0; p < 10; ++p) {
+ for (int o = 0; o < 10; ++o) {
+ for (int q = 0; q < 10; ++q) {
+ for (int f = 0; f < 10; ++f) {
+ for (int w = 0; w < 10; ++w) {
+ sum += function(p, o, q, f, w);
+ }
+ }
+ }
+ }
+ }
+ timer.after();
+ }
+ return (timer.min_time() * 1000.0);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that small functions return the same result") {
+ EXPECT_EQUAL(interpret_function(1,2,3,4,5), jit_function(1,2,3,4,5));
+ EXPECT_EQUAL(interpret_function(1,2,3,4,5), gcc_function(1,2,3,4,5));
+ EXPECT_EQUAL(interpret_function(5,4,3,2,1), jit_function(5,4,3,2,1));
+ EXPECT_EQUAL(interpret_function(5,4,3,2,1), gcc_function(5,4,3,2,1));
+}
+
+TEST("require that big functions return the same result") {
+ EXPECT_EQUAL(big_interpret_function(1,2,3,4,5), big_jit_function(1,2,3,4,5));
+ EXPECT_EQUAL(big_interpret_function(1,2,3,4,5), big_gcc_function(1,2,3,4,5));
+ EXPECT_EQUAL(big_interpret_function(5,4,3,2,1), big_jit_function(5,4,3,2,1));
+ EXPECT_EQUAL(big_interpret_function(5,4,3,2,1), big_gcc_function(5,4,3,2,1));
+}
+
+TEST("measure small function eval/jit/gcc speed") {
+ double interpret_time = measure_best(interpret_function);
+ double jit_time = measure_best(jit_function);
+ double gcc_time = measure_best(gcc_function);
+ double jit_vs_interpret_speed = (1.0/jit_time)/(1.0/interpret_time);
+ double gcc_vs_jit_speed = (1.0/gcc_time)/(1.0/jit_time);
+ fprintf(stderr, "interpret: %g ms\n", interpret_time);
+ fprintf(stderr, "jit compiled: %g ms\n", jit_time);
+ fprintf(stderr, "gcc compiled: %g ms\n", gcc_time);
+ fprintf(stderr, "jit speed compared to interpret: %g\n", jit_vs_interpret_speed);
+ fprintf(stderr, "gcc speed compared to jit: %g\n", gcc_vs_jit_speed);
+}
+
+TEST("measure big function eval/jit/gcc speed") {
+ double interpret_time = measure_best(big_interpret_function);
+ double jit_time = measure_best(big_jit_function);
+ double gcc_time = measure_best(big_gcc_function);
+ double jit_vs_interpret_speed = (1.0/jit_time)/(1.0/interpret_time);
+ double gcc_vs_jit_speed = (1.0/gcc_time)/(1.0/jit_time);
+ fprintf(stderr, "interpret: %g ms\n", interpret_time);
+ fprintf(stderr, "jit compiled: %g ms\n", jit_time);
+ fprintf(stderr, "gcc compiled: %g ms\n", gcc_time);
+ fprintf(stderr, "jit speed compared to interpret: %g\n", jit_vs_interpret_speed);
+ fprintf(stderr, "gcc speed compared to jit: %g\n", gcc_vs_jit_speed);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/gbdt/.gitignore b/vespalib/src/tests/eval/gbdt/.gitignore
new file mode 100644
index 00000000000..f2a7b65c2aa
--- /dev/null
+++ b/vespalib/src/tests/eval/gbdt/.gitignore
@@ -0,0 +1,3 @@
+/gbdt_benchmark
+vespalib_gbdt_test_app
+vespalib_gbdt_benchmark_app
diff --git a/vespalib/src/tests/eval/gbdt/CMakeLists.txt b/vespalib/src/tests/eval/gbdt/CMakeLists.txt
new file mode 100644
index 00000000000..b6328900258
--- /dev/null
+++ b/vespalib/src/tests/eval/gbdt/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_gbdt_test_app
+ SOURCES
+ gbdt_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_gbdt_test_app COMMAND vespalib_gbdt_test_app)
+vespa_add_executable(vespalib_gbdt_benchmark_app
+ SOURCES
+ gbdt_benchmark.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_gbdt_benchmark_app COMMAND vespalib_gbdt_benchmark_app BENCHMARK)
diff --git a/vespalib/src/tests/eval/gbdt/gbdt_benchmark.cpp b/vespalib/src/tests/eval/gbdt/gbdt_benchmark.cpp
new file mode 100644
index 00000000000..d1dacc39813
--- /dev/null
+++ b/vespalib/src/tests/eval/gbdt/gbdt_benchmark.cpp
@@ -0,0 +1,277 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/gbdt.h>
+#include <vespa/vespalib/eval/vm_forest.h>
+#include <vespa/vespalib/eval/deinline_forest.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/compiled_function.h>
+#include <vespa/vespalib/util/benchmark_timer.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include "model.cpp"
+
+using namespace vespalib::eval;
+using namespace vespalib::eval::nodes;
+using namespace vespalib::eval::gbdt;
+
+//-----------------------------------------------------------------------------
+
+struct CompileStrategy {
+ virtual const char *name() const = 0;
+ virtual const char *code_name() const = 0;
+ virtual CompiledFunction compile(const Function &function) const = 0;
+ bool is_same(const CompileStrategy &rhs) const {
+ return (this == &rhs);
+ }
+ virtual ~CompileStrategy() {}
+};
+
+struct NullStrategy : CompileStrategy {
+ virtual const char *name() const {
+ return "none";
+ }
+ virtual const char *code_name() const {
+ return "Optimize::none";
+ }
+ virtual CompiledFunction compile(const Function &function) const {
+ return CompiledFunction(function, PassParams::ARRAY, Optimize::none);
+ }
+};
+NullStrategy none;
+
+struct VMForestStrategy : CompileStrategy {
+ virtual const char *name() const {
+ return "vm-forest";
+ }
+ virtual const char *code_name() const {
+ return "VMForest::optimize_chain";
+ }
+ virtual CompiledFunction compile(const Function &function) const {
+ return CompiledFunction(function, PassParams::ARRAY, VMForest::optimize_chain);
+ }
+};
+VMForestStrategy vm_forest;
+
+struct DeinlineForestStrategy : CompileStrategy {
+ virtual const char *name() const {
+ return "deinline-forest";
+ }
+ virtual const char *code_name() const {
+ return "DeinlineForest::optimize_chain";
+ }
+ virtual CompiledFunction compile(const Function &function) const {
+ return CompiledFunction(function, PassParams::ARRAY, DeinlineForest::optimize_chain);
+ }
+};
+DeinlineForestStrategy deinline_forest;
+
+//-----------------------------------------------------------------------------
+
+struct Option {
+ size_t id;
+ const CompileStrategy &strategy;
+ bool is_same(const Option &rhs) const { return strategy.is_same(rhs.strategy); }
+ const char *name() const { return strategy.name(); }
+ CompiledFunction compile(const Function &function) const { return strategy.compile(function); }
+ const char *code_name() const { return strategy.code_name(); }
+};
+
+std::vector<Option> all_options({{0, none},{1, vm_forest}});
+
+//-----------------------------------------------------------------------------
+
+struct Result {
+ double us;
+ size_t opt_idx;
+ bool operator<(const Result &rhs) {
+ return (us < rhs.us);
+ }
+};
+
+struct Segment {
+ double min;
+ Option option;
+ vespalib::string build() const {
+ return vespalib::make_string("{%g, %zu}", min, option.id);
+ }
+};
+
+struct Plan {
+ std::vector<Segment> segments;
+ void add(const Segment &seg) {
+ if (segments.empty()) {
+ segments.push_back(seg);
+ } else {
+ if (!segments.back().option.is_same(seg.option)) {
+ segments.push_back(seg);
+ }
+ }
+ }
+ vespalib::string build() const {
+ vespalib::string plan;
+ plan.append("{");
+ for (size_t i = 0; i < segments.size(); ++i) {
+ if (i > 0) {
+ plan.append(", ");
+ }
+ plan += segments[i].build();
+ }
+ plan.append("}");
+ return plan;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+bool crop(const std::vector<Option> &options, const Option &opt, size_t &end) {
+ for (size_t i = 0; i < end; ++i) {
+ if (options[i].is_same(opt)) {
+ end = i;
+ return true;
+ }
+ }
+ return false;
+}
+
+std::vector<Option> keep_contested(const std::vector<Option> &a,
+ const std::vector<Option> &b)
+{
+ size_t end = b.size();
+ std::vector<Option> ret;
+ for (size_t i = 0; (i < a.size()) && (end > 0); ++i) {
+ if (crop(b, a[i], end)) {
+ ret.push_back(a[i]);
+ }
+ }
+ return ret;
+}
+
+std::vector<Option> find_order(const ForestParams &params,
+ const std::vector<Option> &options,
+ size_t num_trees)
+{
+ std::vector<Result> results;
+ Function forest = make_forest(params, num_trees);
+ for (size_t i = 0; i < options.size(); ++i) {
+ CompiledFunction compiled_function = options[i].compile(forest);
+ std::vector<double> inputs(compiled_function.num_params(), 0.5);
+ results.push_back({compiled_function.estimate_cost_us(inputs), i});
+ fprintf(stderr, " %20s@%6zu: %16g us (inputs: %zu)\n",
+ options[i].name(), num_trees, results.back().us,
+ inputs.size());
+ }
+ std::sort(results.begin(), results.end());
+ std::vector<Option> ret;
+ for (auto result: results) {
+ ret.push_back(options[result.opt_idx]);
+ }
+ return ret;
+}
+
+double expected_path(const ForestParams &params, size_t num_trees) {
+ return ForestStats(extract_trees(make_forest(params, num_trees).root())).total_expected_path_length;
+}
+
+void explore_segment(const ForestParams &params,
+ const std::vector<Option> &min_order,
+ const std::vector<Option> &max_order,
+ size_t min_trees, size_t max_trees,
+ Plan &plan_out)
+{
+ assert(min_trees != max_trees);
+ std::vector<Option> options = keep_contested(min_order, max_order);
+ assert(!options.empty());
+ if (options.size() == 1) {
+ plan_out.add(Segment{expected_path(params, min_trees), options[0]});
+ } else {
+ if ((max_trees - min_trees) == 1) {
+ plan_out.add(Segment{expected_path(params, min_trees), min_order[0]});
+ plan_out.add(Segment{expected_path(params, max_trees), max_order[0]});
+ } else {
+ size_t num_trees = (min_trees + max_trees) / 2;
+ std::vector<Option> order = find_order(params, options, num_trees);
+ explore_segment(params, min_order, order, min_trees, num_trees, plan_out);
+ explore_segment(params, order, max_order, num_trees, max_trees, plan_out);
+ }
+ }
+}
+
+Plan find_plan(const ForestParams &params, std::initializer_list<size_t> limits) {
+ Plan plan;
+ auto num_trees = limits.begin();
+ size_t min_trees = *num_trees++;
+ std::vector<Option> min_order = find_order(params, all_options, min_trees);
+ while (num_trees != limits.end()) {
+ size_t max_trees = *num_trees++;
+ std::vector<Option> max_order = find_order(params, all_options, max_trees);
+ explore_segment(params, min_order, max_order, min_trees, max_trees, plan);
+ std::swap(min_trees, max_trees);
+ std::swap(min_order, max_order);
+ }
+ return plan;
+}
+
+//-----------------------------------------------------------------------------
+
+void dump_options(const std::vector<Option> &options) {
+ fprintf(stdout, "std::vector<Optimize::Chain> options({");
+ for (size_t i = 0; i < options.size(); ++i) {
+ if (i > 0) {
+ fprintf(stdout, ", ");
+ }
+ fprintf(stdout, "%s", options[i].code_name());
+ }
+ fprintf(stdout, "});\n");
+ fflush(stdout);
+}
+
+void dump_param_values(const char *name, const std::vector<size_t> &values) {
+ fprintf(stdout, "std::vector<size_t> %s({", name);
+ for (size_t i = 0; i < values.size(); ++i) {
+ if (i > 0) {
+ fprintf(stdout, ", ");
+ }
+ fprintf(stdout, "%zu", values[i]);
+ }
+ fprintf(stdout, "});\n");
+ fflush(stdout);
+}
+
+void dump_plan(const ForestParams &params, const Plan &plan) {
+ fprintf(stdout, "{{%zu, %zu}, %s}",
+ params.less_percent, params.tree_size,
+ plan.build().c_str());
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("find optimization plans") {
+ std::vector<size_t> less_percent_values({90, 100});
+ std::vector<size_t> tree_size_values(
+ {2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16,
+ 18, 20, 22, 24, 26, 28, 30, 32,
+ 36, 40, 44, 48, 52, 56, 60, 64,
+ 72, 80, 88, 96, 104, 112, 120, 128});
+
+ dump_options(all_options);
+ dump_param_values("less_percent_values", less_percent_values);
+ dump_param_values("tree_size_values", tree_size_values);
+
+ size_t num_plans = 0;
+ fprintf(stdout, "std::map<Params,Plan> plan_repo({");
+ for (size_t less_percent: less_percent_values) {
+ for (size_t tree_size: tree_size_values) {
+ ForestParams params(1234u, less_percent, tree_size);
+ fprintf(stdout, "%s\n", (num_plans++ == 0) ? "" : ",");
+ fflush(stdout);
+ fprintf(stdout, " ");
+ Plan plan = find_plan(params, {8, 512});
+ dump_plan(params, plan);
+ }
+ }
+ fprintf(stdout, "});\n");
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/gbdt/gbdt_test.cpp b/vespalib/src/tests/eval/gbdt/gbdt_test.cpp
new file mode 100644
index 00000000000..c5643abfd85
--- /dev/null
+++ b/vespalib/src/tests/eval/gbdt/gbdt_test.cpp
@@ -0,0 +1,256 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/gbdt.h>
+#include <vespa/vespalib/eval/vm_forest.h>
+#include <vespa/vespalib/eval/deinline_forest.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/interpreted_function.h>
+#include <vespa/vespalib/eval/compiled_function.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include "model.cpp"
+
+using namespace vespalib::eval;
+using namespace vespalib::eval::nodes;
+using namespace vespalib::eval::gbdt;
+
+//-----------------------------------------------------------------------------
+
+double eval_double(const Function &function, const std::vector<double> &params) {
+ InterpretedFunction ifun(SimpleTensorEngine::ref(), function);
+ InterpretedFunction::Context ctx;
+ for (double param: params) {
+ ctx.add_param(param);
+ }
+ return ifun.eval(ctx).as_double();
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that tree stats can be calculated") {
+ for (size_t tree_size = 2; tree_size < 64; ++tree_size) {
+ EXPECT_EQUAL(tree_size, TreeStats(Function::parse(Model().make_tree(tree_size)).root()).size);
+ }
+
+ TreeStats stats1(Function::parse("if((a<1),1.0,if((b in [1,2,3]),if((c in 1),2.0,3.0),4.0))").root());
+ EXPECT_EQUAL(4u, stats1.size);
+ EXPECT_EQUAL(1u, stats1.num_less_checks);
+ EXPECT_EQUAL(2u, stats1.num_in_checks);
+ EXPECT_EQUAL(3u, stats1.max_set_size);
+
+ TreeStats stats2(Function::parse("if((d in 1),10.0,if((e<1),20.0,30.0))").root());
+ EXPECT_EQUAL(3u, stats2.size);
+ EXPECT_EQUAL(1u, stats2.num_less_checks);
+ EXPECT_EQUAL(1u, stats2.num_in_checks);
+ EXPECT_EQUAL(1u, stats2.max_set_size);
+}
+
+TEST("require that trees can be extracted from forest") {
+ for (size_t tree_size = 10; tree_size < 20; ++tree_size) {
+ for (size_t forest_size = 10; forest_size < 20; ++forest_size) {
+ vespalib::string expression = Model().make_forest(forest_size, tree_size);
+ Function function = Function::parse(expression);
+ std::vector<const Node *> trees = extract_trees(function.root());
+ EXPECT_EQUAL(forest_size, trees.size());
+ for (const Node *tree: trees) {
+ EXPECT_EQUAL(tree_size, TreeStats(*tree).size);
+ }
+ }
+ }
+}
+
+TEST("require that forest stats can be calculated") {
+ Function function = Function::parse("if((a<1),1.0,if((b in [1,2,3]),if((c in 1),2.0,3.0),4.0))+"
+ "if((d in 1),10.0,if((e<1),20.0,30.0))+"
+ "if((d in 1),10.0,if((e<1),20.0,30.0))");
+ std::vector<const Node *> trees = extract_trees(function.root());
+ ForestStats stats(trees);
+ EXPECT_EQUAL(3u, stats.num_trees);
+ EXPECT_EQUAL(10u, stats.total_size);
+ ASSERT_EQUAL(2u, stats.tree_sizes.size());
+ EXPECT_EQUAL(3u, stats.tree_sizes[0].size);
+ EXPECT_EQUAL(2u, stats.tree_sizes[0].count);
+ EXPECT_EQUAL(4u, stats.tree_sizes[1].size);
+ EXPECT_EQUAL(1u, stats.tree_sizes[1].count);
+ EXPECT_EQUAL(3u, stats.total_less_checks);
+ EXPECT_EQUAL(4u, stats.total_in_checks);
+ EXPECT_EQUAL(3u, stats.max_set_size);
+}
+
+double expected_path(const vespalib::string &forest) {
+ return ForestStats(extract_trees(Function::parse(forest).root())).total_expected_path_length;
+}
+
+TEST("require that expected path length is calculated correctly") {
+ EXPECT_EQUAL(0.0, expected_path("1"));
+ EXPECT_EQUAL(0.0, expected_path("if(1,2,3)"));
+ EXPECT_EQUAL(1.0, expected_path("if(a<1,2,3)"));
+ EXPECT_EQUAL(1.0, expected_path("if(b in [1,2,3],2,3)"));
+ EXPECT_EQUAL(2.0, expected_path("if(a<1,2,3)+if(a<1,2,3)"));
+ EXPECT_EQUAL(3.0, expected_path("if(a<1,2,3)+if(a<1,2,3)+if(a<1,2,3)"));
+ EXPECT_EQUAL(0.50*1.0 + 0.50*2.0, expected_path("if(a<1,1,if(a<1,2,3))"));
+ EXPECT_EQUAL(0.25*1.0 + 0.75*2.0, expected_path("if(a<1,1,if(a<1,2,3),0.25)"));
+ EXPECT_EQUAL(0.75*1.0 + 0.25*2.0, expected_path("if(a<1,1,if(a<1,2,3),0.75)"));
+}
+
+double average_path(const vespalib::string &forest) {
+ return ForestStats(extract_trees(Function::parse(forest).root())).total_average_path_length;
+}
+
+TEST("require that average path length is calculated correctly") {
+ EXPECT_EQUAL(0.0, average_path("1"));
+ EXPECT_EQUAL(0.0, average_path("if(1,2,3)"));
+ EXPECT_EQUAL(1.0, average_path("if(a<1,2,3)"));
+ EXPECT_EQUAL(1.0, average_path("if(b in [1,2,3],2,3)"));
+ EXPECT_EQUAL(2.0, average_path("if(a<1,2,3)+if(a<1,2,3)"));
+ EXPECT_EQUAL(3.0, average_path("if(a<1,2,3)+if(a<1,2,3)+if(a<1,2,3)"));
+ EXPECT_EQUAL(5.0/3.0, average_path("if(a<1,1,if(a<1,2,3))"));
+ EXPECT_EQUAL(5.0/3.0, average_path("if(a<1,1,if(a<1,2,3),0.25)"));
+ EXPECT_EQUAL(5.0/3.0, average_path("if(a<1,1,if(a<1,2,3),0.75)"));
+}
+
+double count_tuned(const vespalib::string &forest) {
+ return ForestStats(extract_trees(Function::parse(forest).root())).total_tuned_checks;
+}
+
+TEST("require that tuned checks are counted correctly") {
+ EXPECT_EQUAL(0.0, count_tuned("if(a<1,2,3)"));
+ EXPECT_EQUAL(0.0, count_tuned("if(a<1,2,3,0.5)")); // NB: no explicit tuned flag
+ EXPECT_EQUAL(1.0, count_tuned("if(a<1,2,3,0.3)"));
+ EXPECT_EQUAL(1.0, count_tuned("if(b in [1,2,3],2,3,0.8)"));
+ EXPECT_EQUAL(2.0, count_tuned("if(a<1,2,3,0.3)+if(a<1,2,3,0.8)"));
+ EXPECT_EQUAL(3.0, count_tuned("if(a<1,2,3,0.3)+if(a<1,2,3,0.4)+if(a<1,2,3,0.9)"));
+ EXPECT_EQUAL(1.0, count_tuned("if(a<1,1,if(a<1,2,3),0.25)"));
+ EXPECT_EQUAL(2.0, count_tuned("if(a<1,1,if(a<1,2,3,0.2),0.25)"));
+}
+
+//-----------------------------------------------------------------------------
+
+struct DummyForest1 : public Forest {
+ size_t num_trees;
+ explicit DummyForest1(size_t num_trees_in) : num_trees(num_trees_in) {}
+ static double eval(const Forest *forest, const double *) {
+ const DummyForest1 &self = *((const DummyForest1 *)forest);
+ return double(self.num_trees * 2);
+ }
+ static Optimize::Result optimize(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees)
+ {
+ if (stats.num_trees < 50) {
+ return Optimize::Result();
+ }
+ return Optimize::Result(Forest::UP(new DummyForest1(trees.size())), eval);
+ }
+};
+
+struct DummyForest2 : public Forest {
+ size_t num_trees;
+ explicit DummyForest2(size_t num_trees_in) : num_trees(num_trees_in) {}
+ static double eval(const Forest *forest, const double *) {
+ const DummyForest1 &self = *((const DummyForest1 *)forest);
+ return double(self.num_trees);
+ }
+ static Optimize::Result optimize(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees)
+ {
+ if (stats.num_trees < 25) {
+ return Optimize::Result();
+ }
+ return Optimize::Result(Forest::UP(new DummyForest2(trees.size())), eval);
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+TEST("require that trees can be optimized by a forest optimizer") {
+ Optimize::Chain chain({DummyForest1::optimize, DummyForest2::optimize});
+ size_t tree_size = 20;
+ for (size_t forest_size = 10; forest_size <= 100; forest_size += 10) {
+ vespalib::string expression = Model().make_forest(forest_size, tree_size);
+ Function function = Function::parse(expression);
+ CompiledFunction compiled_function(function, PassParams::ARRAY, chain);
+ std::vector<double> inputs(function.num_params(), 0.5);
+ if (forest_size < 25) {
+ EXPECT_EQUAL(eval_double(function, inputs), compiled_function.get_function()(&inputs[0]));
+ } else if (forest_size < 50) {
+ EXPECT_EQUAL(double(forest_size), compiled_function.get_function()(&inputs[0]));
+ } else {
+ EXPECT_EQUAL(double(2 * forest_size), compiled_function.get_function()(&inputs[0]));
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+Optimize::Chain less_only_vm_chain({VMForest::less_only_optimize});
+Optimize::Chain general_vm_chain({VMForest::general_optimize});
+
+TEST("require that less only VM tree optimizer works") {
+ Function function = Function::parse("if((a<1),1.0,if((b<1),if((c<1),2.0,3.0),4.0))+"
+ "if((d<1),10.0,if((e<1),if((f<1),20.0,30.0),40.0))");
+ CompiledFunction compiled_function(function, PassParams::SEPARATE, less_only_vm_chain);
+ auto f = compiled_function.get_function<6>();
+ EXPECT_EQUAL(11.0, f(0.5, 0.0, 0.0, 0.5, 0.0, 0.0));
+ EXPECT_EQUAL(22.0, f(1.5, 0.5, 0.5, 1.5, 0.5, 0.5));
+ EXPECT_EQUAL(33.0, f(1.5, 0.5, 1.5, 1.5, 0.5, 1.5));
+ EXPECT_EQUAL(44.0, f(1.5, 1.5, 0.0, 1.5, 1.5, 0.0));
+}
+
+TEST("require that models with in checks are rejected by less only vm optimizer") {
+ Function function = Function::parse(Model().less_percent(100).make_forest(300, 30));
+ auto trees = extract_trees(function.root());
+ ForestStats stats(trees);
+ EXPECT_TRUE(Optimize::apply_chain(less_only_vm_chain, stats, trees).valid());
+ stats.total_in_checks = 1;
+ EXPECT_TRUE(!Optimize::apply_chain(less_only_vm_chain, stats, trees).valid());
+}
+
+TEST("require that general VM tree optimizer works") {
+ Function function = Function::parse("if((a<1),1.0,if((b in [1,2,3]),if((c in 1),2.0,3.0),4.0))+"
+ "if((d in 1),10.0,if((e<1),if((f<1),20.0,30.0),40.0))");
+ CompiledFunction compiled_function(function, PassParams::SEPARATE, general_vm_chain);
+ auto f = compiled_function.get_function<6>();
+ EXPECT_EQUAL(11.0, f(0.5, 0.0, 0.0, 1.0, 0.0, 0.0));
+ EXPECT_EQUAL(22.0, f(1.5, 2.0, 1.0, 2.0, 0.5, 0.5));
+ EXPECT_EQUAL(33.0, f(1.5, 2.0, 2.0, 2.0, 0.5, 1.5));
+ EXPECT_EQUAL(44.0, f(1.5, 5.0, 0.0, 2.0, 1.5, 0.0));
+}
+
+TEST("require that models with too large sets are rejected by general vm optimizer") {
+ Function function = Function::parse(Model().less_percent(80).make_forest(300, 30));
+ auto trees = extract_trees(function.root());
+ ForestStats stats(trees);
+ EXPECT_TRUE(stats.total_in_checks > 0);
+ EXPECT_TRUE(Optimize::apply_chain(general_vm_chain, stats, trees).valid());
+ stats.max_set_size = 256;
+ EXPECT_TRUE(!Optimize::apply_chain(general_vm_chain, stats, trees).valid());
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that forests evaluate to approximately the same for all evaluation options") {
+ for (size_t tree_size: std::vector<size_t>({20})) {
+ for (size_t num_trees: std::vector<size_t>({50})) {
+ for (size_t less_percent: std::vector<size_t>({100, 80})) {
+ vespalib::string expression = Model().less_percent(less_percent).make_forest(num_trees, tree_size);
+ Function function = Function::parse(expression);
+ CompiledFunction none(function, PassParams::ARRAY, Optimize::none);
+ CompiledFunction deinline(function, PassParams::ARRAY, DeinlineForest::optimize_chain);
+ CompiledFunction vm_forest(function, PassParams::ARRAY, VMForest::optimize_chain);
+ EXPECT_EQUAL(0u, none.get_forests().size());
+ ASSERT_EQUAL(1u, deinline.get_forests().size());
+ EXPECT_TRUE(dynamic_cast<DeinlineForest*>(deinline.get_forests()[0].get()) != nullptr);
+ ASSERT_EQUAL(1u, vm_forest.get_forests().size());
+ EXPECT_TRUE(dynamic_cast<VMForest*>(vm_forest.get_forests()[0].get()) != nullptr);
+ std::vector<double> inputs(function.num_params(), 0.5);
+ double expected = eval_double(function, inputs);
+ EXPECT_APPROX(expected, none.get_function()(&inputs[0]), 1e-6);
+ EXPECT_APPROX(expected, deinline.get_function()(&inputs[0]), 1e-6);
+ EXPECT_APPROX(expected, vm_forest.get_function()(&inputs[0]), 1e-6);
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/gbdt/model.cpp b/vespalib/src/tests/eval/gbdt/model.cpp
new file mode 100644
index 00000000000..e125d9e77d2
--- /dev/null
+++ b/vespalib/src/tests/eval/gbdt/model.cpp
@@ -0,0 +1,99 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <random>
+#include <vespa/vespalib/eval/function.h>
+
+using vespalib::make_string;
+using vespalib::eval::Function;
+
+//-----------------------------------------------------------------------------
+
+class Model
+{
+private:
+ std::mt19937 _gen;
+ size_t _less_percent;
+
+ size_t get_int(size_t min, size_t max) {
+ std::uniform_int_distribution<size_t> dist(min, max);
+ return dist(_gen);
+ }
+
+ double get_real(double min, double max) {
+ std::uniform_real_distribution<double> dist(min, max);
+ return dist(_gen);
+ }
+
+ std::string make_feature_name() {
+ size_t max_feature = 2;
+ while ((max_feature < 1024) && (get_int(0, 99) < 50)) {
+ max_feature *= 2;
+ }
+ return make_string("feature_%zu", get_int(1, max_feature));
+ }
+
+ std::string make_cond() {
+ if (get_int(1,100) > _less_percent) {
+ return make_string("(%s in [%g,%g,%g])",
+ make_feature_name().c_str(),
+ get_int(0, 4) / 4.0,
+ get_int(0, 4) / 4.0,
+ get_int(0, 4) / 4.0);
+ } else {
+ return make_string("(%s<%g)",
+ make_feature_name().c_str(),
+ get_real(0.0, 1.0));
+ }
+ }
+
+public:
+ explicit Model(size_t seed = 5489u) : _gen(seed), _less_percent(80) {}
+
+ Model &less_percent(size_t value) {
+ _less_percent = value;
+ return *this;
+ }
+
+ std::string make_tree(size_t size) {
+ assert(size > 0);
+ if (size == 1) {
+ return make_string("%g", get_real(0.0, 1.0));
+ }
+ size_t pivot = get_int(1, size - 1);
+ return make_string("if(%s,%s,%s)",
+ make_cond().c_str(),
+ make_tree(pivot).c_str(),
+ make_tree(size - pivot).c_str());
+ }
+
+ std::string make_forest(size_t num_trees, size_t tree_sizes) {
+ assert(num_trees > 0);
+ vespalib::string forest = make_tree(tree_sizes);
+ for (size_t i = 1; i < num_trees; ++i) {
+ forest.append("+");
+ forest.append(make_tree(tree_sizes));
+ }
+ return forest;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+struct ForestParams {
+ size_t model_seed;
+ size_t less_percent;
+ size_t tree_size;
+ ForestParams(size_t model_seed_in, size_t less_percent_in, size_t tree_size_in)
+ : model_seed(model_seed_in), less_percent(less_percent_in), tree_size(tree_size_in) {}
+};
+
+//-----------------------------------------------------------------------------
+
+Function make_forest(const ForestParams &params, size_t num_trees) {
+ return Function::parse(Model(params.model_seed)
+ .less_percent(params.less_percent)
+ .make_forest(num_trees, params.tree_size));
+}
+
+//-----------------------------------------------------------------------------
diff --git a/vespalib/src/tests/eval/interpreted_function/.gitignore b/vespalib/src/tests/eval/interpreted_function/.gitignore
new file mode 100644
index 00000000000..0ac61ca2aa8
--- /dev/null
+++ b/vespalib/src/tests/eval/interpreted_function/.gitignore
@@ -0,0 +1 @@
+vespalib_interpreted_function_test_app
diff --git a/vespalib/src/tests/eval/interpreted_function/CMakeLists.txt b/vespalib/src/tests/eval/interpreted_function/CMakeLists.txt
new file mode 100644
index 00000000000..0a9010dff05
--- /dev/null
+++ b/vespalib/src/tests/eval/interpreted_function/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_interpreted_function_test_app
+ SOURCES
+ interpreted_function_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_interpreted_function_test_app COMMAND vespalib_interpreted_function_test_app)
diff --git a/vespalib/src/tests/eval/interpreted_function/FILES b/vespalib/src/tests/eval/interpreted_function/FILES
new file mode 100644
index 00000000000..e046bd3ff35
--- /dev/null
+++ b/vespalib/src/tests/eval/interpreted_function/FILES
@@ -0,0 +1 @@
+interpreted_function_test.cpp
diff --git a/vespalib/src/tests/eval/interpreted_function/interpreted_function_test.cpp b/vespalib/src/tests/eval/interpreted_function/interpreted_function_test.cpp
new file mode 100644
index 00000000000..aceb70f3136
--- /dev/null
+++ b/vespalib/src/tests/eval/interpreted_function/interpreted_function_test.cpp
@@ -0,0 +1,116 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/interpreted_function.h>
+#include <vespa/vespalib/eval/eval_spec.h>
+#include <vespa/vespalib/eval/basic_nodes.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/stash.h>
+
+using namespace vespalib::eval;
+using vespalib::Stash;
+
+//-----------------------------------------------------------------------------
+
+struct MyEvalTest : test::EvalSpec::EvalTest {
+ size_t pass_cnt = 0;
+ size_t fail_cnt = 0;
+ bool print_pass = false;
+ bool print_fail = false;
+ virtual void next_expression(const std::vector<vespalib::string> &,
+ const vespalib::string &) override {}
+ virtual void handle_case(const std::vector<vespalib::string> &param_names,
+ const std::vector<double> &param_values,
+ const vespalib::string &expression,
+ double expected_result) override
+ {
+ Function fun = Function::parse(param_names, expression);
+ EXPECT_EQUAL(fun.num_params(), param_values.size());
+ InterpretedFunction ifun(SimpleTensorEngine::ref(), fun);
+ InterpretedFunction::Context ictx;
+ for (double param: param_values) {
+ ictx.add_param(param);
+ }
+ const Value &result_value = ifun.eval(ictx);
+ double result = result_value.as_double();
+ if (result_value.is_double() && is_same(expected_result, result)) {
+ print_pass && fprintf(stderr, "verifying: %s -> %g ... PASS\n",
+ as_string(param_names, param_values, expression).c_str(),
+ expected_result);
+ ++pass_cnt;
+ } else {
+ print_fail && fprintf(stderr, "verifying: %s -> %g ... FAIL: got %g\n",
+ as_string(param_names, param_values, expression).c_str(),
+ expected_result, result);
+ ++fail_cnt;
+ }
+ }
+};
+
+TEST_FF("require that compiled evaluation passes all conformance tests", MyEvalTest(), test::EvalSpec()) {
+ f1.print_fail = true;
+ f2.add_all_cases();
+ f2.each_case(f1);
+ EXPECT_GREATER(f1.pass_cnt, 1000u);
+ EXPECT_EQUAL(0u, f1.fail_cnt);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that invalid function evaluates to a error") {
+ std::vector<vespalib::string> params({"x", "y", "z", "w"});
+ Function function = Function::parse(params, "x & y");
+ EXPECT_TRUE(function.has_error());
+ InterpretedFunction ifun(SimpleTensorEngine::ref(), function);
+ InterpretedFunction::Context ctx;
+ ctx.add_param(1);
+ ctx.add_param(2);
+ ctx.add_param(3);
+ ctx.add_param(4);
+ const Value &result = ifun.eval(ctx);
+ EXPECT_TRUE(result.is_error());
+ EXPECT_EQUAL(error_value, result.as_double());
+}
+
+//-----------------------------------------------------------------------------
+
+size_t count_ifs(const vespalib::string &expr, std::initializer_list<double> params_in) {
+ Function fun = Function::parse(expr);
+ InterpretedFunction ifun(SimpleTensorEngine::ref(), fun);
+ InterpretedFunction::Context ctx;
+ for (double param: params_in) {
+ ctx.add_param(param);
+ }
+ ifun.eval(ctx);
+ return ctx.if_cnt();
+}
+
+TEST("require that if_cnt in eval context is updated correctly") {
+ EXPECT_EQUAL(0u, count_ifs("1", {}));
+ EXPECT_EQUAL(1u, count_ifs("if(a<10,if(a<9,if(a<8,if(a<7,5,4),3),2),1)", {10}));
+ EXPECT_EQUAL(2u, count_ifs("if(a<10,if(a<9,if(a<8,if(a<7,5,4),3),2),1)", {9}));
+ EXPECT_EQUAL(3u, count_ifs("if(a<10,if(a<9,if(a<8,if(a<7,5,4),3),2),1)", {8}));
+ EXPECT_EQUAL(4u, count_ifs("if(a<10,if(a<9,if(a<8,if(a<7,5,4),3),2),1)", {7}));
+ EXPECT_EQUAL(4u, count_ifs("if(a<10,if(a<9,if(a<8,if(a<7,5,4),3),2),1)", {6}));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("require that interpreted function instructions have expected size") {
+ EXPECT_EQUAL(sizeof(InterpretedFunction::Instruction), 16u);
+}
+
+TEST("require that basic addition works") {
+ Function function = Function::parse("a+10");
+ InterpretedFunction interpreted(SimpleTensorEngine::ref(), function);
+ InterpretedFunction::Context ctx;
+ ctx.add_param(20);
+ EXPECT_EQUAL(interpreted.eval(ctx).as_double(), 30.0);
+ ctx.clear_params();
+ ctx.add_param(40);
+ EXPECT_EQUAL(interpreted.eval(ctx).as_double(), 50.0);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/node_types/.gitignore b/vespalib/src/tests/eval/node_types/.gitignore
new file mode 100644
index 00000000000..bd793bfefcf
--- /dev/null
+++ b/vespalib/src/tests/eval/node_types/.gitignore
@@ -0,0 +1 @@
+vespalib_node_types_test_app
diff --git a/vespalib/src/tests/eval/node_types/CMakeLists.txt b/vespalib/src/tests/eval/node_types/CMakeLists.txt
new file mode 100644
index 00000000000..5aeb5aa242c
--- /dev/null
+++ b/vespalib/src/tests/eval/node_types/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_node_types_test_app
+ SOURCES
+ node_types_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_node_types_test_app COMMAND vespalib_node_types_test_app)
diff --git a/vespalib/src/tests/eval/node_types/node_types_test.cpp b/vespalib/src/tests/eval/node_types/node_types_test.cpp
new file mode 100644
index 00000000000..38fd5795010
--- /dev/null
+++ b/vespalib/src/tests/eval/node_types/node_types_test.cpp
@@ -0,0 +1,241 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/value_type.h>
+#include <vespa/vespalib/eval/value_type_spec.h>
+#include <vespa/vespalib/eval/node_types.h>
+
+using namespace vespalib::eval;
+
+struct TypeSpecExtractor : public vespalib::eval::SymbolExtractor {
+ void extract_symbol(const char *pos_in, const char *end_in,
+ const char *&pos_out, vespalib::string &symbol_out) const override
+ {
+ ValueType type = value_type::parse_spec(pos_in, end_in, pos_out);
+ if (pos_out != nullptr) {
+ symbol_out = type.to_spec();
+ }
+ }
+};
+
+void verify(const vespalib::string &type_expr, const vespalib::string &type_spec) {
+ Function function = Function::parse(type_expr, TypeSpecExtractor());
+ if (!EXPECT_TRUE(!function.has_error())) {
+ fprintf(stderr, "parse error: %s\n", function.get_error().c_str());
+ return;
+ }
+ std::vector<ValueType> input_types;
+ for (size_t i = 0; i < function.num_params(); ++i) {
+ input_types.push_back(ValueType::from_spec(function.param_name(i)));
+ }
+ NodeTypes types(function, input_types);
+ ValueType expected_type = ValueType::from_spec(type_spec);
+ ValueType actual_type = types.get_type(function.root());
+ EXPECT_EQUAL(expected_type, actual_type);
+}
+
+TEST("require that error nodes have error type") {
+ Function function = Function::parse("1 2 3 4 5", TypeSpecExtractor());
+ EXPECT_TRUE(function.has_error());
+ NodeTypes types(function, std::vector<ValueType>());
+ ValueType expected_type = ValueType::from_spec("error");
+ ValueType actual_type = types.get_type(function.root());
+ EXPECT_EQUAL(expected_type, actual_type);
+}
+
+TEST("require that leaf constants have appropriate type") {
+ TEST_DO(verify("123", "double"));
+ TEST_DO(verify("\"string values are hashed\"", "double"));
+ TEST_DO(verify("{{x:1,y:2}:3}", "tensor"));
+}
+
+TEST("require that input parameters preserve their type") {
+ TEST_DO(verify("any", "any"));
+ TEST_DO(verify("error", "error"));
+ TEST_DO(verify("double", "double"));
+ TEST_DO(verify("tensor", "tensor"));
+ TEST_DO(verify("tensor(x{},y[10],z[])", "tensor(x{},y[10],z[])"));
+}
+
+TEST("require that arrays are double (size) unless they contain an error") {
+ TEST_DO(verify("[1,2,3]", "double"));
+ TEST_DO(verify("[any,tensor,double]", "double"));
+ TEST_DO(verify("[1,error,3]", "error"));
+}
+
+TEST("require that if resolves to the appropriate type") {
+ TEST_DO(verify("if(error,1,2)", "error"));
+ TEST_DO(verify("if(1,error,2)", "error"));
+ TEST_DO(verify("if(1,2,error)", "error"));
+ TEST_DO(verify("if(any,1,2)", "double"));
+ TEST_DO(verify("if(double,1,2)", "double"));
+ TEST_DO(verify("if(tensor,1,2)", "double"));
+ TEST_DO(verify("if(double,tensor,tensor)", "tensor"));
+ TEST_DO(verify("if(double,any,any)", "any"));
+ TEST_DO(verify("if(double,tensor(a{}),tensor(a{}))", "tensor(a{})"));
+ TEST_DO(verify("if(double,tensor(a{}),tensor(b{}))", "tensor"));
+ TEST_DO(verify("if(double,tensor(a{}),tensor)", "tensor"));
+ TEST_DO(verify("if(double,tensor,tensor(a{}))", "tensor"));
+ TEST_DO(verify("if(double,tensor,any)", "any"));
+ TEST_DO(verify("if(double,any,tensor)", "any"));
+ TEST_DO(verify("if(double,tensor,double)", "any"));
+ TEST_DO(verify("if(double,double,tensor)", "any"));
+ TEST_DO(verify("if(double,double,any)", "any"));
+ TEST_DO(verify("if(double,any,double)", "any"));
+}
+
+TEST("require that let expressions propagate type correctly") {
+ TEST_DO(verify("let(a,10,a)", "double"));
+ TEST_DO(verify("let(a,double,a)", "double"));
+ TEST_DO(verify("let(a,any,a)", "any"));
+ TEST_DO(verify("let(a,error,a)", "error"));
+ TEST_DO(verify("let(a,tensor,let(b,double,a))", "tensor"));
+ TEST_DO(verify("let(a,tensor,let(b,double,b))", "double"));
+ TEST_DO(verify("let(a,tensor,let(b,a,b))", "tensor"));
+}
+
+TEST("require that set membership resolves to double unless error") {
+ TEST_DO(verify("1 in [1,2,3]", "double"));
+ TEST_DO(verify("1 in [tensor,tensor,tensor]", "double"));
+ TEST_DO(verify("1 in tensor", "double"));
+ TEST_DO(verify("tensor in 1", "double"));
+ TEST_DO(verify("tensor in [1,2,any]", "double"));
+ TEST_DO(verify("any in [1,tensor,any]", "double"));
+ TEST_DO(verify("error in [1,tensor,any]", "error"));
+ TEST_DO(verify("any in [tensor,error,any]", "error"));
+}
+
+TEST("require that sum resolves correct type") {
+ TEST_DO(verify("sum(error)", "error"));
+ TEST_DO(verify("sum(tensor)", "double"));
+ TEST_DO(verify("sum(double)", "double"));
+ TEST_DO(verify("sum(any)", "any"));
+}
+
+TEST("require that dimension sum resolves correct type") {
+ TEST_DO(verify("sum(error,x)", "error"));
+ TEST_DO(verify("sum(tensor,x)", "any"));
+ TEST_DO(verify("sum(any,x)", "any"));
+ TEST_DO(verify("sum(double,x)", "error"));
+ TEST_DO(verify("sum(tensor(x{},y{},z{}),y)", "tensor(x{},z{})"));
+ TEST_DO(verify("sum(tensor(x{},y{},z{}),w)", "error"));
+ TEST_DO(verify("sum(tensor(x{}),x)", "double"));
+}
+
+TEST("require that tensor match resolves correct type") {
+ TEST_DO(verify("match(error,tensor)", "error"));
+ TEST_DO(verify("match(tensor,error)", "error"));
+ TEST_DO(verify("match(any,any)", "any"));
+ TEST_DO(verify("match(any,tensor)", "any"));
+ TEST_DO(verify("match(tensor,any)", "any"));
+ TEST_DO(verify("match(tensor,tensor)", "any"));
+ TEST_DO(verify("match(double,double)", "double"));
+ TEST_DO(verify("match(tensor,double)", "error"));
+ TEST_DO(verify("match(double,tensor)", "error"));
+ TEST_DO(verify("match(double,any)", "any"));
+ TEST_DO(verify("match(any,double)", "any"));
+ TEST_DO(verify("match(tensor(x{},y{}),tensor(x{},y{}))", "tensor(x{},y{})"));
+ TEST_DO(verify("match(tensor(x{},y{}),tensor(x{},y[]))", "error"));
+ TEST_DO(verify("match(tensor(x{},y{}),tensor(x{}))", "error"));
+ TEST_DO(verify("match(tensor(x{}),tensor(y{}))", "error"));
+ TEST_DO(verify("match(tensor,tensor(x{},y{}))", "any"));
+ TEST_DO(verify("match(tensor(x{},y{}),tensor)", "any"));
+}
+
+vespalib::string strfmt(const char *pattern, const char *a) {
+ return vespalib::make_string(pattern, a);
+}
+
+vespalib::string strfmt(const char *pattern, const char *a, const char *b) {
+ return vespalib::make_string(pattern, a, b);
+}
+
+void verify_op1(const char *pattern) {
+ TEST_DO(verify(strfmt(pattern, "error"), "error"));
+ TEST_DO(verify(strfmt(pattern, "any"), "any"));
+ TEST_DO(verify(strfmt(pattern, "double"), "double"));
+ TEST_DO(verify(strfmt(pattern, "tensor"), "tensor"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{},y[10],z[])"), "tensor(x{},y[10],z[])"));
+}
+
+void verify_op2_common(const char *pattern) {
+ TEST_DO(verify(strfmt(pattern, "error", "error"), "error"));
+ TEST_DO(verify(strfmt(pattern, "any", "error"), "error"));
+ TEST_DO(verify(strfmt(pattern, "error", "any"), "error"));
+ TEST_DO(verify(strfmt(pattern, "double", "error"), "error"));
+ TEST_DO(verify(strfmt(pattern, "error", "double"), "error"));
+ TEST_DO(verify(strfmt(pattern, "tensor", "error"), "error"));
+ TEST_DO(verify(strfmt(pattern, "error", "tensor"), "error"));
+ TEST_DO(verify(strfmt(pattern, "any", "any"), "any"));
+ TEST_DO(verify(strfmt(pattern, "any", "double"), "any"));
+ TEST_DO(verify(strfmt(pattern, "double", "any"), "any"));
+ TEST_DO(verify(strfmt(pattern, "any", "tensor"), "any"));
+ TEST_DO(verify(strfmt(pattern, "tensor", "any"), "any"));
+ TEST_DO(verify(strfmt(pattern, "double", "double"), "double"));
+ TEST_DO(verify(strfmt(pattern, "tensor", "double"), "tensor"));
+ TEST_DO(verify(strfmt(pattern, "double", "tensor"), "tensor"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{})", "double"), "tensor(x{})"));
+ TEST_DO(verify(strfmt(pattern, "double", "tensor(x{})"), "tensor(x{})"));
+}
+
+void verify_op2_default(const char *pattern) {
+ TEST_DO(verify_op2_common(pattern));
+ TEST_DO(verify(strfmt(pattern, "tensor", "tensor"), "error"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(x{})"), "error"));
+}
+
+void verify_op2_union(const char *pattern) {
+ TEST_DO(verify_op2_common(pattern));
+ TEST_DO(verify(strfmt(pattern, "tensor", "tensor"), "any"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(x{})"), "tensor(x{})"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(y{})"), "tensor(x{},y{})"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x[3])", "tensor(x[5])"), "tensor(x[3])"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x[])", "tensor(x[5])"), "tensor(x[])"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[3])"), "tensor(x[3])"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[])"), "tensor(x[])"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(x[5])"), "error"));
+}
+
+TEST("require that various operations resolve appropriate type") {
+ TEST_DO(verify_op1("-%s")); // Neg
+ TEST_DO(verify_op1("!%s")); // Not
+ TEST_DO(verify_op2_union("%s+%s")); // Add
+ TEST_DO(verify_op2_union("%s-%s")); // Sub
+ TEST_DO(verify_op2_union("%s*%s")); // Mul
+ TEST_DO(verify_op2_default("%s/%s")); // Div
+ TEST_DO(verify_op2_default("%s^%s")); // Pow
+ TEST_DO(verify_op2_default("%s==%s")); // Equal
+ TEST_DO(verify_op2_default("%s!=%s")); // NotEqual
+ TEST_DO(verify_op2_default("%s~=%s")); // Approx
+ TEST_DO(verify_op2_default("%s<%s")); // Less
+ TEST_DO(verify_op2_default("%s<=%s")); // LessEqual
+ TEST_DO(verify_op2_default("%s>%s")); // Greater
+ TEST_DO(verify_op2_default("%s>=%s")); // GreaterEqual
+ TEST_DO(verify_op2_default("%s&&%s")); // And
+ TEST_DO(verify_op2_default("%s||%s")); // Or
+ TEST_DO(verify_op1("cos(%s)")); // Cos
+ TEST_DO(verify_op1("sin(%s)")); // Sin
+ TEST_DO(verify_op1("tan(%s)")); // Tan
+ TEST_DO(verify_op1("cosh(%s)")); // Cosh
+ TEST_DO(verify_op1("sinh(%s)")); // Sinh
+ TEST_DO(verify_op1("tanh(%s)")); // Tanh
+ TEST_DO(verify_op1("acos(%s)")); // Acos
+ TEST_DO(verify_op1("asin(%s)")); // Asin
+ TEST_DO(verify_op1("atan(%s)")); // Atan
+ TEST_DO(verify_op1("exp(%s)")); // Exp
+ TEST_DO(verify_op1("log10(%s)")); // Log10
+ TEST_DO(verify_op1("log(%s)")); // Log
+ TEST_DO(verify_op1("sqrt(%s)")); // Sqrt
+ TEST_DO(verify_op1("ceil(%s)")); // Ceil
+ TEST_DO(verify_op1("fabs(%s)")); // Fabs
+ TEST_DO(verify_op1("floor(%s)")); // Floor
+ TEST_DO(verify_op2_default("atan2(%s,%s)")); // Atan2
+ TEST_DO(verify_op2_default("ldexp(%s,%s)")); // Ldexp
+ TEST_DO(verify_op2_default("pow(%s,%s)")); // Pow2
+ TEST_DO(verify_op2_default("fmod(%s,%s)")); // Fmod
+ TEST_DO(verify_op2_union("min(%s,%s)")); // min
+ TEST_DO(verify_op2_union("max(%s,%s)")); // max
+ TEST_DO(verify_op1("isNan(%s)")); // IsNan
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/simple_tensor/.gitignore b/vespalib/src/tests/eval/simple_tensor/.gitignore
new file mode 100644
index 00000000000..f371f5c6c6d
--- /dev/null
+++ b/vespalib/src/tests/eval/simple_tensor/.gitignore
@@ -0,0 +1 @@
+vespalib_simple_tensor_test_app
diff --git a/vespalib/src/tests/eval/simple_tensor/CMakeLists.txt b/vespalib/src/tests/eval/simple_tensor/CMakeLists.txt
new file mode 100644
index 00000000000..6fd9b8173be
--- /dev/null
+++ b/vespalib/src/tests/eval/simple_tensor/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_simple_tensor_test_app
+ SOURCES
+ simple_tensor_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_simple_tensor_test_app COMMAND vespalib_simple_tensor_test_app)
diff --git a/vespalib/src/tests/eval/simple_tensor/simple_tensor_test.cpp b/vespalib/src/tests/eval/simple_tensor/simple_tensor_test.cpp
new file mode 100644
index 00000000000..742c6181023
--- /dev/null
+++ b/vespalib/src/tests/eval/simple_tensor/simple_tensor_test.cpp
@@ -0,0 +1,199 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/simple_tensor.h>
+#include <vespa/vespalib/eval/simple_tensor_engine.h>
+#include <vespa/vespalib/eval/operation.h>
+#include <vespa/vespalib/util/stash.h>
+#include <iostream>
+
+using namespace vespalib::eval;
+
+using Cell = SimpleTensor::Cell;
+using Cells = SimpleTensor::Cells;
+using Address = SimpleTensor::Address;
+using Stash = vespalib::Stash;
+
+// need to specify numbers explicitly as size_t to avoid ambiguous behavior for 0
+constexpr size_t operator "" _z (unsigned long long int n) { return n; }
+
+void dump(const Cells &cells, std::ostream &out) {
+ out << std::endl;
+ for (const auto &cell: cells) {
+ size_t n = 0;
+ out << " [";
+ for (const auto &label: cell.address) {
+ if (n++) {
+ out << ",";
+ }
+ if (label.is_mapped()) {
+ out << label.name;
+ } else {
+ out << label.index;
+ }
+ }
+ out << "]: " << cell.value << std::endl;
+ }
+}
+
+struct Check {
+ Cells cells;
+ Check() : cells() {}
+ explicit Check(const SimpleTensor &tensor) : cells() {
+ for (const auto &cell: tensor.cells()) {
+ add(cell.address, cell.value);
+ }
+ }
+ explicit Check(const TensorSpec &spec)
+ : Check(*SimpleTensor::create(spec)) {}
+ Check &add(const Address &address, double value) {
+ cells.emplace_back(address, value);
+ std::sort(cells.begin(), cells.end(),
+ [](const auto &a, const auto &b){ return (a.address < b.address); });
+ return *this;
+ }
+ bool operator==(const Check &rhs) const {
+ if (cells.size() != rhs.cells.size()) {
+ return false;
+ }
+ for (size_t i = 0; i < cells.size(); ++i) {
+ if ((cells[i].address != rhs.cells[i].address) ||
+ (cells[i].value != rhs.cells[i].value))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+};
+
+std::ostream &operator<<(std::ostream &out, const Check &value) {
+ dump(value.cells, out);
+ return out;
+}
+
+const SimpleTensor &unwrap(const Tensor &tensor) {
+ ASSERT_EQUAL(&tensor.engine(), &SimpleTensorEngine::ref());
+ return static_cast<const SimpleTensor &>(tensor);
+}
+
+const SimpleTensor &unwrap(const Value &value) {
+ ASSERT_TRUE(value.is_tensor());
+ return unwrap(*value.as_tensor());
+}
+
+TEST("require that simple tensors can be built using tensor spec") {
+ TensorSpec spec("tensor(w{},x[2],y{},z[2])");
+ spec.add({{"w", "xxx"}, {"x", 0}, {"y", "xxx"}, {"z", 0}}, 1.0)
+ .add({{"w", "xxx"}, {"x", 0}, {"y", "yyy"}, {"z", 1}}, 2.0)
+ .add({{"w", "yyy"}, {"x", 1}, {"y", "xxx"}, {"z", 0}}, 3.0)
+ .add({{"w", "yyy"}, {"x", 1}, {"y", "yyy"}, {"z", 1}}, 4.0);
+ std::unique_ptr<SimpleTensor> tensor = SimpleTensor::create(spec);
+ Check expect = Check()
+ .add({{"xxx"}, {0_z}, {"xxx"}, {0_z}}, 1.0)
+ .add({{"xxx"}, {0_z}, {"xxx"}, {1_z}}, 0.0)
+ .add({{"xxx"}, {1_z}, {"xxx"}, {0_z}}, 0.0)
+ .add({{"xxx"}, {1_z}, {"xxx"}, {1_z}}, 0.0)
+ //-----------------------------------------
+ .add({{"xxx"}, {0_z}, {"yyy"}, {0_z}}, 0.0)
+ .add({{"xxx"}, {0_z}, {"yyy"}, {1_z}}, 2.0)
+ .add({{"xxx"}, {1_z}, {"yyy"}, {0_z}}, 0.0)
+ .add({{"xxx"}, {1_z}, {"yyy"}, {1_z}}, 0.0)
+ //-----------------------------------------
+ .add({{"yyy"}, {0_z}, {"xxx"}, {0_z}}, 0.0)
+ .add({{"yyy"}, {0_z}, {"xxx"}, {1_z}}, 0.0)
+ .add({{"yyy"}, {1_z}, {"xxx"}, {0_z}}, 3.0)
+ .add({{"yyy"}, {1_z}, {"xxx"}, {1_z}}, 0.0)
+ //-----------------------------------------
+ .add({{"yyy"}, {0_z}, {"yyy"}, {0_z}}, 0.0)
+ .add({{"yyy"}, {0_z}, {"yyy"}, {1_z}}, 0.0)
+ .add({{"yyy"}, {1_z}, {"yyy"}, {0_z}}, 0.0)
+ .add({{"yyy"}, {1_z}, {"yyy"}, {1_z}}, 4.0);
+ EXPECT_EQUAL(expect, Check(*tensor));
+ std::unique_ptr<Tensor> tensor2 = SimpleTensorEngine::ref().create(spec);
+ EXPECT_EQUAL(expect, Check(unwrap(*tensor2)));
+};
+
+TEST("require that simple tensors can have their values negated") {
+ auto tensor = SimpleTensor::create(
+ TensorSpec("tensor(x{},y{})")
+ .add({{"x","1"},{"y","1"}}, 1)
+ .add({{"x","2"},{"y","1"}}, -3)
+ .add({{"x","1"},{"y","2"}}, 5));
+ auto expect = SimpleTensor::create(
+ TensorSpec("tensor(x{},y{})")
+ .add({{"x","1"},{"y","1"}}, -1)
+ .add({{"x","2"},{"y","1"}}, 3)
+ .add({{"x","1"},{"y","2"}}, -5));
+ auto result = SimpleTensor::perform(operation::Neg(), *tensor);
+ EXPECT_EQUAL(Check(*expect), Check(*result));
+ Stash stash;
+ const Value &result2 = SimpleTensorEngine::ref().perform(operation::Neg(), *tensor, stash);
+ EXPECT_EQUAL(Check(*expect), Check(unwrap(result2)));
+}
+
+TEST("require that simple tensors can be multiplied with each other") {
+ auto lhs = SimpleTensor::create(
+ TensorSpec("tensor(x{},y{})")
+ .add({{"x","1"},{"y","1"}}, 1)
+ .add({{"x","2"},{"y","1"}}, 3)
+ .add({{"x","1"},{"y","2"}}, 5));
+ auto rhs = SimpleTensor::create(
+ TensorSpec("tensor(y{},z{})")
+ .add({{"y","1"},{"z","1"}}, 7)
+ .add({{"y","2"},{"z","1"}}, 11)
+ .add({{"y","1"},{"z","2"}}, 13));
+ auto expect = SimpleTensor::create(
+ TensorSpec("tensor(x{},y{},z{})")
+ .add({{"x","1"},{"y","1"},{"z","1"}}, 7)
+ .add({{"x","1"},{"y","1"},{"z","2"}}, 13)
+ .add({{"x","2"},{"y","1"},{"z","1"}}, 21)
+ .add({{"x","2"},{"y","1"},{"z","2"}}, 39)
+ .add({{"x","1"},{"y","2"},{"z","1"}}, 55));
+ auto result = SimpleTensor::perform(operation::Mul(), *lhs, *rhs);
+ EXPECT_EQUAL(Check(*expect), Check(*result));
+ Stash stash;
+ const Value &result2 = SimpleTensorEngine::ref().perform(operation::Mul(), *lhs, *rhs, stash);
+ EXPECT_EQUAL(Check(*expect), Check(unwrap(result2)));
+}
+
+TEST("require that simple tensors support dimension reduction") {
+ auto tensor = SimpleTensor::create(
+ TensorSpec("tensor(x[3],y[2])")
+ .add({{"x",0},{"y",0}}, 1)
+ .add({{"x",1},{"y",0}}, 2)
+ .add({{"x",2},{"y",0}}, 3)
+ .add({{"x",0},{"y",1}}, 4)
+ .add({{"x",1},{"y",1}}, 5)
+ .add({{"x",2},{"y",1}}, 6));
+ auto expect_sum_y = SimpleTensor::create(
+ TensorSpec("tensor(x[3])")
+ .add({{"x",0}}, 5)
+ .add({{"x",1}}, 7)
+ .add({{"x",2}}, 9));
+ auto expect_sum_x = SimpleTensor::create(
+ TensorSpec("tensor(y[2])")
+ .add({{"y",0}}, 6)
+ .add({{"y",1}}, 15));
+ auto expect_sum_all = SimpleTensor::create(TensorSpec("double").add({}, 21));
+ auto result_sum_y = tensor->reduce(operation::Add(), {"y"});
+ auto result_sum_x = tensor->reduce(operation::Add(), {"x"});
+ auto result_sum_all = tensor->reduce(operation::Add(), {"x", "y"});
+ EXPECT_EQUAL(Check(*expect_sum_y), Check(*result_sum_y));
+ EXPECT_EQUAL(Check(*expect_sum_x), Check(*result_sum_x));
+ EXPECT_EQUAL(Check(*expect_sum_all), Check(*result_sum_all));
+ Stash stash;
+ const Value &result_sum_y_2 = SimpleTensorEngine::ref().reduce(*tensor, operation::Add(), {"y"}, stash);
+ const Value &result_sum_x_2 = SimpleTensorEngine::ref().reduce(*tensor, operation::Add(), {"x"}, stash);
+ const Value &result_sum_all_2 = SimpleTensorEngine::ref().reduce(*tensor, operation::Add(), {"x", "y"}, stash);
+ const Value &result_sum_all_3 = SimpleTensorEngine::ref().reduce(*tensor, operation::Add(), stash);
+ EXPECT_EQUAL(Check(*expect_sum_y), Check(unwrap(result_sum_y_2)));
+ EXPECT_EQUAL(Check(*expect_sum_x), Check(unwrap(result_sum_x_2)));
+ EXPECT_TRUE(result_sum_all_2.is_double());
+ EXPECT_TRUE(result_sum_all_3.is_double());
+ EXPECT_EQUAL(21, result_sum_all_2.as_double());
+ EXPECT_EQUAL(21, result_sum_all_3.as_double());
+ EXPECT_TRUE(SimpleTensorEngine::ref().equal(*result_sum_y, *result_sum_y));
+ EXPECT_TRUE(!SimpleTensorEngine::ref().equal(*result_sum_y, *result_sum_x));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/tensor/.gitignore b/vespalib/src/tests/eval/tensor/.gitignore
new file mode 100644
index 00000000000..b99fb9adb34
--- /dev/null
+++ b/vespalib/src/tests/eval/tensor/.gitignore
@@ -0,0 +1 @@
+vespalib_eval_tensor_test_app
diff --git a/vespalib/src/tests/eval/tensor/CMakeLists.txt b/vespalib/src/tests/eval/tensor/CMakeLists.txt
new file mode 100644
index 00000000000..f5749b036f2
--- /dev/null
+++ b/vespalib/src/tests/eval/tensor/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_eval_tensor_test_app
+ SOURCES
+ eval_tensor_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_eval_tensor_test_app COMMAND vespalib_eval_tensor_test_app)
diff --git a/vespalib/src/tests/eval/tensor/eval_tensor_test.cpp b/vespalib/src/tests/eval/tensor/eval_tensor_test.cpp
new file mode 100644
index 00000000000..e381ae88cbe
--- /dev/null
+++ b/vespalib/src/tests/eval/tensor/eval_tensor_test.cpp
@@ -0,0 +1,101 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/eval/interpreted_function.h>
+#include <vespa/vespalib/tensor/default_tensor_engine.h>
+
+using namespace vespalib;
+using namespace vespalib::eval;
+
+struct Check {
+ const Value &value;
+ explicit Check(const Value &value_in) : value(value_in) {}
+ bool operator==(const Check &rhs) const { return value.equal(rhs.value); }
+};
+
+std::ostream &operator<<(std::ostream &os, const Check &check) {
+ const Value &value = check.value;
+ if (value.is_error()) {
+ os << "EVAL ERROR";
+ } else if (value.is_double()) {
+ os << value.as_double();
+ } else if (value.is_tensor()) {
+ os << value.as_tensor();
+ }
+ return os;
+}
+
+struct Eval {
+ InterpretedFunction::Context ctx;
+ InterpretedFunction ifun;
+ const Value *result;
+ explicit Eval(const vespalib::string &expr)
+ : ctx(), ifun(tensor::DefaultTensorEngine::ref(), Function::parse(expr)), result(&ifun.eval(ctx)) {}
+ bool operator==(const Eval &rhs) const { return result->equal(*rhs.result); }
+};
+
+std::ostream &operator<<(std::ostream &os, const Eval &eval) {
+ os << Check(*eval.result);
+ return os;
+}
+
+TEST_FF("require that eval errors are not equal", Eval("{"), Eval("{")) {
+ EXPECT_TRUE(f1.result->is_error());
+ EXPECT_TRUE(f2.result->is_error());
+ EXPECT_NOT_EQUAL(f1, f2);
+}
+
+TEST("require that different tensors are not equal") {
+ EXPECT_EQUAL(Eval("{{x:1}:1}"), Eval("{{x:1}:1}"));
+ EXPECT_NOT_EQUAL(Eval("{{x:1}:1}"), Eval("{{x:1}:2}"));
+ EXPECT_NOT_EQUAL(Eval("{{x:1}:1}"), Eval("{{x:2}:1}"));
+ EXPECT_NOT_EQUAL(Eval("{{x:1}:1}"), Eval("{{y:1}:1}"));
+ EXPECT_NOT_EQUAL(Eval("{{x:1}:1}"), Eval("{{x:1}:1,{x:2}:1}"));
+}
+
+TEST("require that tensor sum works") {
+ EXPECT_EQUAL(Eval("6.0"), Eval("sum({{x:1}:1,{x:2}:2,{x:3}:3})"));
+}
+
+TEST("require that tensor sum over dimension works") {
+ EXPECT_EQUAL(Eval("{{x:1}:4,{x:2}:6}"), Eval("sum({{x:1,y:1}:1,{x:2,y:1}:2,{x:1,y:2}:3,{x:2,y:2}:4},y)"));
+ EXPECT_EQUAL(Eval("{{y:1}:3,{y:2}:7}"), Eval("sum({{x:1,y:1}:1,{x:2,y:1}:2,{x:1,y:2}:3,{x:2,y:2}:4},x)"));
+}
+
+TEST("require that tensor add works") {
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:5,{x:3}:3}"), Eval("{{x:1}:1,{x:2}:2} + {{x:2}:3,{x:3}:3}"));
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:5,{x:3}:3}"), Eval("{{x:2}:3,{x:3}:3} + {{x:1}:1,{x:2}:2}"));
+}
+
+TEST("require that tensor sub works") {
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:-1,{x:3}:-3}"), Eval("{{x:1}:1,{x:2}:2} - {{x:2}:3,{x:3}:3}"));
+ EXPECT_EQUAL(Eval("{{x:1}:-1,{x:2}:1,{x:3}:3}"), Eval("{{x:2}:3,{x:3}:3} - {{x:1}:1,{x:2}:2}"));
+}
+
+TEST("require that tensor multiply works") {
+ EXPECT_EQUAL(Eval("{{x:1,y:1}:3,{x:2,y:1}:6,{x:1,y:2}:4,{x:2,y:2}:8}"), Eval("{{x:1}:1,{x:2}:2}*{{y:1}:3,{y:2}:4}"));
+}
+
+TEST("require that tensor min works") {
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:2,{x:3}:3}"), Eval("min({{x:1}:1,{x:2}:2}, {{x:2}:3,{x:3}:3})"));
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:2,{x:3}:3}"), Eval("min({{x:2}:3,{x:3}:3}, {{x:1}:1,{x:2}:2})"));
+}
+
+TEST("require that tensor max works") {
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:3,{x:3}:3}"), Eval("max({{x:1}:1,{x:2}:2}, {{x:2}:3,{x:3}:3})"));
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:3,{x:3}:3}"), Eval("max({{x:2}:3,{x:3}:3}, {{x:1}:1,{x:2}:2})"));
+}
+
+TEST("require that tensor match works") {
+ EXPECT_EQUAL(Eval("{{x:2}:6}"), Eval("match({{x:1}:1,{x:2}:2},{{x:2}:3,{x:3}:3})"));
+}
+
+TEST("require that tensor cell function works") {
+ EXPECT_EQUAL(Eval("{{x:1}:3,{x:2}:4,{x:3}:5}"), Eval("{{x:1}:1,{x:2}:2,{x:3}:3}+2"));
+ EXPECT_EQUAL(Eval("{{x:1}:3,{x:2}:4,{x:3}:5}"), Eval("2+{{x:1}:1,{x:2}:2,{x:3}:3}"));
+ EXPECT_EQUAL(Eval("{{x:1}:-1,{x:2}:0,{x:3}:1}"), Eval("{{x:1}:1,{x:2}:2,{x:3}:3}-2"));
+ EXPECT_EQUAL(Eval("{{x:1}:1,{x:2}:0,{x:3}:-1}"), Eval("2-{{x:1}:1,{x:2}:2,{x:3}:3}"));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eval/value_type/.gitignore b/vespalib/src/tests/eval/value_type/.gitignore
new file mode 100644
index 00000000000..e6842b91e98
--- /dev/null
+++ b/vespalib/src/tests/eval/value_type/.gitignore
@@ -0,0 +1 @@
+vespalib_value_type_test_app
diff --git a/vespalib/src/tests/eval/value_type/CMakeLists.txt b/vespalib/src/tests/eval/value_type/CMakeLists.txt
new file mode 100644
index 00000000000..67b31834414
--- /dev/null
+++ b/vespalib/src/tests/eval/value_type/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_value_type_test_app
+ SOURCES
+ value_type_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_value_type_test_app NO_VALGRIND COMMAND vespalib_value_type_test_app)
diff --git a/vespalib/src/tests/eval/value_type/value_type_test.cpp b/vespalib/src/tests/eval/value_type/value_type_test.cpp
new file mode 100644
index 00000000000..c97ca2b9083
--- /dev/null
+++ b/vespalib/src/tests/eval/value_type/value_type_test.cpp
@@ -0,0 +1,327 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/value_type.h>
+#include <vespa/vespalib/eval/value_type_spec.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <ostream>
+
+using namespace vespalib::eval;
+
+const size_t npos = ValueType::Dimension::npos;
+
+TEST("require that ANY value type can be created") {
+ ValueType t = ValueType::any_type();
+ EXPECT_TRUE(t.type() == ValueType::Type::ANY);
+ EXPECT_EQUAL(t.dimensions().size(), 0u);
+}
+
+TEST("require that ERROR value type can be created") {
+ ValueType t = ValueType::error_type();
+ EXPECT_TRUE(t.type() == ValueType::Type::ERROR);
+ EXPECT_EQUAL(t.dimensions().size(), 0u);
+}
+
+TEST("require that DOUBLE value type can be created") {
+ ValueType t = ValueType::double_type();
+ EXPECT_TRUE(t.type() == ValueType::Type::DOUBLE);
+ EXPECT_EQUAL(t.dimensions().size(), 0u);
+}
+
+TEST("require that TENSOR value type can be created") {
+ ValueType t = ValueType::tensor_type({{"x", 10},{"y"}});
+ EXPECT_TRUE(t.type() == ValueType::Type::TENSOR);
+ ASSERT_EQUAL(t.dimensions().size(), 2u);
+ EXPECT_EQUAL(t.dimensions()[0].name, "x");
+ EXPECT_EQUAL(t.dimensions()[0].size, 10u);
+ EXPECT_EQUAL(t.dimensions()[1].name, "y");
+ EXPECT_EQUAL(t.dimensions()[1].size, npos);
+}
+
+TEST("require that TENSOR value type sorts dimensions") {
+ ValueType t = ValueType::tensor_type({{"x", 10}, {"z", 30}, {"y"}});
+ EXPECT_TRUE(t.type() == ValueType::Type::TENSOR);
+ ASSERT_EQUAL(t.dimensions().size(), 3u);
+ EXPECT_EQUAL(t.dimensions()[0].name, "x");
+ EXPECT_EQUAL(t.dimensions()[0].size, 10u);
+ EXPECT_EQUAL(t.dimensions()[1].name, "y");
+ EXPECT_EQUAL(t.dimensions()[1].size, npos);
+ EXPECT_EQUAL(t.dimensions()[2].name, "z");
+ EXPECT_EQUAL(t.dimensions()[2].size, 30u);
+}
+
+void verify_equal(const ValueType &a, const ValueType &b) {
+ EXPECT_TRUE(a == b);
+ EXPECT_TRUE(b == a);
+ EXPECT_FALSE(a != b);
+ EXPECT_FALSE(b != a);
+}
+
+void verify_not_equal(const ValueType &a, const ValueType &b) {
+ EXPECT_TRUE(a != b);
+ EXPECT_TRUE(b != a);
+ EXPECT_FALSE(a == b);
+ EXPECT_FALSE(b == a);
+}
+
+TEST("require that value types can be compared") {
+ TEST_DO(verify_equal(ValueType::error_type(), ValueType::error_type()));
+ TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::any_type()));
+ TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::double_type()));
+ TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::tensor_type({})));
+ TEST_DO(verify_equal(ValueType::any_type(), ValueType::any_type()));
+ TEST_DO(verify_not_equal(ValueType::any_type(), ValueType::double_type()));
+ TEST_DO(verify_not_equal(ValueType::any_type(), ValueType::tensor_type({})));
+ TEST_DO(verify_equal(ValueType::double_type(), ValueType::double_type()));
+ TEST_DO(verify_not_equal(ValueType::double_type(), ValueType::tensor_type({})));
+ TEST_DO(verify_equal(ValueType::tensor_type({{"x"}, {"y"}}), ValueType::tensor_type({{"y"}, {"x"}})));
+ TEST_DO(verify_not_equal(ValueType::tensor_type({{"x"}, {"y"}}), ValueType::tensor_type({{"x"}, {"y"}, {"z"}})));
+ TEST_DO(verify_equal(ValueType::tensor_type({{"x", 10}, {"y", 20}}), ValueType::tensor_type({{"y", 20}, {"x", 10}})));
+ TEST_DO(verify_not_equal(ValueType::tensor_type({{"x", 10}, {"y", 20}}), ValueType::tensor_type({{"x", 10}, {"y", 10}})));
+ TEST_DO(verify_not_equal(ValueType::tensor_type({{"x", 10}}), ValueType::tensor_type({{"x"}})));
+}
+
+void verify_predicates(const ValueType &type,
+ bool expect_any, bool expect_error, bool expect_double, bool expect_tensor,
+ bool expect_maybe_tensor, bool expect_abstract, bool expect_unknown_dimensions)
+{
+ EXPECT_EQUAL(type.is_any(), expect_any);
+ EXPECT_EQUAL(type.is_error(), expect_error);
+ EXPECT_EQUAL(type.is_double(), expect_double);
+ EXPECT_EQUAL(type.is_tensor(), expect_tensor);
+ EXPECT_EQUAL(type.maybe_tensor(), expect_maybe_tensor);
+ EXPECT_EQUAL(type.is_abstract(), expect_abstract);
+ EXPECT_EQUAL(type.unknown_dimensions(), expect_unknown_dimensions);
+}
+
+TEST("require that type-related predicate functions work as expected") {
+ TEST_DO(verify_predicates(ValueType::any_type(),
+ true, false, false, false,
+ true, true, true));
+ TEST_DO(verify_predicates(ValueType::error_type(),
+ false, true, false, false,
+ false, false, false));
+ TEST_DO(verify_predicates(ValueType::double_type(),
+ false, false, true, false,
+ false, false, false));
+ TEST_DO(verify_predicates(ValueType::tensor_type({}),
+ false, false, false, true,
+ true, true, true));
+ TEST_DO(verify_predicates(ValueType::tensor_type({{"x"}}),
+ false, false, false, true,
+ true, false, false));
+ TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 0}}),
+ false, false, false, true,
+ true, true, false));
+}
+
+TEST("require that dimension predicates work as expected") {
+ ValueType type = ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}});
+ ASSERT_EQUAL(3u, type.dimensions().size());
+ EXPECT_TRUE(type.dimensions()[0].is_mapped());
+ EXPECT_TRUE(!type.dimensions()[0].is_indexed());
+ EXPECT_TRUE(!type.dimensions()[0].is_bound());
+ EXPECT_TRUE(!type.dimensions()[1].is_mapped());
+ EXPECT_TRUE(type.dimensions()[1].is_indexed());
+ EXPECT_TRUE(type.dimensions()[1].is_bound());
+ EXPECT_TRUE(!type.dimensions()[2].is_mapped());
+ EXPECT_TRUE(type.dimensions()[2].is_indexed());
+ EXPECT_TRUE(!type.dimensions()[2].is_bound());
+}
+
+TEST("require that duplicate dimension names result in error types") {
+ EXPECT_TRUE(ValueType::tensor_type({{"x"}, {"x"}}).is_error());
+}
+
+TEST("require that removing dimensions from non-abstract non-tensor types gives error type") {
+ EXPECT_TRUE(ValueType::error_type().remove_dimensions({"x"}).is_error());
+ EXPECT_TRUE(ValueType::double_type().remove_dimensions({"x"}).is_error());
+}
+
+TEST("require that removing dimensions from abstract maybe-tensor types gives any type") {
+ EXPECT_TRUE(ValueType::any_type().remove_dimensions({"x"}).is_any());
+ EXPECT_TRUE(ValueType::tensor_type({}).remove_dimensions({"x"}).is_any());
+}
+
+TEST("require that dimensions can be removed from tensor value types") {
+ ValueType type = ValueType::tensor_type({{"x", 10}, {"y", 20}, {"z", 30}});
+ EXPECT_EQUAL(ValueType::tensor_type({{"y", 20}, {"z", 30}}), type.remove_dimensions({"x"}));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x", 10}, {"z", 30}}), type.remove_dimensions({"y"}));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x", 10}, {"y", 20}}), type.remove_dimensions({"z"}));
+ EXPECT_EQUAL(ValueType::tensor_type({{"y", 20}}), type.remove_dimensions({"x", "z"}));
+ EXPECT_EQUAL(ValueType::tensor_type({{"y", 20}}), type.remove_dimensions({"z", "x"}));
+}
+
+TEST("require that removing an empty set of dimensions is not allowed") {
+ EXPECT_TRUE(ValueType::tensor_type({{"x", 10}, {"y", 20}, {"z", 30}}).remove_dimensions({}).is_error());
+}
+
+TEST("require that removing non-existing dimensions gives error type") {
+ EXPECT_TRUE(ValueType::tensor_type({{"y"}}).remove_dimensions({"x"}).is_error());
+ EXPECT_TRUE(ValueType::tensor_type({{"y", 10}}).remove_dimensions({"x"}).is_error());
+}
+
+TEST("require that removing all dimensions gives double type") {
+ ValueType type = ValueType::tensor_type({{"x", 10}, {"y", 20}, {"z", 30}});
+ EXPECT_EQUAL(ValueType::double_type(), type.remove_dimensions({"x", "y", "z"}));
+}
+
+TEST("require that dimensions can be combined for tensor value types") {
+ ValueType tensor_type_xy = ValueType::tensor_type({{"x"}, {"y"}});
+ ValueType tensor_type_yz = ValueType::tensor_type({{"y"}, {"z"}});
+ ValueType tensor_type_xyz = ValueType::tensor_type({{"x"}, {"y"}, {"z"}});
+ ValueType tensor_type_y = ValueType::tensor_type({{"y"}});
+ EXPECT_EQUAL(tensor_type_xy.add_dimensions_from(tensor_type_yz), tensor_type_xyz);
+ EXPECT_EQUAL(tensor_type_yz.add_dimensions_from(tensor_type_xy), tensor_type_xyz);
+ EXPECT_EQUAL(tensor_type_xy.keep_dimensions_in(tensor_type_yz), tensor_type_y);
+ EXPECT_EQUAL(tensor_type_yz.keep_dimensions_in(tensor_type_xy), tensor_type_y);
+ EXPECT_EQUAL(tensor_type_y.add_dimensions_from(tensor_type_y), tensor_type_y);
+ EXPECT_EQUAL(tensor_type_y.keep_dimensions_in(tensor_type_y), tensor_type_y);
+}
+
+TEST("require that indexed dimensions combine to the minimal dimension size") {
+ ValueType tensor_0 = ValueType::tensor_type({{"x", 0}});
+ ValueType tensor_10 = ValueType::tensor_type({{"x", 10}});
+ ValueType tensor_20 = ValueType::tensor_type({{"x", 20}});
+ EXPECT_EQUAL(tensor_10.add_dimensions_from(tensor_0), tensor_0);
+ EXPECT_EQUAL(tensor_10.add_dimensions_from(tensor_10), tensor_10);
+ EXPECT_EQUAL(tensor_10.add_dimensions_from(tensor_20), tensor_10);
+ EXPECT_EQUAL(tensor_10.keep_dimensions_in(tensor_0), tensor_0);
+ EXPECT_EQUAL(tensor_10.keep_dimensions_in(tensor_10), tensor_10);
+ EXPECT_EQUAL(tensor_10.keep_dimensions_in(tensor_20), tensor_10);
+}
+
+void verify_combinable(const ValueType &a, const ValueType &b) {
+ EXPECT_TRUE(!a.add_dimensions_from(b).is_error());
+ EXPECT_TRUE(!b.add_dimensions_from(a).is_error());
+ EXPECT_TRUE(!a.keep_dimensions_in(b).is_error());
+ EXPECT_TRUE(!b.keep_dimensions_in(a).is_error());
+}
+
+void verify_not_combinable(const ValueType &a, const ValueType &b) {
+ EXPECT_TRUE(a.add_dimensions_from(b).is_error());
+ EXPECT_TRUE(b.add_dimensions_from(a).is_error());
+ EXPECT_TRUE(a.keep_dimensions_in(b).is_error());
+ EXPECT_TRUE(b.keep_dimensions_in(a).is_error());
+}
+
+void verify_maybe_combinable(const ValueType &a, const ValueType &b) {
+ EXPECT_TRUE(a.add_dimensions_from(b).is_any());
+ EXPECT_TRUE(b.add_dimensions_from(a).is_any());
+ EXPECT_TRUE(a.keep_dimensions_in(b).is_any());
+ EXPECT_TRUE(b.keep_dimensions_in(a).is_any());
+}
+
+TEST("require that mapped and indexed dimensions are not combinable") {
+ verify_not_combinable(ValueType::tensor_type({{"x", 10}}), ValueType::tensor_type({{"x"}}));
+}
+
+TEST("require that dimension combining is only allowed (yes/no/maybe) for appropriate types") {
+ std::vector<ValueType> types = { ValueType::any_type(), ValueType::error_type(), ValueType::double_type(),
+ ValueType::tensor_type({}), ValueType::tensor_type({{"x"}}) };
+ for (size_t a = 0; a < types.size(); ++a) {
+ for (size_t b = a; b < types.size(); ++b) {
+ TEST_STATE(vespalib::make_string("a='%s', b='%s'", types[a].to_spec().c_str(), types[b].to_spec().c_str()).c_str());
+ if (types[a].is_tensor() && types[b].is_tensor()) {
+ verify_combinable(types[a], types[b]);
+ } else if (types[a].maybe_tensor() && types[b].maybe_tensor()) {
+ verify_maybe_combinable(types[a], types[b]);
+ } else {
+ verify_not_combinable(types[a], types[b]);
+ }
+ }
+ }
+}
+
+TEST("require that value type can make spec") {
+ EXPECT_EQUAL("any", ValueType::any_type().to_spec());
+ EXPECT_EQUAL("error", ValueType::error_type().to_spec());
+ EXPECT_EQUAL("double", ValueType::double_type().to_spec());
+ EXPECT_EQUAL("tensor", ValueType::tensor_type({}).to_spec());
+ EXPECT_EQUAL("tensor(x{})", ValueType::tensor_type({{"x"}}).to_spec());
+ EXPECT_EQUAL("tensor(y[10])", ValueType::tensor_type({{"y", 10}}).to_spec());
+ EXPECT_EQUAL("tensor(z[])", ValueType::tensor_type({{"z", 0}}).to_spec());
+ EXPECT_EQUAL("tensor(x{},y[10],z[])", ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}).to_spec());
+}
+
+TEST("require that value type spec can be parsed") {
+ EXPECT_EQUAL(ValueType::any_type(), ValueType::from_spec("any"));
+ EXPECT_EQUAL(ValueType::double_type(), ValueType::from_spec("double"));
+ EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec("tensor"));
+ EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec("tensor()"));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x"}}), ValueType::from_spec("tensor(x{})"));
+ EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec("tensor(y[10])"));
+ EXPECT_EQUAL(ValueType::tensor_type({{"z", 0}}), ValueType::from_spec("tensor(z[])"));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}), ValueType::from_spec("tensor(x{},y[10],z[])"));
+}
+
+TEST("require that value type spec can be parsed with extra whitespace") {
+ EXPECT_EQUAL(ValueType::any_type(), ValueType::from_spec(" any "));
+ EXPECT_EQUAL(ValueType::double_type(), ValueType::from_spec(" double "));
+ EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec(" tensor "));
+ EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec(" tensor ( ) "));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x"}}), ValueType::from_spec(" tensor ( x { } ) "));
+ EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec(" tensor ( y [ 10 ] ) "));
+ EXPECT_EQUAL(ValueType::tensor_type({{"z", 0}}), ValueType::from_spec(" tensor ( z [ ] ) "));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}),
+ ValueType::from_spec(" tensor ( x { } , y [ 10 ] , z [ ] ) "));
+}
+
+TEST("require that malformed value type spec is parsed as error") {
+ EXPECT_TRUE(ValueType::from_spec("").is_error());
+ EXPECT_TRUE(ValueType::from_spec(" ").is_error());
+ EXPECT_TRUE(ValueType::from_spec("error").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor tensor").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{10})").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{},)").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(,x{})").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{},,y{})").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{} y{})").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{}").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{}),").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x[10)").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x[foo])").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x,y)").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{},x{})").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{},x[10])").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(x{},x[])").is_error());
+}
+
+struct ParseResult {
+ vespalib::string spec;
+ const char *pos;
+ const char *end;
+ const char *after;
+ ValueType type;
+ ParseResult(const vespalib::string &spec_in)
+ : spec(spec_in),
+ pos(spec.data()),
+ end(pos + spec.size()),
+ after(nullptr),
+ type(value_type::parse_spec(pos, end, after)) {}
+ bool after_inside() const { return ((after > pos) && (after < end)); }
+};
+
+TEST("require that we can parse a partial string into a type with the low-level API") {
+ ParseResult result("tensor(a[]) , ");
+ EXPECT_EQUAL(result.type, ValueType::tensor_type({{"a", 0}}));
+ ASSERT_TRUE(result.after_inside());
+ EXPECT_EQUAL(*result.after, ',');
+}
+
+TEST("require that we can parse an abstract tensor type from a partial string") {
+ ParseResult result("tensor , ");
+ EXPECT_EQUAL(result.type, ValueType::tensor_type({}));
+ ASSERT_TRUE(result.after_inside());
+ EXPECT_EQUAL(*result.after, ',');
+}
+
+TEST("require that 'error' is the valid representation of the error type") {
+ ParseResult valid(" error ");
+ ParseResult invalid(" fubar ");
+ EXPECT_EQUAL(valid.type, ValueType::error_type());
+ EXPECT_TRUE(valid.after == valid.end); // parse ok
+ EXPECT_EQUAL(invalid.type, ValueType::error_type());
+ EXPECT_TRUE(invalid.after == nullptr); // parse not ok
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/eventbarrier/.gitignore b/vespalib/src/tests/eventbarrier/.gitignore
new file mode 100644
index 00000000000..89007477b2a
--- /dev/null
+++ b/vespalib/src/tests/eventbarrier/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+eventbarrier_test
+vespalib_eventbarrier_test_app
diff --git a/vespalib/src/tests/eventbarrier/CMakeLists.txt b/vespalib/src/tests/eventbarrier/CMakeLists.txt
new file mode 100644
index 00000000000..ce50f024445
--- /dev/null
+++ b/vespalib/src/tests/eventbarrier/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_eventbarrier_test_app
+ SOURCES
+ eventbarrier.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_eventbarrier_test_app COMMAND vespalib_eventbarrier_test_app)
diff --git a/vespalib/src/tests/eventbarrier/DESC b/vespalib/src/tests/eventbarrier/DESC
new file mode 100644
index 00000000000..f4546e14f34
--- /dev/null
+++ b/vespalib/src/tests/eventbarrier/DESC
@@ -0,0 +1 @@
+eventbarrier test. Take a look at eventbarrier.cpp for details.
diff --git a/vespalib/src/tests/eventbarrier/FILES b/vespalib/src/tests/eventbarrier/FILES
new file mode 100644
index 00000000000..5b3e360da02
--- /dev/null
+++ b/vespalib/src/tests/eventbarrier/FILES
@@ -0,0 +1 @@
+eventbarrier.cpp
diff --git a/vespalib/src/tests/eventbarrier/eventbarrier.cpp b/vespalib/src/tests/eventbarrier/eventbarrier.cpp
new file mode 100644
index 00000000000..6f2c5df13df
--- /dev/null
+++ b/vespalib/src/tests/eventbarrier/eventbarrier.cpp
@@ -0,0 +1,205 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("eventbarrier_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/eventbarrier.hpp>
+
+using namespace vespalib;
+
+struct MyBarrier {
+ bool done;
+ MyBarrier() : done(false) {}
+ void completeBarrier() {
+ done = true;
+ }
+};
+
+class Test : public TestApp
+{
+public:
+ void testEmpty();
+ void testSimple();
+ void testBarrierChain();
+ void testEventAfter();
+ void testReorder();
+ int Main();
+};
+
+void
+Test::testEmpty()
+{
+ // waiting for an empty set of events
+
+ MyBarrier b;
+ EventBarrier<MyBarrier> eb;
+
+ EXPECT_TRUE(!eb.startBarrier(b));
+ EXPECT_TRUE(!b.done);
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ uint32_t token = eb.startEvent();
+ eb.completeEvent(token);
+
+ EXPECT_TRUE(!eb.startBarrier(b));
+ EXPECT_TRUE(!b.done);
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+}
+
+void
+Test::testSimple()
+{
+ // a single barrier waiting for a single event
+
+ MyBarrier b;
+ EventBarrier<MyBarrier> eb;
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ uint32_t token = eb.startEvent();
+ EXPECT_EQUAL(eb.countEvents(), 1u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ EXPECT_TRUE(eb.startBarrier(b));
+ EXPECT_TRUE(!b.done);
+ EXPECT_EQUAL(eb.countEvents(), 1u);
+ EXPECT_EQUAL(eb.countBarriers(), 1u);
+
+ eb.completeEvent(token);
+ EXPECT_TRUE(b.done);
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+}
+
+void
+Test::testBarrierChain()
+{
+ // more than one barrier waiting for the same set of events
+
+ MyBarrier b1;
+ MyBarrier b2;
+ MyBarrier b3;
+ EventBarrier<MyBarrier> eb;
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ uint32_t token = eb.startEvent();
+ EXPECT_EQUAL(eb.countEvents(), 1u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ EXPECT_TRUE(eb.startBarrier(b1));
+ EXPECT_TRUE(eb.startBarrier(b2));
+ EXPECT_TRUE(eb.startBarrier(b3));
+ EXPECT_TRUE(!b1.done);
+ EXPECT_TRUE(!b2.done);
+ EXPECT_TRUE(!b3.done);
+
+ EXPECT_EQUAL(eb.countEvents(), 1u);
+ EXPECT_EQUAL(eb.countBarriers(), 3u);
+
+ eb.completeEvent(token);
+ EXPECT_TRUE(b1.done);
+ EXPECT_TRUE(b2.done);
+ EXPECT_TRUE(b3.done);
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+}
+
+void
+Test::testEventAfter()
+{
+ // new events starting after the start of a barrier
+
+ MyBarrier b;
+ EventBarrier<MyBarrier> eb;
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ uint32_t token = eb.startEvent();
+ EXPECT_EQUAL(eb.countEvents(), 1u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ EXPECT_TRUE(eb.startBarrier(b));
+ EXPECT_TRUE(!b.done);
+ EXPECT_EQUAL(eb.countEvents(), 1u);
+ EXPECT_EQUAL(eb.countBarriers(), 1u);
+
+ uint32_t t2 = eb.startEvent();
+ EXPECT_TRUE(!b.done);
+ EXPECT_EQUAL(eb.countEvents(), 2u);
+ EXPECT_EQUAL(eb.countBarriers(), 1u);
+
+ eb.completeEvent(token);
+ EXPECT_TRUE(b.done);
+ EXPECT_EQUAL(eb.countEvents(), 1u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+
+ eb.completeEvent(t2);
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+}
+
+void
+Test::testReorder()
+{
+ // events completing in a different order than they started
+
+ MyBarrier b1;
+ MyBarrier b2;
+ MyBarrier b3;
+ EventBarrier<MyBarrier> eb;
+
+ uint32_t t1 = eb.startEvent();
+ eb.startBarrier(b1);
+ uint32_t t2 = eb.startEvent();
+ eb.startBarrier(b2);
+ uint32_t t3 = eb.startEvent();
+ eb.startBarrier(b3);
+ uint32_t t4 = eb.startEvent();
+
+ EXPECT_EQUAL(eb.countEvents(), 4u);
+ EXPECT_EQUAL(eb.countBarriers(), 3u);
+
+ EXPECT_TRUE(!b1.done);
+ EXPECT_TRUE(!b2.done);
+ EXPECT_TRUE(!b3.done);
+
+ eb.completeEvent(t4);
+ EXPECT_TRUE(!b1.done);
+ EXPECT_TRUE(!b2.done);
+ EXPECT_TRUE(!b3.done);
+
+ eb.completeEvent(t3);
+ EXPECT_TRUE(!b1.done);
+ EXPECT_TRUE(!b2.done);
+ EXPECT_TRUE(!b3.done);
+
+ eb.completeEvent(t1);
+ EXPECT_TRUE(b1.done);
+ EXPECT_TRUE(!b2.done);
+ EXPECT_TRUE(!b3.done);
+
+ eb.completeEvent(t2);
+ EXPECT_TRUE(b1.done);
+ EXPECT_TRUE(b2.done);
+ EXPECT_TRUE(b3.done);
+
+ EXPECT_EQUAL(eb.countEvents(), 0u);
+ EXPECT_EQUAL(eb.countBarriers(), 0u);
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("eventbarrier_test");
+ testEmpty();
+ testSimple();
+ testBarrierChain();
+ testEventAfter();
+ testReorder();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test);
diff --git a/vespalib/src/tests/exception_classes/.gitignore b/vespalib/src/tests/exception_classes/.gitignore
new file mode 100644
index 00000000000..bed545b71f8
--- /dev/null
+++ b/vespalib/src/tests/exception_classes/.gitignore
@@ -0,0 +1 @@
+vespalib_exception_classes_test_app
diff --git a/vespalib/src/tests/exception_classes/CMakeLists.txt b/vespalib/src/tests/exception_classes/CMakeLists.txt
new file mode 100644
index 00000000000..928200be5c7
--- /dev/null
+++ b/vespalib/src/tests/exception_classes/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_exception_classes_test_app
+ SOURCES
+ exception_classes_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_exception_classes_test_app COMMAND vespalib_exception_classes_test_app)
diff --git a/vespalib/src/tests/exception_classes/FILES b/vespalib/src/tests/exception_classes/FILES
new file mode 100644
index 00000000000..9a2697291f2
--- /dev/null
+++ b/vespalib/src/tests/exception_classes/FILES
@@ -0,0 +1 @@
+exception_classes_test.cpp
diff --git a/vespalib/src/tests/exception_classes/exception_classes_test.cpp b/vespalib/src/tests/exception_classes/exception_classes_test.cpp
new file mode 100644
index 00000000000..f9413970281
--- /dev/null
+++ b/vespalib/src/tests/exception_classes/exception_classes_test.cpp
@@ -0,0 +1,36 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/exceptions.h>
+
+using namespace vespalib;
+
+TEST("require that PortListenException retains relevant information") {
+ PortListenException error(80, "HTTP", "details", VESPA_STRLOC, 0);
+ try {
+ error.throwSelf();
+ ASSERT_TRUE(false);
+ } catch(PortListenException e) {
+ fprintf(stderr, "what: %s\n", e.what());
+ EXPECT_EQUAL(80, e.get_port());
+ EXPECT_EQUAL("HTTP", e.get_protocol());
+ EXPECT_TRUE(e.getCause() == nullptr);
+ }
+}
+
+TEST("require that PortListenException with cause retains relevant information") {
+ Exception root("root");
+ PortListenException error(1337, "RPC", root, "details", VESPA_STRLOC, 0);
+ try {
+ error.throwSelf();
+ ASSERT_TRUE(false);
+ } catch(PortListenException e) {
+ fprintf(stderr, "what: %s\n", e.what());
+ EXPECT_EQUAL(1337, e.get_port());
+ EXPECT_EQUAL("RPC", e.get_protocol());
+ EXPECT_TRUE(e.getCause() != nullptr);
+ EXPECT_TRUE(e.getCause() != &root);
+ EXPECT_EQUAL("root", e.getCause()->getMessage());
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/executor/.cvsignore b/vespalib/src/tests/executor/.cvsignore
new file mode 100644
index 00000000000..fe2e31358ec
--- /dev/null
+++ b/vespalib/src/tests/executor/.cvsignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+executor_test
diff --git a/vespalib/src/tests/executor/.gitignore b/vespalib/src/tests/executor/.gitignore
new file mode 100644
index 00000000000..36ffae1f6ed
--- /dev/null
+++ b/vespalib/src/tests/executor/.gitignore
@@ -0,0 +1,8 @@
+.depend
+Makefile
+executor_test
+stress_test
+threadstackexecutor_test
+vespalib_executor_test_app
+vespalib_stress_test_app
+vespalib_threadstackexecutor_test_app
diff --git a/vespalib/src/tests/executor/CMakeLists.txt b/vespalib/src/tests/executor/CMakeLists.txt
new file mode 100644
index 00000000000..5b5ab2ab169
--- /dev/null
+++ b/vespalib/src/tests/executor/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_threadstackexecutor_test_app
+ SOURCES
+ threadstackexecutor_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_threadstackexecutor_test_app COMMAND vespalib_threadstackexecutor_test_app)
+vespa_add_executable(vespalib_executor_test_app
+ SOURCES
+ executor_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_executor_test_app COMMAND vespalib_executor_test_app)
+vespa_add_executable(vespalib_stress_test_app
+ SOURCES
+ stress_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_stress_test_app COMMAND vespalib_stress_test_app BENCHMARK)
diff --git a/vespalib/src/tests/executor/DESC b/vespalib/src/tests/executor/DESC
new file mode 100644
index 00000000000..814694d4c20
--- /dev/null
+++ b/vespalib/src/tests/executor/DESC
@@ -0,0 +1 @@
+Tests code used to run tasks concurrently in multiple threads.
diff --git a/vespalib/src/tests/executor/FILES b/vespalib/src/tests/executor/FILES
new file mode 100644
index 00000000000..0a6c8c0a73d
--- /dev/null
+++ b/vespalib/src/tests/executor/FILES
@@ -0,0 +1 @@
+threadstackexecutor_test.cpp
diff --git a/vespalib/src/tests/executor/executor_test.cpp b/vespalib/src/tests/executor/executor_test.cpp
new file mode 100644
index 00000000000..edb352c797c
--- /dev/null
+++ b/vespalib/src/tests/executor/executor_test.cpp
@@ -0,0 +1,43 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Unit tests for executor.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("executor_test");
+
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/closuretask.h>
+
+using namespace vespalib;
+
+namespace {
+
+class Test : public vespalib::TestApp {
+ void requireThatClosuresCanBeWrappedInATask();
+
+public:
+ int Main();
+};
+
+int
+Test::Main()
+{
+ TEST_INIT("executor_test");
+
+ TEST_DO(requireThatClosuresCanBeWrappedInATask());
+
+ TEST_DONE();
+}
+
+void setBool(bool *b) { *b = true; }
+void Test::requireThatClosuresCanBeWrappedInATask() {
+ bool called = false;
+ Executor::Task::UP task = makeTask(makeClosure(setBool, &called));
+ EXPECT_TRUE(!called);
+ task->run();
+ EXPECT_TRUE(called);
+}
+
+} // namespace
+
+TEST_APPHOOK(Test);
diff --git a/vespalib/src/tests/executor/stress_test.cpp b/vespalib/src/tests/executor/stress_test.cpp
new file mode 100644
index 00000000000..bf130dcb9dc
--- /dev/null
+++ b/vespalib/src/tests/executor/stress_test.cpp
@@ -0,0 +1,150 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("executor_test");
+#include <vespa/vespalib/testkit/testapp.h>
+
+#include <vespa/vespalib/util/executor.h>
+#include <vespa/vespalib/util/sync.h>
+#include <vespa/vespalib/util/threadstackexecutor.h>
+
+#include <math.h>
+
+using namespace vespalib;
+
+uint32_t doStuff(uint32_t input) {
+ char buf[128];
+ for (uint32_t i = 0; i < sizeof(buf); ++i) {
+ buf[i] = ((input + i) * i) & 0xff;
+ }
+ uint32_t result = 0;
+ for (uint32_t i = 0; i < sizeof(buf); ++i) {
+ result += ((buf[i] * i) + input) & 0xff;
+ }
+ return result;
+}
+
+struct CPUTask : public Executor::Task {
+ uint32_t taskSize;
+ uint32_t &result;
+ CPUTask(uint32_t size, uint32_t &res) : taskSize(size), result(res) {}
+ virtual void run() {
+ uint32_t res = 0;
+ for (uint32_t i = 0; i < taskSize; ++i) {
+ res += doStuff(i);
+ }
+ result += res;
+ }
+};
+
+struct SyncTask : public Executor::Task {
+ Gate &gate;
+ CountDownLatch &latch;
+ SyncTask(Gate &g, CountDownLatch &l) : gate(g), latch(l) {}
+ virtual void run() {
+ latch.countDown();
+ gate.await();
+ }
+};
+
+class Test : public TestApp
+{
+private:
+ uint32_t _result;
+
+public:
+ Test() : _result(0) {}
+ uint32_t calibrate(double ms);
+ void stress(Executor &executor, uint32_t taskSize, uint32_t numTasks);
+ int Main();
+};
+
+uint32_t
+Test::calibrate(double wanted_ms)
+{
+ uint32_t n = 0;
+ FastOS_Time t0;
+ FastOS_Time t1;
+ { // calibration of calibration loop
+ uint32_t result = 0;
+ t0.SetNow();
+ double ms;
+ do {
+ result += doStuff(++n);
+ t1.SetNow();
+ ms = (t1.MilliSecs() - t0.MilliSecs());
+ } while (ms < 1000.0);
+ _result += result;
+ }
+ { // calibrate loop
+ t0.SetNow();
+ uint32_t result = 0;
+ for (uint32_t i = 0; i < n; ++i) {
+ result += doStuff(i);
+ }
+ _result += result;
+ t1.SetNow();
+ }
+ double ms = (t1.MilliSecs() - t0.MilliSecs());
+ double size = (((double)n) / ms) * wanted_ms;
+ return (uint32_t) round(size);
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("stress_test");
+ if (_argc != 4) {
+ fprintf(stderr, "Usage: %s <threads> <ms per task> <tasks>\n",
+ _argv[0]);
+ TEST_DONE();
+ }
+ uint32_t threads = atoi(_argv[1]);
+ double ms_per_task = strtod(_argv[2], 0);
+ uint32_t tasks = atoi(_argv[3]);
+ fprintf(stderr, "threads : %u\n", threads);
+ fprintf(stderr, "ms per task: %g\n", ms_per_task);
+ fprintf(stderr, "tasks : %u\n", tasks);
+ {
+ fprintf(stderr, "calibrating task size...\n");
+ uint32_t taskSize = calibrate(ms_per_task);
+ fprintf(stderr, "calibrated task size: %u\n", taskSize);
+ ThreadStackExecutor executor(threads, 128000, 5000 + threads);
+ {
+ Gate gate;
+ CountDownLatch latch(threads);
+ for (uint32_t i = 0; i < threads; ++i) {
+ Executor::Task::UP res
+ = executor.execute(Executor::Task::UP(
+ new SyncTask(gate, latch)));
+ ASSERT_TRUE(res.get() == 0);
+ }
+ latch.await();
+ gate.countDown();
+ executor.sync();
+ fprintf(stderr, "all threads have been accounted for...\n");
+ }
+ {
+ FastOS_Time t0;
+ FastOS_Time t1;
+ fprintf(stderr, "starting task submission...\n");
+ t0.SetNow();
+ uint32_t result = 0;
+ for (uint32_t i = 0; i < tasks; ++i) {
+ Executor::Task::UP t(new CPUTask(taskSize, result));
+ t = executor.execute(std::move(t));
+ while (t.get() != 0) {
+ FastOS_Thread::Sleep(10);
+ t = executor.execute(std::move(t));
+ }
+ }
+ executor.sync();
+ t1.SetNow();
+ double ms = (t1.MilliSecs() - t0.MilliSecs());
+ fprintf(stderr, "total execution wall time: %g ms\n", ms);
+ _result += result;
+ }
+ }
+ TEST_DONE();
+}
+TEST_APPHOOK(Test);
diff --git a/vespalib/src/tests/executor/threadstackexecutor_test.cpp b/vespalib/src/tests/executor/threadstackexecutor_test.cpp
new file mode 100644
index 00000000000..0eb08a80f41
--- /dev/null
+++ b/vespalib/src/tests/executor/threadstackexecutor_test.cpp
@@ -0,0 +1,119 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/atomic.h>
+
+#include <vespa/vespalib/util/threadstackexecutor.h>
+#include <vespa/vespalib/util/sync.h>
+
+using namespace vespalib;
+
+typedef Executor::Task Task;
+
+struct MyTask : public Executor::Task {
+ Gate &gate;
+ CountDownLatch &latch;
+ static uint32_t runCnt;
+ static uint32_t deleteCnt;
+ MyTask(Gate &g, CountDownLatch &l) : gate(g), latch(l) {}
+ virtual void run() {
+ Atomic::postInc(&runCnt);
+ latch.countDown();
+ gate.await();
+ }
+ virtual ~MyTask() {
+ Atomic::postInc(&deleteCnt);
+ }
+ static void resetStats() {
+ runCnt = 0;
+ deleteCnt = 0;
+ }
+};
+uint32_t MyTask::runCnt = 0;
+uint32_t MyTask::deleteCnt = 0;
+
+struct MyState {
+ Gate gate; // to block workers
+ CountDownLatch latch; // to wait for workers
+ ThreadStackExecutor executor;
+ bool checked;
+ MyState() : gate(), latch(10), executor(10, 128000, 20), checked(false)
+ {
+ MyTask::resetStats();
+ }
+ MyState &execute(uint32_t cnt) {
+ for (uint32_t i = 0; i < cnt; ++i) {
+ executor.execute(Task::UP(new MyTask(gate, latch)));
+ }
+ return *this;
+ }
+ MyState &sync() {
+ executor.sync();
+ return *this;
+ }
+ MyState &shutdown() {
+ executor.shutdown();
+ return *this;
+ }
+ MyState &open() {
+ gate.countDown();
+ return *this;
+ }
+ MyState &wait() {
+ latch.await();
+ return *this;
+ }
+ MyState &check(uint32_t expect_rejected,
+ uint32_t expect_queue,
+ uint32_t expect_running,
+ uint32_t expect_deleted)
+ {
+ ASSERT_TRUE(!checked);
+ checked = true;
+ ThreadStackExecutor::Stats stats = executor.getStats();
+ EXPECT_EQUAL(expect_running + expect_deleted, MyTask::runCnt);
+ EXPECT_EQUAL(expect_rejected + expect_deleted, MyTask::deleteCnt);
+ EXPECT_EQUAL(expect_queue + expect_running + expect_deleted,
+ stats.acceptedTasks);
+ EXPECT_EQUAL(expect_rejected, stats.rejectedTasks);
+ EXPECT_TRUE(!(gate.getCount() == 1) || (expect_deleted == 0));
+ if (expect_deleted == 0) {
+ EXPECT_EQUAL(expect_queue + expect_running, stats.maxPendingTasks);
+ }
+ stats = executor.getStats();
+ EXPECT_EQUAL(expect_queue + expect_running, stats.maxPendingTasks);
+ EXPECT_EQUAL(0u, stats.acceptedTasks);
+ EXPECT_EQUAL(0u, stats.rejectedTasks);
+ return *this;
+ }
+};
+
+
+TEST_F("requireThatTasksAreRunAndDeleted", MyState()) {
+ TEST_DO(f1.open().execute(5).sync().check(0, 0, 0, 5));
+}
+
+TEST_F("requireThatTasksRunConcurrently", MyState()) {
+ TEST_DO(f1.execute(10).wait().check(0, 0, 10, 0).open());
+}
+
+TEST_F("requireThatThreadCountIsRespected", MyState()) {
+ TEST_DO(f1.execute(20).wait().check(0, 10, 10, 0).open());
+}
+
+TEST_F("requireThatExtraTasksAreDropped", MyState()) {
+ TEST_DO(f1.execute(40).wait().check(20, 10, 10, 0).open());
+}
+
+TEST_F("requireThatActiveWorkersDrainInputQueue", MyState()) {
+ TEST_DO(f1.execute(20).wait().open().sync().check(0, 0, 0, 20));
+}
+
+TEST_F("requireThatPendingTasksAreRunAfterShutdown", MyState()) {
+ TEST_DO(f1.execute(20).wait().shutdown().open().sync().check(0, 0, 0, 20));
+}
+
+TEST_F("requireThatNewTasksAreDroppedAfterShutdown", MyState()) {
+ TEST_DO(f1.open().shutdown().execute(5).sync().check(5, 0, 0, 0));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/explore_modern_cpp/.gitignore b/vespalib/src/tests/explore_modern_cpp/.gitignore
new file mode 100644
index 00000000000..202178fb850
--- /dev/null
+++ b/vespalib/src/tests/explore_modern_cpp/.gitignore
@@ -0,0 +1 @@
+vespalib_explore_modern_cpp_test_app
diff --git a/vespalib/src/tests/explore_modern_cpp/CMakeLists.txt b/vespalib/src/tests/explore_modern_cpp/CMakeLists.txt
new file mode 100644
index 00000000000..d2406224a05
--- /dev/null
+++ b/vespalib/src/tests/explore_modern_cpp/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_explore_modern_cpp_test_app
+ SOURCES
+ explore_modern_cpp_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_explore_modern_cpp_test_app COMMAND vespalib_explore_modern_cpp_test_app)
diff --git a/vespalib/src/tests/explore_modern_cpp/FILES b/vespalib/src/tests/explore_modern_cpp/FILES
new file mode 100644
index 00000000000..e5522821b16
--- /dev/null
+++ b/vespalib/src/tests/explore_modern_cpp/FILES
@@ -0,0 +1 @@
+explore_modern_cpp_test.cpp
diff --git a/vespalib/src/tests/explore_modern_cpp/explore_modern_cpp_test.cpp b/vespalib/src/tests/explore_modern_cpp/explore_modern_cpp_test.cpp
new file mode 100644
index 00000000000..05703b15641
--- /dev/null
+++ b/vespalib/src/tests/explore_modern_cpp/explore_modern_cpp_test.cpp
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+TEST("verify how std::function copies lambda closures") {
+ size_t count = 0;
+ size_t value = 0;
+ auto closure = [count,&value]()mutable{ ++count; value += count; };
+ closure();
+ EXPECT_EQUAL(0u, count);
+ EXPECT_EQUAL(1u, value); // +1
+ closure();
+ EXPECT_EQUAL(3u, value); // +2
+ std::function<void()> fun = closure;
+ fun();
+ EXPECT_EQUAL(6u, value); // +3
+ closure();
+ EXPECT_EQUAL(9u, value); // +3 (fun had a copy of count)
+ auto &closure_ref = closure;
+ std::function<void()> fun2 = closure_ref;
+ fun2();
+ EXPECT_EQUAL(13u, value); // +4
+ closure();
+ EXPECT_EQUAL(17u, value); // +4 (fun2 had a copy of count)
+ std::function<void()> fun3 = std::ref(closure);
+ fun3();
+ EXPECT_EQUAL(22u, value); // +5
+ closure();
+ EXPECT_EQUAL(28u, value); // +6 (fun only had a copy of the wrapper)
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/false/.gitignore b/vespalib/src/tests/false/.gitignore
new file mode 100644
index 00000000000..bf1e2a0e003
--- /dev/null
+++ b/vespalib/src/tests/false/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+false_test
+vespalib_false_test_app
diff --git a/vespalib/src/tests/false/CMakeLists.txt b/vespalib/src/tests/false/CMakeLists.txt
new file mode 100644
index 00000000000..50b77578c7f
--- /dev/null
+++ b/vespalib/src/tests/false/CMakeLists.txt
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_false_test_app
+ SOURCES
+ false.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/false/DESC b/vespalib/src/tests/false/DESC
new file mode 100644
index 00000000000..8c53ee33b94
--- /dev/null
+++ b/vespalib/src/tests/false/DESC
@@ -0,0 +1 @@
+Test that always fails. May also be used as template for new tests.
diff --git a/vespalib/src/tests/false/FILES b/vespalib/src/tests/false/FILES
new file mode 100644
index 00000000000..0b9cc9b4ef7
--- /dev/null
+++ b/vespalib/src/tests/false/FILES
@@ -0,0 +1 @@
+false.cpp
diff --git a/vespalib/src/tests/false/false.cpp b/vespalib/src/tests/false/false.cpp
new file mode 100644
index 00000000000..5c93d402086
--- /dev/null
+++ b/vespalib/src/tests/false/false.cpp
@@ -0,0 +1,15 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("false_test");
+#include <vespa/vespalib/testkit/testapp.h>
+
+TEST_SETUP(Test)
+
+int
+Test::Main()
+{
+ TEST_INIT("false_test");
+ EXPECT_TRUE(false);
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/fiddle/.gitignore b/vespalib/src/tests/fiddle/.gitignore
new file mode 100644
index 00000000000..8442c634239
--- /dev/null
+++ b/vespalib/src/tests/fiddle/.gitignore
@@ -0,0 +1 @@
+vespalib_fiddle_test_app
diff --git a/vespalib/src/tests/fiddle/CMakeLists.txt b/vespalib/src/tests/fiddle/CMakeLists.txt
new file mode 100644
index 00000000000..a110209846d
--- /dev/null
+++ b/vespalib/src/tests/fiddle/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_fiddle_test_app
+ SOURCES
+ fiddle_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_fiddle_test_app COMMAND vespalib_fiddle_test_app)
diff --git a/vespalib/src/tests/fiddle/FILES b/vespalib/src/tests/fiddle/FILES
new file mode 100644
index 00000000000..7f508ef8058
--- /dev/null
+++ b/vespalib/src/tests/fiddle/FILES
@@ -0,0 +1 @@
+fiddle_test.cpp
diff --git a/vespalib/src/tests/fiddle/fiddle_test.cpp b/vespalib/src/tests/fiddle/fiddle_test.cpp
new file mode 100644
index 00000000000..771623d2002
--- /dev/null
+++ b/vespalib/src/tests/fiddle/fiddle_test.cpp
@@ -0,0 +1,156 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/fiddle.h>
+
+using namespace vespalib::bits;
+
+TEST("require that mix mixes") {
+ EXPECT_EQUAL(0xffffffffu, mix(0xffffffffu, 0x00000000, 100));
+ EXPECT_EQUAL(0xffffffffu, mix(0xffffffffu, 0x00000000, 33));
+
+ EXPECT_EQUAL(0x00000000u, mix(0x00000000, 0xffffffffu, 100));
+ EXPECT_EQUAL(0x00000000u, mix(0x00000000, 0xffffffffu, 33));
+
+ EXPECT_EQUAL(0xffffffffu, mix(0xffffffffu, 0x00000000, 32));
+ EXPECT_EQUAL(0xfffffffeu, mix(0xffffffffu, 0x00000000, 31));
+ EXPECT_EQUAL(0xfffffffcu, mix(0xffffffffu, 0x00000000, 30));
+ EXPECT_EQUAL(0xfffffff8u, mix(0xffffffffu, 0x00000000, 29));
+ EXPECT_EQUAL(0xfffffff0u, mix(0xffffffffu, 0x00000000, 28));
+ EXPECT_EQUAL(0xffffffe0u, mix(0xffffffffu, 0x00000000, 27));
+ EXPECT_EQUAL(0xffffffc0u, mix(0xffffffffu, 0x00000000, 26));
+ EXPECT_EQUAL(0xffffff80u, mix(0xffffffffu, 0x00000000, 25));
+ EXPECT_EQUAL(0xffffff00u, mix(0xffffffffu, 0x00000000, 24));
+ EXPECT_EQUAL(0xfffffe00u, mix(0xffffffffu, 0x00000000, 23));
+ EXPECT_EQUAL(0xfffffc00u, mix(0xffffffffu, 0x00000000, 22));
+ EXPECT_EQUAL(0xfffff800u, mix(0xffffffffu, 0x00000000, 21));
+ EXPECT_EQUAL(0xfffff000u, mix(0xffffffffu, 0x00000000, 20));
+ EXPECT_EQUAL(0xffffe000u, mix(0xffffffffu, 0x00000000, 19));
+ EXPECT_EQUAL(0xffffc000u, mix(0xffffffffu, 0x00000000, 18));
+ EXPECT_EQUAL(0xffff8000u, mix(0xffffffffu, 0x00000000, 17));
+ EXPECT_EQUAL(0xffff0000u, mix(0xffffffffu, 0x00000000, 16));
+ EXPECT_EQUAL(0xfffe0000u, mix(0xffffffffu, 0x00000000, 15));
+ EXPECT_EQUAL(0xfffc0000u, mix(0xffffffffu, 0x00000000, 14));
+ EXPECT_EQUAL(0xfff80000u, mix(0xffffffffu, 0x00000000, 13));
+ EXPECT_EQUAL(0xfff00000u, mix(0xffffffffu, 0x00000000, 12));
+ EXPECT_EQUAL(0xffe00000u, mix(0xffffffffu, 0x00000000, 11));
+ EXPECT_EQUAL(0xffc00000u, mix(0xffffffffu, 0x00000000, 10));
+ EXPECT_EQUAL(0xff800000u, mix(0xffffffffu, 0x00000000, 9));
+ EXPECT_EQUAL(0xff000000u, mix(0xffffffffu, 0x00000000, 8));
+ EXPECT_EQUAL(0xfe000000u, mix(0xffffffffu, 0x00000000, 7));
+ EXPECT_EQUAL(0xfc000000u, mix(0xffffffffu, 0x00000000, 6));
+ EXPECT_EQUAL(0xf8000000u, mix(0xffffffffu, 0x00000000, 5));
+ EXPECT_EQUAL(0xf0000000u, mix(0xffffffffu, 0x00000000, 4));
+ EXPECT_EQUAL(0xe0000000u, mix(0xffffffffu, 0x00000000, 3));
+ EXPECT_EQUAL(0xc0000000u, mix(0xffffffffu, 0x00000000, 2));
+ EXPECT_EQUAL(0x80000000u, mix(0xffffffffu, 0x00000000, 1));
+ EXPECT_EQUAL(0x00000000u, mix(0xffffffffu, 0x00000000, 0));
+
+ EXPECT_EQUAL(0x00000000u, mix(0x00000000, 0xffffffffu, 32));
+ EXPECT_EQUAL(0x00000001u, mix(0x00000000, 0xffffffffu, 31));
+ EXPECT_EQUAL(0x00000003u, mix(0x00000000, 0xffffffffu, 30));
+ EXPECT_EQUAL(0x00000007u, mix(0x00000000, 0xffffffffu, 29));
+ EXPECT_EQUAL(0x0000000fu, mix(0x00000000, 0xffffffffu, 28));
+ EXPECT_EQUAL(0x0000001fu, mix(0x00000000, 0xffffffffu, 27));
+ EXPECT_EQUAL(0x0000003fu, mix(0x00000000, 0xffffffffu, 26));
+ EXPECT_EQUAL(0x0000007fu, mix(0x00000000, 0xffffffffu, 25));
+ EXPECT_EQUAL(0x000000ffu, mix(0x00000000, 0xffffffffu, 24));
+ EXPECT_EQUAL(0x000001ffu, mix(0x00000000, 0xffffffffu, 23));
+ EXPECT_EQUAL(0x000003ffu, mix(0x00000000, 0xffffffffu, 22));
+ EXPECT_EQUAL(0x000007ffu, mix(0x00000000, 0xffffffffu, 21));
+ EXPECT_EQUAL(0x00000fffu, mix(0x00000000, 0xffffffffu, 20));
+ EXPECT_EQUAL(0x00001fffu, mix(0x00000000, 0xffffffffu, 19));
+ EXPECT_EQUAL(0x00003fffu, mix(0x00000000, 0xffffffffu, 18));
+ EXPECT_EQUAL(0x00007fffu, mix(0x00000000, 0xffffffffu, 17));
+ EXPECT_EQUAL(0x0000ffffu, mix(0x00000000, 0xffffffffu, 16));
+ EXPECT_EQUAL(0x0001ffffu, mix(0x00000000, 0xffffffffu, 15));
+ EXPECT_EQUAL(0x0003ffffu, mix(0x00000000, 0xffffffffu, 14));
+ EXPECT_EQUAL(0x0007ffffu, mix(0x00000000, 0xffffffffu, 13));
+ EXPECT_EQUAL(0x000fffffu, mix(0x00000000, 0xffffffffu, 12));
+ EXPECT_EQUAL(0x001fffffu, mix(0x00000000, 0xffffffffu, 11));
+ EXPECT_EQUAL(0x003fffffu, mix(0x00000000, 0xffffffffu, 10));
+ EXPECT_EQUAL(0x007fffffu, mix(0x00000000, 0xffffffffu, 9));
+ EXPECT_EQUAL(0x00ffffffu, mix(0x00000000, 0xffffffffu, 8));
+ EXPECT_EQUAL(0x01ffffffu, mix(0x00000000, 0xffffffffu, 7));
+ EXPECT_EQUAL(0x03ffffffu, mix(0x00000000, 0xffffffffu, 6));
+ EXPECT_EQUAL(0x07ffffffu, mix(0x00000000, 0xffffffffu, 5));
+ EXPECT_EQUAL(0x0fffffffu, mix(0x00000000, 0xffffffffu, 4));
+ EXPECT_EQUAL(0x1fffffffu, mix(0x00000000, 0xffffffffu, 3));
+ EXPECT_EQUAL(0x3fffffffu, mix(0x00000000, 0xffffffffu, 2));
+ EXPECT_EQUAL(0x7fffffffu, mix(0x00000000, 0xffffffffu, 1));
+ EXPECT_EQUAL(0xffffffffu, mix(0x00000000, 0xffffffffu, 0));
+}
+
+TEST("require that leading zeros are counted correctly") {
+ EXPECT_EQUAL(32u, leading_zeros(0x00000000u));
+ EXPECT_EQUAL(31u, leading_zeros(0x00000001u));
+ EXPECT_EQUAL(30u, leading_zeros(0x00000003u));
+ EXPECT_EQUAL(29u, leading_zeros(0x00000007u));
+ EXPECT_EQUAL(28u, leading_zeros(0x0000000fu));
+ EXPECT_EQUAL(27u, leading_zeros(0x0000001fu));
+ EXPECT_EQUAL(26u, leading_zeros(0x0000003fu));
+ EXPECT_EQUAL(25u, leading_zeros(0x0000007fu));
+ EXPECT_EQUAL(24u, leading_zeros(0x000000ffu));
+ EXPECT_EQUAL(23u, leading_zeros(0x000001ffu));
+ EXPECT_EQUAL(22u, leading_zeros(0x000003ffu));
+ EXPECT_EQUAL(21u, leading_zeros(0x000007ffu));
+ EXPECT_EQUAL(20u, leading_zeros(0x00000fffu));
+ EXPECT_EQUAL(19u, leading_zeros(0x00001fffu));
+ EXPECT_EQUAL(18u, leading_zeros(0x00003fffu));
+ EXPECT_EQUAL(17u, leading_zeros(0x00007fffu));
+ EXPECT_EQUAL(16u, leading_zeros(0x0000ffffu));
+ EXPECT_EQUAL(15u, leading_zeros(0x0001ffffu));
+ EXPECT_EQUAL(14u, leading_zeros(0x0003ffffu));
+ EXPECT_EQUAL(13u, leading_zeros(0x0007ffffu));
+ EXPECT_EQUAL(12u, leading_zeros(0x000fffffu));
+ EXPECT_EQUAL(11u, leading_zeros(0x001fffffu));
+ EXPECT_EQUAL(10u, leading_zeros(0x003fffffu));
+ EXPECT_EQUAL( 9u, leading_zeros(0x007fffffu));
+ EXPECT_EQUAL( 8u, leading_zeros(0x00ffffffu));
+ EXPECT_EQUAL( 7u, leading_zeros(0x01ffffffu));
+ EXPECT_EQUAL( 6u, leading_zeros(0x03ffffffu));
+ EXPECT_EQUAL( 5u, leading_zeros(0x07ffffffu));
+ EXPECT_EQUAL( 4u, leading_zeros(0x0fffffffu));
+ EXPECT_EQUAL( 3u, leading_zeros(0x1fffffffu));
+ EXPECT_EQUAL( 2u, leading_zeros(0x3fffffffu));
+ EXPECT_EQUAL( 1u, leading_zeros(0x7fffffffu));
+ EXPECT_EQUAL( 0u, leading_zeros(0xffffffffu));
+
+ EXPECT_EQUAL(8u, leading_zeros(0x00ffff00u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00fffe00u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00fffc00u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00fff800u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00fff000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00ffe000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00ffc000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00ff8000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00ff0000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00fe0000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00fc0000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00f80000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00f00000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00e00000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00c00000u));
+ EXPECT_EQUAL(8u, leading_zeros(0x00800000u));
+}
+
+
+void verify_range_split(uint32_t min, uint32_t max,
+ uint32_t expect_suffix,
+ uint32_t expect_first_max,
+ uint32_t expect_last_min)
+{
+ uint32_t first_max = 0;
+ uint32_t last_min = 0;
+ EXPECT_EQUAL(expect_suffix, split_range(min, max, first_max, last_min));
+ EXPECT_EQUAL(expect_first_max, first_max);
+ EXPECT_EQUAL(expect_last_min, last_min);
+}
+
+TEST("require that ranges are split correctly") {
+ TEST_DO(verify_range_split(0, 0, 0, 0, 0));
+ TEST_DO(verify_range_split(503, 503, 0, 503, 503));
+
+ TEST_DO(verify_range_split(0xc5, 0xf7, 6, 0xdf, 0xe0));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/gencnt/.gitignore b/vespalib/src/tests/gencnt/.gitignore
new file mode 100644
index 00000000000..682aec97b1a
--- /dev/null
+++ b/vespalib/src/tests/gencnt/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+gencnt_test
+vespalib_gencnt_test_app
diff --git a/vespalib/src/tests/gencnt/CMakeLists.txt b/vespalib/src/tests/gencnt/CMakeLists.txt
new file mode 100644
index 00000000000..ddacebae09f
--- /dev/null
+++ b/vespalib/src/tests/gencnt/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_gencnt_test_app
+ SOURCES
+ gencnt_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_gencnt_test_app COMMAND vespalib_gencnt_test_app)
diff --git a/vespalib/src/tests/gencnt/DESC b/vespalib/src/tests/gencnt/DESC
new file mode 100644
index 00000000000..6cdaa76b812
--- /dev/null
+++ b/vespalib/src/tests/gencnt/DESC
@@ -0,0 +1,2 @@
+Test GenCnt class. This class is used to hold a generation count and
+also to do some common calculations on it.
diff --git a/vespalib/src/tests/gencnt/FILES b/vespalib/src/tests/gencnt/FILES
new file mode 100644
index 00000000000..de6ec5596e1
--- /dev/null
+++ b/vespalib/src/tests/gencnt/FILES
@@ -0,0 +1 @@
+gencnt.cpp
diff --git a/vespalib/src/tests/gencnt/gencnt_test.cpp b/vespalib/src/tests/gencnt/gencnt_test.cpp
new file mode 100644
index 00000000000..af192dd1a78
--- /dev/null
+++ b/vespalib/src/tests/gencnt/gencnt_test.cpp
@@ -0,0 +1,86 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("gencnt_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/gencnt.h>
+
+using vespalib::GenCnt;
+
+TEST_SETUP(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("gencnt_test");
+
+ GenCnt first;
+
+ GenCnt a;
+ GenCnt b;
+ GenCnt c;
+
+ a.setFromInt(5);
+ b.setFromInt(5);
+ c.setFromInt(5);
+ EXPECT_TRUE(a == b);
+ EXPECT_TRUE(!(a != b));
+ EXPECT_TRUE(b.inRangeInclusive(a, c));
+ EXPECT_TRUE(b.inRangeInclusive(c, a));
+
+ a.setFromInt(5);
+ b.setFromInt(6);
+ c.setFromInt(7);
+ EXPECT_TRUE(a != b);
+ EXPECT_TRUE(!(a == b));
+ EXPECT_TRUE(b.inRangeInclusive(a, c));
+ EXPECT_TRUE(!b.inRangeInclusive(c, a));
+ EXPECT_TRUE(!a.inRangeInclusive(b, c));
+ EXPECT_TRUE(a.inRangeInclusive(c, b));
+ EXPECT_TRUE(!first.inRangeInclusive(a, c));
+ EXPECT_TRUE(!first.inRangeInclusive(c, a));
+
+ a.setFromInt(10);
+ c = b = a;
+ b.add(10);
+ c.add(20);
+ EXPECT_TRUE(b.inRangeInclusive(a, c));
+ EXPECT_TRUE(!b.inRangeInclusive(c, a));
+ EXPECT_TRUE(!a.inRangeInclusive(b, c));
+ EXPECT_TRUE(a.inRangeInclusive(c, b));
+ EXPECT_TRUE(a.distance(b) == 10);
+ EXPECT_TRUE(a.distance(c) == 20);
+ EXPECT_TRUE(b.distance(c) == 10);
+ EXPECT_TRUE(!first.inRangeInclusive(a, c));
+ EXPECT_TRUE(!first.inRangeInclusive(c, a));
+
+ a.setFromInt((uint32_t)-5);
+ c = b = a;
+ b.add(10);
+ c.add(20);
+ EXPECT_TRUE(b.inRangeInclusive(a, c));
+ EXPECT_TRUE(!b.inRangeInclusive(c, a));
+ EXPECT_TRUE(!a.inRangeInclusive(b, c));
+ EXPECT_TRUE(a.inRangeInclusive(c, b));
+ EXPECT_TRUE(a.distance(b) == 10);
+ EXPECT_TRUE(a.distance(c) == 20);
+ EXPECT_TRUE(b.distance(c) == 10);
+ EXPECT_TRUE(!first.inRangeInclusive(a, c));
+ EXPECT_TRUE(!first.inRangeInclusive(c, a));
+
+ a.setFromInt((uint32_t)-15);
+ c = b = a;
+ b.add(10);
+ c.add(20);
+ EXPECT_TRUE(b.inRangeInclusive(a, c));
+ EXPECT_TRUE(!b.inRangeInclusive(c, a));
+ EXPECT_TRUE(!a.inRangeInclusive(b, c));
+ EXPECT_TRUE(a.inRangeInclusive(c, b));
+ EXPECT_TRUE(a.distance(b) == 10);
+ EXPECT_TRUE(a.distance(c) == 20);
+ EXPECT_TRUE(b.distance(c) == 10);
+ EXPECT_TRUE(!first.inRangeInclusive(a, c));
+ EXPECT_TRUE(!first.inRangeInclusive(c, a));
+
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/guard/.gitignore b/vespalib/src/tests/guard/.gitignore
new file mode 100644
index 00000000000..ef84d571208
--- /dev/null
+++ b/vespalib/src/tests/guard/.gitignore
@@ -0,0 +1,6 @@
+.depend
+Makefile
+filedesc.txt
+filept.txt
+guard_test
+vespalib_guard_test_app
diff --git a/vespalib/src/tests/guard/CMakeLists.txt b/vespalib/src/tests/guard/CMakeLists.txt
new file mode 100644
index 00000000000..dc4ba9fcd64
--- /dev/null
+++ b/vespalib/src/tests/guard/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_guard_test_app
+ SOURCES
+ guard_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_guard_test_app COMMAND vespalib_guard_test_app)
diff --git a/vespalib/src/tests/guard/DESC b/vespalib/src/tests/guard/DESC
new file mode 100644
index 00000000000..2c56a9e5a08
--- /dev/null
+++ b/vespalib/src/tests/guard/DESC
@@ -0,0 +1 @@
+guard test. Take a look at guard.cpp for details.
diff --git a/vespalib/src/tests/guard/FILES b/vespalib/src/tests/guard/FILES
new file mode 100644
index 00000000000..8930baccba7
--- /dev/null
+++ b/vespalib/src/tests/guard/FILES
@@ -0,0 +1 @@
+guard.cpp
diff --git a/vespalib/src/tests/guard/guard_test.cpp b/vespalib/src/tests/guard/guard_test.cpp
new file mode 100644
index 00000000000..a663edc4eec
--- /dev/null
+++ b/vespalib/src/tests/guard/guard_test.cpp
@@ -0,0 +1,268 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("guard_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/guard.h>
+
+using namespace vespalib;
+
+class Test : public TestApp
+{
+public:
+ void testFilePointer();
+ void testFileDescriptor();
+ void testDirPointer();
+ void testValueGuard();
+ void testMaxValueGuard();
+ void testCounterGuard();
+ int Main();
+};
+
+void
+Test::testFilePointer()
+{
+ {
+ FilePointer file(fopen("bogus", "r"));
+ EXPECT_TRUE(!file.valid());
+ }
+ {
+ FilePointer file(fopen("filept.txt", "w"));
+ EXPECT_TRUE(file.valid());
+ fprintf(file, "Hello");
+ }
+ {
+ FilePointer file(fopen("filept.txt", "r"));
+ EXPECT_TRUE(file.valid());
+ char tmp[128];
+ fgets(tmp, sizeof(tmp), file);
+ EXPECT_TRUE(strcmp(tmp, "Hello") == 0);
+ }
+ {
+ FILE *pt = NULL;
+ {
+ FilePointer file(fopen("filept.txt", "r"));
+ EXPECT_TRUE(file.valid());
+ pt = file;
+ }
+ EXPECT_TRUE(pt != NULL);
+ // char tmp[128];
+ // EXPECT_TRUE(fgets(tmp, sizeof(tmp), pt) == NULL);
+ }
+ {
+ FilePointer file(fopen("filept.txt", "w"));
+ EXPECT_TRUE(file.valid());
+ fprintf(file, "World");
+
+ file.reset(fopen("filept.txt", "r"));
+ EXPECT_TRUE(file.valid());
+ char tmp[128];
+ fgets(tmp, sizeof(tmp), file.fp());
+ EXPECT_TRUE(strcmp(tmp, "World") == 0);
+
+ FILE *ref = file.fp();
+ FILE *fp = file.release();
+ EXPECT_TRUE(fp != NULL);
+ EXPECT_TRUE(fp == ref);
+ EXPECT_TRUE(!file.valid());
+ EXPECT_TRUE(file.fp() == NULL);
+ fclose(fp);
+ }
+}
+
+void
+Test::testFileDescriptor()
+{
+ {
+ FileDescriptor file(open("bogus", O_RDONLY));
+ EXPECT_TRUE(!file.valid());
+ }
+ {
+ FileDescriptor file(open("filedesc.txt", O_WRONLY | O_CREAT, 0644));
+ EXPECT_TRUE(file.valid());
+ EXPECT_TRUE((size_t)write(file.fd(), "Hello", strlen("Hello")) == strlen("Hello"));
+ }
+ {
+ FileDescriptor file(open("filedesc.txt", O_RDONLY));
+ EXPECT_TRUE(file.valid());
+ char tmp[128];
+ size_t res = read(file.fd(), tmp, sizeof(tmp));
+ EXPECT_TRUE(res == strlen("Hello"));
+ tmp[res] = '\0';
+ EXPECT_TRUE(strcmp(tmp, "Hello") == 0);
+ }
+ {
+ int fd = -1;
+ {
+ FileDescriptor file(open("filedesc.txt", O_RDONLY));
+ EXPECT_TRUE(file.valid());
+ fd = file.fd();
+ }
+ char tmp[128];
+ EXPECT_TRUE(read(fd, tmp, sizeof(tmp)) == -1);
+ }
+ {
+ FileDescriptor file(open("filedesc.txt", O_WRONLY | O_CREAT, 0644));
+ EXPECT_TRUE(file.valid());
+ EXPECT_TRUE((size_t)write(file.fd(), "World", strlen("World")) == strlen("World"));
+
+ file.reset(open("filedesc.txt", O_RDONLY));
+ EXPECT_TRUE(file.valid());
+ char tmp[128];
+ size_t res = read(file.fd(), tmp, sizeof(tmp));
+ EXPECT_TRUE(res == strlen("World"));
+ tmp[res] = '\0';
+ EXPECT_TRUE(strcmp(tmp, "World") == 0);
+
+ int ref = file.fd();
+ int fd = file.release();
+ EXPECT_TRUE(fd >= 0);
+ EXPECT_TRUE(fd == ref);
+ EXPECT_TRUE(!file.valid());
+ EXPECT_TRUE(file.fd() == -1);
+ close(fd);
+ }
+}
+
+void
+Test::testDirPointer()
+{
+ {
+ DirPointer dir(opendir("bogus"));
+ EXPECT_TRUE(!dir.valid());
+ }
+ {
+ DirPointer dir(opendir("."));
+ EXPECT_TRUE(dir.valid());
+
+ dirent *de;
+ bool foundGuardCpp = false;
+ while ((de = readdir(dir)) != NULL) {
+ if (strcmp(de->d_name, "guard_test.cpp") == 0) {
+ foundGuardCpp = true;
+ }
+ }
+ EXPECT_TRUE(foundGuardCpp);
+ }
+ {
+ DIR *dp = NULL;
+ {
+ DirPointer dir(opendir("."));
+ EXPECT_TRUE(dir.valid());
+ dp = dir;
+ }
+ EXPECT_TRUE(dp != NULL);
+ // EXPECT_TRUE(readdir(dp) == NULL);
+ }
+ {
+ DirPointer dir(opendir("."));
+ EXPECT_TRUE(dir.valid());
+ dir.reset(opendir("."));
+ EXPECT_TRUE(dir.valid());
+
+ DIR *ref = dir.dp();
+ DIR *dp = dir.release();
+ EXPECT_TRUE(dp != NULL);
+ EXPECT_TRUE(dp == ref);
+ EXPECT_TRUE(!dir.valid());
+ EXPECT_TRUE(dir.dp() == NULL);
+ closedir(dp);
+ }
+}
+
+void
+Test::testValueGuard()
+{
+ int value = 10;
+ {
+ ValueGuard<int> guard(value);
+ value = 20;
+ EXPECT_TRUE(value == 20);
+ }
+ EXPECT_TRUE(value == 10);
+ {
+ ValueGuard<int> guard(value, 50);
+ value = 20;
+ EXPECT_TRUE(value == 20);
+ }
+ EXPECT_TRUE(value == 50);
+ {
+ ValueGuard<int> guard(value);
+ value = 20;
+ guard.update(100);
+ EXPECT_TRUE(value == 20);
+ }
+ EXPECT_TRUE(value == 100);
+ {
+ ValueGuard<int> guard(value);
+ value = 20;
+ guard.dismiss();
+ EXPECT_TRUE(value == 20);
+ }
+ EXPECT_TRUE(value == 20);
+}
+
+void
+Test::testMaxValueGuard()
+{
+ int value = 10;
+ {
+ MaxValueGuard<int> guard(value);
+ value = 20;
+ EXPECT_TRUE(value == 20);
+ }
+ EXPECT_TRUE(value == 10);
+ {
+ MaxValueGuard<int> guard(value);
+ value = 5;
+ EXPECT_TRUE(value == 5);
+ }
+ EXPECT_TRUE(value == 5);
+ {
+ MaxValueGuard<int> guard(value, 50);
+ value = 100;
+ EXPECT_TRUE(value == 100);
+ }
+ EXPECT_TRUE(value == 50);
+ {
+ MaxValueGuard<int> guard(value);
+ value = 200;
+ guard.update(100);
+ EXPECT_TRUE(value == 200);
+ }
+ EXPECT_TRUE(value == 100);
+ {
+ MaxValueGuard<int> guard(value);
+ value = 200;
+ guard.dismiss();
+ EXPECT_TRUE(value == 200);
+ }
+ EXPECT_TRUE(value == 200);
+}
+
+void
+Test::testCounterGuard()
+{
+ int cnt = 10;
+ {
+ EXPECT_TRUE(cnt == 10);
+ CounterGuard guard(cnt);
+ EXPECT_TRUE(cnt == 11);
+ }
+ EXPECT_TRUE(cnt == 10);
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("guard_test");
+ testFilePointer();
+ testFileDescriptor();
+ testDirPointer();
+ testValueGuard();
+ testMaxValueGuard();
+ testCounterGuard();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/hashmap/.gitignore b/vespalib/src/tests/hashmap/.gitignore
new file mode 100644
index 00000000000..0b79d6e1ede
--- /dev/null
+++ b/vespalib/src/tests/hashmap/.gitignore
@@ -0,0 +1,6 @@
+.depend
+Makefile
+hashmap_test
+keys.txt
+values.txt
+vespalib_hashmap_test_app
diff --git a/vespalib/src/tests/hashmap/CMakeLists.txt b/vespalib/src/tests/hashmap/CMakeLists.txt
new file mode 100644
index 00000000000..78696f99454
--- /dev/null
+++ b/vespalib/src/tests/hashmap/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_hashmap_test_app
+ SOURCES
+ hashmap_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_hashmap_test_app COMMAND vespalib_hashmap_test_app)
diff --git a/vespalib/src/tests/hashmap/DESC b/vespalib/src/tests/hashmap/DESC
new file mode 100644
index 00000000000..5e892024080
--- /dev/null
+++ b/vespalib/src/tests/hashmap/DESC
@@ -0,0 +1 @@
+hashmap test. Take a look at hashmap.cpp for details.
diff --git a/vespalib/src/tests/hashmap/FILES b/vespalib/src/tests/hashmap/FILES
new file mode 100644
index 00000000000..421534cb030
--- /dev/null
+++ b/vespalib/src/tests/hashmap/FILES
@@ -0,0 +1 @@
+hashmap.cpp
diff --git a/vespalib/src/tests/hashmap/hashmap_test.cpp b/vespalib/src/tests/hashmap/hashmap_test.cpp
new file mode 100644
index 00000000000..34ad2caee3c
--- /dev/null
+++ b/vespalib/src/tests/hashmap/hashmap_test.cpp
@@ -0,0 +1,202 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("hashmap_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/hashmap.h>
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+
+class Test : public vespalib::TestApp
+{
+public:
+ void testInt();
+ void testString();
+ void testHashValue();
+ int Main();
+};
+
+
+
+int
+Test::Main()
+{
+ TEST_INIT("hashmap_test");
+ srandom(1);
+ testInt();
+ TEST_FLUSH();
+ testString();
+ TEST_FLUSH();
+ testHashValue();
+ TEST_DONE();
+}
+
+
+void
+Test::testHashValue()
+{
+ const char * s("abcdefghi");
+ EXPECT_EQUAL(7045194595191919248ul, vespalib::hashValue(s));
+ EXPECT_EQUAL(vespalib::hashValue(s), vespalib::hashValue(s, strlen(s)));
+ EXPECT_NOT_EQUAL(vespalib::hashValue(s), vespalib::hashValue(s, strlen(s)-1));
+}
+
+void
+Test::testInt()
+{
+ vespalib::HashMap<int> map(-1, 5);
+
+ {
+ vespalib::HashMap<int>::Iterator it = map.iterator();
+ EXPECT_TRUE(!it.valid());
+ }
+
+ EXPECT_TRUE(map.size() == 0);
+ EXPECT_TRUE(map.isEmpty());
+ EXPECT_TRUE(map.buckets() >= 5);
+
+ EXPECT_TRUE(map.set("one", 1) == -1);
+ EXPECT_TRUE(map.set("two", 2) == -1);
+ EXPECT_TRUE(map.set("three", 3) == -1);
+ EXPECT_TRUE(map.set("four", 4) == -1);
+
+ {
+ vespalib::HashMap<int>::Iterator it = map.iterator();
+ EXPECT_TRUE(it.valid());
+ EXPECT_TRUE(map[it.key()] == it.value());
+ it.next();
+ EXPECT_TRUE(it.valid());
+ EXPECT_TRUE(map[it.key()] == it.value());
+ it.next();
+ EXPECT_TRUE(it.valid());
+ EXPECT_TRUE(map[it.key()] == it.value());
+ it.next();
+ EXPECT_TRUE(it.valid());
+ EXPECT_TRUE(map[it.key()] == it.value());
+ it.next();
+ EXPECT_TRUE(!it.valid());
+ }
+
+ EXPECT_TRUE(map.size() == 4);
+ EXPECT_TRUE(!map.isEmpty());
+ EXPECT_TRUE(map.get("one") == 1);
+ EXPECT_TRUE(map.get("two") == 2);
+ EXPECT_TRUE(map.get("three") == 3);
+ EXPECT_TRUE(map.get("four") == 4);
+ EXPECT_TRUE(map.get("five") == -1);
+
+ EXPECT_TRUE(map.set("one", 11) == 1);
+ EXPECT_TRUE(map.get("one") == 11);
+ EXPECT_TRUE(map.size() == 4);
+
+ EXPECT_TRUE(map["one"] == 11);
+ EXPECT_TRUE(map["two"] == 2);
+ EXPECT_TRUE(map["three"] == 3);
+ EXPECT_TRUE(map["four"] == 4);
+ EXPECT_TRUE(map["five"] == -1);
+ EXPECT_TRUE(map.size() == 4);
+
+ map.set("1", 1);
+ map.set("2", 2);
+ map.set("3", 3);
+ map.set("4", 4);
+ map.set("5", 5);
+ map.set("6", 6);
+ map.set("7", 7);
+ map.set("8", 8);
+ map.set("9", 9);
+ map.set("10", 10);
+ map.set("11", 11);
+ map.set("12", 12);
+ map.set("13", 13);
+ map.set("14", 14);
+ map.set("15", 15);
+ map.set("16", 16);
+ map.set("17", 17);
+ map.set("18", 18);
+ map.set("19", 19);
+ map.set("20", 20);
+ EXPECT_TRUE(map.size() == 24);
+ EXPECT_TRUE(map.remove("5") == 5);
+ EXPECT_TRUE(map.remove("10") == 10);
+ EXPECT_TRUE(map.remove("15") == 15);
+ EXPECT_TRUE(map.remove("20") == 20);
+ EXPECT_TRUE(map.size() == 20);
+
+ EXPECT_TRUE(map["1"] == 1);
+ EXPECT_TRUE(map["2"] == 2);
+ EXPECT_TRUE(map["3"] == 3);
+ EXPECT_TRUE(map["4"] == 4);
+ EXPECT_TRUE(map["5"] == -1);
+ EXPECT_TRUE(map["6"] == 6);
+ EXPECT_TRUE(map["7"] == 7);
+ EXPECT_TRUE(map["8"] == 8);
+ EXPECT_TRUE(map["9"] == 9);
+ EXPECT_TRUE(map["10"] == -1);
+ EXPECT_TRUE(map["11"] == 11);
+ EXPECT_TRUE(map["12"] == 12);
+ EXPECT_TRUE(map["13"] == 13);
+ EXPECT_TRUE(map["14"] == 14);
+ EXPECT_TRUE(map["15"] == -1);
+ EXPECT_TRUE(map["16"] == 16);
+ EXPECT_TRUE(map["17"] == 17);
+ EXPECT_TRUE(map["18"] == 18);
+ EXPECT_TRUE(map["19"] == 19);
+ EXPECT_TRUE(map["20"] == -1);
+
+ EXPECT_TRUE(map.remove("bogus1") == -1);
+ EXPECT_TRUE(map.remove("bogus2") == -1);
+ EXPECT_TRUE(map.remove("bogus3") == -1);
+ EXPECT_TRUE(map.size() == 20);
+
+ map.clear();
+ {
+ vespalib::HashMap<int>::Iterator it = map.iterator();
+ EXPECT_TRUE(!it.valid());
+ }
+ EXPECT_TRUE(map.size() == 0);
+ EXPECT_TRUE(map.isEmpty());
+ EXPECT_TRUE(map.get("one") == -1);
+ EXPECT_TRUE(map.get("two") == -1);
+ EXPECT_TRUE(map.get("three") == -1);
+}
+
+void
+Test::testString()
+{
+ using std::string;
+ vespalib::HashMap<string> map("");
+
+ map.set("a", "a");
+ map.set("b", string("b"));
+ const string c("c");
+ map.set("c", c);
+ string d = "d";
+ map.set("d", d);
+ string e;
+ e = "e";
+ map.set("e", e);
+
+ EXPECT_TRUE(map.size() == 5);
+ EXPECT_TRUE(map.isSet("a"));
+ EXPECT_TRUE(map.isSet("b"));
+ EXPECT_TRUE(map.isSet("c"));
+ EXPECT_TRUE(map.isSet("d"));
+ EXPECT_TRUE(map.isSet("e"));
+ EXPECT_TRUE(map.get("a") != "");
+ EXPECT_TRUE(map.get("b") != "");
+ EXPECT_TRUE(map.get("c") != "");
+ EXPECT_TRUE(map.get("d") != "");
+ EXPECT_TRUE(map.get("e") != "");
+ EXPECT_TRUE(map.get("a") == "a");
+ EXPECT_TRUE(map.get("b") == "b");
+ EXPECT_TRUE(map.get("c") == "c");
+ EXPECT_TRUE(map.get("d") == "d");
+ EXPECT_TRUE(map.get("e") == "e");
+ EXPECT_TRUE(!map.isSet("x"));
+ EXPECT_TRUE(map.get("x") == "");
+}
+
+TEST_APPHOOK(Test)
+
diff --git a/vespalib/src/tests/hashmap/in.txt b/vespalib/src/tests/hashmap/in.txt
new file mode 100644
index 00000000000..c25589de026
--- /dev/null
+++ b/vespalib/src/tests/hashmap/in.txt
@@ -0,0 +1,235882 @@
+A
+a
+aa
+aal
+aalii
+aam
+Aani
+aardvark
+aardwolf
+Aaron
+Aaronic
+Aaronical
+Aaronite
+Aaronitic
+Aaru
+Ab
+aba
+Ababdeh
+Ababua
+abac
+abaca
+abacate
+abacay
+abacinate
+abacination
+abaciscus
+abacist
+aback
+abactinal
+abactinally
+abaction
+abactor
+abaculus
+abacus
+Abadite
+abaff
+abaft
+abaisance
+abaiser
+abaissed
+abalienate
+abalienation
+abalone
+Abama
+abampere
+abandon
+abandonable
+abandoned
+abandonedly
+abandonee
+abandoner
+abandonment
+Abanic
+Abantes
+abaptiston
+Abarambo
+Abaris
+abarthrosis
+abarticular
+abarticulation
+abas
+abase
+abased
+abasedly
+abasedness
+abasement
+abaser
+Abasgi
+abash
+abashed
+abashedly
+abashedness
+abashless
+abashlessly
+abashment
+abasia
+abasic
+abask
+Abassin
+abastardize
+abatable
+abate
+abatement
+abater
+abatis
+abatised
+abaton
+abator
+abattoir
+Abatua
+abature
+abave
+abaxial
+abaxile
+abaze
+abb
+Abba
+abbacomes
+abbacy
+Abbadide
+abbas
+abbasi
+abbassi
+Abbasside
+abbatial
+abbatical
+abbess
+abbey
+abbeystede
+Abbie
+abbot
+abbotcy
+abbotnullius
+abbotship
+abbreviate
+abbreviately
+abbreviation
+abbreviator
+abbreviatory
+abbreviature
+Abby
+abcoulomb
+abdal
+abdat
+Abderian
+Abderite
+abdest
+abdicable
+abdicant
+abdicate
+abdication
+abdicative
+abdicator
+Abdiel
+abditive
+abditory
+abdomen
+abdominal
+Abdominales
+abdominalian
+abdominally
+abdominoanterior
+abdominocardiac
+abdominocentesis
+abdominocystic
+abdominogenital
+abdominohysterectomy
+abdominohysterotomy
+abdominoposterior
+abdominoscope
+abdominoscopy
+abdominothoracic
+abdominous
+abdominovaginal
+abdominovesical
+abduce
+abducens
+abducent
+abduct
+abduction
+abductor
+Abe
+abeam
+abear
+abearance
+abecedarian
+abecedarium
+abecedary
+abed
+abeigh
+Abel
+abele
+Abelia
+Abelian
+Abelicea
+Abelite
+abelite
+Abelmoschus
+abelmosk
+Abelonian
+abeltree
+Abencerrages
+abenteric
+abepithymia
+Aberdeen
+aberdevine
+Aberdonian
+Aberia
+aberrance
+aberrancy
+aberrant
+aberrate
+aberration
+aberrational
+aberrator
+aberrometer
+aberroscope
+aberuncator
+abet
+abetment
+abettal
+abettor
+abevacuation
+abey
+abeyance
+abeyancy
+abeyant
+abfarad
+abhenry
+abhiseka
+abhominable
+abhor
+abhorrence
+abhorrency
+abhorrent
+abhorrently
+abhorrer
+abhorrible
+abhorring
+Abhorson
+abidal
+abidance
+abide
+abider
+abidi
+abiding
+abidingly
+abidingness
+Abie
+Abies
+abietate
+abietene
+abietic
+abietin
+Abietineae
+abietineous
+abietinic
+Abiezer
+Abigail
+abigail
+abigailship
+abigeat
+abigeus
+abilao
+ability
+abilla
+abilo
+abintestate
+abiogenesis
+abiogenesist
+abiogenetic
+abiogenetical
+abiogenetically
+abiogenist
+abiogenous
+abiogeny
+abiological
+abiologically
+abiology
+abiosis
+abiotic
+abiotrophic
+abiotrophy
+Abipon
+abir
+abirritant
+abirritate
+abirritation
+abirritative
+abiston
+Abitibi
+abiuret
+abject
+abjectedness
+abjection
+abjective
+abjectly
+abjectness
+abjoint
+abjudge
+abjudicate
+abjudication
+abjunction
+abjunctive
+abjuration
+abjuratory
+abjure
+abjurement
+abjurer
+abkar
+abkari
+Abkhas
+Abkhasian
+ablach
+ablactate
+ablactation
+ablare
+ablastemic
+ablastous
+ablate
+ablation
+ablatitious
+ablatival
+ablative
+ablator
+ablaut
+ablaze
+able
+ableeze
+ablegate
+ableness
+ablepharia
+ablepharon
+ablepharous
+Ablepharus
+ablepsia
+ableptical
+ableptically
+abler
+ablest
+ablewhackets
+ablins
+abloom
+ablow
+ablude
+abluent
+ablush
+ablution
+ablutionary
+abluvion
+ably
+abmho
+Abnaki
+abnegate
+abnegation
+abnegative
+abnegator
+Abner
+abnerval
+abnet
+abneural
+abnormal
+abnormalism
+abnormalist
+abnormality
+abnormalize
+abnormally
+abnormalness
+abnormity
+abnormous
+abnumerable
+Abo
+aboard
+Abobra
+abode
+abodement
+abody
+abohm
+aboil
+abolish
+abolisher
+abolishment
+abolition
+abolitionary
+abolitionism
+abolitionist
+abolitionize
+abolla
+aboma
+abomasum
+abomasus
+abominable
+abominableness
+abominably
+abominate
+abomination
+abominator
+abomine
+Abongo
+aboon
+aborad
+aboral
+aborally
+abord
+aboriginal
+aboriginality
+aboriginally
+aboriginary
+aborigine
+abort
+aborted
+aborticide
+abortient
+abortifacient
+abortin
+abortion
+abortional
+abortionist
+abortive
+abortively
+abortiveness
+abortus
+abouchement
+abound
+abounder
+abounding
+aboundingly
+about
+abouts
+above
+aboveboard
+abovedeck
+aboveground
+aboveproof
+abovestairs
+abox
+abracadabra
+abrachia
+abradant
+abrade
+abrader
+Abraham
+Abrahamic
+Abrahamidae
+Abrahamite
+Abrahamitic
+abraid
+Abram
+Abramis
+abranchial
+abranchialism
+abranchian
+Abranchiata
+abranchiate
+abranchious
+abrasax
+abrase
+abrash
+abrasiometer
+abrasion
+abrasive
+abrastol
+abraum
+abraxas
+abreact
+abreaction
+abreast
+abrenounce
+abret
+abrico
+abridge
+abridgeable
+abridged
+abridgedly
+abridger
+abridgment
+abrim
+abrin
+abristle
+abroach
+abroad
+Abrocoma
+abrocome
+abrogable
+abrogate
+abrogation
+abrogative
+abrogator
+Abroma
+Abronia
+abrook
+abrotanum
+abrotine
+abrupt
+abruptedly
+abruption
+abruptly
+abruptness
+Abrus
+Absalom
+absampere
+Absaroka
+absarokite
+abscess
+abscessed
+abscession
+abscessroot
+abscind
+abscise
+abscision
+absciss
+abscissa
+abscissae
+abscisse
+abscission
+absconce
+abscond
+absconded
+abscondedly
+abscondence
+absconder
+absconsa
+abscoulomb
+absence
+absent
+absentation
+absentee
+absenteeism
+absenteeship
+absenter
+absently
+absentment
+absentmindedly
+absentness
+absfarad
+abshenry
+Absi
+absinthe
+absinthial
+absinthian
+absinthiate
+absinthic
+absinthin
+absinthine
+absinthism
+absinthismic
+absinthium
+absinthol
+absit
+absmho
+absohm
+absolute
+absolutely
+absoluteness
+absolution
+absolutism
+absolutist
+absolutistic
+absolutistically
+absolutive
+absolutization
+absolutize
+absolutory
+absolvable
+absolvatory
+absolve
+absolvent
+absolver
+absolvitor
+absolvitory
+absonant
+absonous
+absorb
+absorbability
+absorbable
+absorbed
+absorbedly
+absorbedness
+absorbefacient
+absorbency
+absorbent
+absorber
+absorbing
+absorbingly
+absorbition
+absorpt
+absorptance
+absorptiometer
+absorptiometric
+absorption
+absorptive
+absorptively
+absorptiveness
+absorptivity
+absquatulate
+abstain
+abstainer
+abstainment
+abstemious
+abstemiously
+abstemiousness
+abstention
+abstentionist
+abstentious
+absterge
+abstergent
+abstersion
+abstersive
+abstersiveness
+abstinence
+abstinency
+abstinent
+abstinential
+abstinently
+abstract
+abstracted
+abstractedly
+abstractedness
+abstracter
+abstraction
+abstractional
+abstractionism
+abstractionist
+abstractitious
+abstractive
+abstractively
+abstractiveness
+abstractly
+abstractness
+abstractor
+abstrahent
+abstricted
+abstriction
+abstruse
+abstrusely
+abstruseness
+abstrusion
+abstrusity
+absume
+absumption
+absurd
+absurdity
+absurdly
+absurdness
+absvolt
+Absyrtus
+abterminal
+abthain
+abthainrie
+abthainry
+abthanage
+Abu
+abu
+abucco
+abulia
+abulic
+abulomania
+abuna
+abundance
+abundancy
+abundant
+Abundantia
+abundantly
+abura
+aburabozu
+aburban
+aburst
+aburton
+abusable
+abuse
+abusedly
+abusee
+abuseful
+abusefully
+abusefulness
+abuser
+abusion
+abusious
+abusive
+abusively
+abusiveness
+abut
+Abuta
+Abutilon
+abutment
+abuttal
+abutter
+abutting
+abuzz
+abvolt
+abwab
+aby
+abysm
+abysmal
+abysmally
+abyss
+abyssal
+Abyssinian
+abyssobenthonic
+abyssolith
+abyssopelagic
+acacatechin
+acacatechol
+acacetin
+Acacia
+Acacian
+acaciin
+acacin
+academe
+academial
+academian
+Academic
+academic
+academical
+academically
+academicals
+academician
+academicism
+academism
+academist
+academite
+academization
+academize
+Academus
+academy
+Acadia
+acadialite
+Acadian
+Acadie
+Acaena
+acajou
+acaleph
+Acalepha
+Acalephae
+acalephan
+acalephoid
+acalycal
+acalycine
+acalycinous
+acalyculate
+Acalypha
+Acalypterae
+Acalyptrata
+Acalyptratae
+acalyptrate
+Acamar
+acampsia
+acana
+acanaceous
+acanonical
+acanth
+acantha
+Acanthaceae
+acanthaceous
+acanthad
+Acantharia
+Acanthia
+acanthial
+acanthin
+acanthine
+acanthion
+acanthite
+acanthocarpous
+Acanthocephala
+acanthocephalan
+Acanthocephali
+acanthocephalous
+Acanthocereus
+acanthocladous
+Acanthodea
+acanthodean
+Acanthodei
+Acanthodes
+acanthodian
+Acanthodidae
+Acanthodii
+Acanthodini
+acanthoid
+Acantholimon
+acanthological
+acanthology
+acantholysis
+acanthoma
+Acanthomeridae
+acanthon
+Acanthopanax
+Acanthophis
+acanthophorous
+acanthopod
+acanthopodous
+acanthopomatous
+acanthopore
+acanthopteran
+Acanthopteri
+acanthopterous
+acanthopterygian
+Acanthopterygii
+acanthosis
+acanthous
+Acanthuridae
+Acanthurus
+acanthus
+acapnia
+acapnial
+acapsular
+acapu
+acapulco
+acara
+Acarapis
+acardia
+acardiac
+acari
+acarian
+acariasis
+acaricidal
+acaricide
+acarid
+Acarida
+Acaridea
+acaridean
+acaridomatium
+acariform
+Acarina
+acarine
+acarinosis
+acarocecidium
+acarodermatitis
+acaroid
+acarol
+acarologist
+acarology
+acarophilous
+acarophobia
+acarotoxic
+acarpelous
+acarpous
+Acarus
+Acastus
+acatalectic
+acatalepsia
+acatalepsy
+acataleptic
+acatallactic
+acatamathesia
+acataphasia
+acataposis
+acatastasia
+acatastatic
+acate
+acategorical
+acatery
+acatharsia
+acatharsy
+acatholic
+acaudal
+acaudate
+acaulescent
+acauline
+acaulose
+acaulous
+acca
+accede
+accedence
+acceder
+accelerable
+accelerando
+accelerant
+accelerate
+accelerated
+acceleratedly
+acceleration
+accelerative
+accelerator
+acceleratory
+accelerograph
+accelerometer
+accend
+accendibility
+accendible
+accension
+accensor
+accent
+accentless
+accentor
+accentuable
+accentual
+accentuality
+accentually
+accentuate
+accentuation
+accentuator
+accentus
+accept
+acceptability
+acceptable
+acceptableness
+acceptably
+acceptance
+acceptancy
+acceptant
+acceptation
+accepted
+acceptedly
+accepter
+acceptilate
+acceptilation
+acception
+acceptive
+acceptor
+acceptress
+accerse
+accersition
+accersitor
+access
+accessarily
+accessariness
+accessary
+accessaryship
+accessibility
+accessible
+accessibly
+accession
+accessional
+accessioner
+accessive
+accessively
+accessless
+accessorial
+accessorily
+accessoriness
+accessorius
+accessory
+accidence
+accidency
+accident
+accidental
+accidentalism
+accidentalist
+accidentality
+accidentally
+accidentalness
+accidented
+accidential
+accidentiality
+accidently
+accidia
+accidie
+accinge
+accipient
+Accipiter
+accipitral
+accipitrary
+Accipitres
+accipitrine
+accismus
+accite
+acclaim
+acclaimable
+acclaimer
+acclamation
+acclamator
+acclamatory
+acclimatable
+acclimatation
+acclimate
+acclimatement
+acclimation
+acclimatizable
+acclimatization
+acclimatize
+acclimatizer
+acclimature
+acclinal
+acclinate
+acclivitous
+acclivity
+acclivous
+accloy
+accoast
+accoil
+accolade
+accoladed
+accolated
+accolent
+accolle
+accombination
+accommodable
+accommodableness
+accommodate
+accommodately
+accommodateness
+accommodating
+accommodatingly
+accommodation
+accommodational
+accommodative
+accommodativeness
+accommodator
+accompanier
+accompaniment
+accompanimental
+accompanist
+accompany
+accompanyist
+accompletive
+accomplice
+accompliceship
+accomplicity
+accomplish
+accomplishable
+accomplished
+accomplisher
+accomplishment
+accomplisht
+accompt
+accord
+accordable
+accordance
+accordancy
+accordant
+accordantly
+accorder
+according
+accordingly
+accordion
+accordionist
+accorporate
+accorporation
+accost
+accostable
+accosted
+accouche
+accouchement
+accoucheur
+accoucheuse
+account
+accountability
+accountable
+accountableness
+accountably
+accountancy
+accountant
+accountantship
+accounting
+accountment
+accouple
+accouplement
+accouter
+accouterment
+accoy
+accredit
+accreditate
+accreditation
+accredited
+accreditment
+accrementitial
+accrementition
+accresce
+accrescence
+accrescent
+accretal
+accrete
+accretion
+accretionary
+accretive
+accroach
+accroides
+accrual
+accrue
+accruement
+accruer
+accubation
+accubitum
+accubitus
+accultural
+acculturate
+acculturation
+acculturize
+accumbency
+accumbent
+accumber
+accumulable
+accumulate
+accumulation
+accumulativ
+accumulative
+accumulatively
+accumulativeness
+accumulator
+accuracy
+accurate
+accurately
+accurateness
+accurse
+accursed
+accursedly
+accursedness
+accusable
+accusably
+accusal
+accusant
+accusation
+accusatival
+accusative
+accusatively
+accusatorial
+accusatorially
+accusatory
+accusatrix
+accuse
+accused
+accuser
+accusingly
+accusive
+accustom
+accustomed
+accustomedly
+accustomedness
+ace
+aceacenaphthene
+aceanthrene
+aceanthrenequinone
+acecaffine
+aceconitic
+acedia
+acediamine
+acediast
+acedy
+Aceldama
+Acemetae
+Acemetic
+acenaphthene
+acenaphthenyl
+acenaphthylene
+acentric
+acentrous
+aceologic
+aceology
+acephal
+Acephala
+acephalan
+Acephali
+acephalia
+Acephalina
+acephaline
+acephalism
+acephalist
+Acephalite
+acephalocyst
+acephalous
+acephalus
+Acer
+Aceraceae
+aceraceous
+Acerae
+Acerata
+acerate
+Acerates
+acerathere
+Aceratherium
+aceratosis
+acerb
+Acerbas
+acerbate
+acerbic
+acerbity
+acerdol
+acerin
+acerose
+acerous
+acerra
+acertannin
+acervate
+acervately
+acervation
+acervative
+acervose
+acervuline
+acervulus
+acescence
+acescency
+acescent
+aceship
+acesodyne
+Acestes
+acetabular
+Acetabularia
+acetabuliferous
+acetabuliform
+acetabulous
+acetabulum
+acetacetic
+acetal
+acetaldehydase
+acetaldehyde
+acetaldehydrase
+acetalization
+acetalize
+acetamide
+acetamidin
+acetamidine
+acetamido
+acetaminol
+acetanilid
+acetanilide
+acetanion
+acetaniside
+acetanisidide
+acetannin
+acetarious
+acetarsone
+acetate
+acetated
+acetation
+acetbromamide
+acetenyl
+acethydrazide
+acetic
+acetification
+acetifier
+acetify
+acetimeter
+acetimetry
+acetin
+acetize
+acetmethylanilide
+acetnaphthalide
+acetoacetanilide
+acetoacetate
+acetoacetic
+acetoamidophenol
+acetoarsenite
+Acetobacter
+acetobenzoic
+acetobromanilide
+acetochloral
+acetocinnamene
+acetoin
+acetol
+acetolysis
+acetolytic
+acetometer
+acetometrical
+acetometrically
+acetometry
+acetomorphine
+acetonaphthone
+acetonate
+acetonation
+acetone
+acetonemia
+acetonemic
+acetonic
+acetonitrile
+acetonization
+acetonize
+acetonuria
+acetonurometer
+acetonyl
+acetonylacetone
+acetonylidene
+acetophenetide
+acetophenin
+acetophenine
+acetophenone
+acetopiperone
+acetopyrin
+acetosalicylic
+acetose
+acetosity
+acetosoluble
+acetothienone
+acetotoluide
+acetotoluidine
+acetous
+acetoveratrone
+acetoxime
+acetoxyl
+acetoxyphthalide
+acetphenetid
+acetphenetidin
+acetract
+acettoluide
+acetum
+aceturic
+acetyl
+acetylacetonates
+acetylacetone
+acetylamine
+acetylate
+acetylation
+acetylator
+acetylbenzene
+acetylbenzoate
+acetylbenzoic
+acetylbiuret
+acetylcarbazole
+acetylcellulose
+acetylcholine
+acetylcyanide
+acetylenation
+acetylene
+acetylenediurein
+acetylenic
+acetylenyl
+acetylfluoride
+acetylglycine
+acetylhydrazine
+acetylic
+acetylide
+acetyliodide
+acetylizable
+acetylization
+acetylize
+acetylizer
+acetylmethylcarbinol
+acetylperoxide
+acetylphenol
+acetylphenylhydrazine
+acetylrosaniline
+acetylsalicylate
+acetylsalol
+acetyltannin
+acetylthymol
+acetyltropeine
+acetylurea
+ach
+Achaean
+Achaemenian
+Achaemenid
+Achaemenidae
+Achaemenidian
+Achaenodon
+Achaeta
+achaetous
+achage
+Achagua
+Achakzai
+achalasia
+Achamoth
+Achango
+achar
+Achariaceae
+Achariaceous
+achate
+Achates
+Achatina
+Achatinella
+Achatinidae
+ache
+acheilia
+acheilous
+acheiria
+acheirous
+acheirus
+Achen
+achene
+achenial
+achenium
+achenocarp
+achenodium
+acher
+Achernar
+Acheronian
+Acherontic
+Acherontical
+achete
+Achetidae
+Acheulean
+acheweed
+achievable
+achieve
+achievement
+achiever
+achigan
+achilary
+achill
+Achillea
+Achillean
+Achilleid
+achilleine
+Achillize
+achillobursitis
+achillodynia
+achime
+Achimenes
+Achinese
+aching
+achingly
+achira
+Achitophel
+achlamydate
+Achlamydeae
+achlamydeous
+achlorhydria
+achlorophyllous
+achloropsia
+Achmetha
+acholia
+acholic
+Acholoe
+acholous
+acholuria
+acholuric
+Achomawi
+achondrite
+achondritic
+achondroplasia
+achondroplastic
+achor
+achordal
+Achordata
+achordate
+Achorion
+Achras
+achree
+achroacyte
+Achroanthes
+achrodextrin
+achrodextrinase
+achroglobin
+achroiocythaemia
+achroiocythemia
+achroite
+achroma
+achromacyte
+achromasia
+achromat
+achromate
+Achromatiaceae
+achromatic
+achromatically
+achromaticity
+achromatin
+achromatinic
+achromatism
+Achromatium
+achromatizable
+achromatization
+achromatize
+achromatocyte
+achromatolysis
+achromatope
+achromatophile
+achromatopia
+achromatopsia
+achromatopsy
+achromatosis
+achromatous
+achromaturia
+achromia
+achromic
+Achromobacter
+Achromobacterieae
+achromoderma
+achromophilous
+achromotrichia
+achromous
+achronical
+achroodextrin
+achroodextrinase
+achroous
+achropsia
+achtehalber
+achtel
+achtelthaler
+Achuas
+achy
+achylia
+achylous
+achymia
+achymous
+Achyranthes
+Achyrodes
+acichloride
+acicula
+acicular
+acicularly
+aciculate
+aciculated
+aciculum
+acid
+Acidanthera
+Acidaspis
+acidemia
+acider
+acidic
+acidiferous
+acidifiable
+acidifiant
+acidific
+acidification
+acidifier
+acidify
+acidimeter
+acidimetric
+acidimetrical
+acidimetrically
+acidimetry
+acidite
+acidity
+acidize
+acidly
+acidness
+acidoid
+acidology
+acidometer
+acidometry
+acidophile
+acidophilic
+acidophilous
+acidoproteolytic
+acidosis
+acidosteophyte
+acidotic
+acidproof
+acidulate
+acidulent
+acidulous
+aciduric
+acidyl
+acier
+acierage
+Acieral
+acierate
+acieration
+aciform
+aciliate
+aciliated
+Acilius
+acinaceous
+acinaces
+acinacifolious
+acinaciform
+acinar
+acinarious
+acinary
+Acineta
+Acinetae
+acinetan
+Acinetaria
+acinetarian
+acinetic
+acinetiform
+Acinetina
+acinetinan
+acinic
+aciniform
+acinose
+acinotubular
+acinous
+acinus
+Acipenser
+Acipenseres
+acipenserid
+Acipenseridae
+acipenserine
+acipenseroid
+Acipenseroidei
+Acis
+aciurgy
+acker
+ackey
+ackman
+acknow
+acknowledge
+acknowledgeable
+acknowledged
+acknowledgedly
+acknowledger
+aclastic
+acle
+acleidian
+acleistous
+Aclemon
+aclidian
+aclinal
+aclinic
+acloud
+aclys
+Acmaea
+Acmaeidae
+acmatic
+acme
+acmesthesia
+acmic
+Acmispon
+acmite
+acne
+acneform
+acneiform
+acnemia
+Acnida
+acnodal
+acnode
+Acocanthera
+acocantherin
+acock
+acockbill
+acocotl
+Acoela
+Acoelomata
+acoelomate
+acoelomatous
+Acoelomi
+acoelomous
+acoelous
+Acoemetae
+Acoemeti
+Acoemetic
+acoin
+acoine
+Acolapissa
+acold
+Acolhua
+Acolhuan
+acologic
+acology
+acolous
+acoluthic
+acolyte
+acolythate
+Acoma
+acoma
+acomia
+acomous
+aconative
+acondylose
+acondylous
+acone
+aconic
+aconin
+aconine
+aconital
+aconite
+aconitia
+aconitic
+aconitin
+aconitine
+Aconitum
+Acontias
+acontium
+Acontius
+aconuresis
+acopic
+acopon
+acopyrin
+acopyrine
+acor
+acorea
+acoria
+acorn
+acorned
+Acorus
+acosmic
+acosmism
+acosmist
+acosmistic
+acotyledon
+acotyledonous
+acouasm
+acouchi
+acouchy
+acoumeter
+acoumetry
+acouometer
+acouophonia
+acoupa
+acousmata
+acousmatic
+acoustic
+acoustical
+acoustically
+acoustician
+acousticolateral
+Acousticon
+acoustics
+acquaint
+acquaintance
+acquaintanceship
+acquaintancy
+acquaintant
+acquainted
+acquaintedness
+acquest
+acquiesce
+acquiescement
+acquiescence
+acquiescency
+acquiescent
+acquiescently
+acquiescer
+acquiescingly
+acquirability
+acquirable
+acquire
+acquired
+acquirement
+acquirenda
+acquirer
+acquisible
+acquisite
+acquisited
+acquisition
+acquisitive
+acquisitively
+acquisitiveness
+acquisitor
+acquisitum
+acquist
+acquit
+acquitment
+acquittal
+acquittance
+acquitter
+Acrab
+acracy
+acraein
+Acraeinae
+acraldehyde
+Acrania
+acranial
+acraniate
+acrasia
+Acrasiaceae
+Acrasiales
+Acrasida
+Acrasieae
+Acraspeda
+acraspedote
+acratia
+acraturesis
+acrawl
+acraze
+acre
+acreable
+acreage
+acreak
+acream
+acred
+Acredula
+acreman
+acrestaff
+acrid
+acridan
+acridian
+acridic
+Acrididae
+Acridiidae
+acridine
+acridinic
+acridinium
+acridity
+Acridium
+acridly
+acridness
+acridone
+acridonium
+acridophagus
+acridyl
+acriflavin
+acriflavine
+acrimonious
+acrimoniously
+acrimoniousness
+acrimony
+acrindoline
+acrinyl
+acrisia
+Acrisius
+Acrita
+acritan
+acrite
+acritical
+acritol
+Acroa
+acroaesthesia
+acroama
+acroamatic
+acroamatics
+acroanesthesia
+acroarthritis
+acroasphyxia
+acroataxia
+acroatic
+acrobacy
+acrobat
+Acrobates
+acrobatholithic
+acrobatic
+acrobatical
+acrobatically
+acrobatics
+acrobatism
+acroblast
+acrobryous
+acrobystitis
+Acrocarpi
+acrocarpous
+acrocephalia
+acrocephalic
+acrocephalous
+acrocephaly
+Acrocera
+Acroceratidae
+Acroceraunian
+Acroceridae
+Acrochordidae
+Acrochordinae
+acrochordon
+Acroclinium
+Acrocomia
+acroconidium
+acrocontracture
+acrocoracoid
+acrocyanosis
+acrocyst
+acrodactylum
+acrodermatitis
+acrodont
+acrodontism
+acrodrome
+acrodromous
+Acrodus
+acrodynia
+acroesthesia
+acrogamous
+acrogamy
+acrogen
+acrogenic
+acrogenous
+acrogenously
+acrography
+Acrogynae
+acrogynae
+acrogynous
+acrolein
+acrolith
+acrolithan
+acrolithic
+acrologic
+acrologically
+acrologism
+acrologue
+acrology
+acromania
+acromastitis
+acromegalia
+acromegalic
+acromegaly
+acromelalgia
+acrometer
+acromial
+acromicria
+acromioclavicular
+acromiocoracoid
+acromiodeltoid
+acromiohumeral
+acromiohyoid
+acromion
+acromioscapular
+acromiosternal
+acromiothoracic
+acromonogrammatic
+acromphalus
+Acromyodi
+acromyodian
+acromyodic
+acromyodous
+acromyotonia
+acromyotonus
+acron
+acronarcotic
+acroneurosis
+acronical
+acronically
+acronyc
+acronych
+Acronycta
+acronyctous
+acronym
+acronymic
+acronymize
+acronymous
+acronyx
+acrook
+acroparalysis
+acroparesthesia
+acropathology
+acropathy
+acropetal
+acropetally
+acrophobia
+acrophonetic
+acrophonic
+acrophony
+acropodium
+acropoleis
+acropolis
+acropolitan
+Acropora
+acrorhagus
+acrorrheuma
+acrosarc
+acrosarcum
+acroscleriasis
+acroscleroderma
+acroscopic
+acrose
+acrosome
+acrosphacelus
+acrospire
+acrospore
+acrosporous
+across
+acrostic
+acrostical
+acrostically
+acrostichal
+Acrosticheae
+acrostichic
+acrostichoid
+Acrostichum
+acrosticism
+acrostolion
+acrostolium
+acrotarsial
+acrotarsium
+acroteleutic
+acroterial
+acroteric
+acroterium
+Acrothoracica
+acrotic
+acrotism
+acrotomous
+Acrotreta
+Acrotretidae
+acrotrophic
+acrotrophoneurosis
+Acrux
+Acrydium
+acryl
+acrylaldehyde
+acrylate
+acrylic
+acrylonitrile
+acrylyl
+act
+acta
+actability
+actable
+Actaea
+Actaeaceae
+Actaeon
+Actaeonidae
+Actiad
+Actian
+actification
+actifier
+actify
+actin
+actinal
+actinally
+actinautographic
+actinautography
+actine
+actinenchyma
+acting
+Actinia
+actinian
+Actiniaria
+actiniarian
+actinic
+actinically
+Actinidia
+Actinidiaceae
+actiniferous
+actiniform
+actinine
+actiniochrome
+actiniohematin
+Actiniomorpha
+actinism
+Actinistia
+actinium
+actinobacillosis
+Actinobacillus
+actinoblast
+actinobranch
+actinobranchia
+actinocarp
+actinocarpic
+actinocarpous
+actinochemistry
+actinocrinid
+Actinocrinidae
+actinocrinite
+Actinocrinus
+actinocutitis
+actinodermatitis
+actinodielectric
+actinodrome
+actinodromous
+actinoelectric
+actinoelectrically
+actinoelectricity
+actinogonidiate
+actinogram
+actinograph
+actinography
+actinoid
+Actinoida
+Actinoidea
+actinolite
+actinolitic
+actinologous
+actinologue
+actinology
+actinomere
+actinomeric
+actinometer
+actinometric
+actinometrical
+actinometry
+actinomorphic
+actinomorphous
+actinomorphy
+Actinomyces
+Actinomycetaceae
+Actinomycetales
+actinomycete
+actinomycetous
+actinomycin
+actinomycoma
+actinomycosis
+actinomycotic
+Actinomyxidia
+Actinomyxidiida
+actinon
+Actinonema
+actinoneuritis
+actinophone
+actinophonic
+actinophore
+actinophorous
+actinophryan
+Actinophrys
+Actinopoda
+actinopraxis
+actinopteran
+Actinopteri
+actinopterous
+actinopterygian
+Actinopterygii
+actinopterygious
+actinoscopy
+actinosoma
+actinosome
+Actinosphaerium
+actinost
+actinostereoscopy
+actinostomal
+actinostome
+actinotherapeutic
+actinotherapeutics
+actinotherapy
+actinotoxemia
+actinotrichium
+actinotrocha
+actinouranium
+Actinozoa
+actinozoal
+actinozoan
+actinozoon
+actinula
+action
+actionable
+actionably
+actional
+actionary
+actioner
+actionize
+actionless
+Actipylea
+Actium
+activable
+activate
+activation
+activator
+active
+actively
+activeness
+activin
+activism
+activist
+activital
+activity
+activize
+actless
+actomyosin
+acton
+actor
+actorship
+actress
+Acts
+actu
+actual
+actualism
+actualist
+actualistic
+actuality
+actualization
+actualize
+actually
+actualness
+actuarial
+actuarially
+actuarian
+actuary
+actuaryship
+actuation
+actuator
+acture
+acturience
+actutate
+acuaesthesia
+Acuan
+acuate
+acuation
+Acubens
+acuclosure
+acuductor
+acuesthesia
+acuity
+aculea
+Aculeata
+aculeate
+aculeated
+aculeiform
+aculeolate
+aculeolus
+aculeus
+acumen
+acuminate
+acumination
+acuminose
+acuminous
+acuminulate
+acupress
+acupressure
+acupunctuate
+acupunctuation
+acupuncturation
+acupuncturator
+acupuncture
+acurative
+acushla
+acutangular
+acutate
+acute
+acutely
+acutenaculum
+acuteness
+acutiator
+acutifoliate
+Acutilinguae
+acutilingual
+acutilobate
+acutiplantar
+acutish
+acutograve
+acutonodose
+acutorsion
+acyanoblepsia
+acyanopsia
+acyclic
+acyesis
+acyetic
+acyl
+acylamido
+acylamidobenzene
+acylamino
+acylate
+acylation
+acylogen
+acyloin
+acyloxy
+acyloxymethane
+acyrological
+acyrology
+acystia
+ad
+Ada
+adactyl
+adactylia
+adactylism
+adactylous
+Adad
+adad
+adage
+adagial
+adagietto
+adagio
+Adai
+Adaize
+Adam
+adamant
+adamantean
+adamantine
+adamantinoma
+adamantoblast
+adamantoblastoma
+adamantoid
+adamantoma
+adamas
+Adamastor
+adambulacral
+adamellite
+Adamhood
+Adamic
+Adamical
+Adamically
+adamine
+Adamite
+adamite
+Adamitic
+Adamitical
+Adamitism
+Adamsia
+adamsite
+adance
+adangle
+Adansonia
+Adapa
+adapid
+Adapis
+adapt
+adaptability
+adaptable
+adaptation
+adaptational
+adaptationally
+adaptative
+adaptedness
+adapter
+adaption
+adaptional
+adaptionism
+adaptitude
+adaptive
+adaptively
+adaptiveness
+adaptometer
+adaptor
+adaptorial
+Adar
+adarme
+adat
+adati
+adatom
+adaunt
+adaw
+adawe
+adawlut
+adawn
+adaxial
+aday
+adays
+adazzle
+adcraft
+add
+Adda
+adda
+addability
+addable
+addax
+addebted
+added
+addedly
+addend
+addenda
+addendum
+adder
+adderbolt
+adderfish
+adderspit
+adderwort
+addibility
+addible
+addicent
+addict
+addicted
+addictedness
+addiction
+Addie
+addiment
+Addisonian
+Addisoniana
+additament
+additamentary
+addition
+additional
+additionally
+additionary
+additionist
+addititious
+additive
+additively
+additivity
+additory
+addle
+addlebrain
+addlebrained
+addlehead
+addleheaded
+addleheadedly
+addleheadedness
+addlement
+addleness
+addlepate
+addlepated
+addlepatedness
+addleplot
+addlings
+addlins
+addorsed
+address
+addressee
+addresser
+addressful
+Addressograph
+addressor
+addrest
+Addu
+adduce
+adducent
+adducer
+adducible
+adduct
+adduction
+adductive
+adductor
+Addy
+Ade
+ade
+adead
+adeem
+adeep
+Adela
+Adelaide
+Adelarthra
+Adelarthrosomata
+adelarthrosomatous
+Adelbert
+Adelea
+Adeleidae
+Adelges
+Adelia
+Adelina
+Adeline
+adeling
+adelite
+Adeliza
+adelocerous
+Adelochorda
+adelocodonic
+adelomorphic
+adelomorphous
+adelopod
+Adelops
+Adelphi
+Adelphian
+adelphogamy
+Adelphoi
+adelpholite
+adelphophagy
+ademonist
+adempted
+ademption
+adenalgia
+adenalgy
+Adenanthera
+adenase
+adenasthenia
+adendric
+adendritic
+adenectomy
+adenectopia
+adenectopic
+adenemphractic
+adenemphraxis
+adenia
+adeniform
+adenine
+adenitis
+adenization
+adenoacanthoma
+adenoblast
+adenocancroid
+adenocarcinoma
+adenocarcinomatous
+adenocele
+adenocellulitis
+adenochondroma
+adenochondrosarcoma
+adenochrome
+adenocyst
+adenocystoma
+adenocystomatous
+adenodermia
+adenodiastasis
+adenodynia
+adenofibroma
+adenofibrosis
+adenogenesis
+adenogenous
+adenographer
+adenographic
+adenographical
+adenography
+adenohypersthenia
+adenoid
+adenoidal
+adenoidism
+adenoliomyofibroma
+adenolipoma
+adenolipomatosis
+adenologaditis
+adenological
+adenology
+adenolymphocele
+adenolymphoma
+adenoma
+adenomalacia
+adenomatome
+adenomatous
+adenomeningeal
+adenometritis
+adenomycosis
+adenomyofibroma
+adenomyoma
+adenomyxoma
+adenomyxosarcoma
+adenoncus
+adenoneural
+adenoneure
+adenopathy
+adenopharyngeal
+adenopharyngitis
+adenophlegmon
+Adenophora
+adenophore
+adenophorous
+adenophthalmia
+adenophyllous
+adenophyma
+adenopodous
+adenosarcoma
+adenosclerosis
+adenose
+adenosine
+adenosis
+adenostemonous
+Adenostoma
+adenotome
+adenotomic
+adenotomy
+adenotyphoid
+adenotyphus
+adenyl
+adenylic
+Adeodatus
+Adeona
+Adephaga
+adephagan
+adephagia
+adephagous
+adept
+adeptness
+adeptship
+adequacy
+adequate
+adequately
+adequateness
+adequation
+adequative
+adermia
+adermin
+Adessenarian
+adet
+adevism
+adfected
+adfix
+adfluxion
+adglutinate
+Adhafera
+adhaka
+adhamant
+Adhara
+adharma
+adhere
+adherence
+adherency
+adherent
+adherently
+adherer
+adherescence
+adherescent
+adhesion
+adhesional
+adhesive
+adhesively
+adhesivemeter
+adhesiveness
+adhibit
+adhibition
+adiabatic
+adiabatically
+adiabolist
+adiactinic
+adiadochokinesis
+adiagnostic
+adiantiform
+Adiantum
+adiaphon
+adiaphonon
+adiaphoral
+adiaphoresis
+adiaphoretic
+adiaphorism
+adiaphorist
+adiaphoristic
+adiaphorite
+adiaphoron
+adiaphorous
+adiate
+adiathermal
+adiathermancy
+adiathermanous
+adiathermic
+adiathetic
+adiation
+Adib
+Adicea
+adicity
+Adiel
+adieu
+adieux
+Adigei
+Adighe
+Adigranth
+adigranth
+Adin
+Adinida
+adinidan
+adinole
+adion
+adipate
+adipescent
+adipic
+adipinic
+adipocele
+adipocellulose
+adipocere
+adipoceriform
+adipocerous
+adipocyte
+adipofibroma
+adipogenic
+adipogenous
+adipoid
+adipolysis
+adipolytic
+adipoma
+adipomatous
+adipometer
+adipopexia
+adipopexis
+adipose
+adiposeness
+adiposis
+adiposity
+adiposogenital
+adiposuria
+adipous
+adipsia
+adipsic
+adipsous
+adipsy
+adipyl
+Adirondack
+adit
+adital
+aditus
+adjacency
+adjacent
+adjacently
+adjag
+adject
+adjection
+adjectional
+adjectival
+adjectivally
+adjective
+adjectively
+adjectivism
+adjectivitis
+adjiger
+adjoin
+adjoined
+adjoinedly
+adjoining
+adjoint
+adjourn
+adjournal
+adjournment
+adjudge
+adjudgeable
+adjudger
+adjudgment
+adjudicate
+adjudication
+adjudicative
+adjudicator
+adjudicature
+adjunct
+adjunction
+adjunctive
+adjunctively
+adjunctly
+adjuration
+adjuratory
+adjure
+adjurer
+adjust
+adjustable
+adjustably
+adjustage
+adjustation
+adjuster
+adjustive
+adjustment
+adjutage
+adjutancy
+adjutant
+adjutantship
+adjutorious
+adjutory
+adjutrice
+adjuvant
+Adlai
+adlay
+adless
+adlet
+Adlumia
+adlumidine
+adlumine
+adman
+admarginate
+admaxillary
+admeasure
+admeasurement
+admeasurer
+admedial
+admedian
+admensuration
+admi
+adminicle
+adminicula
+adminicular
+adminiculary
+adminiculate
+adminiculation
+adminiculum
+administer
+administerd
+administerial
+administrable
+administrant
+administrate
+administration
+administrational
+administrative
+administratively
+administrator
+administratorship
+administratress
+administratrices
+administratrix
+admirability
+admirable
+admirableness
+admirably
+admiral
+admiralship
+admiralty
+admiration
+admirative
+admirator
+admire
+admired
+admiredly
+admirer
+admiring
+admiringly
+admissibility
+admissible
+admissibleness
+admissibly
+admission
+admissive
+admissory
+admit
+admittable
+admittance
+admitted
+admittedly
+admittee
+admitter
+admittible
+admix
+admixtion
+admixture
+admonish
+admonisher
+admonishingly
+admonishment
+admonition
+admonitioner
+admonitionist
+admonitive
+admonitively
+admonitor
+admonitorial
+admonitorily
+admonitory
+admonitrix
+admortization
+adnascence
+adnascent
+adnate
+adnation
+adnephrine
+adnerval
+adneural
+adnex
+adnexal
+adnexed
+adnexitis
+adnexopexy
+adnominal
+adnominally
+adnomination
+adnoun
+ado
+adobe
+adolesce
+adolescence
+adolescency
+adolescent
+adolescently
+Adolph
+Adolphus
+Adonai
+Adonean
+Adonia
+Adoniad
+Adonian
+Adonic
+adonidin
+adonin
+Adoniram
+Adonis
+adonite
+adonitol
+adonize
+adoperate
+adoperation
+adopt
+adoptability
+adoptable
+adoptant
+adoptative
+adopted
+adoptedly
+adoptee
+adopter
+adoptian
+adoptianism
+adoptianist
+adoption
+adoptional
+adoptionism
+adoptionist
+adoptious
+adoptive
+adoptively
+adorability
+adorable
+adorableness
+adorably
+adoral
+adorally
+adorant
+Adorantes
+adoration
+adoratory
+adore
+adorer
+Adoretus
+adoringly
+adorn
+adorner
+adorningly
+adornment
+adosculation
+adossed
+adoulie
+adown
+Adoxa
+Adoxaceae
+adoxaceous
+adoxography
+adoxy
+adoze
+adpao
+adpress
+adpromission
+adradial
+adradially
+adradius
+Adramelech
+Adrammelech
+adread
+adream
+adreamed
+adreamt
+adrectal
+adrenal
+adrenalectomize
+adrenalectomy
+Adrenalin
+adrenaline
+adrenalize
+adrenalone
+adrenergic
+adrenin
+adrenine
+adrenochrome
+adrenocortical
+adrenocorticotropic
+adrenolysis
+adrenolytic
+adrenotropic
+Adrian
+Adriana
+Adriatic
+Adrienne
+adrift
+adrip
+adroit
+adroitly
+adroitness
+adroop
+adrop
+adrostral
+adrowse
+adrue
+adry
+adsbud
+adscendent
+adscititious
+adscititiously
+adscript
+adscripted
+adscription
+adscriptitious
+adscriptitius
+adscriptive
+adsessor
+adsheart
+adsignification
+adsignify
+adsmith
+adsmithing
+adsorb
+adsorbable
+adsorbate
+adsorbent
+adsorption
+adsorptive
+adstipulate
+adstipulation
+adstipulator
+adterminal
+adtevac
+adular
+adularescence
+adularia
+adulate
+adulation
+adulator
+adulatory
+adulatress
+Adullam
+Adullamite
+adult
+adulter
+adulterant
+adulterate
+adulterately
+adulterateness
+adulteration
+adulterator
+adulterer
+adulteress
+adulterine
+adulterize
+adulterous
+adulterously
+adultery
+adulthood
+adulticidal
+adulticide
+adultness
+adultoid
+adumbral
+adumbrant
+adumbrate
+adumbration
+adumbrative
+adumbratively
+adunc
+aduncate
+aduncated
+aduncity
+aduncous
+adusk
+adust
+adustion
+adustiosis
+Advaita
+advance
+advanceable
+advanced
+advancedness
+advancement
+advancer
+advancing
+advancingly
+advancive
+advantage
+advantageous
+advantageously
+advantageousness
+advection
+advectitious
+advective
+advehent
+advene
+advenience
+advenient
+Advent
+advential
+Adventism
+Adventist
+adventitia
+adventitious
+adventitiously
+adventitiousness
+adventive
+adventual
+adventure
+adventureful
+adventurement
+adventurer
+adventureship
+adventuresome
+adventuresomely
+adventuresomeness
+adventuress
+adventurish
+adventurous
+adventurously
+adventurousness
+adverb
+adverbial
+adverbiality
+adverbialize
+adverbially
+adverbiation
+adversant
+adversaria
+adversarious
+adversary
+adversative
+adversatively
+adverse
+adversely
+adverseness
+adversifoliate
+adversifolious
+adversity
+advert
+advertence
+advertency
+advertent
+advertently
+advertisable
+advertise
+advertisee
+advertisement
+advertiser
+advertising
+advice
+adviceful
+advisability
+advisable
+advisableness
+advisably
+advisal
+advisatory
+advise
+advised
+advisedly
+advisedness
+advisee
+advisement
+adviser
+advisership
+advisive
+advisiveness
+advisor
+advisorily
+advisory
+advocacy
+advocate
+advocateship
+advocatess
+advocation
+advocator
+advocatory
+advocatress
+advocatrice
+advocatrix
+advolution
+advowee
+advowson
+ady
+adynamia
+adynamic
+adynamy
+adyta
+adyton
+adytum
+adz
+adze
+adzer
+adzooks
+ae
+Aeacides
+Aeacus
+Aeaean
+Aechmophorus
+aecial
+Aecidiaceae
+aecidial
+aecidioform
+Aecidiomycetes
+aecidiospore
+aecidiostage
+aecidium
+aeciospore
+aeciostage
+aecioteliospore
+aeciotelium
+aecium
+aedeagus
+Aedes
+aedicula
+aedile
+aedileship
+aedilian
+aedilic
+aedilitian
+aedility
+aedoeagus
+aefald
+aefaldness
+aefaldy
+aefauld
+aegagropila
+aegagropile
+aegagrus
+Aegean
+aegerian
+aegeriid
+Aegeriidae
+Aegialitis
+aegicrania
+Aegina
+Aeginetan
+Aeginetic
+Aegipan
+aegirine
+aegirinolite
+aegirite
+aegis
+Aegisthus
+Aegithalos
+Aegithognathae
+aegithognathism
+aegithognathous
+Aegle
+Aegopodium
+aegrotant
+aegyptilla
+aegyrite
+aeluroid
+Aeluroidea
+aelurophobe
+aelurophobia
+aeluropodous
+aenach
+aenean
+aeneolithic
+aeneous
+aenigmatite
+aeolharmonica
+Aeolia
+Aeolian
+Aeolic
+Aeolicism
+aeolid
+Aeolidae
+Aeolididae
+aeolina
+aeoline
+aeolipile
+Aeolis
+Aeolism
+Aeolist
+aeolistic
+aeolodicon
+aeolodion
+aeolomelodicon
+aeolopantalon
+aeolotropic
+aeolotropism
+aeolotropy
+aeolsklavier
+aeon
+aeonial
+aeonian
+aeonist
+Aepyceros
+Aepyornis
+Aepyornithidae
+Aepyornithiformes
+Aequi
+Aequian
+Aequiculi
+Aequipalpia
+aequoreal
+aer
+aerage
+aerarian
+aerarium
+aerate
+aeration
+aerator
+aerenchyma
+aerenterectasia
+aerial
+aerialist
+aeriality
+aerially
+aerialness
+aeric
+aerical
+Aerides
+aerie
+aeried
+aerifaction
+aeriferous
+aerification
+aeriform
+aerify
+aero
+Aerobacter
+aerobate
+aerobatic
+aerobatics
+aerobe
+aerobian
+aerobic
+aerobically
+aerobiologic
+aerobiological
+aerobiologically
+aerobiologist
+aerobiology
+aerobion
+aerobiont
+aerobioscope
+aerobiosis
+aerobiotic
+aerobiotically
+aerobious
+aerobium
+aeroboat
+Aerobranchia
+aerobranchiate
+aerobus
+aerocamera
+aerocartograph
+Aerocharidae
+aerocolpos
+aerocraft
+aerocurve
+aerocyst
+aerodermectasia
+aerodone
+aerodonetic
+aerodonetics
+aerodrome
+aerodromics
+aerodynamic
+aerodynamical
+aerodynamicist
+aerodynamics
+aerodyne
+aeroembolism
+aeroenterectasia
+aerofoil
+aerogel
+aerogen
+aerogenes
+aerogenesis
+aerogenic
+aerogenically
+aerogenous
+aerogeologist
+aerogeology
+aerognosy
+aerogram
+aerograph
+aerographer
+aerographic
+aerographical
+aerographics
+aerography
+aerogun
+aerohydrodynamic
+aerohydropathy
+aerohydroplane
+aerohydrotherapy
+aerohydrous
+aeroides
+aerolite
+aerolith
+aerolithology
+aerolitic
+aerolitics
+aerologic
+aerological
+aerologist
+aerology
+aeromaechanic
+aeromancer
+aeromancy
+aeromantic
+aeromarine
+aeromechanical
+aeromechanics
+aerometeorograph
+aerometer
+aerometric
+aerometry
+aeromotor
+aeronat
+aeronaut
+aeronautic
+aeronautical
+aeronautically
+aeronautics
+aeronautism
+aeronef
+aeroneurosis
+aeropathy
+Aerope
+aeroperitoneum
+aeroperitonia
+aerophagia
+aerophagist
+aerophagy
+aerophane
+aerophilatelic
+aerophilatelist
+aerophilately
+aerophile
+aerophilic
+aerophilous
+aerophobia
+aerophobic
+aerophone
+aerophor
+aerophore
+aerophotography
+aerophysical
+aerophysics
+aerophyte
+aeroplane
+aeroplaner
+aeroplanist
+aeropleustic
+aeroporotomy
+aeroscepsis
+aeroscepsy
+aeroscope
+aeroscopic
+aeroscopically
+aeroscopy
+aerose
+aerosiderite
+aerosiderolite
+Aerosol
+aerosol
+aerosphere
+aerosporin
+aerostat
+aerostatic
+aerostatical
+aerostatics
+aerostation
+aerosteam
+aerotactic
+aerotaxis
+aerotechnical
+aerotherapeutics
+aerotherapy
+aerotonometer
+aerotonometric
+aerotonometry
+aerotropic
+aerotropism
+aeroyacht
+aeruginous
+aerugo
+aery
+aes
+Aeschylean
+Aeschynanthus
+Aeschynomene
+aeschynomenous
+Aesculaceae
+aesculaceous
+Aesculapian
+Aesculapius
+Aesculus
+Aesopian
+Aesopic
+aesthete
+aesthetic
+aesthetical
+aesthetically
+aesthetician
+aestheticism
+aestheticist
+aestheticize
+aesthetics
+aesthiology
+aesthophysiology
+Aestii
+aethalioid
+aethalium
+aetheogam
+aetheogamic
+aetheogamous
+aethered
+Aethionema
+aethogen
+aethrioscope
+Aethusa
+Aetian
+aetiogenic
+aetiotropic
+aetiotropically
+Aetobatidae
+Aetobatus
+Aetolian
+Aetomorphae
+aetosaur
+aetosaurian
+Aetosaurus
+aevia
+aface
+afaint
+Afar
+afar
+afara
+afear
+afeard
+afeared
+afebrile
+Afenil
+afernan
+afetal
+affa
+affability
+affable
+affableness
+affably
+affabrous
+affair
+affaite
+affect
+affectable
+affectate
+affectation
+affectationist
+affected
+affectedly
+affectedness
+affecter
+affectibility
+affectible
+affecting
+affectingly
+affection
+affectional
+affectionally
+affectionate
+affectionately
+affectionateness
+affectioned
+affectious
+affective
+affectively
+affectivity
+affeer
+affeerer
+affeerment
+affeir
+affenpinscher
+affenspalte
+afferent
+affettuoso
+affiance
+affiancer
+affiant
+affidation
+affidavit
+affidavy
+affiliable
+affiliate
+affiliation
+affinal
+affination
+affine
+affined
+affinely
+affinitative
+affinitatively
+affinite
+affinition
+affinitive
+affinity
+affirm
+affirmable
+affirmably
+affirmance
+affirmant
+affirmation
+affirmative
+affirmatively
+affirmatory
+affirmer
+affirmingly
+affix
+affixal
+affixation
+affixer
+affixion
+affixture
+afflation
+afflatus
+afflict
+afflicted
+afflictedness
+afflicter
+afflicting
+afflictingly
+affliction
+afflictionless
+afflictive
+afflictively
+affluence
+affluent
+affluently
+affluentness
+afflux
+affluxion
+afforce
+afforcement
+afford
+affordable
+afforest
+afforestable
+afforestation
+afforestment
+afformative
+affranchise
+affranchisement
+affray
+affrayer
+affreight
+affreighter
+affreightment
+affricate
+affricated
+affrication
+affricative
+affright
+affrighted
+affrightedly
+affrighter
+affrightful
+affrightfully
+affrightingly
+affrightment
+affront
+affronte
+affronted
+affrontedly
+affrontedness
+affronter
+affronting
+affrontingly
+affrontingness
+affrontive
+affrontiveness
+affrontment
+affuse
+affusion
+affy
+Afghan
+afghani
+afield
+Afifi
+afikomen
+afire
+aflagellar
+aflame
+aflare
+aflat
+aflaunt
+aflicker
+aflight
+afloat
+aflow
+aflower
+afluking
+aflush
+aflutter
+afoam
+afoot
+afore
+aforehand
+aforenamed
+aforesaid
+aforethought
+aforetime
+aforetimes
+afortiori
+afoul
+afraid
+afraidness
+Aframerican
+Afrasia
+Afrasian
+afreet
+afresh
+afret
+Afric
+African
+Africana
+Africanism
+Africanist
+Africanization
+Africanize
+Africanoid
+Africanthropus
+Afridi
+Afrikaans
+Afrikander
+Afrikanderdom
+Afrikanderism
+Afrikaner
+Afrogaea
+Afrogaean
+afront
+afrown
+Afshah
+Afshar
+aft
+aftaba
+after
+afteract
+afterage
+afterattack
+afterband
+afterbeat
+afterbirth
+afterblow
+afterbody
+afterbrain
+afterbreach
+afterbreast
+afterburner
+afterburning
+aftercare
+aftercareer
+aftercast
+aftercataract
+aftercause
+afterchance
+afterchrome
+afterchurch
+afterclap
+afterclause
+aftercome
+aftercomer
+aftercoming
+aftercooler
+aftercost
+aftercourse
+aftercrop
+aftercure
+afterdamp
+afterdate
+afterdays
+afterdeck
+afterdinner
+afterdrain
+afterdrops
+aftereffect
+afterend
+aftereye
+afterfall
+afterfame
+afterfeed
+afterfermentation
+afterform
+afterfriend
+afterfruits
+afterfuture
+aftergame
+aftergas
+afterglide
+afterglow
+aftergo
+aftergood
+aftergrass
+aftergrave
+aftergrief
+aftergrind
+aftergrowth
+afterguard
+afterguns
+afterhand
+afterharm
+afterhatch
+afterhelp
+afterhend
+afterhold
+afterhope
+afterhours
+afterimage
+afterimpression
+afterings
+afterking
+afterknowledge
+afterlife
+afterlifetime
+afterlight
+afterloss
+afterlove
+aftermark
+aftermarriage
+aftermass
+aftermast
+aftermath
+aftermatter
+aftermeal
+aftermilk
+aftermost
+afternight
+afternoon
+afternoons
+afternose
+afternote
+afteroar
+afterpain
+afterpart
+afterpast
+afterpeak
+afterpiece
+afterplanting
+afterplay
+afterpressure
+afterproof
+afterrake
+afterreckoning
+afterrider
+afterripening
+afterroll
+afterschool
+aftersend
+aftersensation
+aftershaft
+aftershafted
+aftershine
+aftership
+aftershock
+aftersong
+aftersound
+afterspeech
+afterspring
+afterstain
+afterstate
+afterstorm
+afterstrain
+afterstretch
+afterstudy
+afterswarm
+afterswarming
+afterswell
+aftertan
+aftertask
+aftertaste
+afterthinker
+afterthought
+afterthoughted
+afterthrift
+aftertime
+aftertimes
+aftertouch
+aftertreatment
+aftertrial
+afterturn
+aftervision
+afterwale
+afterwar
+afterward
+afterwards
+afterwash
+afterwhile
+afterwisdom
+afterwise
+afterwit
+afterwitted
+afterwork
+afterworking
+afterworld
+afterwrath
+afterwrist
+aftmost
+Aftonian
+aftosa
+aftward
+aftwards
+afunction
+afunctional
+afwillite
+Afzelia
+aga
+agabanee
+agacante
+agacella
+Agaces
+Agade
+Agag
+again
+against
+againstand
+agal
+agalactia
+agalactic
+agalactous
+agalawood
+agalaxia
+agalaxy
+Agalena
+Agalenidae
+Agalinis
+agalite
+agalloch
+agallochum
+agallop
+agalma
+agalmatolite
+agalwood
+Agama
+agama
+Agamae
+Agamemnon
+agamete
+agami
+agamian
+agamic
+agamically
+agamid
+Agamidae
+agamobium
+agamogenesis
+agamogenetic
+agamogenetically
+agamogony
+agamoid
+agamont
+agamospore
+agamous
+agamy
+aganglionic
+Aganice
+Aganippe
+Agao
+Agaonidae
+Agapanthus
+agape
+Agapemone
+Agapemonian
+Agapemonist
+Agapemonite
+agapetae
+agapeti
+agapetid
+Agapetidae
+Agapornis
+agar
+agaric
+agaricaceae
+agaricaceous
+Agaricales
+agaricic
+agariciform
+agaricin
+agaricine
+agaricoid
+Agaricus
+Agaristidae
+agarita
+Agarum
+agarwal
+agasp
+Agastache
+Agastreae
+agastric
+agastroneuria
+agate
+agateware
+Agatha
+Agathaea
+Agathaumas
+agathin
+Agathis
+agathism
+agathist
+agathodaemon
+agathodaemonic
+agathokakological
+agathology
+Agathosma
+agatiferous
+agatiform
+agatine
+agatize
+agatoid
+agaty
+Agau
+Agave
+agavose
+Agawam
+Agaz
+agaze
+agazed
+Agdistis
+age
+aged
+agedly
+agedness
+agee
+Agelacrinites
+Agelacrinitidae
+Agelaius
+Agelaus
+ageless
+agelessness
+agelong
+agen
+Agena
+agency
+agenda
+agendum
+agenesia
+agenesic
+agenesis
+agennetic
+agent
+agentess
+agential
+agentival
+agentive
+agentry
+agentship
+ageometrical
+ager
+Ageratum
+ageusia
+ageusic
+ageustia
+agger
+aggerate
+aggeration
+aggerose
+Aggie
+agglomerant
+agglomerate
+agglomerated
+agglomeratic
+agglomeration
+agglomerative
+agglomerator
+agglutinability
+agglutinable
+agglutinant
+agglutinate
+agglutination
+agglutinationist
+agglutinative
+agglutinator
+agglutinin
+agglutinize
+agglutinogen
+agglutinogenic
+agglutinoid
+agglutinoscope
+agglutogenic
+aggradation
+aggradational
+aggrade
+aggrandizable
+aggrandize
+aggrandizement
+aggrandizer
+aggrate
+aggravate
+aggravating
+aggravatingly
+aggravation
+aggravative
+aggravator
+aggregable
+aggregant
+Aggregata
+Aggregatae
+aggregate
+aggregately
+aggregateness
+aggregation
+aggregative
+aggregator
+aggregatory
+aggress
+aggressin
+aggression
+aggressionist
+aggressive
+aggressively
+aggressiveness
+aggressor
+aggrievance
+aggrieve
+aggrieved
+aggrievedly
+aggrievedness
+aggrievement
+aggroup
+aggroupment
+aggry
+aggur
+agha
+Aghan
+aghanee
+aghast
+aghastness
+Aghlabite
+Aghorapanthi
+Aghori
+Agialid
+Agib
+Agiel
+agilawood
+agile
+agilely
+agileness
+agility
+agillawood
+aging
+agio
+agiotage
+agist
+agistator
+agistment
+agistor
+agitable
+agitant
+agitate
+agitatedly
+agitation
+agitational
+agitationist
+agitative
+agitator
+agitatorial
+agitatrix
+agitprop
+Agkistrodon
+agla
+Aglaia
+aglance
+Aglaonema
+Aglaos
+aglaozonia
+aglare
+Aglaspis
+Aglauros
+agleaf
+agleam
+aglet
+aglethead
+agley
+aglimmer
+aglint
+Aglipayan
+Aglipayano
+aglitter
+aglobulia
+Aglossa
+aglossal
+aglossate
+aglossia
+aglow
+aglucon
+aglutition
+aglycosuric
+Aglypha
+aglyphodont
+Aglyphodonta
+Aglyphodontia
+aglyphous
+agmatine
+agmatology
+agminate
+agminated
+agnail
+agname
+agnamed
+agnate
+Agnatha
+agnathia
+agnathic
+Agnathostomata
+agnathostomatous
+agnathous
+agnatic
+agnatically
+agnation
+agnel
+Agnes
+agnification
+agnize
+Agnoetae
+Agnoete
+Agnoetism
+agnoiology
+Agnoite
+agnomen
+agnomical
+agnominal
+agnomination
+agnosia
+agnosis
+agnostic
+agnostically
+agnosticism
+Agnostus
+agnosy
+Agnotozoic
+agnus
+ago
+agog
+agoge
+agogic
+agogics
+agoho
+agoing
+agomensin
+agomphiasis
+agomphious
+agomphosis
+agon
+agonal
+agone
+agoniada
+agoniadin
+agoniatite
+Agoniatites
+agonic
+agonied
+agonist
+Agonista
+agonistarch
+agonistic
+agonistically
+agonistics
+agonium
+agonize
+agonizedly
+agonizer
+agonizingly
+Agonostomus
+agonothete
+agonothetic
+agony
+agora
+agoranome
+agoraphobia
+agouara
+agouta
+agouti
+agpaite
+agpaitic
+Agra
+agraffee
+agrah
+agral
+agrammatical
+agrammatism
+Agrania
+agranulocyte
+agranulocytosis
+agranuloplastic
+Agrapha
+agraphia
+agraphic
+agrarian
+agrarianism
+agrarianize
+agrarianly
+Agrauleum
+agre
+agree
+agreeability
+agreeable
+agreeableness
+agreeably
+agreed
+agreeing
+agreeingly
+agreement
+agreer
+agregation
+agrege
+agrestal
+agrestial
+agrestian
+agrestic
+agria
+agricere
+agricole
+agricolist
+agricolite
+agricolous
+agricultor
+agricultural
+agriculturalist
+agriculturally
+agriculture
+agriculturer
+agriculturist
+Agrilus
+Agrimonia
+agrimony
+agrimotor
+agrin
+Agriochoeridae
+Agriochoerus
+agriological
+agriologist
+agriology
+Agrionia
+agrionid
+Agrionidae
+Agriotes
+Agriotypidae
+Agriotypus
+agrise
+agrito
+agroan
+agrobiologic
+agrobiological
+agrobiologically
+agrobiologist
+agrobiology
+agrogeological
+agrogeologically
+agrogeology
+agrologic
+agrological
+agrologically
+agrology
+agrom
+Agromyza
+agromyzid
+Agromyzidae
+agronome
+agronomial
+agronomic
+agronomical
+agronomics
+agronomist
+agronomy
+agroof
+agrope
+Agropyron
+Agrostemma
+agrosteral
+Agrostis
+agrostographer
+agrostographic
+agrostographical
+agrostography
+agrostologic
+agrostological
+agrostologist
+agrostology
+agrotechny
+Agrotis
+aground
+agrufe
+agruif
+agrypnia
+agrypnotic
+agsam
+agua
+aguacate
+Aguacateca
+aguavina
+Agudist
+ague
+aguelike
+agueproof
+agueweed
+aguey
+aguilarite
+aguilawood
+aguinaldo
+aguirage
+aguish
+aguishly
+aguishness
+agunah
+agush
+agust
+agy
+Agyieus
+agynarious
+agynary
+agynous
+agyrate
+agyria
+Ah
+ah
+aha
+ahaaina
+ahankara
+Ahantchuyuk
+ahartalav
+ahaunch
+ahead
+aheap
+ahem
+Ahepatokla
+Ahet
+ahey
+ahimsa
+ahind
+ahint
+Ahir
+ahluwalia
+ahmadi
+Ahmadiya
+Ahmed
+Ahmet
+Ahnfeltia
+aho
+Ahom
+ahong
+ahorse
+ahorseback
+Ahousaht
+ahoy
+Ahrendahronon
+Ahriman
+Ahrimanian
+ahsan
+Aht
+Ahtena
+ahu
+ahuatle
+ahuehuete
+ahull
+ahum
+ahungered
+ahungry
+ahunt
+ahura
+ahush
+ahwal
+ahypnia
+ai
+Aias
+Aiawong
+aichmophobia
+aid
+aidable
+aidance
+aidant
+aide
+Aidenn
+aider
+Aides
+aidful
+aidless
+aiel
+aigialosaur
+Aigialosauridae
+Aigialosaurus
+aiglet
+aigremore
+aigrette
+aiguille
+aiguillesque
+aiguillette
+aiguilletted
+aikinite
+ail
+ailantery
+ailanthic
+Ailanthus
+ailantine
+ailanto
+aile
+Aileen
+aileron
+ailette
+Ailie
+ailing
+aillt
+ailment
+ailsyte
+Ailuridae
+ailuro
+ailuroid
+Ailuroidea
+Ailuropoda
+Ailuropus
+Ailurus
+ailweed
+aim
+Aimak
+aimara
+Aimee
+aimer
+aimful
+aimfully
+aiming
+aimless
+aimlessly
+aimlessness
+Aimore
+aimworthiness
+ainaleh
+ainhum
+ainoi
+ainsell
+aint
+Ainu
+aion
+aionial
+air
+Aira
+airable
+airampo
+airan
+airbound
+airbrained
+airbrush
+aircraft
+aircraftman
+aircraftsman
+aircraftswoman
+aircraftwoman
+aircrew
+aircrewman
+airdock
+airdrome
+airdrop
+aire
+Airedale
+airedale
+airer
+airfield
+airfoil
+airframe
+airfreight
+airfreighter
+airgraphics
+airhead
+airiferous
+airified
+airily
+airiness
+airing
+airish
+airless
+airlift
+airlike
+airliner
+airmail
+airman
+airmanship
+airmark
+airmarker
+airmonger
+airohydrogen
+airometer
+airpark
+airphobia
+airplane
+airplanist
+airport
+airproof
+airscape
+airscrew
+airship
+airsick
+airsickness
+airstrip
+airt
+airtight
+airtightly
+airtightness
+airward
+airwards
+airway
+airwayman
+airwoman
+airworthiness
+airworthy
+airy
+aischrolatreia
+aiseweed
+aisle
+aisled
+aisleless
+aisling
+Aissaoua
+Aissor
+aisteoir
+Aistopoda
+Aistopodes
+ait
+aitch
+aitchbone
+aitchless
+aitchpiece
+aitesis
+aithochroi
+aition
+aitiotropic
+Aitkenite
+Aitutakian
+aiwan
+Aix
+aizle
+Aizoaceae
+aizoaceous
+Aizoon
+Ajaja
+ajaja
+ajangle
+ajar
+ajari
+Ajatasatru
+ajava
+ajhar
+ajivika
+ajog
+ajoint
+ajowan
+Ajuga
+ajutment
+ak
+Aka
+aka
+Akal
+akala
+Akali
+akalimba
+akamatsu
+Akamnik
+Akan
+Akanekunik
+Akania
+Akaniaceae
+akaroa
+akasa
+Akawai
+akazga
+akazgine
+akcheh
+ake
+akeake
+akebi
+Akebia
+akee
+akeki
+akeley
+akenobeite
+akepiro
+akerite
+akey
+Akha
+Akhissar
+Akhlame
+Akhmimic
+akhoond
+akhrot
+akhyana
+akia
+Akim
+akimbo
+akin
+akindle
+akinesia
+akinesic
+akinesis
+akinete
+akinetic
+Akiskemikinik
+Akiyenik
+Akka
+Akkad
+Akkadian
+Akkadist
+akmudar
+akmuddar
+aknee
+ako
+akoasm
+akoasma
+akoluthia
+akonge
+Akontae
+Akoulalion
+akov
+akpek
+Akra
+akra
+Akrabattine
+akroasis
+akrochordite
+akroterion
+Aktistetae
+Aktistete
+Aktivismus
+Aktivist
+aku
+akuammine
+akule
+akund
+Akwapim
+Al
+al
+ala
+Alabama
+Alabaman
+Alabamian
+alabamide
+alabamine
+alabandite
+alabarch
+alabaster
+alabastos
+alabastrian
+alabastrine
+alabastrites
+alabastron
+alabastrum
+alacha
+alack
+alackaday
+alacreatine
+alacreatinine
+alacrify
+alacritous
+alacrity
+Alactaga
+alada
+Aladdin
+Aladdinize
+Aladfar
+Aladinist
+alaihi
+Alain
+alaite
+Alaki
+Alala
+alala
+alalite
+alalonga
+alalunga
+alalus
+Alamanni
+Alamannian
+Alamannic
+alameda
+alamo
+alamodality
+alamonti
+alamosite
+alamoth
+Alan
+alan
+aland
+Alangiaceae
+alangin
+alangine
+Alangium
+alani
+alanine
+alannah
+Alans
+alantic
+alantin
+alantol
+alantolactone
+alantolic
+alanyl
+alar
+Alarbus
+alares
+Alaria
+Alaric
+alarm
+alarmable
+alarmed
+alarmedly
+alarming
+alarmingly
+alarmism
+alarmist
+Alarodian
+alarum
+alary
+alas
+Alascan
+Alaska
+alaskaite
+Alaskan
+alaskite
+Alastair
+Alaster
+alastrim
+alate
+alated
+alatern
+alaternus
+alation
+Alauda
+Alaudidae
+alaudine
+Alaunian
+Alawi
+Alb
+alb
+alba
+albacore
+albahaca
+Albainn
+Alban
+alban
+Albanenses
+Albanensian
+Albania
+Albanian
+albanite
+Albany
+albarco
+albardine
+albarello
+albarium
+albaspidin
+albata
+Albatros
+albatross
+albe
+albedo
+albedograph
+albee
+albeit
+Alberene
+Albert
+Alberta
+albertin
+Albertina
+Albertine
+Albertinian
+Albertist
+albertite
+Alberto
+albertustaler
+albertype
+albescence
+albescent
+albespine
+albetad
+Albi
+Albian
+albicans
+albicant
+albication
+albiculi
+albification
+albificative
+albiflorous
+albify
+Albigenses
+Albigensian
+Albigensianism
+Albin
+albinal
+albiness
+albinic
+albinism
+albinistic
+albino
+albinoism
+albinotic
+albinuria
+Albion
+Albireo
+albite
+albitic
+albitite
+albitization
+albitophyre
+Albizzia
+albocarbon
+albocinereous
+Albococcus
+albocracy
+Alboin
+albolite
+albolith
+albopannin
+albopruinose
+alboranite
+Albrecht
+Albright
+albronze
+Albruna
+Albuca
+Albuginaceae
+albuginea
+albugineous
+albuginitis
+albugo
+album
+albumean
+albumen
+albumenization
+albumenize
+albumenizer
+albumimeter
+albumin
+albuminate
+albuminaturia
+albuminiferous
+albuminiform
+albuminimeter
+albuminimetry
+albuminiparous
+albuminization
+albuminize
+albuminocholia
+albuminofibrin
+albuminogenous
+albuminoid
+albuminoidal
+albuminolysis
+albuminometer
+albuminometry
+albuminone
+albuminorrhea
+albuminoscope
+albuminose
+albuminosis
+albuminous
+albuminousness
+albuminuria
+albuminuric
+albumoid
+albumoscope
+albumose
+albumosuria
+alburn
+alburnous
+alburnum
+albus
+albutannin
+Albyn
+Alca
+Alcaaba
+Alcae
+Alcaic
+alcaide
+alcalde
+alcaldeship
+alcaldia
+Alcaligenes
+alcalizate
+Alcalzar
+alcamine
+alcanna
+Alcantara
+Alcantarines
+alcarraza
+alcatras
+alcazar
+Alcedines
+Alcedinidae
+Alcedininae
+Alcedo
+alcelaphine
+Alcelaphus
+Alces
+alchemic
+alchemical
+alchemically
+Alchemilla
+alchemist
+alchemistic
+alchemistical
+alchemistry
+alchemize
+alchemy
+alchera
+alcheringa
+alchimy
+alchitran
+alchochoden
+Alchornea
+alchymy
+Alcibiadean
+Alcicornium
+Alcidae
+alcidine
+alcine
+Alcippe
+alclad
+alco
+alcoate
+alcogel
+alcogene
+alcohate
+alcohol
+alcoholate
+alcoholature
+alcoholdom
+alcoholemia
+alcoholic
+alcoholically
+alcoholicity
+alcoholimeter
+alcoholism
+alcoholist
+alcoholizable
+alcoholization
+alcoholize
+alcoholmeter
+alcoholmetric
+alcoholomania
+alcoholometer
+alcoholometric
+alcoholometrical
+alcoholometry
+alcoholophilia
+alcoholuria
+alcoholysis
+alcoholytic
+Alcor
+Alcoran
+Alcoranic
+Alcoranist
+alcornoco
+alcornoque
+alcosol
+Alcotate
+alcove
+alcovinometer
+Alcuinian
+alcyon
+Alcyonacea
+alcyonacean
+Alcyonaria
+alcyonarian
+Alcyone
+Alcyones
+Alcyoniaceae
+alcyonic
+alcyoniform
+Alcyonium
+alcyonoid
+aldamine
+aldane
+aldazin
+aldazine
+aldeament
+Aldebaran
+aldebaranium
+aldehol
+aldehydase
+aldehyde
+aldehydic
+aldehydine
+aldehydrol
+alder
+Alderamin
+alderman
+aldermanate
+aldermancy
+aldermaness
+aldermanic
+aldermanical
+aldermanity
+aldermanlike
+aldermanly
+aldermanry
+aldermanship
+aldern
+Alderney
+alderwoman
+Aldhafara
+Aldhafera
+aldim
+aldime
+aldimine
+Aldine
+aldine
+aldoheptose
+aldohexose
+aldoketene
+aldol
+aldolization
+aldolize
+aldononose
+aldopentose
+aldose
+aldoside
+aldoxime
+Aldrovanda
+Aldus
+ale
+Alea
+aleak
+aleatory
+alebench
+aleberry
+Alebion
+alec
+alecithal
+alecize
+Aleck
+aleconner
+alecost
+Alectoria
+alectoria
+Alectorides
+alectoridine
+alectorioid
+Alectoris
+alectoromachy
+alectoromancy
+Alectoromorphae
+alectoromorphous
+Alectoropodes
+alectoropodous
+Alectrion
+Alectrionidae
+alectryomachy
+alectryomancy
+Alectryon
+alecup
+alee
+alef
+alefnull
+aleft
+alefzero
+alegar
+alehoof
+alehouse
+Alejandro
+alem
+alemana
+Alemanni
+Alemannian
+Alemannic
+Alemannish
+alembic
+alembicate
+alembroth
+Alemite
+alemite
+alemmal
+alemonger
+alen
+Alencon
+Aleochara
+aleph
+alephs
+alephzero
+alepidote
+alepole
+alepot
+Aleppine
+Aleppo
+alerce
+alerse
+alert
+alertly
+alertness
+alesan
+alestake
+aletap
+aletaster
+Alethea
+alethiology
+alethopteis
+alethopteroid
+alethoscope
+aletocyte
+Aletris
+alette
+aleukemic
+Aleurites
+aleuritic
+Aleurobius
+Aleurodes
+Aleurodidae
+aleuromancy
+aleurometer
+aleuronat
+aleurone
+aleuronic
+aleuroscope
+Aleut
+Aleutian
+Aleutic
+aleutite
+alevin
+alewife
+Alex
+Alexander
+alexanders
+Alexandra
+Alexandreid
+Alexandrian
+Alexandrianism
+Alexandrina
+Alexandrine
+alexandrite
+Alexas
+Alexia
+alexia
+Alexian
+alexic
+alexin
+alexinic
+alexipharmacon
+alexipharmacum
+alexipharmic
+alexipharmical
+alexipyretic
+Alexis
+alexiteric
+alexiterical
+Alexius
+aleyard
+Aleyrodes
+aleyrodid
+Aleyrodidae
+Alf
+alf
+alfa
+alfaje
+alfalfa
+alfaqui
+alfaquin
+alfenide
+alfet
+alfilaria
+alfileria
+alfilerilla
+alfilerillo
+alfiona
+Alfirk
+alfonsin
+alfonso
+alforja
+Alfred
+Alfreda
+alfresco
+alfridaric
+alfridary
+Alfur
+Alfurese
+Alfuro
+alga
+algae
+algaecide
+algaeological
+algaeologist
+algaeology
+algaesthesia
+algaesthesis
+algal
+algalia
+Algaroth
+algarroba
+algarrobilla
+algarrobin
+Algarsife
+Algarsyf
+algate
+Algebar
+algebra
+algebraic
+algebraical
+algebraically
+algebraist
+algebraization
+algebraize
+Algedi
+algedo
+algedonic
+algedonics
+algefacient
+Algenib
+Algerian
+Algerine
+algerine
+Algernon
+algesia
+algesic
+algesis
+algesthesis
+algetic
+Algic
+algic
+algid
+algidity
+algidness
+Algieba
+algific
+algin
+alginate
+algine
+alginic
+alginuresis
+algiomuscular
+algist
+algivorous
+algocyan
+algodoncillo
+algodonite
+algoesthesiometer
+algogenic
+algoid
+Algol
+algolagnia
+algolagnic
+algolagnist
+algolagny
+algological
+algologist
+algology
+Algoman
+algometer
+algometric
+algometrical
+algometrically
+algometry
+Algomian
+Algomic
+Algonkian
+Algonquian
+Algonquin
+algophilia
+algophilist
+algophobia
+algor
+Algorab
+Algores
+algorism
+algorismic
+algorist
+algoristic
+algorithm
+algorithmic
+algosis
+algous
+algovite
+algraphic
+algraphy
+alguazil
+algum
+Algy
+Alhagi
+Alhambra
+Alhambraic
+Alhambresque
+Alhena
+alhenna
+alias
+Alibamu
+alibangbang
+alibi
+alibility
+alible
+Alicant
+Alice
+alichel
+Alichino
+Alicia
+Alick
+alicoche
+alictisal
+alicyclic
+Alida
+alidade
+Alids
+alien
+alienability
+alienable
+alienage
+alienate
+alienation
+alienator
+aliency
+alienee
+aliener
+alienicola
+alienigenate
+alienism
+alienist
+alienize
+alienor
+alienship
+aliethmoid
+aliethmoidal
+alif
+aliferous
+aliform
+aligerous
+alight
+align
+aligner
+alignment
+aligreek
+aliipoe
+alike
+alikeness
+alikewise
+Alikuluf
+Alikulufan
+alilonghi
+alima
+aliment
+alimental
+alimentally
+alimentariness
+alimentary
+alimentation
+alimentative
+alimentatively
+alimentativeness
+alimenter
+alimentic
+alimentive
+alimentiveness
+alimentotherapy
+alimentum
+alimonied
+alimony
+alin
+alinasal
+Aline
+alineation
+alintatao
+aliofar
+Alioth
+alipata
+aliped
+aliphatic
+alipterion
+aliptes
+aliptic
+aliquant
+aliquot
+aliseptal
+alish
+alisier
+Alisma
+Alismaceae
+alismaceous
+alismad
+alismal
+Alismales
+Alismataceae
+alismoid
+aliso
+Alison
+alison
+alisonite
+alisp
+alisphenoid
+alisphenoidal
+alist
+Alister
+alit
+alite
+alitrunk
+aliturgic
+aliturgical
+aliunde
+alive
+aliveness
+alivincular
+Alix
+aliyah
+alizarate
+alizari
+alizarin
+aljoba
+alk
+alkahest
+alkahestic
+alkahestica
+alkahestical
+Alkaid
+alkalamide
+alkalemia
+alkalescence
+alkalescency
+alkalescent
+alkali
+alkalic
+alkaliferous
+alkalifiable
+alkalify
+alkaligen
+alkaligenous
+alkalimeter
+alkalimetric
+alkalimetrical
+alkalimetrically
+alkalimetry
+alkaline
+alkalinity
+alkalinization
+alkalinize
+alkalinuria
+alkalizable
+alkalizate
+alkalization
+alkalize
+alkalizer
+alkaloid
+alkaloidal
+alkalometry
+alkalosis
+alkalous
+Alkalurops
+alkamin
+alkamine
+alkane
+alkanet
+Alkanna
+alkannin
+Alkaphrah
+alkapton
+alkaptonuria
+alkaptonuric
+alkargen
+alkarsin
+alkekengi
+alkene
+alkenna
+alkenyl
+alkermes
+Alkes
+alkide
+alkine
+alkool
+Alkoran
+Alkoranic
+alkoxide
+alkoxy
+alkoxyl
+alky
+alkyd
+alkyl
+alkylamine
+alkylate
+alkylation
+alkylene
+alkylic
+alkylidene
+alkylize
+alkylogen
+alkyloxy
+alkyne
+all
+allabuta
+allactite
+allaeanthus
+allagite
+allagophyllous
+allagostemonous
+Allah
+allalinite
+Allamanda
+allamotti
+Allan
+allan
+allanite
+allanitic
+allantiasis
+allantochorion
+allantoic
+allantoid
+allantoidal
+Allantoidea
+allantoidean
+allantoidian
+allantoin
+allantoinase
+allantoinuria
+allantois
+allantoxaidin
+allanturic
+Allasch
+allassotonic
+allative
+allatrate
+allay
+allayer
+allayment
+allbone
+Alle
+allecret
+allectory
+allegate
+allegation
+allegator
+allege
+allegeable
+allegedly
+allegement
+alleger
+Alleghenian
+Allegheny
+allegiance
+allegiancy
+allegiant
+allegoric
+allegorical
+allegorically
+allegoricalness
+allegorism
+allegorist
+allegorister
+allegoristic
+allegorization
+allegorize
+allegorizer
+allegory
+allegretto
+allegro
+allele
+allelic
+allelism
+allelocatalytic
+allelomorph
+allelomorphic
+allelomorphism
+allelotropic
+allelotropism
+allelotropy
+alleluia
+alleluiatic
+allemand
+allemande
+allemontite
+Allen
+allenarly
+allene
+Allentiac
+Allentiacan
+aller
+allergen
+allergenic
+allergia
+allergic
+allergin
+allergist
+allergy
+allerion
+allesthesia
+alleviate
+alleviatingly
+alleviation
+alleviative
+alleviator
+alleviatory
+alley
+alleyed
+alleyite
+alleyway
+allgood
+Allhallow
+Allhallowtide
+allheal
+alliable
+alliably
+Alliaceae
+alliaceous
+alliance
+alliancer
+Alliaria
+allicampane
+allice
+allicholly
+alliciency
+allicient
+Allie
+allied
+Allies
+allies
+alligate
+alligator
+alligatored
+allineate
+allineation
+Allionia
+Allioniaceae
+allision
+alliteral
+alliterate
+alliteration
+alliterational
+alliterationist
+alliterative
+alliteratively
+alliterativeness
+alliterator
+Allium
+allivalite
+allmouth
+allness
+Allobroges
+allocable
+allocaffeine
+allocatable
+allocate
+allocatee
+allocation
+allocator
+allochetia
+allochetite
+allochezia
+allochiral
+allochirally
+allochiria
+allochlorophyll
+allochroic
+allochroite
+allochromatic
+allochroous
+allochthonous
+allocinnamic
+alloclase
+alloclasite
+allocochick
+allocrotonic
+allocryptic
+allocute
+allocution
+allocutive
+allocyanine
+allodelphite
+allodesmism
+alloeosis
+alloeostropha
+alloeotic
+alloerotic
+alloerotism
+allogamous
+allogamy
+allogene
+allogeneity
+allogeneous
+allogenic
+allogenically
+allograph
+alloiogenesis
+alloisomer
+alloisomeric
+alloisomerism
+allokinesis
+allokinetic
+allokurtic
+allomerism
+allomerous
+allometric
+allometry
+allomorph
+allomorphic
+allomorphism
+allomorphite
+allomucic
+allonomous
+allonym
+allonymous
+allopalladium
+allopath
+allopathetic
+allopathetically
+allopathic
+allopathically
+allopathist
+allopathy
+allopatric
+allopatrically
+allopatry
+allopelagic
+allophanamide
+allophanates
+allophane
+allophanic
+allophone
+allophyle
+allophylian
+allophylic
+Allophylus
+allophytoid
+alloplasm
+alloplasmatic
+alloplasmic
+alloplast
+alloplastic
+alloplasty
+alloploidy
+allopolyploid
+allopsychic
+alloquial
+alloquialism
+alloquy
+allorhythmia
+allorrhyhmia
+allorrhythmic
+allosaur
+Allosaurus
+allose
+allosematic
+allosome
+allosyndesis
+allosyndetic
+allot
+allotee
+allotelluric
+allotheism
+Allotheria
+allothigene
+allothigenetic
+allothigenetically
+allothigenic
+allothigenous
+allothimorph
+allothimorphic
+allothogenic
+allothogenous
+allotment
+allotriodontia
+Allotriognathi
+allotriomorphic
+allotriophagia
+allotriophagy
+allotriuria
+allotrope
+allotrophic
+allotropic
+allotropical
+allotropically
+allotropicity
+allotropism
+allotropize
+allotropous
+allotropy
+allotrylic
+allottable
+allottee
+allotter
+allotype
+allotypical
+allover
+allow
+allowable
+allowableness
+allowably
+allowance
+allowedly
+allower
+alloxan
+alloxanate
+alloxanic
+alloxantin
+alloxuraemia
+alloxuremia
+alloxuric
+alloxyproteic
+alloy
+alloyage
+allozooid
+allseed
+allspice
+allthing
+allthorn
+alltud
+allude
+allure
+allurement
+allurer
+alluring
+alluringly
+alluringness
+allusion
+allusive
+allusively
+allusiveness
+alluvia
+alluvial
+alluviate
+alluviation
+alluvion
+alluvious
+alluvium
+allwhere
+allwhither
+allwork
+Allworthy
+Ally
+ally
+allyl
+allylamine
+allylate
+allylation
+allylene
+allylic
+allylthiourea
+Alma
+alma
+Almach
+almaciga
+almacigo
+almadia
+almadie
+almagest
+almagra
+Almain
+Alman
+almanac
+almandine
+almandite
+alme
+almeidina
+almemar
+Almerian
+almeriite
+Almida
+almightily
+almightiness
+almighty
+almique
+Almira
+almirah
+almochoden
+Almohad
+Almohade
+Almohades
+almoign
+Almon
+almon
+almond
+almondy
+almoner
+almonership
+almonry
+Almoravid
+Almoravide
+Almoravides
+almost
+almous
+alms
+almsdeed
+almsfolk
+almsful
+almsgiver
+almsgiving
+almshouse
+almsman
+almswoman
+almucantar
+almuce
+almud
+almude
+almug
+Almuredin
+almuten
+aln
+alnage
+alnager
+alnagership
+Alnaschar
+Alnascharism
+alnein
+alnico
+Alnilam
+alniresinol
+Alnitak
+Alnitham
+alniviridol
+alnoite
+alnuin
+Alnus
+alo
+Aloadae
+Alocasia
+alochia
+alod
+alodial
+alodialism
+alodialist
+alodiality
+alodially
+alodian
+alodiary
+alodification
+alodium
+alody
+aloe
+aloed
+aloelike
+aloemodin
+aloeroot
+aloesol
+aloeswood
+aloetic
+aloetical
+aloewood
+aloft
+alogia
+Alogian
+alogical
+alogically
+alogism
+alogy
+aloid
+aloin
+Alois
+aloisiite
+aloma
+alomancy
+alone
+aloneness
+along
+alongshore
+alongshoreman
+alongside
+alongst
+Alonso
+Alonsoa
+Alonzo
+aloof
+aloofly
+aloofness
+aloose
+alop
+alopecia
+Alopecias
+alopecist
+alopecoid
+Alopecurus
+alopeke
+Alopias
+Alopiidae
+Alosa
+alose
+Alouatta
+alouatte
+aloud
+alow
+alowe
+Aloxite
+Aloysia
+Aloysius
+alp
+alpaca
+alpasotes
+Alpax
+alpeen
+Alpen
+alpenglow
+alpenhorn
+alpenstock
+alpenstocker
+alpestral
+alpestrian
+alpestrine
+alpha
+alphabet
+alphabetarian
+alphabetic
+alphabetical
+alphabetically
+alphabetics
+alphabetiform
+alphabetism
+alphabetist
+alphabetization
+alphabetize
+alphabetizer
+Alphard
+alphatoluic
+Alphean
+Alphecca
+alphenic
+Alpheratz
+alphitomancy
+alphitomorphous
+alphol
+Alphonist
+Alphonse
+Alphonsine
+Alphonsism
+Alphonso
+alphorn
+alphos
+alphosis
+alphyl
+Alpian
+Alpid
+alpieu
+alpigene
+Alpine
+alpine
+alpinely
+alpinery
+alpinesque
+Alpinia
+Alpiniaceae
+Alpinism
+Alpinist
+alpist
+Alpujarra
+alqueire
+alquier
+alquifou
+alraun
+alreadiness
+already
+alright
+alrighty
+alroot
+alruna
+Alsatia
+Alsatian
+alsbachite
+Alshain
+Alsinaceae
+alsinaceous
+Alsine
+also
+alsoon
+Alsophila
+Alstonia
+alstonidine
+alstonine
+alstonite
+Alstroemeria
+alsweill
+alt
+Altaian
+Altaic
+Altaid
+Altair
+altaite
+Altamira
+altar
+altarage
+altared
+altarist
+altarlet
+altarpiece
+altarwise
+altazimuth
+alter
+alterability
+alterable
+alterableness
+alterably
+alterant
+alterate
+alteration
+alterative
+altercate
+altercation
+altercative
+alteregoism
+alteregoistic
+alterer
+alterity
+altern
+alternacy
+alternance
+alternant
+Alternanthera
+Alternaria
+alternariose
+alternate
+alternately
+alternateness
+alternating
+alternatingly
+alternation
+alternationist
+alternative
+alternatively
+alternativeness
+alternativity
+alternator
+alterne
+alternifoliate
+alternipetalous
+alternipinnate
+alternisepalous
+alternize
+alterocentric
+Althaea
+althaein
+Althea
+althea
+althein
+altheine
+althionic
+altho
+althorn
+although
+Altica
+Alticamelus
+altigraph
+altilik
+altiloquence
+altiloquent
+altimeter
+altimetrical
+altimetrically
+altimetry
+altin
+altincar
+Altingiaceae
+altingiaceous
+altininck
+altiplano
+altiscope
+altisonant
+altisonous
+altissimo
+altitude
+altitudinal
+altitudinarian
+alto
+altogether
+altogetherness
+altometer
+altoun
+altrices
+altricial
+altropathy
+altrose
+altruism
+altruist
+altruistic
+altruistically
+altschin
+altun
+Aluco
+Aluconidae
+Aluconinae
+aludel
+Aludra
+alula
+alular
+alulet
+Alulim
+alum
+alumbloom
+Alumel
+alumic
+alumiferous
+alumina
+aluminaphone
+aluminate
+alumine
+aluminic
+aluminide
+aluminiferous
+aluminiform
+aluminish
+aluminite
+aluminium
+aluminize
+aluminoferric
+aluminographic
+aluminography
+aluminose
+aluminosilicate
+aluminosis
+aluminosity
+aluminothermic
+aluminothermics
+aluminothermy
+aluminotype
+aluminous
+aluminum
+aluminyl
+alumish
+alumite
+alumium
+alumna
+alumnae
+alumnal
+alumni
+alumniate
+Alumnol
+alumnus
+alumohydrocalcite
+alumroot
+Alundum
+aluniferous
+alunite
+alunogen
+alupag
+Alur
+alure
+alurgite
+alushtite
+aluta
+alutaceous
+Alvah
+Alvan
+alvar
+alvearium
+alveary
+alveloz
+alveola
+alveolar
+alveolariform
+alveolary
+alveolate
+alveolated
+alveolation
+alveole
+alveolectomy
+alveoli
+alveoliform
+alveolite
+Alveolites
+alveolitis
+alveoloclasia
+alveolocondylean
+alveolodental
+alveololabial
+alveololingual
+alveolonasal
+alveolosubnasal
+alveolotomy
+alveolus
+alveus
+alviducous
+Alvin
+Alvina
+alvine
+Alvissmal
+alvite
+alvus
+alway
+always
+aly
+Alya
+alycompaine
+alymphia
+alymphopotent
+alypin
+alysson
+Alyssum
+alytarch
+Alytes
+am
+ama
+amaas
+Amabel
+amability
+amacratic
+amacrinal
+amacrine
+amadavat
+amadelphous
+Amadi
+Amadis
+amadou
+Amaethon
+Amafingo
+amaga
+amah
+Amahuaca
+amain
+amaister
+amakebe
+Amakosa
+amala
+amalaita
+amalaka
+Amalfian
+Amalfitan
+amalgam
+amalgamable
+amalgamate
+amalgamation
+amalgamationist
+amalgamative
+amalgamatize
+amalgamator
+amalgamist
+amalgamization
+amalgamize
+Amalings
+Amalrician
+amaltas
+amamau
+Amampondo
+Amanda
+amandin
+Amandus
+amang
+amani
+amania
+Amanist
+Amanita
+amanitin
+amanitine
+Amanitopsis
+amanori
+amanous
+amantillo
+amanuenses
+amanuensis
+amapa
+Amapondo
+amar
+Amara
+Amarantaceae
+amarantaceous
+amaranth
+Amaranthaceae
+amaranthaceous
+amaranthine
+amaranthoid
+Amaranthus
+amarantite
+Amarantus
+amarelle
+amarevole
+amargoso
+amarillo
+amarin
+amarine
+amaritude
+amarity
+amaroid
+amaroidal
+Amarth
+amarthritis
+amaryllid
+Amaryllidaceae
+amaryllidaceous
+amaryllideous
+Amaryllis
+amasesis
+amass
+amassable
+amasser
+amassment
+Amasta
+amasthenic
+amastia
+amasty
+Amatembu
+amaterialistic
+amateur
+amateurish
+amateurishly
+amateurishness
+amateurism
+amateurship
+Amati
+amative
+amatively
+amativeness
+amatol
+amatorial
+amatorially
+amatorian
+amatorious
+amatory
+amatrice
+amatungula
+amaurosis
+amaurotic
+amaze
+amazed
+amazedly
+amazedness
+amazeful
+amazement
+amazia
+Amazilia
+amazing
+amazingly
+Amazon
+Amazona
+Amazonian
+Amazonism
+amazonite
+Amazulu
+amba
+ambage
+ambagiosity
+ambagious
+ambagiously
+ambagiousness
+ambagitory
+ambalam
+amban
+ambar
+ambaree
+ambarella
+ambary
+ambash
+ambassade
+Ambassadeur
+ambassador
+ambassadorial
+ambassadorially
+ambassadorship
+ambassadress
+ambassage
+ambassy
+ambatch
+ambatoarinite
+ambay
+ambeer
+amber
+amberfish
+ambergris
+amberiferous
+amberite
+amberoid
+amberous
+ambery
+ambicolorate
+ambicoloration
+ambidexter
+ambidexterity
+ambidextral
+ambidextrous
+ambidextrously
+ambidextrousness
+ambience
+ambiency
+ambiens
+ambient
+ambier
+ambigenous
+ambiguity
+ambiguous
+ambiguously
+ambiguousness
+ambilateral
+ambilateralaterally
+ambilaterality
+ambilevous
+ambilian
+ambilogy
+ambiopia
+ambiparous
+ambisinister
+ambisinistrous
+ambisporangiate
+ambisyllabic
+ambit
+ambital
+ambitendency
+ambition
+ambitionist
+ambitionless
+ambitionlessly
+ambitious
+ambitiously
+ambitiousness
+ambitty
+ambitus
+ambivalence
+ambivalency
+ambivalent
+ambivert
+amble
+ambler
+ambling
+amblingly
+amblotic
+amblyacousia
+amblyaphia
+Amblycephalidae
+Amblycephalus
+amblychromatic
+Amblydactyla
+amblygeusia
+amblygon
+amblygonal
+amblygonite
+amblyocarpous
+Amblyomma
+amblyope
+amblyopia
+amblyopic
+Amblyopsidae
+Amblyopsis
+amblyoscope
+amblypod
+Amblypoda
+amblypodous
+Amblyrhynchus
+amblystegite
+Amblystoma
+ambo
+amboceptoid
+amboceptor
+Ambocoelia
+Amboina
+Amboinese
+ambomalleal
+ambon
+ambonite
+Ambonnay
+ambos
+ambosexous
+ambosexual
+ambrain
+ambrein
+ambrette
+Ambrica
+ambrite
+ambroid
+ambrology
+Ambrose
+ambrose
+ambrosia
+ambrosiac
+Ambrosiaceae
+ambrosiaceous
+ambrosial
+ambrosially
+Ambrosian
+ambrosian
+ambrosiate
+ambrosin
+ambrosine
+Ambrosio
+ambrosterol
+ambrotype
+ambry
+ambsace
+ambulacral
+ambulacriform
+ambulacrum
+ambulance
+ambulancer
+ambulant
+ambulate
+ambulatio
+ambulation
+ambulative
+ambulator
+Ambulatoria
+ambulatorial
+ambulatorium
+ambulatory
+ambuling
+ambulomancy
+amburbial
+ambury
+ambuscade
+ambuscader
+ambush
+ambusher
+ambushment
+Ambystoma
+Ambystomidae
+amchoor
+ame
+amebiform
+Amedeo
+ameed
+ameen
+Ameiuridae
+Ameiurus
+Ameiva
+Amelanchier
+amelcorn
+Amelia
+amelia
+amelification
+ameliorable
+ameliorableness
+ameliorant
+ameliorate
+amelioration
+ameliorativ
+ameliorative
+ameliorator
+amellus
+ameloblast
+ameloblastic
+amelu
+amelus
+Amen
+amen
+amenability
+amenable
+amenableness
+amenably
+amend
+amendable
+amendableness
+amendatory
+amende
+amender
+amendment
+amends
+amene
+amenia
+Amenism
+Amenite
+amenity
+amenorrhea
+amenorrheal
+amenorrheic
+amenorrhoea
+ament
+amentaceous
+amental
+amentia
+Amentiferae
+amentiferous
+amentiform
+amentulum
+amentum
+amerce
+amerceable
+amercement
+amercer
+amerciament
+America
+American
+Americana
+Americanese
+Americanism
+Americanist
+Americanistic
+Americanitis
+Americanization
+Americanize
+Americanizer
+Americanly
+Americanoid
+Americaward
+Americawards
+americium
+Americomania
+Americophobe
+Amerimnon
+Amerind
+Amerindian
+Amerindic
+amerism
+ameristic
+amesite
+Ametabola
+ametabole
+ametabolia
+ametabolian
+ametabolic
+ametabolism
+ametabolous
+ametaboly
+ametallous
+amethodical
+amethodically
+amethyst
+amethystine
+ametoecious
+ametria
+ametrometer
+ametrope
+ametropia
+ametropic
+ametrous
+Amex
+amgarn
+amhar
+amherstite
+amhran
+Ami
+ami
+Amia
+amiability
+amiable
+amiableness
+amiably
+amianth
+amianthiform
+amianthine
+Amianthium
+amianthoid
+amianthoidal
+amianthus
+amic
+amicability
+amicable
+amicableness
+amicably
+amical
+amice
+amiced
+amicicide
+amicrobic
+amicron
+amicronucleate
+amid
+amidase
+amidate
+amidation
+amide
+amidic
+amidid
+amidide
+amidin
+amidine
+Amidism
+Amidist
+amido
+amidoacetal
+amidoacetic
+amidoacetophenone
+amidoaldehyde
+amidoazo
+amidoazobenzene
+amidoazobenzol
+amidocaffeine
+amidocapric
+amidofluorid
+amidofluoride
+amidogen
+amidoguaiacol
+amidohexose
+amidoketone
+amidol
+amidomyelin
+amidon
+amidophenol
+amidophosphoric
+amidoplast
+amidoplastid
+amidopyrine
+amidosuccinamic
+amidosulphonal
+amidothiazole
+amidoxime
+amidoxy
+amidoxyl
+amidrazone
+amidship
+amidships
+amidst
+amidstream
+amidulin
+Amigo
+Amiidae
+amil
+Amiles
+Amiloun
+amimia
+amimide
+amin
+aminate
+amination
+amine
+amini
+aminic
+aminity
+aminization
+aminize
+amino
+aminoacetal
+aminoacetanilide
+aminoacetic
+aminoacetone
+aminoacetophenetidine
+aminoacetophenone
+aminoacidemia
+aminoaciduria
+aminoanthraquinone
+aminoazobenzene
+aminobarbituric
+aminobenzaldehyde
+aminobenzamide
+aminobenzene
+aminobenzoic
+aminocaproic
+aminodiphenyl
+aminoethionic
+aminoformic
+aminogen
+aminoglutaric
+aminoguanidine
+aminoid
+aminoketone
+aminolipin
+aminolysis
+aminolytic
+aminomalonic
+aminomyelin
+aminophenol
+aminoplast
+aminoplastic
+aminopropionic
+aminopurine
+aminopyrine
+aminoquinoline
+aminosis
+aminosuccinamic
+aminosulphonic
+aminothiophen
+aminovaleric
+aminoxylol
+Aminta
+Amintor
+Amioidei
+Amir
+amir
+Amiranha
+amiray
+amirship
+Amish
+Amishgo
+amiss
+amissibility
+amissible
+amissness
+Amita
+Amitabha
+amitosis
+amitotic
+amitotically
+amity
+amixia
+Amizilis
+amla
+amli
+amlikar
+amlong
+Amma
+amma
+amman
+Ammanite
+ammelide
+ammelin
+ammeline
+ammer
+ammeter
+Ammi
+Ammiaceae
+ammiaceous
+ammine
+amminochloride
+amminolysis
+amminolytic
+ammiolite
+ammo
+Ammobium
+ammochaeta
+ammochryse
+ammocoete
+ammocoetes
+ammocoetid
+Ammocoetidae
+ammocoetiform
+ammocoetoid
+Ammodytes
+Ammodytidae
+ammodytoid
+ammonal
+ammonate
+ammonation
+Ammonea
+ammonia
+ammoniacal
+ammoniacum
+ammoniate
+ammoniation
+ammonic
+ammonical
+ammoniemia
+ammonification
+ammonifier
+ammonify
+ammoniojarosite
+ammonion
+ammonionitrate
+Ammonite
+ammonite
+Ammonites
+Ammonitess
+ammonitic
+ammoniticone
+ammonitiferous
+Ammonitish
+ammonitoid
+Ammonitoidea
+ammonium
+ammoniuria
+ammonization
+ammono
+ammonobasic
+ammonocarbonic
+ammonocarbonous
+ammonoid
+Ammonoidea
+ammonoidean
+ammonolysis
+ammonolytic
+ammonolyze
+Ammophila
+ammophilous
+ammoresinol
+ammotherapy
+ammu
+ammunition
+amnemonic
+amnesia
+amnesic
+amnestic
+amnesty
+amnia
+amniac
+amniatic
+amnic
+Amnigenia
+amnioallantoic
+amniocentesis
+amniochorial
+amnioclepsis
+amniomancy
+amnion
+Amnionata
+amnionate
+amnionic
+amniorrhea
+Amniota
+amniote
+amniotic
+amniotitis
+amniotome
+amober
+amobyr
+amoeba
+amoebae
+Amoebaea
+amoebaean
+amoebaeum
+amoebalike
+amoeban
+amoebian
+amoebiasis
+amoebic
+amoebicide
+amoebid
+Amoebida
+Amoebidae
+amoebiform
+Amoebobacter
+Amoebobacterieae
+amoebocyte
+Amoebogeniae
+amoeboid
+amoeboidism
+amoebous
+amoebula
+amok
+amoke
+amole
+amolilla
+amomal
+Amomales
+Amomis
+amomum
+among
+amongst
+amontillado
+amor
+amorado
+amoraic
+amoraim
+amoral
+amoralism
+amoralist
+amorality
+amoralize
+Amores
+amoret
+amoretto
+Amoreuxia
+amorism
+amorist
+amoristic
+Amorite
+Amoritic
+Amoritish
+amorosity
+amoroso
+amorous
+amorously
+amorousness
+Amorpha
+amorphia
+amorphic
+amorphinism
+amorphism
+Amorphophallus
+amorphophyte
+amorphotae
+amorphous
+amorphously
+amorphousness
+amorphus
+amorphy
+amort
+amortisseur
+amortizable
+amortization
+amortize
+amortizement
+Amorua
+Amos
+Amoskeag
+amotion
+amotus
+amount
+amour
+amourette
+amovability
+amovable
+amove
+Amoy
+Amoyan
+Amoyese
+ampalaya
+ampalea
+ampangabeite
+ampasimenite
+Ampelidaceae
+ampelidaceous
+Ampelidae
+ampelideous
+Ampelis
+ampelite
+ampelitic
+ampelographist
+ampelography
+ampelopsidin
+ampelopsin
+Ampelopsis
+Ampelosicyos
+ampelotherapy
+amper
+amperage
+ampere
+amperemeter
+Amperian
+amperometer
+ampersand
+ampery
+amphanthium
+ampheclexis
+ampherotokous
+ampherotoky
+amphetamine
+amphiarthrodial
+amphiarthrosis
+amphiaster
+amphibalus
+Amphibia
+amphibial
+amphibian
+amphibichnite
+amphibiety
+amphibiological
+amphibiology
+amphibion
+amphibiotic
+Amphibiotica
+amphibious
+amphibiously
+amphibiousness
+amphibium
+amphiblastic
+amphiblastula
+amphiblestritis
+Amphibola
+amphibole
+amphibolia
+amphibolic
+amphiboliferous
+amphiboline
+amphibolite
+amphibolitic
+amphibological
+amphibologically
+amphibologism
+amphibology
+amphibolous
+amphiboly
+amphibrach
+amphibrachic
+amphibryous
+Amphicarpa
+Amphicarpaea
+amphicarpic
+amphicarpium
+amphicarpogenous
+amphicarpous
+amphicentric
+amphichroic
+amphichrom
+amphichromatic
+amphichrome
+amphicoelian
+amphicoelous
+Amphicondyla
+amphicondylous
+amphicrania
+amphicreatinine
+amphicribral
+amphictyon
+amphictyonian
+amphictyonic
+amphictyony
+Amphicyon
+Amphicyonidae
+amphicyrtic
+amphicyrtous
+amphicytula
+amphid
+amphide
+amphidesmous
+amphidetic
+amphidiarthrosis
+amphidiploid
+amphidiploidy
+amphidisc
+Amphidiscophora
+amphidiscophoran
+amphierotic
+amphierotism
+Amphigaea
+amphigam
+Amphigamae
+amphigamous
+amphigastrium
+amphigastrula
+amphigean
+amphigen
+amphigene
+amphigenesis
+amphigenetic
+amphigenous
+amphigenously
+amphigonic
+amphigonium
+amphigonous
+amphigony
+amphigoric
+amphigory
+amphigouri
+amphikaryon
+amphilogism
+amphilogy
+amphimacer
+amphimictic
+amphimictical
+amphimictically
+amphimixis
+amphimorula
+Amphinesian
+Amphineura
+amphineurous
+amphinucleus
+Amphion
+Amphionic
+Amphioxi
+Amphioxidae
+Amphioxides
+Amphioxididae
+amphioxus
+amphipeptone
+amphiphloic
+amphiplatyan
+Amphipleura
+amphiploid
+amphiploidy
+amphipneust
+Amphipneusta
+amphipneustic
+Amphipnous
+amphipod
+Amphipoda
+amphipodal
+amphipodan
+amphipodiform
+amphipodous
+amphiprostylar
+amphiprostyle
+amphiprotic
+amphipyrenin
+Amphirhina
+amphirhinal
+amphirhine
+amphisarca
+amphisbaena
+amphisbaenian
+amphisbaenic
+Amphisbaenidae
+amphisbaenoid
+amphisbaenous
+amphiscians
+amphiscii
+Amphisile
+Amphisilidae
+amphispermous
+amphisporangiate
+amphispore
+Amphistoma
+amphistomatic
+amphistome
+amphistomoid
+amphistomous
+Amphistomum
+amphistylar
+amphistylic
+amphistyly
+amphitene
+amphitheater
+amphitheatered
+amphitheatral
+amphitheatric
+amphitheatrical
+amphitheatrically
+amphithecial
+amphithecium
+amphithect
+amphithyron
+amphitokal
+amphitokous
+amphitoky
+amphitriaene
+amphitrichous
+Amphitrite
+amphitropal
+amphitropous
+Amphitruo
+Amphitryon
+Amphiuma
+Amphiumidae
+amphivasal
+amphivorous
+Amphizoidae
+amphodarch
+amphodelite
+amphodiplopia
+amphogenous
+ampholyte
+amphopeptone
+amphophil
+amphophile
+amphophilic
+amphophilous
+amphora
+amphoral
+amphore
+amphorette
+amphoric
+amphoricity
+amphoriloquy
+amphorophony
+amphorous
+amphoteric
+Amphrysian
+ample
+amplectant
+ampleness
+amplexation
+amplexicaudate
+amplexicaul
+amplexicauline
+amplexifoliate
+amplexus
+ampliate
+ampliation
+ampliative
+amplicative
+amplidyne
+amplification
+amplificative
+amplificator
+amplificatory
+amplifier
+amplify
+amplitude
+amply
+ampollosity
+ampongue
+ampoule
+ampul
+ampulla
+ampullaceous
+ampullar
+Ampullaria
+Ampullariidae
+ampullary
+ampullate
+ampullated
+ampulliform
+ampullitis
+ampullula
+amputate
+amputation
+amputational
+amputative
+amputator
+amputee
+ampyx
+amra
+amreeta
+amrita
+Amritsar
+amsath
+amsel
+Amsonia
+Amsterdamer
+amt
+amtman
+Amuchco
+amuck
+Amueixa
+amuguis
+amula
+amulet
+amuletic
+amulla
+amunam
+amurca
+amurcosity
+amurcous
+Amurru
+amusable
+amuse
+amused
+amusedly
+amusee
+amusement
+amuser
+amusette
+Amusgo
+amusia
+amusing
+amusingly
+amusingness
+amusive
+amusively
+amusiveness
+amutter
+amuyon
+amuyong
+amuze
+amvis
+Amy
+amy
+Amyclaean
+Amyclas
+amyelencephalia
+amyelencephalic
+amyelencephalous
+amyelia
+amyelic
+amyelinic
+amyelonic
+amyelous
+amygdal
+amygdala
+Amygdalaceae
+amygdalaceous
+amygdalase
+amygdalate
+amygdalectomy
+amygdalic
+amygdaliferous
+amygdaliform
+amygdalin
+amygdaline
+amygdalinic
+amygdalitis
+amygdaloid
+amygdaloidal
+amygdalolith
+amygdaloncus
+amygdalopathy
+amygdalothripsis
+amygdalotome
+amygdalotomy
+Amygdalus
+amygdonitrile
+amygdophenin
+amygdule
+amyl
+amylaceous
+amylamine
+amylan
+amylase
+amylate
+amylemia
+amylene
+amylenol
+amylic
+amylidene
+amyliferous
+amylin
+amylo
+amylocellulose
+amyloclastic
+amylocoagulase
+amylodextrin
+amylodyspepsia
+amylogen
+amylogenesis
+amylogenic
+amylohydrolysis
+amylohydrolytic
+amyloid
+amyloidal
+amyloidosis
+amyloleucite
+amylolysis
+amylolytic
+amylom
+amylometer
+amylon
+amylopectin
+amylophagia
+amylophosphate
+amylophosphoric
+amyloplast
+amyloplastic
+amyloplastid
+amylopsin
+amylose
+amylosis
+amylosynthesis
+amylum
+amyluria
+Amynodon
+amynodont
+amyosthenia
+amyosthenic
+amyotaxia
+amyotonia
+amyotrophia
+amyotrophic
+amyotrophy
+amyous
+Amyraldism
+Amyraldist
+Amyridaceae
+amyrin
+Amyris
+amyrol
+amyroot
+Amytal
+amyxorrhea
+amyxorrhoea
+an
+Ana
+ana
+Anabaena
+Anabantidae
+Anabaptism
+Anabaptist
+Anabaptistic
+Anabaptistical
+Anabaptistically
+Anabaptistry
+anabaptize
+Anabas
+anabasine
+anabasis
+anabasse
+anabata
+anabathmos
+anabatic
+anaberoga
+anabibazon
+anabiosis
+anabiotic
+Anablepidae
+Anableps
+anabo
+anabohitsite
+anabolic
+anabolin
+anabolism
+anabolite
+anabolize
+anabong
+anabranch
+anabrosis
+anabrotic
+anacahuita
+anacahuite
+anacalypsis
+anacampsis
+anacamptic
+anacamptically
+anacamptics
+anacamptometer
+anacanth
+anacanthine
+Anacanthini
+anacanthous
+anacara
+anacard
+Anacardiaceae
+anacardiaceous
+anacardic
+Anacardium
+anacatadidymus
+anacatharsis
+anacathartic
+anacephalaeosis
+anacephalize
+Anaces
+Anacharis
+anachorism
+anachromasis
+anachronic
+anachronical
+anachronically
+anachronism
+anachronismatical
+anachronist
+anachronistic
+anachronistical
+anachronistically
+anachronize
+anachronous
+anachronously
+anachueta
+anacid
+anacidity
+anaclasis
+anaclastic
+anaclastics
+Anaclete
+anacleticum
+anaclinal
+anaclisis
+anaclitic
+anacoenosis
+anacoluthia
+anacoluthic
+anacoluthically
+anacoluthon
+anaconda
+Anacreon
+Anacreontic
+Anacreontically
+anacrisis
+Anacrogynae
+anacrogynae
+anacrogynous
+anacromyodian
+anacrotic
+anacrotism
+anacrusis
+anacrustic
+anacrustically
+anaculture
+anacusia
+anacusic
+anacusis
+Anacyclus
+anadem
+anadenia
+anadicrotic
+anadicrotism
+anadidymus
+anadiplosis
+anadipsia
+anadipsic
+anadrom
+anadromous
+Anadyomene
+anaematosis
+anaemia
+anaemic
+anaeretic
+anaerobation
+anaerobe
+anaerobia
+anaerobian
+anaerobic
+anaerobically
+anaerobies
+anaerobion
+anaerobiont
+anaerobiosis
+anaerobiotic
+anaerobiotically
+anaerobious
+anaerobism
+anaerobium
+anaerophyte
+anaeroplastic
+anaeroplasty
+anaesthesia
+anaesthesiant
+anaesthetically
+anaesthetizer
+anaetiological
+anagalactic
+Anagallis
+anagap
+anagenesis
+anagenetic
+anagep
+anagignoskomena
+anaglyph
+anaglyphic
+anaglyphical
+anaglyphics
+anaglyphoscope
+anaglyphy
+anaglyptic
+anaglyptical
+anaglyptics
+anaglyptograph
+anaglyptographic
+anaglyptography
+anaglypton
+anagnorisis
+anagnost
+anagoge
+anagogic
+anagogical
+anagogically
+anagogics
+anagogy
+anagram
+anagrammatic
+anagrammatical
+anagrammatically
+anagrammatism
+anagrammatist
+anagrammatize
+anagrams
+anagraph
+anagua
+anagyrin
+anagyrine
+Anagyris
+anahau
+Anahita
+Anaitis
+Anakes
+anakinesis
+anakinetic
+anakinetomer
+anakinetomeric
+anakoluthia
+anakrousis
+anaktoron
+anal
+analabos
+analav
+analcime
+analcimite
+analcite
+analcitite
+analecta
+analectic
+analects
+analemma
+analemmatic
+analepsis
+analepsy
+analeptic
+analeptical
+analgen
+analgesia
+analgesic
+Analgesidae
+analgesis
+analgesist
+analgetic
+analgia
+analgic
+analgize
+analkalinity
+anallagmatic
+anallantoic
+Anallantoidea
+anallantoidean
+anallergic
+anally
+analogic
+analogical
+analogically
+analogicalness
+analogion
+analogism
+analogist
+analogistic
+analogize
+analogon
+analogous
+analogously
+analogousness
+analogue
+analogy
+analphabet
+analphabete
+analphabetic
+analphabetical
+analphabetism
+analysability
+analysable
+analysand
+analysation
+analyse
+analyser
+analyses
+analysis
+analyst
+analytic
+analytical
+analytically
+analytics
+analyzability
+analyzable
+analyzation
+analyze
+analyzer
+Anam
+anam
+anama
+anamesite
+anametadromous
+Anamirta
+anamirtin
+Anamite
+anamite
+anammonid
+anammonide
+anamnesis
+anamnestic
+anamnestically
+Anamnia
+Anamniata
+Anamnionata
+anamnionic
+Anamniota
+anamniote
+anamniotic
+anamorphic
+anamorphism
+anamorphoscope
+anamorphose
+anamorphosis
+anamorphote
+anamorphous
+anan
+anana
+ananaplas
+ananaples
+ananas
+ananda
+anandrarious
+anandria
+anandrous
+ananepionic
+anangioid
+anangular
+Ananias
+Ananism
+Ananite
+anankastic
+Anansi
+Ananta
+anantherate
+anantherous
+ananthous
+ananym
+anapaest
+anapaestic
+anapaestical
+anapaestically
+anapaganize
+anapaite
+anapanapa
+anapeiratic
+anaphalantiasis
+Anaphalis
+anaphase
+Anaphe
+anaphia
+anaphora
+anaphoral
+anaphoria
+anaphoric
+anaphorical
+anaphrodisia
+anaphrodisiac
+anaphroditic
+anaphroditous
+anaphylactic
+anaphylactin
+anaphylactogen
+anaphylactogenic
+anaphylactoid
+anaphylatoxin
+anaphylaxis
+anaphyte
+anaplasia
+anaplasis
+anaplasm
+Anaplasma
+anaplasmosis
+anaplastic
+anaplasty
+anaplerosis
+anaplerotic
+anapnea
+anapneic
+anapnoeic
+anapnograph
+anapnoic
+anapnometer
+anapodeictic
+anapophysial
+anapophysis
+anapsid
+Anapsida
+anapsidan
+Anapterygota
+anapterygote
+anapterygotism
+anapterygotous
+Anaptomorphidae
+Anaptomorphus
+anaptotic
+anaptychus
+anaptyctic
+anaptyctical
+anaptyxis
+anaqua
+anarcestean
+Anarcestes
+anarch
+anarchal
+anarchial
+anarchic
+anarchical
+anarchically
+anarchism
+anarchist
+anarchistic
+anarchize
+anarchoindividualist
+anarchosocialist
+anarchosyndicalism
+anarchosyndicalist
+anarchy
+anarcotin
+anareta
+anaretic
+anaretical
+anargyros
+anarthria
+anarthric
+anarthropod
+Anarthropoda
+anarthropodous
+anarthrosis
+anarthrous
+anarthrously
+anarthrousness
+anartismos
+anarya
+Anaryan
+Anas
+Anasa
+anasarca
+anasarcous
+Anasazi
+anaschistic
+anaseismic
+Anasitch
+anaspadias
+anaspalin
+Anaspida
+Anaspidacea
+Anaspides
+anastalsis
+anastaltic
+Anastasia
+Anastasian
+anastasimon
+anastasimos
+anastasis
+Anastasius
+anastate
+anastatic
+Anastatica
+Anastatus
+anastigmat
+anastigmatic
+anastomose
+anastomosis
+anastomotic
+Anastomus
+anastrophe
+Anastrophia
+Anat
+anatase
+anatexis
+anathema
+anathematic
+anathematical
+anathematically
+anathematism
+anathematization
+anathematize
+anathematizer
+anatheme
+anathemize
+Anatherum
+Anatidae
+anatifa
+Anatifae
+anatifer
+anatiferous
+Anatinacea
+Anatinae
+anatine
+anatocism
+Anatole
+Anatolian
+Anatolic
+Anatoly
+anatomic
+anatomical
+anatomically
+anatomicobiological
+anatomicochirurgical
+anatomicomedical
+anatomicopathologic
+anatomicopathological
+anatomicophysiologic
+anatomicophysiological
+anatomicosurgical
+anatomism
+anatomist
+anatomization
+anatomize
+anatomizer
+anatomopathologic
+anatomopathological
+anatomy
+anatopism
+anatox
+anatoxin
+anatreptic
+anatripsis
+anatripsology
+anatriptic
+anatron
+anatropal
+anatropia
+anatropous
+Anatum
+anaudia
+anaunter
+anaunters
+Anax
+Anaxagorean
+Anaxagorize
+anaxial
+Anaximandrian
+anaxon
+anaxone
+Anaxonia
+anay
+anazoturia
+anba
+anbury
+Ancerata
+ancestor
+ancestorial
+ancestorially
+ancestral
+ancestrally
+ancestress
+ancestrial
+ancestrian
+ancestry
+Ancha
+Anchat
+Anchietea
+anchietin
+anchietine
+anchieutectic
+anchimonomineral
+Anchisaurus
+Anchises
+Anchistea
+Anchistopoda
+anchithere
+anchitherioid
+anchor
+anchorable
+anchorage
+anchorate
+anchored
+anchorer
+anchoress
+anchoret
+anchoretic
+anchoretical
+anchoretish
+anchoretism
+anchorhold
+anchorite
+anchoritess
+anchoritic
+anchoritical
+anchoritish
+anchoritism
+anchorless
+anchorlike
+anchorwise
+anchovy
+Anchtherium
+Anchusa
+anchusin
+anchusine
+anchylose
+anchylosis
+ancience
+anciency
+ancient
+ancientism
+anciently
+ancientness
+ancientry
+ancienty
+ancile
+ancilla
+ancillary
+ancipital
+ancipitous
+Ancistrocladaceae
+ancistrocladaceous
+Ancistrocladus
+ancistroid
+ancon
+Ancona
+anconad
+anconagra
+anconal
+ancone
+anconeal
+anconeous
+anconeus
+anconitis
+anconoid
+ancony
+ancora
+ancoral
+Ancyloceras
+Ancylocladus
+Ancylodactyla
+ancylopod
+Ancylopoda
+Ancylostoma
+ancylostome
+ancylostomiasis
+Ancylostomum
+Ancylus
+Ancyrean
+Ancyrene
+and
+anda
+andabatarian
+Andalusian
+andalusite
+Andaman
+Andamanese
+andante
+andantino
+Andaqui
+Andaquian
+Andarko
+Andaste
+Ande
+Andean
+Anderson
+Andesic
+andesine
+andesinite
+andesite
+andesitic
+Andevo
+Andhra
+Andi
+Andian
+Andine
+Andira
+andirin
+andirine
+andiroba
+andiron
+Andoke
+andorite
+Andorobo
+Andorran
+andouillet
+andradite
+andranatomy
+andrarchy
+Andre
+Andrea
+Andreaea
+Andreaeaceae
+Andreaeales
+Andreas
+Andrena
+andrenid
+Andrenidae
+Andrew
+andrewsite
+Andria
+Andriana
+Andrias
+andric
+Andries
+androcentric
+androcephalous
+androcephalum
+androclinium
+Androclus
+androconium
+androcracy
+androcratic
+androcyte
+androdioecious
+androdioecism
+androdynamous
+androecial
+androecium
+androgametangium
+androgametophore
+androgen
+androgenesis
+androgenetic
+androgenic
+androgenous
+androginous
+androgone
+androgonia
+androgonial
+androgonidium
+androgonium
+Andrographis
+andrographolide
+androgynal
+androgynary
+androgyne
+androgyneity
+androgynia
+androgynism
+androgynous
+androgynus
+androgyny
+android
+androidal
+androkinin
+androl
+androlepsia
+androlepsy
+Andromache
+andromania
+Andromaque
+Andromeda
+Andromede
+andromedotoxin
+andromonoecious
+andromonoecism
+andromorphous
+andron
+Andronicus
+andronitis
+andropetalar
+andropetalous
+androphagous
+androphobia
+androphonomania
+androphore
+androphorous
+androphorum
+androphyll
+Andropogon
+Androsace
+Androscoggin
+androseme
+androsin
+androsphinx
+androsporangium
+androspore
+androsterone
+androtauric
+androtomy
+Andy
+anear
+aneath
+anecdota
+anecdotage
+anecdotal
+anecdotalism
+anecdote
+anecdotic
+anecdotical
+anecdotically
+anecdotist
+anele
+anelectric
+anelectrode
+anelectrotonic
+anelectrotonus
+anelytrous
+anematosis
+Anemia
+anemia
+anemic
+anemobiagraph
+anemochord
+anemoclastic
+anemogram
+anemograph
+anemographic
+anemographically
+anemography
+anemological
+anemology
+anemometer
+anemometric
+anemometrical
+anemometrically
+anemometrograph
+anemometrographic
+anemometrographically
+anemometry
+anemonal
+anemone
+Anemonella
+anemonin
+anemonol
+anemony
+anemopathy
+anemophile
+anemophilous
+anemophily
+Anemopsis
+anemoscope
+anemosis
+anemotaxis
+anemotropic
+anemotropism
+anencephalia
+anencephalic
+anencephalotrophia
+anencephalous
+anencephalus
+anencephaly
+anend
+anenergia
+anenst
+anent
+anenterous
+anepia
+anepigraphic
+anepigraphous
+anepiploic
+anepithymia
+anerethisia
+aneretic
+anergia
+anergic
+anergy
+anerly
+aneroid
+aneroidograph
+anerotic
+anerythroplasia
+anerythroplastic
+anes
+anesis
+anesthesia
+anesthesiant
+anesthesimeter
+anesthesiologist
+anesthesiology
+anesthesis
+anesthetic
+anesthetically
+anesthetist
+anesthetization
+anesthetize
+anesthetizer
+anesthyl
+anethole
+Anethum
+anetiological
+aneuploid
+aneuploidy
+aneuria
+aneuric
+aneurilemmic
+aneurin
+aneurism
+aneurismally
+aneurysm
+aneurysmal
+aneurysmally
+aneurysmatic
+anew
+Anezeh
+anfractuose
+anfractuosity
+anfractuous
+anfractuousness
+anfracture
+Angami
+Angara
+angaralite
+angaria
+angary
+Angdistis
+angekok
+angel
+Angela
+angelate
+angeldom
+Angeleno
+angelet
+angeleyes
+angelfish
+angelhood
+angelic
+Angelica
+angelica
+Angelical
+angelical
+angelically
+angelicalness
+Angelican
+angelicic
+angelicize
+angelico
+angelin
+Angelina
+angeline
+angelique
+angelize
+angellike
+Angelo
+angelocracy
+angelographer
+angelolater
+angelolatry
+angelologic
+angelological
+angelology
+angelomachy
+Angelonia
+angelophany
+angelot
+angelship
+Angelus
+anger
+angerly
+Angerona
+Angeronalia
+Angers
+Angetenar
+Angevin
+angeyok
+angiasthenia
+angico
+Angie
+angiectasis
+angiectopia
+angiemphraxis
+angiitis
+angild
+angili
+angina
+anginal
+anginiform
+anginoid
+anginose
+anginous
+angioasthenia
+angioataxia
+angioblast
+angioblastic
+angiocarditis
+angiocarp
+angiocarpian
+angiocarpic
+angiocarpous
+angiocavernous
+angiocholecystitis
+angiocholitis
+angiochondroma
+angioclast
+angiocyst
+angiodermatitis
+angiodiascopy
+angioelephantiasis
+angiofibroma
+angiogenesis
+angiogenic
+angiogeny
+angioglioma
+angiograph
+angiography
+angiohyalinosis
+angiohydrotomy
+angiohypertonia
+angiohypotonia
+angioid
+angiokeratoma
+angiokinesis
+angiokinetic
+angioleucitis
+angiolipoma
+angiolith
+angiology
+angiolymphitis
+angiolymphoma
+angioma
+angiomalacia
+angiomatosis
+angiomatous
+angiomegaly
+angiometer
+angiomyocardiac
+angiomyoma
+angiomyosarcoma
+angioneoplasm
+angioneurosis
+angioneurotic
+angionoma
+angionosis
+angioparalysis
+angioparalytic
+angioparesis
+angiopathy
+angiophorous
+angioplany
+angioplasty
+angioplerosis
+angiopoietic
+angiopressure
+angiorrhagia
+angiorrhaphy
+angiorrhea
+angiorrhexis
+angiosarcoma
+angiosclerosis
+angiosclerotic
+angioscope
+angiosis
+angiospasm
+angiospastic
+angiosperm
+Angiospermae
+angiospermal
+angiospermatous
+angiospermic
+angiospermous
+angiosporous
+angiostegnosis
+angiostenosis
+angiosteosis
+angiostomize
+angiostomy
+angiostrophy
+angiosymphysis
+angiotasis
+angiotelectasia
+angiothlipsis
+angiotome
+angiotomy
+angiotonic
+angiotonin
+angiotribe
+angiotripsy
+angiotrophic
+Angka
+anglaise
+angle
+angleberry
+angled
+anglehook
+anglepod
+angler
+Angles
+anglesite
+anglesmith
+angletouch
+angletwitch
+anglewing
+anglewise
+angleworm
+Anglian
+Anglic
+Anglican
+Anglicanism
+Anglicanize
+Anglicanly
+Anglicanum
+Anglicism
+Anglicist
+Anglicization
+anglicization
+Anglicize
+anglicize
+Anglification
+Anglify
+anglimaniac
+angling
+Anglish
+Anglist
+Anglistics
+Anglogaea
+Anglogaean
+angloid
+Angloman
+Anglomane
+Anglomania
+Anglomaniac
+Anglophile
+Anglophobe
+Anglophobia
+Anglophobiac
+Anglophobic
+Anglophobist
+ango
+Angola
+angolar
+Angolese
+angor
+Angora
+angostura
+Angouleme
+Angoumian
+Angraecum
+angrily
+angriness
+angrite
+angry
+angst
+angster
+Angstrom
+angstrom
+anguid
+Anguidae
+anguiform
+Anguilla
+Anguillaria
+Anguillidae
+anguilliform
+anguilloid
+Anguillula
+Anguillulidae
+Anguimorpha
+anguine
+anguineal
+anguineous
+Anguinidae
+anguiped
+Anguis
+anguis
+anguish
+anguished
+anguishful
+anguishous
+anguishously
+angula
+angular
+angulare
+angularity
+angularization
+angularize
+angularly
+angularness
+angulate
+angulated
+angulately
+angulateness
+angulation
+angulatogibbous
+angulatosinuous
+anguliferous
+angulinerved
+Anguloa
+angulodentate
+angulometer
+angulosity
+angulosplenial
+angulous
+anguria
+Angus
+angusticlave
+angustifoliate
+angustifolious
+angustirostrate
+angustisellate
+angustiseptal
+angustiseptate
+angwantibo
+anhalamine
+anhaline
+anhalonine
+Anhalonium
+anhalouidine
+anhang
+Anhanga
+anharmonic
+anhedonia
+anhedral
+anhedron
+anhelation
+anhelous
+anhematosis
+anhemolytic
+anhidrosis
+anhidrotic
+anhima
+Anhimae
+Anhimidae
+anhinga
+anhistic
+anhistous
+anhungered
+anhungry
+anhydrate
+anhydration
+anhydremia
+anhydremic
+anhydric
+anhydride
+anhydridization
+anhydridize
+anhydrite
+anhydrization
+anhydrize
+anhydroglocose
+anhydromyelia
+anhydrous
+anhydroxime
+anhysteretic
+ani
+Aniba
+Anice
+aniconic
+aniconism
+anicular
+anicut
+anidian
+anidiomatic
+anidiomatical
+anidrosis
+Aniellidae
+aniente
+anigh
+anight
+anights
+anil
+anilao
+anilau
+anile
+anileness
+anilic
+anilid
+anilide
+anilidic
+anilidoxime
+aniline
+anilinism
+anilinophile
+anilinophilous
+anility
+anilla
+anilopyrin
+anilopyrine
+anima
+animability
+animable
+animableness
+animadversion
+animadversional
+animadversive
+animadversiveness
+animadvert
+animadverter
+animal
+animalcula
+animalculae
+animalcular
+animalcule
+animalculine
+animalculism
+animalculist
+animalculous
+animalculum
+animalhood
+Animalia
+animalian
+animalic
+animalier
+animalish
+animalism
+animalist
+animalistic
+animality
+Animalivora
+animalivore
+animalivorous
+animalization
+animalize
+animally
+animastic
+animastical
+animate
+animated
+animatedly
+animately
+animateness
+animater
+animating
+animatingly
+animation
+animatism
+animatistic
+animative
+animatograph
+animator
+anime
+animi
+Animikean
+animikite
+animism
+animist
+animistic
+animize
+animosity
+animotheism
+animous
+animus
+anion
+anionic
+aniridia
+anis
+anisal
+anisalcohol
+anisaldehyde
+anisaldoxime
+anisamide
+anisandrous
+anisanilide
+anisate
+anischuria
+anise
+aniseed
+aniseikonia
+aniseikonic
+aniselike
+aniseroot
+anisette
+anisic
+anisidin
+anisidine
+anisil
+anisilic
+anisobranchiate
+anisocarpic
+anisocarpous
+anisocercal
+anisochromatic
+anisochromia
+anisocoria
+anisocotyledonous
+anisocotyly
+anisocratic
+anisocycle
+anisocytosis
+anisodactyl
+Anisodactyla
+Anisodactyli
+anisodactylic
+anisodactylous
+anisodont
+anisogamete
+anisogamous
+anisogamy
+anisogenous
+anisogeny
+anisognathism
+anisognathous
+anisogynous
+anisoin
+anisole
+anisoleucocytosis
+Anisomeles
+anisomelia
+anisomelus
+anisomeric
+anisomerous
+anisometric
+anisometrope
+anisometropia
+anisometropic
+anisomyarian
+Anisomyodi
+anisomyodian
+anisomyodous
+anisopetalous
+anisophyllous
+anisophylly
+anisopia
+anisopleural
+anisopleurous
+anisopod
+Anisopoda
+anisopodal
+anisopodous
+anisopogonous
+Anisoptera
+anisopterous
+anisosepalous
+anisospore
+anisostaminous
+anisostemonous
+anisosthenic
+anisostichous
+Anisostichus
+anisostomous
+anisotonic
+anisotropal
+anisotrope
+anisotropic
+anisotropical
+anisotropically
+anisotropism
+anisotropous
+anisotropy
+anisoyl
+anisum
+anisuria
+anisyl
+anisylidene
+Anita
+anither
+anitrogenous
+anjan
+Anjou
+ankaramite
+ankaratrite
+ankee
+anker
+ankerite
+ankh
+ankle
+anklebone
+anklejack
+anklet
+anklong
+Ankoli
+Ankou
+ankus
+ankusha
+ankylenteron
+ankyloblepharon
+ankylocheilia
+ankylodactylia
+ankylodontia
+ankyloglossia
+ankylomele
+ankylomerism
+ankylophobia
+ankylopodia
+ankylopoietic
+ankyloproctia
+ankylorrhinia
+Ankylosaurus
+ankylose
+ankylosis
+ankylostoma
+ankylotia
+ankylotic
+ankylotome
+ankylotomy
+ankylurethria
+ankyroid
+anlace
+anlaut
+Ann
+ann
+Anna
+anna
+Annabel
+annabergite
+annal
+annale
+annaline
+annalism
+annalist
+annalistic
+annalize
+annals
+Annam
+Annamese
+Annamite
+Annamitic
+Annapurna
+Annard
+annat
+annates
+annatto
+Anne
+anneal
+annealer
+annectent
+annection
+annelid
+Annelida
+annelidan
+Annelides
+annelidian
+annelidous
+annelism
+Annellata
+anneloid
+annerodite
+Anneslia
+annet
+Annette
+annex
+annexa
+annexable
+annexal
+annexation
+annexational
+annexationist
+annexer
+annexion
+annexionist
+annexitis
+annexive
+annexment
+annexure
+annidalin
+Annie
+Anniellidae
+annihilability
+annihilable
+annihilate
+annihilation
+annihilationism
+annihilationist
+annihilative
+annihilator
+annihilatory
+Annist
+annite
+anniversarily
+anniversariness
+anniversary
+anniverse
+annodated
+Annona
+annona
+Annonaceae
+annonaceous
+annotate
+annotater
+annotation
+annotative
+annotator
+annotatory
+annotine
+annotinous
+announce
+announceable
+announcement
+announcer
+annoy
+annoyance
+annoyancer
+annoyer
+annoyful
+annoying
+annoyingly
+annoyingness
+annoyment
+annual
+annualist
+annualize
+annually
+annuary
+annueler
+annuent
+annuitant
+annuity
+annul
+annular
+Annularia
+annularity
+annularly
+annulary
+Annulata
+annulate
+annulated
+annulation
+annulet
+annulettee
+annulism
+annullable
+annullate
+annullation
+annuller
+annulment
+annuloid
+Annuloida
+Annulosa
+annulosan
+annulose
+annulus
+annunciable
+annunciate
+annunciation
+annunciative
+annunciator
+annunciatory
+anoa
+Anobiidae
+anocarpous
+anociassociation
+anococcygeal
+anodal
+anode
+anodendron
+anodic
+anodically
+anodize
+Anodon
+Anodonta
+anodontia
+anodos
+anodyne
+anodynia
+anodynic
+anodynous
+anoegenetic
+anoesia
+anoesis
+anoestrous
+anoestrum
+anoestrus
+anoetic
+anogenic
+anogenital
+Anogra
+anoil
+anoine
+anoint
+anointer
+anointment
+anole
+anoli
+anolian
+Anolis
+Anolympiad
+anolyte
+Anomala
+anomaliflorous
+anomaliped
+anomalism
+anomalist
+anomalistic
+anomalistical
+anomalistically
+anomalocephalus
+anomaloflorous
+Anomalogonatae
+anomalogonatous
+Anomalon
+anomalonomy
+Anomalopteryx
+anomaloscope
+anomalotrophy
+anomalous
+anomalously
+anomalousness
+anomalure
+Anomaluridae
+Anomalurus
+anomaly
+Anomatheca
+Anomia
+Anomiacea
+Anomiidae
+anomite
+anomocarpous
+anomodont
+Anomodontia
+Anomoean
+Anomoeanism
+anomophyllous
+anomorhomboid
+anomorhomboidal
+anomphalous
+Anomura
+anomural
+anomuran
+anomurous
+anomy
+anon
+anonang
+anoncillo
+anonol
+anonychia
+anonym
+anonyma
+anonymity
+anonymous
+anonymously
+anonymousness
+anonymuncule
+anoopsia
+anoperineal
+anophele
+Anopheles
+Anophelinae
+anopheline
+anophoria
+anophthalmia
+anophthalmos
+Anophthalmus
+anophyte
+anopia
+anopisthographic
+Anopla
+Anoplanthus
+anoplocephalic
+anoplonemertean
+Anoplonemertini
+anoplothere
+Anoplotheriidae
+anoplotherioid
+Anoplotherium
+anoplotheroid
+Anoplura
+anopluriform
+anopsia
+anopubic
+anorak
+anorchia
+anorchism
+anorchous
+anorchus
+anorectal
+anorectic
+anorectous
+anorexia
+anorexy
+anorgana
+anorganic
+anorganism
+anorganology
+anormal
+anormality
+anorogenic
+anorth
+anorthic
+anorthite
+anorthitic
+anorthitite
+anorthoclase
+anorthographic
+anorthographical
+anorthographically
+anorthography
+anorthophyre
+anorthopia
+anorthoscope
+anorthose
+anorthosite
+anoscope
+anoscopy
+Anosia
+anosmatic
+anosmia
+anosmic
+anosphrasia
+anosphresia
+anospinal
+anostosis
+Anostraca
+anoterite
+another
+anotherkins
+anotia
+anotropia
+anotta
+anotto
+anotus
+anounou
+Anous
+anovesical
+anoxemia
+anoxemic
+anoxia
+anoxic
+anoxidative
+anoxybiosis
+anoxybiotic
+anoxyscope
+ansa
+ansar
+ansarian
+Ansarie
+ansate
+ansation
+Anseis
+Ansel
+Anselm
+Anselmian
+Anser
+anserated
+Anseres
+Anseriformes
+Anserinae
+anserine
+anserous
+anspessade
+ansu
+ansulate
+answer
+answerability
+answerable
+answerableness
+answerably
+answerer
+answeringly
+answerless
+answerlessly
+ant
+Anta
+anta
+antacid
+antacrid
+antadiform
+Antaean
+Antaeus
+antagonism
+antagonist
+antagonistic
+antagonistical
+antagonistically
+antagonization
+antagonize
+antagonizer
+antagony
+Antaimerina
+Antaios
+Antaiva
+antal
+antalgesic
+antalgol
+antalkali
+antalkaline
+antambulacral
+antanacathartic
+antanaclasis
+Antanandro
+antanemic
+antapex
+antaphrodisiac
+antaphroditic
+antapocha
+antapodosis
+antapology
+antapoplectic
+Antar
+Antara
+antarchism
+antarchist
+antarchistic
+antarchistical
+antarchy
+Antarctalia
+Antarctalian
+antarctic
+Antarctica
+antarctica
+antarctical
+antarctically
+Antarctogaea
+Antarctogaean
+Antares
+antarthritic
+antasphyctic
+antasthenic
+antasthmatic
+antatrophic
+antdom
+ante
+anteact
+anteal
+anteambulate
+anteambulation
+anteater
+antebaptismal
+antebath
+antebrachial
+antebrachium
+antebridal
+antecabinet
+antecaecal
+antecardium
+antecavern
+antecedaneous
+antecedaneously
+antecede
+antecedence
+antecedency
+antecedent
+antecedental
+antecedently
+antecessor
+antechamber
+antechapel
+Antechinomys
+antechoir
+antechurch
+anteclassical
+antecloset
+antecolic
+antecommunion
+anteconsonantal
+antecornu
+antecourt
+antecoxal
+antecubital
+antecurvature
+antedate
+antedawn
+antediluvial
+antediluvially
+antediluvian
+Antedon
+antedonin
+antedorsal
+antefebrile
+antefix
+antefixal
+anteflected
+anteflexed
+anteflexion
+antefurca
+antefurcal
+antefuture
+antegarden
+antegrade
+antehall
+antehistoric
+antehuman
+antehypophysis
+anteinitial
+antejentacular
+antejudiciary
+antejuramentum
+antelabium
+antelegal
+antelocation
+antelope
+antelopian
+antelucan
+antelude
+anteluminary
+antemarginal
+antemarital
+antemedial
+antemeridian
+antemetallic
+antemetic
+antemillennial
+antemingent
+antemortal
+antemundane
+antemural
+antenarial
+antenatal
+antenatalitial
+antenati
+antenave
+antenna
+antennae
+antennal
+Antennaria
+antennariid
+Antennariidae
+Antennarius
+antennary
+Antennata
+antennate
+antenniferous
+antenniform
+antennula
+antennular
+antennulary
+antennule
+antenodal
+antenoon
+Antenor
+antenumber
+anteoccupation
+anteocular
+anteopercle
+anteoperculum
+anteorbital
+antepagmenta
+antepagments
+antepalatal
+antepaschal
+antepast
+antepatriarchal
+antepectoral
+antepectus
+antependium
+antepenult
+antepenultima
+antepenultimate
+antephialtic
+antepileptic
+antepirrhema
+anteporch
+anteportico
+anteposition
+anteposthumous
+anteprandial
+antepredicament
+antepredicamental
+antepreterit
+antepretonic
+anteprohibition
+anteprostate
+anteprostatic
+antepyretic
+antequalm
+antereformation
+antereformational
+anteresurrection
+anterethic
+anterevolutional
+anterevolutionary
+anteriad
+anterior
+anteriority
+anteriorly
+anteriorness
+anteroclusion
+anterodorsal
+anteroexternal
+anterofixation
+anteroflexion
+anterofrontal
+anterograde
+anteroinferior
+anterointerior
+anterointernal
+anterolateral
+anterolaterally
+anteromedial
+anteromedian
+anteroom
+anteroparietal
+anteroposterior
+anteroposteriorly
+anteropygal
+anterospinal
+anterosuperior
+anteroventral
+anteroventrally
+antes
+antescript
+antesignanus
+antespring
+antestature
+antesternal
+antesternum
+antesunrise
+antesuperior
+antetemple
+antetype
+Anteva
+antevenient
+anteversion
+antevert
+antevocalic
+antewar
+anthecological
+anthecologist
+anthecology
+Antheia
+anthela
+anthelion
+anthelmintic
+anthem
+anthema
+anthemene
+anthemia
+Anthemideae
+anthemion
+Anthemis
+anthemwise
+anthemy
+anther
+Antheraea
+antheral
+Anthericum
+antherid
+antheridial
+antheridiophore
+antheridium
+antheriferous
+antheriform
+antherless
+antherogenous
+antheroid
+antherozoid
+antherozoidal
+antherozooid
+antherozooidal
+anthesis
+Anthesteria
+Anthesteriac
+anthesterin
+Anthesterion
+anthesterol
+antheximeter
+Anthicidae
+Anthidium
+anthill
+Anthinae
+anthine
+anthobiology
+anthocarp
+anthocarpous
+anthocephalous
+Anthoceros
+Anthocerotaceae
+Anthocerotales
+anthocerote
+anthochlor
+anthochlorine
+anthoclinium
+anthocyan
+anthocyanidin
+anthocyanin
+anthodium
+anthoecological
+anthoecologist
+anthoecology
+anthogenesis
+anthogenetic
+anthogenous
+anthography
+anthoid
+anthokyan
+antholite
+anthological
+anthologically
+anthologion
+anthologist
+anthologize
+anthology
+antholysis
+Antholyza
+anthomania
+anthomaniac
+Anthomedusae
+anthomedusan
+Anthomyia
+anthomyiid
+Anthomyiidae
+Anthonin
+Anthonomus
+Anthony
+anthood
+anthophagous
+Anthophila
+anthophile
+anthophilian
+anthophilous
+anthophobia
+Anthophora
+anthophore
+Anthophoridae
+anthophorous
+anthophyllite
+anthophyllitic
+Anthophyta
+anthophyte
+anthorine
+anthosiderite
+Anthospermum
+anthotaxis
+anthotaxy
+anthotropic
+anthotropism
+anthoxanthin
+Anthoxanthum
+Anthozoa
+anthozoan
+anthozoic
+anthozooid
+anthozoon
+anthracemia
+anthracene
+anthraceniferous
+anthrachrysone
+anthracia
+anthracic
+anthraciferous
+anthracin
+anthracite
+anthracitic
+anthracitiferous
+anthracitious
+anthracitism
+anthracitization
+anthracnose
+anthracnosis
+anthracocide
+anthracoid
+anthracolithic
+anthracomancy
+Anthracomarti
+anthracomartian
+Anthracomartus
+anthracometer
+anthracometric
+anthraconecrosis
+anthraconite
+Anthracosaurus
+anthracosis
+anthracothere
+Anthracotheriidae
+Anthracotherium
+anthracotic
+anthracyl
+anthradiol
+anthradiquinone
+anthraflavic
+anthragallol
+anthrahydroquinone
+anthramine
+anthranil
+anthranilate
+anthranilic
+anthranol
+anthranone
+anthranoyl
+anthranyl
+anthraphenone
+anthrapurpurin
+anthrapyridine
+anthraquinol
+anthraquinone
+anthraquinonyl
+anthrarufin
+anthratetrol
+anthrathiophene
+anthratriol
+anthrax
+anthraxolite
+anthraxylon
+Anthrenus
+anthribid
+Anthribidae
+Anthriscus
+anthrohopobiological
+anthroic
+anthrol
+anthrone
+anthropic
+anthropical
+Anthropidae
+anthropobiologist
+anthropobiology
+anthropocentric
+anthropocentrism
+anthropoclimatologist
+anthropoclimatology
+anthropocosmic
+anthropodeoxycholic
+Anthropodus
+anthropogenesis
+anthropogenetic
+anthropogenic
+anthropogenist
+anthropogenous
+anthropogeny
+anthropogeographer
+anthropogeographical
+anthropogeography
+anthropoglot
+anthropogony
+anthropography
+anthropoid
+anthropoidal
+Anthropoidea
+anthropoidean
+anthropolater
+anthropolatric
+anthropolatry
+anthropolite
+anthropolithic
+anthropolitic
+anthropological
+anthropologically
+anthropologist
+anthropology
+anthropomancy
+anthropomantic
+anthropomantist
+anthropometer
+anthropometric
+anthropometrical
+anthropometrically
+anthropometrist
+anthropometry
+anthropomorph
+Anthropomorpha
+anthropomorphic
+anthropomorphical
+anthropomorphically
+Anthropomorphidae
+anthropomorphism
+anthropomorphist
+anthropomorphite
+anthropomorphitic
+anthropomorphitical
+anthropomorphitism
+anthropomorphization
+anthropomorphize
+anthropomorphological
+anthropomorphologically
+anthropomorphology
+anthropomorphosis
+anthropomorphotheist
+anthropomorphous
+anthropomorphously
+anthroponomical
+anthroponomics
+anthroponomist
+anthroponomy
+anthropopathia
+anthropopathic
+anthropopathically
+anthropopathism
+anthropopathite
+anthropopathy
+anthropophagi
+anthropophagic
+anthropophagical
+anthropophaginian
+anthropophagism
+anthropophagist
+anthropophagistic
+anthropophagite
+anthropophagize
+anthropophagous
+anthropophagously
+anthropophagy
+anthropophilous
+anthropophobia
+anthropophuism
+anthropophuistic
+anthropophysiography
+anthropophysite
+Anthropopithecus
+anthropopsychic
+anthropopsychism
+Anthropos
+anthroposcopy
+anthroposociologist
+anthroposociology
+anthroposomatology
+anthroposophical
+anthroposophist
+anthroposophy
+anthropoteleoclogy
+anthropoteleological
+anthropotheism
+anthropotomical
+anthropotomist
+anthropotomy
+anthropotoxin
+Anthropozoic
+anthropurgic
+anthroropolith
+anthroxan
+anthroxanic
+anthryl
+anthrylene
+Anthurium
+Anthus
+Anthyllis
+anthypophora
+anthypophoretic
+Anti
+anti
+antiabolitionist
+antiabrasion
+antiabrin
+antiabsolutist
+antiacid
+antiadiaphorist
+antiaditis
+antiadministration
+antiae
+antiaesthetic
+antiager
+antiagglutinating
+antiagglutinin
+antiaggression
+antiaggressionist
+antiaggressive
+antiaircraft
+antialbumid
+antialbumin
+antialbumose
+antialcoholic
+antialcoholism
+antialcoholist
+antialdoxime
+antialexin
+antialien
+antiamboceptor
+antiamusement
+antiamylase
+antianaphylactogen
+antianaphylaxis
+antianarchic
+antianarchist
+antiangular
+antiannexation
+antiannexationist
+antianopheline
+antianthrax
+antianthropocentric
+antianthropomorphism
+antiantibody
+antiantidote
+antiantienzyme
+antiantitoxin
+antiaphrodisiac
+antiaphthic
+antiapoplectic
+antiapostle
+antiaquatic
+antiar
+Antiarcha
+Antiarchi
+antiarin
+Antiaris
+antiaristocrat
+antiarthritic
+antiascetic
+antiasthmatic
+antiastronomical
+antiatheism
+antiatheist
+antiatonement
+antiattrition
+antiautolysin
+antibacchic
+antibacchius
+antibacterial
+antibacteriolytic
+antiballooner
+antibalm
+antibank
+antibasilican
+antibenzaldoxime
+antiberiberin
+antibibliolatry
+antibigotry
+antibilious
+antibiont
+antibiosis
+antibiotic
+antibishop
+antiblastic
+antiblennorrhagic
+antiblock
+antiblue
+antibody
+antiboxing
+antibreakage
+antibridal
+antibromic
+antibubonic
+Antiburgher
+antic
+anticachectic
+antical
+anticalcimine
+anticalculous
+anticalligraphic
+anticancer
+anticapital
+anticapitalism
+anticapitalist
+anticardiac
+anticardium
+anticarious
+anticarnivorous
+anticaste
+anticatalase
+anticatalyst
+anticatalytic
+anticatalyzer
+anticatarrhal
+anticathexis
+anticathode
+anticaustic
+anticensorship
+anticentralization
+anticephalalgic
+anticeremonial
+anticeremonialism
+anticeremonialist
+anticheater
+antichlor
+antichlorine
+antichloristic
+antichlorotic
+anticholagogue
+anticholinergic
+antichoromanic
+antichorus
+antichresis
+antichretic
+antichrist
+antichristian
+antichristianity
+antichristianly
+antichrome
+antichronical
+antichronically
+antichthon
+antichurch
+antichurchian
+antichymosin
+anticipant
+anticipatable
+anticipate
+anticipation
+anticipative
+anticipatively
+anticipator
+anticipatorily
+anticipatory
+anticivic
+anticivism
+anticize
+anticker
+anticlactic
+anticlassical
+anticlassicist
+Anticlea
+anticlergy
+anticlerical
+anticlericalism
+anticlimactic
+anticlimax
+anticlinal
+anticline
+anticlinorium
+anticlockwise
+anticlogging
+anticly
+anticnemion
+anticness
+anticoagulant
+anticoagulating
+anticoagulative
+anticoagulin
+anticogitative
+anticolic
+anticombination
+anticomet
+anticomment
+anticommercial
+anticommunist
+anticomplement
+anticomplementary
+anticomplex
+anticonceptionist
+anticonductor
+anticonfederationist
+anticonformist
+anticonscience
+anticonscription
+anticonscriptive
+anticonstitutional
+anticonstitutionalist
+anticonstitutionally
+anticontagion
+anticontagionist
+anticontagious
+anticonventional
+anticonventionalism
+anticonvulsive
+anticor
+anticorn
+anticorrosion
+anticorrosive
+anticorset
+anticosine
+anticosmetic
+anticouncil
+anticourt
+anticourtier
+anticous
+anticovenanter
+anticovenanting
+anticreation
+anticreative
+anticreator
+anticreep
+anticreeper
+anticreeping
+anticrepuscular
+anticrepuscule
+anticrisis
+anticritic
+anticritique
+anticrochet
+anticrotalic
+anticryptic
+anticum
+anticyclic
+anticyclone
+anticyclonic
+anticyclonically
+anticynic
+anticytolysin
+anticytotoxin
+antidactyl
+antidancing
+antidecalogue
+antideflation
+antidemocrat
+antidemocratic
+antidemocratical
+antidemoniac
+antidetonant
+antidetonating
+antidiabetic
+antidiastase
+Antidicomarian
+Antidicomarianite
+antidictionary
+antidiffuser
+antidinic
+antidiphtheria
+antidiphtheric
+antidiphtherin
+antidiphtheritic
+antidisciplinarian
+antidivine
+antidivorce
+antidogmatic
+antidomestic
+antidominican
+Antidorcas
+antidoron
+antidotal
+antidotally
+antidotary
+antidote
+antidotical
+antidotically
+antidotism
+antidraft
+antidrag
+antidromal
+antidromic
+antidromically
+antidromous
+antidromy
+antidrug
+antiduke
+antidumping
+antidynamic
+antidynastic
+antidyscratic
+antidysenteric
+antidysuric
+antiecclesiastic
+antiecclesiastical
+antiedemic
+antieducation
+antieducational
+antiegotism
+antiejaculation
+antiemetic
+antiemperor
+antiempirical
+antiendotoxin
+antiendowment
+antienergistic
+antienthusiastic
+antienzyme
+antienzymic
+antiepicenter
+antiepileptic
+antiepiscopal
+antiepiscopist
+antiepithelial
+antierosion
+antierysipelas
+Antietam
+antiethnic
+antieugenic
+antievangelical
+antievolution
+antievolutionist
+antiexpansionist
+antiexporting
+antiextreme
+antieyestrain
+antiface
+antifaction
+antifame
+antifanatic
+antifat
+antifatigue
+antifebrile
+antifederal
+antifederalism
+antifederalist
+antifelon
+antifelony
+antifeminism
+antifeminist
+antiferment
+antifermentative
+antifertilizer
+antifeudal
+antifeudalism
+antifibrinolysin
+antifibrinolysis
+antifideism
+antifire
+antiflash
+antiflattering
+antiflatulent
+antiflux
+antifoam
+antifoaming
+antifogmatic
+antiforeign
+antiforeignism
+antiformin
+antifouler
+antifouling
+antifowl
+antifreeze
+antifreezing
+antifriction
+antifrictional
+antifrost
+antifundamentalist
+antifungin
+antigalactagogue
+antigalactic
+antigambling
+antiganting
+antigen
+antigenic
+antigenicity
+antighostism
+antigigmanic
+antiglare
+antiglyoxalase
+antigod
+Antigone
+antigonococcic
+Antigonon
+antigonorrheic
+Antigonus
+antigorite
+antigovernment
+antigraft
+antigrammatical
+antigraph
+antigravitate
+antigravitational
+antigropelos
+antigrowth
+Antiguan
+antiguggler
+antigyrous
+antihalation
+antiharmonist
+antihectic
+antihelix
+antihelminthic
+antihemagglutinin
+antihemisphere
+antihemoglobin
+antihemolysin
+antihemolytic
+antihemorrhagic
+antihemorrheidal
+antihero
+antiheroic
+antiheroism
+antiheterolysin
+antihidrotic
+antihierarchical
+antihierarchist
+antihistamine
+antihistaminic
+antiholiday
+antihormone
+antihuff
+antihum
+antihuman
+antihumbuggist
+antihunting
+antihydrophobic
+antihydropic
+antihydropin
+antihygienic
+antihylist
+antihypnotic
+antihypochondriac
+antihypophora
+antihysteric
+Antikamnia
+antikathode
+antikenotoxin
+antiketogen
+antiketogenesis
+antiketogenic
+antikinase
+antiking
+antiknock
+antilabor
+antilaborist
+antilacrosse
+antilacrosser
+antilactase
+antilapsarian
+antileague
+antilegalist
+antilegomena
+antilemic
+antilens
+antilepsis
+antileptic
+antilethargic
+antileveling
+Antilia
+antiliberal
+antilibration
+antilift
+antilipase
+antilipoid
+antiliquor
+antilithic
+antiliturgical
+antiliturgist
+Antillean
+antilobium
+Antilocapra
+Antilocapridae
+Antilochus
+antiloemic
+antilogarithm
+antilogic
+antilogical
+antilogism
+antilogous
+antilogy
+antiloimic
+Antilope
+Antilopinae
+antilottery
+antiluetin
+antilynching
+antilysin
+antilysis
+antilyssic
+antilytic
+antimacassar
+antimachine
+antimachinery
+antimagistratical
+antimalaria
+antimalarial
+antimallein
+antimaniac
+antimaniacal
+Antimarian
+antimark
+antimartyr
+antimask
+antimasker
+Antimason
+Antimasonic
+Antimasonry
+antimasque
+antimasquer
+antimasquerade
+antimaterialist
+antimaterialistic
+antimatrimonial
+antimatrimonialist
+antimedical
+antimedieval
+antimelancholic
+antimellin
+antimeningococcic
+antimension
+antimensium
+antimephitic
+antimere
+antimerger
+antimeric
+Antimerina
+antimerism
+antimeristem
+antimetabole
+antimetathesis
+antimetathetic
+antimeter
+antimethod
+antimetrical
+antimetropia
+antimetropic
+antimiasmatic
+antimicrobic
+antimilitarism
+antimilitarist
+antimilitary
+antiministerial
+antiministerialist
+antiminsion
+antimiscegenation
+antimission
+antimissionary
+antimissioner
+antimixing
+antimnemonic
+antimodel
+antimodern
+antimonarchial
+antimonarchic
+antimonarchical
+antimonarchically
+antimonarchicalness
+antimonarchist
+antimonate
+antimonial
+antimoniate
+antimoniated
+antimonic
+antimonid
+antimonide
+antimoniferous
+antimonious
+antimonite
+antimonium
+antimoniuret
+antimoniureted
+antimoniuretted
+antimonopolist
+antimonopoly
+antimonsoon
+antimony
+antimonyl
+antimoral
+antimoralism
+antimoralist
+antimosquito
+antimusical
+antimycotic
+antimythic
+antimythical
+antinarcotic
+antinarrative
+antinational
+antinationalist
+antinationalistic
+antinatural
+antinegro
+antinegroism
+antineologian
+antinephritic
+antinepotic
+antineuralgic
+antineuritic
+antineurotoxin
+antineutral
+antinial
+antinicotine
+antinion
+antinode
+antinoise
+antinome
+antinomian
+antinomianism
+antinomic
+antinomical
+antinomist
+antinomy
+antinormal
+antinosarian
+Antinous
+Antiochene
+Antiochian
+Antiochianism
+antiodont
+antiodontalgic
+Antiope
+antiopelmous
+antiophthalmic
+antiopium
+antiopiumist
+antiopiumite
+antioptimist
+antioptionist
+antiorgastic
+antiorthodox
+antioxidant
+antioxidase
+antioxidizer
+antioxidizing
+antioxygen
+antioxygenation
+antioxygenator
+antioxygenic
+antipacifist
+antipapacy
+antipapal
+antipapalist
+antipapism
+antipapist
+antipapistical
+antiparabema
+antiparagraphe
+antiparagraphic
+antiparallel
+antiparallelogram
+antiparalytic
+antiparalytical
+antiparasitic
+antiparastatitis
+antiparliament
+antiparliamental
+antiparliamentarist
+antiparliamentary
+antipart
+Antipasch
+Antipascha
+antipass
+antipastic
+Antipatharia
+antipatharian
+antipathetic
+antipathetical
+antipathetically
+antipatheticalness
+antipathic
+Antipathida
+antipathist
+antipathize
+antipathogen
+antipathy
+antipatriarch
+antipatriarchal
+antipatriot
+antipatriotic
+antipatriotism
+antipedal
+Antipedobaptism
+Antipedobaptist
+antipeduncular
+antipellagric
+antipepsin
+antipeptone
+antiperiodic
+antiperistalsis
+antiperistaltic
+antiperistasis
+antiperistatic
+antiperistatical
+antiperistatically
+antipersonnel
+antiperthite
+antipestilential
+antipetalous
+antipewism
+antiphagocytic
+antipharisaic
+antipharmic
+antiphase
+antiphilosophic
+antiphilosophical
+antiphlogistian
+antiphlogistic
+antiphon
+antiphonal
+antiphonally
+antiphonary
+antiphoner
+antiphonetic
+antiphonic
+antiphonical
+antiphonically
+antiphonon
+antiphony
+antiphrasis
+antiphrastic
+antiphrastical
+antiphrastically
+antiphthisic
+antiphthisical
+antiphylloxeric
+antiphysic
+antiphysical
+antiphysician
+antiplague
+antiplanet
+antiplastic
+antiplatelet
+antipleion
+antiplenist
+antiplethoric
+antipleuritic
+antiplurality
+antipneumococcic
+antipodagric
+antipodagron
+antipodal
+antipode
+antipodean
+antipodes
+antipodic
+antipodism
+antipodist
+antipoetic
+antipoints
+antipolar
+antipole
+antipolemist
+antipolitical
+antipollution
+antipolo
+antipolygamy
+antipolyneuritic
+antipool
+antipooling
+antipope
+antipopery
+antipopular
+antipopulationist
+antiportable
+antiposition
+antipoverty
+antipragmatic
+antipragmatist
+antiprecipitin
+antipredeterminant
+antiprelate
+antiprelatic
+antiprelatist
+antipreparedness
+antiprestidigitation
+antipriest
+antipriestcraft
+antiprime
+antiprimer
+antipriming
+antiprinciple
+antiprism
+antiproductionist
+antiprofiteering
+antiprohibition
+antiprohibitionist
+antiprojectivity
+antiprophet
+antiprostate
+antiprostatic
+antiprotease
+antiproteolysis
+antiprotozoal
+antiprudential
+antipruritic
+antipsalmist
+antipsoric
+antiptosis
+antipudic
+antipuritan
+antiputrefaction
+antiputrefactive
+antiputrescent
+antiputrid
+antipyic
+antipyonin
+antipyresis
+antipyretic
+Antipyrine
+antipyrotic
+antipyryl
+antiqua
+antiquarian
+antiquarianism
+antiquarianize
+antiquarianly
+antiquarism
+antiquartan
+antiquary
+antiquate
+antiquated
+antiquatedness
+antiquation
+antique
+antiquely
+antiqueness
+antiquer
+antiquing
+antiquist
+antiquitarian
+antiquity
+antirabic
+antirabies
+antiracemate
+antiracer
+antirachitic
+antirachitically
+antiracing
+antiradiating
+antiradiation
+antiradical
+antirailwayist
+antirational
+antirationalism
+antirationalist
+antirationalistic
+antirattler
+antireactive
+antirealism
+antirealistic
+antirebating
+antirecruiting
+antired
+antireducer
+antireform
+antireformer
+antireforming
+antireformist
+antireligion
+antireligious
+antiremonstrant
+antirennet
+antirennin
+antirent
+antirenter
+antirentism
+antirepublican
+antireservationist
+antirestoration
+antireticular
+antirevisionist
+antirevolutionary
+antirevolutionist
+antirheumatic
+antiricin
+antirickets
+antiritual
+antiritualistic
+antirobin
+antiromance
+antiromantic
+antiromanticism
+antiroyal
+antiroyalist
+Antirrhinum
+antirumor
+antirun
+antirust
+antisacerdotal
+antisacerdotalist
+antisaloon
+antisalooner
+antisavage
+antiscabious
+antiscale
+antischolastic
+antischool
+antiscians
+antiscientific
+antiscion
+antiscolic
+antiscorbutic
+antiscorbutical
+antiscrofulous
+antiseismic
+antiselene
+antisensitizer
+antisensuous
+antisensuousness
+antisepalous
+antisepsin
+antisepsis
+antiseptic
+antiseptical
+antiseptically
+antisepticism
+antisepticist
+antisepticize
+antiseption
+antiseptize
+antiserum
+antishipping
+Antisi
+antisialagogue
+antisialic
+antisiccative
+antisideric
+antisilverite
+antisimoniacal
+antisine
+antisiphon
+antisiphonal
+antiskeptical
+antiskid
+antiskidding
+antislavery
+antislaveryism
+antislickens
+antislip
+antismoking
+antisnapper
+antisocial
+antisocialist
+antisocialistic
+antisocialistically
+antisociality
+antisolar
+antisophist
+antisoporific
+antispace
+antispadix
+antispasis
+antispasmodic
+antispast
+antispastic
+antispectroscopic
+antispermotoxin
+antispiritual
+antispirochetic
+antisplasher
+antisplenetic
+antisplitting
+antispreader
+antispreading
+antisquama
+antisquatting
+antistadholder
+antistadholderian
+antistalling
+antistaphylococcic
+antistate
+antistatism
+antistatist
+antisteapsin
+antisterility
+antistes
+antistimulant
+antistock
+antistreptococcal
+antistreptococcic
+antistreptococcin
+antistreptococcus
+antistrike
+antistrophal
+antistrophe
+antistrophic
+antistrophically
+antistrophize
+antistrophon
+antistrumatic
+antistrumous
+antisubmarine
+antisubstance
+antisudoral
+antisudorific
+antisuffrage
+antisuffragist
+antisun
+antisupernaturalism
+antisupernaturalist
+antisurplician
+antisymmetrical
+antisyndicalism
+antisyndicalist
+antisynod
+antisyphilitic
+antitabetic
+antitabloid
+antitangent
+antitank
+antitarnish
+antitartaric
+antitax
+antiteetotalism
+antitegula
+antitemperance
+antitetanic
+antitetanolysin
+antithalian
+antitheft
+antitheism
+antitheist
+antitheistic
+antitheistical
+antitheistically
+antithenar
+antitheologian
+antitheological
+antithermic
+antithermin
+antitheses
+antithesis
+antithesism
+antithesize
+antithet
+antithetic
+antithetical
+antithetically
+antithetics
+antithrombic
+antithrombin
+antitintinnabularian
+antitobacco
+antitobacconal
+antitobacconist
+antitonic
+antitorpedo
+antitoxic
+antitoxin
+antitrade
+antitrades
+antitraditional
+antitragal
+antitragic
+antitragicus
+antitragus
+antitrismus
+antitrochanter
+antitropal
+antitrope
+antitropic
+antitropical
+antitropous
+antitropy
+antitrust
+antitrypsin
+antitryptic
+antituberculin
+antituberculosis
+antituberculotic
+antituberculous
+antiturnpikeism
+antitwilight
+antitypal
+antitype
+antityphoid
+antitypic
+antitypical
+antitypically
+antitypy
+antityrosinase
+antiunion
+antiunionist
+antiuratic
+antiurease
+antiusurious
+antiutilitarian
+antivaccination
+antivaccinationist
+antivaccinator
+antivaccinist
+antivariolous
+antivenefic
+antivenereal
+antivenin
+antivenom
+antivenomous
+antivermicular
+antivibrating
+antivibrator
+antivibratory
+antivice
+antiviral
+antivirus
+antivitalist
+antivitalistic
+antivitamin
+antivivisection
+antivivisectionist
+antivolition
+antiwar
+antiwarlike
+antiwaste
+antiwedge
+antiweed
+antiwit
+antixerophthalmic
+antizealot
+antizymic
+antizymotic
+antler
+antlered
+antlerite
+antlerless
+antlia
+antliate
+Antlid
+antling
+antluetic
+antodontalgic
+antoeci
+antoecian
+antoecians
+Antoinette
+Anton
+Antonella
+Antonia
+Antonina
+antoninianus
+Antonio
+antonomasia
+antonomastic
+antonomastical
+antonomastically
+antonomasy
+Antony
+antonym
+antonymous
+antonymy
+antorbital
+antproof
+antra
+antral
+antralgia
+antre
+antrectomy
+antrin
+antritis
+antrocele
+antronasal
+antrophore
+antrophose
+antrorse
+antrorsely
+antroscope
+antroscopy
+Antrostomus
+antrotome
+antrotomy
+antrotympanic
+antrotympanitis
+antrum
+antrustion
+antrustionship
+antship
+Antu
+antu
+Antum
+Antwerp
+antwise
+anubing
+Anubis
+anucleate
+anukabiet
+Anukit
+anuloma
+Anura
+anuran
+anuresis
+anuretic
+anuria
+anuric
+anurous
+anury
+anus
+anusim
+anusvara
+anutraminosa
+anvasser
+anvil
+anvilsmith
+anxietude
+anxiety
+anxious
+anxiously
+anxiousness
+any
+anybody
+Anychia
+anyhow
+anyone
+anyplace
+Anystidae
+anything
+anythingarian
+anythingarianism
+anyway
+anyways
+anywhen
+anywhere
+anywhereness
+anywheres
+anywhy
+anywise
+anywither
+Anzac
+Anzanian
+Ao
+aogiri
+Aoife
+aonach
+Aonian
+aorist
+aoristic
+aoristically
+aorta
+aortal
+aortarctia
+aortectasia
+aortectasis
+aortic
+aorticorenal
+aortism
+aortitis
+aortoclasia
+aortoclasis
+aortolith
+aortomalacia
+aortomalaxis
+aortopathy
+aortoptosia
+aortoptosis
+aortorrhaphy
+aortosclerosis
+aortostenosis
+aortotomy
+aosmic
+Aotea
+Aotearoa
+Aotes
+Aotus
+aoudad
+Aouellimiden
+Aoul
+apa
+apabhramsa
+apace
+Apache
+apache
+Apachette
+apachism
+apachite
+apadana
+apagoge
+apagogic
+apagogical
+apagogically
+apaid
+Apalachee
+apalit
+Apama
+apandry
+Apanteles
+Apantesis
+apanthropia
+apanthropy
+apar
+Aparai
+aparaphysate
+aparejo
+Apargia
+aparithmesis
+apart
+apartheid
+aparthrosis
+apartment
+apartmental
+apartness
+apasote
+apastron
+apatan
+Apatela
+apatetic
+apathetic
+apathetical
+apathetically
+apathic
+apathism
+apathist
+apathistical
+apathogenic
+Apathus
+apathy
+apatite
+Apatornis
+Apatosaurus
+Apaturia
+Apayao
+ape
+apeak
+apectomy
+apedom
+apehood
+apeiron
+apelet
+apelike
+apeling
+apellous
+Apemantus
+Apennine
+apenteric
+apepsia
+apepsinia
+apepsy
+apeptic
+aper
+aperch
+aperea
+aperient
+aperiodic
+aperiodically
+aperiodicity
+aperispermic
+aperistalsis
+aperitive
+apert
+apertly
+apertness
+apertometer
+apertural
+aperture
+apertured
+Aperu
+apery
+apesthesia
+apesthetic
+apesthetize
+Apetalae
+apetaloid
+apetalose
+apetalous
+apetalousness
+apetaly
+apex
+apexed
+aphaeresis
+aphaeretic
+aphagia
+aphakia
+aphakial
+aphakic
+Aphanapteryx
+Aphanes
+aphanesite
+Aphaniptera
+aphanipterous
+aphanite
+aphanitic
+aphanitism
+Aphanomyces
+aphanophyre
+aphanozygous
+Apharsathacites
+aphasia
+aphasiac
+aphasic
+Aphelandra
+Aphelenchus
+aphelian
+Aphelinus
+aphelion
+apheliotropic
+apheliotropically
+apheliotropism
+Aphelops
+aphemia
+aphemic
+aphengescope
+aphengoscope
+aphenoscope
+apheresis
+apheretic
+aphesis
+apheta
+aphetic
+aphetically
+aphetism
+aphetize
+aphicidal
+aphicide
+aphid
+aphides
+aphidian
+aphidicide
+aphidicolous
+aphidid
+Aphididae
+Aphidiinae
+aphidious
+Aphidius
+aphidivorous
+aphidolysin
+aphidophagous
+aphidozer
+aphilanthropy
+Aphis
+aphlaston
+aphlebia
+aphlogistic
+aphnology
+aphodal
+aphodian
+Aphodius
+aphodus
+aphonia
+aphonic
+aphonous
+aphony
+aphoria
+aphorism
+aphorismatic
+aphorismer
+aphorismic
+aphorismical
+aphorismos
+aphorist
+aphoristic
+aphoristically
+aphorize
+aphorizer
+Aphoruridae
+aphotic
+aphototactic
+aphototaxis
+aphototropic
+aphototropism
+Aphra
+aphrasia
+aphrite
+aphrizite
+aphrodisia
+aphrodisiac
+aphrodisiacal
+aphrodisian
+Aphrodision
+Aphrodistic
+Aphrodite
+Aphroditeum
+aphroditic
+Aphroditidae
+aphroditous
+aphrolite
+aphronia
+aphrosiderite
+aphtha
+Aphthartodocetae
+Aphthartodocetic
+Aphthartodocetism
+aphthic
+aphthitalite
+aphthoid
+aphthong
+aphthongal
+aphthongia
+aphthous
+aphydrotropic
+aphydrotropism
+aphyllose
+aphyllous
+aphylly
+aphyric
+Apiaca
+Apiaceae
+apiaceous
+Apiales
+apian
+apiarian
+apiarist
+apiary
+apiator
+apicad
+apical
+apically
+apices
+Apician
+apicifixed
+apicilar
+apicillary
+apicitis
+apickaback
+apicoectomy
+apicolysis
+apicula
+apicular
+apiculate
+apiculated
+apiculation
+apicultural
+apiculture
+apiculturist
+apiculus
+Apidae
+apiece
+apieces
+apigenin
+apii
+apiin
+apikoros
+apilary
+Apina
+Apinae
+Apinage
+apinch
+aping
+apinoid
+apio
+Apioceridae
+apioid
+apioidal
+apiole
+apiolin
+apiologist
+apiology
+apionol
+Apios
+apiose
+Apiosoma
+apiphobia
+Apis
+apish
+apishamore
+apishly
+apishness
+apism
+apitong
+apitpat
+Apium
+apivorous
+apjohnite
+aplacental
+Aplacentalia
+Aplacentaria
+Aplacophora
+aplacophoran
+aplacophorous
+aplanat
+aplanatic
+aplanatically
+aplanatism
+Aplanobacter
+aplanogamete
+aplanospore
+aplasia
+aplastic
+Aplectrum
+aplenty
+aplite
+aplitic
+aplobasalt
+aplodiorite
+Aplodontia
+Aplodontiidae
+aplomb
+aplome
+Aplopappus
+aploperistomatous
+aplostemonous
+aplotaxene
+aplotomy
+Apluda
+aplustre
+Aplysia
+apnea
+apneal
+apneic
+apneumatic
+apneumatosis
+Apneumona
+apneumonous
+apneustic
+apoaconitine
+apoatropine
+apobiotic
+apoblast
+apocaffeine
+apocalypse
+apocalypst
+apocalypt
+apocalyptic
+apocalyptical
+apocalyptically
+apocalypticism
+apocalyptism
+apocalyptist
+apocamphoric
+apocarp
+apocarpous
+apocarpy
+apocatastasis
+apocatastatic
+apocatharsis
+apocenter
+apocentric
+apocentricity
+apocha
+apocholic
+apochromat
+apochromatic
+apochromatism
+apocinchonine
+apocodeine
+apocopate
+apocopated
+apocopation
+apocope
+apocopic
+apocrenic
+apocrisiary
+Apocrita
+apocrustic
+apocryph
+Apocrypha
+apocryphal
+apocryphalist
+apocryphally
+apocryphalness
+apocryphate
+apocryphon
+Apocynaceae
+apocynaceous
+apocyneous
+Apocynum
+apod
+Apoda
+apodal
+apodan
+apodeipnon
+apodeixis
+apodema
+apodemal
+apodematal
+apodeme
+Apodes
+Apodia
+apodia
+apodictic
+apodictical
+apodictically
+apodictive
+Apodidae
+apodixis
+apodosis
+apodous
+apodyterium
+apoembryony
+apofenchene
+apogaeic
+apogalacteum
+apogamic
+apogamically
+apogamous
+apogamously
+apogamy
+apogeal
+apogean
+apogee
+apogeic
+apogenous
+apogeny
+apogeotropic
+apogeotropically
+apogeotropism
+Apogon
+Apogonidae
+apograph
+apographal
+apoharmine
+apohyal
+Apoidea
+apoise
+apojove
+apokrea
+apokreos
+apolar
+apolarity
+apolaustic
+apolegamic
+Apolista
+Apolistan
+Apollinarian
+Apollinarianism
+Apolline
+Apollo
+Apollonia
+Apollonian
+Apollonic
+apollonicon
+Apollonistic
+Apolloship
+Apollyon
+apologal
+apologete
+apologetic
+apologetical
+apologetically
+apologetics
+apologia
+apologist
+apologize
+apologizer
+apologue
+apology
+apolousis
+Apolysin
+apolysis
+apolytikion
+apomecometer
+apomecometry
+apometabolic
+apometabolism
+apometabolous
+apometaboly
+apomictic
+apomictical
+apomixis
+apomorphia
+apomorphine
+aponeurology
+aponeurorrhaphy
+aponeurosis
+aponeurositis
+aponeurotic
+aponeurotome
+aponeurotomy
+aponia
+aponic
+Aponogeton
+Aponogetonaceae
+aponogetonaceous
+apoop
+apopenptic
+apopetalous
+apophantic
+apophasis
+apophatic
+Apophis
+apophlegmatic
+apophonia
+apophony
+apophorometer
+apophthegm
+apophthegmatist
+apophyge
+apophylactic
+apophylaxis
+apophyllite
+apophyllous
+apophysary
+apophysate
+apophyseal
+apophysis
+apophysitis
+apoplasmodial
+apoplastogamous
+apoplectic
+apoplectical
+apoplectically
+apoplectiform
+apoplectoid
+apoplex
+apoplexy
+apopyle
+apoquinamine
+apoquinine
+aporetic
+aporetical
+aporhyolite
+aporia
+Aporobranchia
+aporobranchian
+Aporobranchiata
+Aporocactus
+Aporosa
+aporose
+aporphin
+aporphine
+Aporrhaidae
+Aporrhais
+aporrhaoid
+aporrhegma
+aport
+aportoise
+aposafranine
+aposaturn
+aposaturnium
+aposematic
+aposematically
+aposepalous
+aposia
+aposiopesis
+aposiopetic
+apositia
+apositic
+aposoro
+aposporogony
+aposporous
+apospory
+apostasis
+apostasy
+apostate
+apostatic
+apostatical
+apostatically
+apostatism
+apostatize
+apostaxis
+apostemate
+apostematic
+apostemation
+apostematous
+aposteme
+aposteriori
+aposthia
+apostil
+apostle
+apostlehood
+apostleship
+apostolate
+apostoless
+apostoli
+Apostolian
+Apostolic
+apostolic
+apostolical
+apostolically
+apostolicalness
+Apostolici
+apostolicism
+apostolicity
+apostolize
+Apostolos
+apostrophal
+apostrophation
+apostrophe
+apostrophic
+apostrophied
+apostrophize
+apostrophus
+Apotactic
+Apotactici
+apotelesm
+apotelesmatic
+apotelesmatical
+apothecal
+apothecary
+apothecaryship
+apothece
+apothecial
+apothecium
+apothegm
+apothegmatic
+apothegmatical
+apothegmatically
+apothegmatist
+apothegmatize
+apothem
+apotheose
+apotheoses
+apotheosis
+apotheosize
+apothesine
+apothesis
+apotome
+apotracheal
+apotropaic
+apotropaion
+apotropaism
+apotropous
+apoturmeric
+apotype
+apotypic
+apout
+apoxesis
+Apoxyomenos
+apozem
+apozema
+apozemical
+apozymase
+Appalachia
+Appalachian
+appall
+appalling
+appallingly
+appallment
+appalment
+appanage
+appanagist
+apparatus
+apparel
+apparelment
+apparence
+apparency
+apparent
+apparently
+apparentness
+apparition
+apparitional
+apparitor
+appassionata
+appassionato
+appay
+appeal
+appealability
+appealable
+appealer
+appealing
+appealingly
+appealingness
+appear
+appearance
+appearanced
+appearer
+appeasable
+appeasableness
+appeasably
+appease
+appeasement
+appeaser
+appeasing
+appeasingly
+appeasive
+appellability
+appellable
+appellancy
+appellant
+appellate
+appellation
+appellational
+appellative
+appellatived
+appellatively
+appellativeness
+appellatory
+appellee
+appellor
+append
+appendage
+appendaged
+appendalgia
+appendance
+appendancy
+appendant
+appendectomy
+appendical
+appendicalgia
+appendice
+appendicectasis
+appendicectomy
+appendices
+appendicial
+appendicious
+appendicitis
+appendicle
+appendicocaecostomy
+appendicostomy
+appendicular
+Appendicularia
+appendicularian
+Appendiculariidae
+Appendiculata
+appendiculate
+appendiculated
+appenditious
+appendix
+appendorontgenography
+appendotome
+appentice
+apperceive
+apperception
+apperceptionism
+apperceptionist
+apperceptionistic
+apperceptive
+apperceptively
+appercipient
+appersonation
+appertain
+appertainment
+appertinent
+appet
+appete
+appetence
+appetency
+appetent
+appetently
+appetibility
+appetible
+appetibleness
+appetite
+appetition
+appetitional
+appetitious
+appetitive
+appetize
+appetizement
+appetizer
+appetizingly
+appinite
+Appius
+applanate
+applanation
+applaud
+applaudable
+applaudably
+applauder
+applaudingly
+applause
+applausive
+applausively
+apple
+appleberry
+appleblossom
+applecart
+appledrane
+applegrower
+applejack
+applejohn
+applemonger
+applenut
+appleringy
+appleroot
+applesauce
+applewife
+applewoman
+appliable
+appliableness
+appliably
+appliance
+appliant
+applicability
+applicable
+applicableness
+applicably
+applicancy
+applicant
+applicate
+application
+applicative
+applicatively
+applicator
+applicatorily
+applicatory
+applied
+appliedly
+applier
+applique
+applosion
+applosive
+applot
+applotment
+apply
+applyingly
+applyment
+appoggiatura
+appoint
+appointable
+appointe
+appointee
+appointer
+appointive
+appointment
+appointor
+Appomatox
+Appomattoc
+apport
+apportion
+apportionable
+apportioner
+apportionment
+apposability
+apposable
+appose
+apposer
+apposiopestic
+apposite
+appositely
+appositeness
+apposition
+appositional
+appositionally
+appositive
+appositively
+appraisable
+appraisal
+appraise
+appraisement
+appraiser
+appraising
+appraisingly
+appraisive
+appreciable
+appreciably
+appreciant
+appreciate
+appreciatingly
+appreciation
+appreciational
+appreciativ
+appreciative
+appreciatively
+appreciativeness
+appreciator
+appreciatorily
+appreciatory
+appredicate
+apprehend
+apprehender
+apprehendingly
+apprehensibility
+apprehensible
+apprehensibly
+apprehension
+apprehensive
+apprehensively
+apprehensiveness
+apprend
+apprense
+apprentice
+apprenticehood
+apprenticement
+apprenticeship
+appressed
+appressor
+appressorial
+appressorium
+appreteur
+apprise
+apprize
+apprizement
+apprizer
+approach
+approachability
+approachabl
+approachable
+approachableness
+approacher
+approaching
+approachless
+approachment
+approbate
+approbation
+approbative
+approbativeness
+approbator
+approbatory
+approof
+appropinquate
+appropinquation
+appropinquity
+appropre
+appropriable
+appropriate
+appropriately
+appropriateness
+appropriation
+appropriative
+appropriativeness
+appropriator
+approvable
+approvableness
+approval
+approvance
+approve
+approvedly
+approvedness
+approvement
+approver
+approvingly
+approximal
+approximate
+approximately
+approximation
+approximative
+approximatively
+approximativeness
+approximator
+appulse
+appulsion
+appulsive
+appulsively
+appurtenance
+appurtenant
+apractic
+apraxia
+apraxic
+apricate
+aprication
+aprickle
+apricot
+April
+Aprilesque
+Apriline
+Aprilis
+apriori
+apriorism
+apriorist
+aprioristic
+apriority
+Aprocta
+aproctia
+aproctous
+apron
+aproneer
+apronful
+apronless
+apronlike
+apropos
+aprosexia
+aprosopia
+aprosopous
+aproterodont
+apse
+apselaphesia
+apselaphesis
+apsidal
+apsidally
+apsides
+apsidiole
+apsis
+apsychia
+apsychical
+apt
+Aptal
+Aptenodytes
+Aptera
+apteral
+apteran
+apterial
+apterium
+apteroid
+apterous
+Apteryges
+apterygial
+Apterygidae
+Apterygiformes
+Apterygogenea
+Apterygota
+apterygote
+apterygotous
+Apteryx
+Aptian
+Aptiana
+aptitude
+aptitudinal
+aptitudinally
+aptly
+aptness
+aptote
+aptotic
+aptyalia
+aptyalism
+aptychus
+Apulian
+apulmonic
+apulse
+apurpose
+Apus
+apyonin
+apyrene
+apyretic
+apyrexia
+apyrexial
+apyrexy
+apyrotype
+apyrous
+aqua
+aquabelle
+aquabib
+aquacade
+aquacultural
+aquaculture
+aquaemanale
+aquafortist
+aquage
+aquagreen
+aquamarine
+aquameter
+aquaplane
+aquapuncture
+aquarelle
+aquarellist
+aquaria
+aquarial
+Aquarian
+aquarian
+Aquarid
+Aquarii
+aquariist
+aquarium
+Aquarius
+aquarter
+aquascutum
+aquatic
+aquatical
+aquatically
+aquatile
+aquatint
+aquatinta
+aquatinter
+aquation
+aquativeness
+aquatone
+aquavalent
+aquavit
+aqueduct
+aqueoglacial
+aqueoigneous
+aqueomercurial
+aqueous
+aqueously
+aqueousness
+aquicolous
+aquicultural
+aquiculture
+aquiculturist
+aquifer
+aquiferous
+Aquifoliaceae
+aquifoliaceous
+aquiform
+Aquila
+Aquilaria
+aquilawood
+aquilege
+Aquilegia
+Aquilian
+Aquilid
+aquiline
+aquilino
+aquincubital
+aquincubitalism
+Aquinist
+aquintocubital
+aquintocubitalism
+aquiparous
+Aquitanian
+aquiver
+aquo
+aquocapsulitis
+aquocarbonic
+aquocellolitis
+aquopentamminecobaltic
+aquose
+aquosity
+aquotization
+aquotize
+ar
+ara
+Arab
+araba
+araban
+arabana
+Arabella
+arabesque
+arabesquely
+arabesquerie
+Arabian
+Arabianize
+Arabic
+Arabicism
+Arabicize
+Arabidopsis
+arability
+arabin
+arabinic
+arabinose
+arabinosic
+Arabis
+Arabism
+Arabist
+arabit
+arabitol
+arabiyeh
+Arabize
+arable
+Arabophil
+Araby
+araca
+Aracana
+aracanga
+aracari
+Araceae
+araceous
+arachic
+arachidonic
+arachin
+Arachis
+arachnactis
+Arachne
+arachnean
+arachnid
+Arachnida
+arachnidan
+arachnidial
+arachnidism
+arachnidium
+arachnism
+Arachnites
+arachnitis
+arachnoid
+arachnoidal
+Arachnoidea
+arachnoidea
+arachnoidean
+arachnoiditis
+arachnological
+arachnologist
+arachnology
+Arachnomorphae
+arachnophagous
+arachnopia
+arad
+Aradidae
+arado
+araeostyle
+araeosystyle
+Aragallus
+Aragonese
+Aragonian
+aragonite
+araguato
+arain
+Arains
+Arakanese
+arakawaite
+arake
+Arales
+Aralia
+Araliaceae
+araliaceous
+araliad
+Araliaephyllum
+aralie
+Araliophyllum
+aralkyl
+aralkylated
+Aramaean
+Aramaic
+Aramaicize
+Aramaism
+aramayoite
+Aramidae
+aramina
+Araminta
+Aramis
+Aramitess
+Aramu
+Aramus
+Aranea
+Araneae
+araneid
+Araneida
+araneidan
+araneiform
+Araneiformes
+Araneiformia
+aranein
+Araneina
+Araneoidea
+araneologist
+araneology
+araneous
+aranga
+arango
+Aranyaka
+aranzada
+arapahite
+Arapaho
+arapaima
+araphorostic
+arapunga
+Araquaju
+arar
+Arara
+arara
+araracanga
+ararao
+ararauna
+arariba
+araroba
+arati
+aration
+aratory
+Araua
+Arauan
+Araucan
+Araucanian
+Araucano
+Araucaria
+Araucariaceae
+araucarian
+Araucarioxylon
+Araujia
+Arauna
+Arawa
+Arawak
+Arawakan
+Arawakian
+arba
+Arbacia
+arbacin
+arbalest
+arbalester
+arbalestre
+arbalestrier
+arbalist
+arbalister
+arbalo
+Arbela
+arbiter
+arbitrable
+arbitrager
+arbitragist
+arbitral
+arbitrament
+arbitrarily
+arbitrariness
+arbitrary
+arbitrate
+arbitration
+arbitrational
+arbitrationist
+arbitrative
+arbitrator
+arbitratorship
+arbitratrix
+arbitrement
+arbitrer
+arbitress
+arboloco
+arbor
+arboraceous
+arboral
+arborary
+arborator
+arboreal
+arboreally
+arborean
+arbored
+arboreous
+arborescence
+arborescent
+arborescently
+arboresque
+arboret
+arboreta
+arboretum
+arborical
+arboricole
+arboricoline
+arboricolous
+arboricultural
+arboriculture
+arboriculturist
+arboriform
+arborist
+arborization
+arborize
+arboroid
+arborolatry
+arborous
+arborvitae
+arborway
+arbuscle
+arbuscula
+arbuscular
+arbuscule
+arbusterol
+arbustum
+arbutase
+arbute
+arbutean
+arbutin
+arbutinase
+arbutus
+arc
+arca
+Arcacea
+arcade
+Arcadia
+Arcadian
+arcadian
+Arcadianism
+Arcadianly
+Arcadic
+Arcady
+arcana
+arcanal
+arcane
+arcanite
+arcanum
+arcate
+arcature
+Arcella
+Arceuthobium
+arch
+archabomination
+archae
+archaecraniate
+Archaeoceti
+Archaeocyathidae
+Archaeocyathus
+archaeogeology
+archaeographic
+archaeographical
+archaeography
+archaeolatry
+archaeolith
+archaeolithic
+archaeologer
+archaeologian
+archaeologic
+archaeological
+archaeologically
+archaeologist
+archaeology
+Archaeopithecus
+Archaeopteris
+Archaeopterygiformes
+Archaeopteryx
+Archaeornis
+Archaeornithes
+archaeostoma
+Archaeostomata
+archaeostomatous
+archagitator
+archaic
+archaical
+archaically
+archaicism
+archaism
+archaist
+archaistic
+archaize
+archaizer
+archangel
+archangelic
+Archangelica
+archangelical
+archangelship
+archantagonist
+archantiquary
+archapostate
+archapostle
+archarchitect
+archarios
+archartist
+archband
+archbeacon
+archbeadle
+archbishop
+archbishopess
+archbishopric
+archbishopry
+archbotcher
+archboutefeu
+archbuffoon
+archbuilder
+archchampion
+archchaplain
+archcharlatan
+archcheater
+archchemic
+archchief
+archchronicler
+archcity
+archconfraternity
+archconsoler
+archconspirator
+archcorrupter
+archcorsair
+archcount
+archcozener
+archcriminal
+archcritic
+archcrown
+archcupbearer
+archdapifer
+archdapifership
+archdeacon
+archdeaconate
+archdeaconess
+archdeaconry
+archdeaconship
+archdean
+archdeanery
+archdeceiver
+archdefender
+archdemon
+archdepredator
+archdespot
+archdetective
+archdevil
+archdiocesan
+archdiocese
+archdiplomatist
+archdissembler
+archdisturber
+archdivine
+archdogmatist
+archdolt
+archdruid
+archducal
+archduchess
+archduchy
+archduke
+archdukedom
+arche
+archeal
+Archean
+archearl
+archebiosis
+archecclesiastic
+archecentric
+arched
+archegone
+archegonial
+Archegoniata
+Archegoniatae
+archegoniate
+archegoniophore
+archegonium
+archegony
+Archegosaurus
+archeion
+Archelaus
+Archelenis
+archelogy
+Archelon
+archemperor
+Archencephala
+archencephalic
+archenemy
+archengineer
+archenteric
+archenteron
+archeocyte
+Archeozoic
+Archer
+archer
+archeress
+archerfish
+archership
+archery
+arches
+archespore
+archesporial
+archesporium
+archetypal
+archetypally
+archetype
+archetypic
+archetypical
+archetypically
+archetypist
+archeunuch
+archeus
+archexorcist
+archfelon
+archfiend
+archfire
+archflamen
+archflatterer
+archfoe
+archfool
+archform
+archfounder
+archfriend
+archgenethliac
+archgod
+archgomeral
+archgovernor
+archgunner
+archhead
+archheart
+archheresy
+archheretic
+archhost
+archhouse
+archhumbug
+archhypocrisy
+archhypocrite
+Archiannelida
+archiater
+Archibald
+archibenthal
+archibenthic
+archibenthos
+archiblast
+archiblastic
+archiblastoma
+archiblastula
+Archibuteo
+archicantor
+archicarp
+archicerebrum
+Archichlamydeae
+archichlamydeous
+archicleistogamous
+archicleistogamy
+archicoele
+archicontinent
+archicyte
+archicytula
+Archidamus
+Archidiaceae
+archidiaconal
+archidiaconate
+archididascalian
+archididascalos
+Archidiskodon
+Archidium
+archidome
+Archie
+archiepiscopacy
+archiepiscopal
+archiepiscopally
+archiepiscopate
+archiereus
+archigaster
+archigastrula
+archigenesis
+archigonic
+archigonocyte
+archigony
+archiheretical
+archikaryon
+archil
+archilithic
+Archilochian
+archilowe
+archimage
+Archimago
+archimagus
+archimandrite
+Archimedean
+Archimedes
+archimime
+archimorphic
+archimorula
+archimperial
+archimperialism
+archimperialist
+archimperialistic
+archimpressionist
+Archimycetes
+archineuron
+archinfamy
+archinformer
+arching
+archipallial
+archipallium
+archipelagian
+archipelagic
+archipelago
+archipin
+archiplasm
+archiplasmic
+Archiplata
+archiprelatical
+archipresbyter
+archipterygial
+archipterygium
+archisperm
+Archispermae
+archisphere
+archispore
+archistome
+archisupreme
+archisymbolical
+architect
+architective
+architectonic
+Architectonica
+architectonically
+architectonics
+architectress
+architectural
+architecturalist
+architecturally
+architecture
+architecturesque
+Architeuthis
+architis
+architraval
+architrave
+architraved
+architypographer
+archival
+archive
+archivist
+archivolt
+archizoic
+archjockey
+archking
+archknave
+archleader
+archlecher
+archleveler
+archlexicographer
+archliar
+archlute
+archly
+archmachine
+archmagician
+archmagirist
+archmarshal
+archmediocrity
+archmessenger
+archmilitarist
+archmime
+archminister
+archmock
+archmocker
+archmockery
+archmonarch
+archmonarchist
+archmonarchy
+archmugwump
+archmurderer
+archmystagogue
+archness
+archocele
+archocystosyrinx
+archology
+archon
+archonship
+archont
+archontate
+Archontia
+archontic
+archoplasm
+archoplasmic
+archoptoma
+archoptosis
+archorrhagia
+archorrhea
+archostegnosis
+archostenosis
+archosyrinx
+archoverseer
+archpall
+archpapist
+archpastor
+archpatriarch
+archpatron
+archphilosopher
+archphylarch
+archpiece
+archpilferer
+archpillar
+archpirate
+archplagiarist
+archplagiary
+archplayer
+archplotter
+archplunderer
+archplutocrat
+archpoet
+archpolitician
+archpontiff
+archpractice
+archprelate
+archprelatic
+archprelatical
+archpresbyter
+archpresbyterate
+archpresbytery
+archpretender
+archpriest
+archpriesthood
+archpriestship
+archprimate
+archprince
+archprophet
+archprotopope
+archprototype
+archpublican
+archpuritan
+archradical
+archrascal
+archreactionary
+archrebel
+archregent
+archrepresentative
+archrobber
+archrogue
+archruler
+archsacrificator
+archsacrificer
+archsaint
+archsatrap
+archscoundrel
+archseducer
+archsee
+archsewer
+archshepherd
+archsin
+archsnob
+archspirit
+archspy
+archsteward
+archswindler
+archsynagogue
+archtempter
+archthief
+archtraitor
+archtreasurer
+archtreasurership
+archturncoat
+archtyrant
+archurger
+archvagabond
+archvampire
+archvestryman
+archvillain
+archvillainy
+archvisitor
+archwag
+archway
+archwench
+archwise
+archworker
+archworkmaster
+Archy
+archy
+Arcidae
+Arcifera
+arciferous
+arcifinious
+arciform
+arcing
+Arcite
+arcked
+arcking
+arcocentrous
+arcocentrum
+arcograph
+Arcos
+Arctalia
+Arctalian
+Arctamerican
+arctation
+Arctia
+arctian
+arctic
+arctically
+arctician
+arcticize
+arcticward
+arcticwards
+arctiid
+Arctiidae
+Arctisca
+Arctium
+Arctocephalus
+Arctogaea
+Arctogaeal
+Arctogaean
+arctoid
+Arctoidea
+arctoidean
+Arctomys
+Arctos
+Arctosis
+Arctostaphylos
+Arcturia
+Arcturus
+arcual
+arcuale
+arcuate
+arcuated
+arcuately
+arcuation
+arcubalist
+arcubalister
+arcula
+arculite
+ardassine
+Ardea
+Ardeae
+ardeb
+Ardeidae
+Ardelia
+ardella
+ardency
+ardennite
+ardent
+ardently
+ardentness
+Ardhamagadhi
+Ardhanari
+ardish
+Ardisia
+Ardisiaceae
+ardoise
+ardor
+ardri
+ardu
+arduinite
+arduous
+arduously
+arduousness
+ardurous
+are
+area
+areach
+aread
+areal
+areality
+Arean
+arear
+areasoner
+areaway
+Areca
+Arecaceae
+arecaceous
+arecaidin
+arecaidine
+arecain
+arecaine
+Arecales
+arecolidin
+arecolidine
+arecolin
+arecoline
+Arecuna
+ared
+areek
+areel
+arefact
+arefaction
+aregenerative
+aregeneratory
+areito
+arena
+arenaceous
+arenae
+Arenaria
+arenariae
+arenarious
+arenation
+arend
+arendalite
+areng
+Arenga
+Arenicola
+arenicole
+arenicolite
+arenicolous
+Arenig
+arenilitic
+arenoid
+arenose
+arenosity
+arent
+areocentric
+areographer
+areographic
+areographical
+areographically
+areography
+areola
+areolar
+areolate
+areolated
+areolation
+areole
+areolet
+areologic
+areological
+areologically
+areologist
+areology
+areometer
+areometric
+areometrical
+areometry
+Areopagist
+Areopagite
+Areopagitic
+Areopagitica
+Areopagus
+areotectonics
+areroscope
+aretaics
+arete
+Arethusa
+Arethuse
+Aretinian
+arfvedsonite
+argal
+argala
+argali
+argans
+Argante
+Argas
+argasid
+Argasidae
+Argean
+argeers
+argel
+Argemone
+argemony
+argenol
+argent
+argental
+argentamid
+argentamide
+argentamin
+argentamine
+argentate
+argentation
+argenteous
+argenter
+argenteum
+argentic
+argenticyanide
+argentide
+argentiferous
+Argentina
+Argentine
+argentine
+Argentinean
+Argentinian
+Argentinidae
+argentinitrate
+Argentinize
+Argentino
+argention
+argentite
+argentojarosite
+argentol
+argentometric
+argentometrically
+argentometry
+argenton
+argentoproteinum
+argentose
+argentous
+argentum
+Argestes
+arghan
+arghel
+arghool
+Argid
+argil
+argillaceous
+argilliferous
+argillite
+argillitic
+argilloarenaceous
+argillocalcareous
+argillocalcite
+argilloferruginous
+argilloid
+argillomagnesian
+argillous
+arginine
+argininephosphoric
+Argiope
+Argiopidae
+Argiopoidea
+Argive
+Argo
+argo
+Argoan
+argol
+argolet
+Argolian
+Argolic
+Argolid
+argon
+Argonaut
+Argonauta
+Argonautic
+Argonne
+argosy
+argot
+argotic
+Argovian
+arguable
+argue
+arguer
+argufier
+argufy
+Argulus
+argument
+argumental
+argumentation
+argumentatious
+argumentative
+argumentatively
+argumentativeness
+argumentator
+argumentatory
+Argus
+argusfish
+Argusianus
+Arguslike
+argute
+argutely
+arguteness
+Argyle
+Argyll
+Argynnis
+argyranthemous
+argyranthous
+Argyraspides
+argyria
+argyric
+argyrite
+argyrocephalous
+argyrodite
+Argyrol
+Argyroneta
+Argyropelecus
+argyrose
+argyrosis
+Argyrosomus
+argyrythrose
+arhar
+arhat
+arhatship
+Arhauaco
+arhythmic
+aria
+Ariadne
+Arian
+Ariana
+Arianism
+Arianistic
+Arianistical
+Arianize
+Arianizer
+Arianrhod
+aribine
+Arician
+aricine
+arid
+Arided
+aridge
+aridian
+aridity
+aridly
+aridness
+ariegite
+Ariel
+ariel
+arienzo
+Aries
+arietation
+Arietid
+arietinous
+arietta
+aright
+arightly
+arigue
+Ariidae
+Arikara
+aril
+ariled
+arillary
+arillate
+arillated
+arilliform
+arillode
+arillodium
+arilloid
+arillus
+Arimasp
+Arimaspian
+Arimathaean
+Ariocarpus
+Arioi
+Arioian
+Arion
+ariose
+arioso
+ariot
+aripple
+Arisaema
+arisard
+arise
+arisen
+arist
+arista
+Aristarch
+Aristarchian
+aristarchy
+aristate
+Aristeas
+Aristida
+Aristides
+Aristippus
+aristocracy
+aristocrat
+aristocratic
+aristocratical
+aristocratically
+aristocraticalness
+aristocraticism
+aristocraticness
+aristocratism
+aristodemocracy
+aristodemocratical
+aristogenesis
+aristogenetic
+aristogenic
+aristogenics
+Aristol
+Aristolochia
+Aristolochiaceae
+aristolochiaceous
+Aristolochiales
+aristolochin
+aristolochine
+aristological
+aristologist
+aristology
+aristomonarchy
+Aristophanic
+aristorepublicanism
+Aristotelian
+Aristotelianism
+Aristotelic
+Aristotelism
+aristotype
+aristulate
+arite
+arithmetic
+arithmetical
+arithmetically
+arithmetician
+arithmetization
+arithmetize
+arithmic
+arithmocracy
+arithmocratic
+arithmogram
+arithmograph
+arithmography
+arithmomania
+arithmometer
+Arius
+Arivaipa
+Arizona
+Arizonan
+Arizonian
+arizonite
+arjun
+ark
+Arkab
+Arkansan
+Arkansas
+Arkansawyer
+arkansite
+Arkite
+arkite
+arkose
+arkosic
+arksutite
+Arlene
+Arleng
+arles
+Arline
+arm
+armada
+armadilla
+Armadillididae
+Armadillidium
+armadillo
+Armado
+Armageddon
+Armageddonist
+armagnac
+armament
+armamentarium
+armamentary
+armangite
+armariolum
+armarium
+Armata
+Armatoles
+Armatoli
+armature
+armbone
+armchair
+armchaired
+armed
+armeniaceous
+Armenian
+Armenic
+Armenize
+Armenoid
+armer
+Armeria
+Armeriaceae
+armet
+armful
+armgaunt
+armhole
+armhoop
+Armida
+armied
+armiferous
+armiger
+armigeral
+armigerous
+armil
+armilla
+Armillaria
+armillary
+armillate
+armillated
+arming
+Arminian
+Arminianism
+Arminianize
+Arminianizer
+armipotence
+armipotent
+armisonant
+armisonous
+armistice
+armless
+armlet
+armload
+armoire
+armonica
+armor
+Armoracia
+armored
+armorer
+armorial
+Armoric
+Armorican
+Armorician
+armoried
+armorist
+armorproof
+armorwise
+armory
+Armouchiquois
+armozeen
+armpiece
+armpit
+armplate
+armrack
+armrest
+arms
+armscye
+armure
+army
+arn
+arna
+Arnaut
+arnberry
+Arne
+Arneb
+Arnebia
+arnee
+arni
+arnica
+Arnold
+Arnoldist
+Arnoseris
+arnotta
+arnotto
+Arnusian
+arnut
+Aro
+aroar
+aroast
+arock
+aroeira
+aroid
+aroideous
+Aroides
+aroint
+arolium
+arolla
+aroma
+aromacity
+aromadendrin
+aromatic
+aromatically
+aromaticness
+aromatite
+aromatites
+aromatization
+aromatize
+aromatizer
+aromatophor
+aromatophore
+Aronia
+aroon
+Aroras
+Arosaguntacook
+arose
+around
+arousal
+arouse
+arousement
+arouser
+arow
+aroxyl
+arpeggiando
+arpeggiated
+arpeggiation
+arpeggio
+arpeggioed
+arpen
+arpent
+arquerite
+arquifoux
+arracach
+arracacha
+Arracacia
+arrack
+arrah
+arraign
+arraigner
+arraignment
+arrame
+arrange
+arrangeable
+arrangement
+arranger
+arrant
+arrantly
+Arras
+arras
+arrased
+arrasene
+arrastra
+arrastre
+arratel
+arrau
+array
+arrayal
+arrayer
+arrayment
+arrear
+arrearage
+arrect
+arrector
+arrendation
+arrenotokous
+arrenotoky
+arrent
+arrentable
+arrentation
+arreptitious
+arrest
+arrestable
+arrestation
+arrestee
+arrester
+arresting
+arrestingly
+arrestive
+arrestment
+arrestor
+Arretine
+arrhenal
+Arrhenatherum
+arrhenoid
+arrhenotokous
+arrhenotoky
+arrhinia
+arrhizal
+arrhizous
+arrhythmia
+arrhythmic
+arrhythmical
+arrhythmically
+arrhythmous
+arrhythmy
+arriage
+arriba
+arride
+arridge
+arrie
+arriere
+Arriet
+arrimby
+arris
+arrish
+arrisways
+arriswise
+arrival
+arrive
+arriver
+arroba
+arrogance
+arrogancy
+arrogant
+arrogantly
+arrogantness
+arrogate
+arrogatingly
+arrogation
+arrogative
+arrogator
+arrojadite
+arrope
+arrosive
+arrow
+arrowbush
+arrowed
+arrowhead
+arrowheaded
+arrowleaf
+arrowless
+arrowlet
+arrowlike
+arrowplate
+arrowroot
+arrowsmith
+arrowstone
+arrowweed
+arrowwood
+arrowworm
+arrowy
+arroyo
+Arruague
+Arry
+Arryish
+Arsacid
+Arsacidan
+arsanilic
+arse
+arsedine
+arsenal
+arsenate
+arsenation
+arseneted
+arsenetted
+arsenfast
+arsenferratose
+arsenhemol
+arseniasis
+arseniate
+arsenic
+arsenical
+arsenicalism
+arsenicate
+arsenicism
+arsenicize
+arsenicophagy
+arsenide
+arseniferous
+arsenillo
+arseniopleite
+arseniosiderite
+arsenious
+arsenism
+arsenite
+arsenium
+arseniuret
+arseniureted
+arsenization
+arseno
+arsenobenzene
+arsenobenzol
+arsenobismite
+arsenoferratin
+arsenofuran
+arsenohemol
+arsenolite
+arsenophagy
+arsenophen
+arsenophenol
+arsenophenylglycin
+arsenopyrite
+arsenostyracol
+arsenotherapy
+arsenotungstates
+arsenotungstic
+arsenous
+arsenoxide
+arsenyl
+arses
+arsesmart
+arsheen
+arshin
+arshine
+arsine
+arsinic
+arsino
+Arsinoitherium
+arsis
+arsle
+arsmetrik
+arsmetrike
+arsnicker
+arsoite
+arson
+arsonate
+arsonation
+arsonic
+arsonist
+arsonite
+arsonium
+arsono
+arsonvalization
+arsphenamine
+arsyl
+arsylene
+Art
+art
+artaba
+artabe
+artal
+Artamidae
+Artamus
+artar
+artarine
+artcraft
+artefact
+artel
+Artemas
+Artemia
+Artemis
+Artemisia
+artemisic
+artemisin
+Artemision
+Artemisium
+arteriagra
+arterial
+arterialization
+arterialize
+arterially
+arteriarctia
+arteriasis
+arteriectasia
+arteriectasis
+arteriectopia
+arterin
+arterioarctia
+arteriocapillary
+arteriococcygeal
+arteriodialysis
+arteriodiastasis
+arteriofibrosis
+arteriogenesis
+arteriogram
+arteriograph
+arteriography
+arteriole
+arteriolith
+arteriology
+arteriolosclerosis
+arteriomalacia
+arteriometer
+arteriomotor
+arterionecrosis
+arteriopalmus
+arteriopathy
+arteriophlebotomy
+arterioplania
+arterioplasty
+arteriopressor
+arteriorenal
+arteriorrhagia
+arteriorrhaphy
+arteriorrhexis
+arteriosclerosis
+arteriosclerotic
+arteriospasm
+arteriostenosis
+arteriostosis
+arteriostrepsis
+arteriosympathectomy
+arteriotome
+arteriotomy
+arteriotrepsis
+arterious
+arteriovenous
+arterioversion
+arterioverter
+arteritis
+artery
+Artesian
+artesian
+artful
+artfully
+artfulness
+Artgum
+artha
+arthel
+arthemis
+arthragra
+arthral
+arthralgia
+arthralgic
+arthrectomy
+arthredema
+arthrempyesis
+arthresthesia
+arthritic
+arthritical
+arthriticine
+arthritis
+arthritism
+arthrobacterium
+arthrobranch
+arthrobranchia
+arthrocace
+arthrocarcinoma
+arthrocele
+arthrochondritis
+arthroclasia
+arthrocleisis
+arthroclisis
+arthroderm
+arthrodesis
+arthrodia
+arthrodial
+arthrodic
+Arthrodira
+arthrodiran
+arthrodire
+arthrodirous
+Arthrodonteae
+arthrodynia
+arthrodynic
+arthroempyema
+arthroempyesis
+arthroendoscopy
+Arthrogastra
+arthrogastran
+arthrogenous
+arthrography
+arthrogryposis
+arthrolite
+arthrolith
+arthrolithiasis
+arthrology
+arthromeningitis
+arthromere
+arthromeric
+arthrometer
+arthrometry
+arthroncus
+arthroneuralgia
+arthropathic
+arthropathology
+arthropathy
+arthrophlogosis
+arthrophyma
+arthroplastic
+arthroplasty
+arthropleura
+arthropleure
+arthropod
+Arthropoda
+arthropodal
+arthropodan
+arthropodous
+Arthropomata
+arthropomatous
+arthropterous
+arthropyosis
+arthrorheumatism
+arthrorrhagia
+arthrosclerosis
+arthrosia
+arthrosis
+arthrospore
+arthrosporic
+arthrosporous
+arthrosteitis
+arthrosterigma
+arthrostome
+arthrostomy
+Arthrostraca
+arthrosynovitis
+arthrosyrinx
+arthrotome
+arthrotomy
+arthrotrauma
+arthrotropic
+arthrotyphoid
+arthrous
+arthroxerosis
+Arthrozoa
+arthrozoan
+arthrozoic
+Arthur
+Arthurian
+Arthuriana
+artiad
+artichoke
+article
+articled
+articulability
+articulable
+articulacy
+articulant
+articular
+articulare
+articularly
+articulary
+Articulata
+articulate
+articulated
+articulately
+articulateness
+articulation
+articulationist
+articulative
+articulator
+articulatory
+articulite
+articulus
+Artie
+artifact
+artifactitious
+artifice
+artificer
+artificership
+artificial
+artificialism
+artificiality
+artificialize
+artificially
+artificialness
+artiller
+artillerist
+artillery
+artilleryman
+artilleryship
+artiness
+artinite
+Artinskian
+artiodactyl
+Artiodactyla
+artiodactylous
+artiphyllous
+artisan
+artisanship
+artist
+artistdom
+artiste
+artistic
+artistical
+artistically
+artistry
+artless
+artlessly
+artlessness
+artlet
+artlike
+Artocarpaceae
+artocarpad
+artocarpeous
+artocarpous
+Artocarpus
+artolater
+artophagous
+artophorion
+artotype
+artotypy
+Artotyrite
+artware
+arty
+aru
+Aruac
+arui
+aruke
+Arulo
+Arum
+arumin
+Aruncus
+arundiferous
+arundinaceous
+Arundinaria
+arundineous
+Arundo
+Arunta
+arupa
+arusa
+arusha
+arustle
+arval
+arvel
+Arverni
+Arvicola
+arvicole
+Arvicolinae
+arvicoline
+arvicolous
+arviculture
+arx
+ary
+Arya
+Aryan
+Aryanism
+Aryanization
+Aryanize
+aryballoid
+aryballus
+aryepiglottic
+aryl
+arylamine
+arylamino
+arylate
+arytenoid
+arytenoidal
+arzan
+Arzava
+Arzawa
+arzrunite
+arzun
+As
+as
+Asa
+asaddle
+asafetida
+Asahel
+asak
+asale
+asana
+Asaph
+asaphia
+Asaphic
+asaphid
+Asaphidae
+Asaphus
+asaprol
+asarabacca
+Asaraceae
+Asarh
+asarite
+asaron
+asarone
+asarotum
+Asarum
+asbest
+asbestic
+asbestiform
+asbestine
+asbestinize
+asbestoid
+asbestoidal
+asbestos
+asbestosis
+asbestous
+asbestus
+asbolin
+asbolite
+Ascabart
+Ascalabota
+ascan
+Ascanian
+Ascanius
+ascare
+ascariasis
+ascaricidal
+ascaricide
+ascarid
+Ascaridae
+ascarides
+Ascaridia
+ascaridiasis
+ascaridole
+Ascaris
+ascaron
+Ascella
+ascellus
+ascend
+ascendable
+ascendance
+ascendancy
+ascendant
+ascendence
+ascendency
+ascendent
+ascender
+ascendible
+ascending
+ascendingly
+ascension
+ascensional
+ascensionist
+Ascensiontide
+ascensive
+ascent
+ascertain
+ascertainable
+ascertainableness
+ascertainably
+ascertainer
+ascertainment
+ascescency
+ascescent
+ascetic
+ascetical
+ascetically
+asceticism
+Ascetta
+aschaffite
+ascham
+aschistic
+asci
+ascian
+Ascidia
+Ascidiacea
+Ascidiae
+ascidian
+ascidiate
+ascidicolous
+ascidiferous
+ascidiform
+ascidioid
+Ascidioida
+Ascidioidea
+Ascidiozoa
+ascidiozooid
+ascidium
+asciferous
+ascigerous
+ascii
+ascites
+ascitic
+ascitical
+ascititious
+asclent
+Asclepiad
+asclepiad
+Asclepiadaceae
+asclepiadaceous
+Asclepiadae
+Asclepiadean
+asclepiadeous
+Asclepiadic
+Asclepian
+Asclepias
+asclepidin
+asclepidoid
+Asclepieion
+asclepin
+Asclepius
+ascocarp
+ascocarpous
+Ascochyta
+ascogenous
+ascogone
+ascogonial
+ascogonidium
+ascogonium
+ascolichen
+Ascolichenes
+ascoma
+ascomycetal
+ascomycete
+Ascomycetes
+ascomycetous
+ascon
+Ascones
+ascophore
+ascophorous
+Ascophyllum
+ascorbic
+ascospore
+ascosporic
+ascosporous
+Ascot
+ascot
+Ascothoracica
+ascribable
+ascribe
+ascript
+ascription
+ascriptitii
+ascriptitious
+ascriptitius
+ascry
+ascula
+Ascupart
+ascus
+ascyphous
+Ascyrum
+asdic
+ase
+asearch
+asecretory
+aseethe
+aseismatic
+aseismic
+aseismicity
+aseity
+aselgeia
+asellate
+Aselli
+Asellidae
+Aselline
+Asellus
+asem
+asemasia
+asemia
+asepsis
+aseptate
+aseptic
+aseptically
+asepticism
+asepticize
+aseptify
+aseptol
+aseptolin
+asexual
+asexuality
+asexualization
+asexualize
+asexually
+asfetida
+ash
+Asha
+ashake
+ashame
+ashamed
+ashamedly
+ashamedness
+ashamnu
+Ashangos
+Ashantee
+Ashanti
+Asharasi
+ashberry
+ashcake
+ashen
+Asher
+asherah
+Asherites
+ashery
+ashes
+ashet
+ashily
+ashimmer
+ashine
+ashiness
+ashipboard
+Ashir
+ashiver
+Ashkenazic
+Ashkenazim
+ashkoko
+ashlar
+ashlared
+ashlaring
+ashless
+ashling
+Ashluslay
+ashman
+Ashmolean
+Ashochimi
+ashore
+ashpan
+ashpit
+ashplant
+ashraf
+ashrafi
+ashthroat
+Ashur
+ashur
+ashweed
+ashwort
+ashy
+asialia
+Asian
+Asianic
+Asianism
+Asiarch
+Asiarchate
+Asiatic
+Asiatical
+Asiatically
+Asiatican
+Asiaticism
+Asiaticization
+Asiaticize
+Asiatize
+aside
+asidehand
+asideness
+asiderite
+asideu
+asiento
+asilid
+Asilidae
+Asilus
+asimen
+Asimina
+asimmer
+asinego
+asinine
+asininely
+asininity
+asiphonate
+asiphonogama
+asitia
+ask
+askable
+askance
+askant
+askar
+askari
+asker
+askew
+askingly
+askip
+asklent
+Asklepios
+askos
+Askr
+aslant
+aslantwise
+aslaver
+asleep
+aslop
+aslope
+aslumber
+asmack
+asmalte
+asmear
+asmile
+asmoke
+asmolder
+asniffle
+asnort
+asoak
+asocial
+asok
+asoka
+asomatophyte
+asomatous
+asonant
+asonia
+asop
+asor
+asouth
+asp
+aspace
+aspalathus
+Aspalax
+asparagic
+asparagine
+asparaginic
+asparaginous
+asparagus
+asparagyl
+asparkle
+aspartate
+aspartic
+aspartyl
+Aspasia
+Aspatia
+aspect
+aspectable
+aspectant
+aspection
+aspectual
+aspen
+asper
+asperate
+asperation
+aspergation
+asperge
+asperger
+Asperges
+aspergil
+aspergill
+Aspergillaceae
+Aspergillales
+aspergilliform
+aspergillin
+aspergillosis
+aspergillum
+aspergillus
+Asperifoliae
+asperifoliate
+asperifolious
+asperite
+asperity
+aspermatic
+aspermatism
+aspermatous
+aspermia
+aspermic
+aspermous
+asperous
+asperously
+asperse
+aspersed
+asperser
+aspersion
+aspersive
+aspersively
+aspersor
+aspersorium
+aspersory
+Asperugo
+Asperula
+asperuloside
+asperulous
+asphalt
+asphaltene
+asphalter
+asphaltic
+asphaltite
+asphaltum
+aspheterism
+aspheterize
+asphodel
+Asphodelaceae
+Asphodeline
+Asphodelus
+asphyctic
+asphyctous
+asphyxia
+asphyxial
+asphyxiant
+asphyxiate
+asphyxiation
+asphyxiative
+asphyxiator
+asphyxied
+asphyxy
+aspic
+aspiculate
+aspiculous
+aspidate
+aspidiaria
+aspidinol
+Aspidiotus
+Aspidiske
+Aspidistra
+aspidium
+Aspidobranchia
+Aspidobranchiata
+aspidobranchiate
+Aspidocephali
+Aspidochirota
+Aspidoganoidei
+aspidomancy
+Aspidosperma
+aspidospermine
+aspirant
+aspirata
+aspirate
+aspiration
+aspirator
+aspiratory
+aspire
+aspirer
+aspirin
+aspiring
+aspiringly
+aspiringness
+aspish
+asplanchnic
+Asplenieae
+asplenioid
+Asplenium
+asporogenic
+asporogenous
+asporous
+asport
+asportation
+asporulate
+aspout
+asprawl
+aspread
+Aspredinidae
+Aspredo
+aspring
+asprout
+asquare
+asquat
+asqueal
+asquint
+asquirm
+ass
+assacu
+assagai
+assai
+assail
+assailable
+assailableness
+assailant
+assailer
+assailment
+Assam
+Assamese
+Assamites
+assapan
+assapanic
+assarion
+assart
+assary
+assassin
+assassinate
+assassination
+assassinative
+assassinator
+assassinatress
+assassinist
+assate
+assation
+assault
+assaultable
+assaulter
+assaut
+assay
+assayable
+assayer
+assaying
+assbaa
+asse
+assecuration
+assecurator
+assedation
+assegai
+asself
+assemblable
+assemblage
+assemble
+assembler
+assembly
+assemblyman
+assent
+assentaneous
+assentation
+assentatious
+assentator
+assentatorily
+assentatory
+assented
+assenter
+assentient
+assenting
+assentingly
+assentive
+assentiveness
+assentor
+assert
+assertable
+assertative
+asserter
+assertible
+assertion
+assertional
+assertive
+assertively
+assertiveness
+assertor
+assertorial
+assertorially
+assertoric
+assertorical
+assertorically
+assertorily
+assertory
+assertress
+assertrix
+assertum
+assess
+assessable
+assessably
+assessed
+assessee
+assession
+assessionary
+assessment
+assessor
+assessorial
+assessorship
+assessory
+asset
+assets
+assever
+asseverate
+asseveratingly
+asseveration
+asseverative
+asseveratively
+asseveratory
+asshead
+assi
+assibilate
+assibilation
+Assidean
+assident
+assidual
+assidually
+assiduity
+assiduous
+assiduously
+assiduousness
+assientist
+assiento
+assify
+assign
+assignability
+assignable
+assignably
+assignat
+assignation
+assigned
+assignee
+assigneeship
+assigner
+assignment
+assignor
+assilag
+assimilability
+assimilable
+assimilate
+assimilation
+assimilationist
+assimilative
+assimilativeness
+assimilator
+assimilatory
+Assiniboin
+assis
+Assisan
+assise
+assish
+assishly
+assishness
+assist
+assistance
+assistant
+assistanted
+assistantship
+assistency
+assister
+assistful
+assistive
+assistless
+assistor
+assize
+assizement
+assizer
+assizes
+asslike
+assman
+Assmannshauser
+assmanship
+associability
+associable
+associableness
+associate
+associated
+associatedness
+associateship
+association
+associational
+associationalism
+associationalist
+associationism
+associationist
+associationistic
+associative
+associatively
+associativeness
+associator
+associatory
+assoil
+assoilment
+assoilzie
+assonance
+assonanced
+assonant
+assonantal
+assonantic
+assonate
+Assonia
+assort
+assortative
+assorted
+assortedness
+assorter
+assortive
+assortment
+assuade
+assuage
+assuagement
+assuager
+assuasive
+assubjugate
+assuetude
+assumable
+assumably
+assume
+assumed
+assumedly
+assumer
+assuming
+assumingly
+assumingness
+assumpsit
+assumption
+Assumptionist
+assumptious
+assumptiousness
+assumptive
+assumptively
+assurable
+assurance
+assurant
+assure
+assured
+assuredly
+assuredness
+assurer
+assurge
+assurgency
+assurgent
+assuring
+assuringly
+assyntite
+Assyrian
+Assyrianize
+Assyriological
+Assyriologist
+Assyriologue
+Assyriology
+Assyroid
+assythment
+ast
+asta
+Astacidae
+Astacus
+Astakiwi
+astalk
+astarboard
+astare
+astart
+Astarte
+Astartian
+Astartidae
+astasia
+astatic
+astatically
+astaticism
+astatine
+astatize
+astatizer
+astay
+asteam
+asteatosis
+asteep
+asteer
+asteism
+astelic
+astely
+aster
+Asteraceae
+asteraceous
+Asterales
+Asterella
+astereognosis
+asteria
+asterial
+Asterias
+asteriated
+Asteriidae
+asterikos
+asterin
+Asterina
+Asterinidae
+asterioid
+Asterion
+asterion
+Asterionella
+asterisk
+asterism
+asterismal
+astern
+asternal
+Asternata
+asternia
+Asterochiton
+asteroid
+asteroidal
+Asteroidea
+asteroidean
+Asterolepidae
+Asterolepis
+Asterope
+asterophyllite
+Asterophyllites
+Asterospondyli
+asterospondylic
+asterospondylous
+Asteroxylaceae
+Asteroxylon
+Asterozoa
+asterwort
+asthenia
+asthenic
+asthenical
+asthenobiosis
+asthenobiotic
+asthenolith
+asthenology
+asthenopia
+asthenopic
+asthenosphere
+astheny
+asthma
+asthmatic
+asthmatical
+asthmatically
+asthmatoid
+asthmogenic
+asthore
+asthorin
+Astian
+astichous
+astigmatic
+astigmatical
+astigmatically
+astigmatism
+astigmatizer
+astigmatometer
+astigmatoscope
+astigmatoscopy
+astigmia
+astigmism
+astigmometer
+astigmometry
+Astilbe
+astilbe
+astint
+astipulate
+astir
+astite
+astomatal
+astomatous
+astomia
+astomous
+astonied
+astonish
+astonishedly
+astonisher
+astonishing
+astonishingly
+astonishingness
+astonishment
+astony
+astoop
+astor
+astound
+astoundable
+astounding
+astoundingly
+astoundment
+Astrachan
+astraddle
+Astraea
+Astraean
+astraean
+astraeid
+Astraeidae
+astraeiform
+astragal
+astragalar
+astragalectomy
+astragali
+astragalocalcaneal
+astragalocentral
+astragalomancy
+astragalonavicular
+astragaloscaphoid
+astragalotibial
+Astragalus
+astragalus
+astrain
+astrakanite
+astrakhan
+astral
+astrally
+astrand
+Astrantia
+astraphobia
+astrapophobia
+astray
+astream
+astrer
+astrict
+astriction
+astrictive
+astrictively
+astrictiveness
+Astrid
+astride
+astrier
+astriferous
+astrild
+astringe
+astringency
+astringent
+astringently
+astringer
+astroalchemist
+astroblast
+Astrocaryum
+astrochemist
+astrochemistry
+astrochronological
+astrocyte
+astrocytoma
+astrocytomata
+astrodiagnosis
+astrodome
+astrofel
+astrogeny
+astroglia
+astrognosy
+astrogonic
+astrogony
+astrograph
+astrographic
+astrography
+astroid
+astroite
+astrolabe
+astrolabical
+astrolater
+astrolatry
+astrolithology
+astrologaster
+astrologer
+astrologian
+astrologic
+astrological
+astrologically
+astrologistic
+astrologize
+astrologous
+astrology
+astromancer
+astromancy
+astromantic
+astrometeorological
+astrometeorologist
+astrometeorology
+astrometer
+astrometrical
+astrometry
+astronaut
+astronautics
+astronomer
+astronomic
+astronomical
+astronomically
+astronomics
+astronomize
+astronomy
+Astropecten
+Astropectinidae
+astrophil
+astrophobia
+astrophotographic
+astrophotography
+astrophotometer
+astrophotometrical
+astrophotometry
+astrophyllite
+astrophysical
+astrophysicist
+astrophysics
+Astrophyton
+astroscope
+Astroscopus
+astroscopy
+astrospectral
+astrospectroscopic
+astrosphere
+astrotheology
+astrut
+astucious
+astuciously
+astucity
+Astur
+Asturian
+astute
+astutely
+astuteness
+astylar
+Astylospongia
+Astylosternus
+asudden
+asunder
+Asuri
+aswail
+aswarm
+asway
+asweat
+aswell
+aswim
+aswing
+aswirl
+aswoon
+aswooned
+asyla
+asyllabia
+asyllabic
+asyllabical
+asylum
+asymbiotic
+asymbolia
+asymbolic
+asymbolical
+asymmetric
+asymmetrical
+asymmetrically
+Asymmetron
+asymmetry
+asymptomatic
+asymptote
+asymptotic
+asymptotical
+asymptotically
+asynapsis
+asynaptic
+asynartete
+asynartetic
+asynchronism
+asynchronous
+asyndesis
+asyndetic
+asyndetically
+asyndeton
+asynergia
+asynergy
+asyngamic
+asyngamy
+asyntactic
+asyntrophy
+asystole
+asystolic
+asystolism
+asyzygetic
+at
+Ata
+atabal
+atabeg
+atabek
+Atabrine
+Atacaman
+Atacamenan
+Atacamenian
+Atacameno
+atacamite
+atactic
+atactiform
+Ataentsic
+atafter
+Ataigal
+Ataiyal
+Atalan
+ataman
+atamasco
+Atamosco
+atangle
+atap
+ataraxia
+ataraxy
+atatschite
+ataunt
+atavi
+atavic
+atavism
+atavist
+atavistic
+atavistically
+atavus
+ataxaphasia
+ataxia
+ataxiagram
+ataxiagraph
+ataxiameter
+ataxiaphasia
+ataxic
+ataxinomic
+ataxite
+ataxonomic
+ataxophemia
+ataxy
+atazir
+atbash
+atchison
+ate
+Ateba
+atebrin
+atechnic
+atechnical
+atechny
+ateeter
+atef
+atelectasis
+atelectatic
+ateleological
+Ateles
+atelestite
+atelets
+atelier
+ateliosis
+Atellan
+atelo
+atelocardia
+atelocephalous
+ateloglossia
+atelognathia
+atelomitic
+atelomyelia
+atelopodia
+ateloprosopia
+atelorachidia
+atelostomia
+atemporal
+Aten
+Atenism
+Atenist
+Aterian
+ates
+Atestine
+ateuchi
+ateuchus
+Atfalati
+Athabasca
+Athabascan
+athalamous
+athalline
+Athamantid
+athanasia
+Athanasian
+Athanasianism
+Athanasianist
+athanasy
+athanor
+Athapascan
+athar
+Atharvan
+Athecae
+Athecata
+athecate
+atheism
+atheist
+atheistic
+atheistical
+atheistically
+atheisticalness
+atheize
+atheizer
+athelia
+atheling
+athematic
+Athenaea
+athenaeum
+athenee
+Athenian
+Athenianly
+athenor
+Athens
+atheological
+atheologically
+atheology
+atheous
+Athericera
+athericeran
+athericerous
+atherine
+Atherinidae
+Atheriogaea
+Atheriogaean
+Atheris
+athermancy
+athermanous
+athermic
+athermous
+atheroma
+atheromasia
+atheromata
+atheromatosis
+atheromatous
+atherosclerosis
+Atherosperma
+Atherurus
+athetesis
+athetize
+athetoid
+athetosic
+athetosis
+athing
+athirst
+athlete
+athletehood
+athletic
+athletical
+athletically
+athleticism
+athletics
+athletism
+athletocracy
+athlothete
+athlothetes
+athodyd
+athort
+athrepsia
+athreptic
+athrill
+athrive
+athrob
+athrocyte
+athrocytosis
+athrogenic
+athrong
+athrough
+athwart
+athwarthawse
+athwartship
+athwartships
+athwartwise
+athymia
+athymic
+athymy
+athyreosis
+athyria
+athyrid
+Athyridae
+Athyris
+Athyrium
+athyroid
+athyroidism
+athyrosis
+Ati
+Atik
+Atikokania
+atilt
+atimon
+atinga
+atingle
+atinkle
+atip
+atis
+Atka
+Atlanta
+atlantad
+atlantal
+Atlantean
+atlantes
+Atlantic
+atlantic
+Atlantica
+Atlantid
+Atlantides
+atlantite
+atlantoaxial
+atlantodidymus
+atlantomastoid
+atlantoodontoid
+Atlantosaurus
+Atlas
+atlas
+Atlaslike
+atlatl
+atle
+atlee
+atloaxoid
+atloid
+atloidean
+atloidoaxoid
+atma
+atman
+atmiatrics
+atmiatry
+atmid
+atmidalbumin
+atmidometer
+atmidometry
+atmo
+atmocausis
+atmocautery
+atmoclastic
+atmogenic
+atmograph
+atmologic
+atmological
+atmologist
+atmology
+atmolysis
+atmolyzation
+atmolyze
+atmolyzer
+atmometer
+atmometric
+atmometry
+atmos
+atmosphere
+atmosphereful
+atmosphereless
+atmospheric
+atmospherical
+atmospherically
+atmospherics
+atmospherology
+atmostea
+atmosteal
+atmosteon
+Atnah
+atocha
+atocia
+atokal
+atoke
+atokous
+atoll
+atom
+atomatic
+atomechanics
+atomerg
+atomic
+atomical
+atomically
+atomician
+atomicism
+atomicity
+atomics
+atomiferous
+atomism
+atomist
+atomistic
+atomistical
+atomistically
+atomistics
+atomity
+atomization
+atomize
+atomizer
+atomology
+atomy
+atonable
+atonal
+atonalism
+atonalistic
+atonality
+atonally
+atone
+atonement
+atoneness
+atoner
+atonia
+atonic
+atonicity
+atoningly
+atony
+atop
+Atophan
+atophan
+atopic
+atopite
+atopy
+Atorai
+Atossa
+atour
+atoxic
+Atoxyl
+atoxyl
+atrabilarian
+atrabilarious
+atrabiliar
+atrabiliarious
+atrabiliary
+atrabilious
+atrabiliousness
+atracheate
+Atractaspis
+Atragene
+atragene
+atrail
+atrament
+atramental
+atramentary
+atramentous
+atraumatic
+Atrebates
+Atremata
+atrematous
+atremble
+atrepsy
+atreptic
+atresia
+atresic
+atresy
+atretic
+atria
+atrial
+atrichia
+atrichosis
+atrichous
+atrickle
+Atridean
+atrienses
+atriensis
+atriocoelomic
+atrioporal
+atriopore
+atrioventricular
+atrip
+Atriplex
+atrium
+atrocha
+atrochal
+atrochous
+atrocious
+atrociously
+atrociousness
+atrocity
+atrolactic
+Atropa
+atropaceous
+atropal
+atropamine
+atrophia
+atrophiated
+atrophic
+atrophied
+atrophoderma
+atrophy
+atropia
+atropic
+Atropidae
+atropine
+atropinism
+atropinization
+atropinize
+atropism
+atropous
+atrorubent
+atrosanguineous
+atroscine
+atrous
+atry
+Atrypa
+Atta
+atta
+Attacapan
+attacco
+attach
+attachable
+attachableness
+attache
+attached
+attachedly
+attacher
+attacheship
+attachment
+attack
+attackable
+attacker
+attacolite
+Attacus
+attacus
+attagen
+attaghan
+attain
+attainability
+attainable
+attainableness
+attainder
+attainer
+attainment
+attaint
+attaintment
+attainture
+Attalea
+attaleh
+Attalid
+attar
+attargul
+attask
+attemper
+attemperament
+attemperance
+attemperate
+attemperately
+attemperation
+attemperator
+attempt
+attemptability
+attemptable
+attempter
+attemptless
+attend
+attendance
+attendancy
+attendant
+attendantly
+attender
+attendingly
+attendment
+attendress
+attensity
+attent
+attention
+attentional
+attentive
+attentively
+attentiveness
+attently
+attenuable
+attenuant
+attenuate
+attenuation
+attenuative
+attenuator
+atter
+attercop
+attercrop
+atterminal
+attermine
+atterminement
+attern
+attery
+attest
+attestable
+attestant
+attestation
+attestative
+attestator
+attester
+attestive
+Attic
+attic
+Attical
+Atticism
+atticism
+Atticist
+Atticize
+atticize
+atticomastoid
+attid
+Attidae
+attinge
+attingence
+attingency
+attingent
+attire
+attired
+attirement
+attirer
+attitude
+attitudinal
+attitudinarian
+attitudinarianism
+attitudinize
+attitudinizer
+Attiwendaronk
+attorn
+attorney
+attorneydom
+attorneyism
+attorneyship
+attornment
+attract
+attractability
+attractable
+attractableness
+attractant
+attracter
+attractile
+attractingly
+attraction
+attractionally
+attractive
+attractively
+attractiveness
+attractivity
+attractor
+attrahent
+attrap
+attributable
+attributal
+attribute
+attributer
+attribution
+attributive
+attributively
+attributiveness
+attrist
+attrite
+attrited
+attriteness
+attrition
+attritive
+attritus
+attune
+attunely
+attunement
+Atuami
+atule
+atumble
+atune
+atwain
+atweel
+atween
+atwin
+atwirl
+atwist
+atwitch
+atwitter
+atwixt
+atwo
+atypic
+atypical
+atypically
+atypy
+auantic
+aube
+aubepine
+Aubrey
+Aubrietia
+aubrietia
+aubrite
+auburn
+aubusson
+Auca
+auca
+Aucan
+Aucaner
+Aucanian
+Auchenia
+auchenia
+auchenium
+auchlet
+auction
+auctionary
+auctioneer
+auctorial
+Aucuba
+aucuba
+aucupate
+audacious
+audaciously
+audaciousness
+audacity
+Audaean
+Audian
+Audibertia
+audibility
+audible
+audibleness
+audibly
+audience
+audiencier
+audient
+audile
+audio
+audiogenic
+audiogram
+audiologist
+audiology
+audiometer
+audiometric
+audiometry
+Audion
+audion
+audiophile
+audiphone
+audit
+audition
+auditive
+auditor
+auditoria
+auditorial
+auditorially
+auditorily
+auditorium
+auditorship
+auditory
+auditress
+auditual
+audivise
+audiviser
+audivision
+Audrey
+Audubonistic
+Aueto
+auganite
+auge
+Augean
+augelite
+augen
+augend
+auger
+augerer
+augh
+aught
+aughtlins
+augite
+augitic
+augitite
+augitophyre
+augment
+augmentable
+augmentation
+augmentationer
+augmentative
+augmentatively
+augmented
+augmentedly
+augmenter
+augmentive
+augur
+augural
+augurate
+augurial
+augurous
+augurship
+augury
+August
+august
+Augusta
+augustal
+Augustan
+Augusti
+Augustin
+Augustinian
+Augustinianism
+Augustinism
+augustly
+augustness
+Augustus
+auh
+auhuhu
+Auk
+auk
+auklet
+aula
+aulacocarpous
+Aulacodus
+Aulacomniaceae
+Aulacomnium
+aulae
+aularian
+auld
+auldfarrantlike
+auletai
+aulete
+auletes
+auletic
+auletrides
+auletris
+aulic
+aulicism
+auloi
+aulophyte
+aulos
+Aulostoma
+Aulostomatidae
+Aulostomi
+aulostomid
+Aulostomidae
+Aulostomus
+aulu
+aum
+aumaga
+aumail
+aumbry
+aumery
+aumil
+aumildar
+aumous
+aumrie
+auncel
+aune
+Aunjetitz
+aunt
+aunthood
+auntie
+auntish
+auntlike
+auntly
+auntsary
+auntship
+aupaka
+aura
+aurae
+aural
+aurally
+auramine
+Aurantiaceae
+aurantiaceous
+Aurantium
+aurantium
+aurar
+aurate
+aurated
+aureate
+aureately
+aureateness
+aureation
+aureity
+Aurelia
+aurelia
+aurelian
+Aurelius
+Aureocasidium
+aureola
+aureole
+aureolin
+aureoline
+aureomycin
+aureous
+aureously
+auresca
+aureus
+auribromide
+auric
+aurichalcite
+aurichalcum
+aurichloride
+aurichlorohydric
+auricle
+auricled
+auricomous
+Auricula
+auricula
+auriculae
+auricular
+auriculare
+auriculares
+Auricularia
+auricularia
+Auriculariaceae
+auriculariae
+Auriculariales
+auricularian
+auricularis
+auricularly
+auriculate
+auriculated
+auriculately
+Auriculidae
+auriculocranial
+auriculoparietal
+auriculotemporal
+auriculoventricular
+auriculovertical
+auricyanhydric
+auricyanic
+auricyanide
+auride
+auriferous
+aurific
+aurification
+auriform
+aurify
+Auriga
+aurigal
+aurigation
+aurigerous
+Aurigid
+Aurignacian
+aurilave
+aurin
+aurinasal
+auriphone
+auriphrygia
+auriphrygiate
+auripuncture
+aurir
+auriscalp
+auriscalpia
+auriscalpium
+auriscope
+auriscopy
+aurist
+aurite
+aurivorous
+auroauric
+aurobromide
+aurochloride
+aurochs
+aurocyanide
+aurodiamine
+auronal
+aurophobia
+aurophore
+aurora
+aurorae
+auroral
+aurorally
+aurore
+aurorean
+Aurorian
+aurorium
+aurotellurite
+aurothiosulphate
+aurothiosulphuric
+aurous
+aurrescu
+aurulent
+aurum
+aurure
+auryl
+Aus
+auscult
+auscultascope
+auscultate
+auscultation
+auscultative
+auscultator
+auscultatory
+Auscultoscope
+auscultoscope
+Aushar
+auslaut
+auslaute
+Ausones
+Ausonian
+auspex
+auspicate
+auspice
+auspices
+auspicial
+auspicious
+auspiciously
+auspiciousness
+auspicy
+Aussie
+Austafrican
+austenite
+austenitic
+Auster
+austere
+austerely
+austereness
+austerity
+Austerlitz
+Austin
+Austral
+austral
+Australasian
+australene
+Australia
+Australian
+Australianism
+Australianize
+Australic
+Australioid
+australite
+Australoid
+Australopithecinae
+australopithecine
+Australopithecus
+Australorp
+Austrasian
+Austrian
+Austrianize
+Austric
+austrium
+Austroasiatic
+Austrogaea
+Austrogaean
+austromancy
+Austronesian
+Austrophil
+Austrophile
+Austrophilism
+Austroriparian
+ausu
+ausubo
+autacoid
+autacoidal
+autallotriomorphic
+autantitypy
+autarch
+autarchic
+autarchical
+Autarchoglossa
+autarchy
+autarkic
+autarkical
+autarkist
+autarky
+aute
+autechoscope
+autecious
+auteciously
+auteciousness
+autecism
+autecologic
+autecological
+autecologically
+autecologist
+autecology
+autecy
+autem
+authentic
+authentical
+authentically
+authenticalness
+authenticate
+authentication
+authenticator
+authenticity
+authenticly
+authenticness
+authigene
+authigenetic
+authigenic
+authigenous
+author
+authorcraft
+authoress
+authorhood
+authorial
+authorially
+authorish
+authorism
+authoritarian
+authoritarianism
+authoritative
+authoritatively
+authoritativeness
+authority
+authorizable
+authorization
+authorize
+authorized
+authorizer
+authorless
+authorling
+authorly
+authorship
+authotype
+autism
+autist
+autistic
+auto
+autoabstract
+autoactivation
+autoactive
+autoaddress
+autoagglutinating
+autoagglutination
+autoagglutinin
+autoalarm
+autoalkylation
+autoallogamous
+autoallogamy
+autoanalysis
+autoanalytic
+autoantibody
+autoanticomplement
+autoantitoxin
+autoasphyxiation
+autoaspiration
+autoassimilation
+autobahn
+autobasidia
+Autobasidiomycetes
+autobasidiomycetous
+autobasidium
+Autobasisii
+autobiographal
+autobiographer
+autobiographic
+autobiographical
+autobiographically
+autobiographist
+autobiography
+autobiology
+autoblast
+autoboat
+autoboating
+autobolide
+autobus
+autocab
+autocade
+autocall
+autocamp
+autocamper
+autocamping
+autocar
+autocarist
+autocarpian
+autocarpic
+autocarpous
+autocatalepsy
+autocatalysis
+autocatalytic
+autocatalytically
+autocatalyze
+autocatheterism
+autocephalia
+autocephality
+autocephalous
+autocephaly
+autoceptive
+autochemical
+autocholecystectomy
+autochrome
+autochromy
+autochronograph
+autochthon
+autochthonal
+autochthonic
+autochthonism
+autochthonous
+autochthonously
+autochthonousness
+autochthony
+autocide
+autocinesis
+autoclasis
+autoclastic
+autoclave
+autocoenobium
+autocoherer
+autocoid
+autocollimation
+autocollimator
+autocolony
+autocombustible
+autocombustion
+autocomplexes
+autocondensation
+autoconduction
+autoconvection
+autoconverter
+autocopist
+autocoprophagous
+autocorrosion
+autocracy
+autocrat
+autocratic
+autocratical
+autocratically
+autocrator
+autocratoric
+autocratorical
+autocratrix
+autocratship
+autocremation
+autocriticism
+autocystoplasty
+autocytolysis
+autocytolytic
+autodecomposition
+autodepolymerization
+autodermic
+autodestruction
+autodetector
+autodiagnosis
+autodiagnostic
+autodiagrammatic
+autodidact
+autodidactic
+autodifferentiation
+autodiffusion
+autodigestion
+autodigestive
+autodrainage
+autodrome
+autodynamic
+autodyne
+autoecholalia
+autoecic
+autoecious
+autoeciously
+autoeciousness
+autoecism
+autoecous
+autoecy
+autoeducation
+autoeducative
+autoelectrolysis
+autoelectrolytic
+autoelectronic
+autoelevation
+autoepigraph
+autoepilation
+autoerotic
+autoerotically
+autoeroticism
+autoerotism
+autoexcitation
+autofecundation
+autofermentation
+autoformation
+autofrettage
+autogamic
+autogamous
+autogamy
+autogauge
+autogeneal
+autogenesis
+autogenetic
+autogenetically
+autogenic
+autogenous
+autogenously
+autogeny
+Autogiro
+autogiro
+autognosis
+autognostic
+autograft
+autografting
+autogram
+autograph
+autographal
+autographer
+autographic
+autographical
+autographically
+autographism
+autographist
+autographometer
+autography
+autogravure
+Autoharp
+autoharp
+autoheader
+autohemic
+autohemolysin
+autohemolysis
+autohemolytic
+autohemorrhage
+autohemotherapy
+autoheterodyne
+autoheterosis
+autohexaploid
+autohybridization
+autohypnosis
+autohypnotic
+autohypnotism
+autohypnotization
+autoicous
+autoignition
+autoimmunity
+autoimmunization
+autoinduction
+autoinductive
+autoinfection
+autoinfusion
+autoinhibited
+autoinoculable
+autoinoculation
+autointellectual
+autointoxicant
+autointoxication
+autoirrigation
+autoist
+autojigger
+autojuggernaut
+autokinesis
+autokinetic
+autokrator
+autolaryngoscope
+autolaryngoscopic
+autolaryngoscopy
+autolater
+autolatry
+autolavage
+autolesion
+autolimnetic
+autolith
+autoloading
+autological
+autologist
+autologous
+autology
+autoluminescence
+autoluminescent
+autolysate
+autolysin
+autolysis
+autolytic
+Autolytus
+autolyzate
+autolyze
+automa
+automacy
+automanual
+automat
+automata
+automatic
+automatical
+automatically
+automaticity
+automatin
+automatism
+automatist
+automatization
+automatize
+automatograph
+automaton
+automatonlike
+automatous
+automechanical
+automelon
+autometamorphosis
+autometric
+autometry
+automobile
+automobilism
+automobilist
+automobilistic
+automobility
+automolite
+automonstration
+automorph
+automorphic
+automorphically
+automorphism
+automotive
+automotor
+automower
+automysophobia
+autonegation
+autonephrectomy
+autonephrotoxin
+autoneurotoxin
+autonitridation
+autonoetic
+autonomasy
+autonomic
+autonomical
+autonomically
+autonomist
+autonomize
+autonomous
+autonomously
+autonomy
+autonym
+autoparasitism
+autopathic
+autopathography
+autopathy
+autopelagic
+autopepsia
+autophagi
+autophagia
+autophagous
+autophagy
+autophobia
+autophoby
+autophon
+autophone
+autophonoscope
+autophonous
+autophony
+autophotoelectric
+autophotograph
+autophotometry
+autophthalmoscope
+autophyllogeny
+autophyte
+autophytic
+autophytically
+autophytograph
+autophytography
+autopilot
+autoplagiarism
+autoplasmotherapy
+autoplast
+autoplastic
+autoplasty
+autopneumatic
+autopoint
+autopoisonous
+autopolar
+autopolo
+autopoloist
+autopolyploid
+autopore
+autoportrait
+autoportraiture
+autopositive
+autopotent
+autoprogressive
+autoproteolysis
+autoprothesis
+autopsic
+autopsical
+autopsy
+autopsychic
+autopsychoanalysis
+autopsychology
+autopsychorhythmia
+autopsychosis
+autoptic
+autoptical
+autoptically
+autopticity
+autopyotherapy
+autoracemization
+autoradiograph
+autoradiographic
+autoradiography
+autoreduction
+autoregenerator
+autoregulation
+autoreinfusion
+autoretardation
+autorhythmic
+autorhythmus
+autoriser
+autorotation
+autorrhaphy
+Autosauri
+Autosauria
+autoschediasm
+autoschediastic
+autoschediastical
+autoschediastically
+autoschediaze
+autoscience
+autoscope
+autoscopic
+autoscopy
+autosender
+autosensitization
+autosensitized
+autosepticemia
+autoserotherapy
+autoserum
+autosexing
+autosight
+autosign
+autosite
+autositic
+autoskeleton
+autosled
+autoslip
+autosomal
+autosomatognosis
+autosomatognostic
+autosome
+autosoteric
+autosoterism
+autospore
+autosporic
+autospray
+autostability
+autostage
+autostandardization
+autostarter
+autostethoscope
+autostylic
+autostylism
+autostyly
+autosuggestibility
+autosuggestible
+autosuggestion
+autosuggestionist
+autosuggestive
+autosuppression
+autosymbiontic
+autosymbolic
+autosymbolical
+autosymbolically
+autosymnoia
+Autosyn
+autosyndesis
+autotelegraph
+autotelic
+autotetraploid
+autotetraploidy
+autothaumaturgist
+autotheater
+autotheism
+autotheist
+autotherapeutic
+autotherapy
+autothermy
+autotomic
+autotomize
+autotomous
+autotomy
+autotoxaemia
+autotoxic
+autotoxication
+autotoxicity
+autotoxicosis
+autotoxin
+autotoxis
+autotractor
+autotransformer
+autotransfusion
+autotransplant
+autotransplantation
+autotrepanation
+autotriploid
+autotriploidy
+autotroph
+autotrophic
+autotrophy
+autotropic
+autotropically
+autotropism
+autotruck
+autotuberculin
+autoturning
+autotype
+autotyphization
+autotypic
+autotypography
+autotypy
+autourine
+autovaccination
+autovaccine
+autovalet
+autovalve
+autovivisection
+autoxeny
+autoxidation
+autoxidator
+autoxidizability
+autoxidizable
+autoxidize
+autoxidizer
+autozooid
+autrefois
+autumn
+autumnal
+autumnally
+autumnian
+autumnity
+Autunian
+autunite
+auxamylase
+auxanogram
+auxanology
+auxanometer
+auxesis
+auxetic
+auxetical
+auxetically
+auxiliar
+auxiliarly
+auxiliary
+auxiliate
+auxiliation
+auxiliator
+auxiliatory
+auxilium
+auximone
+auxin
+auxinic
+auxinically
+auxoaction
+auxoamylase
+auxoblast
+auxobody
+auxocardia
+auxochrome
+auxochromic
+auxochromism
+auxochromous
+auxocyte
+auxoflore
+auxofluor
+auxograph
+auxographic
+auxohormone
+auxology
+auxometer
+auxospore
+auxosubstance
+auxotonic
+auxotox
+ava
+avadana
+avadavat
+avadhuta
+avahi
+avail
+availability
+available
+availableness
+availably
+availingly
+availment
+aval
+avalanche
+avalent
+avalvular
+Avanguardisti
+avania
+avanious
+Avanti
+avanturine
+Avar
+Avaradrano
+avaremotemo
+Avarian
+avarice
+avaricious
+avariciously
+avariciousness
+Avarish
+Avars
+avascular
+avast
+avaunt
+Ave
+ave
+avellan
+avellane
+avellaneous
+avellano
+avelonge
+aveloz
+Avena
+avenaceous
+avenage
+avenalin
+avener
+avenge
+avengeful
+avengement
+avenger
+avengeress
+avenging
+avengingly
+avenin
+avenolith
+avenous
+avens
+aventail
+Aventine
+aventurine
+avenue
+aver
+avera
+average
+averagely
+averager
+averah
+averil
+averin
+averment
+Avernal
+Avernus
+averrable
+averral
+Averrhoa
+Averroism
+Averroist
+Averroistic
+averruncate
+averruncation
+averruncator
+aversant
+aversation
+averse
+aversely
+averseness
+aversion
+aversive
+avert
+avertable
+averted
+avertedly
+averter
+avertible
+Avertin
+Avery
+Aves
+Avesta
+Avestan
+avian
+avianization
+avianize
+aviarist
+aviary
+aviate
+aviatic
+aviation
+aviator
+aviatorial
+aviatoriality
+aviatory
+aviatress
+aviatrices
+aviatrix
+Avicennia
+Avicenniaceae
+Avicennism
+avichi
+avicide
+avick
+avicolous
+Avicula
+avicular
+Avicularia
+avicularia
+avicularian
+Aviculariidae
+Avicularimorphae
+avicularium
+Aviculidae
+aviculture
+aviculturist
+avid
+avidious
+avidiously
+avidity
+avidly
+avidous
+avidya
+avifauna
+avifaunal
+avigate
+avigation
+avigator
+Avignonese
+avijja
+Avikom
+avine
+aviolite
+avirulence
+avirulent
+Avis
+aviso
+avital
+avitaminosis
+avitaminotic
+avitic
+avives
+avizandum
+avo
+avocado
+avocate
+avocation
+avocative
+avocatory
+avocet
+avodire
+avogadrite
+avoid
+avoidable
+avoidably
+avoidance
+avoider
+avoidless
+avoidment
+avoirdupois
+avolate
+avolation
+avolitional
+avondbloem
+avouch
+avouchable
+avoucher
+avouchment
+avourneen
+avow
+avowable
+avowableness
+avowably
+avowal
+avowance
+avowant
+avowed
+avowedly
+avowedness
+avower
+avowry
+avoyer
+avoyership
+Avshar
+avulse
+avulsion
+avuncular
+avunculate
+aw
+awa
+Awabakal
+awabi
+Awadhi
+awaft
+awag
+await
+awaiter
+Awaitlala
+awakable
+awake
+awaken
+awakenable
+awakener
+awakening
+awakeningly
+awakenment
+awald
+awalim
+awalt
+Awan
+awane
+awanting
+awapuhi
+award
+awardable
+awarder
+awardment
+aware
+awaredom
+awareness
+awaruite
+awash
+awaste
+awat
+awatch
+awater
+awave
+away
+awayness
+awber
+awd
+awe
+awearied
+aweary
+aweather
+aweband
+awedness
+awee
+aweek
+aweel
+aweigh
+Awellimiden
+awesome
+awesomely
+awesomeness
+awest
+aweto
+awfu
+awful
+awfully
+awfulness
+awheel
+awheft
+awhet
+awhile
+awhir
+awhirl
+awide
+awiggle
+awikiwiki
+awin
+awing
+awink
+awiwi
+awkward
+awkwardish
+awkwardly
+awkwardness
+awl
+awless
+awlessness
+awlwort
+awmous
+awn
+awned
+awner
+awning
+awninged
+awnless
+awnlike
+awny
+awoke
+Awol
+awork
+awreck
+awrist
+awrong
+awry
+Awshar
+ax
+axal
+axbreaker
+axe
+axed
+Axel
+axenic
+axes
+axfetch
+axhammer
+axhammered
+axhead
+axial
+axiality
+axially
+axiate
+axiation
+Axifera
+axiform
+axifugal
+axil
+axile
+axilemma
+axilemmata
+axilla
+axillae
+axillant
+axillar
+axillary
+axine
+axinite
+axinomancy
+axiolite
+axiolitic
+axiological
+axiologically
+axiologist
+axiology
+axiom
+axiomatic
+axiomatical
+axiomatically
+axiomatization
+axiomatize
+axion
+axiopisty
+Axis
+axis
+axised
+axisymmetric
+axisymmetrical
+axite
+axle
+axled
+axlesmith
+axletree
+axmaker
+axmaking
+axman
+axmanship
+axmaster
+Axminster
+axodendrite
+axofugal
+axogamy
+axoid
+axoidean
+axolemma
+axolotl
+axolysis
+axometer
+axometric
+axometry
+axon
+axonal
+axoneure
+axoneuron
+Axonia
+Axonolipa
+axonolipous
+axonometric
+axonometry
+Axonophora
+axonophorous
+Axonopus
+axonost
+axopetal
+axophyte
+axoplasm
+axopodia
+axopodium
+axospermous
+axostyle
+axseed
+axstone
+axtree
+Axumite
+axunge
+axweed
+axwise
+axwort
+Ay
+ay
+ayacahuite
+ayah
+Ayahuca
+Aydendron
+aye
+ayegreen
+ayelp
+ayenbite
+ayin
+Aylesbury
+ayless
+aylet
+ayllu
+Aymara
+Aymaran
+Aymoro
+ayond
+ayont
+ayous
+Ayrshire
+Aythya
+ayu
+Ayubite
+Ayyubid
+azadrachta
+azafrin
+Azalea
+azalea
+Azande
+azarole
+azedarach
+azelaic
+azelate
+Azelfafage
+azeotrope
+azeotropic
+azeotropism
+azeotropy
+Azerbaijanese
+Azerbaijani
+Azerbaijanian
+Azha
+azide
+aziethane
+Azilian
+azilut
+Azimech
+azimene
+azimethylene
+azimide
+azimine
+azimino
+aziminobenzene
+azimuth
+azimuthal
+azimuthally
+azine
+aziola
+azlactone
+azo
+azobacter
+azobenzene
+azobenzil
+azobenzoic
+azobenzol
+azoblack
+azoch
+azocochineal
+azocoralline
+azocorinth
+azocyanide
+azocyclic
+azodicarboxylic
+azodiphenyl
+azodisulphonic
+azoeosin
+azoerythrin
+azofication
+azofier
+azoflavine
+azoformamide
+azoformic
+azofy
+azogallein
+azogreen
+azogrenadine
+azohumic
+azoic
+azoimide
+azoisobutyronitrile
+azole
+azolitmin
+Azolla
+azomethine
+azon
+azonal
+azonaphthalene
+azonic
+azonium
+azoospermia
+azoparaffin
+azophen
+azophenetole
+azophenine
+azophenol
+azophenyl
+azophenylene
+azophosphin
+azophosphore
+azoprotein
+Azorian
+azorite
+azorubine
+azosulphine
+azosulphonic
+azotate
+azote
+azoted
+azotemia
+azotenesis
+azotetrazole
+azoth
+azothionium
+azotic
+azotine
+azotite
+azotize
+Azotobacter
+Azotobacterieae
+azotoluene
+azotometer
+azotorrhoea
+azotous
+azoturia
+azovernine
+azox
+azoxazole
+azoxime
+azoxine
+azoxonium
+azoxy
+azoxyanisole
+azoxybenzene
+azoxybenzoic
+azoxynaphthalene
+azoxyphenetole
+azoxytoluidine
+Aztec
+Azteca
+azteca
+Aztecan
+azthionium
+azulene
+azulite
+azulmic
+azumbre
+azure
+azurean
+azured
+azureous
+azurine
+azurite
+azurmalachite
+azurous
+azury
+Azygobranchia
+Azygobranchiata
+azygobranchiate
+azygomatous
+azygos
+azygosperm
+azygospore
+azygous
+azyme
+azymite
+azymous
+B
+b
+ba
+baa
+baahling
+Baal
+baal
+Baalath
+Baalish
+Baalism
+Baalist
+Baalite
+Baalitical
+Baalize
+Baalshem
+baar
+Bab
+baba
+babacoote
+babai
+babasco
+babassu
+babaylan
+Babbie
+Babbitt
+babbitt
+babbitter
+Babbittess
+Babbittian
+Babbittism
+Babbittry
+babblative
+babble
+babblement
+babbler
+babblesome
+babbling
+babblingly
+babblish
+babblishly
+babbly
+babby
+Babcock
+babe
+babehood
+Babel
+Babeldom
+babelet
+Babelic
+babelike
+Babelish
+Babelism
+Babelize
+babery
+babeship
+Babesia
+babesiasis
+Babhan
+Babi
+Babiana
+babiche
+babied
+Babiism
+babillard
+Babine
+babingtonite
+babirusa
+babish
+babished
+babishly
+babishness
+Babism
+Babist
+Babite
+bablah
+babloh
+baboen
+Babongo
+baboo
+baboodom
+babooism
+baboon
+baboonery
+baboonish
+baboonroot
+baboot
+babouche
+Babouvism
+Babouvist
+babroot
+Babs
+babu
+Babua
+babudom
+babuina
+babuism
+babul
+Babuma
+Babungera
+babushka
+baby
+babydom
+babyfied
+babyhood
+babyhouse
+babyish
+babyishly
+babyishness
+babyism
+babylike
+Babylon
+Babylonian
+Babylonic
+Babylonish
+Babylonism
+Babylonite
+Babylonize
+babyolatry
+babyship
+bac
+bacaba
+bacach
+bacalao
+bacao
+bacbakiri
+bacca
+baccaceous
+baccae
+baccalaurean
+baccalaureate
+baccara
+baccarat
+baccate
+baccated
+Bacchae
+bacchanal
+Bacchanalia
+bacchanalian
+bacchanalianism
+bacchanalianly
+bacchanalism
+bacchanalization
+bacchanalize
+bacchant
+bacchante
+bacchantes
+bacchantic
+bacchar
+baccharis
+baccharoid
+baccheion
+bacchiac
+bacchian
+Bacchic
+bacchic
+Bacchical
+Bacchides
+bacchii
+bacchius
+Bacchus
+Bacchuslike
+bacciferous
+bacciform
+baccivorous
+bach
+Bacharach
+bache
+bachel
+bachelor
+bachelordom
+bachelorhood
+bachelorism
+bachelorize
+bachelorlike
+bachelorly
+bachelorship
+bachelorwise
+bachelry
+Bachichi
+Bacillaceae
+bacillar
+Bacillariaceae
+bacillariaceous
+Bacillariales
+Bacillarieae
+Bacillariophyta
+bacillary
+bacillemia
+bacilli
+bacillian
+bacillicidal
+bacillicide
+bacillicidic
+bacilliculture
+bacilliform
+bacilligenic
+bacilliparous
+bacillite
+bacillogenic
+bacillogenous
+bacillophobia
+bacillosis
+bacilluria
+bacillus
+Bacis
+bacitracin
+back
+backache
+backaching
+backachy
+backage
+backband
+backbearing
+backbencher
+backbite
+backbiter
+backbitingly
+backblow
+backboard
+backbone
+backboned
+backboneless
+backbonelessness
+backbrand
+backbreaker
+backbreaking
+backcap
+backcast
+backchain
+backchat
+backcourt
+backcross
+backdoor
+backdown
+backdrop
+backed
+backen
+backer
+backet
+backfall
+backfatter
+backfield
+backfill
+backfiller
+backfilling
+backfire
+backfiring
+backflap
+backflash
+backflow
+backfold
+backframe
+backfriend
+backfurrow
+backgame
+backgammon
+background
+backhand
+backhanded
+backhandedly
+backhandedness
+backhander
+backhatch
+backheel
+backhooker
+backhouse
+backie
+backiebird
+backing
+backjaw
+backjoint
+backlands
+backlash
+backlashing
+backless
+backlet
+backlings
+backlog
+backlotter
+backmost
+backpedal
+backpiece
+backplate
+backrope
+backrun
+backsaw
+backscraper
+backset
+backsetting
+backsettler
+backshift
+backside
+backsight
+backslap
+backslapper
+backslapping
+backslide
+backslider
+backslidingness
+backspace
+backspacer
+backspang
+backspier
+backspierer
+backspin
+backspread
+backspringing
+backstaff
+backstage
+backstamp
+backstay
+backster
+backstick
+backstitch
+backstone
+backstop
+backstrap
+backstretch
+backstring
+backstrip
+backstroke
+backstromite
+backswept
+backswing
+backsword
+backswording
+backswordman
+backswordsman
+backtack
+backtender
+backtenter
+backtrack
+backtracker
+backtrick
+backup
+backveld
+backvelder
+backwall
+backward
+backwardation
+backwardly
+backwardness
+backwards
+backwash
+backwasher
+backwashing
+backwater
+backwatered
+backway
+backwood
+backwoods
+backwoodsiness
+backwoodsman
+backwoodsy
+backword
+backworm
+backwort
+backyarder
+baclin
+bacon
+baconer
+Baconian
+Baconianism
+Baconic
+Baconism
+Baconist
+baconize
+baconweed
+bacony
+Bacopa
+bacteremia
+bacteria
+Bacteriaceae
+bacteriaceous
+bacterial
+bacterially
+bacterian
+bacteric
+bactericholia
+bactericidal
+bactericide
+bactericidin
+bacterid
+bacteriemia
+bacteriform
+bacterin
+bacterioagglutinin
+bacterioblast
+bacteriocyte
+bacteriodiagnosis
+bacteriofluorescin
+bacteriogenic
+bacteriogenous
+bacteriohemolysin
+bacterioid
+bacterioidal
+bacteriologic
+bacteriological
+bacteriologically
+bacteriologist
+bacteriology
+bacteriolysin
+bacteriolysis
+bacteriolytic
+bacteriolyze
+bacteriopathology
+bacteriophage
+bacteriophagia
+bacteriophagic
+bacteriophagous
+bacteriophagy
+bacteriophobia
+bacterioprecipitin
+bacterioprotein
+bacteriopsonic
+bacteriopsonin
+bacteriopurpurin
+bacterioscopic
+bacterioscopical
+bacterioscopically
+bacterioscopist
+bacterioscopy
+bacteriosis
+bacteriosolvent
+bacteriostasis
+bacteriostat
+bacteriostatic
+bacteriotherapeutic
+bacteriotherapy
+bacteriotoxic
+bacteriotoxin
+bacteriotropic
+bacteriotropin
+bacteriotrypsin
+bacterious
+bacteritic
+bacterium
+bacteriuria
+bacterization
+bacterize
+bacteroid
+bacteroidal
+Bacteroideae
+Bacteroides
+Bactrian
+Bactris
+Bactrites
+bactriticone
+bactritoid
+bacula
+bacule
+baculi
+baculiferous
+baculiform
+baculine
+baculite
+Baculites
+baculitic
+baculiticone
+baculoid
+baculum
+baculus
+bacury
+bad
+Badaga
+badan
+Badarian
+badarrah
+Badawi
+baddeleyite
+badderlocks
+baddish
+baddishly
+baddishness
+baddock
+bade
+badenite
+badge
+badgeless
+badgeman
+badger
+badgerbrush
+badgerer
+badgeringly
+badgerlike
+badgerly
+badgerweed
+badiaga
+badian
+badigeon
+badinage
+badious
+badland
+badlands
+badly
+badminton
+badness
+Badon
+Baduhenna
+bae
+Baedeker
+Baedekerian
+Baeria
+baetuli
+baetulus
+baetyl
+baetylic
+baetylus
+baetzner
+bafaro
+baff
+baffeta
+baffle
+bafflement
+baffler
+baffling
+bafflingly
+bafflingness
+baffy
+baft
+bafta
+Bafyot
+bag
+baga
+Baganda
+bagani
+bagasse
+bagataway
+bagatelle
+bagatine
+bagattini
+bagattino
+Bagaudae
+Bagdad
+Bagdi
+bagel
+bagful
+baggage
+baggageman
+baggagemaster
+baggager
+baggala
+bagganet
+Baggara
+bagged
+bagger
+baggie
+baggily
+bagginess
+bagging
+baggit
+baggy
+Bagheli
+baghouse
+Baginda
+Bagirmi
+bagleaves
+baglike
+bagmaker
+bagmaking
+bagman
+bagnio
+bagnut
+bago
+Bagobo
+bagonet
+bagpipe
+bagpiper
+bagpipes
+bagplant
+bagrationite
+bagre
+bagreef
+bagroom
+baguette
+bagwig
+bagwigged
+bagworm
+bagwyn
+bah
+Bahai
+Bahaism
+Bahaist
+Baham
+Bahama
+Bahamian
+bahan
+bahar
+Bahaullah
+bahawder
+bahay
+bahera
+bahiaite
+Bahima
+bahisti
+Bahmani
+Bahmanid
+bahnung
+baho
+bahoe
+bahoo
+baht
+Bahuma
+bahur
+bahut
+Bahutu
+bahuvrihi
+Baianism
+baidarka
+Baidya
+Baiera
+baiginet
+baignet
+baikalite
+baikerinite
+baikerite
+baikie
+bail
+bailable
+bailage
+bailee
+bailer
+bailey
+bailie
+bailiery
+bailieship
+bailiff
+bailiffry
+bailiffship
+bailiwick
+bailliage
+baillone
+Baillonella
+bailment
+bailor
+bailpiece
+bailsman
+bailwood
+bain
+bainie
+Baining
+baioc
+baiocchi
+baiocco
+bairagi
+Bairam
+bairn
+bairnie
+bairnish
+bairnishness
+bairnliness
+bairnly
+bairnteam
+bairntime
+bairnwort
+Bais
+Baisakh
+baister
+bait
+baiter
+baith
+baittle
+baitylos
+baize
+bajada
+bajan
+Bajardo
+bajarigar
+Bajau
+Bajocian
+bajra
+bajree
+bajri
+bajury
+baka
+Bakairi
+bakal
+Bakalai
+Bakalei
+Bakatan
+bake
+bakeboard
+baked
+bakehouse
+Bakelite
+bakelite
+bakelize
+baken
+bakeoven
+bakepan
+baker
+bakerdom
+bakeress
+bakerite
+bakerless
+bakerly
+bakership
+bakery
+bakeshop
+bakestone
+Bakhtiari
+bakie
+baking
+bakingly
+bakli
+Bakongo
+Bakshaish
+baksheesh
+baktun
+Baku
+baku
+Bakuba
+bakula
+Bakunda
+Bakuninism
+Bakuninist
+bakupari
+Bakutu
+Bakwiri
+Bal
+bal
+Bala
+Balaam
+Balaamite
+Balaamitical
+balachong
+balaclava
+baladine
+Balaena
+Balaenicipites
+balaenid
+Balaenidae
+balaenoid
+Balaenoidea
+balaenoidean
+Balaenoptera
+Balaenopteridae
+balafo
+balagan
+balaghat
+balai
+Balaic
+Balak
+Balaklava
+balalaika
+Balan
+balance
+balanceable
+balanced
+balancedness
+balancelle
+balanceman
+balancement
+balancer
+balancewise
+balancing
+balander
+balandra
+balandrana
+balaneutics
+balangay
+balanic
+balanid
+Balanidae
+balaniferous
+balanism
+balanite
+Balanites
+balanitis
+balanoblennorrhea
+balanocele
+Balanoglossida
+Balanoglossus
+balanoid
+Balanophora
+Balanophoraceae
+balanophoraceous
+balanophore
+balanophorin
+balanoplasty
+balanoposthitis
+balanopreputial
+Balanops
+Balanopsidaceae
+Balanopsidales
+balanorrhagia
+Balanta
+Balante
+balantidial
+balantidiasis
+balantidic
+balantidiosis
+Balantidium
+Balanus
+Balao
+balao
+Balarama
+balas
+balata
+balatong
+balatron
+balatronic
+balausta
+balaustine
+balaustre
+Balawa
+Balawu
+balboa
+balbriggan
+balbutiate
+balbutient
+balbuties
+balconet
+balconied
+balcony
+bald
+baldachin
+baldachined
+baldachini
+baldachino
+baldberry
+baldcrown
+balden
+balder
+balderdash
+baldhead
+baldicoot
+Baldie
+baldish
+baldling
+baldly
+baldmoney
+baldness
+baldpate
+baldrib
+baldric
+baldricked
+baldricwise
+balductum
+Baldwin
+baldy
+bale
+Balearian
+Balearic
+Balearica
+baleen
+balefire
+baleful
+balefully
+balefulness
+balei
+baleise
+baleless
+baler
+balete
+Bali
+bali
+balibago
+Balija
+Balilla
+baline
+Balinese
+balinger
+balinghasay
+balisaur
+balistarius
+Balistes
+balistid
+Balistidae
+balistraria
+balita
+balk
+Balkan
+Balkanic
+Balkanization
+Balkanize
+Balkar
+balker
+balkingly
+Balkis
+balky
+ball
+ballad
+ballade
+balladeer
+ballader
+balladeroyal
+balladic
+balladical
+balladier
+balladism
+balladist
+balladize
+balladlike
+balladling
+balladmonger
+balladmongering
+balladry
+balladwise
+ballahoo
+ballam
+ballan
+ballant
+ballast
+ballastage
+ballaster
+ballasting
+ballata
+ballate
+ballatoon
+balldom
+balled
+baller
+ballerina
+ballet
+balletic
+balletomane
+Ballhausplatz
+balli
+ballist
+ballista
+ballistae
+ballistic
+ballistically
+ballistician
+ballistics
+Ballistite
+ballistocardiograph
+ballium
+ballmine
+ballogan
+ballonet
+balloon
+balloonation
+ballooner
+balloonery
+balloonet
+balloonfish
+balloonflower
+balloonful
+ballooning
+balloonish
+balloonist
+balloonlike
+ballot
+Ballota
+ballotade
+ballotage
+balloter
+balloting
+ballotist
+ballottement
+ballow
+Ballplatz
+ballplayer
+ballproof
+ballroom
+ballstock
+ballup
+ballweed
+bally
+ballyhack
+ballyhoo
+ballyhooer
+ballywack
+ballywrack
+balm
+balmacaan
+Balmarcodes
+Balmawhapple
+balmily
+balminess
+balmlike
+balmony
+Balmoral
+balmy
+balneal
+balneary
+balneation
+balneatory
+balneographer
+balneography
+balneologic
+balneological
+balneologist
+balneology
+balneophysiology
+balneotechnics
+balneotherapeutics
+balneotherapia
+balneotherapy
+Balnibarbi
+Baloch
+Baloghia
+Balolo
+balonea
+baloney
+baloo
+Balopticon
+Balor
+Baloskion
+Baloskionaceae
+balow
+balsa
+balsam
+balsamation
+Balsamea
+Balsameaceae
+balsameaceous
+balsamer
+balsamic
+balsamical
+balsamically
+balsamiferous
+balsamina
+Balsaminaceae
+balsaminaceous
+balsamine
+balsamitic
+balsamiticness
+balsamize
+balsamo
+Balsamodendron
+Balsamorrhiza
+balsamous
+balsamroot
+balsamum
+balsamweed
+balsamy
+Balt
+baltei
+balter
+balteus
+Balthasar
+Balti
+Baltic
+Baltimore
+Baltimorean
+baltimorite
+Baltis
+balu
+Baluba
+Baluch
+Baluchi
+Baluchistan
+baluchithere
+baluchitheria
+Baluchitherium
+baluchitherium
+Baluga
+Balunda
+balushai
+baluster
+balustered
+balustrade
+balustraded
+balustrading
+balut
+balwarra
+balza
+Balzacian
+balzarine
+bam
+Bamalip
+Bamangwato
+bamban
+Bambara
+bambini
+bambino
+bambocciade
+bamboo
+bamboozle
+bamboozlement
+bamboozler
+Bambos
+bamboula
+Bambuba
+Bambusa
+Bambuseae
+Bambute
+bamoth
+Ban
+ban
+Bana
+banaba
+banago
+banak
+banakite
+banal
+banality
+banally
+banana
+Bananaland
+Bananalander
+Banande
+bananist
+bananivorous
+banat
+Banate
+banatite
+banausic
+Banba
+Banbury
+banc
+banca
+bancal
+banchi
+banco
+bancus
+band
+Banda
+banda
+bandage
+bandager
+bandagist
+bandaite
+bandaka
+bandala
+bandalore
+bandanna
+bandannaed
+bandar
+bandarlog
+bandbox
+bandboxical
+bandboxy
+bandcase
+bandcutter
+bande
+bandeau
+banded
+bandelet
+bander
+Banderma
+banderole
+bandersnatch
+bandfish
+bandhava
+bandhook
+Bandhor
+bandhu
+bandi
+bandicoot
+bandicoy
+bandie
+bandikai
+bandiness
+banding
+bandit
+banditism
+banditry
+banditti
+bandle
+bandless
+bandlessly
+bandlessness
+bandlet
+bandman
+bandmaster
+bando
+bandog
+bandoleer
+bandoleered
+bandoline
+bandonion
+Bandor
+bandore
+bandrol
+bandsman
+bandstand
+bandster
+bandstring
+Bandusia
+Bandusian
+bandwork
+bandy
+bandyball
+bandyman
+bane
+baneberry
+baneful
+banefully
+banefulness
+banewort
+Banff
+bang
+banga
+Bangala
+bangalay
+bangalow
+Bangash
+bangboard
+bange
+banger
+banghy
+Bangia
+Bangiaceae
+bangiaceous
+Bangiales
+banging
+bangkok
+bangle
+bangled
+bangling
+bangster
+bangtail
+Bangwaketsi
+bani
+banian
+banig
+banilad
+banish
+banisher
+banishment
+banister
+Baniva
+baniwa
+baniya
+banjo
+banjoist
+banjore
+banjorine
+banjuke
+bank
+bankable
+Bankalachi
+bankbook
+banked
+banker
+bankera
+bankerdom
+bankeress
+banket
+bankfull
+banking
+bankman
+bankrider
+bankrupt
+bankruptcy
+bankruptism
+bankruptlike
+bankruptly
+bankruptship
+bankrupture
+bankshall
+Banksia
+Banksian
+bankside
+banksman
+bankweed
+banky
+banner
+bannered
+bannerer
+banneret
+bannerfish
+bannerless
+bannerlike
+bannerman
+bannerol
+bannerwise
+bannet
+banning
+bannister
+Bannock
+bannock
+Bannockburn
+banns
+bannut
+banovina
+banquet
+banqueteer
+banqueteering
+banqueter
+banquette
+bansalague
+banshee
+banstickle
+bant
+Bantam
+bantam
+bantamize
+bantamweight
+bantay
+bantayan
+banteng
+banter
+banterer
+banteringly
+bantery
+Bantingism
+bantingize
+bantling
+Bantoid
+Bantu
+banty
+banuyo
+banxring
+banya
+Banyai
+banyan
+Banyoro
+Banyuls
+banzai
+baobab
+bap
+Baphia
+Baphomet
+Baphometic
+Baptanodon
+Baptisia
+baptisin
+baptism
+baptismal
+baptismally
+Baptist
+baptistery
+baptistic
+baptizable
+baptize
+baptizee
+baptizement
+baptizer
+Baptornis
+bar
+bara
+barabara
+barabora
+Barabra
+Baraca
+barad
+baragnosis
+baragouin
+baragouinish
+Baraithas
+barajillo
+Baralipton
+Baramika
+barandos
+barangay
+barasingha
+barathea
+barathra
+barathrum
+barauna
+barb
+Barbacoa
+Barbacoan
+barbacou
+Barbadian
+Barbados
+barbal
+barbaloin
+Barbara
+barbaralalia
+Barbarea
+barbaresque
+Barbarian
+barbarian
+barbarianism
+barbarianize
+barbaric
+barbarical
+barbarically
+barbarious
+barbariousness
+barbarism
+barbarity
+barbarization
+barbarize
+barbarous
+barbarously
+barbarousness
+Barbary
+barbary
+barbas
+barbasco
+barbastel
+barbate
+barbated
+barbatimao
+barbe
+barbecue
+barbed
+barbeiro
+barbel
+barbellate
+barbellula
+barbellulate
+barber
+barberess
+barberfish
+barberish
+barberry
+barbershop
+barbet
+barbette
+Barbeyaceae
+barbican
+barbicel
+barbigerous
+barbion
+barbital
+barbitalism
+barbiton
+barbitone
+barbitos
+barbiturate
+barbituric
+barbless
+barblet
+barbone
+barbotine
+Barbra
+barbudo
+Barbula
+barbulate
+barbule
+barbulyie
+barbwire
+Barcan
+barcarole
+barcella
+barcelona
+Barcoo
+bard
+bardane
+bardash
+bardcraft
+bardel
+Bardesanism
+Bardesanist
+Bardesanite
+bardess
+bardic
+bardie
+bardiglio
+bardily
+bardiness
+barding
+bardish
+bardism
+bardlet
+bardlike
+bardling
+bardo
+Bardolater
+Bardolatry
+Bardolph
+Bardolphian
+bardship
+Bardulph
+bardy
+Bare
+bare
+bareback
+barebacked
+bareboat
+barebone
+bareboned
+bareca
+barefaced
+barefacedly
+barefacedness
+barefit
+barefoot
+barefooted
+barehanded
+barehead
+bareheaded
+bareheadedness
+barelegged
+barely
+barenecked
+bareness
+barer
+baresark
+baresma
+baretta
+barff
+barfish
+barfly
+barful
+bargain
+bargainee
+bargainer
+bargainor
+bargainwise
+bargander
+barge
+bargeboard
+bargee
+bargeer
+bargeese
+bargehouse
+bargelike
+bargeload
+bargeman
+bargemaster
+barger
+bargh
+bargham
+barghest
+bargoose
+Bari
+bari
+baria
+baric
+barid
+barie
+barile
+barilla
+baring
+baris
+barish
+barit
+barite
+baritone
+barium
+bark
+barkbound
+barkcutter
+barkeeper
+barken
+barkentine
+barker
+barkery
+barkevikite
+barkevikitic
+barkey
+barkhan
+barking
+barkingly
+Barkinji
+barkle
+barkless
+barklyite
+barkometer
+barkpeel
+barkpeeler
+barkpeeling
+barksome
+barky
+barlafumble
+barlafummil
+barless
+barley
+barleybird
+barleybreak
+barleycorn
+barleyhood
+barleymow
+barleysick
+barling
+barlock
+barlow
+barm
+barmaid
+barman
+barmaster
+barmbrack
+barmcloth
+Barmecidal
+Barmecide
+barmkin
+barmote
+barmskin
+barmy
+barmybrained
+barn
+Barnabas
+Barnabite
+Barnaby
+barnacle
+Barnard
+barnard
+barnbrack
+Barnburner
+Barney
+barney
+barnful
+barnhardtite
+barnman
+barnstorm
+barnstormer
+barnstorming
+Barnumism
+Barnumize
+barny
+barnyard
+Baroco
+barocyclonometer
+barodynamic
+barodynamics
+barognosis
+barogram
+barograph
+barographic
+baroi
+barolo
+barology
+Barolong
+barometer
+barometric
+barometrical
+barometrically
+barometrograph
+barometrography
+barometry
+barometz
+baromotor
+baron
+baronage
+baroness
+baronet
+baronetage
+baronetcy
+baronethood
+baronetical
+baronetship
+barong
+Baronga
+baronial
+baronize
+baronry
+baronship
+barony
+Baroque
+baroque
+baroscope
+baroscopic
+baroscopical
+Barosma
+barosmin
+barotactic
+barotaxis
+barotaxy
+barothermograph
+barothermohygrograph
+baroto
+Barotse
+barouche
+barouchet
+Barouni
+baroxyton
+barpost
+barquantine
+barra
+barrabkie
+barrable
+barrabora
+barracan
+barrack
+barracker
+barraclade
+barracoon
+barracouta
+barracuda
+barrad
+barragan
+barrage
+barragon
+barramunda
+barramundi
+barranca
+barrandite
+barras
+barrator
+barratrous
+barratrously
+barratry
+barred
+barrel
+barrelage
+barreled
+barreler
+barrelet
+barrelful
+barrelhead
+barrelmaker
+barrelmaking
+barrelwise
+barren
+barrenly
+barrenness
+barrenwort
+barrer
+barret
+Barrett
+barrette
+barretter
+barricade
+barricader
+barricado
+barrico
+barrier
+barriguda
+barrigudo
+barrikin
+barriness
+barring
+Barrington
+Barringtonia
+Barrio
+barrio
+barrister
+barristerial
+barristership
+barristress
+barroom
+barrow
+barrowful
+Barrowist
+barrowman
+barrulee
+barrulet
+barrulety
+barruly
+Barry
+barry
+Barsac
+barse
+barsom
+Bart
+bartender
+bartending
+barter
+barterer
+barth
+barthite
+bartholinitis
+Bartholomean
+Bartholomew
+Bartholomewtide
+Bartholomite
+bartizan
+bartizaned
+Bartlemy
+Bartlett
+Barton
+barton
+Bartonella
+Bartonia
+Bartram
+Bartramia
+Bartramiaceae
+Bartramian
+Bartsia
+baru
+Baruch
+Barundi
+baruria
+barvel
+barwal
+barway
+barways
+barwise
+barwood
+barycenter
+barycentric
+barye
+baryecoia
+baryglossia
+barylalia
+barylite
+baryphonia
+baryphonic
+baryphony
+barysilite
+barysphere
+baryta
+barytes
+barythymia
+barytic
+barytine
+barytocalcite
+barytocelestine
+barytocelestite
+baryton
+barytone
+barytophyllite
+barytostrontianite
+barytosulphate
+bas
+basal
+basale
+basalia
+basally
+basalt
+basaltes
+basaltic
+basaltiform
+basaltine
+basaltoid
+basanite
+basaree
+Bascology
+bascule
+base
+baseball
+baseballdom
+baseballer
+baseboard
+baseborn
+basebred
+based
+basehearted
+baseheartedness
+baselard
+baseless
+baselessly
+baselessness
+baselike
+baseliner
+Basella
+Basellaceae
+basellaceous
+basely
+baseman
+basement
+basementward
+baseness
+basenji
+bases
+bash
+bashaw
+bashawdom
+bashawism
+bashawship
+bashful
+bashfully
+bashfulness
+Bashilange
+Bashkir
+bashlyk
+Bashmuric
+basial
+basialveolar
+basiarachnitis
+basiarachnoiditis
+basiate
+basiation
+Basibracteolate
+basibranchial
+basibranchiate
+basibregmatic
+basic
+basically
+basichromatic
+basichromatin
+basichromatinic
+basichromiole
+basicity
+basicranial
+basicytoparaplastin
+basidia
+basidial
+basidigital
+basidigitale
+basidiogenetic
+basidiolichen
+Basidiolichenes
+basidiomycete
+Basidiomycetes
+basidiomycetous
+basidiophore
+basidiospore
+basidiosporous
+basidium
+basidorsal
+basifacial
+basification
+basifier
+basifixed
+basifugal
+basify
+basigamous
+basigamy
+basigenic
+basigenous
+basiglandular
+basigynium
+basihyal
+basihyoid
+Basil
+basil
+basilar
+Basilarchia
+basilary
+basilateral
+basilemma
+basileus
+Basilian
+basilic
+Basilica
+basilica
+Basilicae
+basilical
+basilican
+basilicate
+basilicon
+Basilics
+Basilidian
+Basilidianism
+basilinna
+basiliscan
+basiliscine
+Basiliscus
+basilisk
+basilissa
+Basilosauridae
+Basilosaurus
+basilweed
+basilysis
+basilyst
+basimesostasis
+basin
+basinasal
+basinasial
+basined
+basinerved
+basinet
+basinlike
+basioccipital
+basion
+basiophitic
+basiophthalmite
+basiophthalmous
+basiotribe
+basiotripsy
+basiparachromatin
+basiparaplastin
+basipetal
+basiphobia
+basipodite
+basipoditic
+basipterygial
+basipterygium
+basipterygoid
+basiradial
+basirhinal
+basirostral
+basis
+basiscopic
+basisphenoid
+basisphenoidal
+basitemporal
+basiventral
+basivertebral
+bask
+basker
+Baskerville
+basket
+basketball
+basketballer
+basketful
+basketing
+basketmaker
+basketmaking
+basketry
+basketware
+basketwoman
+basketwood
+basketwork
+basketworm
+Baskish
+Baskonize
+Basoche
+Basoga
+basoid
+Basoko
+Basommatophora
+basommatophorous
+bason
+Basongo
+basophile
+basophilia
+basophilic
+basophilous
+basophobia
+basos
+basote
+Basque
+basque
+basqued
+basquine
+bass
+Bassa
+Bassalia
+Bassalian
+bassan
+bassanello
+bassanite
+bassara
+bassarid
+Bassaris
+Bassariscus
+bassarisk
+basset
+bassetite
+bassetta
+Bassia
+bassie
+bassine
+bassinet
+bassist
+bassness
+basso
+bassoon
+bassoonist
+bassorin
+bassus
+basswood
+Bast
+bast
+basta
+Bastaard
+Bastard
+bastard
+bastardism
+bastardization
+bastardize
+bastardliness
+bastardly
+bastardy
+baste
+basten
+baster
+bastide
+bastille
+bastinade
+bastinado
+basting
+bastion
+bastionary
+bastioned
+bastionet
+bastite
+bastnasite
+basto
+baston
+basurale
+Basuto
+Bat
+bat
+bataan
+batad
+Batak
+batakan
+bataleur
+Batan
+batara
+batata
+Batatas
+batatilla
+Batavi
+Batavian
+batch
+batcher
+bate
+batea
+bateau
+bateaux
+bated
+Batekes
+batel
+bateman
+batement
+bater
+Batetela
+batfish
+batfowl
+batfowler
+batfowling
+Bath
+bath
+Bathala
+bathe
+batheable
+bather
+bathetic
+bathflower
+bathhouse
+bathic
+bathing
+bathless
+bathman
+bathmic
+bathmism
+bathmotropic
+bathmotropism
+bathochromatic
+bathochromatism
+bathochrome
+bathochromic
+bathochromy
+bathoflore
+bathofloric
+batholite
+batholith
+batholithic
+batholitic
+bathometer
+Bathonian
+bathophobia
+bathorse
+bathos
+bathrobe
+bathroom
+bathroomed
+bathroot
+bathtub
+bathukolpian
+bathukolpic
+bathvillite
+bathwort
+bathyal
+bathyanesthesia
+bathybian
+bathybic
+bathybius
+bathycentesis
+bathychrome
+bathycolpian
+bathycolpic
+bathycurrent
+bathyesthesia
+bathygraphic
+bathyhyperesthesia
+bathyhypesthesia
+bathylimnetic
+bathylite
+bathylith
+bathylithic
+bathylitic
+bathymeter
+bathymetric
+bathymetrical
+bathymetrically
+bathymetry
+bathyorographical
+bathypelagic
+bathyplankton
+bathyseism
+bathysmal
+bathysophic
+bathysophical
+bathysphere
+bathythermograph
+Batidaceae
+batidaceous
+batik
+batiker
+batikulin
+batikuling
+bating
+batino
+Batis
+batiste
+batitinan
+batlan
+batlike
+batling
+batlon
+batman
+Batocrinidae
+Batocrinus
+Batodendron
+batoid
+Batoidei
+Batoka
+baton
+Batonga
+batonistic
+batonne
+batophobia
+Batrachia
+batrachian
+batrachiate
+Batrachidae
+Batrachium
+batrachoid
+Batrachoididae
+batrachophagous
+Batrachophidia
+batrachophobia
+batrachoplasty
+Batrachospermum
+bats
+batsman
+batsmanship
+batster
+batswing
+batt
+Batta
+batta
+battailous
+Battak
+Battakhin
+battalia
+battalion
+battarism
+battarismus
+battel
+batteler
+batten
+battener
+battening
+batter
+batterable
+battercake
+batterdock
+battered
+batterer
+batterfang
+batteried
+batterman
+battery
+batteryman
+battik
+batting
+battish
+battle
+battled
+battledore
+battlefield
+battleful
+battleground
+battlement
+battlemented
+battleplane
+battler
+battleship
+battlesome
+battlestead
+battlewagon
+battleward
+battlewise
+battological
+battologist
+battologize
+battology
+battue
+batty
+batukite
+batule
+Batussi
+Batwa
+batwing
+batyphone
+batz
+batzen
+bauble
+baublery
+baubling
+Baubo
+bauch
+bauchle
+bauckie
+bauckiebird
+baud
+baudekin
+baudrons
+Bauera
+Bauhinia
+baul
+bauleah
+Baume
+baumhauerite
+baun
+bauno
+Baure
+bauson
+bausond
+bauta
+bauxite
+bauxitite
+Bavarian
+bavaroy
+bavary
+bavenite
+baviaantje
+Bavian
+bavian
+baviere
+bavin
+Bavius
+bavoso
+baw
+bawarchi
+bawbee
+bawcock
+bawd
+bawdily
+bawdiness
+bawdry
+bawdship
+bawdyhouse
+bawl
+bawler
+bawley
+bawn
+Bawra
+bawtie
+baxter
+Baxterian
+Baxterianism
+baxtone
+bay
+Baya
+baya
+bayadere
+bayal
+bayamo
+Bayard
+bayard
+bayardly
+bayberry
+baybolt
+baybush
+baycuru
+bayed
+bayeta
+baygall
+bayhead
+bayish
+bayldonite
+baylet
+baylike
+bayman
+bayness
+Bayogoula
+bayok
+bayonet
+bayoneted
+bayoneteer
+bayou
+baywood
+bazaar
+baze
+Bazigar
+bazoo
+bazooka
+bazzite
+bdellid
+Bdellidae
+bdellium
+bdelloid
+Bdelloida
+Bdellostoma
+Bdellostomatidae
+Bdellostomidae
+bdellotomy
+Bdelloura
+Bdellouridae
+be
+Bea
+beach
+beachcomb
+beachcomber
+beachcombing
+beached
+beachhead
+beachlamar
+beachless
+beachman
+beachmaster
+beachward
+beachy
+beacon
+beaconage
+beaconless
+beaconwise
+bead
+beaded
+beader
+beadflush
+beadhouse
+beadily
+beadiness
+beading
+beadle
+beadledom
+beadlehood
+beadleism
+beadlery
+beadleship
+beadlet
+beadlike
+beadman
+beadroll
+beadrow
+beadsman
+beadswoman
+beadwork
+beady
+Beagle
+beagle
+beagling
+beak
+beaked
+beaker
+beakerful
+beakerman
+beakermen
+beakful
+beakhead
+beakiron
+beaklike
+beaky
+beal
+beala
+bealing
+beallach
+bealtared
+Bealtine
+Bealtuinn
+beam
+beamage
+beambird
+beamed
+beamer
+beamfilling
+beamful
+beamhouse
+beamily
+beaminess
+beaming
+beamingly
+beamish
+beamless
+beamlet
+beamlike
+beamman
+beamsman
+beamster
+beamwork
+beamy
+bean
+beanbag
+beanbags
+beancod
+beanery
+beanfeast
+beanfeaster
+beanfield
+beanie
+beano
+beansetter
+beanshooter
+beanstalk
+beant
+beanweed
+beany
+beaproned
+bear
+bearable
+bearableness
+bearably
+bearance
+bearbaiter
+bearbaiting
+bearbane
+bearberry
+bearbind
+bearbine
+bearcoot
+beard
+bearded
+bearder
+beardie
+bearding
+beardless
+beardlessness
+beardom
+beardtongue
+beardy
+bearer
+bearess
+bearfoot
+bearherd
+bearhide
+bearhound
+bearing
+bearish
+bearishly
+bearishness
+bearlet
+bearlike
+bearm
+bearship
+bearskin
+beartongue
+bearward
+bearwood
+bearwort
+beast
+beastbane
+beastdom
+beasthood
+beastie
+beastily
+beastish
+beastishness
+beastlike
+beastlily
+beastliness
+beastling
+beastlings
+beastly
+beastman
+beastship
+beat
+Beata
+beata
+beatable
+beatae
+beatee
+beaten
+beater
+beaterman
+beath
+beatific
+beatifical
+beatifically
+beatificate
+beatification
+beatify
+beatinest
+beating
+beatitude
+Beatrice
+Beatrix
+beatster
+beatus
+beau
+Beauclerc
+beaufin
+Beaufort
+beauish
+beauism
+Beaujolais
+Beaumontia
+Beaune
+beaupere
+beauseant
+beauship
+beauteous
+beauteously
+beauteousness
+beauti
+beautician
+beautied
+beautification
+beautifier
+beautiful
+beautifully
+beautifulness
+beautify
+beautihood
+beauty
+beautydom
+beautyship
+beaux
+beaver
+Beaverboard
+beaverboard
+beavered
+beaverette
+beaverish
+beaverism
+beaverite
+beaverize
+Beaverkill
+beaverkin
+beaverlike
+beaverpelt
+beaverroot
+beaverteen
+beaverwood
+beavery
+beback
+bebait
+beballed
+bebang
+bebannered
+bebar
+bebaron
+bebaste
+bebat
+bebathe
+bebatter
+bebay
+bebeast
+bebed
+bebeerine
+bebeeru
+bebelted
+bebilya
+bebite
+bebization
+beblain
+beblear
+bebled
+bebless
+beblister
+beblood
+bebloom
+beblotch
+beblubber
+bebog
+bebop
+beboss
+bebotch
+bebothered
+bebouldered
+bebrave
+bebreech
+bebrine
+bebrother
+bebrush
+bebump
+bebusy
+bebuttoned
+becall
+becalm
+becalmment
+becap
+becard
+becarpet
+becarve
+becassocked
+becater
+because
+beccafico
+becense
+bechained
+bechalk
+bechance
+becharm
+bechase
+bechatter
+bechauffeur
+becheck
+becher
+bechern
+bechignoned
+bechirp
+Bechtler
+Bechuana
+becircled
+becivet
+Beck
+beck
+beckelite
+becker
+becket
+Beckie
+beckiron
+beckon
+beckoner
+beckoning
+beckoningly
+Becky
+beclad
+beclamor
+beclamour
+beclang
+beclart
+beclasp
+beclatter
+beclaw
+becloak
+beclog
+beclothe
+becloud
+beclout
+beclown
+becluster
+becobweb
+becoiffed
+becollier
+becolme
+becolor
+becombed
+become
+becomes
+becoming
+becomingly
+becomingness
+becomma
+becompass
+becompliment
+becoom
+becoresh
+becost
+becousined
+becovet
+becoward
+becquerelite
+becram
+becramp
+becrampon
+becrawl
+becreep
+becrime
+becrimson
+becrinolined
+becripple
+becroak
+becross
+becrowd
+becrown
+becrush
+becrust
+becry
+becudgel
+becuffed
+becuiba
+becumber
+becuna
+becurl
+becurry
+becurse
+becurtained
+becushioned
+becut
+bed
+bedabble
+bedad
+bedaggered
+bedamn
+bedamp
+bedangled
+bedare
+bedark
+bedarken
+bedash
+bedaub
+bedawn
+beday
+bedaze
+bedazement
+bedazzle
+bedazzlement
+bedazzling
+bedazzlingly
+bedboard
+bedbug
+bedcap
+bedcase
+bedchair
+bedchamber
+bedclothes
+bedcord
+bedcover
+bedded
+bedder
+bedding
+bedead
+bedeaf
+bedeafen
+bedebt
+bedeck
+bedecorate
+bedeguar
+bedel
+beden
+bedene
+bedesman
+bedevil
+bedevilment
+bedew
+bedewer
+bedewoman
+bedfast
+bedfellow
+bedfellowship
+bedflower
+bedfoot
+Bedford
+bedframe
+bedgery
+bedgoer
+bedgown
+bediademed
+bediamonded
+bediaper
+bedight
+bedikah
+bedim
+bedimple
+bedin
+bedip
+bedirt
+bedirter
+bedirty
+bedismal
+bedizen
+bedizenment
+bedkey
+bedlam
+bedlamer
+Bedlamic
+bedlamism
+bedlamite
+bedlamitish
+bedlamize
+bedlar
+bedless
+bedlids
+bedmaker
+bedmaking
+bedman
+bedmate
+bedoctor
+bedog
+bedolt
+bedot
+bedote
+Bedouin
+Bedouinism
+bedouse
+bedown
+bedoyo
+bedpan
+bedplate
+bedpost
+bedquilt
+bedrabble
+bedraggle
+bedragglement
+bedrail
+bedral
+bedrape
+bedravel
+bedrench
+bedress
+bedribble
+bedrid
+bedridden
+bedriddenness
+bedrift
+bedright
+bedrip
+bedrivel
+bedrizzle
+bedrock
+bedroll
+bedroom
+bedrop
+bedrown
+bedrowse
+bedrug
+bedscrew
+bedsick
+bedside
+bedsite
+bedsock
+bedsore
+bedspread
+bedspring
+bedstaff
+bedstand
+bedstaves
+bedstead
+bedstock
+bedstraw
+bedstring
+bedtick
+bedticking
+bedtime
+bedub
+beduchess
+beduck
+beduke
+bedull
+bedumb
+bedunce
+bedunch
+bedung
+bedur
+bedusk
+bedust
+bedwarf
+bedway
+bedways
+bedwell
+bedye
+Bee
+bee
+beearn
+beebread
+beech
+beechdrops
+beechen
+beechnut
+beechwood
+beechwoods
+beechy
+beedged
+beedom
+beef
+beefeater
+beefer
+beefhead
+beefheaded
+beefily
+beefin
+beefiness
+beefish
+beefishness
+beefless
+beeflower
+beefsteak
+beeftongue
+beefwood
+beefy
+beegerite
+beehead
+beeheaded
+beeherd
+beehive
+beehouse
+beeish
+beeishness
+beek
+beekeeper
+beekeeping
+beekite
+Beekmantown
+beelbow
+beelike
+beeline
+beelol
+Beelzebub
+Beelzebubian
+Beelzebul
+beeman
+beemaster
+been
+beennut
+beer
+beerage
+beerbachite
+beerbibber
+beerhouse
+beerily
+beeriness
+beerish
+beerishly
+beermaker
+beermaking
+beermonger
+beerocracy
+Beerothite
+beerpull
+beery
+bees
+beest
+beestings
+beeswax
+beeswing
+beeswinged
+beet
+beeth
+Beethovenian
+Beethovenish
+Beethovian
+beetle
+beetled
+beetlehead
+beetleheaded
+beetler
+beetlestock
+beetlestone
+beetleweed
+beetmister
+beetrave
+beetroot
+beetrooty
+beety
+beeve
+beevish
+beeware
+beeway
+beeweed
+beewise
+beewort
+befall
+befame
+befamilied
+befamine
+befan
+befancy
+befanned
+befathered
+befavor
+befavour
+befeather
+beferned
+befetished
+befetter
+befezzed
+befiddle
+befilch
+befile
+befilleted
+befilmed
+befilth
+befinger
+befire
+befist
+befit
+befitting
+befittingly
+befittingness
+beflag
+beflannel
+beflap
+beflatter
+beflea
+befleck
+beflounce
+beflour
+beflout
+beflower
+beflum
+befluster
+befoam
+befog
+befool
+befoolment
+befop
+before
+beforehand
+beforeness
+beforested
+beforetime
+beforetimes
+befortune
+befoul
+befouler
+befoulment
+befountained
+befraught
+befreckle
+befreeze
+befreight
+befret
+befriend
+befriender
+befriendment
+befrill
+befringe
+befriz
+befrocked
+befrogged
+befrounce
+befrumple
+befuddle
+befuddlement
+befuddler
+befume
+befurbelowed
+befurred
+beg
+begabled
+begad
+begall
+begani
+begar
+begari
+begarlanded
+begarnish
+begartered
+begash
+begat
+begaud
+begaudy
+begay
+begaze
+begeck
+begem
+beget
+begettal
+begetter
+beggable
+beggar
+beggardom
+beggarer
+beggaress
+beggarhood
+beggarism
+beggarlike
+beggarliness
+beggarly
+beggarman
+beggarweed
+beggarwise
+beggarwoman
+beggary
+Beggiatoa
+Beggiatoaceae
+beggiatoaceous
+begging
+beggingly
+beggingwise
+Beghard
+begift
+begiggle
+begild
+begin
+beginger
+beginner
+beginning
+begird
+begirdle
+beglad
+beglamour
+beglare
+beglerbeg
+beglerbeglic
+beglerbegluc
+beglerbegship
+beglerbey
+beglic
+beglide
+beglitter
+beglobed
+begloom
+begloze
+begluc
+beglue
+begnaw
+bego
+begob
+begobs
+begoggled
+begohm
+begone
+begonia
+Begoniaceae
+begoniaceous
+Begoniales
+begorra
+begorry
+begotten
+begottenness
+begoud
+begowk
+begowned
+begrace
+begrain
+begrave
+begray
+begrease
+begreen
+begrett
+begrim
+begrime
+begrimer
+begroan
+begrown
+begrudge
+begrudgingly
+begruntle
+begrutch
+begrutten
+beguard
+beguess
+beguile
+beguileful
+beguilement
+beguiler
+beguiling
+beguilingly
+Beguin
+Beguine
+beguine
+begulf
+begum
+begun
+begunk
+begut
+behale
+behalf
+behallow
+behammer
+behap
+behatted
+behave
+behavior
+behavioral
+behaviored
+behaviorism
+behaviorist
+behavioristic
+behavioristically
+behead
+beheadal
+beheader
+beheadlined
+behear
+behears
+behearse
+behedge
+beheld
+behelp
+behemoth
+behen
+behenate
+behenic
+behest
+behind
+behinder
+behindhand
+behindsight
+behint
+behn
+behold
+beholdable
+beholden
+beholder
+beholding
+beholdingness
+behoney
+behoof
+behooped
+behoot
+behoove
+behooveful
+behoovefully
+behoovefulness
+behooves
+behooving
+behoovingly
+behorn
+behorror
+behowl
+behung
+behusband
+behymn
+behypocrite
+beice
+Beid
+beige
+being
+beingless
+beingness
+beinked
+beira
+beisa
+Beja
+bejabers
+bejade
+bejan
+bejant
+bejaundice
+bejazz
+bejel
+bejewel
+bejezebel
+bejig
+bejuggle
+bejumble
+bekah
+bekerchief
+bekick
+bekilted
+beking
+bekinkinite
+bekiss
+bekko
+beknave
+beknight
+beknit
+beknived
+beknotted
+beknottedly
+beknottedness
+beknow
+beknown
+Bel
+bel
+bela
+belabor
+belaced
+beladle
+belady
+belage
+belah
+Belait
+Belaites
+belam
+Belamcanda
+belanda
+belar
+belard
+belash
+belate
+belated
+belatedly
+belatedness
+belatticed
+belaud
+belauder
+belavendered
+belay
+belayer
+belch
+belcher
+beld
+beldam
+beldamship
+belderroot
+belduque
+beleaf
+beleaguer
+beleaguerer
+beleaguerment
+beleap
+beleave
+belecture
+beledgered
+belee
+belemnid
+belemnite
+Belemnites
+belemnitic
+Belemnitidae
+belemnoid
+Belemnoidea
+beletter
+belfried
+belfry
+belga
+Belgae
+Belgian
+Belgic
+Belgophile
+Belgrade
+Belgravia
+Belgravian
+Belial
+Belialic
+Belialist
+belibel
+belick
+belie
+belief
+beliefful
+belieffulness
+beliefless
+belier
+believability
+believable
+believableness
+believe
+believer
+believing
+believingly
+belight
+beliked
+Belili
+belimousined
+Belinda
+Belinuridae
+Belinurus
+belion
+beliquor
+Belis
+belite
+belitter
+belittle
+belittlement
+belittler
+belive
+bell
+Bella
+Bellabella
+Bellacoola
+belladonna
+bellarmine
+Bellatrix
+bellbind
+bellbird
+bellbottle
+bellboy
+belle
+belled
+belledom
+Belleek
+bellehood
+belleric
+Bellerophon
+Bellerophontidae
+belletrist
+belletristic
+bellflower
+bellhanger
+bellhanging
+bellhop
+bellhouse
+bellicism
+bellicose
+bellicosely
+bellicoseness
+bellicosity
+bellied
+belliferous
+belligerence
+belligerency
+belligerent
+belligerently
+belling
+bellipotent
+Bellis
+bellite
+bellmaker
+bellmaking
+bellman
+bellmanship
+bellmaster
+bellmouth
+bellmouthed
+Bellona
+Bellonian
+bellonion
+bellote
+Bellovaci
+bellow
+bellower
+bellows
+bellowsful
+bellowslike
+bellowsmaker
+bellowsmaking
+bellowsman
+bellpull
+belltail
+belltopper
+belltopperdom
+bellware
+bellwaver
+bellweed
+bellwether
+bellwind
+bellwine
+bellwood
+bellwort
+belly
+bellyache
+bellyband
+bellyer
+bellyfish
+bellyflaught
+bellyful
+bellying
+bellyland
+bellylike
+bellyman
+bellypiece
+bellypinch
+beloam
+beloeilite
+beloid
+belomancy
+Belone
+belonesite
+belong
+belonger
+belonging
+belonid
+Belonidae
+belonite
+belonoid
+belonosphaerite
+belord
+Belostoma
+Belostomatidae
+Belostomidae
+belout
+belove
+beloved
+below
+belowstairs
+belozenged
+Belshazzar
+Belshazzaresque
+belsire
+belt
+Beltane
+belted
+Beltene
+belter
+Beltian
+beltie
+beltine
+belting
+Beltir
+Beltis
+beltmaker
+beltmaking
+beltman
+belton
+beltwise
+Beluchi
+Belucki
+beluga
+belugite
+belute
+belve
+belvedere
+Belverdian
+bely
+belying
+belyingly
+belzebuth
+bema
+bemad
+bemadam
+bemaddening
+bemail
+bemaim
+bemajesty
+beman
+bemangle
+bemantle
+bemar
+bemartyr
+bemask
+bemaster
+bemat
+bemata
+bemaul
+bemazed
+Bemba
+Bembecidae
+Bembex
+bemeal
+bemean
+bemedaled
+bemedalled
+bementite
+bemercy
+bemingle
+beminstrel
+bemire
+bemirement
+bemirror
+bemirrorment
+bemist
+bemistress
+bemitered
+bemitred
+bemix
+bemoan
+bemoanable
+bemoaner
+bemoaning
+bemoaningly
+bemoat
+bemock
+bemoil
+bemoisten
+bemole
+bemolt
+bemonster
+bemoon
+bemotto
+bemoult
+bemouth
+bemuck
+bemud
+bemuddle
+bemuddlement
+bemuddy
+bemuffle
+bemurmur
+bemuse
+bemused
+bemusedly
+bemusement
+bemusk
+bemuslined
+bemuzzle
+Ben
+ben
+bena
+benab
+Benacus
+bename
+benami
+benamidar
+benasty
+benben
+bench
+benchboard
+bencher
+benchership
+benchfellow
+benchful
+benching
+benchland
+benchlet
+benchman
+benchwork
+benchy
+bencite
+bend
+benda
+bendability
+bendable
+bended
+bender
+bending
+bendingly
+bendlet
+bendsome
+bendwise
+bendy
+bene
+beneaped
+beneath
+beneception
+beneceptive
+beneceptor
+benedicite
+Benedict
+benedict
+Benedicta
+Benedictine
+Benedictinism
+benediction
+benedictional
+benedictionary
+benedictive
+benedictively
+benedictory
+Benedictus
+benedight
+benefaction
+benefactive
+benefactor
+benefactorship
+benefactory
+benefactress
+benefic
+benefice
+beneficed
+beneficeless
+beneficence
+beneficent
+beneficential
+beneficently
+beneficial
+beneficially
+beneficialness
+beneficiary
+beneficiaryship
+beneficiate
+beneficiation
+benefit
+benefiter
+beneighbored
+Benelux
+benempt
+benempted
+beneplacito
+benet
+Benetnasch
+benettle
+Beneventan
+Beneventana
+benevolence
+benevolent
+benevolently
+benevolentness
+benevolist
+beng
+Bengal
+Bengalese
+Bengali
+Bengalic
+bengaline
+Bengola
+Beni
+beni
+benight
+benighted
+benightedness
+benighten
+benighter
+benightmare
+benightment
+benign
+benignancy
+benignant
+benignantly
+benignity
+benignly
+Benin
+Benincasa
+benison
+benitoite
+benj
+Benjamin
+benjamin
+benjaminite
+Benjamite
+Benjy
+benjy
+Benkulen
+benmost
+benn
+benne
+bennel
+Bennet
+bennet
+Bennettitaceae
+bennettitaceous
+Bennettitales
+Bennettites
+bennetweed
+Benny
+benny
+beno
+benorth
+benote
+bensel
+bensh
+benshea
+benshee
+benshi
+Benson
+bent
+bentang
+benthal
+Benthamic
+Benthamism
+Benthamite
+benthic
+benthon
+benthonic
+benthos
+Bentincks
+bentiness
+benting
+Benton
+bentonite
+bentstar
+bentwood
+benty
+Benu
+benumb
+benumbed
+benumbedness
+benumbing
+benumbingly
+benumbment
+benward
+benweed
+benzacridine
+benzal
+benzalacetone
+benzalacetophenone
+benzalaniline
+benzalazine
+benzalcohol
+benzalcyanhydrin
+benzaldehyde
+benzaldiphenyl
+benzaldoxime
+benzalethylamine
+benzalhydrazine
+benzalphenylhydrazone
+benzalphthalide
+benzamide
+benzamido
+benzamine
+benzaminic
+benzamino
+benzanalgen
+benzanilide
+benzanthrone
+benzantialdoxime
+benzazide
+benzazimide
+benzazine
+benzazole
+benzbitriazole
+benzdiazine
+benzdifuran
+benzdioxazine
+benzdioxdiazine
+benzdioxtriazine
+Benzedrine
+benzein
+benzene
+benzenediazonium
+benzenoid
+benzenyl
+benzhydrol
+benzhydroxamic
+benzidine
+benzidino
+benzil
+benzilic
+benzimidazole
+benziminazole
+benzinduline
+benzine
+benzo
+benzoate
+benzoated
+benzoazurine
+benzobis
+benzocaine
+benzocoumaran
+benzodiazine
+benzodiazole
+benzoflavine
+benzofluorene
+benzofulvene
+benzofuran
+benzofuroquinoxaline
+benzofuryl
+benzoglycolic
+benzoglyoxaline
+benzohydrol
+benzoic
+benzoid
+benzoin
+benzoinated
+benzoiodohydrin
+benzol
+benzolate
+benzole
+benzolize
+benzomorpholine
+benzonaphthol
+benzonitrile
+benzonitrol
+benzoperoxide
+benzophenanthrazine
+benzophenanthroline
+benzophenazine
+benzophenol
+benzophenone
+benzophenothiazine
+benzophenoxazine
+benzophloroglucinol
+benzophosphinic
+benzophthalazine
+benzopinacone
+benzopyran
+benzopyranyl
+benzopyrazolone
+benzopyrylium
+benzoquinoline
+benzoquinone
+benzoquinoxaline
+benzosulphimide
+benzotetrazine
+benzotetrazole
+benzothiazine
+benzothiazole
+benzothiazoline
+benzothiodiazole
+benzothiofuran
+benzothiophene
+benzothiopyran
+benzotoluide
+benzotriazine
+benzotriazole
+benzotrichloride
+benzotrifuran
+benzoxate
+benzoxy
+benzoxyacetic
+benzoxycamphor
+benzoxyphenanthrene
+benzoyl
+benzoylate
+benzoylation
+benzoylformic
+benzoylglycine
+benzpinacone
+benzthiophen
+benztrioxazine
+benzyl
+benzylamine
+benzylic
+benzylidene
+benzylpenicillin
+beode
+Beothuk
+Beothukan
+Beowulf
+bepaid
+Bepaint
+bepale
+bepaper
+beparch
+beparody
+beparse
+bepart
+bepaste
+bepastured
+bepat
+bepatched
+bepaw
+bepearl
+bepelt
+bepen
+bepepper
+beperiwigged
+bepester
+bepewed
+bephilter
+bephrase
+bepicture
+bepiece
+bepierce
+bepile
+bepill
+bepillared
+bepimple
+bepinch
+bepistoled
+bepity
+beplague
+beplaided
+beplaster
+beplumed
+bepommel
+bepowder
+bepraise
+bepraisement
+bepraiser
+beprank
+bepray
+bepreach
+bepress
+bepretty
+bepride
+beprose
+bepuddle
+bepuff
+bepun
+bepurple
+bepuzzle
+bepuzzlement
+bequalm
+bequeath
+bequeathable
+bequeathal
+bequeather
+bequeathment
+bequest
+bequirtle
+bequote
+ber
+berain
+berairou
+berakah
+berake
+berakoth
+berapt
+berascal
+berat
+berate
+berattle
+beraunite
+beray
+berbamine
+Berber
+Berberi
+Berberian
+berberid
+Berberidaceae
+berberidaceous
+berberine
+Berberis
+berberry
+Berchemia
+Berchta
+berdache
+bere
+Berean
+bereason
+bereave
+bereavement
+bereaven
+bereaver
+bereft
+berend
+Berengaria
+Berengarian
+Berengarianism
+berengelite
+Berenice
+Bereshith
+beresite
+beret
+berewick
+berg
+bergalith
+Bergama
+Bergamask
+bergamiol
+Bergamo
+Bergamot
+bergamot
+bergander
+bergaptene
+berger
+berghaan
+berginization
+berginize
+berglet
+bergschrund
+Bergsonian
+Bergsonism
+bergut
+bergy
+bergylt
+berhyme
+Beri
+beribanded
+beribboned
+beriberi
+beriberic
+beride
+berigora
+beringed
+beringite
+beringleted
+berinse
+berith
+Berkeleian
+Berkeleianism
+Berkeleyism
+Berkeleyite
+berkelium
+berkovets
+berkowitz
+Berkshire
+berley
+berlin
+berline
+Berliner
+berlinite
+Berlinize
+berm
+Bermuda
+Bermudian
+bermudite
+Bern
+Bernard
+Bernardina
+Bernardine
+berne
+Bernese
+Bernice
+Bernicia
+bernicle
+Bernie
+Berninesque
+Bernoullian
+berobed
+Beroe
+Beroida
+Beroidae
+beroll
+Berossos
+berouged
+beround
+berrendo
+berret
+berri
+berried
+berrier
+berrigan
+berrugate
+berry
+berrybush
+berryless
+berrylike
+berrypicker
+berrypicking
+berseem
+berserk
+berserker
+Bersiamite
+Bersil
+Bert
+Bertat
+Berteroa
+berth
+Bertha
+berthage
+berthed
+berther
+berthierite
+berthing
+Berthold
+Bertholletia
+Bertie
+Bertolonia
+Bertram
+bertram
+Bertrand
+bertrandite
+bertrum
+beruffed
+beruffled
+berust
+bervie
+berycid
+Berycidae
+beryciform
+berycine
+berycoid
+Berycoidea
+berycoidean
+Berycoidei
+Berycomorphi
+beryl
+berylate
+beryllia
+berylline
+berylliosis
+beryllium
+berylloid
+beryllonate
+beryllonite
+beryllosis
+Berytidae
+Beryx
+berzelianite
+berzeliite
+bes
+besa
+besagne
+besaiel
+besaint
+besan
+besanctify
+besauce
+bescab
+bescarf
+bescatter
+bescent
+bescorch
+bescorn
+bescoundrel
+bescour
+bescourge
+bescramble
+bescrape
+bescratch
+bescrawl
+bescreen
+bescribble
+bescurf
+bescurvy
+bescutcheon
+beseam
+besee
+beseech
+beseecher
+beseeching
+beseechingly
+beseechingness
+beseechment
+beseem
+beseeming
+beseemingly
+beseemingness
+beseemliness
+beseemly
+beseen
+beset
+besetment
+besetter
+besetting
+beshackle
+beshade
+beshadow
+beshag
+beshake
+beshame
+beshawled
+beshear
+beshell
+beshield
+beshine
+beshiver
+beshlik
+beshod
+beshout
+beshow
+beshower
+beshrew
+beshriek
+beshrivel
+beshroud
+besiclometer
+beside
+besides
+besiege
+besieged
+besiegement
+besieger
+besieging
+besiegingly
+besigh
+besilver
+besin
+besing
+besiren
+besit
+beslab
+beslap
+beslash
+beslave
+beslaver
+besleeve
+beslime
+beslimer
+beslings
+beslipper
+beslobber
+beslow
+beslubber
+beslur
+beslushed
+besmear
+besmearer
+besmell
+besmile
+besmirch
+besmircher
+besmirchment
+besmoke
+besmooth
+besmother
+besmouch
+besmudge
+besmut
+besmutch
+besnare
+besneer
+besnivel
+besnow
+besnuff
+besodden
+besogne
+besognier
+besoil
+besom
+besomer
+besonnet
+besoot
+besoothe
+besoothement
+besot
+besotment
+besotted
+besottedly
+besottedness
+besotting
+besottingly
+besought
+besoul
+besour
+bespangle
+bespate
+bespatter
+bespatterer
+bespatterment
+bespawl
+bespeak
+bespeakable
+bespeaker
+bespecked
+bespeckle
+bespecklement
+bespectacled
+besped
+bespeech
+bespeed
+bespell
+bespelled
+bespend
+bespete
+bespew
+bespice
+bespill
+bespin
+bespirit
+bespit
+besplash
+besplatter
+besplit
+bespoke
+bespoken
+bespot
+bespottedness
+bespouse
+bespout
+bespray
+bespread
+besprent
+besprinkle
+besprinkler
+bespurred
+besputter
+bespy
+besqueeze
+besquib
+besra
+Bess
+Bessarabian
+Besselian
+Bessemer
+bessemer
+Bessemerize
+bessemerize
+Bessera
+Bessi
+Bessie
+Bessy
+best
+bestab
+bestain
+bestamp
+bestar
+bestare
+bestarve
+bestatued
+bestay
+bestayed
+bestead
+besteer
+bestench
+bester
+bestial
+bestialism
+bestialist
+bestiality
+bestialize
+bestially
+bestiarian
+bestiarianism
+bestiary
+bestick
+bestill
+bestink
+bestir
+bestness
+bestock
+bestore
+bestorm
+bestove
+bestow
+bestowable
+bestowage
+bestowal
+bestower
+bestowing
+bestowment
+bestraddle
+bestrapped
+bestraught
+bestraw
+bestreak
+bestream
+bestrew
+bestrewment
+bestride
+bestripe
+bestrode
+bestubbled
+bestuck
+bestud
+besugar
+besuit
+besully
+beswarm
+besweatered
+besweeten
+beswelter
+beswim
+beswinge
+beswitch
+bet
+Beta
+beta
+betacism
+betacismus
+betafite
+betag
+betail
+betailor
+betaine
+betainogen
+betalk
+betallow
+betangle
+betanglement
+betask
+betassel
+betatron
+betattered
+betaxed
+betear
+beteela
+beteem
+betel
+Betelgeuse
+Beth
+beth
+bethabara
+bethankit
+bethel
+Bethesda
+bethflower
+bethink
+Bethlehem
+Bethlehemite
+bethought
+bethrall
+bethreaten
+bethroot
+Bethuel
+bethumb
+bethump
+bethunder
+bethwack
+Bethylidae
+betide
+betimber
+betimes
+betinge
+betipple
+betire
+betis
+betitle
+betocsin
+betoil
+betoken
+betokener
+betone
+betongue
+Betonica
+betony
+betorcin
+betorcinol
+betoss
+betowel
+betowered
+Betoya
+Betoyan
+betrace
+betrail
+betrample
+betrap
+betravel
+betray
+betrayal
+betrayer
+betrayment
+betread
+betrend
+betrim
+betrinket
+betroth
+betrothal
+betrothed
+betrothment
+betrough
+betrousered
+betrumpet
+betrunk
+Betsey
+Betsileos
+Betsimisaraka
+betso
+Betsy
+Betta
+betted
+better
+betterer
+bettergates
+bettering
+betterly
+betterment
+bettermost
+betterness
+betters
+Bettina
+Bettine
+betting
+bettong
+bettonga
+Bettongia
+bettor
+Betty
+betty
+betuckered
+Betula
+Betulaceae
+betulaceous
+betulin
+betulinamaric
+betulinic
+betulinol
+Betulites
+beturbaned
+betusked
+betutor
+betutored
+betwattled
+between
+betweenbrain
+betweenity
+betweenmaid
+betweenness
+betweenwhiles
+betwine
+betwit
+betwixen
+betwixt
+beudantite
+Beulah
+beuniformed
+bevatron
+beveil
+bevel
+beveled
+beveler
+bevelled
+bevelment
+bevenom
+bever
+beverage
+Beverly
+beverse
+bevesseled
+bevesselled
+beveto
+bevillain
+bevined
+bevoiled
+bevomit
+bevue
+bevy
+bewail
+bewailable
+bewailer
+bewailing
+bewailingly
+bewailment
+bewaitered
+bewall
+beware
+bewash
+bewaste
+bewater
+beweary
+beweep
+beweeper
+bewelcome
+bewelter
+bewept
+bewest
+bewet
+bewhig
+bewhiskered
+bewhisper
+bewhistle
+bewhite
+bewhiten
+bewidow
+bewig
+bewigged
+bewilder
+bewildered
+bewilderedly
+bewilderedness
+bewildering
+bewilderingly
+bewilderment
+bewimple
+bewinged
+bewinter
+bewired
+bewitch
+bewitchedness
+bewitcher
+bewitchery
+bewitchful
+bewitching
+bewitchingly
+bewitchingness
+bewitchment
+bewith
+bewizard
+bework
+beworm
+beworn
+beworry
+beworship
+bewrap
+bewrathed
+bewray
+bewrayer
+bewrayingly
+bewrayment
+bewreath
+bewreck
+bewrite
+bey
+beydom
+beylic
+beylical
+beyond
+beyrichite
+beyship
+Bezaleel
+Bezaleelian
+bezant
+bezantee
+bezanty
+bezel
+bezesteen
+bezetta
+bezique
+bezoar
+bezoardic
+bezonian
+Bezpopovets
+bezzi
+bezzle
+bezzo
+bhabar
+Bhadon
+Bhaga
+bhagavat
+bhagavata
+bhaiachari
+bhaiyachara
+bhakta
+bhakti
+bhalu
+bhandar
+bhandari
+bhang
+bhangi
+Bhar
+bhara
+bharal
+Bharata
+bhat
+bhava
+Bhavani
+bheesty
+bhikku
+bhikshu
+Bhil
+Bhili
+Bhima
+Bhojpuri
+bhoosa
+Bhotia
+Bhotiya
+Bhowani
+bhoy
+Bhumij
+bhungi
+bhungini
+bhut
+Bhutanese
+Bhutani
+bhutatathata
+Bhutia
+biabo
+biacetyl
+biacetylene
+biacid
+biacromial
+biacuminate
+biacuru
+bialate
+biallyl
+bialveolar
+Bianca
+Bianchi
+bianchite
+bianco
+biangular
+biangulate
+biangulated
+biangulous
+bianisidine
+biannual
+biannually
+biannulate
+biarchy
+biarcuate
+biarcuated
+biarticular
+biarticulate
+biarticulated
+bias
+biasness
+biasteric
+biaswise
+biatomic
+biauricular
+biauriculate
+biaxal
+biaxial
+biaxiality
+biaxially
+biaxillary
+bib
+bibacious
+bibacity
+bibasic
+bibation
+bibb
+bibber
+bibble
+bibbler
+bibbons
+bibcock
+bibenzyl
+bibi
+Bibio
+bibionid
+Bibionidae
+bibiri
+bibitory
+Bible
+bibless
+Biblic
+Biblical
+Biblicality
+Biblically
+Biblicism
+Biblicist
+Biblicistic
+Biblicolegal
+Biblicoliterary
+Biblicopsychological
+biblioclasm
+biblioclast
+bibliofilm
+bibliogenesis
+bibliognost
+bibliognostic
+bibliogony
+bibliograph
+bibliographer
+bibliographic
+bibliographical
+bibliographically
+bibliographize
+bibliography
+biblioklept
+bibliokleptomania
+bibliokleptomaniac
+bibliolater
+bibliolatrous
+bibliolatry
+bibliological
+bibliologist
+bibliology
+bibliomancy
+bibliomane
+bibliomania
+bibliomaniac
+bibliomaniacal
+bibliomanian
+bibliomanianism
+bibliomanism
+bibliomanist
+bibliopegic
+bibliopegist
+bibliopegistic
+bibliopegy
+bibliophage
+bibliophagic
+bibliophagist
+bibliophagous
+bibliophile
+bibliophilic
+bibliophilism
+bibliophilist
+bibliophilistic
+bibliophily
+bibliophobia
+bibliopolar
+bibliopole
+bibliopolery
+bibliopolic
+bibliopolical
+bibliopolically
+bibliopolism
+bibliopolist
+bibliopolistic
+bibliopoly
+bibliosoph
+bibliotaph
+bibliotaphic
+bibliothec
+bibliotheca
+bibliothecal
+bibliothecarial
+bibliothecarian
+bibliothecary
+bibliotherapeutic
+bibliotherapist
+bibliotherapy
+bibliothetic
+bibliotic
+bibliotics
+bibliotist
+Biblism
+Biblist
+biblus
+biborate
+bibracteate
+bibracteolate
+bibulosity
+bibulous
+bibulously
+bibulousness
+Bibulus
+bicalcarate
+bicameral
+bicameralism
+bicamerist
+bicapitate
+bicapsular
+bicarbonate
+bicarbureted
+bicarinate
+bicarpellary
+bicarpellate
+bicaudal
+bicaudate
+Bice
+bice
+bicellular
+bicentenary
+bicentennial
+bicephalic
+bicephalous
+biceps
+bicetyl
+bichir
+bichloride
+bichord
+bichromate
+bichromatic
+bichromatize
+bichrome
+bichromic
+bichy
+biciliate
+biciliated
+bicipital
+bicipitous
+bicircular
+bicirrose
+bick
+bicker
+bickerer
+bickern
+biclavate
+biclinium
+bicollateral
+bicollaterality
+bicolligate
+bicolor
+bicolored
+bicolorous
+biconcave
+biconcavity
+bicondylar
+bicone
+biconic
+biconical
+biconically
+biconjugate
+biconsonantal
+biconvex
+bicorn
+bicornate
+bicorne
+bicorned
+bicornous
+bicornuate
+bicornuous
+bicornute
+bicorporal
+bicorporate
+bicorporeal
+bicostate
+bicrenate
+bicrescentic
+bicrofarad
+bicron
+bicrural
+bicursal
+bicuspid
+bicuspidate
+bicyanide
+bicycle
+bicycler
+bicyclic
+bicyclism
+bicyclist
+bicyclo
+bicycloheptane
+bicylindrical
+bid
+bidactyl
+bidactyle
+bidactylous
+bidar
+bidarka
+bidcock
+biddable
+biddableness
+biddably
+biddance
+Biddelian
+bidder
+bidding
+Biddulphia
+Biddulphiaceae
+Biddy
+biddy
+bide
+Bidens
+bident
+bidental
+bidentate
+bidented
+bidential
+bidenticulate
+bider
+bidet
+bidigitate
+bidimensional
+biding
+bidirectional
+bidiurnal
+Bidpai
+bidri
+biduous
+bieberite
+Biedermeier
+bield
+bieldy
+bielectrolysis
+bielenite
+Bielid
+Bielorouss
+bien
+bienly
+bienness
+biennia
+biennial
+biennially
+biennium
+bier
+bierbalk
+biethnic
+bietle
+bifacial
+bifanged
+bifara
+bifarious
+bifariously
+bifer
+biferous
+biff
+biffin
+bifid
+bifidate
+bifidated
+bifidity
+bifidly
+bifilar
+bifilarly
+bifistular
+biflabellate
+biflagellate
+biflecnode
+biflected
+biflex
+biflorate
+biflorous
+bifluoride
+bifocal
+bifoil
+bifold
+bifolia
+bifoliate
+bifoliolate
+bifolium
+biforked
+biform
+biformed
+biformity
+biforous
+bifront
+bifrontal
+bifronted
+bifurcal
+bifurcate
+bifurcated
+bifurcately
+bifurcation
+big
+biga
+bigamic
+bigamist
+bigamistic
+bigamize
+bigamous
+bigamously
+bigamy
+bigarade
+bigaroon
+bigarreau
+bigbloom
+bigemina
+bigeminal
+bigeminate
+bigeminated
+bigeminum
+bigener
+bigeneric
+bigential
+bigeye
+bigg
+biggah
+biggen
+bigger
+biggest
+biggin
+biggish
+biggonet
+bigha
+bighead
+bighearted
+bigheartedness
+bighorn
+bight
+biglandular
+biglenoid
+biglot
+bigmouth
+bigmouthed
+bigness
+Bignonia
+Bignoniaceae
+bignoniaceous
+bignoniad
+bignou
+bigoniac
+bigonial
+bigot
+bigoted
+bigotedly
+bigotish
+bigotry
+bigotty
+bigroot
+bigthatch
+biguanide
+biguttate
+biguttulate
+bigwig
+bigwigged
+bigwiggedness
+bigwiggery
+bigwiggism
+Bihai
+Biham
+bihamate
+Bihari
+biharmonic
+bihourly
+bihydrazine
+bija
+bijasal
+bijou
+bijouterie
+bijoux
+bijugate
+bijugular
+bike
+bikh
+bikhaconitine
+bikini
+Bikol
+Bikram
+Bikukulla
+Bilaan
+bilabe
+bilabial
+bilabiate
+bilalo
+bilamellar
+bilamellate
+bilamellated
+bilaminar
+bilaminate
+bilaminated
+bilander
+bilateral
+bilateralism
+bilaterality
+bilaterally
+bilateralness
+Bilati
+bilberry
+bilbie
+bilbo
+bilboquet
+bilby
+bilch
+bilcock
+bildar
+bilders
+bile
+bilestone
+bilge
+bilgy
+Bilharzia
+bilharzial
+bilharziasis
+bilharzic
+bilharziosis
+bilianic
+biliary
+biliate
+biliation
+bilic
+bilicyanin
+bilifaction
+biliferous
+bilification
+bilifuscin
+bilify
+bilihumin
+bilimbi
+bilimbing
+biliment
+Bilin
+bilinear
+bilineate
+bilingual
+bilingualism
+bilingually
+bilinguar
+bilinguist
+bilinigrin
+bilinite
+bilio
+bilious
+biliously
+biliousness
+biliprasin
+bilipurpurin
+bilipyrrhin
+bilirubin
+bilirubinemia
+bilirubinic
+bilirubinuria
+biliteral
+biliteralism
+bilith
+bilithon
+biliverdic
+biliverdin
+bilixanthin
+bilk
+bilker
+Bill
+bill
+billa
+billable
+billabong
+billback
+billbeetle
+Billbergia
+billboard
+billbroking
+billbug
+billed
+biller
+billet
+billeter
+billethead
+billeting
+billetwood
+billety
+billfish
+billfold
+billhead
+billheading
+billholder
+billhook
+billian
+billiard
+billiardist
+billiardly
+billiards
+Billie
+Billiken
+billikin
+billing
+billingsgate
+billion
+billionaire
+billionism
+billionth
+billitonite
+Billjim
+billman
+billon
+billot
+billow
+billowiness
+billowy
+billposter
+billposting
+billsticker
+billsticking
+Billy
+billy
+billyboy
+billycan
+billycock
+billyer
+billyhood
+billywix
+bilo
+bilobated
+bilobe
+bilobed
+bilobiate
+bilobular
+bilocation
+bilocellate
+bilocular
+biloculate
+Biloculina
+biloculine
+bilophodont
+Biloxi
+bilsh
+Bilskirnir
+bilsted
+biltong
+biltongue
+Bim
+bimaculate
+bimaculated
+bimalar
+Bimana
+bimanal
+bimane
+bimanous
+bimanual
+bimanually
+bimarginate
+bimarine
+bimastic
+bimastism
+bimastoid
+bimasty
+bimaxillary
+bimbil
+Bimbisara
+bimeby
+bimensal
+bimester
+bimestrial
+bimetalic
+bimetallism
+bimetallist
+bimetallistic
+bimillenary
+bimillennium
+bimillionaire
+Bimini
+Bimmeler
+bimodal
+bimodality
+bimolecular
+bimonthly
+bimotored
+bimotors
+bimucronate
+bimuscular
+bin
+binal
+binaphthyl
+binarium
+binary
+binate
+binately
+bination
+binational
+binaural
+binauricular
+binbashi
+bind
+binder
+bindery
+bindheimite
+binding
+bindingly
+bindingness
+bindle
+bindlet
+bindoree
+bindweb
+bindweed
+bindwith
+bindwood
+bine
+binervate
+bineweed
+bing
+binge
+bingey
+binghi
+bingle
+bingo
+bingy
+binh
+Bini
+biniodide
+Binitarian
+Binitarianism
+bink
+binman
+binna
+binnacle
+binning
+binnite
+binnogue
+bino
+binocle
+binocular
+binocularity
+binocularly
+binoculate
+binodal
+binode
+binodose
+binodous
+binomenclature
+binomial
+binomialism
+binomially
+binominal
+binominated
+binominous
+binormal
+binotic
+binotonous
+binous
+binoxalate
+binoxide
+bint
+bintangor
+binturong
+binuclear
+binucleate
+binucleated
+binucleolate
+binukau
+Binzuru
+biobibliographical
+biobibliography
+bioblast
+bioblastic
+biocatalyst
+biocellate
+biocentric
+biochemic
+biochemical
+biochemically
+biochemics
+biochemist
+biochemistry
+biochemy
+biochore
+bioclimatic
+bioclimatology
+biocoenose
+biocoenosis
+biocoenotic
+biocycle
+biod
+biodynamic
+biodynamical
+biodynamics
+biodyne
+bioecologic
+bioecological
+bioecologically
+bioecologist
+bioecology
+biogen
+biogenase
+biogenesis
+biogenesist
+biogenetic
+biogenetical
+biogenetically
+biogenetics
+biogenous
+biogeny
+biogeochemistry
+biogeographic
+biogeographical
+biogeographically
+biogeography
+biognosis
+biograph
+biographee
+biographer
+biographic
+biographical
+biographically
+biographist
+biographize
+biography
+bioherm
+biokinetics
+biolinguistics
+biolith
+biologese
+biologic
+biological
+biologically
+biologicohumanistic
+biologism
+biologist
+biologize
+biology
+bioluminescence
+bioluminescent
+biolysis
+biolytic
+biomagnetic
+biomagnetism
+biomathematics
+biome
+biomechanical
+biomechanics
+biometeorology
+biometer
+biometric
+biometrical
+biometrically
+biometrician
+biometricist
+biometrics
+biometry
+biomicroscopy
+bion
+bionergy
+bionomic
+bionomical
+bionomically
+bionomics
+bionomist
+bionomy
+biophagism
+biophagous
+biophagy
+biophilous
+biophore
+biophotophone
+biophysical
+biophysicochemical
+biophysics
+biophysiography
+biophysiological
+biophysiologist
+biophysiology
+biophyte
+bioplasm
+bioplasmic
+bioplast
+bioplastic
+bioprecipitation
+biopsic
+biopsy
+biopsychic
+biopsychical
+biopsychological
+biopsychologist
+biopsychology
+biopyribole
+bioral
+biorbital
+biordinal
+bioreaction
+biorgan
+bios
+bioscope
+bioscopic
+bioscopy
+biose
+biosis
+biosocial
+biosociological
+biosphere
+biostatic
+biostatical
+biostatics
+biostatistics
+biosterin
+biosterol
+biostratigraphy
+biosynthesis
+biosynthetic
+biosystematic
+biosystematics
+biosystematist
+biosystematy
+Biota
+biota
+biotaxy
+biotechnics
+biotic
+biotical
+biotics
+biotin
+biotite
+biotitic
+biotome
+biotomy
+biotope
+biotype
+biotypic
+biovular
+biovulate
+bioxalate
+bioxide
+bipack
+bipaleolate
+Bipaliidae
+Bipalium
+bipalmate
+biparasitic
+biparental
+biparietal
+biparous
+biparted
+bipartible
+bipartient
+bipartile
+bipartisan
+bipartisanship
+bipartite
+bipartitely
+bipartition
+biparty
+bipaschal
+bipectinate
+bipectinated
+biped
+bipedal
+bipedality
+bipedism
+bipeltate
+bipennate
+bipennated
+bipenniform
+biperforate
+bipersonal
+bipetalous
+biphase
+biphasic
+biphenol
+biphenyl
+biphenylene
+bipinnaria
+bipinnate
+bipinnated
+bipinnately
+bipinnatifid
+bipinnatiparted
+bipinnatipartite
+bipinnatisect
+bipinnatisected
+biplanal
+biplanar
+biplane
+biplicate
+biplicity
+biplosion
+biplosive
+bipod
+bipolar
+bipolarity
+bipolarize
+Bipont
+Bipontine
+biporose
+biporous
+biprism
+biprong
+bipunctal
+bipunctate
+bipunctual
+bipupillate
+bipyramid
+bipyramidal
+bipyridine
+bipyridyl
+biquadrantal
+biquadrate
+biquadratic
+biquarterly
+biquartz
+biquintile
+biracial
+biracialism
+biradial
+biradiate
+biradiated
+biramous
+birational
+birch
+birchbark
+birchen
+birching
+birchman
+birchwood
+bird
+birdbander
+birdbanding
+birdbath
+birdberry
+birdcall
+birdcatcher
+birdcatching
+birdclapper
+birdcraft
+birddom
+birdeen
+birder
+birdglue
+birdhood
+birdhouse
+birdie
+birdikin
+birding
+birdland
+birdless
+birdlet
+birdlike
+birdlime
+birdling
+birdlore
+birdman
+birdmouthed
+birdnest
+birdnester
+birdseed
+birdstone
+birdweed
+birdwise
+birdwoman
+birdy
+birectangular
+birefracting
+birefraction
+birefractive
+birefringence
+birefringent
+bireme
+biretta
+Birgus
+biri
+biriba
+birimose
+birk
+birken
+Birkenhead
+Birkenia
+Birkeniidae
+birkie
+birkremite
+birl
+birle
+birler
+birlie
+birlieman
+birlinn
+birma
+Birmingham
+Birminghamize
+birn
+birny
+Biron
+birostrate
+birostrated
+birotation
+birotatory
+birr
+birse
+birsle
+birsy
+birth
+birthbed
+birthday
+birthland
+birthless
+birthmark
+birthmate
+birthnight
+birthplace
+birthright
+birthroot
+birthstone
+birthstool
+birthwort
+birthy
+bis
+bisabol
+bisaccate
+bisacromial
+bisalt
+Bisaltae
+bisantler
+bisaxillary
+bisbeeite
+biscacha
+Biscanism
+Biscayan
+Biscayanism
+biscayen
+Biscayner
+bischofite
+biscotin
+biscuit
+biscuiting
+biscuitlike
+biscuitmaker
+biscuitmaking
+biscuitroot
+biscuitry
+bisdiapason
+bisdimethylamino
+bisect
+bisection
+bisectional
+bisectionally
+bisector
+bisectrices
+bisectrix
+bisegment
+biseptate
+biserial
+biserially
+biseriate
+biseriately
+biserrate
+bisetose
+bisetous
+bisexed
+bisext
+bisexual
+bisexualism
+bisexuality
+bisexually
+bisexuous
+bisglyoxaline
+Bishareen
+Bishari
+Bisharin
+bishop
+bishopdom
+bishopess
+bishopful
+bishophood
+bishopless
+bishoplet
+bishoplike
+bishopling
+bishopric
+bishopship
+bishopweed
+bisiliac
+bisilicate
+bisiliquous
+bisimine
+bisinuate
+bisinuation
+bisischiadic
+bisischiatic
+Bisley
+bislings
+bismar
+Bismarck
+Bismarckian
+Bismarckianism
+bismarine
+bismerpund
+bismillah
+bismite
+Bismosol
+bismuth
+bismuthal
+bismuthate
+bismuthic
+bismuthide
+bismuthiferous
+bismuthine
+bismuthinite
+bismuthite
+bismuthous
+bismuthyl
+bismutite
+bismutoplagionite
+bismutosmaltite
+bismutosphaerite
+bisnaga
+bison
+bisonant
+bisontine
+bisphenoid
+bispinose
+bispinous
+bispore
+bisporous
+bisque
+bisquette
+bissext
+bissextile
+bisson
+bistate
+bistephanic
+bister
+bistered
+bistetrazole
+bisti
+bistipular
+bistipulate
+bistipuled
+bistort
+Bistorta
+bistournage
+bistoury
+bistratal
+bistratose
+bistriate
+bistriazole
+bistro
+bisubstituted
+bisubstitution
+bisulcate
+bisulfid
+bisulphate
+bisulphide
+bisulphite
+bisyllabic
+bisyllabism
+bisymmetric
+bisymmetrical
+bisymmetrically
+bisymmetry
+bit
+bitable
+bitangent
+bitangential
+bitanhol
+bitartrate
+bitbrace
+bitch
+bite
+bitemporal
+bitentaculate
+biter
+biternate
+biternately
+bitesheep
+bitewing
+bitheism
+Bithynian
+biti
+biting
+bitingly
+bitingness
+Bitis
+bitless
+bito
+bitolyl
+bitonality
+bitreadle
+bitripartite
+bitripinnatifid
+bitriseptate
+bitrochanteric
+bitstock
+bitstone
+bitt
+bitted
+bitten
+bitter
+bitterbark
+bitterblain
+bitterbloom
+bitterbur
+bitterbush
+bitterful
+bitterhead
+bitterhearted
+bitterheartedness
+bittering
+bitterish
+bitterishness
+bitterless
+bitterling
+bitterly
+bittern
+bitterness
+bitternut
+bitterroot
+bitters
+bittersweet
+bitterweed
+bitterwood
+bitterworm
+bitterwort
+bitthead
+bittie
+Bittium
+bittock
+bitty
+bitubercular
+bituberculate
+bituberculated
+Bitulithic
+bitulithic
+bitume
+bitumed
+bitumen
+bituminate
+bituminiferous
+bituminization
+bituminize
+bituminoid
+bituminous
+bitwise
+bityite
+bitypic
+biune
+biunial
+biunity
+biunivocal
+biurate
+biurea
+biuret
+bivalence
+bivalency
+bivalent
+bivalve
+bivalved
+Bivalvia
+bivalvian
+bivalvous
+bivalvular
+bivariant
+bivariate
+bivascular
+bivaulted
+bivector
+biventer
+biventral
+biverbal
+bivinyl
+bivious
+bivittate
+bivocal
+bivocalized
+bivoltine
+bivoluminous
+bivouac
+biwa
+biweekly
+biwinter
+Bixa
+Bixaceae
+bixaceous
+bixbyite
+bixin
+biyearly
+biz
+bizardite
+bizarre
+bizarrely
+bizarreness
+Bizen
+bizet
+bizonal
+bizone
+Bizonia
+bizygomatic
+bizz
+Bjorne
+blab
+blabber
+blabberer
+blachong
+black
+blackacre
+blackamoor
+blackback
+blackball
+blackballer
+blackband
+Blackbeard
+blackbelly
+blackberry
+blackbine
+blackbird
+blackbirder
+blackbirding
+blackboard
+blackboy
+blackbreast
+blackbush
+blackbutt
+blackcap
+blackcoat
+blackcock
+blackdamp
+blacken
+blackener
+blackening
+blacker
+blacketeer
+blackey
+blackeyes
+blackface
+Blackfeet
+blackfellow
+blackfellows
+blackfin
+blackfire
+blackfish
+blackfisher
+blackfishing
+Blackfoot
+blackfoot
+Blackfriars
+blackguard
+blackguardism
+blackguardize
+blackguardly
+blackguardry
+Blackhander
+blackhead
+blackheads
+blackheart
+blackhearted
+blackheartedness
+blackie
+blacking
+blackish
+blackishly
+blackishness
+blackit
+blackjack
+blackland
+blackleg
+blackleggery
+blacklegism
+blacklegs
+blackly
+blackmail
+blackmailer
+blackneb
+blackneck
+blackness
+blacknob
+blackout
+blackpoll
+blackroot
+blackseed
+blackshirted
+blacksmith
+blacksmithing
+blackstick
+blackstrap
+blacktail
+blackthorn
+blacktongue
+blacktree
+blackwash
+blackwasher
+blackwater
+blackwood
+blackwork
+blackwort
+blacky
+blad
+bladder
+bladderet
+bladderless
+bladderlike
+bladdernose
+bladdernut
+bladderpod
+bladderseed
+bladderweed
+bladderwort
+bladdery
+blade
+bladebone
+bladed
+bladelet
+bladelike
+blader
+bladesmith
+bladewise
+blading
+bladish
+blady
+bladygrass
+blae
+blaeberry
+blaeness
+blaewort
+blaff
+blaffert
+blaflum
+blah
+blahlaut
+blain
+Blaine
+Blair
+blair
+blairmorite
+Blake
+blake
+blakeberyed
+blamable
+blamableness
+blamably
+blame
+blamed
+blameful
+blamefully
+blamefulness
+blameless
+blamelessly
+blamelessness
+blamer
+blameworthiness
+blameworthy
+blaming
+blamingly
+blan
+blanc
+blanca
+blancard
+Blanch
+blanch
+blancher
+blanching
+blanchingly
+blancmange
+blancmanger
+blanco
+bland
+blanda
+Blandfordia
+blandiloquence
+blandiloquious
+blandiloquous
+blandish
+blandisher
+blandishing
+blandishingly
+blandishment
+blandly
+blandness
+blank
+blankard
+blankbook
+blanked
+blankeel
+blanket
+blanketed
+blanketeer
+blanketflower
+blanketing
+blanketless
+blanketmaker
+blanketmaking
+blanketry
+blanketweed
+blankety
+blanking
+blankish
+Blankit
+blankite
+blankly
+blankness
+blanky
+blanque
+blanquillo
+blare
+Blarina
+blarney
+blarneyer
+blarnid
+blarny
+blart
+blas
+blase
+blash
+blashy
+Blasia
+blaspheme
+blasphemer
+blasphemous
+blasphemously
+blasphemousness
+blasphemy
+blast
+blasted
+blastema
+blastemal
+blastematic
+blastemic
+blaster
+blastful
+blasthole
+blastid
+blastie
+blasting
+blastment
+blastocarpous
+blastocheme
+blastochyle
+blastocoele
+blastocolla
+blastocyst
+blastocyte
+blastoderm
+blastodermatic
+blastodermic
+blastodisk
+blastogenesis
+blastogenetic
+blastogenic
+blastogeny
+blastogranitic
+blastoid
+Blastoidea
+blastoma
+blastomata
+blastomere
+blastomeric
+Blastomyces
+blastomycete
+Blastomycetes
+blastomycetic
+blastomycetous
+blastomycosis
+blastomycotic
+blastoneuropore
+Blastophaga
+blastophitic
+blastophoral
+blastophore
+blastophoric
+blastophthoria
+blastophthoric
+blastophyllum
+blastoporal
+blastopore
+blastoporic
+blastoporphyritic
+blastosphere
+blastospheric
+blastostylar
+blastostyle
+blastozooid
+blastplate
+blastula
+blastulae
+blastular
+blastulation
+blastule
+blasty
+blat
+blatancy
+blatant
+blatantly
+blate
+blately
+blateness
+blather
+blatherer
+blatherskite
+blathery
+blatjang
+Blatta
+blatta
+Blattariae
+blatter
+blatterer
+blatti
+blattid
+Blattidae
+blattiform
+Blattodea
+blattoid
+Blattoidea
+blaubok
+Blaugas
+blauwbok
+blaver
+blaw
+blawort
+blay
+Blayne
+blaze
+blazer
+blazing
+blazingly
+blazon
+blazoner
+blazoning
+blazonment
+blazonry
+blazy
+bleaberry
+bleach
+bleachability
+bleachable
+bleached
+bleacher
+bleacherite
+bleacherman
+bleachery
+bleachfield
+bleachground
+bleachhouse
+bleaching
+bleachman
+bleachworks
+bleachyard
+bleak
+bleakish
+bleakly
+bleakness
+bleaky
+blear
+bleared
+blearedness
+bleareye
+bleariness
+blearness
+bleary
+bleat
+bleater
+bleating
+bleatingly
+bleaty
+bleb
+blebby
+blechnoid
+Blechnum
+bleck
+blee
+bleed
+bleeder
+bleeding
+bleekbok
+bleery
+bleeze
+bleezy
+blellum
+blemish
+blemisher
+blemishment
+Blemmyes
+blench
+blencher
+blenching
+blenchingly
+blencorn
+blend
+blendcorn
+blende
+blended
+blender
+blending
+blendor
+blendure
+blendwater
+blennadenitis
+blennemesis
+blennenteria
+blennenteritis
+blenniid
+Blenniidae
+blenniiform
+Blenniiformes
+blennioid
+Blennioidea
+blennocele
+blennocystitis
+blennoemesis
+blennogenic
+blennogenous
+blennoid
+blennoma
+blennometritis
+blennophlogisma
+blennophlogosis
+blennophthalmia
+blennoptysis
+blennorrhagia
+blennorrhagic
+blennorrhea
+blennorrheal
+blennorrhinia
+blennosis
+blennostasis
+blennostatic
+blennothorax
+blennotorrhea
+blennuria
+blenny
+blennymenitis
+blent
+bleo
+blephara
+blepharadenitis
+blepharal
+blepharanthracosis
+blepharedema
+blepharelcosis
+blepharemphysema
+Blephariglottis
+blepharism
+blepharitic
+blepharitis
+blepharoadenitis
+blepharoadenoma
+blepharoatheroma
+blepharoblennorrhea
+blepharocarcinoma
+Blepharocera
+Blepharoceridae
+blepharochalasis
+blepharochromidrosis
+blepharoclonus
+blepharocoloboma
+blepharoconjunctivitis
+blepharodiastasis
+blepharodyschroia
+blepharohematidrosis
+blepharolithiasis
+blepharomelasma
+blepharoncosis
+blepharoncus
+blepharophimosis
+blepharophryplasty
+blepharophthalmia
+blepharophyma
+blepharoplast
+blepharoplastic
+blepharoplasty
+blepharoplegia
+blepharoptosis
+blepharopyorrhea
+blepharorrhaphy
+blepharospasm
+blepharospath
+blepharosphincterectomy
+blepharostat
+blepharostenosis
+blepharosymphysis
+blepharosyndesmitis
+blepharosynechia
+blepharotomy
+blepharydatis
+Blephillia
+blesbok
+blesbuck
+bless
+blessed
+blessedly
+blessedness
+blesser
+blessing
+blessingly
+blest
+blet
+bletheration
+Bletia
+Bletilla
+blewits
+blibe
+blick
+blickey
+Blighia
+blight
+blightbird
+blighted
+blighter
+blighting
+blightingly
+blighty
+blimbing
+blimp
+blimy
+blind
+blindage
+blindball
+blinded
+blindedly
+blinder
+blindeyes
+blindfast
+blindfish
+blindfold
+blindfolded
+blindfoldedness
+blindfolder
+blindfoldly
+blinding
+blindingly
+blindish
+blindless
+blindling
+blindly
+blindness
+blindstory
+blindweed
+blindworm
+blink
+blinkard
+blinked
+blinker
+blinkered
+blinking
+blinkingly
+blinks
+blinky
+blinter
+blintze
+blip
+bliss
+blissful
+blissfully
+blissfulness
+blissless
+blissom
+blister
+blistered
+blistering
+blisteringly
+blisterweed
+blisterwort
+blistery
+blite
+blithe
+blithebread
+blitheful
+blithefully
+blithehearted
+blithelike
+blithely
+blithemeat
+blithen
+blitheness
+blither
+blithering
+blithesome
+blithesomely
+blithesomeness
+blitter
+Blitum
+blitz
+blitzbuggy
+blitzkrieg
+blizz
+blizzard
+blizzardly
+blizzardous
+blizzardy
+blo
+bloat
+bloated
+bloatedness
+bloater
+bloating
+blob
+blobbed
+blobber
+blobby
+bloc
+block
+blockade
+blockader
+blockage
+blockbuster
+blocked
+blocker
+blockhead
+blockheaded
+blockheadedly
+blockheadedness
+blockheadish
+blockheadishness
+blockheadism
+blockholer
+blockhouse
+blockiness
+blocking
+blockish
+blockishly
+blockishness
+blocklayer
+blocklike
+blockmaker
+blockmaking
+blockman
+blockpate
+blockship
+blocky
+blodite
+bloke
+blolly
+blomstrandine
+blonde
+blondeness
+blondine
+blood
+bloodalley
+bloodalp
+bloodbeat
+bloodberry
+bloodbird
+bloodcurdler
+bloodcurdling
+blooddrop
+blooddrops
+blooded
+bloodfin
+bloodflower
+bloodguilt
+bloodguiltiness
+bloodguiltless
+bloodguilty
+bloodhound
+bloodied
+bloodily
+bloodiness
+bloodleaf
+bloodless
+bloodlessly
+bloodlessness
+bloodletter
+bloodletting
+bloodline
+bloodmobile
+bloodmonger
+bloodnoun
+bloodripe
+bloodripeness
+bloodroot
+bloodshed
+bloodshedder
+bloodshedding
+bloodshot
+bloodshotten
+bloodspiller
+bloodspilling
+bloodstain
+bloodstained
+bloodstainedness
+bloodstanch
+bloodstock
+bloodstone
+bloodstroke
+bloodsuck
+bloodsucker
+bloodsucking
+bloodthirst
+bloodthirster
+bloodthirstily
+bloodthirstiness
+bloodthirsting
+bloodthirsty
+bloodweed
+bloodwite
+bloodwood
+bloodworm
+bloodwort
+bloodworthy
+bloody
+bloodybones
+blooey
+bloom
+bloomage
+bloomer
+Bloomeria
+bloomerism
+bloomers
+bloomery
+bloomfell
+blooming
+bloomingly
+bloomingness
+bloomkin
+bloomless
+Bloomsburian
+Bloomsbury
+bloomy
+bloop
+blooper
+blooping
+blore
+blosmy
+blossom
+blossombill
+blossomed
+blossomhead
+blossomless
+blossomry
+blossomtime
+blossomy
+blot
+blotch
+blotched
+blotchy
+blotless
+blotter
+blottesque
+blottesquely
+blotting
+blottingly
+blotto
+blotty
+bloubiskop
+blouse
+bloused
+blousing
+blout
+blow
+blowback
+blowball
+blowcock
+blowdown
+blowen
+blower
+blowfish
+blowfly
+blowgun
+blowhard
+blowhole
+blowiness
+blowing
+blowings
+blowiron
+blowlamp
+blowline
+blown
+blowoff
+blowout
+blowpipe
+blowpoint
+blowproof
+blowspray
+blowth
+blowtorch
+blowtube
+blowup
+blowy
+blowze
+blowzed
+blowzing
+blowzy
+blub
+blubber
+blubberer
+blubbering
+blubberingly
+blubberman
+blubberous
+blubbery
+blucher
+bludgeon
+bludgeoned
+bludgeoneer
+bludgeoner
+blue
+blueback
+bluebead
+Bluebeard
+bluebeard
+Bluebeardism
+bluebell
+bluebelled
+blueberry
+bluebill
+bluebird
+blueblaw
+bluebonnet
+bluebook
+bluebottle
+bluebreast
+bluebuck
+bluebush
+bluebutton
+bluecap
+bluecoat
+bluecup
+bluefish
+bluegill
+bluegown
+bluegrass
+bluehearted
+bluehearts
+blueing
+bluejack
+bluejacket
+bluejoint
+blueleg
+bluelegs
+bluely
+blueness
+bluenose
+Bluenoser
+blueprint
+blueprinter
+bluer
+blues
+bluesides
+bluestem
+bluestocking
+bluestockingish
+bluestockingism
+bluestone
+bluestoner
+bluet
+bluethroat
+bluetongue
+bluetop
+blueweed
+bluewing
+bluewood
+bluey
+bluff
+bluffable
+bluffer
+bluffly
+bluffness
+bluffy
+bluggy
+bluing
+bluish
+bluishness
+bluism
+Blumea
+blunder
+blunderbuss
+blunderer
+blunderful
+blunderhead
+blunderheaded
+blunderheadedness
+blundering
+blunderingly
+blundersome
+blunge
+blunger
+blunk
+blunker
+blunks
+blunnen
+blunt
+blunter
+blunthead
+blunthearted
+bluntie
+bluntish
+bluntly
+bluntness
+blup
+blur
+blurb
+blurbist
+blurred
+blurredness
+blurrer
+blurry
+blurt
+blush
+blusher
+blushful
+blushfully
+blushfulness
+blushiness
+blushing
+blushingly
+blushless
+blushwort
+blushy
+bluster
+blusteration
+blusterer
+blustering
+blusteringly
+blusterous
+blusterously
+blustery
+blype
+bo
+boa
+Boaedon
+boagane
+Boanbura
+Boanerges
+boanergism
+boar
+boarcite
+board
+boardable
+boarder
+boarding
+boardinghouse
+boardlike
+boardly
+boardman
+boardwalk
+boardy
+boarfish
+boarhound
+boarish
+boarishly
+boarishness
+boarship
+boarskin
+boarspear
+boarstaff
+boarwood
+boast
+boaster
+boastful
+boastfully
+boastfulness
+boasting
+boastive
+boastless
+boat
+boatable
+boatage
+boatbill
+boatbuilder
+boatbuilding
+boater
+boatfalls
+boatful
+boathead
+boatheader
+boathouse
+boatie
+boating
+boatkeeper
+boatless
+boatlike
+boatlip
+boatload
+boatloader
+boatloading
+boatly
+boatman
+boatmanship
+boatmaster
+boatowner
+boatsetter
+boatshop
+boatside
+boatsman
+boatswain
+boattail
+boatward
+boatwise
+boatwoman
+boatwright
+Bob
+bob
+boba
+bobac
+Bobadil
+Bobadilian
+Bobadilish
+Bobadilism
+bobbed
+bobber
+bobbery
+Bobbie
+bobbin
+bobbiner
+bobbinet
+bobbing
+Bobbinite
+bobbinwork
+bobbish
+bobbishly
+bobble
+Bobby
+bobby
+bobcat
+bobcoat
+bobeche
+bobfly
+bobierrite
+bobization
+bobjerom
+bobo
+bobolink
+bobotie
+bobsled
+bobsleigh
+bobstay
+bobtail
+bobtailed
+bobwhite
+bobwood
+bocaccio
+bocal
+bocardo
+bocasine
+bocca
+boccale
+boccarella
+boccaro
+bocce
+Bocconia
+boce
+bocedization
+Boche
+bocher
+Bochism
+bock
+bockerel
+bockeret
+bocking
+bocoy
+bod
+bodach
+bodacious
+bodaciously
+bode
+bodeful
+bodega
+bodement
+boden
+bodenbenderite
+boder
+bodewash
+bodge
+bodger
+bodgery
+bodhi
+bodhisattva
+bodice
+bodiced
+bodicemaker
+bodicemaking
+bodied
+bodier
+bodieron
+bodikin
+bodiless
+bodilessness
+bodiliness
+bodily
+bodiment
+boding
+bodingly
+bodkin
+bodkinwise
+bodle
+Bodleian
+Bodo
+bodock
+Bodoni
+body
+bodybending
+bodybuilder
+bodyguard
+bodyhood
+bodyless
+bodymaker
+bodymaking
+bodyplate
+bodywise
+bodywood
+bodywork
+Boebera
+Boedromion
+Boehmenism
+Boehmenist
+Boehmenite
+Boehmeria
+boeotarch
+Boeotian
+Boeotic
+Boer
+Boerdom
+Boerhavia
+Boethian
+Boethusian
+bog
+boga
+bogan
+bogard
+bogart
+bogberry
+bogey
+bogeyman
+boggart
+boggin
+bogginess
+boggish
+boggle
+bogglebo
+boggler
+boggy
+boghole
+bogie
+bogieman
+bogier
+Bogijiab
+bogland
+boglander
+bogle
+bogledom
+boglet
+bogman
+bogmire
+Bogo
+bogo
+Bogomil
+Bogomile
+Bogomilian
+bogong
+Bogota
+bogsucker
+bogtrot
+bogtrotter
+bogtrotting
+bogue
+bogum
+bogus
+bogusness
+bogway
+bogwood
+bogwort
+bogy
+bogydom
+bogyism
+bogyland
+Bohairic
+bohawn
+bohea
+Bohemia
+Bohemian
+Bohemianism
+bohemium
+bohereen
+bohireen
+boho
+bohor
+bohunk
+boid
+Boidae
+Boii
+Boiko
+boil
+boilable
+boildown
+boiled
+boiler
+boilerful
+boilerhouse
+boilerless
+boilermaker
+boilermaking
+boilerman
+boilersmith
+boilerworks
+boilery
+boiling
+boilinglike
+boilingly
+boilover
+boily
+Bois
+boist
+boisterous
+boisterously
+boisterousness
+bojite
+bojo
+bokadam
+bokard
+bokark
+boke
+Bokhara
+Bokharan
+bokom
+bola
+Bolag
+bolar
+Bolboxalis
+bold
+bolden
+Bolderian
+boldhearted
+boldine
+boldly
+boldness
+boldo
+Boldu
+bole
+bolection
+bolectioned
+boled
+boleite
+Bolelia
+bolelike
+bolero
+Boletaceae
+boletaceous
+bolete
+Boletus
+boleweed
+bolewort
+bolide
+bolimba
+bolis
+bolivar
+bolivarite
+bolivia
+Bolivian
+boliviano
+bolk
+boll
+Bollandist
+bollard
+bolled
+boller
+bolling
+bollock
+bollworm
+bolly
+Bolo
+bolo
+Bologna
+Bolognan
+Bolognese
+bolograph
+bolographic
+bolographically
+bolography
+Boloism
+boloman
+bolometer
+bolometric
+boloney
+boloroot
+Bolshevik
+Bolsheviki
+Bolshevikian
+Bolshevism
+Bolshevist
+Bolshevistic
+Bolshevistically
+Bolshevize
+Bolshie
+bolson
+bolster
+bolsterer
+bolsterwork
+bolt
+boltage
+boltant
+boltcutter
+boltel
+bolter
+bolthead
+boltheader
+boltheading
+bolthole
+bolti
+bolting
+boltless
+boltlike
+boltmaker
+boltmaking
+Boltonia
+boltonite
+boltrope
+boltsmith
+boltstrake
+boltuprightness
+boltwork
+bolus
+Bolyaian
+bom
+boma
+Bomarea
+bomb
+bombable
+Bombacaceae
+bombacaceous
+bombard
+bombarde
+bombardelle
+bombarder
+bombardier
+bombardment
+bombardon
+bombast
+bombaster
+bombastic
+bombastically
+bombastry
+Bombax
+Bombay
+bombazet
+bombazine
+bombed
+bomber
+bombiccite
+Bombidae
+bombilate
+bombilation
+Bombinae
+bombinate
+bombination
+bombo
+bombola
+bombonne
+bombous
+bombproof
+bombshell
+bombsight
+Bombus
+bombycid
+Bombycidae
+bombyciform
+Bombycilla
+Bombycillidae
+Bombycina
+bombycine
+Bombyliidae
+Bombyx
+Bon
+bon
+bonaci
+bonagh
+bonaght
+bonair
+bonairly
+bonairness
+bonally
+bonang
+bonanza
+Bonapartean
+Bonapartism
+Bonapartist
+Bonasa
+bonasus
+bonaventure
+Bonaveria
+bonavist
+Bonbo
+bonbon
+bonce
+bond
+bondage
+bondager
+bondar
+bonded
+Bondelswarts
+bonder
+bonderman
+bondfolk
+bondholder
+bondholding
+bonding
+bondless
+bondman
+bondmanship
+bondsman
+bondstone
+bondswoman
+bonduc
+bondwoman
+bone
+boneache
+bonebinder
+boneblack
+bonebreaker
+boned
+bonedog
+bonefish
+boneflower
+bonehead
+boneheaded
+boneless
+bonelessly
+bonelessness
+bonelet
+bonelike
+Bonellia
+boner
+boneset
+bonesetter
+bonesetting
+boneshaker
+boneshaw
+bonetail
+bonewood
+bonework
+bonewort
+Boney
+bonfire
+bong
+Bongo
+bongo
+bonhomie
+Boni
+boniata
+Boniface
+bonification
+boniform
+bonify
+boniness
+boninite
+bonitarian
+bonitary
+bonito
+bonk
+bonnaz
+bonnet
+bonneted
+bonneter
+bonnethead
+bonnetless
+bonnetlike
+bonnetman
+bonnibel
+Bonnie
+bonnily
+bonniness
+Bonny
+bonny
+bonnyclabber
+bonnyish
+bonnyvis
+Bononian
+bonsai
+bonspiel
+bontebok
+bontebuck
+bontequagga
+Bontok
+bonus
+bonxie
+bony
+bonyfish
+bonze
+bonzer
+bonzery
+bonzian
+boo
+boob
+boobery
+boobily
+boobook
+booby
+boobyalla
+boobyish
+boobyism
+bood
+boodie
+boodle
+boodledom
+boodleism
+boodleize
+boodler
+boody
+boof
+booger
+boogiewoogie
+boohoo
+boojum
+book
+bookable
+bookbinder
+bookbindery
+bookbinding
+bookboard
+bookcase
+bookcraft
+bookdealer
+bookdom
+booked
+booker
+bookery
+bookfold
+bookful
+bookholder
+bookhood
+bookie
+bookiness
+booking
+bookish
+bookishly
+bookishness
+bookism
+bookkeeper
+bookkeeping
+bookland
+bookless
+booklet
+booklike
+bookling
+booklore
+booklover
+bookmaker
+bookmaking
+Bookman
+bookman
+bookmark
+bookmarker
+bookmate
+bookmobile
+bookmonger
+bookplate
+bookpress
+bookrack
+bookrest
+bookroom
+bookseller
+booksellerish
+booksellerism
+bookselling
+bookshelf
+bookshop
+bookstack
+bookstall
+bookstand
+bookstore
+bookward
+bookwards
+bookways
+bookwise
+bookwork
+bookworm
+bookwright
+booky
+bool
+Boolian
+booly
+boolya
+boom
+boomable
+boomage
+boomah
+boomboat
+boomdas
+boomer
+boomerang
+booming
+boomingly
+boomless
+boomlet
+boomorah
+boomslang
+boomslange
+boomster
+boomy
+boon
+boondock
+boondocks
+boondoggle
+boondoggler
+Boone
+boonfellow
+boongary
+boonk
+boonless
+Boophilus
+boopis
+boor
+boorish
+boorishly
+boorishness
+boort
+boose
+boost
+booster
+boosterism
+boosy
+boot
+bootblack
+bootboy
+booted
+bootee
+booter
+bootery
+Bootes
+bootful
+booth
+boother
+Boothian
+boothite
+bootholder
+boothose
+Bootid
+bootied
+bootikin
+booting
+bootjack
+bootlace
+bootleg
+bootlegger
+bootlegging
+bootless
+bootlessly
+bootlessness
+bootlick
+bootlicker
+bootmaker
+bootmaking
+boots
+bootstrap
+booty
+bootyless
+booze
+boozed
+boozer
+boozily
+booziness
+boozy
+bop
+bopeep
+boppist
+bopyrid
+Bopyridae
+bopyridian
+Bopyrus
+bor
+bora
+borable
+borachio
+boracic
+boraciferous
+boracous
+borage
+Boraginaceae
+boraginaceous
+Borago
+Borak
+borak
+boral
+Boran
+Borana
+Borani
+borasca
+borasque
+Borassus
+borate
+borax
+Borboridae
+Borborus
+borborygmic
+borborygmus
+bord
+bordage
+bordar
+bordarius
+Bordeaux
+bordel
+bordello
+border
+bordered
+borderer
+Borderies
+bordering
+borderism
+borderland
+borderlander
+borderless
+borderline
+bordermark
+Borderside
+bordroom
+bordure
+bordured
+bore
+boreable
+boread
+Boreades
+boreal
+borealis
+borean
+Boreas
+borecole
+boredom
+boree
+boreen
+boregat
+borehole
+Boreiad
+boreism
+borele
+borer
+boresome
+Boreus
+borg
+borgh
+borghalpenny
+Borghese
+borh
+boric
+borickite
+boride
+borine
+boring
+boringly
+boringness
+Borinqueno
+Boris
+borish
+borism
+bority
+borize
+borlase
+born
+borne
+Bornean
+Borneo
+borneol
+borning
+bornite
+bornitic
+bornyl
+Boro
+boro
+Borocaine
+borocalcite
+borocarbide
+borocitrate
+borofluohydric
+borofluoric
+borofluoride
+borofluorin
+boroglycerate
+boroglyceride
+boroglycerine
+borolanite
+boron
+boronatrocalcite
+Boronia
+boronic
+borophenol
+borophenylic
+Bororo
+Bororoan
+borosalicylate
+borosalicylic
+borosilicate
+borosilicic
+borotungstate
+borotungstic
+borough
+boroughlet
+boroughmaster
+boroughmonger
+boroughmongering
+boroughmongery
+boroughship
+borowolframic
+borracha
+borrel
+Borrelia
+Borrelomycetaceae
+Borreria
+Borrichia
+Borromean
+Borrovian
+borrow
+borrowable
+borrower
+borrowing
+borsch
+borscht
+borsholder
+borsht
+borstall
+bort
+bortsch
+borty
+bortz
+Boruca
+Borussian
+borwort
+boryl
+Borzicactus
+borzoi
+Bos
+Bosc
+boscage
+bosch
+boschbok
+Boschneger
+boschvark
+boschveld
+bose
+Boselaphus
+boser
+bosh
+Boshas
+bosher
+Bosjesman
+bosjesman
+bosk
+bosker
+bosket
+boskiness
+bosky
+bosn
+Bosniac
+Bosniak
+Bosnian
+Bosnisch
+bosom
+bosomed
+bosomer
+bosomy
+Bosporan
+Bosporanic
+Bosporian
+bosporus
+boss
+bossage
+bossdom
+bossed
+bosselated
+bosselation
+bosser
+bosset
+bossiness
+bossing
+bossism
+bosslet
+bossship
+bossy
+bostangi
+bostanji
+bosthoon
+Boston
+boston
+Bostonese
+Bostonian
+bostonite
+bostrychid
+Bostrychidae
+bostrychoid
+bostrychoidal
+bostryx
+bosun
+Boswellia
+Boswellian
+Boswelliana
+Boswellism
+Boswellize
+bot
+bota
+botanic
+botanical
+botanically
+botanist
+botanize
+botanizer
+botanomancy
+botanophile
+botanophilist
+botany
+botargo
+Botaurinae
+Botaurus
+botch
+botched
+botchedly
+botcher
+botcherly
+botchery
+botchily
+botchiness
+botchka
+botchy
+bote
+Botein
+botella
+boterol
+botfly
+both
+bother
+botheration
+botherer
+botherheaded
+botherment
+bothersome
+bothlike
+Bothnian
+Bothnic
+bothrenchyma
+Bothriocephalus
+Bothriocidaris
+Bothriolepis
+bothrium
+Bothrodendron
+bothropic
+Bothrops
+bothros
+bothsided
+bothsidedness
+bothway
+bothy
+Botocudo
+botonee
+botong
+Botrychium
+Botrydium
+Botryllidae
+Botryllus
+botryogen
+botryoid
+botryoidal
+botryoidally
+botryolite
+Botryomyces
+botryomycoma
+botryomycosis
+botryomycotic
+Botryopteriaceae
+botryopterid
+Botryopteris
+botryose
+botryotherapy
+Botrytis
+bott
+bottekin
+Botticellian
+bottine
+bottle
+bottlebird
+bottled
+bottleflower
+bottleful
+bottlehead
+bottleholder
+bottlelike
+bottlemaker
+bottlemaking
+bottleman
+bottleneck
+bottlenest
+bottlenose
+bottler
+bottling
+bottom
+bottomchrome
+bottomed
+bottomer
+bottoming
+bottomless
+bottomlessly
+bottomlessness
+bottommost
+bottomry
+bottstick
+botuliform
+botulin
+botulinum
+botulism
+botulismus
+bouchal
+bouchaleen
+boucharde
+bouche
+boucher
+boucherism
+boucherize
+bouchette
+boud
+boudoir
+bouffancy
+bouffant
+Bougainvillaea
+Bougainvillea
+Bougainvillia
+Bougainvilliidae
+bougar
+bouge
+bouget
+bough
+boughed
+boughless
+boughpot
+bought
+boughten
+boughy
+bougie
+bouillabaisse
+bouillon
+bouk
+boukit
+boulangerite
+Boulangism
+Boulangist
+boulder
+boulderhead
+bouldering
+bouldery
+boule
+boulevard
+boulevardize
+boultel
+boulter
+boulterer
+boun
+bounce
+bounceable
+bounceably
+bouncer
+bouncing
+bouncingly
+bound
+boundable
+boundary
+bounded
+boundedly
+boundedness
+bounden
+bounder
+bounding
+boundingly
+boundless
+boundlessly
+boundlessness
+boundly
+boundness
+bounteous
+bounteously
+bounteousness
+bountied
+bountiful
+bountifully
+bountifulness
+bountith
+bountree
+bounty
+bountyless
+bouquet
+bourasque
+Bourbon
+bourbon
+Bourbonesque
+Bourbonian
+Bourbonism
+Bourbonist
+bourbonize
+bourd
+bourder
+bourdon
+bourette
+bourg
+bourgeois
+bourgeoise
+bourgeoisie
+bourgeoisitic
+Bourignian
+Bourignianism
+Bourignianist
+Bourignonism
+Bourignonist
+bourn
+bournless
+bournonite
+bourock
+Bourout
+bourse
+bourtree
+bouse
+bouser
+Boussingaultia
+boussingaultite
+boustrophedon
+boustrophedonic
+bousy
+bout
+boutade
+Bouteloua
+bouto
+boutonniere
+boutylka
+Bouvardia
+bouw
+bovarism
+bovarysm
+bovate
+bovenland
+bovicide
+boviculture
+bovid
+Bovidae
+boviform
+bovine
+bovinely
+bovinity
+Bovista
+bovoid
+bovovaccination
+bovovaccine
+bow
+bowable
+bowback
+bowbells
+bowbent
+bowboy
+Bowdichia
+bowdlerism
+bowdlerization
+bowdlerize
+bowed
+bowedness
+bowel
+boweled
+bowelless
+bowellike
+bowels
+bowenite
+bower
+bowerbird
+bowerlet
+bowermaiden
+bowermay
+bowerwoman
+Bowery
+bowery
+Boweryish
+bowet
+bowfin
+bowgrace
+bowhead
+bowie
+bowieful
+bowing
+bowingly
+bowk
+bowkail
+bowker
+bowknot
+bowl
+bowla
+bowleg
+bowlegged
+bowleggedness
+bowler
+bowless
+bowlful
+bowlike
+bowline
+bowling
+bowllike
+bowlmaker
+bowls
+bowly
+bowmaker
+bowmaking
+bowman
+bowpin
+bowralite
+bowshot
+bowsprit
+bowstave
+bowstring
+bowstringed
+bowwoman
+bowwood
+bowwort
+bowwow
+bowyer
+boxberry
+boxboard
+boxbush
+boxcar
+boxen
+Boxer
+boxer
+Boxerism
+boxfish
+boxful
+boxhaul
+boxhead
+boxing
+boxkeeper
+boxlike
+boxmaker
+boxmaking
+boxman
+boxthorn
+boxty
+boxwallah
+boxwood
+boxwork
+boxy
+boy
+boyang
+boyar
+boyard
+boyardism
+boyardom
+boyarism
+Boyce
+boycott
+boycottage
+boycotter
+boycottism
+Boyd
+boydom
+boyer
+boyhood
+boyish
+boyishly
+boyishness
+boyism
+boyla
+boylike
+boyology
+boysenberry
+boyship
+boza
+bozal
+bozo
+bozze
+bra
+brab
+brabagious
+brabant
+Brabanter
+Brabantine
+brabble
+brabblement
+brabbler
+brabblingly
+Brabejum
+braca
+braccate
+braccia
+bracciale
+braccianite
+braccio
+brace
+braced
+bracelet
+braceleted
+bracer
+bracero
+braces
+brach
+Brachelytra
+brachelytrous
+bracherer
+brachering
+brachet
+brachial
+brachialgia
+brachialis
+Brachiata
+brachiate
+brachiation
+brachiator
+brachiferous
+brachigerous
+Brachinus
+brachiocephalic
+brachiocrural
+brachiocubital
+brachiocyllosis
+brachiofacial
+brachiofaciolingual
+brachioganoid
+Brachioganoidei
+brachiolaria
+brachiolarian
+brachiopod
+Brachiopoda
+brachiopode
+brachiopodist
+brachiopodous
+brachioradial
+brachioradialis
+brachiorrhachidian
+brachiorrheuma
+brachiosaur
+Brachiosaurus
+brachiostrophosis
+brachiotomy
+brachistocephali
+brachistocephalic
+brachistocephalous
+brachistocephaly
+brachistochrone
+brachistochronic
+brachistochronous
+brachium
+brachtmema
+brachyaxis
+brachycardia
+brachycatalectic
+brachycephal
+brachycephalic
+brachycephalism
+brachycephalization
+brachycephalize
+brachycephalous
+brachycephaly
+Brachycera
+brachyceral
+brachyceric
+brachycerous
+brachychronic
+brachycnemic
+Brachycome
+brachycranial
+brachydactyl
+brachydactylic
+brachydactylism
+brachydactylous
+brachydactyly
+brachydiagonal
+brachydodrome
+brachydodromous
+brachydomal
+brachydomatic
+brachydome
+brachydont
+brachydontism
+brachyfacial
+brachyglossal
+brachygnathia
+brachygnathism
+brachygnathous
+brachygrapher
+brachygraphic
+brachygraphical
+brachygraphy
+brachyhieric
+brachylogy
+brachymetropia
+brachymetropic
+Brachyoura
+brachyphalangia
+Brachyphyllum
+brachypinacoid
+brachypinacoidal
+brachypleural
+brachypnea
+brachypodine
+brachypodous
+brachyprism
+brachyprosopic
+brachypterous
+brachypyramid
+brachyrrhinia
+brachysclereid
+brachyskelic
+brachysm
+brachystaphylic
+Brachystegia
+brachystochrone
+Brachystomata
+brachystomatous
+brachystomous
+brachytic
+brachytypous
+Brachyura
+brachyural
+brachyuran
+brachyuranic
+brachyure
+brachyurous
+Brachyurus
+bracing
+bracingly
+bracingness
+brack
+brackebuschite
+bracken
+brackened
+bracker
+bracket
+bracketing
+bracketwise
+brackish
+brackishness
+brackmard
+bracky
+Bracon
+braconid
+Braconidae
+bract
+bractea
+bracteal
+bracteate
+bracted
+bracteiform
+bracteolate
+bracteole
+bracteose
+bractless
+bractlet
+Brad
+brad
+bradawl
+Bradbury
+Bradburya
+bradenhead
+Bradford
+Bradley
+bradmaker
+Bradshaw
+bradsot
+bradyacousia
+bradycardia
+bradycauma
+bradycinesia
+bradycrotic
+bradydactylia
+bradyesthesia
+bradyglossia
+bradykinesia
+bradykinetic
+bradylalia
+bradylexia
+bradylogia
+bradynosus
+bradypepsia
+bradypeptic
+bradyphagia
+bradyphasia
+bradyphemia
+bradyphrasia
+bradyphrenia
+bradypnea
+bradypnoea
+bradypod
+bradypode
+Bradypodidae
+bradypodoid
+Bradypus
+bradyseism
+bradyseismal
+bradyseismic
+bradyseismical
+bradyseismism
+bradyspermatism
+bradysphygmia
+bradystalsis
+bradyteleocinesia
+bradyteleokinesis
+bradytocia
+bradytrophic
+bradyuria
+brae
+braeface
+braehead
+braeman
+braeside
+brag
+braggardism
+braggart
+braggartism
+braggartly
+braggartry
+braggat
+bragger
+braggery
+bragget
+bragging
+braggingly
+braggish
+braggishly
+Bragi
+bragite
+bragless
+braguette
+Brahm
+Brahma
+brahmachari
+Brahmahood
+Brahmaic
+Brahman
+Brahmana
+Brahmanaspati
+Brahmanda
+Brahmaness
+Brahmanhood
+Brahmani
+Brahmanic
+Brahmanical
+Brahmanism
+Brahmanist
+Brahmanistic
+Brahmanize
+Brahmany
+Brahmi
+Brahmic
+Brahmin
+Brahminic
+Brahminism
+Brahmoism
+Brahmsian
+Brahmsite
+Brahui
+braid
+braided
+braider
+braiding
+Braidism
+Braidist
+brail
+Braille
+Braillist
+brain
+brainache
+braincap
+braincraft
+brainer
+brainfag
+brainge
+braininess
+brainless
+brainlessly
+brainlessness
+brainlike
+brainpan
+brains
+brainsick
+brainsickly
+brainsickness
+brainstone
+brainward
+brainwash
+brainwasher
+brainwashing
+brainwater
+brainwood
+brainwork
+brainworker
+brainy
+braird
+braireau
+brairo
+braise
+brake
+brakeage
+brakehand
+brakehead
+brakeless
+brakeload
+brakemaker
+brakemaking
+brakeman
+braker
+brakeroot
+brakesman
+brakie
+braky
+Bram
+Bramantesque
+Bramantip
+bramble
+brambleberry
+bramblebush
+brambled
+brambling
+brambly
+brambrack
+Bramia
+bran
+brancard
+branch
+branchage
+branched
+Branchellion
+brancher
+branchery
+branchful
+branchi
+branchia
+branchiae
+branchial
+Branchiata
+branchiate
+branchicolous
+branchiferous
+branchiform
+branchihyal
+branchiness
+branching
+Branchiobdella
+branchiocardiac
+branchiogenous
+branchiomere
+branchiomeric
+branchiomerism
+branchiopallial
+branchiopod
+Branchiopoda
+branchiopodan
+branchiopodous
+Branchiopulmonata
+branchiopulmonate
+branchiosaur
+Branchiosauria
+branchiosaurian
+Branchiosaurus
+branchiostegal
+Branchiostegidae
+branchiostegite
+branchiostegous
+Branchiostoma
+branchiostomid
+Branchiostomidae
+Branchipodidae
+Branchipus
+branchireme
+Branchiura
+branchiurous
+branchless
+branchlet
+branchlike
+branchling
+branchman
+branchstand
+branchway
+branchy
+brand
+branded
+Brandenburg
+Brandenburger
+brander
+brandering
+Brandi
+brandied
+brandify
+brandise
+brandish
+brandisher
+brandisite
+brandless
+brandling
+Brandon
+brandreth
+Brandy
+brandy
+brandyball
+brandyman
+brandywine
+brangle
+brangled
+branglement
+brangler
+brangling
+branial
+brank
+brankie
+brankursine
+branle
+branner
+brannerite
+branny
+bransle
+bransolder
+brant
+Branta
+brantail
+brantness
+Brasenia
+brash
+brashiness
+brashness
+brashy
+brasiletto
+brasque
+brass
+brassage
+brassard
+brassart
+Brassavola
+brassbound
+brassbounder
+brasse
+brasser
+brasset
+Brassia
+brassic
+Brassica
+Brassicaceae
+brassicaceous
+brassidic
+brassie
+brassiere
+brassily
+brassiness
+brassish
+brasslike
+brassware
+brasswork
+brassworker
+brassworks
+brassy
+brassylic
+brat
+bratling
+bratstvo
+brattach
+brattice
+bratticer
+bratticing
+brattie
+brattish
+brattishing
+brattle
+brauna
+Brauneberger
+Brauneria
+braunite
+Brauronia
+Brauronian
+Brava
+bravade
+bravado
+bravadoism
+brave
+bravehearted
+bravely
+braveness
+braver
+bravery
+braving
+bravish
+bravo
+bravoite
+bravura
+bravuraish
+braw
+brawl
+brawler
+brawling
+brawlingly
+brawlsome
+brawly
+brawlys
+brawn
+brawned
+brawnedness
+brawner
+brawnily
+brawniness
+brawny
+braws
+braxy
+bray
+brayer
+brayera
+brayerin
+braystone
+braza
+braze
+brazen
+brazenface
+brazenfaced
+brazenfacedly
+brazenly
+brazenness
+brazer
+brazera
+brazier
+braziery
+brazil
+brazilein
+brazilette
+Brazilian
+brazilin
+brazilite
+brazilwood
+breach
+breacher
+breachful
+breachy
+bread
+breadbasket
+breadberry
+breadboard
+breadbox
+breadearner
+breadearning
+breaden
+breadfruit
+breadless
+breadlessness
+breadmaker
+breadmaking
+breadman
+breadnut
+breadroot
+breadseller
+breadstuff
+breadth
+breadthen
+breadthless
+breadthriders
+breadthways
+breadthwise
+breadwinner
+breadwinning
+breaghe
+break
+breakable
+breakableness
+breakably
+breakage
+breakaway
+breakax
+breakback
+breakbones
+breakdown
+breaker
+breakerman
+breakfast
+breakfaster
+breakfastless
+breaking
+breakless
+breakneck
+breakoff
+breakout
+breakover
+breakshugh
+breakstone
+breakthrough
+breakup
+breakwater
+breakwind
+bream
+breards
+breast
+breastband
+breastbeam
+breastbone
+breasted
+breaster
+breastfeeding
+breastful
+breastheight
+breasthook
+breastie
+breasting
+breastless
+breastmark
+breastpiece
+breastpin
+breastplate
+breastplow
+breastrail
+breastrope
+breastsummer
+breastweed
+breastwise
+breastwood
+breastwork
+breath
+breathable
+breathableness
+breathe
+breathed
+breather
+breathful
+breathiness
+breathing
+breathingly
+breathless
+breathlessly
+breathlessness
+breathseller
+breathy
+breba
+breccia
+breccial
+brecciated
+brecciation
+brecham
+Brechites
+breck
+brecken
+bred
+bredbergite
+brede
+bredi
+bree
+breech
+breechblock
+breechcloth
+breechclout
+breeched
+breeches
+breechesflower
+breechesless
+breeching
+breechless
+breechloader
+breed
+breedable
+breedbate
+breeder
+breediness
+breeding
+breedy
+breek
+breekless
+breekums
+breeze
+breezeful
+breezeless
+breezelike
+breezeway
+breezily
+breeziness
+breezy
+bregma
+bregmata
+bregmate
+bregmatic
+brehon
+brehonship
+brei
+breislakite
+breithauptite
+brekkle
+brelaw
+breloque
+breme
+bremely
+bremeness
+Bremia
+bremsstrahlung
+Brenda
+Brendan
+Brender
+brennage
+Brent
+brent
+Brenthis
+brephic
+Brescian
+Bret
+bret
+bretelle
+bretesse
+breth
+brethren
+Breton
+Bretonian
+Bretschneideraceae
+Brett
+brett
+brettice
+Bretwalda
+Bretwaldadom
+Bretwaldaship
+breunnerite
+breva
+breve
+brevet
+brevetcy
+breviary
+breviate
+breviature
+brevicaudate
+brevicipitid
+Brevicipitidae
+breviconic
+brevier
+brevifoliate
+breviger
+brevilingual
+breviloquence
+breviloquent
+breviped
+brevipen
+brevipennate
+breviradiate
+brevirostral
+brevirostrate
+Brevirostrines
+brevit
+brevity
+brew
+brewage
+brewer
+brewership
+brewery
+brewhouse
+brewing
+brewis
+brewmaster
+brewst
+brewster
+brewsterite
+brey
+Brian
+briar
+briarberry
+Briard
+Briarean
+Briareus
+briarroot
+bribe
+bribee
+bribegiver
+bribegiving
+bribemonger
+briber
+bribery
+bribetaker
+bribetaking
+bribeworthy
+Bribri
+brichen
+brichette
+brick
+brickbat
+brickcroft
+brickel
+bricken
+brickfield
+brickfielder
+brickhood
+bricking
+brickish
+brickkiln
+bricklayer
+bricklaying
+brickle
+brickleness
+bricklike
+brickliner
+bricklining
+brickly
+brickmaker
+brickmaking
+brickmason
+brickset
+bricksetter
+bricktimber
+brickwise
+brickwork
+bricky
+brickyard
+bricole
+bridal
+bridale
+bridaler
+bridally
+Bride
+bride
+bridebed
+bridebowl
+bridecake
+bridechamber
+bridecup
+bridegod
+bridegroom
+bridegroomship
+bridehead
+bridehood
+brideknot
+bridelace
+brideless
+bridelike
+bridely
+bridemaid
+bridemaiden
+bridemaidship
+brideship
+bridesmaid
+bridesmaiding
+bridesman
+bridestake
+bridewain
+brideweed
+bridewell
+bridewort
+bridge
+bridgeable
+bridgeboard
+bridgebote
+bridgebuilder
+bridgebuilding
+bridged
+bridgehead
+bridgekeeper
+bridgeless
+bridgelike
+bridgemaker
+bridgemaking
+bridgeman
+bridgemaster
+bridgepot
+Bridger
+bridger
+Bridget
+bridgetree
+bridgeward
+bridgewards
+bridgeway
+bridgework
+bridging
+bridle
+bridled
+bridleless
+bridleman
+bridler
+bridling
+bridoon
+brief
+briefing
+briefless
+brieflessly
+brieflessness
+briefly
+briefness
+briefs
+brier
+brierberry
+briered
+brierroot
+brierwood
+briery
+brieve
+brig
+brigade
+brigadier
+brigadiership
+brigalow
+brigand
+brigandage
+brigander
+brigandine
+brigandish
+brigandishly
+brigandism
+Brigantes
+Brigantia
+brigantine
+brigatry
+brigbote
+brigetty
+Briggs
+Briggsian
+Brighella
+Brighid
+bright
+brighten
+brightener
+brightening
+Brighteyes
+brighteyes
+brightish
+brightly
+brightness
+brightsmith
+brightsome
+brightsomeness
+brightwork
+Brigid
+Brigittine
+brill
+brilliance
+brilliancy
+brilliandeer
+brilliant
+brilliantine
+brilliantly
+brilliantness
+brilliantwise
+brilliolette
+brillolette
+brills
+brim
+brimborion
+brimborium
+brimful
+brimfully
+brimfulness
+briming
+brimless
+brimmed
+brimmer
+brimming
+brimmingly
+brimstone
+brimstonewort
+brimstony
+brin
+brindlish
+brine
+brinehouse
+brineless
+brineman
+briner
+bring
+bringal
+bringall
+bringer
+brininess
+brinish
+brinishness
+brinjal
+brinjarry
+brink
+brinkless
+briny
+brioche
+briolette
+brique
+briquette
+brisk
+brisken
+brisket
+briskish
+briskly
+briskness
+brisling
+brisque
+briss
+Brissotin
+Brissotine
+bristle
+bristlebird
+bristlecone
+bristled
+bristleless
+bristlelike
+bristler
+bristletail
+bristlewort
+bristliness
+bristly
+Bristol
+brisure
+brit
+Britain
+Britannia
+Britannian
+Britannic
+Britannically
+britchka
+brith
+brither
+Briticism
+British
+Britisher
+Britishhood
+Britishism
+Britishly
+Britishness
+Briton
+Britoness
+britska
+Brittany
+britten
+brittle
+brittlebush
+brittlely
+brittleness
+brittlestem
+brittlewood
+brittlewort
+brittling
+Briza
+brizz
+broach
+broacher
+broad
+broadacre
+broadax
+broadbill
+Broadbrim
+broadbrim
+broadcast
+broadcaster
+broadcloth
+broaden
+broadhead
+broadhearted
+broadhorn
+broadish
+broadleaf
+broadloom
+broadly
+broadmouth
+broadness
+broadpiece
+broadshare
+broadsheet
+broadside
+broadspread
+broadsword
+broadtail
+broadthroat
+Broadway
+broadway
+Broadwayite
+broadways
+broadwife
+broadwise
+brob
+Brobdingnag
+Brobdingnagian
+brocade
+brocaded
+brocard
+brocardic
+brocatel
+brocatello
+broccoli
+broch
+brochan
+brochant
+brochantite
+broche
+brochette
+brochidodromous
+brocho
+brochure
+brock
+brockage
+brocked
+brocket
+brockle
+brod
+brodder
+brodeglass
+brodequin
+broderer
+Brodiaea
+Brodie
+brog
+brogan
+brogger
+broggerite
+broggle
+brogue
+brogueful
+brogueneer
+broguer
+broguery
+broguish
+broider
+broiderer
+broideress
+broidery
+broigne
+broil
+broiler
+broiling
+broilingly
+brokage
+broke
+broken
+brokenhearted
+brokenheartedly
+brokenheartedness
+brokenly
+brokenness
+broker
+brokerage
+brokeress
+brokership
+broking
+brolga
+broll
+brolly
+broma
+bromacetanilide
+bromacetate
+bromacetic
+bromacetone
+bromal
+bromalbumin
+bromamide
+bromargyrite
+bromate
+bromaurate
+bromauric
+brombenzamide
+brombenzene
+brombenzyl
+bromcamphor
+bromcresol
+brome
+bromeigon
+Bromeikon
+bromeikon
+Bromelia
+Bromeliaceae
+bromeliaceous
+bromeliad
+bromelin
+bromellite
+bromethyl
+bromethylene
+bromgelatin
+bromhidrosis
+bromhydrate
+bromhydric
+Bromian
+bromic
+bromide
+bromidic
+bromidically
+bromidrosis
+brominate
+bromination
+bromindigo
+bromine
+brominism
+brominize
+bromiodide
+Bromios
+bromism
+bromite
+Bromius
+bromization
+bromize
+bromizer
+bromlite
+bromoacetone
+bromoaurate
+bromoauric
+bromobenzene
+bromobenzyl
+bromocamphor
+bromochlorophenol
+bromocresol
+bromocyanidation
+bromocyanide
+bromocyanogen
+bromoethylene
+bromoform
+bromogelatin
+bromohydrate
+bromohydrin
+bromoil
+bromoiodide
+bromoiodism
+bromoiodized
+bromoketone
+bromol
+bromomania
+bromomenorrhea
+bromomethane
+bromometric
+bromometrical
+bromometrically
+bromometry
+bromonaphthalene
+bromophenol
+bromopicrin
+bromopnea
+bromoprotein
+bromothymol
+bromous
+bromphenol
+brompicrin
+bromthymol
+bromuret
+Bromus
+bromvogel
+bromyrite
+bronc
+bronchadenitis
+bronchi
+bronchia
+bronchial
+bronchially
+bronchiarctia
+bronchiectasis
+bronchiectatic
+bronchiloquy
+bronchiocele
+bronchiocrisis
+bronchiogenic
+bronchiolar
+bronchiole
+bronchioli
+bronchiolitis
+bronchiolus
+bronchiospasm
+bronchiostenosis
+bronchitic
+bronchitis
+bronchium
+bronchoadenitis
+bronchoalveolar
+bronchoaspergillosis
+bronchoblennorrhea
+bronchocavernous
+bronchocele
+bronchocephalitis
+bronchoconstriction
+bronchoconstrictor
+bronchodilatation
+bronchodilator
+bronchoegophony
+bronchoesophagoscopy
+bronchogenic
+bronchohemorrhagia
+broncholemmitis
+broncholith
+broncholithiasis
+bronchomotor
+bronchomucormycosis
+bronchomycosis
+bronchopathy
+bronchophonic
+bronchophony
+bronchophthisis
+bronchoplasty
+bronchoplegia
+bronchopleurisy
+bronchopneumonia
+bronchopneumonic
+bronchopulmonary
+bronchorrhagia
+bronchorrhaphy
+bronchorrhea
+bronchoscope
+bronchoscopic
+bronchoscopist
+bronchoscopy
+bronchospasm
+bronchostenosis
+bronchostomy
+bronchotetany
+bronchotome
+bronchotomist
+bronchotomy
+bronchotracheal
+bronchotyphoid
+bronchotyphus
+bronchovesicular
+bronchus
+bronco
+broncobuster
+brongniardite
+bronk
+Bronteana
+bronteon
+brontephobia
+Brontesque
+bronteum
+brontide
+brontogram
+brontograph
+brontolite
+brontology
+brontometer
+brontophobia
+Brontops
+Brontosaurus
+brontoscopy
+Brontotherium
+Brontozoum
+Bronx
+bronze
+bronzed
+bronzelike
+bronzen
+bronzer
+bronzesmith
+bronzewing
+bronzify
+bronzine
+bronzing
+bronzite
+bronzitite
+bronzy
+broo
+brooch
+brood
+brooder
+broodiness
+brooding
+broodingly
+broodless
+broodlet
+broodling
+broody
+brook
+brookable
+Brooke
+brooked
+brookflower
+brookie
+brookite
+brookless
+brooklet
+brooklike
+brooklime
+Brooklynite
+brookside
+brookweed
+brooky
+brool
+broom
+broombush
+broomcorn
+broomer
+broommaker
+broommaking
+broomrape
+broomroot
+broomshank
+broomstaff
+broomstick
+broomstraw
+broomtail
+broomweed
+broomwood
+broomwort
+broomy
+broon
+broose
+broozled
+brose
+Brosimum
+brosot
+brosy
+brot
+brotan
+brotany
+broth
+brothel
+brotheler
+brothellike
+brothelry
+brother
+brotherhood
+brotherless
+brotherlike
+brotherliness
+brotherly
+brothership
+Brotherton
+brotherwort
+brothy
+brotocrystal
+Brotula
+brotulid
+Brotulidae
+brotuliform
+brough
+brougham
+brought
+Broussonetia
+brow
+browache
+Browallia
+browallia
+browband
+browbeat
+browbeater
+browbound
+browden
+browed
+browis
+browless
+browman
+brown
+brownback
+browner
+Brownian
+brownie
+browniness
+browning
+Browningesque
+brownish
+Brownism
+Brownist
+Brownistic
+Brownistical
+brownly
+brownness
+brownout
+brownstone
+browntail
+browntop
+brownweed
+brownwort
+browny
+browpiece
+browpost
+browse
+browser
+browsick
+browsing
+browst
+bruang
+Bruce
+Brucella
+brucellosis
+Bruchidae
+Bruchus
+brucia
+brucina
+brucine
+brucite
+bruckle
+bruckled
+bruckleness
+Bructeri
+brugh
+brugnatellite
+bruin
+bruise
+bruiser
+bruisewort
+bruising
+bruit
+bruiter
+bruke
+Brule
+brulee
+brulyie
+brulyiement
+brumal
+Brumalia
+brumby
+brume
+Brummagem
+brummagem
+brumous
+brumstane
+brumstone
+brunch
+Brunella
+Brunellia
+Brunelliaceae
+brunelliaceous
+brunet
+brunetness
+brunette
+brunetteness
+Brunfelsia
+brunissure
+Brunistic
+brunneous
+Brunnichia
+Bruno
+Brunonia
+Brunoniaceae
+Brunonian
+Brunonism
+Brunswick
+brunswick
+brunt
+bruscus
+brush
+brushable
+brushball
+brushbird
+brushbush
+brushed
+brusher
+brushes
+brushet
+brushful
+brushiness
+brushing
+brushite
+brushland
+brushless
+brushlessness
+brushlet
+brushlike
+brushmaker
+brushmaking
+brushman
+brushoff
+brushproof
+brushwood
+brushwork
+brushy
+brusque
+brusquely
+brusqueness
+Brussels
+brustle
+brut
+Bruta
+brutage
+brutal
+brutalism
+brutalist
+brutalitarian
+brutality
+brutalization
+brutalize
+brutally
+brute
+brutedom
+brutelike
+brutely
+bruteness
+brutification
+brutify
+bruting
+brutish
+brutishly
+brutishness
+brutism
+brutter
+Brutus
+bruzz
+Bryaceae
+bryaceous
+Bryales
+Bryan
+Bryanism
+Bryanite
+Bryanthus
+Bryce
+bryogenin
+bryological
+bryologist
+bryology
+Bryonia
+bryonidin
+bryonin
+bryony
+Bryophyllum
+Bryophyta
+bryophyte
+bryophytic
+Bryozoa
+bryozoan
+bryozoon
+bryozoum
+Brython
+Brythonic
+Bryum
+Bu
+bu
+bual
+buaze
+bub
+buba
+bubal
+bubaline
+Bubalis
+bubalis
+Bubastid
+Bubastite
+bubble
+bubbleless
+bubblement
+bubbler
+bubbling
+bubblingly
+bubblish
+bubbly
+bubby
+bubbybush
+Bube
+bubinga
+Bubo
+bubo
+buboed
+bubonalgia
+bubonic
+Bubonidae
+bubonocele
+bubukle
+bucare
+bucca
+buccal
+buccally
+buccan
+buccaneer
+buccaneerish
+buccate
+Buccellarius
+buccina
+buccinal
+buccinator
+buccinatory
+Buccinidae
+bucciniform
+buccinoid
+Buccinum
+Bucco
+buccobranchial
+buccocervical
+buccogingival
+buccolabial
+buccolingual
+bucconasal
+Bucconidae
+Bucconinae
+buccopharyngeal
+buccula
+Bucculatrix
+bucentaur
+Bucephala
+Bucephalus
+Buceros
+Bucerotes
+Bucerotidae
+Bucerotinae
+Buchanan
+Buchanite
+buchite
+Buchloe
+Buchmanism
+Buchmanite
+Buchnera
+buchnerite
+buchonite
+buchu
+buck
+buckaroo
+buckberry
+buckboard
+buckbrush
+buckbush
+bucked
+buckeen
+bucker
+bucket
+bucketer
+bucketful
+bucketing
+bucketmaker
+bucketmaking
+bucketman
+buckety
+buckeye
+buckhorn
+buckhound
+buckie
+bucking
+buckish
+buckishly
+buckishness
+buckjump
+buckjumper
+bucklandite
+buckle
+buckled
+buckleless
+buckler
+Buckleya
+buckling
+bucklum
+bucko
+buckplate
+buckpot
+buckra
+buckram
+bucksaw
+buckshee
+buckshot
+buckskin
+buckskinned
+buckstall
+buckstay
+buckstone
+bucktail
+buckthorn
+bucktooth
+buckwagon
+buckwash
+buckwasher
+buckwashing
+buckwheat
+buckwheater
+buckwheatlike
+Bucky
+bucky
+bucoliast
+bucolic
+bucolical
+bucolically
+bucolicism
+Bucorvinae
+Bucorvus
+bucrane
+bucranium
+Bud
+bud
+buda
+buddage
+budder
+Buddh
+Buddha
+Buddhahood
+Buddhaship
+buddhi
+Buddhic
+Buddhism
+Buddhist
+Buddhistic
+Buddhistical
+Buddhology
+budding
+buddle
+Buddleia
+buddleman
+buddler
+buddy
+budge
+budger
+budgeree
+budgereegah
+budgerigar
+budgerow
+budget
+budgetary
+budgeteer
+budgeter
+budgetful
+Budh
+budless
+budlet
+budlike
+budmash
+Budorcas
+budtime
+Budukha
+Buduma
+budwood
+budworm
+budzat
+Buettneria
+Buettneriaceae
+bufagin
+buff
+buffable
+buffalo
+buffaloback
+buffball
+buffcoat
+buffed
+buffer
+buffet
+buffeter
+buffing
+buffle
+bufflehead
+bufflehorn
+buffont
+buffoon
+buffoonery
+buffoonesque
+buffoonish
+buffoonism
+buffware
+buffy
+bufidin
+bufo
+Bufonidae
+bufonite
+bufotalin
+bug
+bugaboo
+bugan
+bugbane
+bugbear
+bugbeardom
+bugbearish
+bugbite
+bugdom
+bugfish
+bugger
+buggery
+bugginess
+buggy
+buggyman
+bughead
+bughouse
+Bugi
+Buginese
+Buginvillaea
+bugle
+bugled
+bugler
+buglet
+bugleweed
+buglewort
+bugloss
+bugologist
+bugology
+bugproof
+bugre
+bugseed
+bugweed
+bugwort
+buhl
+buhr
+buhrstone
+build
+buildable
+builder
+building
+buildingless
+buildress
+buildup
+built
+buirdly
+buisson
+buist
+Bukat
+Bukeyef
+bukh
+Bukidnon
+bukshi
+bulak
+Bulanda
+bulb
+bulbaceous
+bulbar
+bulbed
+bulbiferous
+bulbiform
+bulbil
+Bulbilis
+bulbilla
+bulbless
+bulblet
+bulblike
+bulbocapnin
+bulbocapnine
+bulbocavernosus
+bulbocavernous
+Bulbochaete
+Bulbocodium
+bulbomedullary
+bulbomembranous
+bulbonuclear
+Bulbophyllum
+bulborectal
+bulbose
+bulbospinal
+bulbotuber
+bulbous
+bulbul
+bulbule
+bulby
+bulchin
+Bulgar
+Bulgari
+Bulgarian
+Bulgaric
+Bulgarophil
+bulge
+bulger
+bulginess
+bulgy
+bulimia
+bulimiac
+bulimic
+bulimiform
+bulimoid
+Bulimulidae
+Bulimus
+bulimy
+bulk
+bulked
+bulker
+bulkhead
+bulkheaded
+bulkily
+bulkiness
+bulkish
+bulky
+bull
+bulla
+bullace
+bullamacow
+bullan
+bullary
+bullate
+bullated
+bullation
+bullback
+bullbaiting
+bullbat
+bullbeggar
+bullberry
+bullbird
+bullboat
+bullcart
+bullcomber
+bulldog
+bulldogged
+bulldoggedness
+bulldoggy
+bulldogism
+bulldoze
+bulldozer
+buller
+bullet
+bulleted
+bullethead
+bulletheaded
+bulletheadedness
+bulletin
+bulletless
+bulletlike
+bulletmaker
+bulletmaking
+bulletproof
+bulletwood
+bullety
+bullfeast
+bullfight
+bullfighter
+bullfighting
+bullfinch
+bullfist
+bullflower
+bullfoot
+bullfrog
+bullhead
+bullheaded
+bullheadedly
+bullheadedness
+bullhide
+bullhoof
+bullhorn
+Bullidae
+bulliform
+bullimong
+bulling
+bullion
+bullionism
+bullionist
+bullionless
+bullish
+bullishly
+bullishness
+bullism
+bullit
+bullneck
+bullnose
+bullnut
+bullock
+bullocker
+Bullockite
+bullockman
+bullocky
+Bullom
+bullous
+bullpates
+bullpoll
+bullpout
+bullskin
+bullsticker
+bullsucker
+bullswool
+bulltoad
+bullule
+bullweed
+bullwhack
+bullwhacker
+bullwhip
+bullwort
+bully
+bullyable
+bullydom
+bullyhuff
+bullying
+bullyism
+bullyrag
+bullyragger
+bullyragging
+bullyrook
+bulrush
+bulrushlike
+bulrushy
+bulse
+bult
+bulter
+bultey
+bultong
+bultow
+bulwand
+bulwark
+bum
+bumbailiff
+bumbailiffship
+bumbarge
+bumbaste
+bumbaze
+bumbee
+bumbershoot
+bumble
+bumblebee
+bumbleberry
+Bumbledom
+bumblefoot
+bumblekite
+bumblepuppy
+bumbler
+bumbo
+bumboat
+bumboatman
+bumboatwoman
+bumclock
+Bumelia
+bumicky
+bummalo
+bummaree
+bummed
+bummer
+bummerish
+bummie
+bumming
+bummler
+bummock
+bump
+bumpee
+bumper
+bumperette
+bumpily
+bumpiness
+bumping
+bumpingly
+bumpkin
+bumpkinet
+bumpkinish
+bumpkinly
+bumpology
+bumptious
+bumptiously
+bumptiousness
+bumpy
+bumtrap
+bumwood
+bun
+Buna
+buna
+buncal
+bunce
+bunch
+bunchberry
+buncher
+bunchflower
+bunchily
+bunchiness
+bunchy
+buncombe
+bund
+Bunda
+Bundahish
+Bundeli
+bunder
+Bundestag
+bundle
+bundler
+bundlerooted
+bundlet
+bundobust
+bundook
+Bundu
+bundweed
+bundy
+bunemost
+bung
+Bunga
+bungaloid
+bungalow
+bungarum
+Bungarus
+bungee
+bungerly
+bungey
+bungfu
+bungfull
+bunghole
+bungle
+bungler
+bunglesome
+bungling
+bunglingly
+bungmaker
+bungo
+bungwall
+bungy
+Buninahua
+bunion
+bunk
+bunker
+bunkerman
+bunkery
+bunkhouse
+bunkie
+bunkload
+bunko
+bunkum
+bunnell
+bunny
+bunnymouth
+bunodont
+Bunodonta
+bunolophodont
+Bunomastodontidae
+bunoselenodont
+bunsenite
+bunt
+buntal
+bunted
+Bunter
+bunter
+bunting
+buntline
+bunton
+bunty
+bunya
+bunyah
+bunyip
+Bunyoro
+buoy
+buoyage
+buoyance
+buoyancy
+buoyant
+buoyantly
+buoyantness
+Buphaga
+buphthalmia
+buphthalmic
+Buphthalmum
+bupleurol
+Bupleurum
+buplever
+buprestid
+Buprestidae
+buprestidan
+Buprestis
+bur
+buran
+burao
+Burbank
+burbank
+burbankian
+Burbankism
+burbark
+Burberry
+burble
+burbler
+burbly
+burbot
+burbush
+burd
+burdalone
+burden
+burdener
+burdenless
+burdenous
+burdensome
+burdensomely
+burdensomeness
+burdie
+Burdigalian
+burdock
+burdon
+bure
+bureau
+bureaucracy
+bureaucrat
+bureaucratic
+bureaucratical
+bureaucratically
+bureaucratism
+bureaucratist
+bureaucratization
+bureaucratize
+bureaux
+burel
+burele
+buret
+burette
+burfish
+burg
+burgage
+burgality
+burgall
+burgee
+burgensic
+burgeon
+burgess
+burgessdom
+burggrave
+burgh
+burghal
+burghalpenny
+burghbote
+burghemot
+burgher
+burgherage
+burgherdom
+burgheress
+burgherhood
+burghermaster
+burghership
+burghmaster
+burghmoot
+burglar
+burglarious
+burglariously
+burglarize
+burglarproof
+burglary
+burgle
+burgomaster
+burgomastership
+burgonet
+burgoo
+burgoyne
+burgrave
+burgraviate
+burgul
+Burgundian
+Burgundy
+burgus
+burgware
+burhead
+Burhinidae
+Burhinus
+Buri
+buri
+burial
+burian
+Buriat
+buried
+burier
+burin
+burinist
+burion
+buriti
+burka
+burke
+burker
+burkundaz
+burl
+burlap
+burled
+burler
+burlesque
+burlesquely
+burlesquer
+burlet
+burletta
+Burley
+burlily
+burliness
+Burlington
+burly
+Burman
+Burmannia
+Burmanniaceae
+burmanniaceous
+Burmese
+burmite
+burn
+burnable
+burnbeat
+burned
+burner
+burnet
+burnetize
+burnfire
+burnie
+burniebee
+burning
+burningly
+burnish
+burnishable
+burnisher
+burnishing
+burnishment
+burnoose
+burnoosed
+burnous
+burnout
+burnover
+Burnsian
+burnside
+burnsides
+burnt
+burntweed
+burnut
+burnwood
+burny
+buro
+burp
+burr
+burrah
+burrawang
+burred
+burrel
+burrer
+burrgrailer
+burring
+burrish
+burrito
+burrknot
+burro
+burrobrush
+burrow
+burroweed
+burrower
+burrowstown
+burry
+bursa
+bursal
+bursar
+bursarial
+bursarship
+bursary
+bursate
+bursattee
+bursautee
+burse
+burseed
+Bursera
+Burseraceae
+Burseraceous
+bursicle
+bursiculate
+bursiform
+bursitis
+burst
+burster
+burstwort
+burt
+burthenman
+burton
+burtonization
+burtonize
+burucha
+Burushaski
+Burut
+burweed
+bury
+burying
+bus
+Busaos
+busby
+buscarl
+buscarle
+bush
+bushbeater
+bushbuck
+bushcraft
+bushed
+bushel
+busheler
+bushelful
+bushelman
+bushelwoman
+busher
+bushfighter
+bushfighting
+bushful
+bushhammer
+bushi
+bushily
+bushiness
+bushing
+bushland
+bushless
+bushlet
+bushlike
+bushmaker
+bushmaking
+Bushman
+bushmanship
+bushmaster
+bushment
+Bushongo
+bushranger
+bushranging
+bushrope
+bushveld
+bushwa
+bushwhack
+bushwhacker
+bushwhacking
+bushwife
+bushwoman
+bushwood
+bushy
+busied
+busily
+busine
+business
+businesslike
+businesslikeness
+businessman
+businesswoman
+busk
+busked
+busker
+busket
+buskin
+buskined
+buskle
+busky
+busman
+buss
+busser
+bussock
+bussu
+bust
+bustard
+busted
+bustee
+buster
+busthead
+bustic
+busticate
+bustle
+bustled
+bustler
+bustling
+bustlingly
+busy
+busybodied
+busybody
+busybodyish
+busybodyism
+busybodyness
+Busycon
+busyhead
+busying
+busyish
+busyness
+busywork
+but
+butadiene
+butadiyne
+butanal
+butane
+butanoic
+butanol
+butanolid
+butanolide
+butanone
+butch
+butcher
+butcherbird
+butcherdom
+butcherer
+butcheress
+butchering
+butcherless
+butcherliness
+butcherly
+butcherous
+butchery
+Bute
+Butea
+butein
+butene
+butenyl
+Buteo
+buteonine
+butic
+butine
+Butler
+butler
+butlerage
+butlerdom
+butleress
+butlerism
+butlerlike
+butlership
+butlery
+butment
+Butomaceae
+butomaceous
+Butomus
+butoxy
+butoxyl
+Butsu
+butt
+butte
+butter
+butteraceous
+butterback
+butterball
+butterbill
+butterbird
+butterbox
+butterbump
+butterbur
+butterbush
+buttercup
+buttered
+butterfat
+butterfingered
+butterfingers
+butterfish
+butterflower
+butterfly
+butterflylike
+butterhead
+butterine
+butteriness
+butteris
+butterjags
+butterless
+butterlike
+buttermaker
+buttermaking
+butterman
+buttermilk
+buttermonger
+buttermouth
+butternose
+butternut
+butterroot
+butterscotch
+butterweed
+butterwife
+butterwoman
+butterworker
+butterwort
+butterwright
+buttery
+butteryfingered
+buttgenbachite
+butting
+buttinsky
+buttle
+buttock
+buttocked
+buttocker
+button
+buttonball
+buttonbur
+buttonbush
+buttoned
+buttoner
+buttonhold
+buttonholder
+buttonhole
+buttonholer
+buttonhook
+buttonless
+buttonlike
+buttonmold
+buttons
+buttonweed
+buttonwood
+buttony
+buttress
+buttressless
+buttresslike
+buttstock
+buttwoman
+buttwood
+butty
+buttyman
+butyl
+butylamine
+butylation
+butylene
+butylic
+Butyn
+butyne
+butyr
+butyraceous
+butyral
+butyraldehyde
+butyrate
+butyric
+butyrically
+butyrin
+butyrinase
+butyrochloral
+butyrolactone
+butyrometer
+butyrometric
+butyrone
+butyrous
+butyrousness
+butyryl
+Buxaceae
+buxaceous
+Buxbaumia
+Buxbaumiaceae
+buxerry
+buxom
+buxomly
+buxomness
+Buxus
+buy
+buyable
+buyer
+Buyides
+buzane
+buzylene
+buzz
+buzzard
+buzzardlike
+buzzardly
+buzzer
+buzzerphone
+buzzgloak
+buzzies
+buzzing
+buzzingly
+buzzle
+buzzwig
+buzzy
+by
+Byblidaceae
+Byblis
+bycoket
+bye
+byee
+byegaein
+byeman
+byepath
+byerite
+byerlite
+byestreet
+byeworker
+byeworkman
+bygane
+byganging
+bygo
+bygoing
+bygone
+byhand
+bylaw
+bylawman
+byname
+bynedestin
+Bynin
+byon
+byordinar
+byordinary
+byous
+byously
+bypass
+bypasser
+bypast
+bypath
+byplay
+byre
+byreman
+byrewards
+byrewoman
+byrlaw
+byrlawman
+byrnie
+byroad
+Byron
+Byronesque
+Byronian
+Byroniana
+Byronic
+Byronically
+Byronics
+Byronish
+Byronism
+Byronist
+Byronite
+Byronize
+byrrus
+Byrsonima
+byrthynsak
+Bysacki
+bysen
+bysmalith
+byspell
+byssaceous
+byssal
+byssiferous
+byssin
+byssine
+byssinosis
+byssogenous
+byssoid
+byssolite
+byssus
+bystander
+bystreet
+byth
+bytime
+bytownite
+bytownitite
+bywalk
+bywalker
+byway
+bywoner
+byword
+bywork
+Byzantian
+Byzantine
+Byzantinesque
+Byzantinism
+Byzantinize
+C
+c
+ca
+caam
+caama
+caaming
+caapeba
+caatinga
+cab
+caba
+cabaan
+caback
+cabaho
+cabal
+cabala
+cabalassou
+cabaletta
+cabalic
+cabalism
+cabalist
+cabalistic
+cabalistical
+cabalistically
+caballer
+caballine
+caban
+cabana
+cabaret
+cabas
+cabasset
+cabassou
+cabbage
+cabbagehead
+cabbagewood
+cabbagy
+cabber
+cabble
+cabbler
+cabby
+cabda
+cabdriver
+cabdriving
+cabellerote
+caber
+cabernet
+cabestro
+cabezon
+cabilliau
+cabin
+Cabinda
+cabinet
+cabinetmaker
+cabinetmaking
+cabinetry
+cabinetwork
+cabinetworker
+cabinetworking
+cabio
+Cabirean
+Cabiri
+Cabiria
+Cabirian
+Cabiric
+Cabiritic
+cable
+cabled
+cablegram
+cableless
+cablelike
+cableman
+cabler
+cablet
+cableway
+cabling
+cabman
+cabob
+caboceer
+cabochon
+cabocle
+Cabomba
+Cabombaceae
+caboodle
+cabook
+caboose
+caboshed
+cabot
+cabotage
+cabree
+cabrerite
+cabreuva
+cabrilla
+cabriole
+cabriolet
+cabrit
+cabstand
+cabureiba
+cabuya
+Caca
+Cacajao
+Cacalia
+cacam
+Cacan
+Cacana
+cacanthrax
+cacao
+Cacara
+Cacatua
+Cacatuidae
+Cacatuinae
+Caccabis
+cacesthesia
+cacesthesis
+cachalot
+cachaza
+cache
+cachectic
+cachemia
+cachemic
+cachet
+cachexia
+cachexic
+cachexy
+cachibou
+cachinnate
+cachinnation
+cachinnator
+cachinnatory
+cacholong
+cachou
+cachrys
+cachucha
+cachunde
+Cacicus
+cacidrosis
+caciocavallo
+cacique
+caciqueship
+caciquism
+cack
+cackerel
+cackle
+cackler
+cacocholia
+cacochroia
+cacochylia
+cacochymia
+cacochymic
+cacochymical
+cacochymy
+cacocnemia
+cacodaemoniac
+cacodaemonial
+cacodaemonic
+cacodemon
+cacodemonia
+cacodemoniac
+cacodemonial
+cacodemonic
+cacodemonize
+cacodemonomania
+cacodontia
+cacodorous
+cacodoxian
+cacodoxical
+cacodoxy
+cacodyl
+cacodylate
+cacodylic
+cacoeconomy
+cacoepist
+cacoepistic
+cacoepy
+cacoethes
+cacoethic
+cacogalactia
+cacogastric
+cacogenesis
+cacogenic
+cacogenics
+cacogeusia
+cacoglossia
+cacographer
+cacographic
+cacographical
+cacography
+cacology
+cacomagician
+cacomelia
+cacomistle
+cacomixl
+cacomixle
+cacomorphia
+cacomorphosis
+caconychia
+caconym
+caconymic
+cacoon
+cacopathy
+cacopharyngia
+cacophonia
+cacophonic
+cacophonical
+cacophonically
+cacophonist
+cacophonize
+cacophonous
+cacophonously
+cacophony
+cacophthalmia
+cacoplasia
+cacoplastic
+cacoproctia
+cacorhythmic
+cacorrhachis
+cacorrhinia
+cacosmia
+cacospermia
+cacosplanchnia
+cacostomia
+cacothansia
+cacotheline
+cacothesis
+cacothymia
+cacotrichia
+cacotrophia
+cacotrophic
+cacotrophy
+cacotype
+cacoxene
+cacoxenite
+cacozeal
+cacozealous
+cacozyme
+Cactaceae
+cactaceous
+Cactales
+cacti
+cactiform
+cactoid
+Cactus
+cacuminal
+cacuminate
+cacumination
+cacuminous
+cacur
+cad
+cadalene
+cadamba
+cadastral
+cadastration
+cadastre
+cadaver
+cadaveric
+cadaverine
+cadaverize
+cadaverous
+cadaverously
+cadaverousness
+cadbait
+cadbit
+cadbote
+caddice
+caddiced
+Caddie
+caddie
+caddis
+caddised
+caddish
+caddishly
+caddishness
+caddle
+Caddo
+Caddoan
+caddow
+caddy
+cade
+cadelle
+cadence
+cadenced
+cadency
+cadent
+cadential
+cadenza
+cader
+caderas
+Cadet
+cadet
+cadetcy
+cadetship
+cadette
+cadew
+cadge
+cadger
+cadgily
+cadginess
+cadgy
+cadi
+cadilesker
+cadinene
+cadism
+cadiueio
+cadjan
+cadlock
+Cadmean
+cadmia
+cadmic
+cadmide
+cadmiferous
+cadmium
+cadmiumize
+Cadmopone
+Cadmus
+cados
+cadrans
+cadre
+cadua
+caduac
+caduca
+caducary
+caducean
+caduceus
+caduciary
+caducibranch
+Caducibranchiata
+caducibranchiate
+caducicorn
+caducity
+caducous
+cadus
+Cadwal
+Cadwallader
+cadweed
+caeca
+caecal
+caecally
+caecectomy
+caeciform
+Caecilia
+Caeciliae
+caecilian
+Caeciliidae
+caecitis
+caecocolic
+caecostomy
+caecotomy
+caecum
+Caedmonian
+Caedmonic
+Caelian
+caelometer
+Caelum
+Caelus
+Caenogaea
+Caenogaean
+Caenolestes
+caenostylic
+caenostyly
+caeoma
+caeremoniarius
+Caerphilly
+Caesalpinia
+Caesalpiniaceae
+caesalpiniaceous
+Caesar
+Caesardom
+Caesarean
+Caesareanize
+Caesarian
+Caesarism
+Caesarist
+Caesarize
+caesaropapacy
+caesaropapism
+caesaropopism
+Caesarotomy
+Caesarship
+caesious
+caesura
+caesural
+caesuric
+cafeneh
+cafenet
+cafeteria
+caffa
+caffeate
+caffeic
+caffeina
+caffeine
+caffeinic
+caffeinism
+caffeism
+caffeol
+caffeone
+caffetannic
+caffetannin
+caffiso
+caffle
+caffoline
+caffoy
+cafh
+cafiz
+caftan
+caftaned
+cag
+Cagayan
+cage
+caged
+cageful
+cageless
+cagelike
+cageling
+cageman
+cager
+cagester
+cagework
+cagey
+caggy
+cagily
+cagit
+cagmag
+Cagn
+Cahenslyism
+Cahill
+cahincic
+Cahita
+cahiz
+Cahnite
+Cahokia
+cahoot
+cahot
+cahow
+Cahuapana
+Cahuilla
+caickle
+caid
+cailcedra
+cailleach
+caimacam
+caimakam
+caiman
+caimitillo
+caimito
+Cain
+cain
+Caingang
+Caingua
+Cainian
+Cainish
+Cainism
+Cainite
+Cainitic
+caique
+caiquejee
+Cairba
+caird
+Cairene
+cairn
+cairned
+cairngorm
+cairngorum
+cairny
+Cairo
+caisson
+caissoned
+Caitanyas
+Caite
+caitiff
+Cajan
+Cajanus
+cajeput
+cajole
+cajolement
+cajoler
+cajolery
+cajoling
+cajolingly
+cajuela
+Cajun
+cajun
+cajuput
+cajuputene
+cajuputol
+Cakavci
+Cakchikel
+cake
+cakebox
+cakebread
+cakehouse
+cakemaker
+cakemaking
+caker
+cakette
+cakewalk
+cakewalker
+cakey
+Cakile
+caky
+cal
+calaba
+Calabar
+Calabari
+calabash
+calabaza
+calabazilla
+calaber
+calaboose
+calabrasella
+Calabrese
+calabrese
+Calabrian
+calade
+Caladium
+calais
+calalu
+Calamagrostis
+calamanco
+calamansi
+Calamariaceae
+calamariaceous
+Calamariales
+calamarian
+calamarioid
+calamaroid
+calamary
+calambac
+calambour
+calamiferous
+calamiform
+calaminary
+calamine
+calamint
+Calamintha
+calamistral
+calamistrum
+calamite
+calamitean
+Calamites
+calamitoid
+calamitous
+calamitously
+calamitousness
+calamity
+Calamodendron
+calamondin
+Calamopitys
+Calamospermae
+Calamostachys
+calamus
+calander
+Calandra
+calandria
+Calandridae
+Calandrinae
+Calandrinia
+calangay
+calantas
+Calanthe
+calapite
+Calappa
+Calappidae
+Calas
+calascione
+calash
+Calathea
+calathian
+calathidium
+calathiform
+calathiscus
+calathus
+Calatrava
+calaverite
+calbroben
+calcaneal
+calcaneoastragalar
+calcaneoastragaloid
+calcaneocuboid
+calcaneofibular
+calcaneonavicular
+calcaneoplantar
+calcaneoscaphoid
+calcaneotibial
+calcaneum
+calcaneus
+calcar
+calcarate
+Calcarea
+calcareoargillaceous
+calcareobituminous
+calcareocorneous
+calcareosiliceous
+calcareosulphurous
+calcareous
+calcareously
+calcareousness
+calcariferous
+calcariform
+calcarine
+calced
+calceiform
+calcemia
+Calceolaria
+calceolate
+Calchaqui
+Calchaquian
+calcic
+calciclase
+calcicole
+calcicolous
+calcicosis
+calciferol
+Calciferous
+calciferous
+calcific
+calcification
+calcified
+calciform
+calcifugal
+calcifuge
+calcifugous
+calcify
+calcigenous
+calcigerous
+calcimeter
+calcimine
+calciminer
+calcinable
+calcination
+calcinatory
+calcine
+calcined
+calciner
+calcinize
+calciobiotite
+calciocarnotite
+calcioferrite
+calcioscheelite
+calciovolborthite
+calcipexy
+calciphile
+calciphilia
+calciphilous
+calciphobe
+calciphobous
+calciphyre
+calciprivic
+calcisponge
+Calcispongiae
+calcite
+calcitestaceous
+calcitic
+calcitrant
+calcitrate
+calcitreation
+calcium
+calcivorous
+calcographer
+calcographic
+calcography
+calcrete
+calculability
+calculable
+Calculagraph
+calculary
+calculate
+calculated
+calculatedly
+calculating
+calculatingly
+calculation
+calculational
+calculative
+calculator
+calculatory
+calculi
+calculiform
+calculist
+calculous
+calculus
+Calcydon
+calden
+caldron
+calean
+Caleb
+Caledonia
+Caledonian
+caledonite
+calefacient
+calefaction
+calefactive
+calefactor
+calefactory
+calelectric
+calelectrical
+calelectricity
+Calemes
+calendal
+calendar
+calendarer
+calendarial
+calendarian
+calendaric
+calender
+calenderer
+calendric
+calendrical
+calendry
+calends
+Calendula
+calendulin
+calentural
+calenture
+calenturist
+calepin
+calescence
+calescent
+calf
+calfbound
+calfhood
+calfish
+calfkill
+calfless
+calflike
+calfling
+calfskin
+Caliban
+Calibanism
+caliber
+calibered
+calibogus
+calibrate
+calibration
+calibrator
+calibre
+Caliburn
+Caliburno
+calicate
+calices
+caliciform
+calicle
+calico
+calicoback
+calicoed
+calicular
+caliculate
+Calicut
+calid
+calidity
+caliduct
+California
+Californian
+californite
+californium
+caliga
+caligated
+caliginous
+caliginously
+caligo
+Calimeris
+Calinago
+calinda
+calinut
+caliological
+caliologist
+caliology
+calipash
+calipee
+caliper
+caliperer
+calipers
+caliph
+caliphal
+caliphate
+caliphship
+Calista
+calistheneum
+calisthenic
+calisthenical
+calisthenics
+Calite
+caliver
+calix
+Calixtin
+Calixtus
+calk
+calkage
+calker
+calkin
+calking
+call
+Calla
+callable
+callainite
+callant
+callboy
+caller
+callet
+calli
+Callianassa
+Callianassidae
+Calliandra
+Callicarpa
+Callicebus
+callid
+callidity
+callidness
+calligraph
+calligrapha
+calligrapher
+calligraphic
+calligraphical
+calligraphically
+calligraphist
+calligraphy
+calling
+Callionymidae
+Callionymus
+Calliope
+calliophone
+Calliopsis
+calliper
+calliperer
+Calliphora
+calliphorid
+Calliphoridae
+calliphorine
+callipygian
+callipygous
+Callirrhoe
+Callisaurus
+callisection
+callisteia
+Callistemon
+Callistephus
+Callithrix
+callithump
+callithumpian
+Callitrichaceae
+callitrichaceous
+Callitriche
+Callitrichidae
+Callitris
+callitype
+callo
+Callorhynchidae
+Callorhynchus
+callosal
+callose
+callosity
+callosomarginal
+callosum
+callous
+callously
+callousness
+Callovian
+callow
+callower
+callowman
+callowness
+Calluna
+callus
+Callynteria
+calm
+calmant
+calmative
+calmer
+calmierer
+calmingly
+calmly
+calmness
+calmy
+Calocarpum
+Calochortaceae
+Calochortus
+calodemon
+calography
+calomba
+calomel
+calomorphic
+Calonectria
+Calonyction
+calool
+Calophyllum
+Calopogon
+calor
+calorescence
+calorescent
+caloric
+caloricity
+calorie
+calorifacient
+calorific
+calorifical
+calorifically
+calorification
+calorifics
+calorifier
+calorify
+calorigenic
+calorimeter
+calorimetric
+calorimetrical
+calorimetrically
+calorimetry
+calorimotor
+caloris
+calorisator
+calorist
+Calorite
+calorize
+calorizer
+Calosoma
+Calotermes
+calotermitid
+Calotermitidae
+Calothrix
+calotte
+calotype
+calotypic
+calotypist
+caloyer
+calp
+calpac
+calpack
+calpacked
+calpulli
+Caltha
+caltrap
+caltrop
+calumba
+calumet
+calumniate
+calumniation
+calumniative
+calumniator
+calumniatory
+calumnious
+calumniously
+calumniousness
+calumny
+Calusa
+calutron
+Calvados
+calvaria
+calvarium
+Calvary
+Calvatia
+calve
+calved
+calver
+calves
+Calvin
+Calvinian
+Calvinism
+Calvinist
+Calvinistic
+Calvinistical
+Calvinistically
+Calvinize
+calvish
+calvities
+calvity
+calvous
+calx
+calycanth
+Calycanthaceae
+calycanthaceous
+calycanthemous
+calycanthemy
+calycanthine
+Calycanthus
+calycate
+Calyceraceae
+calyceraceous
+calyces
+calyciferous
+calycifloral
+calyciflorate
+calyciflorous
+calyciform
+calycinal
+calycine
+calycle
+calycled
+Calycocarpum
+calycoid
+calycoideous
+Calycophora
+Calycophorae
+calycophoran
+Calycozoa
+calycozoan
+calycozoic
+calycozoon
+calycular
+calyculate
+calyculated
+calycule
+calyculus
+Calydon
+Calydonian
+Calymene
+calymma
+calyphyomy
+calypsist
+Calypso
+calypso
+calypsonian
+calypter
+Calypterae
+Calyptoblastea
+calyptoblastic
+Calyptorhynchus
+calyptra
+Calyptraea
+Calyptranthes
+Calyptrata
+Calyptratae
+calyptrate
+calyptriform
+calyptrimorphous
+calyptro
+calyptrogen
+Calyptrogyne
+Calystegia
+calyx
+cam
+camaca
+Camacan
+camagon
+camail
+camailed
+Camaldolensian
+Camaldolese
+Camaldolesian
+Camaldolite
+Camaldule
+Camaldulian
+camalote
+caman
+camansi
+camara
+camaraderie
+Camarasaurus
+camarilla
+camass
+Camassia
+camata
+camatina
+Camaxtli
+camb
+Camball
+Cambalo
+Cambarus
+cambaye
+camber
+Cambeva
+cambial
+cambiform
+cambiogenetic
+cambism
+cambist
+cambistry
+cambium
+Cambodian
+cambogia
+cambrel
+cambresine
+Cambrian
+Cambric
+cambricleaf
+cambuca
+Cambuscan
+Cambyuskan
+Came
+came
+cameist
+camel
+camelback
+cameleer
+Camelid
+Camelidae
+Camelina
+cameline
+camelish
+camelishness
+camelkeeper
+Camellia
+Camelliaceae
+camellike
+camellin
+Camellus
+camelman
+cameloid
+Cameloidea
+camelopard
+Camelopardalis
+Camelopardid
+Camelopardidae
+Camelopardus
+camelry
+Camelus
+Camembert
+Camenae
+Camenes
+cameo
+cameograph
+cameography
+camera
+cameral
+cameralism
+cameralist
+cameralistic
+cameralistics
+cameraman
+Camerata
+camerate
+camerated
+cameration
+camerier
+Camerina
+Camerinidae
+camerist
+camerlingo
+Cameronian
+Camestres
+camilla
+camillus
+camion
+camisado
+Camisard
+camise
+camisia
+camisole
+camlet
+camleteen
+Cammarum
+cammed
+cammock
+cammocky
+camomile
+camoodi
+camoodie
+Camorra
+Camorrism
+Camorrist
+Camorrista
+camouflage
+camouflager
+camp
+Campa
+campagna
+campagnol
+campaign
+campaigner
+campana
+campane
+campanero
+Campanian
+campaniform
+campanile
+campaniliform
+campanilla
+campanini
+campanist
+campanistic
+campanologer
+campanological
+campanologically
+campanologist
+campanology
+Campanula
+Campanulaceae
+campanulaceous
+Campanulales
+campanular
+Campanularia
+Campanulariae
+campanularian
+Campanularidae
+Campanulatae
+campanulate
+campanulated
+campanulous
+Campaspe
+Campbellism
+Campbellite
+campbellite
+campcraft
+Campe
+Campephagidae
+campephagine
+Campephilus
+camper
+campestral
+campfight
+campfire
+campground
+camphane
+camphanic
+camphanone
+camphanyl
+camphene
+camphine
+camphire
+campho
+camphocarboxylic
+camphoid
+camphol
+campholic
+campholide
+campholytic
+camphor
+camphoraceous
+camphorate
+camphoric
+camphorize
+camphorone
+camphoronic
+camphoroyl
+camphorphorone
+camphorwood
+camphory
+camphoryl
+camphylene
+Campignian
+campimeter
+campimetrical
+campimetry
+Campine
+campion
+cample
+campmaster
+campo
+Campodea
+campodeid
+Campodeidae
+campodeiform
+campodeoid
+campody
+Camponotus
+campoo
+camporee
+campshed
+campshedding
+campsheeting
+campshot
+campstool
+camptodrome
+camptonite
+Camptosorus
+campulitropal
+campulitropous
+campus
+campward
+campylite
+campylodrome
+campylometer
+Campyloneuron
+campylospermous
+campylotropal
+campylotropous
+camshach
+camshachle
+camshaft
+camstane
+camstone
+camuning
+camus
+camused
+camwood
+can
+Cana
+Canaan
+Canaanite
+Canaanitess
+Canaanitic
+Canaanitish
+canaba
+Canacee
+Canada
+canada
+Canadian
+Canadianism
+Canadianization
+Canadianize
+canadine
+canadite
+canadol
+canaigre
+canaille
+canajong
+canal
+canalage
+canalboat
+canalicular
+canaliculate
+canaliculated
+canaliculation
+canaliculi
+canaliculization
+canaliculus
+canaliferous
+canaliform
+canalization
+canalize
+canaller
+canalling
+canalman
+canalside
+Canamary
+canamo
+Cananaean
+Cananga
+Canangium
+canape
+canapina
+canard
+Canari
+canari
+Canarian
+canarin
+Canariote
+Canarium
+Canarsee
+canary
+canasta
+canaster
+canaut
+Canavali
+Canavalia
+canavalin
+Canberra
+cancan
+cancel
+cancelable
+cancelation
+canceleer
+canceler
+cancellarian
+cancellate
+cancellated
+cancellation
+cancelli
+cancellous
+cancellus
+cancelment
+cancer
+cancerate
+canceration
+cancerdrops
+cancered
+cancerigenic
+cancerism
+cancerophobe
+cancerophobia
+cancerous
+cancerously
+cancerousness
+cancerroot
+cancerweed
+cancerwort
+canch
+canchalagua
+Canchi
+Cancri
+Cancrid
+cancriform
+cancrinite
+cancrisocial
+cancrivorous
+cancrizans
+cancroid
+cancrophagous
+cancrum
+cand
+Candace
+candareen
+candela
+candelabra
+candelabrum
+candelilla
+candent
+candescence
+candescent
+candescently
+candid
+candidacy
+candidate
+candidateship
+candidature
+candidly
+candidness
+candied
+candier
+candify
+Candiot
+candiru
+candle
+candleball
+candlebeam
+candleberry
+candlebomb
+candlebox
+candlefish
+candleholder
+candlelight
+candlelighted
+candlelighter
+candlelighting
+candlelit
+candlemaker
+candlemaking
+Candlemas
+candlenut
+candlepin
+candler
+candlerent
+candleshine
+candleshrift
+candlestand
+candlestick
+candlesticked
+candlestickward
+candlewaster
+candlewasting
+candlewick
+candlewood
+candlewright
+candock
+Candollea
+Candolleaceae
+candolleaceous
+candor
+candroy
+candy
+candymaker
+candymaking
+candys
+candystick
+candytuft
+candyweed
+cane
+canebrake
+canel
+canelike
+canella
+Canellaceae
+canellaceous
+Canelo
+canelo
+caneology
+canephor
+canephore
+canephoros
+canephroi
+caner
+canescence
+canescent
+canette
+canewise
+canework
+Canfield
+canfieldite
+canful
+cangan
+cangia
+cangle
+cangler
+cangue
+canhoop
+Canichana
+Canichanan
+canicola
+Canicula
+canicular
+canicule
+canid
+Canidae
+Canidia
+canille
+caninal
+canine
+caniniform
+caninity
+caninus
+canioned
+canions
+Canis
+Canisiana
+canistel
+canister
+canities
+canjac
+cank
+canker
+cankerberry
+cankerbird
+cankereat
+cankered
+cankeredly
+cankeredness
+cankerflower
+cankerous
+cankerroot
+cankerweed
+cankerworm
+cankerwort
+cankery
+canmaker
+canmaking
+canman
+Canna
+canna
+cannabic
+Cannabinaceae
+cannabinaceous
+cannabine
+cannabinol
+Cannabis
+cannabism
+Cannaceae
+cannaceous
+cannach
+canned
+cannel
+cannelated
+cannelure
+cannelured
+cannequin
+canner
+cannery
+cannet
+cannibal
+cannibalean
+cannibalic
+cannibalish
+cannibalism
+cannibalistic
+cannibalistically
+cannibality
+cannibalization
+cannibalize
+cannibally
+cannikin
+cannily
+canniness
+canning
+cannon
+cannonade
+cannoned
+cannoneer
+cannoneering
+Cannonism
+cannonproof
+cannonry
+cannot
+Cannstatt
+cannula
+cannular
+cannulate
+cannulated
+canny
+canoe
+canoeing
+Canoeiro
+canoeist
+canoeload
+canoeman
+canoewood
+canon
+canoncito
+canoness
+canonic
+canonical
+canonically
+canonicalness
+canonicals
+canonicate
+canonicity
+canonics
+canonist
+canonistic
+canonistical
+canonizant
+canonization
+canonize
+canonizer
+canonlike
+canonry
+canonship
+canoodle
+canoodler
+Canopic
+canopic
+Canopus
+canopy
+canorous
+canorously
+canorousness
+Canossa
+canroy
+canroyer
+canso
+cant
+Cantab
+cantabank
+cantabile
+Cantabri
+Cantabrian
+Cantabrigian
+Cantabrize
+cantala
+cantalite
+cantaloupe
+cantankerous
+cantankerously
+cantankerousness
+cantar
+cantara
+cantaro
+cantata
+Cantate
+cantation
+cantative
+cantatory
+cantboard
+canted
+canteen
+cantefable
+canter
+Canterburian
+Canterburianism
+Canterbury
+canterer
+canthal
+Cantharellus
+Cantharidae
+cantharidal
+cantharidate
+cantharides
+cantharidian
+cantharidin
+cantharidism
+cantharidize
+cantharis
+cantharophilous
+cantharus
+canthectomy
+canthitis
+cantholysis
+canthoplasty
+canthorrhaphy
+canthotomy
+canthus
+cantic
+canticle
+cantico
+cantilena
+cantilene
+cantilever
+cantilevered
+cantillate
+cantillation
+cantily
+cantina
+cantiness
+canting
+cantingly
+cantingness
+cantion
+cantish
+cantle
+cantlet
+canto
+Canton
+canton
+cantonal
+cantonalism
+cantoned
+cantoner
+Cantonese
+cantonment
+cantoon
+cantor
+cantoral
+Cantorian
+cantoris
+cantorous
+cantorship
+cantred
+cantref
+cantrip
+cantus
+cantwise
+canty
+Canuck
+canun
+canvas
+canvasback
+canvasman
+canvass
+canvassy
+cany
+canyon
+canzon
+canzonet
+caoba
+Caodaism
+Caodaist
+caoutchouc
+caoutchoucin
+cap
+capability
+capable
+capableness
+capably
+capacious
+capaciously
+capaciousness
+capacitance
+capacitate
+capacitation
+capacitative
+capacitativly
+capacitive
+capacitor
+capacity
+capanna
+capanne
+caparison
+capax
+capcase
+Cape
+cape
+caped
+capel
+capelet
+capelin
+capeline
+Capella
+capellet
+caper
+caperbush
+capercaillie
+capercally
+capercut
+caperer
+capering
+caperingly
+Capernaism
+Capernaite
+Capernaitic
+Capernaitical
+Capernaitically
+Capernaitish
+capernoited
+capernoitie
+capernoity
+capersome
+caperwort
+capes
+capeskin
+Capetian
+Capetonian
+capeweed
+capewise
+capful
+Caph
+caph
+caphar
+caphite
+Caphtor
+Caphtorim
+capias
+capicha
+capillaceous
+capillaire
+capillament
+capillarectasia
+capillarily
+capillarimeter
+capillariness
+capillariomotor
+capillarity
+capillary
+capillation
+capilliculture
+capilliform
+capillitial
+capillitium
+capillose
+capistrate
+capital
+capitaldom
+capitaled
+capitalism
+capitalist
+capitalistic
+capitalistically
+capitalizable
+capitalization
+capitalize
+capitally
+capitalness
+capitan
+capitate
+capitated
+capitatim
+capitation
+capitative
+capitatum
+capitellar
+capitellate
+capitelliform
+capitellum
+Capito
+Capitol
+Capitolian
+Capitoline
+Capitolium
+Capitonidae
+Capitoninae
+capitoul
+capitoulate
+capitulant
+capitular
+capitularly
+capitulary
+capitulate
+capitulation
+capitulator
+capitulatory
+capituliform
+capitulum
+capivi
+capkin
+capless
+caplin
+capmaker
+capmaking
+capman
+capmint
+Capnodium
+Capnoides
+capnomancy
+capocchia
+capomo
+capon
+caponier
+caponize
+caponizer
+caporal
+capot
+capote
+cappadine
+Cappadocian
+Capparidaceae
+capparidaceous
+Capparis
+capped
+cappelenite
+capper
+cappie
+capping
+capple
+cappy
+Capra
+caprate
+Caprella
+Caprellidae
+caprelline
+capreol
+capreolar
+capreolary
+capreolate
+capreoline
+Capreolus
+Capri
+capric
+capriccetto
+capricci
+capriccio
+caprice
+capricious
+capriciously
+capriciousness
+Capricorn
+Capricornid
+Capricornus
+caprid
+caprificate
+caprification
+caprificator
+caprifig
+Caprifoliaceae
+caprifoliaceous
+Caprifolium
+caprifolium
+capriform
+caprigenous
+Caprimulgi
+Caprimulgidae
+Caprimulgiformes
+caprimulgine
+Caprimulgus
+caprin
+caprine
+caprinic
+Capriola
+capriole
+Capriote
+capriped
+capripede
+caprizant
+caproate
+caproic
+caproin
+Capromys
+caprone
+capronic
+capronyl
+caproyl
+capryl
+caprylate
+caprylene
+caprylic
+caprylin
+caprylone
+caprylyl
+capsa
+capsaicin
+Capsella
+capsheaf
+capshore
+Capsian
+capsicin
+Capsicum
+capsicum
+capsid
+Capsidae
+capsizal
+capsize
+capstan
+capstone
+capsula
+capsulae
+capsular
+capsulate
+capsulated
+capsulation
+capsule
+capsulectomy
+capsuler
+capsuliferous
+capsuliform
+capsuligerous
+capsulitis
+capsulociliary
+capsulogenous
+capsulolenticular
+capsulopupillary
+capsulorrhaphy
+capsulotome
+capsulotomy
+capsumin
+captaculum
+captain
+captaincy
+captainess
+captainly
+captainry
+captainship
+captance
+captation
+caption
+captious
+captiously
+captiousness
+captivate
+captivately
+captivating
+captivatingly
+captivation
+captivative
+captivator
+captivatrix
+captive
+captivity
+captor
+captress
+capturable
+capture
+capturer
+Capuan
+capuche
+capuched
+Capuchin
+capuchin
+capucine
+capulet
+capulin
+capybara
+Caquetio
+car
+Cara
+carabao
+carabeen
+carabid
+Carabidae
+carabidan
+carabideous
+carabidoid
+carabin
+carabineer
+Carabini
+caraboid
+Carabus
+carabus
+caracal
+caracara
+caracol
+caracole
+caracoler
+caracoli
+caracolite
+caracoller
+caracore
+caract
+Caractacus
+caracter
+Caradoc
+carafe
+Caragana
+Caraguata
+caraguata
+Caraho
+caraibe
+Caraipa
+caraipi
+Caraja
+Carajas
+carajura
+caramba
+carambola
+carambole
+caramel
+caramelan
+caramelen
+caramelin
+caramelization
+caramelize
+caramoussal
+carancha
+caranda
+Carandas
+caranday
+carane
+Caranga
+carangid
+Carangidae
+carangoid
+Carangus
+caranna
+Caranx
+Carapa
+carapace
+carapaced
+Carapache
+Carapacho
+carapacic
+carapato
+carapax
+Carapidae
+carapine
+carapo
+Carapus
+Carara
+carat
+caratch
+caraunda
+caravan
+caravaneer
+caravanist
+caravanner
+caravansary
+caravanserai
+caravanserial
+caravel
+caraway
+Carayan
+carbacidometer
+carbamate
+carbamic
+carbamide
+carbamido
+carbamine
+carbamino
+carbamyl
+carbanil
+carbanilic
+carbanilide
+carbarn
+carbasus
+carbazic
+carbazide
+carbazine
+carbazole
+carbazylic
+carbeen
+carbene
+carberry
+carbethoxy
+carbethoxyl
+carbide
+carbimide
+carbine
+carbinol
+carbinyl
+carbo
+carboazotine
+carbocinchomeronic
+carbodiimide
+carbodynamite
+carbogelatin
+carbohemoglobin
+carbohydrase
+carbohydrate
+carbohydraturia
+carbohydrazide
+carbohydride
+carbohydrogen
+carbolate
+carbolated
+carbolfuchsin
+carbolic
+carbolineate
+Carbolineum
+carbolize
+Carboloy
+carboluria
+carbolxylol
+carbomethene
+carbomethoxy
+carbomethoxyl
+carbon
+carbona
+carbonaceous
+carbonade
+carbonado
+Carbonari
+Carbonarism
+Carbonarist
+carbonatation
+carbonate
+carbonation
+carbonatization
+carbonator
+carbonemia
+carbonero
+carbonic
+carbonide
+Carboniferous
+carboniferous
+carbonification
+carbonify
+carbonigenous
+carbonimeter
+carbonimide
+carbonite
+carbonitride
+carbonium
+carbonizable
+carbonization
+carbonize
+carbonizer
+carbonless
+Carbonnieux
+carbonometer
+carbonometry
+carbonous
+carbonuria
+carbonyl
+carbonylene
+carbonylic
+carbophilous
+carbora
+Carborundum
+carborundum
+carbosilicate
+carbostyril
+carboxide
+carboxy
+Carboxydomonas
+carboxyhemoglobin
+carboxyl
+carboxylase
+carboxylate
+carboxylation
+carboxylic
+carboy
+carboyed
+carbro
+carbromal
+carbuilder
+carbuncle
+carbuncled
+carbuncular
+carbungi
+carburant
+carburate
+carburation
+carburator
+carbure
+carburet
+carburetant
+carburetor
+carburization
+carburize
+carburizer
+carburometer
+carbyl
+carbylamine
+carcajou
+carcake
+carcanet
+carcaneted
+carcass
+Carcavelhos
+carceag
+carcel
+carceral
+carcerate
+carceration
+Carcharhinus
+Carcharias
+carchariid
+Carchariidae
+carcharioid
+Carcharodon
+carcharodont
+carcinemia
+carcinogen
+carcinogenesis
+carcinogenic
+carcinoid
+carcinological
+carcinologist
+carcinology
+carcinolysin
+carcinolytic
+carcinoma
+carcinomata
+carcinomatoid
+carcinomatosis
+carcinomatous
+carcinomorphic
+carcinophagous
+carcinopolypus
+carcinosarcoma
+carcinosarcomata
+Carcinoscorpius
+carcinosis
+carcoon
+card
+cardaissin
+Cardamine
+cardamom
+Cardanic
+cardboard
+cardcase
+cardecu
+carded
+cardel
+carder
+cardholder
+cardia
+cardiac
+cardiacal
+Cardiacea
+cardiacean
+cardiagra
+cardiagram
+cardiagraph
+cardiagraphy
+cardial
+cardialgia
+cardialgy
+cardiameter
+cardiamorphia
+cardianesthesia
+cardianeuria
+cardiant
+cardiaplegia
+cardiarctia
+cardiasthenia
+cardiasthma
+cardiataxia
+cardiatomy
+cardiatrophia
+cardiauxe
+Cardiazol
+cardicentesis
+cardiectasis
+cardiectomize
+cardiectomy
+cardielcosis
+cardiemphraxia
+cardiform
+Cardigan
+cardigan
+Cardiidae
+cardin
+cardinal
+cardinalate
+cardinalic
+Cardinalis
+cardinalism
+cardinalist
+cardinalitial
+cardinalitian
+cardinally
+cardinalship
+cardines
+carding
+cardioaccelerator
+cardioarterial
+cardioblast
+cardiocarpum
+cardiocele
+cardiocentesis
+cardiocirrhosis
+cardioclasia
+cardioclasis
+cardiodilator
+cardiodynamics
+cardiodynia
+cardiodysesthesia
+cardiodysneuria
+cardiogenesis
+cardiogenic
+cardiogram
+cardiograph
+cardiographic
+cardiography
+cardiohepatic
+cardioid
+cardiokinetic
+cardiolith
+cardiological
+cardiologist
+cardiology
+cardiolysis
+cardiomalacia
+cardiomegaly
+cardiomelanosis
+cardiometer
+cardiometric
+cardiometry
+cardiomotility
+cardiomyoliposis
+cardiomyomalacia
+cardioncus
+cardionecrosis
+cardionephric
+cardioneural
+cardioneurosis
+cardionosus
+cardioparplasis
+cardiopathic
+cardiopathy
+cardiopericarditis
+cardiophobe
+cardiophobia
+cardiophrenia
+cardioplasty
+cardioplegia
+cardiopneumatic
+cardiopneumograph
+cardioptosis
+cardiopulmonary
+cardiopuncture
+cardiopyloric
+cardiorenal
+cardiorespiratory
+cardiorrhaphy
+cardiorrheuma
+cardiorrhexis
+cardioschisis
+cardiosclerosis
+cardioscope
+cardiospasm
+Cardiospermum
+cardiosphygmogram
+cardiosphygmograph
+cardiosymphysis
+cardiotherapy
+cardiotomy
+cardiotonic
+cardiotoxic
+cardiotrophia
+cardiotrophotherapy
+cardiovascular
+cardiovisceral
+cardipaludism
+cardipericarditis
+cardisophistical
+carditic
+carditis
+Cardium
+cardlike
+cardmaker
+cardmaking
+cardo
+cardol
+cardon
+cardona
+cardoncillo
+cardooer
+cardoon
+cardophagus
+cardplayer
+cardroom
+cardsharp
+cardsharping
+cardstock
+Carduaceae
+carduaceous
+Carduelis
+Carduus
+care
+carecloth
+careen
+careenage
+careener
+career
+careerer
+careering
+careeringly
+careerist
+carefree
+careful
+carefully
+carefulness
+careless
+carelessly
+carelessness
+carene
+carer
+caress
+caressant
+caresser
+caressing
+caressingly
+caressive
+caressively
+carest
+caret
+caretaker
+caretaking
+Caretta
+Carettochelydidae
+careworn
+Carex
+carfare
+carfax
+carfuffle
+carful
+carga
+cargo
+cargoose
+carhop
+carhouse
+cariacine
+Cariacus
+cariama
+Cariamae
+Carian
+Carib
+Caribal
+Cariban
+Caribbean
+Caribbee
+Caribi
+Caribisi
+caribou
+Carica
+Caricaceae
+caricaceous
+caricatura
+caricaturable
+caricatural
+caricature
+caricaturist
+caricetum
+caricographer
+caricography
+caricologist
+caricology
+caricous
+carid
+Carida
+Caridea
+caridean
+caridoid
+Caridomorpha
+caries
+Carijona
+carillon
+carillonneur
+carina
+carinal
+Carinaria
+Carinatae
+carinate
+carinated
+carination
+Cariniana
+cariniform
+Carinthian
+cariole
+carioling
+cariosity
+carious
+cariousness
+Caripuna
+Cariri
+Caririan
+Carisa
+Carissa
+caritative
+caritive
+Cariyo
+cark
+carking
+carkingly
+carkled
+Carl
+carl
+carless
+carlet
+carlie
+carlin
+Carlina
+carline
+carling
+carlings
+carlish
+carlishness
+Carlisle
+Carlism
+Carlist
+Carlo
+carload
+carloading
+carloadings
+Carlos
+carlot
+Carlovingian
+carls
+Carludovica
+Carlylean
+Carlyleian
+Carlylese
+Carlylesque
+Carlylian
+Carlylism
+carmagnole
+carmalum
+Carman
+carman
+Carmanians
+Carmel
+Carmela
+carmele
+Carmelite
+Carmelitess
+carmeloite
+Carmen
+carminative
+Carmine
+carmine
+carminette
+carminic
+carminite
+carminophilous
+carmoisin
+carmot
+Carnacian
+carnage
+carnaged
+carnal
+carnalism
+carnalite
+carnality
+carnalize
+carnallite
+carnally
+carnalness
+carnaptious
+Carnaria
+carnassial
+carnate
+carnation
+carnationed
+carnationist
+carnauba
+carnaubic
+carnaubyl
+Carnegie
+Carnegiea
+carnelian
+carneol
+carneole
+carneous
+carney
+carnic
+carniferous
+carniferrin
+carnifex
+carnification
+carnifices
+carnificial
+carniform
+carnify
+Carniolan
+carnival
+carnivaler
+carnivalesque
+Carnivora
+carnivoracity
+carnivoral
+carnivore
+carnivorism
+carnivorous
+carnivorously
+carnivorousness
+carnose
+carnosine
+carnosity
+carnotite
+carnous
+Caro
+caroa
+carob
+caroba
+caroche
+Caroid
+Carol
+carol
+Carolan
+Carole
+Carolean
+caroler
+caroli
+carolin
+Carolina
+Caroline
+caroline
+Caroling
+Carolingian
+Carolinian
+carolus
+Carolyn
+carom
+carombolette
+carone
+caronic
+caroome
+caroon
+carotene
+carotenoid
+carotic
+carotid
+carotidal
+carotidean
+carotin
+carotinemia
+carotinoid
+caroubier
+carousal
+carouse
+carouser
+carousing
+carousingly
+carp
+carpaine
+carpal
+carpale
+carpalia
+Carpathian
+carpel
+carpellary
+carpellate
+carpent
+carpenter
+Carpenteria
+carpentering
+carpentership
+carpentry
+carper
+carpet
+carpetbag
+carpetbagger
+carpetbaggery
+carpetbaggism
+carpetbagism
+carpetbeater
+carpeting
+carpetlayer
+carpetless
+carpetmaker
+carpetmaking
+carpetmonger
+carpetweb
+carpetweed
+carpetwork
+carpetwoven
+Carphiophiops
+carpholite
+Carphophis
+carphosiderite
+carpid
+carpidium
+carpincho
+carping
+carpingly
+carpintero
+Carpinus
+Carpiodes
+carpitis
+carpium
+carpocace
+Carpocapsa
+carpocarpal
+carpocephala
+carpocephalum
+carpocerite
+carpocervical
+Carpocratian
+Carpodacus
+Carpodetus
+carpogam
+carpogamy
+carpogenic
+carpogenous
+carpogone
+carpogonial
+carpogonium
+Carpoidea
+carpolite
+carpolith
+carpological
+carpologically
+carpologist
+carpology
+carpomania
+carpometacarpal
+carpometacarpus
+carpopedal
+Carpophaga
+carpophagous
+carpophalangeal
+carpophore
+carpophyll
+carpophyte
+carpopodite
+carpopoditic
+carpoptosia
+carpoptosis
+carport
+carpos
+carposperm
+carposporangia
+carposporangial
+carposporangium
+carpospore
+carposporic
+carposporous
+carpostome
+carpus
+carquaise
+carr
+carrack
+carrageen
+carrageenin
+Carrara
+Carraran
+carrel
+carriable
+carriage
+carriageable
+carriageful
+carriageless
+carriagesmith
+carriageway
+Carrick
+carrick
+Carrie
+carried
+carrier
+carrion
+carritch
+carritches
+carriwitchet
+Carrizo
+carrizo
+carroch
+carrollite
+carronade
+carrot
+carrotage
+carroter
+carrotiness
+carrottop
+carrotweed
+carrotwood
+carroty
+carrousel
+carrow
+Carry
+carry
+carryall
+carrying
+carrytale
+carse
+carshop
+carsick
+carsmith
+Carsten
+cart
+cartable
+cartaceous
+cartage
+cartboot
+cartbote
+carte
+cartel
+cartelism
+cartelist
+cartelization
+cartelize
+Carter
+carter
+Cartesian
+Cartesianism
+cartful
+Carthaginian
+carthame
+carthamic
+carthamin
+Carthamus
+Carthusian
+Cartier
+cartilage
+cartilaginean
+Cartilaginei
+cartilagineous
+Cartilagines
+cartilaginification
+cartilaginoid
+cartilaginous
+cartisane
+Cartist
+cartload
+cartmaker
+cartmaking
+cartman
+cartobibliography
+cartogram
+cartograph
+cartographer
+cartographic
+cartographical
+cartographically
+cartography
+cartomancy
+carton
+cartonnage
+cartoon
+cartoonist
+cartouche
+cartridge
+cartsale
+cartulary
+cartway
+cartwright
+cartwrighting
+carty
+carua
+carucage
+carucal
+carucate
+carucated
+Carum
+caruncle
+caruncula
+carunculae
+caruncular
+carunculate
+carunculated
+carunculous
+carvacrol
+carvacryl
+carval
+carve
+carvel
+carven
+carvene
+carver
+carvership
+carvestrene
+carving
+carvoepra
+carvol
+carvomenthene
+carvone
+carvyl
+carwitchet
+Cary
+Carya
+caryatic
+caryatid
+caryatidal
+caryatidean
+caryatidic
+caryl
+Caryocar
+Caryocaraceae
+caryocaraceous
+Caryophyllaceae
+caryophyllaceous
+caryophyllene
+caryophylleous
+caryophyllin
+caryophyllous
+Caryophyllus
+caryopilite
+caryopses
+caryopsides
+caryopsis
+Caryopteris
+Caryota
+casaba
+casabe
+casal
+casalty
+Casamarca
+Casanovanic
+Casasia
+casate
+casaun
+casava
+casave
+casavi
+casbah
+cascabel
+cascade
+Cascadia
+Cascadian
+cascadite
+cascado
+cascalho
+cascalote
+cascara
+cascarilla
+cascaron
+casco
+cascol
+Case
+case
+Casearia
+casease
+caseate
+caseation
+casebook
+casebox
+cased
+caseful
+casefy
+caseharden
+caseic
+casein
+caseinate
+caseinogen
+casekeeper
+Casel
+caseless
+caselessly
+casemaker
+casemaking
+casemate
+casemated
+casement
+casemented
+caseolysis
+caseose
+caseous
+caser
+casern
+caseum
+caseweed
+casewood
+casework
+caseworker
+caseworm
+Casey
+cash
+casha
+cashable
+cashableness
+cashaw
+cashbook
+cashbox
+cashboy
+cashcuttee
+cashel
+cashew
+cashgirl
+Cashibo
+cashier
+cashierer
+cashierment
+cashkeeper
+cashment
+Cashmere
+cashmere
+cashmerette
+Cashmirian
+Casimir
+Casimiroa
+casing
+casino
+casiri
+cask
+casket
+casking
+casklike
+Caslon
+Caspar
+Casparian
+Casper
+Caspian
+casque
+casqued
+casquet
+casquetel
+casquette
+cass
+cassabanana
+cassabully
+cassady
+Cassandra
+cassareep
+cassation
+casse
+Cassegrain
+Cassegrainian
+casselty
+cassena
+casserole
+Cassia
+cassia
+Cassiaceae
+Cassian
+cassican
+Cassicus
+Cassida
+cassideous
+cassidid
+Cassididae
+Cassidinae
+cassidony
+Cassidulina
+cassiduloid
+Cassiduloidea
+Cassie
+cassie
+Cassiepeia
+cassimere
+cassina
+cassine
+Cassinese
+cassinette
+Cassinian
+cassino
+cassinoid
+cassioberry
+Cassiope
+Cassiopeia
+Cassiopeian
+Cassiopeid
+cassiopeium
+Cassis
+cassis
+cassiterite
+Cassius
+cassock
+cassolette
+casson
+cassonade
+cassoon
+cassowary
+cassumunar
+Cassytha
+Cassythaceae
+cast
+castable
+castagnole
+Castalia
+Castalian
+Castalides
+Castalio
+Castanea
+castanean
+castaneous
+castanet
+Castanopsis
+Castanospermum
+castaway
+caste
+casteless
+castelet
+castellan
+castellano
+castellanship
+castellany
+castellar
+castellate
+castellated
+castellation
+caster
+casterless
+casthouse
+castice
+castigable
+castigate
+castigation
+castigative
+castigator
+castigatory
+Castilian
+Castilla
+Castilleja
+Castilloa
+casting
+castle
+castled
+castlelike
+castlet
+castlewards
+castlewise
+castling
+castock
+castoff
+Castor
+castor
+Castores
+castoreum
+castorial
+Castoridae
+castorin
+castorite
+castorized
+Castoroides
+castory
+castra
+castral
+castrametation
+castrate
+castrater
+castration
+castrator
+castrensial
+castrensian
+castrum
+castuli
+casual
+casualism
+casualist
+casuality
+casually
+casualness
+casualty
+Casuariidae
+Casuariiformes
+Casuarina
+Casuarinaceae
+casuarinaceous
+Casuarinales
+Casuarius
+casuary
+casuist
+casuistess
+casuistic
+casuistical
+casuistically
+casuistry
+casula
+caswellite
+Casziel
+Cat
+cat
+catabaptist
+catabases
+catabasis
+catabatic
+catabibazon
+catabiotic
+catabolic
+catabolically
+catabolin
+catabolism
+catabolite
+catabolize
+catacaustic
+catachreses
+catachresis
+catachrestic
+catachrestical
+catachrestically
+catachthonian
+cataclasm
+cataclasmic
+cataclastic
+cataclinal
+cataclysm
+cataclysmal
+cataclysmatic
+cataclysmatist
+cataclysmic
+cataclysmically
+cataclysmist
+catacomb
+catacorolla
+catacoustics
+catacromyodian
+catacrotic
+catacrotism
+catacumbal
+catadicrotic
+catadicrotism
+catadioptric
+catadioptrical
+catadioptrics
+catadromous
+catafalco
+catafalque
+catagenesis
+catagenetic
+catagmatic
+Cataian
+catakinesis
+catakinetic
+catakinetomer
+catakinomeric
+Catalan
+Catalanganes
+Catalanist
+catalase
+Catalaunian
+catalecta
+catalectic
+catalecticant
+catalepsis
+catalepsy
+cataleptic
+cataleptiform
+cataleptize
+cataleptoid
+catalexis
+catalina
+catalineta
+catalinite
+catallactic
+catallactically
+catallactics
+catallum
+catalogia
+catalogic
+catalogical
+catalogist
+catalogistic
+catalogue
+cataloguer
+cataloguish
+cataloguist
+cataloguize
+Catalonian
+catalowne
+Catalpa
+catalpa
+catalufa
+catalyses
+catalysis
+catalyst
+catalyte
+catalytic
+catalytical
+catalytically
+catalyzator
+catalyze
+catalyzer
+catamaran
+Catamarcan
+Catamarenan
+catamenia
+catamenial
+catamite
+catamited
+catamiting
+catamount
+catamountain
+catan
+Catananche
+catapan
+catapasm
+catapetalous
+cataphasia
+cataphatic
+cataphora
+cataphoresis
+cataphoretic
+cataphoria
+cataphoric
+cataphract
+Cataphracta
+Cataphracti
+cataphrenia
+cataphrenic
+Cataphrygian
+cataphrygianism
+cataphyll
+cataphylla
+cataphyllary
+cataphyllum
+cataphysical
+cataplasia
+cataplasis
+cataplasm
+catapleiite
+cataplexy
+catapult
+catapultic
+catapultier
+cataract
+cataractal
+cataracted
+cataractine
+cataractous
+cataractwise
+cataria
+catarinite
+catarrh
+catarrhal
+catarrhally
+catarrhed
+Catarrhina
+catarrhine
+catarrhinian
+catarrhous
+catasarka
+Catasetum
+catasta
+catastaltic
+catastasis
+catastate
+catastatic
+catasterism
+catastrophal
+catastrophe
+catastrophic
+catastrophical
+catastrophically
+catastrophism
+catastrophist
+catathymic
+catatonia
+catatoniac
+catatonic
+catawampous
+catawampously
+catawamptious
+catawamptiously
+catawampus
+Catawba
+catberry
+catbird
+catboat
+catcall
+catch
+catchable
+catchall
+catchcry
+catcher
+catchfly
+catchiness
+catching
+catchingly
+catchingness
+catchland
+catchment
+catchpenny
+catchplate
+catchpole
+catchpolery
+catchpoleship
+catchpoll
+catchpollery
+catchup
+catchwater
+catchweed
+catchweight
+catchword
+catchwork
+catchy
+catclaw
+catdom
+cate
+catechesis
+catechetic
+catechetical
+catechetically
+catechin
+catechism
+catechismal
+catechist
+catechistic
+catechistical
+catechistically
+catechizable
+catechization
+catechize
+catechizer
+catechol
+catechu
+catechumen
+catechumenal
+catechumenate
+catechumenical
+catechumenically
+catechumenism
+catechumenship
+catechutannic
+categorem
+categorematic
+categorematical
+categorematically
+categorial
+categoric
+categorical
+categorically
+categoricalness
+categorist
+categorization
+categorize
+category
+catelectrotonic
+catelectrotonus
+catella
+catena
+catenae
+catenarian
+catenary
+catenate
+catenated
+catenation
+catenoid
+catenulate
+catepuce
+cater
+cateran
+catercap
+catercorner
+caterer
+caterership
+cateress
+caterpillar
+caterpillared
+caterpillarlike
+caterva
+caterwaul
+caterwauler
+caterwauling
+Catesbaea
+cateye
+catface
+catfaced
+catfacing
+catfall
+catfish
+catfoot
+catfooted
+catgut
+Catha
+Cathari
+Catharina
+Catharine
+Catharism
+Catharist
+Catharistic
+catharization
+catharize
+catharpin
+catharping
+Cathars
+catharsis
+Cathartae
+Cathartes
+cathartic
+cathartical
+cathartically
+catharticalness
+Cathartidae
+Cathartides
+Cathartolinum
+Cathay
+Cathayan
+cathead
+cathect
+cathectic
+cathection
+cathedra
+cathedral
+cathedraled
+cathedralesque
+cathedralic
+cathedrallike
+cathedralwise
+cathedratic
+cathedratica
+cathedratical
+cathedratically
+cathedraticum
+cathepsin
+Catherine
+catheter
+catheterism
+catheterization
+catheterize
+catheti
+cathetometer
+cathetometric
+cathetus
+cathexion
+cathexis
+cathidine
+cathin
+cathine
+cathinine
+cathion
+cathisma
+cathodal
+cathode
+cathodic
+cathodical
+cathodically
+cathodofluorescence
+cathodograph
+cathodography
+cathodoluminescence
+cathograph
+cathography
+cathole
+catholic
+catholical
+catholically
+catholicalness
+catholicate
+catholicism
+catholicist
+catholicity
+catholicize
+catholicizer
+catholicly
+catholicness
+catholicon
+catholicos
+catholicus
+catholyte
+cathood
+cathop
+Cathrin
+cathro
+Cathryn
+Cathy
+Catilinarian
+cation
+cationic
+cativo
+catjang
+catkin
+catkinate
+catlap
+catlike
+catlin
+catling
+catlinite
+catmalison
+catmint
+catnip
+catoblepas
+Catocala
+catocalid
+catocathartic
+catoctin
+Catodon
+catodont
+catogene
+catogenic
+Catoism
+Catonian
+Catonic
+Catonically
+Catonism
+catoptric
+catoptrical
+catoptrically
+catoptrics
+catoptrite
+catoptromancy
+catoptromantic
+Catoquina
+catostomid
+Catostomidae
+catostomoid
+Catostomus
+catpiece
+catpipe
+catproof
+Catskill
+catskin
+catstep
+catstick
+catstitch
+catstitcher
+catstone
+catsup
+cattabu
+cattail
+cattalo
+cattery
+Catti
+cattily
+cattimandoo
+cattiness
+catting
+cattish
+cattishly
+cattishness
+cattle
+cattlebush
+cattlegate
+cattleless
+cattleman
+Cattleya
+cattleya
+cattleyak
+Catty
+catty
+cattyman
+Catullian
+catvine
+catwalk
+catwise
+catwood
+catwort
+caubeen
+cauboge
+Caucasian
+Caucasic
+Caucasoid
+cauch
+cauchillo
+caucho
+caucus
+cauda
+caudad
+caudae
+caudal
+caudally
+caudalward
+Caudata
+caudata
+caudate
+caudated
+caudation
+caudatolenticular
+caudatory
+caudatum
+caudex
+caudices
+caudicle
+caudiform
+caudillism
+caudle
+caudocephalad
+caudodorsal
+caudofemoral
+caudolateral
+caudotibial
+caudotibialis
+Caughnawaga
+caught
+cauk
+caul
+cauld
+cauldrife
+cauldrifeness
+Caulerpa
+Caulerpaceae
+caulerpaceous
+caules
+caulescent
+caulicle
+caulicole
+caulicolous
+caulicule
+cauliculus
+cauliferous
+cauliflorous
+cauliflory
+cauliflower
+cauliform
+cauligenous
+caulinar
+caulinary
+cauline
+caulis
+Caulite
+caulivorous
+caulocarpic
+caulocarpous
+caulome
+caulomer
+caulomic
+caulophylline
+Caulophyllum
+Caulopteris
+caulopteris
+caulosarc
+caulotaxis
+caulotaxy
+caulote
+caum
+cauma
+caumatic
+caunch
+Caunos
+Caunus
+caup
+caupo
+caupones
+Cauqui
+caurale
+Caurus
+causability
+causable
+causal
+causalgia
+causality
+causally
+causate
+causation
+causational
+causationism
+causationist
+causative
+causatively
+causativeness
+causativity
+cause
+causeful
+causeless
+causelessly
+causelessness
+causer
+causerie
+causeway
+causewayman
+causey
+causidical
+causing
+causingness
+causse
+causson
+caustic
+caustical
+caustically
+causticiser
+causticism
+causticity
+causticization
+causticize
+causticizer
+causticly
+causticness
+caustification
+caustify
+Causus
+cautel
+cautelous
+cautelously
+cautelousness
+cauter
+cauterant
+cauterization
+cauterize
+cautery
+caution
+cautionary
+cautioner
+cautionry
+cautious
+cautiously
+cautiousness
+cautivo
+cava
+cavae
+caval
+cavalcade
+cavalero
+cavalier
+cavalierish
+cavalierishness
+cavalierism
+cavalierly
+cavalierness
+cavaliero
+cavaliership
+cavalla
+cavalry
+cavalryman
+cavascope
+cavate
+cavatina
+cave
+caveat
+caveator
+cavekeeper
+cavel
+cavelet
+cavelike
+cavendish
+cavern
+cavernal
+caverned
+cavernicolous
+cavernitis
+cavernlike
+cavernoma
+cavernous
+cavernously
+cavernulous
+cavesson
+cavetto
+Cavia
+caviar
+cavicorn
+Cavicornia
+Cavidae
+cavie
+cavil
+caviler
+caviling
+cavilingly
+cavilingness
+cavillation
+Cavina
+caving
+cavings
+cavish
+cavitary
+cavitate
+cavitation
+cavitied
+cavity
+caviya
+cavort
+cavus
+cavy
+caw
+cawk
+cawky
+cawney
+cawquaw
+caxiri
+caxon
+Caxton
+Caxtonian
+cay
+Cayapa
+Cayapo
+Cayenne
+cayenne
+cayenned
+Cayleyan
+cayman
+Cayubaba
+Cayubaban
+Cayuga
+Cayugan
+Cayuse
+Cayuvava
+caza
+cazimi
+Ccoya
+ce
+Ceanothus
+cearin
+cease
+ceaseless
+ceaselessly
+ceaselessness
+ceasmic
+Cebalrai
+Cebatha
+cebell
+cebian
+cebid
+Cebidae
+cebil
+cebine
+ceboid
+cebollite
+cebur
+Cebus
+cecidiologist
+cecidiology
+cecidium
+cecidogenous
+cecidologist
+cecidology
+cecidomyian
+cecidomyiid
+Cecidomyiidae
+cecidomyiidous
+Cecil
+Cecile
+Cecilia
+cecilite
+cecils
+Cecily
+cecity
+cecograph
+Cecomorphae
+cecomorphic
+cecostomy
+Cecropia
+Cecrops
+cecutiency
+cedar
+cedarbird
+cedared
+cedarn
+cedarware
+cedarwood
+cedary
+cede
+cedent
+ceder
+cedilla
+cedrat
+cedrate
+cedre
+Cedrela
+cedrene
+Cedric
+cedrin
+cedrine
+cedriret
+cedrium
+cedrol
+cedron
+Cedrus
+cedry
+cedula
+cee
+Ceiba
+ceibo
+ceil
+ceile
+ceiler
+ceilidh
+ceiling
+ceilinged
+ceilingward
+ceilingwards
+ceilometer
+Celadon
+celadon
+celadonite
+Celaeno
+celandine
+Celanese
+Celarent
+Celastraceae
+celastraceous
+Celastrus
+celation
+celative
+celature
+Celebesian
+celebrant
+celebrate
+celebrated
+celebratedness
+celebrater
+celebration
+celebrative
+celebrator
+celebratory
+celebrity
+celemin
+celemines
+celeomorph
+Celeomorphae
+celeomorphic
+celeriac
+celerity
+celery
+celesta
+Celeste
+celeste
+celestial
+celestiality
+celestialize
+celestially
+celestialness
+celestina
+Celestine
+celestine
+Celestinian
+celestite
+celestitude
+Celia
+celiac
+celiadelphus
+celiagra
+celialgia
+celibacy
+celibatarian
+celibate
+celibatic
+celibatist
+celibatory
+celidographer
+celidography
+celiectasia
+celiectomy
+celiemia
+celiitis
+celiocele
+celiocentesis
+celiocolpotomy
+celiocyesis
+celiodynia
+celioelytrotomy
+celioenterotomy
+celiogastrotomy
+celiohysterotomy
+celiolymph
+celiomyalgia
+celiomyodynia
+celiomyomectomy
+celiomyomotomy
+celiomyositis
+celioncus
+celioparacentesis
+celiopyosis
+celiorrhaphy
+celiorrhea
+celiosalpingectomy
+celiosalpingotomy
+celioschisis
+celioscope
+celioscopy
+celiotomy
+celite
+cell
+cella
+cellae
+cellar
+cellarage
+cellarer
+cellaress
+cellaret
+cellaring
+cellarless
+cellarman
+cellarous
+cellarway
+cellarwoman
+cellated
+celled
+Cellepora
+cellepore
+Cellfalcicula
+celliferous
+celliform
+cellifugal
+cellipetal
+cellist
+Cellite
+cello
+cellobiose
+celloid
+celloidin
+celloist
+cellophane
+cellose
+Cellucotton
+cellular
+cellularity
+cellularly
+cellulase
+cellulate
+cellulated
+cellulation
+cellule
+cellulicidal
+celluliferous
+cellulifugal
+cellulifugally
+cellulin
+cellulipetal
+cellulipetally
+cellulitis
+cellulocutaneous
+cellulofibrous
+Celluloid
+celluloid
+celluloided
+Cellulomonadeae
+Cellulomonas
+cellulose
+cellulosic
+cellulosity
+cellulotoxic
+cellulous
+Cellvibrio
+Celosia
+Celotex
+celotomy
+Celsia
+celsian
+Celsius
+Celt
+celt
+Celtdom
+Celtiberi
+Celtiberian
+Celtic
+Celtically
+Celticism
+Celticist
+Celticize
+Celtidaceae
+celtiform
+Celtillyrians
+Celtis
+Celtish
+Celtism
+Celtist
+celtium
+Celtization
+Celtologist
+Celtologue
+Celtomaniac
+Celtophil
+Celtophobe
+Celtophobia
+celtuce
+cembalist
+cembalo
+cement
+cemental
+cementation
+cementatory
+cementer
+cementification
+cementin
+cementite
+cementitious
+cementless
+cementmaker
+cementmaking
+cementoblast
+cementoma
+cementum
+cemeterial
+cemetery
+cenacle
+cenaculum
+cenanthous
+cenanthy
+cencerro
+Cenchrus
+cendre
+cenobian
+cenobite
+cenobitic
+cenobitical
+cenobitically
+cenobitism
+cenobium
+cenoby
+cenogenesis
+cenogenetic
+cenogenetically
+cenogonous
+Cenomanian
+cenosite
+cenosity
+cenospecies
+cenospecific
+cenospecifically
+cenotaph
+cenotaphic
+cenotaphy
+Cenozoic
+cenozoology
+cense
+censer
+censerless
+censive
+censor
+censorable
+censorate
+censorial
+censorious
+censoriously
+censoriousness
+censorship
+censual
+censurability
+censurable
+censurableness
+censurably
+censure
+censureless
+censurer
+censureship
+census
+cent
+centage
+cental
+centare
+centaur
+centaurdom
+Centaurea
+centauress
+centauri
+centaurial
+centaurian
+centauric
+Centaurid
+Centauridium
+Centaurium
+centauromachia
+centauromachy
+Centaurus
+centaurus
+centaury
+centavo
+centena
+centenar
+centenarian
+centenarianism
+centenary
+centenier
+centenionalis
+centennial
+centennially
+center
+centerable
+centerboard
+centered
+centerer
+centering
+centerless
+centermost
+centerpiece
+centervelic
+centerward
+centerwise
+centesimal
+centesimally
+centesimate
+centesimation
+centesimi
+centesimo
+centesis
+Centetes
+centetid
+Centetidae
+centgener
+centiar
+centiare
+centibar
+centifolious
+centigrade
+centigram
+centile
+centiliter
+centillion
+centillionth
+Centiloquy
+centime
+centimeter
+centimo
+centimolar
+centinormal
+centipedal
+centipede
+centiplume
+centipoise
+centistere
+centistoke
+centner
+cento
+centonical
+centonism
+centrad
+central
+centrale
+Centrales
+centralism
+centralist
+centralistic
+centrality
+centralization
+centralize
+centralizer
+centrally
+centralness
+centranth
+Centranthus
+centrarchid
+Centrarchidae
+centrarchoid
+Centraxonia
+centraxonial
+Centrechinoida
+centric
+Centricae
+centrical
+centricality
+centrically
+centricalness
+centricipital
+centriciput
+centricity
+centriffed
+centrifugal
+centrifugalization
+centrifugalize
+centrifugaller
+centrifugally
+centrifugate
+centrifugation
+centrifuge
+centrifugence
+centriole
+centripetal
+centripetalism
+centripetally
+centripetence
+centripetency
+centriscid
+Centriscidae
+centrisciform
+centriscoid
+Centriscus
+centrist
+centroacinar
+centrobaric
+centrobarical
+centroclinal
+centrode
+centrodesmose
+centrodesmus
+centrodorsal
+centrodorsally
+centroid
+centroidal
+centrolecithal
+Centrolepidaceae
+centrolepidaceous
+centrolinead
+centrolineal
+centromere
+centronucleus
+centroplasm
+Centropomidae
+Centropomus
+Centrosema
+centrosome
+centrosomic
+Centrosoyus
+Centrospermae
+centrosphere
+centrosymmetric
+centrosymmetry
+Centrotus
+centrum
+centry
+centum
+centumvir
+centumviral
+centumvirate
+Centunculus
+centuple
+centuplicate
+centuplication
+centuply
+centuria
+centurial
+centuriate
+centuriation
+centuriator
+centuried
+centurion
+century
+ceorl
+ceorlish
+cep
+cepa
+cepaceous
+cepe
+cephaeline
+Cephaelis
+Cephalacanthidae
+Cephalacanthus
+cephalad
+cephalagra
+cephalalgia
+cephalalgic
+cephalalgy
+cephalanthium
+cephalanthous
+Cephalanthus
+Cephalaspis
+Cephalata
+cephalate
+cephaldemae
+cephalemia
+cephaletron
+Cephaleuros
+cephalhematoma
+cephalhydrocele
+cephalic
+cephalin
+Cephalina
+cephaline
+cephalism
+cephalitis
+cephalization
+cephaloauricular
+Cephalobranchiata
+cephalobranchiate
+cephalocathartic
+cephalocaudal
+cephalocele
+cephalocentesis
+cephalocercal
+Cephalocereus
+cephalochord
+Cephalochorda
+cephalochordal
+Cephalochordata
+cephalochordate
+cephaloclasia
+cephaloclast
+cephalocone
+cephaloconic
+cephalocyst
+cephalodiscid
+Cephalodiscida
+Cephalodiscus
+cephalodymia
+cephalodymus
+cephalodynia
+cephalofacial
+cephalogenesis
+cephalogram
+cephalograph
+cephalohumeral
+cephalohumeralis
+cephaloid
+cephalology
+cephalomancy
+cephalomant
+cephalomelus
+cephalomenia
+cephalomeningitis
+cephalomere
+cephalometer
+cephalometric
+cephalometry
+cephalomotor
+cephalomyitis
+cephalon
+cephalonasal
+cephalopagus
+cephalopathy
+cephalopharyngeal
+cephalophine
+cephalophorous
+Cephalophus
+cephalophyma
+cephaloplegia
+cephaloplegic
+cephalopod
+Cephalopoda
+cephalopodan
+cephalopodic
+cephalopodous
+Cephalopterus
+cephalorachidian
+cephalorhachidian
+cephalosome
+cephalospinal
+Cephalosporium
+cephalostyle
+Cephalotaceae
+cephalotaceous
+Cephalotaxus
+cephalotheca
+cephalothecal
+cephalothoracic
+cephalothoracopagus
+cephalothorax
+cephalotome
+cephalotomy
+cephalotractor
+cephalotribe
+cephalotripsy
+cephalotrocha
+Cephalotus
+cephalous
+Cephas
+Cepheid
+cephid
+Cephidae
+Cephus
+Cepolidae
+ceps
+ceptor
+cequi
+ceraceous
+cerago
+ceral
+ceramal
+cerambycid
+Cerambycidae
+Ceramiaceae
+ceramiaceous
+ceramic
+ceramicite
+ceramics
+ceramidium
+ceramist
+Ceramium
+ceramographic
+ceramography
+cerargyrite
+ceras
+cerasein
+cerasin
+cerastes
+Cerastium
+Cerasus
+cerata
+cerate
+ceratectomy
+cerated
+ceratiasis
+ceratiid
+Ceratiidae
+ceratioid
+ceration
+ceratite
+Ceratites
+ceratitic
+Ceratitidae
+Ceratitis
+ceratitoid
+Ceratitoidea
+Ceratium
+Ceratobatrachinae
+ceratoblast
+ceratobranchial
+ceratocricoid
+Ceratodidae
+Ceratodontidae
+Ceratodus
+ceratofibrous
+ceratoglossal
+ceratoglossus
+ceratohyal
+ceratohyoid
+ceratoid
+ceratomandibular
+ceratomania
+Ceratonia
+Ceratophrys
+Ceratophyllaceae
+ceratophyllaceous
+Ceratophyllum
+Ceratophyta
+ceratophyte
+Ceratops
+Ceratopsia
+ceratopsian
+ceratopsid
+Ceratopsidae
+Ceratopteridaceae
+ceratopteridaceous
+Ceratopteris
+ceratorhine
+Ceratosa
+Ceratosaurus
+Ceratospongiae
+ceratospongian
+Ceratostomataceae
+Ceratostomella
+ceratotheca
+ceratothecal
+Ceratozamia
+ceraunia
+ceraunics
+ceraunogram
+ceraunograph
+ceraunomancy
+ceraunophone
+ceraunoscope
+ceraunoscopy
+Cerberean
+Cerberic
+Cerberus
+cercal
+cercaria
+cercarial
+cercarian
+cercariform
+cercelee
+cerci
+Cercidiphyllaceae
+Cercis
+Cercocebus
+Cercolabes
+Cercolabidae
+cercomonad
+Cercomonadidae
+Cercomonas
+cercopid
+Cercopidae
+cercopithecid
+Cercopithecidae
+cercopithecoid
+Cercopithecus
+cercopod
+Cercospora
+Cercosporella
+cercus
+Cerdonian
+cere
+cereal
+cerealian
+cerealin
+cerealism
+cerealist
+cerealose
+cerebella
+cerebellar
+cerebellifugal
+cerebellipetal
+cerebellocortex
+cerebellopontile
+cerebellopontine
+cerebellorubral
+cerebellospinal
+cerebellum
+cerebra
+cerebral
+cerebralgia
+cerebralism
+cerebralist
+cerebralization
+cerebralize
+cerebrally
+cerebrasthenia
+cerebrasthenic
+cerebrate
+cerebration
+cerebrational
+Cerebratulus
+cerebric
+cerebricity
+cerebriform
+cerebriformly
+cerebrifugal
+cerebrin
+cerebripetal
+cerebritis
+cerebrize
+cerebrocardiac
+cerebrogalactose
+cerebroganglion
+cerebroganglionic
+cerebroid
+cerebrology
+cerebroma
+cerebromalacia
+cerebromedullary
+cerebromeningeal
+cerebromeningitis
+cerebrometer
+cerebron
+cerebronic
+cerebroparietal
+cerebropathy
+cerebropedal
+cerebrophysiology
+cerebropontile
+cerebropsychosis
+cerebrorachidian
+cerebrosclerosis
+cerebroscope
+cerebroscopy
+cerebrose
+cerebrosensorial
+cerebroside
+cerebrosis
+cerebrospinal
+cerebrospinant
+cerebrosuria
+cerebrotomy
+cerebrotonia
+cerebrotonic
+cerebrovisceral
+cerebrum
+cerecloth
+cered
+cereless
+cerement
+ceremonial
+ceremonialism
+ceremonialist
+ceremonialize
+ceremonially
+ceremonious
+ceremoniously
+ceremoniousness
+ceremony
+cereous
+cerer
+ceresin
+Cereus
+cerevis
+ceria
+Cerialia
+cerianthid
+Cerianthidae
+cerianthoid
+Cerianthus
+ceric
+ceride
+ceriferous
+cerigerous
+cerillo
+ceriman
+cerin
+cerine
+Cerinthe
+Cerinthian
+Ceriomyces
+Cerion
+Cerionidae
+ceriops
+Ceriornis
+cerise
+cerite
+Cerithiidae
+cerithioid
+Cerithium
+cerium
+cermet
+cern
+cerniture
+cernuous
+cero
+cerograph
+cerographic
+cerographist
+cerography
+ceroline
+cerolite
+ceroma
+ceromancy
+cerophilous
+ceroplast
+ceroplastic
+ceroplastics
+ceroplasty
+cerotate
+cerote
+cerotene
+cerotic
+cerotin
+cerotype
+cerous
+ceroxyle
+Ceroxylon
+cerrero
+cerrial
+cerris
+certain
+certainly
+certainty
+Certhia
+Certhiidae
+certie
+certifiable
+certifiableness
+certifiably
+certificate
+certification
+certificative
+certificator
+certificatory
+certified
+certifier
+certify
+certiorari
+certiorate
+certioration
+certis
+certitude
+certosina
+certosino
+certy
+cerule
+cerulean
+cerulein
+ceruleite
+ceruleolactite
+ceruleous
+cerulescent
+ceruleum
+cerulignol
+cerulignone
+cerumen
+ceruminal
+ceruminiferous
+ceruminous
+cerumniparous
+ceruse
+cerussite
+Cervantist
+cervantite
+cervical
+Cervicapra
+cervicaprine
+cervicectomy
+cervicicardiac
+cervicide
+cerviciplex
+cervicispinal
+cervicitis
+cervicoauricular
+cervicoaxillary
+cervicobasilar
+cervicobrachial
+cervicobregmatic
+cervicobuccal
+cervicodorsal
+cervicodynia
+cervicofacial
+cervicohumeral
+cervicolabial
+cervicolingual
+cervicolumbar
+cervicomuscular
+cerviconasal
+cervicorn
+cervicoscapular
+cervicothoracic
+cervicovaginal
+cervicovesical
+cervid
+Cervidae
+Cervinae
+cervine
+cervisia
+cervisial
+cervix
+cervoid
+cervuline
+Cervulus
+Cervus
+ceryl
+Cerynean
+Cesare
+cesarevitch
+cesarolite
+cesious
+cesium
+cespititous
+cespitose
+cespitosely
+cespitulose
+cess
+cessantly
+cessation
+cessative
+cessavit
+cesser
+cession
+cessionaire
+cessionary
+cessor
+cesspipe
+cesspit
+cesspool
+cest
+Cestida
+Cestidae
+Cestoda
+Cestodaria
+cestode
+cestoid
+Cestoidea
+cestoidean
+Cestracion
+cestraciont
+Cestraciontes
+Cestraciontidae
+Cestrian
+Cestrum
+cestrum
+cestus
+Cetacea
+cetacean
+cetaceous
+cetaceum
+cetane
+Cete
+cetene
+ceterach
+ceti
+cetic
+ceticide
+Cetid
+cetin
+Cetiosauria
+cetiosaurian
+Cetiosaurus
+cetological
+cetologist
+cetology
+Cetomorpha
+cetomorphic
+Cetonia
+cetonian
+Cetoniides
+Cetoniinae
+cetorhinid
+Cetorhinidae
+cetorhinoid
+Cetorhinus
+cetotolite
+Cetraria
+cetraric
+cetrarin
+Cetus
+cetyl
+cetylene
+cetylic
+cevadilla
+cevadilline
+cevadine
+Cevennian
+Cevenol
+Cevenole
+cevine
+cevitamic
+ceylanite
+Ceylon
+Ceylonese
+ceylonite
+ceyssatite
+Ceyx
+Cezannesque
+cha
+chaa
+chab
+chabasie
+chabazite
+Chablis
+chabot
+chabouk
+chabuk
+chabutra
+Chac
+chacate
+chachalaca
+Chachapuya
+chack
+Chackchiuma
+chacker
+chackle
+chackler
+chacma
+Chaco
+chacona
+chacte
+chad
+chadacryst
+Chaenactis
+Chaenolobus
+Chaenomeles
+chaeta
+Chaetangiaceae
+Chaetangium
+Chaetetes
+Chaetetidae
+Chaetifera
+chaetiferous
+Chaetites
+Chaetitidae
+Chaetochloa
+Chaetodon
+chaetodont
+chaetodontid
+Chaetodontidae
+chaetognath
+Chaetognatha
+chaetognathan
+chaetognathous
+Chaetophora
+Chaetophoraceae
+chaetophoraceous
+Chaetophorales
+chaetophorous
+chaetopod
+Chaetopoda
+chaetopodan
+chaetopodous
+chaetopterin
+Chaetopterus
+chaetosema
+Chaetosoma
+Chaetosomatidae
+Chaetosomidae
+chaetotactic
+chaetotaxy
+Chaetura
+chafe
+chafer
+chafery
+chafewax
+chafeweed
+chaff
+chaffcutter
+chaffer
+chafferer
+chaffinch
+chaffiness
+chaffing
+chaffingly
+chaffless
+chafflike
+chaffman
+chaffseed
+chaffwax
+chaffweed
+chaffy
+chaft
+chafted
+Chaga
+chagan
+Chagga
+chagrin
+chaguar
+chagul
+chahar
+chai
+Chailletiaceae
+chain
+chainage
+chained
+chainer
+chainette
+chainless
+chainlet
+chainmaker
+chainmaking
+chainman
+chainon
+chainsmith
+chainwale
+chainwork
+chair
+chairer
+chairless
+chairmaker
+chairmaking
+chairman
+chairmanship
+chairmender
+chairmending
+chairwarmer
+chairwoman
+chais
+chaise
+chaiseless
+Chait
+chaitya
+chaja
+chaka
+chakar
+chakari
+Chakavski
+chakazi
+chakdar
+chakobu
+chakra
+chakram
+chakravartin
+chaksi
+chal
+chalaco
+chalana
+chalastic
+Chalastogastra
+chalaza
+chalazal
+chalaze
+chalazian
+chalaziferous
+chalazion
+chalazogam
+chalazogamic
+chalazogamy
+chalazoidite
+chalcanthite
+Chalcedonian
+chalcedonic
+chalcedonous
+chalcedony
+chalcedonyx
+chalchuite
+chalcid
+Chalcidian
+Chalcidic
+chalcidicum
+chalcidid
+Chalcididae
+chalcidiform
+chalcidoid
+Chalcidoidea
+Chalcioecus
+Chalcis
+chalcites
+chalcocite
+chalcograph
+chalcographer
+chalcographic
+chalcographical
+chalcographist
+chalcography
+chalcolite
+chalcolithic
+chalcomancy
+chalcomenite
+chalcon
+chalcone
+chalcophanite
+chalcophyllite
+chalcopyrite
+chalcosiderite
+chalcosine
+chalcostibite
+chalcotrichite
+chalcotript
+chalcus
+Chaldaei
+Chaldaic
+Chaldaical
+Chaldaism
+Chaldean
+Chaldee
+chalder
+chaldron
+chalet
+chalice
+chaliced
+chalicosis
+chalicothere
+chalicotheriid
+Chalicotheriidae
+chalicotherioid
+Chalicotherium
+Chalina
+Chalinidae
+chalinine
+Chalinitis
+chalk
+chalkcutter
+chalker
+chalkiness
+chalklike
+chalkography
+chalkosideric
+chalkstone
+chalkstony
+chalkworker
+chalky
+challah
+challenge
+challengeable
+challengee
+challengeful
+challenger
+challengingly
+challie
+challis
+challote
+chalmer
+chalon
+chalone
+Chalons
+chalque
+chalta
+Chalukya
+Chalukyan
+chalumeau
+chalutz
+chalutzim
+Chalybean
+chalybeate
+chalybeous
+Chalybes
+chalybite
+Cham
+cham
+Chama
+Chamacea
+Chamacoco
+Chamaebatia
+Chamaecistus
+chamaecranial
+Chamaecrista
+Chamaecyparis
+Chamaedaphne
+Chamaeleo
+Chamaeleon
+Chamaeleontidae
+Chamaelirium
+Chamaenerion
+Chamaepericlymenum
+chamaeprosopic
+Chamaerops
+chamaerrhine
+Chamaesaura
+Chamaesiphon
+Chamaesiphonaceae
+Chamaesiphonaceous
+Chamaesiphonales
+Chamaesyce
+chamal
+Chamar
+chamar
+chamber
+chamberdeacon
+chambered
+chamberer
+chambering
+chamberlain
+chamberlainry
+chamberlainship
+chamberlet
+chamberleted
+chamberletted
+chambermaid
+Chambertin
+chamberwoman
+Chambioa
+chambray
+chambrel
+chambul
+chamecephalic
+chamecephalous
+chamecephalus
+chamecephaly
+chameleon
+chameleonic
+chameleonize
+chameleonlike
+chamfer
+chamferer
+chamfron
+Chamian
+Chamicuro
+Chamidae
+chamisal
+chamiso
+Chamite
+chamite
+Chamkanni
+chamma
+chamois
+Chamoisette
+chamoisite
+chamoline
+Chamomilla
+Chamorro
+Chamos
+champ
+Champa
+champac
+champaca
+champacol
+champagne
+champagneless
+champagnize
+champaign
+champain
+champaka
+champer
+champertor
+champertous
+champerty
+champignon
+champion
+championess
+championize
+championless
+championlike
+championship
+Champlain
+Champlainic
+champleve
+champy
+Chanabal
+Chanca
+chance
+chanceful
+chancefully
+chancefulness
+chancel
+chanceled
+chanceless
+chancellery
+chancellor
+chancellorate
+chancelloress
+chancellorism
+chancellorship
+chancer
+chancery
+chancewise
+chanche
+chanchito
+chanco
+chancre
+chancriform
+chancroid
+chancroidal
+chancrous
+chancy
+chandala
+chandam
+chandelier
+Chandi
+chandi
+chandler
+chandleress
+chandlering
+chandlery
+chandoo
+chandu
+chandul
+Chane
+chanfrin
+Chang
+chang
+changa
+changar
+change
+changeability
+changeable
+changeableness
+changeably
+changedale
+changedness
+changeful
+changefully
+changefulness
+changeless
+changelessly
+changelessness
+changeling
+changement
+changer
+Changoan
+Changos
+Changuina
+Changuinan
+Chanidae
+chank
+chankings
+channel
+channelbill
+channeled
+channeler
+channeling
+channelization
+channelize
+channelled
+channeller
+channelling
+channelwards
+channer
+chanson
+chansonnette
+chanst
+chant
+chantable
+chanter
+chanterelle
+chantership
+chantey
+chanteyman
+chanticleer
+chanting
+chantingly
+chantlate
+chantress
+chantry
+chao
+chaogenous
+chaology
+chaos
+chaotic
+chaotical
+chaotically
+chaoticness
+Chaouia
+chap
+Chapacura
+Chapacuran
+chapah
+Chapanec
+chaparral
+chaparro
+chapatty
+chapbook
+chape
+chapeau
+chapeaux
+chaped
+chapel
+chapeless
+chapelet
+chapelgoer
+chapelgoing
+chapellage
+chapellany
+chapelman
+chapelmaster
+chapelry
+chapelward
+chaperno
+chaperon
+chaperonage
+chaperone
+chaperonless
+chapfallen
+chapin
+chapiter
+chapitral
+chaplain
+chaplaincy
+chaplainry
+chaplainship
+chapless
+chaplet
+chapleted
+chapman
+chapmanship
+chapournet
+chapournetted
+chappaul
+chapped
+chapper
+chappie
+chappin
+chapping
+chappow
+chappy
+chaps
+chapt
+chaptalization
+chaptalize
+chapter
+chapteral
+chapterful
+chapwoman
+char
+Chara
+charabanc
+charabancer
+charac
+Characeae
+characeous
+characetum
+characin
+characine
+characinid
+Characinidae
+characinoid
+character
+characterful
+characterial
+characterical
+characterism
+characterist
+characteristic
+characteristical
+characteristically
+characteristicalness
+characteristicness
+characterizable
+characterization
+characterize
+characterizer
+characterless
+characterlessness
+characterological
+characterologist
+characterology
+charactery
+charade
+Charadrii
+Charadriidae
+charadriiform
+Charadriiformes
+charadrine
+charadrioid
+Charadriomorphae
+Charadrius
+Charales
+charas
+charbon
+Charca
+charcoal
+charcoaly
+charcutier
+chard
+chardock
+chare
+charer
+charet
+charette
+charge
+chargeability
+chargeable
+chargeableness
+chargeably
+chargee
+chargeless
+chargeling
+chargeman
+charger
+chargeship
+charging
+Charicleia
+charier
+charily
+chariness
+chariot
+charioted
+chariotee
+charioteer
+charioteership
+chariotlike
+chariotman
+chariotry
+chariotway
+charism
+charisma
+charismatic
+Charissa
+charisticary
+charitable
+charitableness
+charitably
+Charites
+charity
+charityless
+charivari
+chark
+charka
+charkha
+charkhana
+charlady
+charlatan
+charlatanic
+charlatanical
+charlatanically
+charlatanish
+charlatanism
+charlatanistic
+charlatanry
+charlatanship
+Charleen
+Charlene
+Charles
+Charleston
+Charley
+Charlie
+charlock
+Charlotte
+charm
+charmedly
+charmel
+charmer
+charmful
+charmfully
+charmfulness
+charming
+charmingly
+charmingness
+charmless
+charmlessly
+charmwise
+charnel
+charnockite
+Charon
+Charonian
+Charonic
+Charontas
+Charophyta
+charpit
+charpoy
+charqued
+charqui
+charr
+Charruan
+Charruas
+charry
+charshaf
+charsingha
+chart
+chartaceous
+charter
+charterable
+charterage
+chartered
+charterer
+charterhouse
+Charterist
+charterless
+chartermaster
+charthouse
+charting
+Chartism
+Chartist
+chartist
+chartless
+chartographist
+chartology
+chartometer
+chartophylax
+chartreuse
+Chartreux
+chartroom
+chartula
+chartulary
+charuk
+charwoman
+chary
+Charybdian
+Charybdis
+chasable
+chase
+chaseable
+chaser
+Chasidim
+chasing
+chasm
+chasma
+chasmal
+chasmed
+chasmic
+chasmogamic
+chasmogamous
+chasmogamy
+chasmophyte
+chasmy
+chasse
+Chasselas
+chassepot
+chasseur
+chassignite
+chassis
+Chastacosta
+chaste
+chastely
+chasten
+chastener
+chasteness
+chasteningly
+chastenment
+chasteweed
+chastisable
+chastise
+chastisement
+chastiser
+chastity
+chasuble
+chasubled
+chat
+chataka
+Chateau
+chateau
+chateaux
+chatelain
+chatelaine
+chatelainry
+chatellany
+chathamite
+chati
+Chatillon
+Chatino
+Chatot
+chatoyance
+chatoyancy
+chatoyant
+chatsome
+chatta
+chattable
+Chattanooga
+Chattanoogan
+chattation
+chattel
+chattelhood
+chattelism
+chattelization
+chattelize
+chattelship
+chatter
+chatteration
+chatterbag
+chatterbox
+chatterer
+chattering
+chatteringly
+chattermag
+chattermagging
+Chattertonian
+chattery
+Chatti
+chattily
+chattiness
+chatting
+chattingly
+chatty
+chatwood
+Chaucerian
+Chauceriana
+Chaucerianism
+Chaucerism
+Chauchat
+chaudron
+chauffer
+chauffeur
+chauffeurship
+Chaui
+chauk
+chaukidari
+Chauliodes
+chaulmoogra
+chaulmoograte
+chaulmoogric
+Chauna
+chaus
+chausseemeile
+Chautauqua
+Chautauquan
+chaute
+chauth
+chauvinism
+chauvinist
+chauvinistic
+chauvinistically
+Chavante
+Chavantean
+chavender
+chavibetol
+chavicin
+chavicine
+chavicol
+chavish
+chaw
+chawan
+chawbacon
+chawer
+Chawia
+chawk
+chawl
+chawstick
+chay
+chaya
+chayaroot
+Chayma
+Chayota
+chayote
+chayroot
+chazan
+Chazy
+che
+cheap
+cheapen
+cheapener
+cheapery
+cheaping
+cheapish
+cheaply
+cheapness
+Cheapside
+cheat
+cheatable
+cheatableness
+cheatee
+cheater
+cheatery
+cheating
+cheatingly
+cheatrie
+Chebacco
+chebec
+chebel
+chebog
+chebule
+chebulinic
+Chechehet
+Chechen
+check
+checkable
+checkage
+checkbird
+checkbite
+checkbook
+checked
+checker
+checkerbelly
+checkerberry
+checkerbloom
+checkerboard
+checkerbreast
+checkered
+checkerist
+checkers
+checkerwise
+checkerwork
+checkhook
+checkless
+checkman
+checkmate
+checkoff
+checkrack
+checkrein
+checkroll
+checkroom
+checkrope
+checkrow
+checkrowed
+checkrower
+checkstone
+checkstrap
+checkstring
+checkup
+checkweigher
+checkwork
+checky
+cheddaring
+cheddite
+cheder
+chedlock
+chee
+cheecha
+cheechako
+cheek
+cheekbone
+cheeker
+cheekily
+cheekiness
+cheekish
+cheekless
+cheekpiece
+cheeky
+cheep
+cheeper
+cheepily
+cheepiness
+cheepy
+cheer
+cheered
+cheerer
+cheerful
+cheerfulize
+cheerfully
+cheerfulness
+cheerfulsome
+cheerily
+cheeriness
+cheering
+cheeringly
+cheerio
+cheerleader
+cheerless
+cheerlessly
+cheerlessness
+cheerly
+cheery
+cheese
+cheeseboard
+cheesebox
+cheeseburger
+cheesecake
+cheesecloth
+cheesecurd
+cheesecutter
+cheeseflower
+cheeselip
+cheesemonger
+cheesemongering
+cheesemongerly
+cheesemongery
+cheeseparer
+cheeseparing
+cheeser
+cheesery
+cheesewood
+cheesiness
+cheesy
+cheet
+cheetah
+cheeter
+cheetie
+chef
+Chefrinia
+chegoe
+chegre
+Chehalis
+Cheilanthes
+cheilitis
+Cheilodipteridae
+Cheilodipterus
+Cheilostomata
+cheilostomatous
+cheir
+cheiragra
+Cheiranthus
+Cheirogaleus
+Cheiroglossa
+cheirognomy
+cheirography
+cheirolin
+cheirology
+cheiromancy
+cheiromegaly
+cheiropatagium
+cheiropodist
+cheiropody
+cheiropompholyx
+Cheiroptera
+cheiropterygium
+cheirosophy
+cheirospasm
+Cheirotherium
+Cheka
+chekan
+cheke
+cheki
+Chekist
+chekmak
+chela
+chelaship
+chelate
+chelation
+chelem
+chelerythrine
+chelicer
+chelicera
+cheliceral
+chelicerate
+chelicere
+chelide
+chelidon
+chelidonate
+chelidonian
+chelidonic
+chelidonine
+Chelidonium
+Chelidosaurus
+Cheliferidea
+cheliferous
+cheliform
+chelingo
+cheliped
+Chellean
+chello
+Chelodina
+chelodine
+chelone
+Chelonia
+chelonian
+chelonid
+Chelonidae
+cheloniid
+Cheloniidae
+chelonin
+chelophore
+chelp
+Cheltenham
+Chelura
+Chelydidae
+Chelydra
+Chelydridae
+chelydroid
+chelys
+Chemakuan
+chemasthenia
+chemawinite
+Chemehuevi
+chemesthesis
+chemiatric
+chemiatrist
+chemiatry
+chemic
+chemical
+chemicalization
+chemicalize
+chemically
+chemicker
+chemicoastrological
+chemicobiologic
+chemicobiology
+chemicocautery
+chemicodynamic
+chemicoengineering
+chemicoluminescence
+chemicomechanical
+chemicomineralogical
+chemicopharmaceutical
+chemicophysical
+chemicophysics
+chemicophysiological
+chemicovital
+chemigraph
+chemigraphic
+chemigraphy
+chemiloon
+chemiluminescence
+chemiotactic
+chemiotaxic
+chemiotaxis
+chemiotropic
+chemiotropism
+chemiphotic
+chemis
+chemise
+chemisette
+chemism
+chemisorb
+chemisorption
+chemist
+chemistry
+chemitype
+chemitypy
+chemoceptor
+chemokinesis
+chemokinetic
+chemolysis
+chemolytic
+chemolyze
+chemoreception
+chemoreceptor
+chemoreflex
+chemoresistance
+chemoserotherapy
+chemosis
+chemosmosis
+chemosmotic
+chemosynthesis
+chemosynthetic
+chemotactic
+chemotactically
+chemotaxis
+chemotaxy
+chemotherapeutic
+chemotherapeutics
+chemotherapist
+chemotherapy
+chemotic
+chemotropic
+chemotropically
+chemotropism
+Chemung
+chemurgic
+chemurgical
+chemurgy
+Chen
+chena
+chende
+chenevixite
+Cheney
+cheng
+chenica
+chenille
+cheniller
+chenopod
+Chenopodiaceae
+chenopodiaceous
+Chenopodiales
+Chenopodium
+cheoplastic
+chepster
+cheque
+Chequers
+Chera
+chercock
+cherem
+Cheremiss
+Cheremissian
+cherimoya
+cherish
+cherishable
+cherisher
+cherishing
+cherishingly
+cherishment
+Cherkess
+Cherkesser
+Chermes
+Chermidae
+Chermish
+Chernomorish
+chernozem
+Cherokee
+cheroot
+cherried
+cherry
+cherryblossom
+cherrylike
+chersonese
+Chersydridae
+chert
+cherte
+cherty
+cherub
+cherubic
+cherubical
+cherubically
+cherubim
+cherubimic
+cherubimical
+cherubin
+Cherusci
+Chervante
+chervil
+chervonets
+Chesapeake
+Cheshire
+cheson
+chess
+chessboard
+chessdom
+chessel
+chesser
+chessist
+chessman
+chessmen
+chesstree
+chessylite
+chest
+Chester
+chester
+chesterfield
+Chesterfieldian
+chesterlite
+chestful
+chestily
+chestiness
+chestnut
+chestnutty
+chesty
+Chet
+cheth
+chettik
+chetty
+chetverik
+chetvert
+chevage
+cheval
+chevalier
+chevaline
+chevance
+cheve
+cheven
+chevener
+chevesaile
+chevin
+Cheviot
+chevisance
+chevise
+chevon
+chevrette
+chevron
+chevrone
+chevronel
+chevronelly
+chevronwise
+chevrony
+chevrotain
+chevy
+chew
+chewbark
+chewer
+chewink
+chewstick
+chewy
+Cheyenne
+cheyney
+chhatri
+chi
+chia
+Chiam
+Chian
+Chianti
+Chiapanec
+Chiapanecan
+chiaroscurist
+chiaroscuro
+chiasm
+chiasma
+chiasmal
+chiasmatype
+chiasmatypy
+chiasmic
+Chiasmodon
+chiasmodontid
+Chiasmodontidae
+chiasmus
+chiastic
+chiastolite
+chiastoneural
+chiastoneurous
+chiastoneury
+chiaus
+Chibcha
+Chibchan
+chibinite
+chibouk
+chibrit
+chic
+chicane
+chicaner
+chicanery
+chicaric
+chicayote
+Chicha
+chichi
+chichicaste
+Chichimec
+chichimecan
+chichipate
+chichipe
+chichituna
+chick
+chickabiddy
+chickadee
+Chickahominy
+Chickamauga
+chickaree
+Chickasaw
+chickasaw
+chickell
+chicken
+chickenberry
+chickenbill
+chickenbreasted
+chickenhearted
+chickenheartedly
+chickenheartedness
+chickenhood
+chickenweed
+chickenwort
+chicker
+chickhood
+chickling
+chickstone
+chickweed
+chickwit
+chicky
+chicle
+chicness
+Chico
+chico
+Chicomecoatl
+chicory
+chicot
+chicote
+chicqued
+chicquer
+chicquest
+chicquing
+chid
+chidden
+chide
+chider
+chiding
+chidingly
+chidingness
+chidra
+chief
+chiefdom
+chiefery
+chiefess
+chiefest
+chiefish
+chiefless
+chiefling
+chiefly
+chiefship
+chieftain
+chieftaincy
+chieftainess
+chieftainry
+chieftainship
+chieftess
+chield
+Chien
+chien
+chiffer
+chiffon
+chiffonade
+chiffonier
+chiffony
+chifforobe
+chigetai
+chiggak
+chigger
+chiggerweed
+chignon
+chignoned
+chigoe
+chih
+chihfu
+Chihuahua
+chikara
+chil
+chilacavote
+chilalgia
+chilarium
+chilblain
+Chilcat
+child
+childbearing
+childbed
+childbirth
+childcrowing
+childe
+childed
+Childermas
+childhood
+childing
+childish
+childishly
+childishness
+childkind
+childless
+childlessness
+childlike
+childlikeness
+childly
+childness
+childrenite
+childridden
+childship
+childward
+chile
+Chilean
+Chileanization
+Chileanize
+chilectropion
+chilenite
+chili
+chiliad
+chiliadal
+chiliadic
+chiliagon
+chiliahedron
+chiliarch
+chiliarchia
+chiliarchy
+chiliasm
+chiliast
+chiliastic
+chilicote
+chilicothe
+chilidium
+Chilina
+Chilinidae
+chiliomb
+Chilion
+chilitis
+Chilkat
+chill
+chilla
+chillagite
+chilled
+chiller
+chillily
+chilliness
+chilling
+chillingly
+chillish
+Chilliwack
+chillness
+chillo
+chillroom
+chillsome
+chillum
+chillumchee
+chilly
+chilognath
+Chilognatha
+chilognathan
+chilognathous
+chilogrammo
+chiloma
+Chilomastix
+chiloncus
+chiloplasty
+chilopod
+Chilopoda
+chilopodan
+chilopodous
+Chilopsis
+Chilostoma
+Chilostomata
+chilostomatous
+chilostome
+chilotomy
+Chiltern
+chilver
+chimaera
+chimaerid
+Chimaeridae
+chimaeroid
+Chimaeroidei
+Chimakuan
+Chimakum
+Chimalakwe
+Chimalapa
+Chimane
+chimango
+Chimaphila
+Chimarikan
+Chimariko
+chimble
+chime
+chimer
+chimera
+chimeric
+chimerical
+chimerically
+chimericalness
+chimesmaster
+chiminage
+Chimmesyan
+chimney
+chimneyhead
+chimneyless
+chimneyman
+Chimonanthus
+chimopeelagic
+chimpanzee
+Chimu
+Chin
+chin
+china
+chinaberry
+chinalike
+Chinaman
+chinamania
+chinamaniac
+chinampa
+chinanta
+Chinantecan
+Chinantecs
+chinaphthol
+chinar
+chinaroot
+Chinatown
+chinaware
+chinawoman
+chinband
+chinch
+chincha
+Chinchasuyu
+chinchayote
+chinche
+chincherinchee
+chinchilla
+chinching
+chincloth
+chincough
+chine
+chined
+Chinee
+Chinese
+Chinesery
+ching
+chingma
+Chingpaw
+Chinhwan
+chinik
+chinin
+Chink
+chink
+chinkara
+chinker
+chinkerinchee
+chinking
+chinkle
+chinks
+chinky
+chinless
+chinnam
+chinned
+chinny
+chino
+chinoa
+chinol
+Chinook
+Chinookan
+chinotoxine
+chinotti
+chinpiece
+chinquapin
+chinse
+chint
+chintz
+chinwood
+Chiococca
+chiococcine
+Chiogenes
+chiolite
+chionablepsia
+Chionanthus
+Chionaspis
+Chionididae
+Chionis
+Chionodoxa
+Chiot
+chiotilla
+Chip
+chip
+chipchap
+chipchop
+Chipewyan
+chiplet
+chipling
+chipmunk
+chippable
+chippage
+chipped
+Chippendale
+chipper
+chipping
+chippy
+chips
+chipwood
+Chiquitan
+Chiquito
+chiragra
+chiral
+chiralgia
+chirality
+chirapsia
+chirarthritis
+chirata
+Chiriana
+Chiricahua
+Chiriguano
+chirimen
+Chirino
+chirinola
+chiripa
+chirivita
+chirk
+chirm
+chiro
+chirocosmetics
+chirogale
+chirognomic
+chirognomically
+chirognomist
+chirognomy
+chirognostic
+chirograph
+chirographary
+chirographer
+chirographic
+chirographical
+chirography
+chirogymnast
+chirological
+chirologically
+chirologist
+chirology
+chiromance
+chiromancer
+chiromancist
+chiromancy
+chiromant
+chiromantic
+chiromantical
+Chiromantis
+chiromegaly
+chirometer
+Chiromyidae
+Chiromys
+Chiron
+chironomic
+chironomid
+Chironomidae
+Chironomus
+chironomy
+chironym
+chiropatagium
+chiroplasty
+chiropod
+chiropodial
+chiropodic
+chiropodical
+chiropodist
+chiropodistry
+chiropodous
+chiropody
+chiropompholyx
+chiropractic
+chiropractor
+chiropraxis
+chiropter
+Chiroptera
+chiropteran
+chiropterite
+chiropterophilous
+chiropterous
+chiropterygian
+chiropterygious
+chiropterygium
+chirosophist
+chirospasm
+Chirotes
+chirotherian
+Chirotherium
+chirothesia
+chirotonsor
+chirotonsory
+chirotony
+chirotype
+chirp
+chirper
+chirpily
+chirpiness
+chirping
+chirpingly
+chirpling
+chirpy
+chirr
+chirrup
+chirruper
+chirrupy
+chirurgeon
+chirurgery
+Chisedec
+chisel
+chiseled
+chiseler
+chisellike
+chiselly
+chiselmouth
+chit
+Chita
+chitak
+chital
+chitchat
+chitchatty
+Chitimacha
+Chitimachan
+chitin
+chitinization
+chitinized
+chitinocalcareous
+chitinogenous
+chitinoid
+chitinous
+chiton
+chitosamine
+chitosan
+chitose
+chitra
+Chitrali
+chittamwood
+chitter
+chitterling
+chitty
+chivalresque
+chivalric
+chivalrous
+chivalrously
+chivalrousness
+chivalry
+chive
+chivey
+chiviatite
+Chiwere
+chkalik
+chladnite
+chlamyd
+chlamydate
+chlamydeous
+Chlamydobacteriaceae
+chlamydobacteriaceous
+Chlamydobacteriales
+Chlamydomonadaceae
+Chlamydomonadidae
+Chlamydomonas
+Chlamydosaurus
+Chlamydoselachidae
+Chlamydoselachus
+chlamydospore
+Chlamydozoa
+chlamydozoan
+chlamyphore
+Chlamyphorus
+chlamys
+Chleuh
+chloanthite
+chloasma
+Chloe
+chlor
+chloracetate
+chloragogen
+chloral
+chloralformamide
+chloralide
+chloralism
+chloralization
+chloralize
+chloralose
+chloralum
+chloramide
+chloramine
+chloramphenicol
+chloranemia
+chloranemic
+chloranhydride
+chloranil
+Chloranthaceae
+chloranthaceous
+Chloranthus
+chloranthy
+chlorapatite
+chlorastrolite
+chlorate
+chlorazide
+chlorcosane
+chlordan
+chlordane
+chlore
+Chlorella
+Chlorellaceae
+chlorellaceous
+chloremia
+chlorenchyma
+chlorhydrate
+chlorhydric
+chloric
+chloridate
+chloridation
+chloride
+Chloridella
+Chloridellidae
+chlorider
+chloridize
+chlorimeter
+chlorimetric
+chlorimetry
+chlorinate
+chlorination
+chlorinator
+chlorine
+chlorinize
+chlorinous
+chloriodide
+Chlorion
+Chlorioninae
+chlorite
+chloritic
+chloritization
+chloritize
+chloritoid
+chlorize
+chlormethane
+chlormethylic
+chloroacetate
+chloroacetic
+chloroacetone
+chloroacetophenone
+chloroamide
+chloroamine
+chloroanaemia
+chloroanemia
+chloroaurate
+chloroauric
+chloroaurite
+chlorobenzene
+chlorobromide
+chlorocalcite
+chlorocarbonate
+chlorochromates
+chlorochromic
+chlorochrous
+Chlorococcaceae
+Chlorococcales
+Chlorococcum
+Chlorococcus
+chlorocresol
+chlorocruorin
+chlorodize
+chloroform
+chloroformate
+chloroformic
+chloroformism
+chloroformist
+chloroformization
+chloroformize
+chlorogenic
+chlorogenine
+chlorohydrin
+chlorohydrocarbon
+chloroiodide
+chloroleucite
+chloroma
+chloromelanite
+chlorometer
+chloromethane
+chlorometric
+chlorometry
+Chloromycetin
+chloronitrate
+chloropal
+chloropalladates
+chloropalladic
+chlorophane
+chlorophenol
+chlorophoenicite
+Chlorophora
+Chlorophyceae
+chlorophyceous
+chlorophyl
+chlorophyll
+chlorophyllaceous
+chlorophyllan
+chlorophyllase
+chlorophyllian
+chlorophyllide
+chlorophylliferous
+chlorophylligenous
+chlorophylligerous
+chlorophyllin
+chlorophyllite
+chlorophylloid
+chlorophyllose
+chlorophyllous
+chloropia
+chloropicrin
+chloroplast
+chloroplastic
+chloroplastid
+chloroplatinate
+chloroplatinic
+chloroplatinite
+chloroplatinous
+chloroprene
+chloropsia
+chloroquine
+chlorosilicate
+chlorosis
+chlorospinel
+chlorosulphonic
+chlorotic
+chlorous
+chlorozincate
+chlorsalol
+chloryl
+Chnuphis
+cho
+choachyte
+choana
+choanate
+Choanephora
+choanocytal
+choanocyte
+Choanoflagellata
+choanoflagellate
+Choanoflagellida
+Choanoflagellidae
+choanoid
+choanophorous
+choanosomal
+choanosome
+choate
+choaty
+chob
+choca
+chocard
+Chocho
+chocho
+chock
+chockablock
+chocker
+chockler
+chockman
+Choco
+Chocoan
+chocolate
+Choctaw
+choel
+choenix
+Choeropsis
+Choes
+choffer
+choga
+chogak
+chogset
+Choiak
+choice
+choiceful
+choiceless
+choicelessness
+choicely
+choiceness
+choicy
+choil
+choiler
+choir
+choirboy
+choirlike
+choirman
+choirmaster
+choirwise
+Choisya
+chokage
+choke
+chokeberry
+chokebore
+chokecherry
+chokedamp
+choker
+chokered
+chokerman
+chokestrap
+chokeweed
+chokidar
+choking
+chokingly
+chokra
+choky
+Chol
+chol
+Chola
+chola
+cholagogic
+cholagogue
+cholalic
+cholane
+cholangioitis
+cholangitis
+cholanic
+cholanthrene
+cholate
+chold
+choleate
+cholecyanine
+cholecyst
+cholecystalgia
+cholecystectasia
+cholecystectomy
+cholecystenterorrhaphy
+cholecystenterostomy
+cholecystgastrostomy
+cholecystic
+cholecystitis
+cholecystnephrostomy
+cholecystocolostomy
+cholecystocolotomy
+cholecystoduodenostomy
+cholecystogastrostomy
+cholecystogram
+cholecystography
+cholecystoileostomy
+cholecystojejunostomy
+cholecystokinin
+cholecystolithiasis
+cholecystolithotripsy
+cholecystonephrostomy
+cholecystopexy
+cholecystorrhaphy
+cholecystostomy
+cholecystotomy
+choledoch
+choledochal
+choledochectomy
+choledochitis
+choledochoduodenostomy
+choledochoenterostomy
+choledocholithiasis
+choledocholithotomy
+choledocholithotripsy
+choledochoplasty
+choledochorrhaphy
+choledochostomy
+choledochotomy
+cholehematin
+choleic
+choleine
+choleinic
+cholelith
+cholelithiasis
+cholelithic
+cholelithotomy
+cholelithotripsy
+cholelithotrity
+cholemia
+choleokinase
+cholepoietic
+choler
+cholera
+choleraic
+choleric
+cholericly
+cholericness
+choleriform
+cholerigenous
+cholerine
+choleroid
+choleromania
+cholerophobia
+cholerrhagia
+cholestane
+cholestanol
+cholesteatoma
+cholesteatomatous
+cholestene
+cholesterate
+cholesteremia
+cholesteric
+cholesterin
+cholesterinemia
+cholesterinic
+cholesterinuria
+cholesterol
+cholesterolemia
+cholesteroluria
+cholesterosis
+cholesteryl
+choletelin
+choletherapy
+choleuria
+choli
+choliamb
+choliambic
+choliambist
+cholic
+choline
+cholinergic
+cholinesterase
+cholinic
+cholla
+choller
+Cholo
+cholochrome
+cholocyanine
+Choloepus
+chologenetic
+choloidic
+choloidinic
+chololith
+chololithic
+Cholonan
+Cholones
+cholophein
+cholorrhea
+choloscopy
+cholterheaded
+cholum
+choluria
+Choluteca
+chomp
+chondral
+chondralgia
+chondrarsenite
+chondre
+chondrectomy
+chondrenchyma
+chondric
+chondrification
+chondrify
+chondrigen
+chondrigenous
+Chondrilla
+chondrin
+chondrinous
+chondriocont
+chondriome
+chondriomere
+chondriomite
+chondriosomal
+chondriosome
+chondriosphere
+chondrite
+chondritic
+chondritis
+chondroadenoma
+chondroalbuminoid
+chondroangioma
+chondroarthritis
+chondroblast
+chondroblastoma
+chondrocarcinoma
+chondrocele
+chondroclasis
+chondroclast
+chondrocoracoid
+chondrocostal
+chondrocranial
+chondrocranium
+chondrocyte
+chondrodite
+chondroditic
+chondrodynia
+chondrodystrophia
+chondrodystrophy
+chondroendothelioma
+chondroepiphysis
+chondrofetal
+chondrofibroma
+chondrofibromatous
+Chondroganoidei
+chondrogen
+chondrogenesis
+chondrogenetic
+chondrogenous
+chondrogeny
+chondroglossal
+chondroglossus
+chondrography
+chondroid
+chondroitic
+chondroitin
+chondrolipoma
+chondrology
+chondroma
+chondromalacia
+chondromatous
+chondromucoid
+Chondromyces
+chondromyoma
+chondromyxoma
+chondromyxosarcoma
+chondropharyngeal
+chondropharyngeus
+chondrophore
+chondrophyte
+chondroplast
+chondroplastic
+chondroplasty
+chondroprotein
+chondropterygian
+Chondropterygii
+chondropterygious
+chondrosamine
+chondrosarcoma
+chondrosarcomatous
+chondroseptum
+chondrosin
+chondrosis
+chondroskeleton
+chondrostean
+Chondrostei
+chondrosteoma
+chondrosteous
+chondrosternal
+chondrotome
+chondrotomy
+chondroxiphoid
+chondrule
+chondrus
+chonolith
+chonta
+Chontal
+Chontalan
+Chontaquiro
+chontawood
+choop
+choosable
+choosableness
+choose
+chooser
+choosing
+choosingly
+choosy
+chop
+chopa
+chopboat
+chopfallen
+chophouse
+chopin
+chopine
+choplogic
+chopped
+chopper
+choppered
+chopping
+choppy
+chopstick
+Chopunnish
+Chora
+choragic
+choragion
+choragium
+choragus
+choragy
+Chorai
+choral
+choralcelo
+choraleon
+choralist
+chorally
+Chorasmian
+chord
+chorda
+Chordaceae
+chordacentrous
+chordacentrum
+chordaceous
+chordal
+chordally
+chordamesoderm
+Chordata
+chordate
+chorded
+Chordeiles
+chorditis
+chordoid
+chordomesoderm
+chordotomy
+chordotonal
+chore
+chorea
+choreal
+choreatic
+choree
+choregic
+choregus
+choregy
+choreic
+choreiform
+choreograph
+choreographer
+choreographic
+choreographical
+choreography
+choreoid
+choreomania
+chorepiscopal
+chorepiscopus
+choreus
+choreutic
+chorial
+choriamb
+choriambic
+choriambize
+choriambus
+choric
+chorine
+chorioadenoma
+chorioallantoic
+chorioallantoid
+chorioallantois
+choriocapillaris
+choriocapillary
+choriocarcinoma
+choriocele
+chorioepithelioma
+chorioid
+chorioidal
+chorioiditis
+chorioidocyclitis
+chorioidoiritis
+chorioidoretinitis
+chorioma
+chorion
+chorionepithelioma
+chorionic
+Chorioptes
+chorioptic
+chorioretinal
+chorioretinitis
+Choripetalae
+choripetalous
+choriphyllous
+chorisepalous
+chorisis
+chorism
+chorist
+choristate
+chorister
+choristership
+choristic
+choristoblastoma
+choristoma
+choristry
+chorization
+chorizont
+chorizontal
+chorizontes
+chorizontic
+chorizontist
+chorogi
+chorograph
+chorographer
+chorographic
+chorographical
+chorographically
+chorography
+choroid
+choroidal
+choroidea
+choroiditis
+choroidocyclitis
+choroidoiritis
+choroidoretinitis
+chorological
+chorologist
+chorology
+choromania
+choromanic
+chorometry
+chorook
+Chorotega
+Choroti
+chort
+chorten
+Chorti
+chortle
+chortler
+chortosterol
+chorus
+choruser
+choruslike
+Chorwat
+choryos
+chose
+chosen
+chott
+Chou
+Chouan
+Chouanize
+chouette
+chough
+chouka
+choultry
+choup
+chouquette
+chous
+chouse
+chouser
+chousingha
+chow
+Chowanoc
+chowchow
+chowder
+chowderhead
+chowderheaded
+chowk
+chowry
+choya
+choyroot
+Chozar
+chrematheism
+chrematist
+chrematistic
+chrematistics
+chreotechnics
+chresmology
+chrestomathic
+chrestomathics
+chrestomathy
+chria
+chrimsel
+Chris
+chrism
+chrisma
+chrismal
+chrismary
+chrismatine
+chrismation
+chrismatite
+chrismatize
+chrismatory
+chrismon
+chrisom
+chrisomloosing
+chrisroot
+Chrissie
+Christ
+Christabel
+Christadelphian
+Christadelphianism
+christcross
+Christdom
+Christed
+christen
+Christendie
+Christendom
+christened
+christener
+christening
+Christenmas
+Christhood
+Christiad
+Christian
+Christiana
+Christiania
+Christianiadeal
+Christianism
+christianite
+Christianity
+Christianization
+Christianize
+Christianizer
+Christianlike
+Christianly
+Christianness
+Christianogentilism
+Christianography
+Christianomastix
+Christianopaganism
+Christicide
+Christie
+Christiform
+Christina
+Christine
+Christless
+Christlessness
+Christlike
+Christlikeness
+Christliness
+Christly
+Christmas
+Christmasberry
+Christmasing
+Christmastide
+Christmasy
+Christocentric
+Christofer
+Christogram
+Christolatry
+Christological
+Christologist
+Christology
+Christophany
+Christophe
+Christopher
+Christos
+chroatol
+Chrobat
+chroma
+chromaffin
+chromaffinic
+chromammine
+chromaphil
+chromaphore
+chromascope
+chromate
+chromatic
+chromatical
+chromatically
+chromatician
+chromaticism
+chromaticity
+chromatics
+chromatid
+chromatin
+chromatinic
+Chromatioideae
+chromatism
+chromatist
+Chromatium
+chromatize
+chromatocyte
+chromatodysopia
+chromatogenous
+chromatogram
+chromatograph
+chromatographic
+chromatography
+chromatoid
+chromatology
+chromatolysis
+chromatolytic
+chromatometer
+chromatone
+chromatopathia
+chromatopathic
+chromatopathy
+chromatophil
+chromatophile
+chromatophilia
+chromatophilic
+chromatophilous
+chromatophobia
+chromatophore
+chromatophoric
+chromatophorous
+chromatoplasm
+chromatopsia
+chromatoptometer
+chromatoptometry
+chromatoscope
+chromatoscopy
+chromatosis
+chromatosphere
+chromatospheric
+chromatrope
+chromaturia
+chromatype
+chromazurine
+chromdiagnosis
+chrome
+chromene
+chromesthesia
+chromic
+chromicize
+chromid
+Chromidae
+Chromides
+chromidial
+Chromididae
+chromidiogamy
+chromidiosome
+chromidium
+chromidrosis
+chromiferous
+chromiole
+chromism
+chromite
+chromitite
+chromium
+chromo
+Chromobacterieae
+Chromobacterium
+chromoblast
+chromocenter
+chromocentral
+chromochalcographic
+chromochalcography
+chromocollograph
+chromocollographic
+chromocollography
+chromocollotype
+chromocollotypy
+chromocratic
+chromocyte
+chromocytometer
+chromodermatosis
+chromodiascope
+chromogen
+chromogene
+chromogenesis
+chromogenetic
+chromogenic
+chromogenous
+chromogram
+chromograph
+chromoisomer
+chromoisomeric
+chromoisomerism
+chromoleucite
+chromolipoid
+chromolith
+chromolithic
+chromolithograph
+chromolithographer
+chromolithographic
+chromolithography
+chromolysis
+chromomere
+chromometer
+chromone
+chromonema
+chromoparous
+chromophage
+chromophane
+chromophile
+chromophilic
+chromophilous
+chromophobic
+chromophore
+chromophoric
+chromophorous
+chromophotograph
+chromophotographic
+chromophotography
+chromophotolithograph
+chromophyll
+chromoplasm
+chromoplasmic
+chromoplast
+chromoplastid
+chromoprotein
+chromopsia
+chromoptometer
+chromoptometrical
+chromosantonin
+chromoscope
+chromoscopic
+chromoscopy
+chromosomal
+chromosome
+chromosphere
+chromospheric
+chromotherapist
+chromotherapy
+chromotrope
+chromotropic
+chromotropism
+chromotropy
+chromotype
+chromotypic
+chromotypographic
+chromotypography
+chromotypy
+chromous
+chromoxylograph
+chromoxylography
+chromule
+chromy
+chromyl
+chronal
+chronanagram
+chronaxia
+chronaxie
+chronaxy
+chronic
+chronical
+chronically
+chronicity
+chronicle
+chronicler
+chronicon
+chronisotherm
+chronist
+chronobarometer
+chronocinematography
+chronocrator
+chronocyclegraph
+chronodeik
+chronogeneous
+chronogenesis
+chronogenetic
+chronogram
+chronogrammatic
+chronogrammatical
+chronogrammatically
+chronogrammatist
+chronogrammic
+chronograph
+chronographer
+chronographic
+chronographical
+chronographically
+chronography
+chronoisothermal
+chronologer
+chronologic
+chronological
+chronologically
+chronologist
+chronologize
+chronology
+chronomancy
+chronomantic
+chronometer
+chronometric
+chronometrical
+chronometrically
+chronometry
+chrononomy
+chronopher
+chronophotograph
+chronophotographic
+chronophotography
+Chronos
+chronoscope
+chronoscopic
+chronoscopically
+chronoscopy
+chronosemic
+chronostichon
+chronothermal
+chronothermometer
+chronotropic
+chronotropism
+Chroococcaceae
+chroococcaceous
+Chroococcales
+chroococcoid
+Chroococcus
+Chrosperma
+chrotta
+chrysal
+chrysalid
+chrysalidal
+chrysalides
+chrysalidian
+chrysaline
+chrysalis
+chrysaloid
+chrysamine
+chrysammic
+chrysamminic
+Chrysamphora
+chrysaniline
+chrysanisic
+chrysanthemin
+chrysanthemum
+chrysanthous
+Chrysaor
+chrysarobin
+chrysatropic
+chrysazin
+chrysazol
+chryselectrum
+chryselephantine
+Chrysemys
+chrysene
+chrysenic
+chrysid
+Chrysidella
+chrysidid
+Chrysididae
+chrysin
+Chrysippus
+Chrysis
+chrysoaristocracy
+Chrysobalanaceae
+Chrysobalanus
+chrysoberyl
+chrysobull
+chrysocarpous
+chrysochlore
+Chrysochloridae
+Chrysochloris
+chrysochlorous
+chrysochrous
+chrysocolla
+chrysocracy
+chrysoeriol
+chrysogen
+chrysograph
+chrysographer
+chrysography
+chrysohermidin
+chrysoidine
+chrysolite
+chrysolitic
+chrysology
+Chrysolophus
+chrysomelid
+Chrysomelidae
+chrysomonad
+Chrysomonadales
+Chrysomonadina
+chrysomonadine
+Chrysomyia
+Chrysopa
+chrysopal
+chrysopee
+chrysophan
+chrysophanic
+Chrysophanus
+chrysophenine
+chrysophilist
+chrysophilite
+Chrysophlyctis
+chrysophyll
+Chrysophyllum
+chrysopid
+Chrysopidae
+chrysopoeia
+chrysopoetic
+chrysopoetics
+chrysoprase
+Chrysops
+Chrysopsis
+chrysorin
+chrysosperm
+Chrysosplenium
+Chrysothamnus
+Chrysothrix
+chrysotile
+Chrysotis
+chrystocrene
+chthonian
+chthonic
+chthonophagia
+chthonophagy
+chub
+chubbed
+chubbedness
+chubbily
+chubbiness
+chubby
+Chuchona
+Chuck
+chuck
+chucker
+chuckhole
+chuckies
+chucking
+chuckingly
+chuckle
+chucklehead
+chuckleheaded
+chuckler
+chucklingly
+chuckrum
+chuckstone
+chuckwalla
+chucky
+Chud
+chuddar
+Chude
+Chudic
+Chueta
+chufa
+chuff
+chuffy
+chug
+chugger
+chuhra
+Chuje
+chukar
+Chukchi
+chukker
+chukor
+chulan
+chullpa
+chum
+Chumashan
+Chumawi
+chummage
+chummer
+chummery
+chummily
+chummy
+chump
+chumpaka
+chumpish
+chumpishness
+Chumpivilca
+chumpy
+chumship
+Chumulu
+Chun
+chun
+chunari
+Chuncho
+chunga
+chunk
+chunkhead
+chunkily
+chunkiness
+chunky
+chunner
+chunnia
+chunter
+chupak
+chupon
+chuprassie
+chuprassy
+church
+churchanity
+churchcraft
+churchdom
+churchful
+churchgoer
+churchgoing
+churchgrith
+churchianity
+churchified
+churchiness
+churching
+churchish
+churchism
+churchite
+churchless
+churchlet
+churchlike
+churchliness
+churchly
+churchman
+churchmanly
+churchmanship
+churchmaster
+churchscot
+churchward
+churchwarden
+churchwardenism
+churchwardenize
+churchwardenship
+churchwards
+churchway
+churchwise
+churchwoman
+churchy
+churchyard
+churel
+churinga
+churl
+churled
+churlhood
+churlish
+churlishly
+churlishness
+churly
+churm
+churn
+churnability
+churnful
+churning
+churnmilk
+churnstaff
+Churoya
+Churoyan
+churr
+Churrigueresque
+churruck
+churrus
+churrworm
+chut
+chute
+chuter
+chutney
+Chuvash
+Chwana
+chyack
+chyak
+chylaceous
+chylangioma
+chylaqueous
+chyle
+chylemia
+chylidrosis
+chylifaction
+chylifactive
+chylifactory
+chyliferous
+chylific
+chylification
+chylificatory
+chyliform
+chylify
+chylocaulous
+chylocauly
+chylocele
+chylocyst
+chyloid
+chylomicron
+chylopericardium
+chylophyllous
+chylophylly
+chylopoiesis
+chylopoietic
+chylosis
+chylothorax
+chylous
+chyluria
+chymaqueous
+chymase
+chyme
+chymia
+chymic
+chymiferous
+chymification
+chymify
+chymosin
+chymosinogen
+chymotrypsin
+chymotrypsinogen
+chymous
+chypre
+chytra
+chytrid
+Chytridiaceae
+chytridiaceous
+chytridial
+Chytridiales
+chytridiose
+chytridiosis
+Chytridium
+Chytroi
+cibarial
+cibarian
+cibarious
+cibation
+cibol
+Cibola
+Cibolan
+Ciboney
+cibophobia
+ciborium
+cibory
+ciboule
+cicad
+cicada
+Cicadellidae
+cicadid
+Cicadidae
+cicala
+cicatrice
+cicatrices
+cicatricial
+cicatricle
+cicatricose
+cicatricula
+cicatricule
+cicatrisive
+cicatrix
+cicatrizant
+cicatrizate
+cicatrization
+cicatrize
+cicatrizer
+cicatrose
+Cicely
+cicely
+cicer
+ciceronage
+cicerone
+ciceroni
+Ciceronian
+Ciceronianism
+Ciceronianize
+Ciceronic
+Ciceronically
+ciceronism
+ciceronize
+cichlid
+Cichlidae
+cichloid
+cichoraceous
+Cichoriaceae
+cichoriaceous
+Cichorium
+Cicindela
+cicindelid
+cicindelidae
+cicisbeism
+ciclatoun
+Ciconia
+Ciconiae
+ciconian
+ciconiid
+Ciconiidae
+ciconiiform
+Ciconiiformes
+ciconine
+ciconioid
+Cicuta
+cicutoxin
+Cid
+cidarid
+Cidaridae
+cidaris
+Cidaroida
+cider
+ciderish
+ciderist
+ciderkin
+cig
+cigala
+cigar
+cigaresque
+cigarette
+cigarfish
+cigarillo
+cigarito
+cigarless
+cigua
+ciguatera
+cilectomy
+cilia
+ciliary
+Ciliata
+ciliate
+ciliated
+ciliately
+ciliation
+cilice
+Cilician
+cilicious
+Cilicism
+ciliella
+ciliferous
+ciliform
+ciliiferous
+ciliiform
+Cilioflagellata
+cilioflagellate
+ciliograde
+ciliolate
+ciliolum
+Ciliophora
+cilioretinal
+cilioscleral
+ciliospinal
+ciliotomy
+cilium
+cillosis
+cimbia
+Cimbri
+Cimbrian
+Cimbric
+cimelia
+cimex
+cimicid
+Cimicidae
+cimicide
+cimiciform
+Cimicifuga
+cimicifugin
+cimicoid
+ciminite
+cimline
+Cimmeria
+Cimmerian
+Cimmerianism
+cimolite
+cinch
+cincher
+cincholoipon
+cincholoiponic
+cinchomeronic
+Cinchona
+Cinchonaceae
+cinchonaceous
+cinchonamine
+cinchonate
+cinchonia
+cinchonic
+cinchonicine
+cinchonidia
+cinchonidine
+cinchonine
+cinchoninic
+cinchonism
+cinchonization
+cinchonize
+cinchonology
+cinchophen
+cinchotine
+cinchotoxine
+cincinnal
+Cincinnati
+Cincinnatia
+Cincinnatian
+cincinnus
+Cinclidae
+Cinclidotus
+cinclis
+Cinclus
+cinct
+cincture
+cinder
+Cinderella
+cinderlike
+cinderman
+cinderous
+cindery
+Cindie
+Cindy
+cine
+cinecamera
+cinefilm
+cinel
+cinema
+Cinemascope
+cinematic
+cinematical
+cinematically
+cinematize
+cinematograph
+cinematographer
+cinematographic
+cinematographical
+cinematographically
+cinematographist
+cinematography
+cinemelodrama
+cinemize
+cinemograph
+cinenchyma
+cinenchymatous
+cinene
+cinenegative
+cineole
+cineolic
+cinephone
+cinephotomicrography
+cineplastics
+cineplasty
+cineraceous
+Cinerama
+Cineraria
+cinerarium
+cinerary
+cineration
+cinerator
+cinerea
+cinereal
+cinereous
+cineritious
+cinevariety
+cingle
+cingular
+cingulate
+cingulated
+cingulum
+cinnabar
+cinnabaric
+cinnabarine
+cinnamal
+cinnamaldehyde
+cinnamate
+cinnamein
+cinnamene
+cinnamenyl
+cinnamic
+Cinnamodendron
+cinnamol
+cinnamomic
+Cinnamomum
+cinnamon
+cinnamoned
+cinnamonic
+cinnamonlike
+cinnamonroot
+cinnamonwood
+cinnamyl
+cinnamylidene
+cinnoline
+cinnyl
+cinquain
+cinque
+cinquecentism
+cinquecentist
+cinquecento
+cinquefoil
+cinquefoiled
+cinquepace
+cinter
+Cinura
+cinuran
+cinurous
+cion
+cionectomy
+cionitis
+cionocranial
+cionocranian
+cionoptosis
+cionorrhaphia
+cionotome
+cionotomy
+Cipango
+cipher
+cipherable
+cipherdom
+cipherer
+cipherhood
+cipo
+cipolin
+cippus
+circa
+Circaea
+Circaeaceae
+Circaetus
+Circassian
+Circassic
+Circe
+Circean
+Circensian
+circinal
+circinate
+circinately
+circination
+Circinus
+circiter
+circle
+circled
+circler
+circlet
+circlewise
+circling
+circovarian
+circuit
+circuitable
+circuital
+circuiteer
+circuiter
+circuition
+circuitman
+circuitor
+circuitous
+circuitously
+circuitousness
+circuity
+circulable
+circulant
+circular
+circularism
+circularity
+circularization
+circularize
+circularizer
+circularly
+circularness
+circularwise
+circulate
+circulation
+circulative
+circulator
+circulatory
+circumagitate
+circumagitation
+circumambages
+circumambagious
+circumambience
+circumambiency
+circumambient
+circumambulate
+circumambulation
+circumambulator
+circumambulatory
+circumanal
+circumantarctic
+circumarctic
+circumarticular
+circumaviate
+circumaviation
+circumaviator
+circumaxial
+circumaxile
+circumaxillary
+circumbasal
+circumbendibus
+circumboreal
+circumbuccal
+circumbulbar
+circumcallosal
+Circumcellion
+circumcenter
+circumcentral
+circumcinct
+circumcincture
+circumcircle
+circumcise
+circumciser
+circumcision
+circumclude
+circumclusion
+circumcolumnar
+circumcone
+circumconic
+circumcorneal
+circumcrescence
+circumcrescent
+circumdenudation
+circumdiction
+circumduce
+circumduct
+circumduction
+circumesophagal
+circumesophageal
+circumference
+circumferential
+circumferentially
+circumferentor
+circumflant
+circumflect
+circumflex
+circumflexion
+circumfluence
+circumfluent
+circumfluous
+circumforaneous
+circumfulgent
+circumfuse
+circumfusile
+circumfusion
+circumgenital
+circumgyrate
+circumgyration
+circumgyratory
+circumhorizontal
+circumincession
+circuminsession
+circuminsular
+circumintestinal
+circumitineration
+circumjacence
+circumjacency
+circumjacent
+circumlental
+circumlitio
+circumlittoral
+circumlocute
+circumlocution
+circumlocutional
+circumlocutionary
+circumlocutionist
+circumlocutory
+circummeridian
+circummeridional
+circummigration
+circummundane
+circummure
+circumnatant
+circumnavigable
+circumnavigate
+circumnavigation
+circumnavigator
+circumnavigatory
+circumneutral
+circumnuclear
+circumnutate
+circumnutation
+circumnutatory
+circumocular
+circumoesophagal
+circumoral
+circumorbital
+circumpacific
+circumpallial
+circumparallelogram
+circumpentagon
+circumplicate
+circumplication
+circumpolar
+circumpolygon
+circumpose
+circumposition
+circumradius
+circumrenal
+circumrotate
+circumrotation
+circumrotatory
+circumsail
+circumscissile
+circumscribable
+circumscribe
+circumscribed
+circumscriber
+circumscript
+circumscription
+circumscriptive
+circumscriptively
+circumscriptly
+circumsinous
+circumspangle
+circumspatial
+circumspect
+circumspection
+circumspective
+circumspectively
+circumspectly
+circumspectness
+circumspheral
+circumstance
+circumstanced
+circumstantiability
+circumstantiable
+circumstantial
+circumstantiality
+circumstantially
+circumstantialness
+circumstantiate
+circumstantiation
+circumtabular
+circumterraneous
+circumterrestrial
+circumtonsillar
+circumtropical
+circumumbilical
+circumundulate
+circumundulation
+circumvallate
+circumvallation
+circumvascular
+circumvent
+circumventer
+circumvention
+circumventive
+circumventor
+circumviate
+circumvolant
+circumvolute
+circumvolution
+circumvolutory
+circumvolve
+circumzenithal
+circus
+circusy
+cirque
+cirrate
+cirrated
+Cirratulidae
+Cirratulus
+Cirrhopetalum
+cirrhosed
+cirrhosis
+cirrhotic
+cirrhous
+cirri
+cirribranch
+cirriferous
+cirriform
+cirrigerous
+cirrigrade
+cirriped
+Cirripedia
+cirripedial
+cirrolite
+cirropodous
+cirrose
+Cirrostomi
+cirrous
+cirrus
+cirsectomy
+Cirsium
+cirsocele
+cirsoid
+cirsomphalos
+cirsophthalmia
+cirsotome
+cirsotomy
+ciruela
+cirurgian
+Cisalpine
+cisalpine
+Cisalpinism
+cisandine
+cisatlantic
+cisco
+cise
+cisele
+cisgangetic
+cisjurane
+cisleithan
+cismarine
+Cismontane
+cismontane
+Cismontanism
+cisoceanic
+cispadane
+cisplatine
+cispontine
+cisrhenane
+Cissampelos
+cissing
+cissoid
+cissoidal
+Cissus
+cist
+cista
+Cistaceae
+cistaceous
+cistae
+cisted
+Cistercian
+Cistercianism
+cistern
+cisterna
+cisternal
+cistic
+cistophoric
+cistophorus
+Cistudo
+Cistus
+cistvaen
+cit
+citable
+citadel
+citation
+citator
+citatory
+cite
+citee
+Citellus
+citer
+citess
+cithara
+Citharexylum
+citharist
+citharista
+citharoedi
+citharoedic
+citharoedus
+cither
+citied
+citification
+citified
+citify
+Citigradae
+citigrade
+citizen
+citizendom
+citizeness
+citizenhood
+citizenish
+citizenism
+citizenize
+citizenly
+citizenry
+citizenship
+citole
+citraconate
+citraconic
+citral
+citramide
+citramontane
+citrange
+citrangeade
+citrate
+citrated
+citrean
+citrene
+citreous
+citric
+citriculture
+citriculturist
+citril
+citrin
+citrination
+citrine
+citrinin
+citrinous
+citrometer
+Citromyces
+citron
+citronade
+citronella
+citronellal
+citronelle
+citronellic
+citronellol
+citronin
+citronwood
+Citropsis
+citropten
+citrous
+citrullin
+Citrullus
+Citrus
+citrus
+citrylidene
+cittern
+citua
+city
+citycism
+citydom
+cityfolk
+cityful
+cityish
+cityless
+cityness
+cityscape
+cityward
+citywards
+cive
+civet
+civetlike
+civetone
+civic
+civically
+civicism
+civics
+civil
+civilian
+civility
+civilizable
+civilization
+civilizational
+civilizatory
+civilize
+civilized
+civilizedness
+civilizee
+civilizer
+civilly
+civilness
+civism
+Civitan
+civvy
+cixiid
+Cixiidae
+Cixo
+clabber
+clabbery
+clachan
+clack
+Clackama
+clackdish
+clacker
+clacket
+clackety
+clad
+cladanthous
+cladautoicous
+cladding
+cladine
+cladocarpous
+Cladocera
+cladoceran
+cladocerous
+cladode
+cladodial
+cladodont
+cladodontid
+Cladodontidae
+Cladodus
+cladogenous
+Cladonia
+Cladoniaceae
+cladoniaceous
+cladonioid
+Cladophora
+Cladophoraceae
+cladophoraceous
+Cladophorales
+cladophyll
+cladophyllum
+cladoptosis
+cladose
+Cladoselache
+Cladoselachea
+cladoselachian
+Cladoselachidae
+cladosiphonic
+Cladosporium
+Cladothrix
+Cladrastis
+cladus
+clag
+claggum
+claggy
+Claiborne
+Claibornian
+claim
+claimable
+claimant
+claimer
+claimless
+clairaudience
+clairaudient
+clairaudiently
+clairce
+Claire
+clairecole
+clairecolle
+clairschach
+clairschacher
+clairsentience
+clairsentient
+clairvoyance
+clairvoyancy
+clairvoyant
+clairvoyantly
+claith
+claithes
+claiver
+Clallam
+clam
+clamant
+clamantly
+clamative
+Clamatores
+clamatorial
+clamatory
+clamb
+clambake
+clamber
+clamberer
+clamcracker
+clame
+clamer
+clammed
+clammer
+clammily
+clamminess
+clamming
+clammish
+clammy
+clammyweed
+clamor
+clamorer
+clamorist
+clamorous
+clamorously
+clamorousness
+clamorsome
+clamp
+clamper
+clamshell
+clamworm
+clan
+clancular
+clancularly
+clandestine
+clandestinely
+clandestineness
+clandestinity
+clanfellow
+clang
+clangful
+clangingly
+clangor
+clangorous
+clangorously
+Clangula
+clanjamfray
+clanjamfrey
+clanjamfrie
+clanjamphrey
+clank
+clankety
+clanking
+clankingly
+clankingness
+clankless
+clanless
+clanned
+clanning
+clannishly
+clannishness
+clansfolk
+clanship
+clansman
+clansmanship
+clanswoman
+Claosaurus
+clap
+clapboard
+clapbread
+clapmatch
+clapnet
+clapped
+clapper
+clapperclaw
+clapperclawer
+clapperdudgeon
+clappermaclaw
+clapping
+clapt
+claptrap
+clapwort
+claque
+claquer
+Clara
+clarabella
+clarain
+Clare
+Clarence
+Clarenceux
+Clarenceuxship
+Clarencieux
+clarendon
+claret
+Claretian
+Claribel
+claribella
+Clarice
+clarifiant
+clarification
+clarifier
+clarify
+clarigation
+clarin
+Clarinda
+clarinet
+clarinetist
+clarinettist
+clarion
+clarionet
+Clarissa
+Clarisse
+Clarist
+clarity
+Clark
+clark
+clarkeite
+Clarkia
+claro
+Claromontane
+clarshech
+clart
+clarty
+clary
+clash
+clasher
+clashingly
+clashy
+clasmatocyte
+clasmatosis
+clasp
+clasper
+clasping
+claspt
+class
+classable
+classbook
+classed
+classer
+classes
+classfellow
+classic
+classical
+classicalism
+classicalist
+classicality
+classicalize
+classically
+classicalness
+classicism
+classicist
+classicistic
+classicize
+classicolatry
+classifiable
+classific
+classifically
+classification
+classificational
+classificator
+classificatory
+classified
+classifier
+classis
+classism
+classman
+classmanship
+classmate
+classroom
+classwise
+classwork
+classy
+clastic
+clat
+clatch
+Clathraceae
+clathraceous
+Clathraria
+clathrarian
+clathrate
+Clathrina
+Clathrinidae
+clathroid
+clathrose
+clathrulate
+Clathrus
+Clatsop
+clatter
+clatterer
+clatteringly
+clattertrap
+clattery
+clatty
+Claude
+claudent
+claudetite
+Claudia
+Claudian
+claudicant
+claudicate
+claudication
+Claudio
+Claudius
+claught
+clausal
+clause
+Clausilia
+Clausiliidae
+clausthalite
+claustra
+claustral
+claustration
+claustrophobia
+claustrum
+clausula
+clausular
+clausule
+clausure
+claut
+clava
+clavacin
+claval
+Clavaria
+Clavariaceae
+clavariaceous
+clavate
+clavated
+clavately
+clavation
+clave
+clavecin
+clavecinist
+clavel
+clavelization
+clavelize
+clavellate
+clavellated
+claver
+clavial
+claviature
+clavicembalo
+Claviceps
+clavichord
+clavichordist
+clavicithern
+clavicle
+clavicorn
+clavicornate
+Clavicornes
+Clavicornia
+clavicotomy
+clavicular
+clavicularium
+claviculate
+claviculus
+clavicylinder
+clavicymbal
+clavicytherium
+clavier
+clavierist
+claviform
+claviger
+clavigerous
+claviharp
+clavilux
+claviol
+clavipectoral
+clavis
+clavodeltoid
+clavodeltoideus
+clavola
+clavolae
+clavolet
+clavus
+clavy
+claw
+clawed
+clawer
+clawk
+clawker
+clawless
+Clay
+clay
+claybank
+claybrained
+clayen
+clayer
+clayey
+clayiness
+clayish
+claylike
+clayman
+claymore
+Clayoquot
+claypan
+Clayton
+Claytonia
+clayware
+clayweed
+cleach
+clead
+cleaded
+cleading
+cleam
+cleamer
+clean
+cleanable
+cleaner
+cleanhanded
+cleanhandedness
+cleanhearted
+cleaning
+cleanish
+cleanlily
+cleanliness
+cleanly
+cleanness
+cleanout
+cleansable
+cleanse
+cleanser
+cleansing
+cleanskins
+cleanup
+clear
+clearable
+clearage
+clearance
+clearcole
+clearedness
+clearer
+clearheaded
+clearheadedly
+clearheadedness
+clearhearted
+clearing
+clearinghouse
+clearish
+clearly
+clearness
+clearskins
+clearstarch
+clearweed
+clearwing
+cleat
+cleavability
+cleavable
+cleavage
+cleave
+cleaveful
+cleavelandite
+cleaver
+cleavers
+cleaverwort
+cleaving
+cleavingly
+cleche
+cleck
+cled
+cledge
+cledgy
+cledonism
+clee
+cleek
+cleeked
+cleeky
+clef
+cleft
+clefted
+cleg
+cleidagra
+cleidarthritis
+cleidocostal
+cleidocranial
+cleidohyoid
+cleidomancy
+cleidomastoid
+cleidorrhexis
+cleidoscapular
+cleidosternal
+cleidotomy
+cleidotripsy
+cleistocarp
+cleistocarpous
+cleistogamic
+cleistogamically
+cleistogamous
+cleistogamously
+cleistogamy
+cleistogene
+cleistogenous
+cleistogeny
+cleistothecium
+Cleistothecopsis
+cleithral
+cleithrum
+Clem
+clem
+Clematis
+clematite
+Clemclemalats
+clemence
+clemency
+Clement
+clement
+Clementina
+Clementine
+clemently
+clench
+cleoid
+Cleome
+Cleopatra
+clep
+Clepsine
+clepsydra
+cleptobiosis
+cleptobiotic
+clerestoried
+clerestory
+clergy
+clergyable
+clergylike
+clergyman
+clergywoman
+cleric
+clerical
+clericalism
+clericalist
+clericality
+clericalize
+clerically
+clericate
+clericature
+clericism
+clericity
+clerid
+Cleridae
+clerihew
+clerisy
+clerk
+clerkage
+clerkdom
+clerkery
+clerkess
+clerkhood
+clerking
+clerkish
+clerkless
+clerklike
+clerkliness
+clerkly
+clerkship
+Clerodendron
+cleromancy
+cleronomy
+cleruch
+cleruchial
+cleruchic
+cleruchy
+Clerus
+cletch
+Clethra
+Clethraceae
+clethraceous
+cleuch
+cleve
+cleveite
+clever
+cleverality
+cleverish
+cleverishly
+cleverly
+cleverness
+clevis
+clew
+cliack
+clianthus
+cliche
+click
+clicker
+clicket
+clickless
+clicky
+Clidastes
+cliency
+client
+clientage
+cliental
+cliented
+clientelage
+clientele
+clientless
+clientry
+clientship
+Cliff
+cliff
+cliffed
+cliffless
+clifflet
+clifflike
+Clifford
+cliffside
+cliffsman
+cliffweed
+cliffy
+clift
+Cliftonia
+cliftonite
+clifty
+clima
+Climaciaceae
+climaciaceous
+Climacium
+climacteric
+climacterical
+climacterically
+climactic
+climactical
+climactically
+climacus
+climata
+climatal
+climate
+climath
+climatic
+climatical
+climatically
+Climatius
+climatize
+climatographical
+climatography
+climatologic
+climatological
+climatologically
+climatologist
+climatology
+climatometer
+climatotherapeutics
+climatotherapy
+climature
+climax
+climb
+climbable
+climber
+climbing
+clime
+climograph
+clinal
+clinamen
+clinamina
+clinandria
+clinandrium
+clinanthia
+clinanthium
+clinch
+clincher
+clinchingly
+clinchingness
+cline
+cling
+clinger
+clingfish
+clinging
+clingingly
+clingingness
+clingstone
+clingy
+clinia
+clinic
+clinical
+clinically
+clinician
+clinicist
+clinicopathological
+clinium
+clink
+clinker
+clinkerer
+clinkery
+clinking
+clinkstone
+clinkum
+clinoaxis
+clinocephalic
+clinocephalism
+clinocephalous
+clinocephalus
+clinocephaly
+clinochlore
+clinoclase
+clinoclasite
+clinodiagonal
+clinodomatic
+clinodome
+clinograph
+clinographic
+clinohedral
+clinohedrite
+clinohumite
+clinoid
+clinologic
+clinology
+clinometer
+clinometric
+clinometrical
+clinometry
+clinopinacoid
+clinopinacoidal
+Clinopodium
+clinoprism
+clinopyramid
+clinopyroxene
+clinorhombic
+clinospore
+clinostat
+clinquant
+clint
+clinting
+Clinton
+Clintonia
+clintonite
+clinty
+Clio
+Cliona
+Clione
+clip
+clipei
+clipeus
+clippable
+clipped
+clipper
+clipperman
+clipping
+clips
+clipse
+clipsheet
+clipsome
+clipt
+clique
+cliquedom
+cliqueless
+cliquish
+cliquishly
+cliquishness
+cliquism
+cliquy
+cliseometer
+clisere
+clishmaclaver
+Clisiocampa
+Clistogastra
+clit
+clitch
+clite
+clitella
+clitellar
+clitelliferous
+clitelline
+clitellum
+clitellus
+clites
+clithe
+clithral
+clithridiate
+clitia
+clition
+Clitocybe
+Clitoria
+clitoridauxe
+clitoridean
+clitoridectomy
+clitoriditis
+clitoridotomy
+clitoris
+clitorism
+clitoritis
+clitter
+clitterclatter
+clival
+clive
+clivers
+Clivia
+clivis
+clivus
+cloaca
+cloacal
+cloacaline
+cloacean
+cloacinal
+cloacinean
+cloacitis
+cloak
+cloakage
+cloaked
+cloakedly
+cloaking
+cloakless
+cloaklet
+cloakmaker
+cloakmaking
+cloakroom
+cloakwise
+cloam
+cloamen
+cloamer
+clobber
+clobberer
+clochan
+cloche
+clocher
+clochette
+clock
+clockbird
+clockcase
+clocked
+clocker
+clockface
+clockhouse
+clockkeeper
+clockless
+clocklike
+clockmaker
+clockmaking
+clockmutch
+clockroom
+clocksmith
+clockwise
+clockwork
+clod
+clodbreaker
+clodder
+cloddily
+cloddiness
+cloddish
+cloddishly
+cloddishness
+cloddy
+clodhead
+clodhopper
+clodhopping
+clodlet
+clodpate
+clodpated
+clodpoll
+cloff
+clog
+clogdogdo
+clogger
+cloggily
+clogginess
+cloggy
+cloghad
+cloglike
+clogmaker
+clogmaking
+clogwood
+clogwyn
+cloiochoanitic
+cloisonless
+cloisonne
+cloister
+cloisteral
+cloistered
+cloisterer
+cloisterless
+cloisterlike
+cloisterliness
+cloisterly
+cloisterwise
+cloistral
+cloistress
+cloit
+clomb
+clomben
+clonal
+clone
+clonic
+clonicity
+clonicotonic
+clonism
+clonorchiasis
+Clonorchis
+Clonothrix
+clonus
+cloof
+cloop
+cloot
+clootie
+clop
+cloragen
+clorargyrite
+cloriodid
+closable
+close
+closecross
+closed
+closefisted
+closefistedly
+closefistedness
+closehanded
+closehearted
+closely
+closemouth
+closemouthed
+closen
+closeness
+closer
+closestool
+closet
+closewing
+closh
+closish
+closter
+Closterium
+clostridial
+Clostridium
+closure
+clot
+clotbur
+clote
+cloth
+clothbound
+clothe
+clothes
+clothesbag
+clothesbasket
+clothesbrush
+clotheshorse
+clothesline
+clothesman
+clothesmonger
+clothespin
+clothespress
+clothesyard
+clothier
+clothify
+Clothilda
+clothing
+clothmaker
+clothmaking
+Clotho
+clothworker
+clothy
+clottage
+clottedness
+clotter
+clotty
+cloture
+clotweed
+cloud
+cloudage
+cloudberry
+cloudburst
+cloudcap
+clouded
+cloudful
+cloudily
+cloudiness
+clouding
+cloudland
+cloudless
+cloudlessly
+cloudlessness
+cloudlet
+cloudlike
+cloudling
+cloudology
+cloudscape
+cloudship
+cloudward
+cloudwards
+cloudy
+clough
+clour
+clout
+clouted
+clouter
+clouterly
+clouty
+clove
+cloven
+clovene
+clover
+clovered
+cloverlay
+cloverleaf
+cloveroot
+cloverroot
+clovery
+clow
+clown
+clownade
+clownage
+clownery
+clownheal
+clownish
+clownishly
+clownishness
+clownship
+clowring
+cloy
+cloyedness
+cloyer
+cloying
+cloyingly
+cloyingness
+cloyless
+cloysome
+club
+clubbability
+clubbable
+clubbed
+clubber
+clubbily
+clubbing
+clubbish
+clubbism
+clubbist
+clubby
+clubdom
+clubfellow
+clubfisted
+clubfoot
+clubfooted
+clubhand
+clubhaul
+clubhouse
+clubionid
+Clubionidae
+clubland
+clubman
+clubmate
+clubmobile
+clubmonger
+clubridden
+clubroom
+clubroot
+clubstart
+clubster
+clubweed
+clubwoman
+clubwood
+cluck
+clue
+cluff
+clump
+clumpish
+clumproot
+clumpy
+clumse
+clumsily
+clumsiness
+clumsy
+clunch
+clung
+Cluniac
+Cluniacensian
+Clunisian
+Clunist
+clunk
+clupanodonic
+Clupea
+clupeid
+Clupeidae
+clupeiform
+clupeine
+Clupeodei
+clupeoid
+cluricaune
+Clusia
+Clusiaceae
+clusiaceous
+cluster
+clusterberry
+clustered
+clusterfist
+clustering
+clusteringly
+clustery
+clutch
+clutchman
+cluther
+clutter
+clutterer
+clutterment
+cluttery
+cly
+Clyde
+Clydesdale
+Clydeside
+Clydesider
+clyer
+clyfaker
+clyfaking
+Clymenia
+clype
+clypeal
+Clypeaster
+Clypeastridea
+Clypeastrina
+clypeastroid
+Clypeastroida
+Clypeastroidea
+clypeate
+clypeiform
+clypeolar
+clypeolate
+clypeole
+clypeus
+clysis
+clysma
+clysmian
+clysmic
+clyster
+clysterize
+Clytemnestra
+cnemapophysis
+cnemial
+cnemidium
+Cnemidophorus
+cnemis
+Cneoraceae
+cneoraceous
+Cneorum
+cnicin
+Cnicus
+cnida
+Cnidaria
+cnidarian
+Cnidian
+cnidoblast
+cnidocell
+cnidocil
+cnidocyst
+cnidophore
+cnidophorous
+cnidopod
+cnidosac
+Cnidoscolus
+cnidosis
+coabode
+coabound
+coabsume
+coacceptor
+coacervate
+coacervation
+coach
+coachability
+coachable
+coachbuilder
+coachbuilding
+coachee
+coacher
+coachfellow
+coachful
+coaching
+coachlet
+coachmaker
+coachmaking
+coachman
+coachmanship
+coachmaster
+coachsmith
+coachsmithing
+coachway
+coachwhip
+coachwise
+coachwoman
+coachwork
+coachwright
+coachy
+coact
+coaction
+coactive
+coactively
+coactivity
+coactor
+coadamite
+coadapt
+coadaptation
+coadequate
+coadjacence
+coadjacency
+coadjacent
+coadjacently
+coadjudicator
+coadjust
+coadjustment
+coadjutant
+coadjutator
+coadjute
+coadjutement
+coadjutive
+coadjutor
+coadjutorship
+coadjutress
+coadjutrix
+coadjuvancy
+coadjuvant
+coadjuvate
+coadminister
+coadministration
+coadministrator
+coadministratrix
+coadmiration
+coadmire
+coadmit
+coadnate
+coadore
+coadsorbent
+coadunate
+coadunation
+coadunative
+coadunatively
+coadunite
+coadventure
+coadventurer
+coadvice
+coaffirmation
+coafforest
+coaged
+coagency
+coagent
+coaggregate
+coaggregated
+coaggregation
+coagitate
+coagitator
+coagment
+coagonize
+coagriculturist
+coagula
+coagulability
+coagulable
+coagulant
+coagulase
+coagulate
+coagulation
+coagulative
+coagulator
+coagulatory
+coagulin
+coagulometer
+coagulose
+coagulum
+Coahuiltecan
+coaid
+coaita
+coak
+coakum
+coal
+coalbag
+coalbagger
+coalbin
+coalbox
+coaldealer
+coaler
+coalesce
+coalescence
+coalescency
+coalescent
+coalfish
+coalfitter
+coalhole
+coalification
+coalify
+Coalite
+coalition
+coalitional
+coalitioner
+coalitionist
+coalize
+coalizer
+coalless
+coalmonger
+coalmouse
+coalpit
+coalrake
+coalsack
+coalternate
+coalternation
+coalternative
+coaltitude
+coaly
+coalyard
+coambassador
+coambulant
+coamiable
+coaming
+Coan
+coanimate
+coannex
+coannihilate
+coapostate
+coapparition
+coappear
+coappearance
+coapprehend
+coapprentice
+coappriser
+coapprover
+coapt
+coaptate
+coaptation
+coaration
+coarb
+coarbiter
+coarbitrator
+coarctate
+coarctation
+coardent
+coarrange
+coarrangement
+coarse
+coarsely
+coarsen
+coarseness
+coarsish
+coascend
+coassert
+coasserter
+coassession
+coassessor
+coassignee
+coassist
+coassistance
+coassistant
+coassume
+coast
+coastal
+coastally
+coaster
+Coastguard
+coastguardman
+coasting
+coastland
+coastman
+coastside
+coastwaiter
+coastward
+coastwards
+coastways
+coastwise
+coat
+coated
+coatee
+coater
+coati
+coatie
+coatimondie
+coatimundi
+coating
+coatless
+coatroom
+coattail
+coattailed
+coattend
+coattest
+coattestation
+coattestator
+coaudience
+coauditor
+coaugment
+coauthor
+coauthority
+coauthorship
+coawareness
+coax
+coaxal
+coaxation
+coaxer
+coaxial
+coaxially
+coaxing
+coaxingly
+coaxy
+cob
+cobaea
+cobalt
+cobaltammine
+cobaltic
+cobalticyanic
+cobalticyanides
+cobaltiferous
+cobaltinitrite
+cobaltite
+cobaltocyanic
+cobaltocyanide
+cobaltous
+cobang
+cobbed
+cobber
+cobberer
+cobbing
+cobble
+cobbler
+cobblerfish
+cobblerism
+cobblerless
+cobblership
+cobblery
+cobblestone
+cobbling
+cobbly
+cobbra
+cobby
+cobcab
+Cobdenism
+Cobdenite
+cobego
+cobelief
+cobeliever
+cobelligerent
+cobenignity
+coberger
+cobewail
+cobhead
+cobia
+cobiron
+cobishop
+Cobitidae
+Cobitis
+coble
+cobleman
+Coblentzian
+Cobleskill
+cobless
+cobloaf
+cobnut
+cobola
+coboundless
+cobourg
+cobra
+cobreathe
+cobridgehead
+cobriform
+cobrother
+cobstone
+coburg
+coburgess
+coburgher
+coburghership
+Cobus
+cobweb
+cobwebbery
+cobwebbing
+cobwebby
+cobwork
+coca
+cocaceous
+cocaine
+cocainism
+cocainist
+cocainization
+cocainize
+cocainomania
+cocainomaniac
+Cocama
+Cocamama
+cocamine
+Cocanucos
+cocarboxylase
+cocash
+cocashweed
+cocause
+cocautioner
+Coccaceae
+coccagee
+coccal
+Cocceian
+Cocceianism
+coccerin
+cocci
+coccid
+Coccidae
+coccidia
+coccidial
+coccidian
+Coccidiidea
+coccidioidal
+Coccidioides
+Coccidiomorpha
+coccidiosis
+coccidium
+coccidology
+cocciferous
+cocciform
+coccigenic
+coccinella
+coccinellid
+Coccinellidae
+coccionella
+cocco
+coccobacillus
+coccochromatic
+Coccogonales
+coccogone
+Coccogoneae
+coccogonium
+coccoid
+coccolite
+coccolith
+coccolithophorid
+Coccolithophoridae
+Coccoloba
+Coccolobis
+Coccomyces
+coccosphere
+coccostean
+coccosteid
+Coccosteidae
+Coccosteus
+Coccothraustes
+coccothraustine
+Coccothrinax
+coccous
+coccule
+cocculiferous
+Cocculus
+cocculus
+coccus
+coccydynia
+coccygalgia
+coccygeal
+coccygean
+coccygectomy
+coccygerector
+coccyges
+coccygeus
+coccygine
+coccygodynia
+coccygomorph
+Coccygomorphae
+coccygomorphic
+coccygotomy
+coccyodynia
+coccyx
+Coccyzus
+cocentric
+cochairman
+cochal
+cochief
+Cochin
+cochineal
+cochlea
+cochlear
+cochleare
+Cochlearia
+cochlearifoliate
+cochleariform
+cochleate
+cochleated
+cochleiform
+cochleitis
+cochleous
+cochlidiid
+Cochlidiidae
+cochliodont
+Cochliodontidae
+Cochliodus
+Cochlospermaceae
+cochlospermaceous
+Cochlospermum
+Cochranea
+cochurchwarden
+cocillana
+cocircular
+cocircularity
+cocitizen
+cocitizenship
+cock
+cockade
+cockaded
+Cockaigne
+cockal
+cockalorum
+cockamaroo
+cockarouse
+cockateel
+cockatoo
+cockatrice
+cockawee
+cockbell
+cockbill
+cockbird
+cockboat
+cockbrain
+cockchafer
+cockcrow
+cockcrower
+cockcrowing
+cocked
+Cocker
+cocker
+cockerel
+cockermeg
+cockernony
+cocket
+cockeye
+cockeyed
+cockfight
+cockfighting
+cockhead
+cockhorse
+cockieleekie
+cockily
+cockiness
+cocking
+cockish
+cockle
+cockleboat
+cocklebur
+cockled
+cockler
+cockleshell
+cocklet
+cocklewife
+cocklight
+cockling
+cockloft
+cockly
+cockmaster
+cockmatch
+cockmate
+cockneian
+cockneity
+cockney
+cockneybred
+cockneydom
+cockneyese
+cockneyess
+cockneyfication
+cockneyfy
+cockneyish
+cockneyishly
+cockneyism
+cockneyize
+cockneyland
+cockneyship
+cockpit
+cockroach
+cockscomb
+cockscombed
+cocksfoot
+cockshead
+cockshot
+cockshut
+cockshy
+cockshying
+cockspur
+cockstone
+cocksure
+cocksuredom
+cocksureism
+cocksurely
+cocksureness
+cocksurety
+cocktail
+cockthrowing
+cockup
+cockweed
+cocky
+Cocle
+coco
+cocoa
+cocoach
+cocobolo
+Coconino
+coconnection
+coconqueror
+coconscious
+coconsciously
+coconsciousness
+coconsecrator
+coconspirator
+coconstituent
+cocontractor
+Coconucan
+Coconuco
+coconut
+cocoon
+cocoonery
+cocorico
+cocoroot
+Cocos
+cocotte
+cocovenantor
+cocowood
+cocowort
+cocozelle
+cocreate
+cocreator
+cocreatorship
+cocreditor
+cocrucify
+coctile
+coction
+coctoantigen
+coctoprecipitin
+cocuisa
+cocullo
+cocurator
+cocurrent
+cocuswood
+cocuyo
+Cocytean
+Cocytus
+cod
+coda
+codamine
+codbank
+codder
+codding
+coddle
+coddler
+code
+codebtor
+codeclination
+codecree
+codefendant
+codeine
+codeless
+codelight
+codelinquency
+codelinquent
+codenization
+codeposit
+coder
+coderive
+codescendant
+codespairer
+codex
+codfish
+codfisher
+codfishery
+codger
+codhead
+codheaded
+Codiaceae
+codiaceous
+Codiaeum
+Codiales
+codical
+codices
+codicil
+codicilic
+codicillary
+codictatorship
+codification
+codifier
+codify
+codilla
+codille
+codiniac
+codirectional
+codirector
+codiscoverer
+codisjunct
+codist
+Codium
+codivine
+codling
+codman
+codo
+codol
+codomestication
+codominant
+codon
+codpiece
+codpitchings
+Codrus
+codshead
+codworm
+coe
+coecal
+coecum
+coed
+coeditor
+coeditorship
+coeducate
+coeducation
+coeducational
+coeducationalism
+coeducationalize
+coeducationally
+coeffect
+coefficacy
+coefficient
+coefficiently
+coeffluent
+coeffluential
+coelacanth
+coelacanthid
+Coelacanthidae
+coelacanthine
+Coelacanthini
+coelacanthoid
+coelacanthous
+coelanaglyphic
+coelar
+coelarium
+Coelastraceae
+coelastraceous
+Coelastrum
+Coelata
+coelder
+coeldership
+Coelebogyne
+coelect
+coelection
+coelector
+coelectron
+coelelminth
+Coelelminthes
+coelelminthic
+Coelentera
+Coelenterata
+coelenterate
+coelenteric
+coelenteron
+coelestine
+coelevate
+coelho
+coelia
+coeliac
+coelialgia
+coelian
+Coelicolae
+Coelicolist
+coeligenous
+coelin
+coeline
+coeliomyalgia
+coeliorrhea
+coeliorrhoea
+coelioscopy
+coeliotomy
+coeloblastic
+coeloblastula
+Coelococcus
+coelodont
+coelogastrula
+Coeloglossum
+Coelogyne
+coelom
+coeloma
+Coelomata
+coelomate
+coelomatic
+coelomatous
+coelomesoblast
+coelomic
+Coelomocoela
+coelomopore
+coelonavigation
+coelongated
+coeloplanula
+coelosperm
+coelospermous
+coelostat
+coelozoic
+coemanate
+coembedded
+coembody
+coembrace
+coeminency
+coemperor
+coemploy
+coemployee
+coemployment
+coempt
+coemption
+coemptional
+coemptionator
+coemptive
+coemptor
+coenact
+coenactor
+coenaculous
+coenamor
+coenamorment
+coenamourment
+coenanthium
+coendear
+Coendidae
+Coendou
+coendure
+coenenchym
+coenenchyma
+coenenchymal
+coenenchymatous
+coenenchyme
+coenesthesia
+coenesthesis
+coenflame
+coengage
+coengager
+coenjoy
+coenobe
+coenobiar
+coenobic
+coenobioid
+coenobium
+coenoblast
+coenoblastic
+coenocentrum
+coenocyte
+coenocytic
+coenodioecism
+coenoecial
+coenoecic
+coenoecium
+coenogamete
+coenomonoecism
+coenosarc
+coenosarcal
+coenosarcous
+coenosite
+coenospecies
+coenospecific
+coenospecifically
+coenosteal
+coenosteum
+coenotrope
+coenotype
+coenotypic
+coenthrone
+coenurus
+coenzyme
+coequal
+coequality
+coequalize
+coequally
+coequalness
+coequate
+coequated
+coequation
+coerce
+coercement
+coercer
+coercibility
+coercible
+coercibleness
+coercibly
+coercion
+coercionary
+coercionist
+coercitive
+coercive
+coercively
+coerciveness
+coercivity
+Coerebidae
+coeruleolactite
+coessential
+coessentiality
+coessentially
+coessentialness
+coestablishment
+coestate
+coetaneity
+coetaneous
+coetaneously
+coetaneousness
+coeternal
+coeternally
+coeternity
+coetus
+coeval
+coevality
+coevally
+coexchangeable
+coexclusive
+coexecutant
+coexecutor
+coexecutrix
+coexert
+coexertion
+coexist
+coexistence
+coexistency
+coexistent
+coexpand
+coexpanded
+coexperiencer
+coexpire
+coexplosion
+coextend
+coextension
+coextensive
+coextensively
+coextensiveness
+coextent
+cofactor
+Cofane
+cofaster
+cofather
+cofathership
+cofeature
+cofeoffee
+coferment
+cofermentation
+coff
+Coffea
+coffee
+coffeebush
+coffeecake
+coffeegrower
+coffeegrowing
+coffeehouse
+coffeeleaf
+coffeepot
+coffeeroom
+coffeetime
+coffeeweed
+coffeewood
+coffer
+cofferdam
+cofferer
+cofferfish
+coffering
+cofferlike
+cofferwork
+coffin
+coffinless
+coffinmaker
+coffinmaking
+coffle
+coffret
+cofighter
+coforeknown
+coformulator
+cofounder
+cofoundress
+cofreighter
+coft
+cofunction
+cog
+cogence
+cogency
+cogener
+cogeneric
+cogent
+cogently
+cogged
+cogger
+coggie
+cogging
+coggle
+coggledy
+cogglety
+coggly
+coghle
+cogitability
+cogitable
+cogitabund
+cogitabundity
+cogitabundly
+cogitabundous
+cogitant
+cogitantly
+cogitate
+cogitatingly
+cogitation
+cogitative
+cogitatively
+cogitativeness
+cogitativity
+cogitator
+coglorify
+coglorious
+cogman
+cognac
+cognate
+cognateness
+cognatic
+cognatical
+cognation
+cognisable
+cognisance
+cognition
+cognitional
+cognitive
+cognitively
+cognitum
+cognizability
+cognizable
+cognizableness
+cognizably
+cognizance
+cognizant
+cognize
+cognizee
+cognizer
+cognizor
+cognomen
+cognominal
+cognominate
+cognomination
+cognosce
+cognoscent
+cognoscibility
+cognoscible
+cognoscitive
+cognoscitively
+cogon
+cogonal
+cogovernment
+cogovernor
+cogracious
+cograil
+cogrediency
+cogredient
+cogroad
+Cogswellia
+coguarantor
+coguardian
+cogue
+cogway
+cogwheel
+cogwood
+cohabit
+cohabitancy
+cohabitant
+cohabitation
+coharmonious
+coharmoniously
+coharmonize
+coheartedness
+coheir
+coheiress
+coheirship
+cohelper
+cohelpership
+Cohen
+cohenite
+coherald
+cohere
+coherence
+coherency
+coherent
+coherently
+coherer
+coheretic
+coheritage
+coheritor
+cohesibility
+cohesible
+cohesion
+cohesive
+cohesively
+cohesiveness
+cohibit
+cohibition
+cohibitive
+cohibitor
+coho
+cohoba
+cohobate
+cohobation
+cohobator
+cohol
+cohort
+cohortation
+cohortative
+cohosh
+cohune
+cohusband
+coidentity
+coif
+coifed
+coiffure
+coign
+coigue
+coil
+coiled
+coiler
+coiling
+coilsmith
+coimmense
+coimplicant
+coimplicate
+coimplore
+coin
+coinable
+coinage
+coincide
+coincidence
+coincidency
+coincident
+coincidental
+coincidentally
+coincidently
+coincider
+coinclination
+coincline
+coinclude
+coincorporate
+coindicant
+coindicate
+coindication
+coindwelling
+coiner
+coinfeftment
+coinfer
+coinfinite
+coinfinity
+coinhabit
+coinhabitant
+coinhabitor
+coinhere
+coinherence
+coinherent
+coinheritance
+coinheritor
+coining
+coinitial
+coinmaker
+coinmaking
+coinmate
+coinspire
+coinstantaneity
+coinstantaneous
+coinstantaneously
+coinstantaneousness
+coinsurance
+coinsure
+cointense
+cointension
+cointensity
+cointer
+cointerest
+cointersecting
+cointise
+Cointreau
+coinventor
+coinvolve
+coiny
+coir
+coislander
+coistrel
+coistril
+coital
+coition
+coiture
+coitus
+Coix
+cojudge
+cojuror
+cojusticiar
+coke
+cokelike
+cokeman
+coker
+cokernut
+cokery
+coking
+coky
+col
+Cola
+cola
+colaborer
+Colada
+colalgia
+Colan
+colander
+colane
+colarin
+colate
+colation
+colatitude
+colatorium
+colature
+colauxe
+colback
+colberter
+colbertine
+Colbertism
+colcannon
+Colchian
+Colchicaceae
+colchicine
+Colchicum
+Colchis
+colchyte
+Colcine
+colcothar
+cold
+colder
+coldfinch
+coldhearted
+coldheartedly
+coldheartedness
+coldish
+coldly
+coldness
+coldproof
+coldslaw
+Cole
+cole
+coleader
+colecannon
+colectomy
+Coleen
+colegatee
+colegislator
+colemanite
+colemouse
+Coleochaetaceae
+coleochaetaceous
+Coleochaete
+Coleophora
+Coleophoridae
+coleopter
+Coleoptera
+coleopteral
+coleopteran
+coleopterist
+coleopteroid
+coleopterological
+coleopterology
+coleopteron
+coleopterous
+coleoptile
+coleoptilum
+coleorhiza
+Coleosporiaceae
+Coleosporium
+coleplant
+coleseed
+coleslaw
+colessee
+colessor
+coletit
+coleur
+Coleus
+colewort
+coli
+Colias
+colibacillosis
+colibacterin
+colibri
+colic
+colical
+colichemarde
+colicky
+colicolitis
+colicroot
+colicweed
+colicwort
+colicystitis
+colicystopyelitis
+coliform
+Coliidae
+Coliiformes
+colilysin
+Colima
+colima
+Colin
+colin
+colinear
+colinephritis
+coling
+Colinus
+coliplication
+colipuncture
+colipyelitis
+colipyuria
+colisepsis
+Coliseum
+coliseum
+colitic
+colitis
+colitoxemia
+coliuria
+Colius
+colk
+coll
+Colla
+collaborate
+collaboration
+collaborationism
+collaborationist
+collaborative
+collaboratively
+collaborator
+collage
+collagen
+collagenic
+collagenous
+collapse
+collapsibility
+collapsible
+collar
+collarband
+collarbird
+collarbone
+collard
+collare
+collared
+collaret
+collarino
+collarless
+collarman
+collatable
+collate
+collatee
+collateral
+collaterality
+collaterally
+collateralness
+collation
+collationer
+collatitious
+collative
+collator
+collatress
+collaud
+collaudation
+colleague
+colleagueship
+collect
+collectability
+collectable
+collectanea
+collectarium
+collected
+collectedly
+collectedness
+collectibility
+collectible
+collection
+collectional
+collectioner
+collective
+collectively
+collectiveness
+collectivism
+collectivist
+collectivistic
+collectivistically
+collectivity
+collectivization
+collectivize
+collector
+collectorate
+collectorship
+collectress
+colleen
+collegatary
+college
+colleger
+collegial
+collegialism
+collegiality
+collegian
+collegianer
+Collegiant
+collegiate
+collegiately
+collegiateness
+collegiation
+collegium
+Collembola
+collembolan
+collembole
+collembolic
+collembolous
+collenchyma
+collenchymatic
+collenchymatous
+collenchyme
+collencytal
+collencyte
+Colleri
+Colleries
+Collery
+collery
+collet
+colleter
+colleterial
+colleterium
+Colletes
+Colletia
+colletic
+Colletidae
+colletin
+Colletotrichum
+colletside
+colley
+collibert
+colliculate
+colliculus
+collide
+collidine
+collie
+collied
+collier
+colliery
+collieshangie
+colliform
+colligate
+colligation
+colligative
+colligible
+collimate
+collimation
+collimator
+Collin
+collin
+collinal
+colline
+collinear
+collinearity
+collinearly
+collineate
+collineation
+colling
+collingly
+collingual
+Collins
+collins
+Collinsia
+collinsite
+Collinsonia
+colliquate
+colliquation
+colliquative
+colliquativeness
+collision
+collisional
+collisive
+colloblast
+collobrierite
+collocal
+Collocalia
+collocate
+collocation
+collocationable
+collocative
+collocatory
+collochemistry
+collochromate
+collock
+collocution
+collocutor
+collocutory
+collodiochloride
+collodion
+collodionization
+collodionize
+collodiotype
+collodium
+collogue
+colloid
+colloidal
+colloidality
+colloidize
+colloidochemical
+Collomia
+collop
+colloped
+collophanite
+collophore
+colloque
+colloquia
+colloquial
+colloquialism
+colloquialist
+colloquiality
+colloquialize
+colloquially
+colloquialness
+colloquist
+colloquium
+colloquize
+colloquy
+collothun
+collotype
+collotypic
+collotypy
+colloxylin
+colluctation
+collude
+colluder
+collum
+collumelliaceous
+collusion
+collusive
+collusively
+collusiveness
+collutorium
+collutory
+colluvial
+colluvies
+colly
+collyba
+Collybia
+Collyridian
+collyrite
+collyrium
+collywest
+collyweston
+collywobbles
+colmar
+colobin
+colobium
+coloboma
+Colobus
+Colocasia
+colocentesis
+Colocephali
+colocephalous
+coloclysis
+colocola
+colocolic
+colocynth
+colocynthin
+colodyspepsia
+coloenteritis
+cologarithm
+Cologne
+cololite
+Colombian
+colombier
+colombin
+Colombina
+colometric
+colometrically
+colometry
+colon
+colonalgia
+colonate
+colonel
+colonelcy
+colonelship
+colongitude
+colonial
+colonialism
+colonialist
+colonialize
+colonially
+colonialness
+colonic
+colonist
+colonitis
+colonizability
+colonizable
+colonization
+colonizationist
+colonize
+colonizer
+colonnade
+colonnaded
+colonnette
+colonopathy
+colonopexy
+colonoscope
+colonoscopy
+colony
+colopexia
+colopexotomy
+colopexy
+colophane
+colophany
+colophene
+colophenic
+colophon
+colophonate
+Colophonian
+colophonic
+colophonist
+colophonite
+colophonium
+colophony
+coloplication
+coloproctitis
+coloptosis
+colopuncture
+coloquintid
+coloquintida
+color
+colorability
+colorable
+colorableness
+colorably
+Coloradan
+Colorado
+colorado
+coloradoite
+colorant
+colorate
+coloration
+colorational
+colorationally
+colorative
+coloratura
+colorature
+colorcast
+colorectitis
+colorectostomy
+colored
+colorer
+colorfast
+colorful
+colorfully
+colorfulness
+colorific
+colorifics
+colorimeter
+colorimetric
+colorimetrical
+colorimetrically
+colorimetrics
+colorimetrist
+colorimetry
+colorin
+coloring
+colorist
+coloristic
+colorization
+colorize
+colorless
+colorlessly
+colorlessness
+colormaker
+colormaking
+colorman
+colorrhaphy
+colors
+colortype
+Colorum
+colory
+coloss
+colossal
+colossality
+colossally
+colossean
+Colosseum
+colossi
+Colossian
+Colossochelys
+colossus
+Colossuswise
+colostomy
+colostral
+colostration
+colostric
+colostrous
+colostrum
+colotomy
+colotyphoid
+colove
+colp
+colpenchyma
+colpeo
+colpeurynter
+colpeurysis
+colpindach
+colpitis
+colpocele
+colpocystocele
+colpohyperplasia
+colpohysterotomy
+colpoperineoplasty
+colpoperineorrhaphy
+colpoplastic
+colpoplasty
+colpoptosis
+colporrhagia
+colporrhaphy
+colporrhea
+colporrhexis
+colport
+colportage
+colporter
+colporteur
+colposcope
+colposcopy
+colpotomy
+colpus
+Colt
+colt
+colter
+colthood
+coltish
+coltishly
+coltishness
+coltpixie
+coltpixy
+coltsfoot
+coltskin
+Coluber
+colubrid
+Colubridae
+colubriform
+Colubriformes
+Colubriformia
+Colubrina
+Colubrinae
+colubrine
+colubroid
+colugo
+Columba
+columbaceous
+Columbae
+Columban
+Columbanian
+columbarium
+columbary
+columbate
+columbeion
+Columbella
+Columbia
+columbiad
+Columbian
+columbic
+Columbid
+Columbidae
+columbier
+columbiferous
+Columbiformes
+columbin
+Columbine
+columbine
+columbite
+columbium
+columbo
+columboid
+columbotantalate
+columbotitanate
+columella
+columellar
+columellate
+Columellia
+Columelliaceae
+columelliform
+column
+columnal
+columnar
+columnarian
+columnarity
+columnated
+columned
+columner
+columniation
+columniferous
+columniform
+columning
+columnist
+columnization
+columnwise
+colunar
+colure
+Colutea
+Colville
+coly
+Colymbidae
+colymbiform
+colymbion
+Colymbriformes
+Colymbus
+colyone
+colyonic
+colytic
+colyum
+colyumist
+colza
+coma
+comacine
+comagistracy
+comagmatic
+comaker
+comal
+comamie
+Coman
+Comanche
+Comanchean
+Comandra
+comanic
+comart
+Comarum
+comate
+comatose
+comatosely
+comatoseness
+comatosity
+comatous
+comatula
+comatulid
+comb
+combaron
+combat
+combatable
+combatant
+combater
+combative
+combatively
+combativeness
+combativity
+combed
+comber
+combfish
+combflower
+combinable
+combinableness
+combinant
+combinantive
+combinate
+combination
+combinational
+combinative
+combinator
+combinatorial
+combinatory
+combine
+combined
+combinedly
+combinedness
+combinement
+combiner
+combing
+combining
+comble
+combless
+comblessness
+combmaker
+combmaking
+comboloio
+comboy
+Combretaceae
+combretaceous
+Combretum
+combure
+comburendo
+comburent
+comburgess
+comburimeter
+comburimetry
+comburivorous
+combust
+combustibility
+combustible
+combustibleness
+combustibly
+combustion
+combustive
+combustor
+combwise
+combwright
+comby
+come
+comeback
+Comecrudo
+comedial
+comedian
+comediant
+comedic
+comedical
+comedienne
+comedietta
+comedist
+comedo
+comedown
+comedy
+comelily
+comeliness
+comeling
+comely
+comendite
+comenic
+comephorous
+comer
+comes
+comestible
+comet
+cometarium
+cometary
+comether
+cometic
+cometical
+cometlike
+cometographer
+cometographical
+cometography
+cometoid
+cometology
+cometwise
+comeuppance
+comfit
+comfiture
+comfort
+comfortable
+comfortableness
+comfortably
+comforter
+comfortful
+comforting
+comfortingly
+comfortless
+comfortlessly
+comfortlessness
+comfortress
+comfortroot
+comfrey
+comfy
+Comiakin
+comic
+comical
+comicality
+comically
+comicalness
+comicocratic
+comicocynical
+comicodidactic
+comicography
+comicoprosaic
+comicotragedy
+comicotragic
+comicotragical
+comicry
+Comid
+comiferous
+Cominform
+coming
+comingle
+comino
+Comintern
+comism
+comital
+comitant
+comitatensian
+comitative
+comitatus
+comitia
+comitial
+Comitium
+comitragedy
+comity
+comma
+command
+commandable
+commandant
+commandedness
+commandeer
+commander
+commandership
+commandery
+commanding
+commandingly
+commandingness
+commandless
+commandment
+commando
+commandoman
+commandress
+commassation
+commassee
+commatic
+commation
+commatism
+commeasurable
+commeasure
+commeddle
+Commelina
+Commelinaceae
+commelinaceous
+commemorable
+commemorate
+commemoration
+commemorational
+commemorative
+commemoratively
+commemorativeness
+commemorator
+commemoratory
+commemorize
+commence
+commenceable
+commencement
+commencer
+commend
+commendable
+commendableness
+commendably
+commendador
+commendam
+commendatary
+commendation
+commendator
+commendatory
+commender
+commendingly
+commendment
+commensal
+commensalism
+commensalist
+commensalistic
+commensality
+commensally
+commensurability
+commensurable
+commensurableness
+commensurably
+commensurate
+commensurately
+commensurateness
+commensuration
+comment
+commentarial
+commentarialism
+commentary
+commentate
+commentation
+commentator
+commentatorial
+commentatorially
+commentatorship
+commenter
+commerce
+commerceless
+commercer
+commerciable
+commercial
+commercialism
+commercialist
+commercialistic
+commerciality
+commercialization
+commercialize
+commercially
+commercium
+commerge
+commie
+comminate
+commination
+comminative
+comminator
+comminatory
+commingle
+comminglement
+commingler
+comminister
+comminuate
+comminute
+comminution
+comminutor
+Commiphora
+commiserable
+commiserate
+commiseratingly
+commiseration
+commiserative
+commiseratively
+commiserator
+commissar
+commissarial
+commissariat
+commissary
+commissaryship
+commission
+commissionaire
+commissional
+commissionate
+commissioner
+commissionership
+commissionship
+commissive
+commissively
+commissural
+commissure
+commissurotomy
+commit
+commitment
+committable
+committal
+committee
+committeeism
+committeeman
+committeeship
+committeewoman
+committent
+committer
+committible
+committor
+commix
+commixt
+commixtion
+commixture
+commodatary
+commodate
+commodation
+commodatum
+commode
+commodious
+commodiously
+commodiousness
+commoditable
+commodity
+commodore
+common
+commonable
+commonage
+commonality
+commonalty
+commoner
+commonership
+commoney
+commonish
+commonition
+commonize
+commonly
+commonness
+commonplace
+commonplaceism
+commonplacely
+commonplaceness
+commonplacer
+commons
+commonsensible
+commonsensibly
+commonsensical
+commonsensically
+commonty
+commonweal
+commonwealth
+commonwealthism
+commorancy
+commorant
+commorient
+commorth
+commot
+commotion
+commotional
+commotive
+commove
+communa
+communal
+communalism
+communalist
+communalistic
+communality
+communalization
+communalize
+communalizer
+communally
+communard
+commune
+communer
+communicability
+communicable
+communicableness
+communicably
+communicant
+communicate
+communicatee
+communicating
+communication
+communicative
+communicatively
+communicativeness
+communicator
+communicatory
+communion
+communionist
+communique
+communism
+communist
+communistery
+communistic
+communistically
+communital
+communitarian
+communitary
+communitive
+communitorium
+community
+communization
+communize
+commutability
+commutable
+commutableness
+commutant
+commutate
+commutation
+commutative
+commutatively
+commutator
+commute
+commuter
+commuting
+commutual
+commutuality
+Comnenian
+comoid
+comolecule
+comortgagee
+comose
+comourn
+comourner
+comournful
+comous
+Comox
+compact
+compacted
+compactedly
+compactedness
+compacter
+compactible
+compaction
+compactly
+compactness
+compactor
+compacture
+compages
+compaginate
+compagination
+companator
+companion
+companionability
+companionable
+companionableness
+companionably
+companionage
+companionate
+companionize
+companionless
+companionship
+companionway
+company
+comparability
+comparable
+comparableness
+comparably
+comparascope
+comparate
+comparatival
+comparative
+comparatively
+comparativeness
+comparativist
+comparator
+compare
+comparer
+comparison
+comparition
+comparograph
+compart
+compartition
+compartment
+compartmental
+compartmentalization
+compartmentalize
+compartmentally
+compartmentize
+compass
+compassable
+compasser
+compasses
+compassing
+compassion
+compassionable
+compassionate
+compassionately
+compassionateness
+compassionless
+compassive
+compassivity
+compassless
+compaternity
+compatibility
+compatible
+compatibleness
+compatibly
+compatriot
+compatriotic
+compatriotism
+compear
+compearance
+compearant
+compeer
+compel
+compellable
+compellably
+compellation
+compellative
+compellent
+compeller
+compelling
+compellingly
+compend
+compendency
+compendent
+compendia
+compendiary
+compendiate
+compendious
+compendiously
+compendiousness
+compendium
+compenetrate
+compenetration
+compensable
+compensate
+compensating
+compensatingly
+compensation
+compensational
+compensative
+compensativeness
+compensator
+compensatory
+compense
+compenser
+compesce
+compete
+competence
+competency
+competent
+competently
+competentness
+competition
+competitioner
+competitive
+competitively
+competitiveness
+competitor
+competitorship
+competitory
+competitress
+competitrix
+compilation
+compilator
+compilatory
+compile
+compilement
+compiler
+compital
+Compitalia
+compitum
+complacence
+complacency
+complacent
+complacential
+complacentially
+complacently
+complain
+complainable
+complainant
+complainer
+complainingly
+complainingness
+complaint
+complaintive
+complaintiveness
+complaisance
+complaisant
+complaisantly
+complaisantness
+complanar
+complanate
+complanation
+complect
+complected
+complement
+complemental
+complementally
+complementalness
+complementariness
+complementarism
+complementary
+complementation
+complementative
+complementer
+complementoid
+complete
+completedness
+completely
+completement
+completeness
+completer
+completion
+completive
+completively
+completory
+complex
+complexedness
+complexification
+complexify
+complexion
+complexionably
+complexional
+complexionally
+complexioned
+complexionist
+complexionless
+complexity
+complexively
+complexly
+complexness
+complexus
+compliable
+compliableness
+compliably
+compliance
+compliancy
+compliant
+compliantly
+complicacy
+complicant
+complicate
+complicated
+complicatedly
+complicatedness
+complication
+complicative
+complice
+complicitous
+complicity
+complier
+compliment
+complimentable
+complimental
+complimentally
+complimentalness
+complimentarily
+complimentariness
+complimentary
+complimentation
+complimentative
+complimenter
+complimentingly
+complin
+complot
+complotter
+Complutensian
+compluvium
+comply
+compo
+compoer
+compole
+compone
+componed
+componency
+componendo
+component
+componental
+componented
+compony
+comport
+comportment
+compos
+compose
+composed
+composedly
+composedness
+composer
+composita
+Compositae
+composite
+compositely
+compositeness
+composition
+compositional
+compositionally
+compositive
+compositively
+compositor
+compositorial
+compositous
+composograph
+compossibility
+compossible
+compost
+composture
+composure
+compotation
+compotationship
+compotator
+compotatory
+compote
+compotor
+compound
+compoundable
+compoundedness
+compounder
+compounding
+compoundness
+comprachico
+comprador
+comprecation
+compreg
+compregnate
+comprehend
+comprehender
+comprehendible
+comprehendingly
+comprehense
+comprehensibility
+comprehensible
+comprehensibleness
+comprehensibly
+comprehension
+comprehensive
+comprehensively
+comprehensiveness
+comprehensor
+compresbyter
+compresbyterial
+compresence
+compresent
+compress
+compressed
+compressedly
+compressibility
+compressible
+compressibleness
+compressingly
+compression
+compressional
+compressive
+compressively
+compressometer
+compressor
+compressure
+comprest
+compriest
+comprisable
+comprisal
+comprise
+comprised
+compromise
+compromiser
+compromising
+compromisingly
+compromissary
+compromission
+compromissorial
+compromit
+compromitment
+comprovincial
+Compsilura
+Compsoa
+Compsognathus
+Compsothlypidae
+compter
+Comptometer
+Comptonia
+comptroller
+comptrollership
+compulsative
+compulsatively
+compulsatorily
+compulsatory
+compulsed
+compulsion
+compulsitor
+compulsive
+compulsively
+compulsiveness
+compulsorily
+compulsoriness
+compulsory
+compunction
+compunctionary
+compunctionless
+compunctious
+compunctiously
+compunctive
+compurgation
+compurgator
+compurgatorial
+compurgatory
+compursion
+computability
+computable
+computably
+computation
+computational
+computative
+computativeness
+compute
+computer
+computist
+computus
+comrade
+comradely
+comradery
+comradeship
+Comsomol
+comstockery
+Comtian
+Comtism
+Comtist
+comurmurer
+Comus
+con
+conacaste
+conacre
+conal
+conalbumin
+conamed
+Conant
+conarial
+conarium
+conation
+conational
+conationalistic
+conative
+conatus
+conaxial
+concamerate
+concamerated
+concameration
+concanavalin
+concaptive
+concassation
+concatenary
+concatenate
+concatenation
+concatenator
+concausal
+concause
+concavation
+concave
+concavely
+concaveness
+concaver
+concavity
+conceal
+concealable
+concealed
+concealedly
+concealedness
+concealer
+concealment
+concede
+conceded
+concededly
+conceder
+conceit
+conceited
+conceitedly
+conceitedness
+conceitless
+conceity
+conceivability
+conceivable
+conceivableness
+conceivably
+conceive
+conceiver
+concelebrate
+concelebration
+concent
+concenter
+concentive
+concentralization
+concentrate
+concentrated
+concentration
+concentrative
+concentrativeness
+concentrator
+concentric
+concentrically
+concentricity
+concentual
+concentus
+concept
+conceptacle
+conceptacular
+conceptaculum
+conception
+conceptional
+conceptionist
+conceptism
+conceptive
+conceptiveness
+conceptual
+conceptualism
+conceptualist
+conceptualistic
+conceptuality
+conceptualization
+conceptualize
+conceptually
+conceptus
+concern
+concerned
+concernedly
+concernedness
+concerning
+concerningly
+concerningness
+concernment
+concert
+concerted
+concertedly
+concertgoer
+concertina
+concertinist
+concertist
+concertize
+concertizer
+concertmaster
+concertmeister
+concertment
+concerto
+concertstuck
+concessible
+concession
+concessionaire
+concessional
+concessionary
+concessioner
+concessionist
+concessive
+concessively
+concessiveness
+concessor
+concettism
+concettist
+conch
+concha
+conchal
+conchate
+conche
+conched
+concher
+Conchifera
+conchiferous
+conchiform
+conchinine
+conchiolin
+conchitic
+conchitis
+Conchobor
+conchoid
+conchoidal
+conchoidally
+conchological
+conchologically
+conchologist
+conchologize
+conchology
+conchometer
+conchometry
+Conchostraca
+conchotome
+Conchubar
+Conchucu
+conchuela
+conchy
+conchyliated
+conchyliferous
+conchylium
+concierge
+concile
+conciliable
+conciliabule
+conciliabulum
+conciliar
+conciliate
+conciliating
+conciliatingly
+conciliation
+conciliationist
+conciliative
+conciliator
+conciliatorily
+conciliatoriness
+conciliatory
+concilium
+concinnity
+concinnous
+concionator
+concipiency
+concipient
+concise
+concisely
+conciseness
+concision
+conclamant
+conclamation
+conclave
+conclavist
+concludable
+conclude
+concluder
+concluding
+concludingly
+conclusion
+conclusional
+conclusionally
+conclusive
+conclusively
+conclusiveness
+conclusory
+concoagulate
+concoagulation
+concoct
+concocter
+concoction
+concoctive
+concoctor
+concolor
+concolorous
+concomitance
+concomitancy
+concomitant
+concomitantly
+conconscious
+Concord
+concord
+concordal
+concordance
+concordancer
+concordant
+concordantial
+concordantly
+concordat
+concordatory
+concorder
+concordial
+concordist
+concordity
+concorporate
+Concorrezanes
+concourse
+concreate
+concremation
+concrement
+concresce
+concrescence
+concrescible
+concrescive
+concrete
+concretely
+concreteness
+concreter
+concretion
+concretional
+concretionary
+concretism
+concretive
+concretively
+concretize
+concretor
+concubinage
+concubinal
+concubinarian
+concubinary
+concubinate
+concubine
+concubinehood
+concubitancy
+concubitant
+concubitous
+concubitus
+concupiscence
+concupiscent
+concupiscible
+concupiscibleness
+concupy
+concur
+concurrence
+concurrency
+concurrent
+concurrently
+concurrentness
+concurring
+concurringly
+concursion
+concurso
+concursus
+concuss
+concussant
+concussion
+concussional
+concussive
+concutient
+concyclic
+concyclically
+cond
+Condalia
+condemn
+condemnable
+condemnably
+condemnate
+condemnation
+condemnatory
+condemned
+condemner
+condemning
+condemningly
+condensability
+condensable
+condensance
+condensary
+condensate
+condensation
+condensational
+condensative
+condensator
+condense
+condensed
+condensedly
+condensedness
+condenser
+condensery
+condensity
+condescend
+condescendence
+condescendent
+condescender
+condescending
+condescendingly
+condescendingness
+condescension
+condescensive
+condescensively
+condescensiveness
+condiction
+condictious
+condiddle
+condiddlement
+condign
+condigness
+condignity
+condignly
+condiment
+condimental
+condimentary
+condisciple
+condistillation
+condite
+condition
+conditional
+conditionalism
+conditionalist
+conditionality
+conditionalize
+conditionally
+conditionate
+conditioned
+conditioner
+condivision
+condolatory
+condole
+condolement
+condolence
+condolent
+condoler
+condoling
+condolingly
+condominate
+condominium
+condonable
+condonance
+condonation
+condonative
+condone
+condonement
+condoner
+condor
+conduce
+conducer
+conducing
+conducingly
+conducive
+conduciveness
+conduct
+conductance
+conductibility
+conductible
+conductility
+conductimeter
+conductio
+conduction
+conductional
+conductitious
+conductive
+conductively
+conductivity
+conductometer
+conductometric
+conductor
+conductorial
+conductorless
+conductorship
+conductory
+conductress
+conductus
+conduit
+conduplicate
+conduplicated
+conduplication
+condurangin
+condurango
+condylar
+condylarth
+Condylarthra
+condylarthrosis
+condylarthrous
+condyle
+condylectomy
+condylion
+condyloid
+condyloma
+condylomatous
+condylome
+condylopod
+Condylopoda
+condylopodous
+condylos
+condylotomy
+Condylura
+condylure
+cone
+coned
+coneen
+coneflower
+conehead
+coneighboring
+coneine
+conelet
+conemaker
+conemaking
+Conemaugh
+conenose
+conepate
+coner
+cones
+conessine
+Conestoga
+confab
+confabular
+confabulate
+confabulation
+confabulator
+confabulatory
+confact
+confarreate
+confarreation
+confated
+confect
+confection
+confectionary
+confectioner
+confectionery
+Confed
+confederacy
+confederal
+confederalist
+confederate
+confederater
+confederatio
+confederation
+confederationist
+confederatism
+confederative
+confederatize
+confederator
+confelicity
+conferee
+conference
+conferential
+conferment
+conferrable
+conferral
+conferrer
+conferruminate
+conferted
+Conferva
+Confervaceae
+confervaceous
+conferval
+Confervales
+confervoid
+Confervoideae
+confervous
+confess
+confessable
+confessant
+confessarius
+confessary
+confessedly
+confesser
+confessing
+confessingly
+confession
+confessional
+confessionalian
+confessionalism
+confessionalist
+confessionary
+confessionist
+confessor
+confessorship
+confessory
+confidant
+confide
+confidence
+confidency
+confident
+confidential
+confidentiality
+confidentially
+confidentialness
+confidentiary
+confidently
+confidentness
+confider
+confiding
+confidingly
+confidingness
+configural
+configurate
+configuration
+configurational
+configurationally
+configurationism
+configurationist
+configurative
+configure
+confinable
+confine
+confineable
+confined
+confinedly
+confinedness
+confineless
+confinement
+confiner
+confining
+confinity
+confirm
+confirmable
+confirmand
+confirmation
+confirmative
+confirmatively
+confirmatorily
+confirmatory
+confirmed
+confirmedly
+confirmedness
+confirmee
+confirmer
+confirming
+confirmingly
+confirmity
+confirmment
+confirmor
+confiscable
+confiscatable
+confiscate
+confiscation
+confiscator
+confiscatory
+confitent
+confiteor
+confiture
+confix
+conflagrant
+conflagrate
+conflagration
+conflagrative
+conflagrator
+conflagratory
+conflate
+conflated
+conflation
+conflict
+conflicting
+conflictingly
+confliction
+conflictive
+conflictory
+conflow
+confluence
+confluent
+confluently
+conflux
+confluxibility
+confluxible
+confluxibleness
+confocal
+conform
+conformability
+conformable
+conformableness
+conformably
+conformal
+conformance
+conformant
+conformate
+conformation
+conformator
+conformer
+conformist
+conformity
+confound
+confoundable
+confounded
+confoundedly
+confoundedness
+confounder
+confounding
+confoundingly
+confrater
+confraternal
+confraternity
+confraternization
+confrere
+confriar
+confrication
+confront
+confrontal
+confrontation
+confronte
+confronter
+confrontment
+Confucian
+Confucianism
+Confucianist
+confusability
+confusable
+confusably
+confuse
+confused
+confusedly
+confusedness
+confusingly
+confusion
+confusional
+confusticate
+confustication
+confutable
+confutation
+confutative
+confutator
+confute
+confuter
+conga
+congeable
+congeal
+congealability
+congealable
+congealableness
+congealedness
+congealer
+congealment
+congee
+congelation
+congelative
+congelifraction
+congeliturbate
+congeliturbation
+congener
+congeneracy
+congeneric
+congenerical
+congenerous
+congenerousness
+congenetic
+congenial
+congeniality
+congenialize
+congenially
+congenialness
+congenital
+congenitally
+congenitalness
+conger
+congeree
+congest
+congested
+congestible
+congestion
+congestive
+congiary
+congius
+conglobate
+conglobately
+conglobation
+conglobe
+conglobulate
+conglomerate
+conglomeratic
+conglomeration
+conglutin
+conglutinant
+conglutinate
+conglutination
+conglutinative
+Congo
+Congoese
+Congolese
+Congoleum
+congou
+congratulable
+congratulant
+congratulate
+congratulation
+congratulational
+congratulator
+congratulatory
+congredient
+congreet
+congregable
+congreganist
+congregant
+congregate
+congregation
+congregational
+congregationalism
+Congregationalist
+congregationalize
+congregationally
+Congregationer
+congregationist
+congregative
+congregativeness
+congregator
+Congreso
+congress
+congresser
+congressional
+congressionalist
+congressionally
+congressionist
+congressist
+congressive
+congressman
+Congresso
+congresswoman
+Congreve
+Congridae
+congroid
+congruence
+congruency
+congruent
+congruential
+congruently
+congruism
+congruist
+congruistic
+congruity
+congruous
+congruously
+congruousness
+conhydrine
+Coniacian
+conic
+conical
+conicality
+conically
+conicalness
+coniceine
+conichalcite
+conicine
+conicity
+conicle
+conicoid
+conicopoly
+conics
+Conidae
+conidia
+conidial
+conidian
+conidiiferous
+conidioid
+conidiophore
+conidiophorous
+conidiospore
+conidium
+conifer
+Coniferae
+coniferin
+coniferophyte
+coniferous
+conification
+coniform
+Conilurus
+conima
+conimene
+conin
+conine
+Coniogramme
+Coniophora
+Coniopterygidae
+Conioselinum
+coniosis
+Coniothyrium
+coniroster
+conirostral
+Conirostres
+Conium
+conject
+conjective
+conjecturable
+conjecturably
+conjectural
+conjecturalist
+conjecturality
+conjecturally
+conjecture
+conjecturer
+conjobble
+conjoin
+conjoined
+conjoinedly
+conjoiner
+conjoint
+conjointly
+conjointment
+conjointness
+conjubilant
+conjugable
+conjugacy
+conjugal
+Conjugales
+conjugality
+conjugally
+conjugant
+conjugata
+Conjugatae
+conjugate
+conjugated
+conjugately
+conjugateness
+conjugation
+conjugational
+conjugationally
+conjugative
+conjugator
+conjugial
+conjugium
+conjunct
+conjunction
+conjunctional
+conjunctionally
+conjunctiva
+conjunctival
+conjunctive
+conjunctively
+conjunctiveness
+conjunctivitis
+conjunctly
+conjunctur
+conjunctural
+conjuncture
+conjuration
+conjurator
+conjure
+conjurement
+conjurer
+conjurership
+conjuror
+conjury
+conk
+conkanee
+conker
+conkers
+conky
+conn
+connach
+Connaraceae
+connaraceous
+connarite
+Connarus
+connascency
+connascent
+connatal
+connate
+connately
+connateness
+connation
+connatural
+connaturality
+connaturalize
+connaturally
+connaturalness
+connature
+connaught
+connect
+connectable
+connectant
+connected
+connectedly
+connectedness
+connectible
+connection
+connectional
+connectival
+connective
+connectively
+connectivity
+connector
+connellite
+conner
+connex
+connexion
+connexionalism
+connexity
+connexive
+connexivum
+connexus
+Connie
+conning
+conniption
+connivance
+connivancy
+connivant
+connivantly
+connive
+connivent
+conniver
+Connochaetes
+connoissance
+connoisseur
+connoisseurship
+connotation
+connotative
+connotatively
+connote
+connotive
+connotively
+connubial
+connubiality
+connubially
+connubiate
+connubium
+connumerate
+connumeration
+Conocarpus
+Conocephalum
+Conocephalus
+conoclinium
+conocuneus
+conodont
+conoid
+conoidal
+conoidally
+conoidic
+conoidical
+conoidically
+Conolophus
+conominee
+cononintelligent
+Conopholis
+conopid
+Conopidae
+conoplain
+conopodium
+Conopophaga
+Conopophagidae
+Conor
+Conorhinus
+conormal
+conoscope
+conourish
+Conoy
+conphaseolin
+conplane
+conquedle
+conquer
+conquerable
+conquerableness
+conqueress
+conquering
+conqueringly
+conquerment
+conqueror
+conquest
+conquian
+conquinamine
+conquinine
+conquistador
+Conrad
+conrector
+conrectorship
+conred
+Conringia
+consanguine
+consanguineal
+consanguinean
+consanguineous
+consanguineously
+consanguinity
+conscience
+conscienceless
+consciencelessly
+consciencelessness
+consciencewise
+conscient
+conscientious
+conscientiously
+conscientiousness
+conscionable
+conscionableness
+conscionably
+conscious
+consciously
+consciousness
+conscribe
+conscript
+conscription
+conscriptional
+conscriptionist
+conscriptive
+consecrate
+consecrated
+consecratedness
+consecrater
+consecration
+consecrative
+consecrator
+consecratory
+consectary
+consecute
+consecution
+consecutive
+consecutively
+consecutiveness
+consecutives
+consenescence
+consenescency
+consension
+consensual
+consensually
+consensus
+consent
+consentable
+consentaneity
+consentaneous
+consentaneously
+consentaneousness
+consentant
+consenter
+consentful
+consentfully
+consentience
+consentient
+consentiently
+consenting
+consentingly
+consentingness
+consentive
+consentively
+consentment
+consequence
+consequency
+consequent
+consequential
+consequentiality
+consequentially
+consequentialness
+consequently
+consertal
+conservable
+conservacy
+conservancy
+conservant
+conservate
+conservation
+conservational
+conservationist
+conservatism
+conservatist
+conservative
+conservatively
+conservativeness
+conservatize
+conservatoire
+conservator
+conservatorio
+conservatorium
+conservatorship
+conservatory
+conservatrix
+conserve
+conserver
+consider
+considerability
+considerable
+considerableness
+considerably
+considerance
+considerate
+considerately
+considerateness
+consideration
+considerative
+consideratively
+considerativeness
+considerator
+considered
+considerer
+considering
+consideringly
+consign
+consignable
+consignatary
+consignation
+consignatory
+consignee
+consigneeship
+consigner
+consignificant
+consignificate
+consignification
+consignificative
+consignificator
+consignify
+consignment
+consignor
+consiliary
+consilience
+consilient
+consimilar
+consimilarity
+consimilate
+consist
+consistence
+consistency
+consistent
+consistently
+consistorial
+consistorian
+consistory
+consociate
+consociation
+consociational
+consociationism
+consociative
+consocies
+consol
+consolable
+consolableness
+consolably
+Consolamentum
+consolation
+Consolato
+consolatorily
+consolatoriness
+consolatory
+consolatrix
+console
+consolement
+consoler
+consolidant
+consolidate
+consolidated
+consolidation
+consolidationist
+consolidative
+consolidator
+consoling
+consolingly
+consolute
+consomme
+consonance
+consonancy
+consonant
+consonantal
+consonantic
+consonantism
+consonantize
+consonantly
+consonantness
+consonate
+consonous
+consort
+consortable
+consorter
+consortial
+consortion
+consortism
+consortium
+consortship
+consound
+conspecies
+conspecific
+conspectus
+consperse
+conspersion
+conspicuity
+conspicuous
+conspicuously
+conspicuousness
+conspiracy
+conspirant
+conspiration
+conspirative
+conspirator
+conspiratorial
+conspiratorially
+conspiratory
+conspiratress
+conspire
+conspirer
+conspiring
+conspiringly
+conspue
+constable
+constablery
+constableship
+constabless
+constablewick
+constabular
+constabulary
+Constance
+constancy
+constant
+constantan
+Constantine
+Constantinian
+Constantinopolitan
+constantly
+constantness
+constat
+constatation
+constate
+constatory
+constellate
+constellation
+constellatory
+consternate
+consternation
+constipate
+constipation
+constituency
+constituent
+constituently
+constitute
+constituter
+constitution
+constitutional
+constitutionalism
+constitutionalist
+constitutionality
+constitutionalization
+constitutionalize
+constitutionally
+constitutionary
+constitutioner
+constitutionist
+constitutive
+constitutively
+constitutiveness
+constitutor
+constrain
+constrainable
+constrained
+constrainedly
+constrainedness
+constrainer
+constraining
+constrainingly
+constrainment
+constraint
+constrict
+constricted
+constriction
+constrictive
+constrictor
+constringe
+constringency
+constringent
+construability
+construable
+construct
+constructer
+constructible
+construction
+constructional
+constructionally
+constructionism
+constructionist
+constructive
+constructively
+constructiveness
+constructivism
+constructivist
+constructor
+constructorship
+constructure
+construe
+construer
+constuprate
+constupration
+consubsist
+consubsistency
+consubstantial
+consubstantialism
+consubstantialist
+consubstantiality
+consubstantially
+consubstantiate
+consubstantiation
+consubstantiationist
+consubstantive
+consuete
+consuetitude
+consuetude
+consuetudinal
+consuetudinary
+consul
+consulage
+consular
+consularity
+consulary
+consulate
+consulship
+consult
+consultable
+consultant
+consultary
+consultation
+consultative
+consultatory
+consultee
+consulter
+consulting
+consultive
+consultively
+consultor
+consultory
+consumable
+consume
+consumedly
+consumeless
+consumer
+consuming
+consumingly
+consumingness
+consummate
+consummately
+consummation
+consummative
+consummatively
+consummativeness
+consummator
+consummatory
+consumpt
+consumpted
+consumptible
+consumption
+consumptional
+consumptive
+consumptively
+consumptiveness
+consumptivity
+consute
+contabescence
+contabescent
+contact
+contactor
+contactual
+contactually
+contagion
+contagioned
+contagionist
+contagiosity
+contagious
+contagiously
+contagiousness
+contagium
+contain
+containable
+container
+containment
+contakion
+contaminable
+contaminant
+contaminate
+contamination
+contaminative
+contaminator
+contaminous
+contangential
+contango
+conte
+contect
+contection
+contemn
+contemner
+contemnible
+contemnibly
+contemning
+contemningly
+contemnor
+contemper
+contemperate
+contemperature
+contemplable
+contemplamen
+contemplant
+contemplate
+contemplatingly
+contemplation
+contemplatist
+contemplative
+contemplatively
+contemplativeness
+contemplator
+contemplature
+contemporanean
+contemporaneity
+contemporaneous
+contemporaneously
+contemporaneousness
+contemporarily
+contemporariness
+contemporary
+contemporize
+contempt
+contemptful
+contemptibility
+contemptible
+contemptibleness
+contemptibly
+contemptuous
+contemptuously
+contemptuousness
+contendent
+contender
+contending
+contendingly
+contendress
+content
+contentable
+contented
+contentedly
+contentedness
+contentful
+contention
+contentional
+contentious
+contentiously
+contentiousness
+contentless
+contently
+contentment
+contentness
+contents
+conter
+conterminal
+conterminant
+contermine
+conterminous
+conterminously
+conterminousness
+contest
+contestable
+contestableness
+contestably
+contestant
+contestation
+contestee
+contester
+contestingly
+contestless
+context
+contextive
+contextual
+contextually
+contextural
+contexture
+contextured
+conticent
+contignation
+contiguity
+contiguous
+contiguously
+contiguousness
+continence
+continency
+continent
+continental
+Continentaler
+continentalism
+continentalist
+continentality
+Continentalize
+continentally
+continently
+contingence
+contingency
+contingent
+contingential
+contingentialness
+contingently
+contingentness
+continuable
+continual
+continuality
+continually
+continualness
+continuance
+continuancy
+continuando
+continuant
+continuantly
+continuate
+continuately
+continuateness
+continuation
+continuative
+continuatively
+continuativeness
+continuator
+continue
+continued
+continuedly
+continuedness
+continuer
+continuingly
+continuist
+continuity
+continuous
+continuously
+continuousness
+continuum
+contise
+contline
+conto
+contorniate
+contorsive
+contort
+Contortae
+contorted
+contortedly
+contortedness
+contortion
+contortional
+contortionate
+contortioned
+contortionist
+contortionistic
+contortive
+contour
+contourne
+contra
+contraband
+contrabandage
+contrabandery
+contrabandism
+contrabandist
+contrabandista
+contrabass
+contrabassist
+contrabasso
+contracapitalist
+contraception
+contraceptionist
+contraceptive
+contracivil
+contraclockwise
+contract
+contractable
+contractant
+contractation
+contracted
+contractedly
+contractedness
+contractee
+contracter
+contractibility
+contractible
+contractibleness
+contractibly
+contractile
+contractility
+contraction
+contractional
+contractionist
+contractive
+contractively
+contractiveness
+contractor
+contractual
+contractually
+contracture
+contractured
+contradebt
+contradict
+contradictable
+contradictedness
+contradicter
+contradiction
+contradictional
+contradictious
+contradictiously
+contradictiousness
+contradictive
+contradictively
+contradictiveness
+contradictor
+contradictorily
+contradictoriness
+contradictory
+contradiscriminate
+contradistinct
+contradistinction
+contradistinctive
+contradistinctively
+contradistinctly
+contradistinguish
+contradivide
+contrafacture
+contrafagotto
+contrafissura
+contraflexure
+contraflow
+contrafocal
+contragredience
+contragredient
+contrahent
+contrail
+contraindicate
+contraindication
+contraindicative
+contralateral
+contralto
+contramarque
+contranatural
+contrantiscion
+contraoctave
+contraparallelogram
+contraplex
+contrapolarization
+contrapone
+contraponend
+Contraposaune
+contrapose
+contraposit
+contraposita
+contraposition
+contrapositive
+contraprogressist
+contraprop
+contraproposal
+contraption
+contraptious
+contrapuntal
+contrapuntalist
+contrapuntally
+contrapuntist
+contrapunto
+contrarational
+contraregular
+contraregularity
+contraremonstrance
+contraremonstrant
+contrarevolutionary
+contrariant
+contrariantly
+contrariety
+contrarily
+contrariness
+contrarious
+contrariously
+contrariousness
+contrariwise
+contrarotation
+contrary
+contrascriptural
+contrast
+contrastable
+contrastably
+contrastedly
+contrastimulant
+contrastimulation
+contrastimulus
+contrastingly
+contrastive
+contrastively
+contrastment
+contrasty
+contrasuggestible
+contratabular
+contrate
+contratempo
+contratenor
+contravalence
+contravallation
+contravariant
+contravene
+contravener
+contravention
+contraversion
+contravindicate
+contravindication
+contrawise
+contrayerva
+contrectation
+contreface
+contrefort
+contretemps
+contributable
+contribute
+contribution
+contributional
+contributive
+contributively
+contributiveness
+contributor
+contributorial
+contributorship
+contributory
+contrite
+contritely
+contriteness
+contrition
+contriturate
+contrivance
+contrivancy
+contrive
+contrivement
+contriver
+control
+controllability
+controllable
+controllableness
+controllably
+controller
+controllership
+controlless
+controllingly
+controlment
+controversial
+controversialism
+controversialist
+controversialize
+controversially
+controversion
+controversional
+controversionalism
+controversionalist
+controversy
+controvert
+controverter
+controvertible
+controvertibly
+controvertist
+contubernal
+contubernial
+contubernium
+contumacious
+contumaciously
+contumaciousness
+contumacity
+contumacy
+contumelious
+contumeliously
+contumeliousness
+contumely
+contund
+conturbation
+contuse
+contusion
+contusioned
+contusive
+conubium
+Conularia
+conumerary
+conumerous
+conundrum
+conundrumize
+conurbation
+conure
+Conuropsis
+Conurus
+conus
+conusable
+conusance
+conusant
+conusee
+conusor
+conutrition
+conuzee
+conuzor
+convalesce
+convalescence
+convalescency
+convalescent
+convalescently
+convallamarin
+Convallaria
+Convallariaceae
+convallariaceous
+convallarin
+convect
+convection
+convectional
+convective
+convectively
+convector
+convenable
+convenably
+convene
+convenee
+convener
+convenership
+convenience
+conveniency
+convenient
+conveniently
+convenientness
+convent
+conventical
+conventically
+conventicle
+conventicler
+conventicular
+convention
+conventional
+conventionalism
+conventionalist
+conventionality
+conventionalization
+conventionalize
+conventionally
+conventionary
+conventioner
+conventionism
+conventionist
+conventionize
+conventual
+conventually
+converge
+convergement
+convergence
+convergency
+convergent
+convergescence
+converging
+conversable
+conversableness
+conversably
+conversance
+conversancy
+conversant
+conversantly
+conversation
+conversationable
+conversational
+conversationalist
+conversationally
+conversationism
+conversationist
+conversationize
+conversative
+converse
+conversely
+converser
+conversibility
+conversible
+conversion
+conversional
+conversionism
+conversionist
+conversive
+convert
+converted
+convertend
+converter
+convertibility
+convertible
+convertibleness
+convertibly
+converting
+convertingness
+convertise
+convertism
+convertite
+convertive
+convertor
+conveth
+convex
+convexed
+convexedly
+convexedness
+convexity
+convexly
+convexness
+convey
+conveyable
+conveyal
+conveyance
+conveyancer
+conveyancing
+conveyer
+convict
+convictable
+conviction
+convictional
+convictism
+convictive
+convictively
+convictiveness
+convictment
+convictor
+convince
+convinced
+convincedly
+convincedness
+convincement
+convincer
+convincibility
+convincible
+convincing
+convincingly
+convincingness
+convival
+convive
+convivial
+convivialist
+conviviality
+convivialize
+convivially
+convocant
+convocate
+convocation
+convocational
+convocationally
+convocationist
+convocative
+convocator
+convoke
+convoker
+Convoluta
+convolute
+convoluted
+convolutely
+convolution
+convolutional
+convolutionary
+convolutive
+convolve
+convolvement
+Convolvulaceae
+convolvulaceous
+convolvulad
+convolvuli
+convolvulic
+convolvulin
+convolvulinic
+convolvulinolic
+Convolvulus
+convoy
+convulsant
+convulse
+convulsedly
+convulsibility
+convulsible
+convulsion
+convulsional
+convulsionary
+convulsionism
+convulsionist
+convulsive
+convulsively
+convulsiveness
+cony
+conycatcher
+conyrine
+coo
+cooba
+coodle
+cooee
+cooer
+coof
+Coohee
+cooing
+cooingly
+cooja
+cook
+cookable
+cookbook
+cookdom
+cookee
+cookeite
+cooker
+cookery
+cookhouse
+cooking
+cookish
+cookishly
+cookless
+cookmaid
+cookout
+cookroom
+cookshack
+cookshop
+cookstove
+cooky
+cool
+coolant
+coolen
+cooler
+coolerman
+coolheaded
+coolheadedly
+coolheadedness
+coolhouse
+coolibah
+coolie
+cooling
+coolingly
+coolingness
+coolish
+coolly
+coolness
+coolth
+coolung
+coolweed
+coolwort
+cooly
+coom
+coomb
+coomy
+coon
+cooncan
+coonily
+cooniness
+coonroot
+coonskin
+coontail
+coontie
+coony
+coop
+cooper
+cooperage
+Cooperia
+coopering
+coopery
+cooree
+Coorg
+coorie
+cooruptibly
+Coos
+cooser
+coost
+Coosuc
+coot
+cooter
+cootfoot
+coothay
+cootie
+cop
+copa
+copable
+copacetic
+copaene
+copaiba
+copaibic
+Copaifera
+Copaiva
+copaivic
+copaiye
+copal
+copalche
+copalcocote
+copaliferous
+copalite
+copalm
+coparallel
+coparcenary
+coparcener
+coparceny
+coparent
+copart
+copartaker
+copartner
+copartnership
+copartnery
+coparty
+copassionate
+copastor
+copastorate
+copatain
+copatentee
+copatriot
+copatron
+copatroness
+cope
+Copehan
+copei
+Copelata
+Copelatae
+copelate
+copellidine
+copeman
+copemate
+copen
+copending
+copenetrate
+Copeognatha
+copepod
+Copepoda
+copepodan
+copepodous
+coper
+coperception
+coperiodic
+Copernican
+Copernicanism
+Copernicia
+coperta
+copesman
+copesmate
+copestone
+copetitioner
+cophasal
+Cophetua
+cophosis
+copiability
+copiable
+copiapite
+copied
+copier
+copilot
+coping
+copiopia
+copiopsia
+copiosity
+copious
+copiously
+copiousness
+copis
+copist
+copita
+coplaintiff
+coplanar
+coplanarity
+copleased
+coplotter
+coploughing
+coplowing
+copolar
+copolymer
+copolymerization
+copolymerize
+coppaelite
+copped
+copper
+copperas
+copperbottom
+copperer
+copperhead
+copperheadism
+coppering
+copperish
+copperization
+copperize
+copperleaf
+coppernose
+coppernosed
+copperplate
+copperproof
+coppersidesman
+copperskin
+coppersmith
+coppersmithing
+copperware
+copperwing
+copperworks
+coppery
+copperytailed
+coppet
+coppice
+coppiced
+coppicing
+coppin
+copping
+copple
+copplecrown
+coppled
+coppy
+copr
+copra
+coprecipitate
+coprecipitation
+copremia
+copremic
+copresbyter
+copresence
+copresent
+Coprides
+Coprinae
+coprincipal
+coprincipate
+Coprinus
+coprisoner
+coprodaeum
+coproduce
+coproducer
+coprojector
+coprolagnia
+coprolagnist
+coprolalia
+coprolaliac
+coprolite
+coprolith
+coprolitic
+coprology
+copromisor
+copromoter
+coprophagan
+coprophagia
+coprophagist
+coprophagous
+coprophagy
+coprophilia
+coprophiliac
+coprophilic
+coprophilism
+coprophilous
+coprophyte
+coproprietor
+coproprietorship
+coprose
+Coprosma
+coprostasis
+coprosterol
+coprozoic
+copse
+copsewood
+copsewooded
+copsing
+copsy
+Copt
+copter
+Coptic
+Coptis
+copula
+copulable
+copular
+copularium
+copulate
+copulation
+copulative
+copulatively
+copulatory
+copunctal
+copurchaser
+copus
+copy
+copybook
+copycat
+copygraph
+copygraphed
+copyhold
+copyholder
+copyholding
+copyism
+copyist
+copyman
+copyreader
+copyright
+copyrightable
+copyrighter
+copywise
+coque
+coquecigrue
+coquelicot
+coqueluche
+coquet
+coquetoon
+coquetry
+coquette
+coquettish
+coquettishly
+coquettishness
+coquicken
+coquilla
+Coquille
+coquille
+coquimbite
+coquina
+coquita
+Coquitlam
+coquito
+cor
+Cora
+cora
+Corabeca
+Corabecan
+corach
+Coraciae
+coracial
+Coracias
+Coracii
+Coraciidae
+coraciiform
+Coraciiformes
+coracine
+coracle
+coracler
+coracoacromial
+coracobrachial
+coracobrachialis
+coracoclavicular
+coracocostal
+coracohumeral
+coracohyoid
+coracoid
+coracoidal
+coracomandibular
+coracomorph
+Coracomorphae
+coracomorphic
+coracopectoral
+coracoprocoracoid
+coracoradialis
+coracoscapular
+coracovertebral
+coradical
+coradicate
+corah
+coraise
+coral
+coralberry
+coralbush
+coraled
+coralflower
+coralist
+corallet
+Corallian
+corallic
+Corallidae
+corallidomous
+coralliferous
+coralliform
+Coralligena
+coralligenous
+coralligerous
+corallike
+Corallina
+Corallinaceae
+corallinaceous
+coralline
+corallite
+Corallium
+coralloid
+coralloidal
+Corallorhiza
+corallum
+Corallus
+coralroot
+coralwort
+coram
+Corambis
+coranto
+corban
+corbeau
+corbeil
+corbel
+corbeling
+corbicula
+corbiculate
+corbiculum
+corbie
+corbiestep
+corbovinum
+corbula
+corcass
+Corchorus
+corcir
+corcopali
+Corcyraean
+cord
+cordage
+Cordaitaceae
+cordaitaceous
+cordaitalean
+Cordaitales
+cordaitean
+Cordaites
+cordant
+cordate
+cordately
+cordax
+Cordeau
+corded
+cordel
+Cordelia
+Cordelier
+cordeliere
+cordelle
+corder
+Cordery
+cordewane
+Cordia
+cordial
+cordiality
+cordialize
+cordially
+cordialness
+cordiceps
+cordicole
+cordierite
+cordies
+cordiform
+cordigeri
+cordillera
+cordilleran
+cordiner
+cording
+cordite
+corditis
+cordleaf
+cordmaker
+cordoba
+cordon
+cordonnet
+Cordovan
+Cordula
+corduroy
+corduroyed
+cordwain
+cordwainer
+cordwainery
+cordwood
+cordy
+Cordyceps
+cordyl
+Cordylanthus
+Cordyline
+core
+corebel
+coreceiver
+coreciprocal
+corectome
+corectomy
+corector
+cored
+coredeem
+coredeemer
+coredemptress
+coreductase
+Coree
+coreflexed
+coregence
+coregency
+coregent
+coregnancy
+coregnant
+coregonid
+Coregonidae
+coregonine
+coregonoid
+Coregonus
+coreid
+Coreidae
+coreign
+coreigner
+corejoice
+coreless
+coreligionist
+corella
+corelysis
+Corema
+coremaker
+coremaking
+coremium
+coremorphosis
+corenounce
+coreometer
+Coreopsis
+coreplastic
+coreplasty
+corer
+coresidence
+coresidual
+coresign
+coresonant
+coresort
+corespect
+corespondency
+corespondent
+coretomy
+coreveler
+coreveller
+corevolve
+Corey
+corf
+Corfiote
+Corflambo
+corge
+corgi
+coriaceous
+corial
+coriamyrtin
+coriander
+coriandrol
+Coriandrum
+Coriaria
+Coriariaceae
+coriariaceous
+coriin
+Corimelaena
+Corimelaenidae
+Corin
+corindon
+Corineus
+coring
+Corinna
+corinne
+Corinth
+Corinthian
+Corinthianesque
+Corinthianism
+Corinthianize
+Coriolanus
+coriparian
+corium
+Corixa
+Corixidae
+cork
+corkage
+corkboard
+corke
+corked
+corker
+corkiness
+corking
+corkish
+corkite
+corkmaker
+corkmaking
+corkscrew
+corkscrewy
+corkwing
+corkwood
+corky
+corm
+Cormac
+cormel
+cormidium
+cormoid
+Cormophyta
+cormophyte
+cormophytic
+cormorant
+cormous
+cormus
+corn
+Cornaceae
+cornaceous
+cornage
+cornbell
+cornberry
+cornbin
+cornbinks
+cornbird
+cornbole
+cornbottle
+cornbrash
+corncake
+corncob
+corncracker
+corncrib
+corncrusher
+corndodger
+cornea
+corneagen
+corneal
+cornein
+corneitis
+cornel
+Cornelia
+cornelian
+Cornelius
+cornemuse
+corneocalcareous
+corneosclerotic
+corneosiliceous
+corneous
+corner
+cornerbind
+cornered
+cornerer
+cornerpiece
+cornerstone
+cornerways
+cornerwise
+cornet
+cornetcy
+cornettino
+cornettist
+corneule
+corneum
+cornfield
+cornfloor
+cornflower
+corngrower
+cornhouse
+cornhusk
+cornhusker
+cornhusking
+cornic
+cornice
+cornicle
+corniculate
+corniculer
+corniculum
+Corniferous
+cornific
+cornification
+cornified
+corniform
+cornigerous
+cornin
+corning
+corniplume
+Cornish
+Cornishman
+cornland
+cornless
+cornloft
+cornmaster
+cornmonger
+cornopean
+cornpipe
+cornrick
+cornroot
+cornstalk
+cornstarch
+cornstook
+cornu
+cornual
+cornuate
+cornuated
+cornubianite
+cornucopia
+Cornucopiae
+cornucopian
+cornucopiate
+cornule
+cornulite
+Cornulites
+cornupete
+Cornus
+cornute
+cornuted
+cornutine
+cornuto
+cornwallis
+cornwallite
+corny
+coroa
+Coroado
+corocleisis
+corodiary
+corodiastasis
+corodiastole
+corody
+corol
+corolla
+corollaceous
+corollarial
+corollarially
+corollary
+corollate
+corollated
+corolliferous
+corolliform
+corollike
+corolline
+corollitic
+corometer
+corona
+coronach
+coronad
+coronadite
+coronae
+coronagraph
+coronagraphic
+coronal
+coronale
+coronaled
+coronally
+coronamen
+coronary
+coronate
+coronated
+coronation
+coronatorial
+coroner
+coronership
+coronet
+coroneted
+coronetted
+coronetty
+coroniform
+Coronilla
+coronillin
+coronion
+coronitis
+coronium
+coronize
+coronobasilar
+coronofacial
+coronofrontal
+coronoid
+Coronopus
+coronule
+coroparelcysis
+coroplast
+coroplasta
+coroplastic
+Coropo
+coroscopy
+corotomy
+corozo
+corp
+corpora
+corporal
+corporalism
+corporality
+corporally
+corporalship
+corporas
+corporate
+corporately
+corporateness
+corporation
+corporational
+corporationer
+corporationism
+corporative
+corporator
+corporature
+corporeal
+corporealist
+corporeality
+corporealization
+corporealize
+corporeally
+corporealness
+corporeals
+corporeity
+corporeous
+corporification
+corporify
+corporosity
+corposant
+corps
+corpsbruder
+corpse
+corpsman
+corpulence
+corpulency
+corpulent
+corpulently
+corpulentness
+corpus
+corpuscle
+corpuscular
+corpuscularian
+corpuscularity
+corpusculated
+corpuscule
+corpusculous
+corpusculum
+corrade
+corradial
+corradiate
+corradiation
+corral
+corrasion
+corrasive
+Correa
+correal
+correality
+correct
+correctable
+correctant
+corrected
+correctedness
+correctible
+correcting
+correctingly
+correction
+correctional
+correctionalist
+correctioner
+correctitude
+corrective
+correctively
+correctiveness
+correctly
+correctness
+corrector
+correctorship
+correctress
+correctrice
+corregidor
+correlatable
+correlate
+correlated
+correlation
+correlational
+correlative
+correlatively
+correlativeness
+correlativism
+correlativity
+correligionist
+corrente
+correption
+corresol
+correspond
+correspondence
+correspondency
+correspondent
+correspondential
+correspondentially
+correspondently
+correspondentship
+corresponder
+corresponding
+correspondingly
+corresponsion
+corresponsive
+corresponsively
+corridor
+corridored
+corrie
+Corriedale
+corrige
+corrigenda
+corrigendum
+corrigent
+corrigibility
+corrigible
+corrigibleness
+corrigibly
+Corrigiola
+Corrigiolaceae
+corrival
+corrivality
+corrivalry
+corrivalship
+corrivate
+corrivation
+corrobboree
+corroborant
+corroborate
+corroboration
+corroborative
+corroboratively
+corroborator
+corroboratorily
+corroboratory
+corroboree
+corrode
+corrodent
+Corrodentia
+corroder
+corrodiary
+corrodibility
+corrodible
+corrodier
+corroding
+corrosibility
+corrosible
+corrosibleness
+corrosion
+corrosional
+corrosive
+corrosively
+corrosiveness
+corrosivity
+corrugate
+corrugated
+corrugation
+corrugator
+corrupt
+corrupted
+corruptedly
+corruptedness
+corrupter
+corruptful
+corruptibility
+corruptible
+corruptibleness
+corrupting
+corruptingly
+corruption
+corruptionist
+corruptive
+corruptively
+corruptly
+corruptness
+corruptor
+corruptress
+corsac
+corsage
+corsaint
+corsair
+corse
+corselet
+corsepresent
+corsesque
+corset
+corseting
+corsetless
+corsetry
+Corsican
+corsie
+corsite
+corta
+Cortaderia
+cortege
+Cortes
+cortex
+cortez
+cortical
+cortically
+corticate
+corticated
+corticating
+cortication
+cortices
+corticiferous
+corticiform
+corticifugal
+corticifugally
+corticipetal
+corticipetally
+Corticium
+corticoafferent
+corticoefferent
+corticoline
+corticopeduncular
+corticose
+corticospinal
+corticosterone
+corticostriate
+corticous
+cortin
+cortina
+cortinarious
+Cortinarius
+cortinate
+cortisone
+cortlandtite
+Corton
+coruco
+coruler
+Coruminacan
+corundophilite
+corundum
+corupay
+coruscant
+coruscate
+coruscation
+corver
+corvette
+corvetto
+Corvidae
+corviform
+corvillosum
+corvina
+Corvinae
+corvine
+corvoid
+Corvus
+Cory
+Corybant
+Corybantian
+corybantiasm
+Corybantic
+corybantic
+Corybantine
+corybantish
+corybulbin
+corybulbine
+corycavamine
+corycavidin
+corycavidine
+corycavine
+Corycia
+Corycian
+corydalin
+corydaline
+Corydalis
+corydine
+Corydon
+coryl
+Corylaceae
+corylaceous
+corylin
+Corylopsis
+Corylus
+corymb
+corymbed
+corymbiate
+corymbiated
+corymbiferous
+corymbiform
+corymbose
+corymbous
+corynebacterial
+Corynebacterium
+Coryneum
+corynine
+Corynocarpaceae
+corynocarpaceous
+Corynocarpus
+Corypha
+Coryphaena
+coryphaenid
+Coryphaenidae
+coryphaenoid
+Coryphaenoididae
+coryphaeus
+coryphee
+coryphene
+Coryphodon
+coryphodont
+coryphylly
+corytuberine
+coryza
+cos
+cosalite
+cosaque
+cosavior
+coscet
+Coscinodiscaceae
+Coscinodiscus
+coscinomancy
+coscoroba
+coseasonal
+coseat
+cosec
+cosecant
+cosech
+cosectarian
+cosectional
+cosegment
+coseism
+coseismal
+coseismic
+cosenator
+cosentiency
+cosentient
+coservant
+cosession
+coset
+cosettler
+cosh
+cosharer
+cosheath
+cosher
+cosherer
+coshering
+coshery
+cosignatory
+cosigner
+cosignitary
+cosily
+cosinage
+cosine
+cosiness
+cosingular
+cosinusoid
+Cosmati
+cosmecology
+cosmesis
+cosmetic
+cosmetical
+cosmetically
+cosmetician
+cosmetiste
+cosmetological
+cosmetologist
+cosmetology
+cosmic
+cosmical
+cosmicality
+cosmically
+cosmism
+cosmist
+cosmocracy
+cosmocrat
+cosmocratic
+cosmogenesis
+cosmogenetic
+cosmogenic
+cosmogeny
+cosmogonal
+cosmogoner
+cosmogonic
+cosmogonical
+cosmogonist
+cosmogonize
+cosmogony
+cosmographer
+cosmographic
+cosmographical
+cosmographically
+cosmographist
+cosmography
+cosmolabe
+cosmolatry
+cosmologic
+cosmological
+cosmologically
+cosmologist
+cosmology
+cosmometry
+cosmopathic
+cosmoplastic
+cosmopoietic
+cosmopolicy
+cosmopolis
+cosmopolitan
+cosmopolitanism
+cosmopolitanization
+cosmopolitanize
+cosmopolitanly
+cosmopolite
+cosmopolitic
+cosmopolitical
+cosmopolitics
+cosmopolitism
+cosmorama
+cosmoramic
+cosmorganic
+cosmos
+cosmoscope
+cosmosophy
+cosmosphere
+cosmotellurian
+cosmotheism
+cosmotheist
+cosmotheistic
+cosmothetic
+cosmotron
+cosmozoan
+cosmozoic
+cosmozoism
+cosonant
+cosounding
+cosovereign
+cosovereignty
+cospecies
+cospecific
+cosphered
+cosplendor
+cosplendour
+coss
+Cossack
+Cossaean
+cossas
+cosse
+cosset
+cossette
+cossid
+Cossidae
+cossnent
+cossyrite
+cost
+costa
+Costaea
+costal
+costalgia
+costally
+costander
+Costanoan
+costar
+costard
+Costata
+costate
+costated
+costean
+costeaning
+costectomy
+costellate
+coster
+costerdom
+costermonger
+costicartilage
+costicartilaginous
+costicervical
+costiferous
+costiform
+costing
+costipulator
+costispinal
+costive
+costively
+costiveness
+costless
+costlessness
+costliness
+costly
+costmary
+costoabdominal
+costoapical
+costocentral
+costochondral
+costoclavicular
+costocolic
+costocoracoid
+costodiaphragmatic
+costogenic
+costoinferior
+costophrenic
+costopleural
+costopneumopexy
+costopulmonary
+costoscapular
+costosternal
+costosuperior
+costothoracic
+costotome
+costotomy
+costotrachelian
+costotransversal
+costotransverse
+costovertebral
+costoxiphoid
+costraight
+costrel
+costula
+costulation
+costume
+costumer
+costumery
+costumic
+costumier
+costumiere
+costuming
+costumist
+costusroot
+cosubject
+cosubordinate
+cosuffer
+cosufferer
+cosuggestion
+cosuitor
+cosurety
+cosustain
+coswearer
+cosy
+cosymmedian
+cot
+cotangent
+cotangential
+cotarius
+cotarnine
+cotch
+cote
+coteful
+coteline
+coteller
+cotemporane
+cotemporanean
+cotemporaneous
+cotemporaneously
+cotemporary
+cotenancy
+cotenant
+cotenure
+coterell
+coterie
+coterminous
+Cotesian
+coth
+cothamore
+cothe
+cotheorist
+cothish
+cothon
+cothurn
+cothurnal
+cothurnate
+cothurned
+cothurnian
+cothurnus
+cothy
+cotidal
+cotillage
+cotillion
+Cotinga
+cotingid
+Cotingidae
+cotingoid
+Cotinus
+cotise
+cotitular
+cotland
+cotman
+coto
+cotoin
+Cotonam
+Cotoneaster
+cotonier
+cotorment
+cotoro
+cotorture
+Cotoxo
+cotquean
+cotraitor
+cotransfuse
+cotranslator
+cotranspire
+cotransubstantiate
+cotrine
+cotripper
+cotrustee
+cotset
+cotsetla
+cotsetle
+cotta
+cottabus
+cottage
+cottaged
+cottager
+cottagers
+cottagey
+cotte
+cotted
+cotter
+cotterel
+cotterite
+cotterway
+cottid
+Cottidae
+cottier
+cottierism
+cottiform
+cottoid
+cotton
+cottonade
+cottonbush
+cottonee
+cottoneer
+cottoner
+Cottonian
+cottonization
+cottonize
+cottonless
+cottonmouth
+cottonocracy
+Cottonopolis
+cottonseed
+cottontail
+cottontop
+cottonweed
+cottonwood
+cottony
+Cottus
+cotty
+cotuit
+cotula
+cotunnite
+Coturnix
+cotutor
+cotwin
+cotwinned
+cotwist
+cotyla
+cotylar
+cotyledon
+cotyledonal
+cotyledonar
+cotyledonary
+cotyledonous
+cotyliform
+cotyligerous
+cotyliscus
+cotyloid
+Cotylophora
+cotylophorous
+cotylopubic
+cotylosacral
+cotylosaur
+Cotylosauria
+cotylosaurian
+cotype
+Cotys
+Cotyttia
+couac
+coucal
+couch
+couchancy
+couchant
+couched
+couchee
+coucher
+couching
+couchmaker
+couchmaking
+couchmate
+couchy
+coude
+coudee
+coue
+Coueism
+cougar
+cough
+cougher
+coughroot
+coughweed
+coughwort
+cougnar
+coul
+could
+couldron
+coulee
+coulisse
+coulomb
+coulometer
+coulterneb
+coulure
+couma
+coumalic
+coumalin
+coumara
+coumaran
+coumarate
+coumaric
+coumarilic
+coumarin
+coumarinic
+coumarone
+coumarou
+Coumarouna
+council
+councilist
+councilman
+councilmanic
+councilor
+councilorship
+councilwoman
+counderstand
+counite
+couniversal
+counsel
+counselable
+counselee
+counselful
+counselor
+counselorship
+count
+countable
+countableness
+countably
+countdom
+countenance
+countenancer
+counter
+counterabut
+counteraccusation
+counteracquittance
+counteract
+counteractant
+counteracter
+counteracting
+counteractingly
+counteraction
+counteractive
+counteractively
+counteractivity
+counteractor
+counteraddress
+counteradvance
+counteradvantage
+counteradvice
+counteradvise
+counteraffirm
+counteraffirmation
+counteragency
+counteragent
+counteragitate
+counteragitation
+counteralliance
+counterambush
+counterannouncement
+counteranswer
+counterappeal
+counterappellant
+counterapproach
+counterapse
+counterarch
+counterargue
+counterargument
+counterartillery
+counterassertion
+counterassociation
+counterassurance
+counterattack
+counterattestation
+counterattired
+counterattraction
+counterattractive
+counterattractively
+counteraverment
+counteravouch
+counteravouchment
+counterbalance
+counterbarrage
+counterbase
+counterbattery
+counterbeating
+counterbend
+counterbewitch
+counterbid
+counterblast
+counterblow
+counterbond
+counterborder
+counterbore
+counterboycott
+counterbrace
+counterbranch
+counterbrand
+counterbreastwork
+counterbuff
+counterbuilding
+countercampaign
+countercarte
+countercause
+counterchange
+counterchanged
+countercharge
+countercharm
+countercheck
+countercheer
+counterclaim
+counterclaimant
+counterclockwise
+countercolored
+countercommand
+countercompetition
+countercomplaint
+countercompony
+countercondemnation
+counterconquest
+counterconversion
+countercouchant
+countercoupe
+countercourant
+countercraft
+countercriticism
+countercross
+countercry
+countercurrent
+countercurrently
+countercurrentwise
+counterdance
+counterdash
+counterdecision
+counterdeclaration
+counterdecree
+counterdefender
+counterdemand
+counterdemonstration
+counterdeputation
+counterdesire
+counterdevelopment
+counterdifficulty
+counterdigged
+counterdike
+counterdiscipline
+counterdisengage
+counterdisengagement
+counterdistinction
+counterdistinguish
+counterdoctrine
+counterdogmatism
+counterdraft
+counterdrain
+counterdrive
+counterearth
+counterefficiency
+countereffort
+counterembattled
+counterembowed
+counterenamel
+counterend
+counterenergy
+counterengagement
+counterengine
+counterenthusiasm
+counterentry
+counterequivalent
+counterermine
+counterespionage
+counterestablishment
+counterevidence
+counterexaggeration
+counterexcitement
+counterexcommunication
+counterexercise
+counterexplanation
+counterexposition
+counterexpostulation
+counterextend
+counterextension
+counterfact
+counterfallacy
+counterfaller
+counterfeit
+counterfeiter
+counterfeitly
+counterfeitment
+counterfeitness
+counterferment
+counterfessed
+counterfire
+counterfix
+counterflange
+counterflashing
+counterflight
+counterflory
+counterflow
+counterflux
+counterfoil
+counterforce
+counterformula
+counterfort
+counterfugue
+countergabble
+countergabion
+countergambit
+countergarrison
+countergauge
+countergauger
+countergift
+countergirded
+counterglow
+counterguard
+counterhaft
+counterhammering
+counterhypothesis
+counteridea
+counterideal
+counterimagination
+counterimitate
+counterimitation
+counterimpulse
+counterindentation
+counterindented
+counterindicate
+counterindication
+counterinfluence
+counterinsult
+counterintelligence
+counterinterest
+counterinterpretation
+counterintrigue
+counterinvective
+counterirritant
+counterirritate
+counterirritation
+counterjudging
+counterjumper
+counterlath
+counterlathing
+counterlatration
+counterlaw
+counterleague
+counterlegislation
+counterlife
+counterlocking
+counterlode
+counterlove
+counterly
+countermachination
+counterman
+countermand
+countermandable
+countermaneuver
+countermanifesto
+countermarch
+countermark
+countermarriage
+countermeasure
+countermeet
+countermessage
+countermigration
+countermine
+countermission
+countermotion
+countermount
+countermove
+countermovement
+countermure
+countermutiny
+counternaiant
+counternarrative
+counternatural
+counternecromancy
+counternoise
+counternotice
+counterobjection
+counterobligation
+counteroffensive
+counteroffer
+counteropening
+counteropponent
+counteropposite
+counterorator
+counterorder
+counterorganization
+counterpaled
+counterpaly
+counterpane
+counterpaned
+counterparadox
+counterparallel
+counterparole
+counterparry
+counterpart
+counterpassant
+counterpassion
+counterpenalty
+counterpendent
+counterpetition
+counterpicture
+counterpillar
+counterplan
+counterplay
+counterplayer
+counterplea
+counterplead
+counterpleading
+counterplease
+counterplot
+counterpoint
+counterpointe
+counterpointed
+counterpoise
+counterpoison
+counterpole
+counterponderate
+counterpose
+counterposition
+counterposting
+counterpotence
+counterpotency
+counterpotent
+counterpractice
+counterpray
+counterpreach
+counterpreparation
+counterpressure
+counterprick
+counterprinciple
+counterprocess
+counterproject
+counterpronunciamento
+counterproof
+counterpropaganda
+counterpropagandize
+counterprophet
+counterproposal
+counterproposition
+counterprotection
+counterprotest
+counterprove
+counterpull
+counterpunch
+counterpuncture
+counterpush
+counterquartered
+counterquarterly
+counterquery
+counterquestion
+counterquip
+counterradiation
+counterraid
+counterraising
+counterrampant
+counterrate
+counterreaction
+counterreason
+counterreckoning
+counterrecoil
+counterreconnaissance
+counterrefer
+counterreflected
+counterreform
+counterreformation
+counterreligion
+counterremonstrant
+counterreply
+counterreprisal
+counterresolution
+counterrestoration
+counterretreat
+counterrevolution
+counterrevolutionary
+counterrevolutionist
+counterrevolutionize
+counterriposte
+counterroll
+counterround
+counterruin
+countersale
+countersalient
+counterscale
+counterscalloped
+counterscarp
+counterscoff
+countersconce
+counterscrutiny
+countersea
+counterseal
+countersecure
+countersecurity
+counterselection
+countersense
+counterservice
+countershade
+countershaft
+countershafting
+countershear
+countershine
+countershout
+counterside
+countersiege
+countersign
+countersignal
+countersignature
+countersink
+countersleight
+counterslope
+countersmile
+countersnarl
+counterspying
+counterstain
+counterstamp
+counterstand
+counterstatant
+counterstatement
+counterstatute
+counterstep
+counterstimulate
+counterstimulation
+counterstimulus
+counterstock
+counterstratagem
+counterstream
+counterstrike
+counterstroke
+counterstruggle
+countersubject
+countersuggestion
+countersuit
+countersun
+countersunk
+countersurprise
+counterswing
+countersworn
+countersympathy
+countersynod
+countertack
+countertail
+countertally
+countertaste
+countertechnicality
+countertendency
+countertenor
+counterterm
+counterterror
+countertheme
+countertheory
+counterthought
+counterthreat
+counterthrust
+counterthwarting
+countertierce
+countertime
+countertouch
+countertraction
+countertrades
+countertransference
+countertranslation
+countertraverse
+countertreason
+countertree
+countertrench
+countertrespass
+countertrippant
+countertripping
+countertruth
+countertug
+counterturn
+counterturned
+countertype
+countervail
+countervair
+countervairy
+countervallation
+countervaunt
+countervene
+countervengeance
+countervenom
+countervibration
+counterview
+countervindication
+countervolition
+countervolley
+countervote
+counterwager
+counterwall
+counterwarmth
+counterwave
+counterweigh
+counterweight
+counterweighted
+counterwheel
+counterwill
+counterwilling
+counterwind
+counterwitness
+counterword
+counterwork
+counterworker
+counterwrite
+countess
+countfish
+counting
+countinghouse
+countless
+countor
+countrified
+countrifiedness
+country
+countryfolk
+countryman
+countrypeople
+countryseat
+countryside
+countryward
+countrywoman
+countship
+county
+coup
+coupage
+coupe
+couped
+coupee
+coupelet
+couper
+couple
+coupled
+couplement
+coupler
+coupleress
+couplet
+coupleteer
+coupling
+coupon
+couponed
+couponless
+coupstick
+coupure
+courage
+courageous
+courageously
+courageousness
+courager
+courant
+courante
+courap
+couratari
+courb
+courbache
+courbaril
+courbash
+courge
+courida
+courier
+couril
+courlan
+Cours
+course
+coursed
+courser
+coursing
+court
+courtbred
+courtcraft
+courteous
+courteously
+courteousness
+courtepy
+courter
+courtesan
+courtesanry
+courtesanship
+courtesy
+courtezanry
+courtezanship
+courthouse
+courtier
+courtierism
+courtierly
+courtiership
+courtin
+courtless
+courtlet
+courtlike
+courtliness
+courtling
+courtly
+courtman
+Courtney
+courtroom
+courtship
+courtyard
+courtzilite
+couscous
+couscousou
+couseranite
+cousin
+cousinage
+cousiness
+cousinhood
+cousinly
+cousinry
+cousinship
+cousiny
+coussinet
+coustumier
+coutel
+coutelle
+couter
+Coutet
+couth
+couthie
+couthily
+couthiness
+couthless
+coutil
+coutumier
+couvade
+couxia
+covado
+covalence
+covalent
+Covarecan
+Covarecas
+covariable
+covariance
+covariant
+covariation
+covassal
+cove
+coved
+covelline
+covellite
+covenant
+covenantal
+covenanted
+covenantee
+Covenanter
+covenanter
+covenanting
+covenantor
+covent
+coventrate
+coventrize
+Coventry
+cover
+coverage
+coveralls
+coverchief
+covercle
+covered
+coverer
+covering
+coverless
+coverlet
+coverlid
+coversed
+coverside
+coversine
+coverslut
+covert
+covertical
+covertly
+covertness
+coverture
+covet
+covetable
+coveter
+coveting
+covetingly
+covetiveness
+covetous
+covetously
+covetousness
+covey
+covibrate
+covibration
+covid
+Coviello
+covillager
+Covillea
+covin
+coving
+covinous
+covinously
+covisit
+covisitor
+covite
+covolume
+covotary
+cow
+cowal
+Cowan
+coward
+cowardice
+cowardliness
+cowardly
+cowardness
+cowardy
+cowbane
+cowbell
+cowberry
+cowbind
+cowbird
+cowboy
+cowcatcher
+cowdie
+coween
+cower
+cowfish
+cowgate
+cowgram
+cowhage
+cowheart
+cowhearted
+cowheel
+cowherb
+cowherd
+cowhide
+cowhiding
+cowhorn
+Cowichan
+cowish
+cowitch
+cowkeeper
+cowl
+cowle
+cowled
+cowleech
+cowleeching
+cowlick
+cowlicks
+cowlike
+cowling
+Cowlitz
+cowlstaff
+cowman
+cowpath
+cowpea
+cowpen
+Cowperian
+cowperitis
+cowpock
+cowpox
+cowpuncher
+cowquake
+cowrie
+cowroid
+cowshed
+cowskin
+cowslip
+cowslipped
+cowsucker
+cowtail
+cowthwort
+cowtongue
+cowweed
+cowwheat
+cowy
+cowyard
+cox
+coxa
+coxal
+coxalgia
+coxalgic
+coxankylometer
+coxarthritis
+coxarthrocace
+coxarthropathy
+coxbones
+coxcomb
+coxcombess
+coxcombhood
+coxcombic
+coxcombical
+coxcombicality
+coxcombically
+coxcombity
+coxcombry
+coxcomby
+coxcomical
+coxcomically
+coxite
+coxitis
+coxocerite
+coxoceritic
+coxodynia
+coxofemoral
+coxopodite
+coxswain
+coxy
+coy
+coyan
+coydog
+coyish
+coyishness
+coyly
+coyness
+coynye
+coyo
+coyol
+coyote
+Coyotero
+coyotillo
+coyoting
+coypu
+coyure
+coz
+coze
+cozen
+cozenage
+cozener
+cozening
+cozeningly
+cozier
+cozily
+coziness
+cozy
+crab
+crabbed
+crabbedly
+crabbedness
+crabber
+crabbery
+crabbing
+crabby
+crabcatcher
+crabeater
+craber
+crabhole
+crablet
+crablike
+crabman
+crabmill
+crabsidle
+crabstick
+crabweed
+crabwise
+crabwood
+Cracca
+Cracidae
+Cracinae
+crack
+crackable
+crackajack
+crackbrain
+crackbrained
+crackbrainedness
+crackdown
+cracked
+crackedness
+cracker
+crackerberry
+crackerjack
+crackers
+crackhemp
+crackiness
+cracking
+crackjaw
+crackle
+crackled
+crackless
+crackleware
+crackling
+crackly
+crackmans
+cracknel
+crackpot
+crackskull
+cracksman
+cracky
+cracovienne
+craddy
+cradge
+cradle
+cradleboard
+cradlechild
+cradlefellow
+cradleland
+cradlelike
+cradlemaker
+cradlemaking
+cradleman
+cradlemate
+cradler
+cradleside
+cradlesong
+cradletime
+cradling
+Cradock
+craft
+craftily
+craftiness
+craftless
+craftsman
+craftsmanship
+craftsmaster
+craftswoman
+craftwork
+craftworker
+crafty
+crag
+craggan
+cragged
+craggedness
+craggily
+cragginess
+craggy
+craglike
+cragsman
+cragwork
+craichy
+Craig
+craigmontite
+crain
+craisey
+craizey
+crajuru
+crake
+crakefeet
+crakow
+cram
+cramasie
+crambambulee
+crambambuli
+Crambe
+crambe
+cramberry
+crambid
+Crambidae
+Crambinae
+cramble
+crambly
+crambo
+Crambus
+crammer
+cramp
+cramped
+crampedness
+cramper
+crampet
+crampfish
+cramping
+crampingly
+crampon
+cramponnee
+crampy
+cran
+cranage
+cranberry
+crance
+crandall
+crandallite
+crane
+cranelike
+craneman
+craner
+cranesman
+craneway
+craney
+Crania
+crania
+craniacromial
+craniad
+cranial
+cranially
+cranian
+Craniata
+craniate
+cranic
+craniectomy
+craniocele
+craniocerebral
+cranioclasis
+cranioclasm
+cranioclast
+cranioclasty
+craniodidymus
+craniofacial
+craniognomic
+craniognomy
+craniognosy
+craniograph
+craniographer
+craniography
+craniological
+craniologically
+craniologist
+craniology
+craniomalacia
+craniomaxillary
+craniometer
+craniometric
+craniometrical
+craniometrically
+craniometrist
+craniometry
+craniopagus
+craniopathic
+craniopathy
+craniopharyngeal
+craniophore
+cranioplasty
+craniopuncture
+craniorhachischisis
+craniosacral
+cranioschisis
+cranioscopical
+cranioscopist
+cranioscopy
+craniospinal
+craniostenosis
+craniostosis
+Craniota
+craniotabes
+craniotome
+craniotomy
+craniotopography
+craniotympanic
+craniovertebral
+cranium
+crank
+crankbird
+crankcase
+cranked
+cranker
+crankery
+crankily
+crankiness
+crankle
+crankless
+crankly
+crankman
+crankous
+crankpin
+crankshaft
+crankum
+cranky
+crannage
+crannied
+crannock
+crannog
+crannoger
+cranny
+cranreuch
+crantara
+crants
+crap
+crapaud
+crapaudine
+crape
+crapefish
+crapehanger
+crapelike
+crappie
+crappin
+crapple
+crappo
+craps
+crapshooter
+crapulate
+crapulence
+crapulent
+crapulous
+crapulously
+crapulousness
+crapy
+craquelure
+crare
+crash
+crasher
+crasis
+craspedal
+craspedodromous
+craspedon
+Craspedota
+craspedotal
+craspedote
+crass
+crassamentum
+crassier
+crassilingual
+Crassina
+crassitude
+crassly
+crassness
+Crassula
+Crassulaceae
+crassulaceous
+Crataegus
+Crataeva
+cratch
+cratchens
+cratches
+crate
+crateful
+cratemaker
+cratemaking
+crateman
+crater
+crateral
+cratered
+Craterellus
+Craterid
+crateriform
+crateris
+craterkin
+craterless
+craterlet
+craterlike
+craterous
+craticular
+Cratinean
+cratometer
+cratometric
+cratometry
+craunch
+craunching
+craunchingly
+cravat
+crave
+craven
+Cravenette
+cravenette
+cravenhearted
+cravenly
+cravenness
+craver
+craving
+cravingly
+cravingness
+cravo
+craw
+crawberry
+crawdad
+crawfish
+crawfoot
+crawful
+crawl
+crawler
+crawlerize
+crawley
+crawleyroot
+crawling
+crawlingly
+crawlsome
+crawly
+crawm
+crawtae
+Crawthumper
+Crax
+crayer
+crayfish
+crayon
+crayonist
+crayonstone
+craze
+crazed
+crazedly
+crazedness
+crazily
+craziness
+crazingmill
+crazy
+crazycat
+crazyweed
+crea
+creagh
+creaght
+creak
+creaker
+creakily
+creakiness
+creakingly
+creaky
+cream
+creambush
+creamcake
+creamcup
+creamer
+creamery
+creameryman
+creamfruit
+creamily
+creaminess
+creamless
+creamlike
+creammaker
+creammaking
+creamometer
+creamsacs
+creamware
+creamy
+creance
+creancer
+creant
+crease
+creaseless
+creaser
+creashaks
+creasing
+creasy
+creat
+creatable
+create
+createdness
+creatic
+creatine
+creatinephosphoric
+creatinine
+creatininemia
+creatinuria
+creation
+creational
+creationary
+creationism
+creationist
+creationistic
+creative
+creatively
+creativeness
+creativity
+creatophagous
+creator
+creatorhood
+creatorrhea
+creatorship
+creatotoxism
+creatress
+creatrix
+creatural
+creature
+creaturehood
+creatureless
+creatureliness
+creatureling
+creaturely
+creatureship
+creaturize
+crebricostate
+crebrisulcate
+crebrity
+crebrous
+creche
+creddock
+credence
+credencive
+credenciveness
+credenda
+credensive
+credensiveness
+credent
+credential
+credently
+credenza
+credibility
+credible
+credibleness
+credibly
+credit
+creditability
+creditable
+creditableness
+creditably
+creditive
+creditless
+creditor
+creditorship
+creditress
+creditrix
+crednerite
+Credo
+credulity
+credulous
+credulously
+credulousness
+Cree
+cree
+creed
+creedal
+creedalism
+creedalist
+creeded
+creedist
+creedite
+creedless
+creedlessness
+creedmore
+creedsman
+Creek
+creek
+creeker
+creekfish
+creekside
+creekstuff
+creeky
+creel
+creeler
+creem
+creen
+creep
+creepage
+creeper
+creepered
+creeperless
+creephole
+creepie
+creepiness
+creeping
+creepingly
+creepmouse
+creepmousy
+creepy
+creese
+creesh
+creeshie
+creeshy
+creirgist
+cremaster
+cremasterial
+cremasteric
+cremate
+cremation
+cremationism
+cremationist
+cremator
+crematorial
+crematorium
+crematory
+crembalum
+cremnophobia
+cremocarp
+cremometer
+cremone
+cremor
+cremorne
+cremule
+crena
+crenate
+crenated
+crenately
+crenation
+crenature
+crenel
+crenelate
+crenelated
+crenelation
+crenele
+creneled
+crenelet
+crenellate
+crenellation
+crenic
+crenitic
+crenology
+crenotherapy
+Crenothrix
+crenula
+crenulate
+crenulated
+crenulation
+creodont
+Creodonta
+creole
+creoleize
+creolian
+Creolin
+creolism
+creolization
+creolize
+creophagia
+creophagism
+creophagist
+creophagous
+creophagy
+creosol
+creosote
+creosoter
+creosotic
+crepance
+crepe
+crepehanger
+Crepidula
+crepine
+crepiness
+Crepis
+crepitaculum
+crepitant
+crepitate
+crepitation
+crepitous
+crepitus
+crepon
+crept
+crepuscle
+crepuscular
+crepuscule
+crepusculine
+crepusculum
+crepy
+cresamine
+crescendo
+crescent
+crescentade
+crescentader
+Crescentia
+crescentic
+crescentiform
+crescentlike
+crescentoid
+crescentwise
+crescive
+crescograph
+crescographic
+cresegol
+cresol
+cresolin
+cresorcinol
+cresotate
+cresotic
+cresotinic
+cresoxide
+cresoxy
+cresphontes
+cress
+cressed
+cresselle
+cresset
+Cressida
+cresson
+cressweed
+cresswort
+cressy
+crest
+crested
+crestfallen
+crestfallenly
+crestfallenness
+cresting
+crestless
+crestline
+crestmoreite
+cresyl
+cresylate
+cresylene
+cresylic
+cresylite
+creta
+Cretaceous
+cretaceous
+cretaceously
+Cretacic
+Cretan
+Crete
+cretefaction
+Cretic
+cretic
+cretification
+cretify
+cretin
+cretinic
+cretinism
+cretinization
+cretinize
+cretinoid
+cretinous
+cretion
+cretionary
+Cretism
+cretonne
+crevalle
+crevasse
+crevice
+creviced
+crew
+crewel
+crewelist
+crewellery
+crewelwork
+crewer
+crewless
+crewman
+Crex
+crib
+cribbage
+cribber
+cribbing
+cribble
+cribellum
+cribo
+cribral
+cribrate
+cribrately
+cribration
+cribriform
+cribrose
+cribwork
+cric
+Cricetidae
+cricetine
+Cricetus
+crick
+cricket
+cricketer
+cricketing
+crickety
+crickey
+crickle
+cricoarytenoid
+cricoid
+cricopharyngeal
+cricothyreoid
+cricothyreotomy
+cricothyroid
+cricothyroidean
+cricotomy
+cricotracheotomy
+Cricotus
+cried
+crier
+criey
+crig
+crile
+crime
+Crimean
+crimeful
+crimeless
+crimelessness
+crimeproof
+criminal
+criminaldom
+criminalese
+criminalism
+criminalist
+criminalistic
+criminalistician
+criminalistics
+criminality
+criminally
+criminalness
+criminaloid
+criminate
+crimination
+criminative
+criminator
+criminatory
+crimine
+criminogenesis
+criminogenic
+criminologic
+criminological
+criminologist
+criminology
+criminosis
+criminous
+criminously
+criminousness
+crimogenic
+crimp
+crimpage
+crimper
+crimping
+crimple
+crimpness
+crimpy
+crimson
+crimsonly
+crimsonness
+crimsony
+crin
+crinal
+crinanite
+crinated
+crinatory
+crine
+crined
+crinet
+cringe
+cringeling
+cringer
+cringing
+cringingly
+cringingness
+cringle
+crinicultural
+criniculture
+criniferous
+Criniger
+crinigerous
+criniparous
+crinite
+crinitory
+crinivorous
+crink
+crinkle
+crinkleroot
+crinkly
+crinoid
+crinoidal
+Crinoidea
+crinoidean
+crinoline
+crinose
+crinosity
+crinula
+Crinum
+criobolium
+criocephalus
+Crioceras
+crioceratite
+crioceratitic
+Crioceris
+criophore
+Criophoros
+criosphinx
+cripes
+crippingly
+cripple
+crippledom
+crippleness
+crippler
+crippling
+cripply
+Cris
+crises
+crisic
+crisis
+crisp
+crispate
+crispated
+crispation
+crispature
+crisped
+crisper
+crispily
+Crispin
+crispine
+crispiness
+crisping
+crisply
+crispness
+crispy
+criss
+crissal
+crisscross
+crissum
+crista
+cristate
+Cristatella
+Cristi
+cristiform
+Cristina
+Cristineaux
+Cristino
+Cristispira
+Cristivomer
+cristobalite
+Cristopher
+critch
+criteria
+criteriology
+criterion
+criterional
+criterium
+crith
+Crithidia
+crithmene
+crithomancy
+critic
+critical
+criticality
+critically
+criticalness
+criticaster
+criticasterism
+criticastry
+criticisable
+criticism
+criticist
+criticizable
+criticize
+criticizer
+criticizingly
+critickin
+criticship
+criticule
+critique
+critling
+crizzle
+cro
+croak
+Croaker
+croaker
+croakily
+croakiness
+croaky
+Croat
+Croatan
+Croatian
+croc
+Crocanthemum
+crocard
+croceic
+crocein
+croceine
+croceous
+crocetin
+croche
+crochet
+crocheter
+crocheting
+croci
+crocidolite
+Crocidura
+crocin
+crock
+crocker
+crockery
+crockeryware
+crocket
+crocketed
+crocky
+crocodile
+Crocodilia
+crocodilian
+Crocodilidae
+crocodiline
+crocodilite
+crocodiloid
+Crocodilus
+Crocodylidae
+Crocodylus
+crocoisite
+crocoite
+croconate
+croconic
+Crocosmia
+Crocus
+crocus
+crocused
+croft
+crofter
+crofterization
+crofterize
+crofting
+croftland
+croisette
+croissante
+Crokinole
+Crom
+cromaltite
+crome
+Cromer
+Cromerian
+cromfordite
+cromlech
+cromorna
+cromorne
+Cromwell
+Cromwellian
+Cronartium
+crone
+croneberry
+cronet
+Cronian
+cronish
+cronk
+cronkness
+cronstedtite
+crony
+crood
+croodle
+crook
+crookback
+crookbacked
+crookbill
+crookbilled
+crooked
+crookedly
+crookedness
+crooken
+crookesite
+crookfingered
+crookheaded
+crookkneed
+crookle
+crooklegged
+crookneck
+crooknecked
+crooknosed
+crookshouldered
+crooksided
+crooksterned
+crooktoothed
+crool
+Croomia
+croon
+crooner
+crooning
+crooningly
+crop
+crophead
+cropland
+cropman
+croppa
+cropper
+croppie
+cropplecrown
+croppy
+cropshin
+cropsick
+cropsickness
+cropweed
+croquet
+croquette
+crore
+crosa
+Crosby
+crosier
+crosiered
+crosnes
+cross
+crossability
+crossable
+crossarm
+crossband
+crossbar
+crossbeak
+crossbeam
+crossbelt
+crossbill
+crossbolt
+crossbolted
+crossbones
+crossbow
+crossbowman
+crossbred
+crossbreed
+crosscurrent
+crosscurrented
+crosscut
+crosscutter
+crosscutting
+crosse
+crossed
+crosser
+crossette
+crossfall
+crossfish
+crossflow
+crossflower
+crossfoot
+crosshackle
+crosshand
+crosshatch
+crosshaul
+crosshauling
+crosshead
+crossing
+crossite
+crossjack
+crosslegs
+crosslet
+crossleted
+crosslight
+crosslighted
+crossline
+crossly
+crossness
+crossopodia
+crossopterygian
+Crossopterygii
+Crossosoma
+Crossosomataceae
+crossosomataceous
+crossover
+crosspatch
+crosspath
+crosspiece
+crosspoint
+crossrail
+crossroad
+crossroads
+crossrow
+crossruff
+crosstail
+crosstie
+crosstied
+crosstoes
+crosstrack
+crosstree
+crosswalk
+crossway
+crossways
+crossweb
+crossweed
+crosswise
+crossword
+crosswort
+crostarie
+crotal
+Crotalaria
+crotalic
+Crotalidae
+crotaliform
+Crotalinae
+crotaline
+crotalism
+crotalo
+crotaloid
+crotalum
+Crotalus
+crotaphic
+crotaphion
+crotaphite
+crotaphitic
+Crotaphytus
+crotch
+crotched
+crotchet
+crotcheteer
+crotchetiness
+crotchety
+crotchy
+crotin
+Croton
+crotonaldehyde
+crotonate
+crotonic
+crotonization
+crotonyl
+crotonylene
+Crotophaga
+crottels
+crottle
+crotyl
+crouch
+crouchant
+crouched
+croucher
+crouching
+crouchingly
+crounotherapy
+croup
+croupade
+croupal
+croupe
+crouperbush
+croupier
+croupily
+croupiness
+croupous
+croupy
+crouse
+crousely
+crout
+croute
+crouton
+crow
+crowbait
+crowbar
+crowberry
+crowbill
+crowd
+crowded
+crowdedly
+crowdedness
+crowder
+crowdweed
+crowdy
+crower
+crowflower
+crowfoot
+crowfooted
+crowhop
+crowing
+crowingly
+crowkeeper
+crowl
+crown
+crownbeard
+crowned
+crowner
+crownless
+crownlet
+crownling
+crownmaker
+crownwork
+crownwort
+crowshay
+crowstep
+crowstepped
+crowstick
+crowstone
+crowtoe
+croy
+croyden
+croydon
+croze
+crozer
+crozzle
+crozzly
+crubeen
+cruce
+cruces
+crucethouse
+cruche
+crucial
+cruciality
+crucially
+crucian
+Crucianella
+cruciate
+cruciately
+cruciation
+crucible
+Crucibulum
+crucifer
+Cruciferae
+cruciferous
+crucificial
+crucified
+crucifier
+crucifix
+crucifixion
+cruciform
+cruciformity
+cruciformly
+crucify
+crucigerous
+crucilly
+crucily
+cruck
+crude
+crudely
+crudeness
+crudity
+crudwort
+cruel
+cruelhearted
+cruelize
+cruelly
+cruelness
+cruels
+cruelty
+cruent
+cruentation
+cruet
+cruety
+cruise
+cruiser
+cruisken
+cruive
+cruller
+crum
+crumb
+crumbable
+crumbcloth
+crumber
+crumble
+crumblement
+crumblet
+crumbliness
+crumblingness
+crumblings
+crumbly
+crumby
+crumen
+crumenal
+crumlet
+crummie
+crummier
+crummiest
+crummock
+crummy
+crump
+crumper
+crumpet
+crumple
+crumpled
+crumpler
+crumpling
+crumply
+crumpy
+crunch
+crunchable
+crunchiness
+crunching
+crunchingly
+crunchingness
+crunchweed
+crunchy
+crunk
+crunkle
+crunodal
+crunode
+crunt
+cruor
+crupper
+crural
+crureus
+crurogenital
+cruroinguinal
+crurotarsal
+crus
+crusade
+crusader
+crusado
+Crusca
+cruse
+crush
+crushability
+crushable
+crushed
+crusher
+crushing
+crushingly
+crusie
+crusily
+crust
+crusta
+Crustacea
+crustaceal
+crustacean
+crustaceological
+crustaceologist
+crustaceology
+crustaceous
+crustade
+crustal
+crustalogical
+crustalogist
+crustalogy
+crustate
+crustated
+crustation
+crusted
+crustedly
+cruster
+crustific
+crustification
+crustily
+crustiness
+crustless
+crustose
+crustosis
+crusty
+crutch
+crutched
+crutcher
+crutching
+crutchlike
+cruth
+crutter
+crux
+cruzeiro
+cry
+cryable
+cryaesthesia
+cryalgesia
+cryanesthesia
+crybaby
+cryesthesia
+crying
+cryingly
+crymodynia
+crymotherapy
+cryoconite
+cryogen
+cryogenic
+cryogenics
+cryogeny
+cryohydrate
+cryohydric
+cryolite
+cryometer
+cryophile
+cryophilic
+cryophoric
+cryophorus
+cryophyllite
+cryophyte
+cryoplankton
+cryoscope
+cryoscopic
+cryoscopy
+cryosel
+cryostase
+cryostat
+crypt
+crypta
+cryptal
+cryptamnesia
+cryptamnesic
+cryptanalysis
+cryptanalyst
+cryptarch
+cryptarchy
+crypted
+Crypteronia
+Crypteroniaceae
+cryptesthesia
+cryptesthetic
+cryptic
+cryptical
+cryptically
+cryptoagnostic
+cryptobatholithic
+cryptobranch
+Cryptobranchia
+Cryptobranchiata
+cryptobranchiate
+Cryptobranchidae
+Cryptobranchus
+cryptocarp
+cryptocarpic
+cryptocarpous
+Cryptocarya
+Cryptocephala
+cryptocephalous
+Cryptocerata
+cryptocerous
+cryptoclastic
+Cryptocleidus
+cryptococci
+cryptococcic
+Cryptococcus
+cryptococcus
+cryptocommercial
+cryptocrystalline
+cryptocrystallization
+cryptodeist
+Cryptodira
+cryptodiran
+cryptodire
+cryptodirous
+cryptodouble
+cryptodynamic
+cryptogam
+Cryptogamia
+cryptogamian
+cryptogamic
+cryptogamical
+cryptogamist
+cryptogamous
+cryptogamy
+cryptogenetic
+cryptogenic
+cryptogenous
+Cryptoglaux
+cryptoglioma
+cryptogram
+Cryptogramma
+cryptogrammatic
+cryptogrammatical
+cryptogrammatist
+cryptogrammic
+cryptograph
+cryptographal
+cryptographer
+cryptographic
+cryptographical
+cryptographically
+cryptographist
+cryptography
+cryptoheresy
+cryptoheretic
+cryptoinflationist
+cryptolite
+cryptologist
+cryptology
+cryptolunatic
+cryptomere
+Cryptomeria
+cryptomerous
+cryptomnesia
+cryptomnesic
+cryptomonad
+Cryptomonadales
+Cryptomonadina
+cryptonema
+Cryptonemiales
+cryptoneurous
+cryptonym
+cryptonymous
+cryptopapist
+cryptoperthite
+Cryptophagidae
+cryptophthalmos
+Cryptophyceae
+cryptophyte
+cryptopine
+cryptoporticus
+Cryptoprocta
+cryptoproselyte
+cryptoproselytism
+cryptopyic
+cryptopyrrole
+cryptorchid
+cryptorchidism
+cryptorchis
+Cryptorhynchus
+cryptorrhesis
+cryptorrhetic
+cryptoscope
+cryptoscopy
+cryptosplenetic
+Cryptostegia
+cryptostoma
+Cryptostomata
+cryptostomate
+cryptostome
+Cryptotaenia
+cryptous
+cryptovalence
+cryptovalency
+cryptozonate
+Cryptozonia
+cryptozygosity
+cryptozygous
+Crypturi
+Crypturidae
+crystal
+crystallic
+crystalliferous
+crystalliform
+crystalligerous
+crystallin
+crystalline
+crystallinity
+crystallite
+crystallitic
+crystallitis
+crystallizability
+crystallizable
+crystallization
+crystallize
+crystallized
+crystallizer
+crystalloblastic
+crystallochemical
+crystallochemistry
+crystallogenesis
+crystallogenetic
+crystallogenic
+crystallogenical
+crystallogeny
+crystallogram
+crystallographer
+crystallographic
+crystallographical
+crystallographically
+crystallography
+crystalloid
+crystalloidal
+crystallology
+crystalloluminescence
+crystallomagnetic
+crystallomancy
+crystallometric
+crystallometry
+crystallophyllian
+crystallose
+crystallurgy
+crystalwort
+crystic
+crystograph
+crystoleum
+Crystolon
+crystosphene
+csardas
+Ctenacanthus
+ctene
+ctenidial
+ctenidium
+cteniform
+Ctenocephalus
+ctenocyst
+ctenodactyl
+Ctenodipterini
+ctenodont
+Ctenodontidae
+Ctenodus
+ctenoid
+ctenoidean
+Ctenoidei
+ctenoidian
+ctenolium
+Ctenophora
+ctenophoral
+ctenophoran
+ctenophore
+ctenophoric
+ctenophorous
+Ctenoplana
+Ctenostomata
+ctenostomatous
+ctenostome
+ctetology
+cuadra
+Cuailnge
+cuapinole
+cuarenta
+cuarta
+cuarteron
+cuartilla
+cuartillo
+cub
+Cuba
+cubage
+Cuban
+cubangle
+cubanite
+Cubanize
+cubatory
+cubature
+cubbing
+cubbish
+cubbishly
+cubbishness
+cubby
+cubbyhole
+cubbyhouse
+cubbyyew
+cubdom
+cube
+cubeb
+cubelet
+Cubelium
+cuber
+cubhood
+cubi
+cubic
+cubica
+cubical
+cubically
+cubicalness
+cubicity
+cubicle
+cubicly
+cubicone
+cubicontravariant
+cubicovariant
+cubicular
+cubiculum
+cubiform
+cubism
+cubist
+cubit
+cubital
+cubitale
+cubited
+cubitiere
+cubito
+cubitocarpal
+cubitocutaneous
+cubitodigital
+cubitometacarpal
+cubitopalmar
+cubitoplantar
+cubitoradial
+cubitus
+cubmaster
+cubocalcaneal
+cuboctahedron
+cubocube
+cubocuneiform
+cubododecahedral
+cuboid
+cuboidal
+cuboides
+cubomancy
+Cubomedusae
+cubomedusan
+cubometatarsal
+cubonavicular
+Cuchan
+Cuchulainn
+cuck
+cuckhold
+cuckold
+cuckoldom
+cuckoldry
+cuckoldy
+cuckoo
+cuckooflower
+cuckoomaid
+cuckoopint
+cuckoopintle
+cuckstool
+cucoline
+Cucujid
+Cucujidae
+Cucujus
+Cuculi
+Cuculidae
+cuculiform
+Cuculiformes
+cuculine
+cuculla
+cucullaris
+cucullate
+cucullately
+cuculliform
+cucullus
+cuculoid
+Cuculus
+Cucumaria
+Cucumariidae
+cucumber
+cucumiform
+Cucumis
+cucurbit
+Cucurbita
+Cucurbitaceae
+cucurbitaceous
+cucurbite
+cucurbitine
+cud
+cudava
+cudbear
+cudden
+cuddle
+cuddleable
+cuddlesome
+cuddly
+Cuddy
+cuddy
+cuddyhole
+cudgel
+cudgeler
+cudgerie
+cudweed
+cue
+cueball
+cueca
+cueist
+cueman
+cuemanship
+cuerda
+cuesta
+Cueva
+cuff
+cuffer
+cuffin
+cuffy
+cuffyism
+cuggermugger
+cuichunchulli
+cuinage
+cuir
+cuirass
+cuirassed
+cuirassier
+cuisinary
+cuisine
+cuissard
+cuissart
+cuisse
+cuissen
+cuisten
+Cuitlateco
+cuittikin
+Cujam
+cuke
+Culavamsa
+culbut
+Culdee
+culebra
+culet
+culeus
+Culex
+culgee
+culicid
+Culicidae
+culicidal
+culicide
+culiciform
+culicifugal
+culicifuge
+Culicinae
+culicine
+Culicoides
+culilawan
+culinarily
+culinary
+cull
+culla
+cullage
+Cullen
+culler
+cullet
+culling
+cullion
+cullis
+cully
+culm
+culmen
+culmicolous
+culmiferous
+culmigenous
+culminal
+culminant
+culminate
+culmination
+culmy
+culotte
+culottes
+culottic
+culottism
+culpa
+culpability
+culpable
+culpableness
+culpably
+culpatory
+culpose
+culprit
+cult
+cultch
+cultellation
+cultellus
+culteranismo
+cultic
+cultigen
+cultirostral
+Cultirostres
+cultish
+cultism
+cultismo
+cultist
+cultivability
+cultivable
+cultivably
+cultivar
+cultivatability
+cultivatable
+cultivate
+cultivated
+cultivation
+cultivator
+cultrate
+cultrated
+cultriform
+cultrirostral
+Cultrirostres
+cultual
+culturable
+cultural
+culturally
+culture
+cultured
+culturine
+culturist
+culturization
+culturize
+culturological
+culturologically
+culturologist
+culturology
+cultus
+culver
+culverfoot
+culverhouse
+culverin
+culverineer
+culverkey
+culvert
+culvertage
+culverwort
+cum
+Cumacea
+cumacean
+cumaceous
+Cumaean
+cumal
+cumaldehyde
+Cumanagoto
+cumaphyte
+cumaphytic
+cumaphytism
+Cumar
+cumay
+cumbent
+cumber
+cumberer
+cumberlandite
+cumberless
+cumberment
+cumbersome
+cumbersomely
+cumbersomeness
+cumberworld
+cumbha
+cumbly
+cumbraite
+cumbrance
+cumbre
+Cumbrian
+cumbrous
+cumbrously
+cumbrousness
+cumbu
+cumene
+cumengite
+cumenyl
+cumflutter
+cumhal
+cumic
+cumidin
+cumidine
+cumin
+cuminal
+cuminic
+cuminoin
+cuminol
+cuminole
+cuminseed
+cuminyl
+cummer
+cummerbund
+cummin
+cummingtonite
+cumol
+cump
+cumshaw
+cumulant
+cumular
+cumulate
+cumulately
+cumulation
+cumulatist
+cumulative
+cumulatively
+cumulativeness
+cumuli
+cumuliform
+cumulite
+cumulophyric
+cumulose
+cumulous
+cumulus
+cumyl
+Cuna
+cunabular
+Cunan
+Cunarder
+Cunas
+cunctation
+cunctatious
+cunctative
+cunctator
+cunctatorship
+cunctatury
+cunctipotent
+cundeamor
+cuneal
+cuneate
+cuneately
+cuneatic
+cuneator
+cuneiform
+cuneiformist
+cuneocuboid
+cuneonavicular
+cuneoscaphoid
+cunette
+cuneus
+cungeboi
+cunicular
+cuniculus
+cunila
+cunjah
+cunjer
+cunjevoi
+cunner
+cunnilinctus
+cunnilingus
+cunning
+Cunninghamia
+cunningly
+cunningness
+Cunonia
+Cunoniaceae
+cunoniaceous
+cunye
+Cunza
+Cuon
+cuorin
+cup
+Cupania
+cupay
+cupbearer
+cupboard
+cupcake
+cupel
+cupeler
+cupellation
+cupflower
+cupful
+Cuphea
+cuphead
+cupholder
+Cupid
+cupidinous
+cupidity
+cupidon
+cupidone
+cupless
+cupmaker
+cupmaking
+cupman
+cupmate
+cupola
+cupolaman
+cupolar
+cupolated
+cupped
+cupper
+cupping
+cuppy
+cuprammonia
+cuprammonium
+cupreine
+cuprene
+cupreous
+Cupressaceae
+cupressineous
+Cupressinoxylon
+Cupressus
+cupric
+cupride
+cupriferous
+cuprite
+cuproammonium
+cuprobismutite
+cuprocyanide
+cuprodescloizite
+cuproid
+cuproiodargyrite
+cupromanganese
+cupronickel
+cuproplumbite
+cuproscheelite
+cuprose
+cuprosilicon
+cuprotungstite
+cuprous
+cuprum
+cupseed
+cupstone
+cupula
+cupulate
+cupule
+Cupuliferae
+cupuliferous
+cupuliform
+cur
+curability
+curable
+curableness
+curably
+curacao
+curacy
+curare
+curarine
+curarization
+curarize
+curassow
+curatage
+curate
+curatel
+curateship
+curatess
+curatial
+curatic
+curation
+curative
+curatively
+curativeness
+curatize
+curatolatry
+curator
+curatorial
+curatorium
+curatorship
+curatory
+curatrix
+Curavecan
+curb
+curbable
+curber
+curbing
+curbless
+curblike
+curbstone
+curbstoner
+curby
+curcas
+curch
+curcuddoch
+Curculio
+curculionid
+Curculionidae
+curculionist
+Curcuma
+curcumin
+curd
+curdiness
+curdle
+curdler
+curdly
+curdwort
+curdy
+cure
+cureless
+curelessly
+curemaster
+curer
+curettage
+curette
+curettement
+curfew
+curial
+curialism
+curialist
+curialistic
+curiality
+curiate
+Curiatii
+curiboca
+curie
+curiescopy
+curietherapy
+curin
+curine
+curing
+curio
+curiologic
+curiologically
+curiologics
+curiology
+curiomaniac
+curiosa
+curiosity
+curioso
+curious
+curiously
+curiousness
+curite
+Curitis
+curium
+curl
+curled
+curledly
+curledness
+curler
+curlew
+curlewberry
+curlicue
+curliewurly
+curlike
+curlily
+curliness
+curling
+curlingly
+curlpaper
+curly
+curlycue
+curlyhead
+curlylocks
+curmudgeon
+curmudgeonery
+curmudgeonish
+curmudgeonly
+curmurring
+curn
+curney
+curnock
+curple
+curr
+currach
+currack
+curragh
+currant
+curratow
+currawang
+currency
+current
+currently
+currentness
+currentwise
+curricle
+curricula
+curricular
+curricularization
+curricularize
+curriculum
+curried
+currier
+curriery
+currish
+currishly
+currishness
+curry
+currycomb
+curryfavel
+Cursa
+cursal
+curse
+cursed
+cursedly
+cursedness
+curser
+curship
+cursitor
+cursive
+cursively
+cursiveness
+cursor
+cursorary
+Cursores
+Cursoria
+cursorial
+Cursoriidae
+cursorily
+cursoriness
+cursorious
+Cursorius
+cursory
+curst
+curstful
+curstfully
+curstly
+curstness
+cursus
+Curt
+curt
+curtail
+curtailed
+curtailedly
+curtailer
+curtailment
+curtain
+curtaining
+curtainless
+curtainwise
+curtal
+Curtana
+curtate
+curtation
+curtesy
+curtilage
+Curtis
+Curtise
+curtly
+curtness
+curtsy
+curua
+curuba
+Curucaneca
+Curucanecan
+curucucu
+curule
+Curuminaca
+Curuminacan
+Curupira
+cururo
+curvaceous
+curvaceousness
+curvacious
+curvant
+curvate
+curvation
+curvature
+curve
+curved
+curvedly
+curvedness
+curver
+curvesome
+curvesomeness
+curvet
+curvicaudate
+curvicostate
+curvidentate
+curvifoliate
+curviform
+curvilineal
+curvilinear
+curvilinearity
+curvilinearly
+curvimeter
+curvinervate
+curvinerved
+curvirostral
+Curvirostres
+curviserial
+curvital
+curvity
+curvograph
+curvometer
+curvous
+curvulate
+curvy
+curwhibble
+curwillet
+cuscohygrine
+cusconine
+Cuscus
+cuscus
+Cuscuta
+Cuscutaceae
+cuscutaceous
+cusec
+cuselite
+cush
+cushag
+cushat
+cushaw
+cushewbird
+cushion
+cushioned
+cushionflower
+cushionless
+cushionlike
+cushiony
+Cushite
+Cushitic
+cushlamochree
+cushy
+cusie
+cusinero
+cusk
+cusp
+cuspal
+cusparidine
+cusparine
+cuspate
+cusped
+cuspid
+cuspidal
+cuspidate
+cuspidation
+cuspidine
+cuspidor
+cuspule
+cuss
+cussed
+cussedly
+cussedness
+cusser
+cusso
+custard
+custerite
+custodee
+custodes
+custodial
+custodiam
+custodian
+custodianship
+custodier
+custody
+custom
+customable
+customarily
+customariness
+customary
+customer
+customhouse
+customs
+custumal
+cut
+cutaneal
+cutaneous
+cutaneously
+cutaway
+cutback
+cutch
+cutcher
+cutcherry
+cute
+cutely
+cuteness
+Cuterebra
+Cuthbert
+cutheal
+cuticle
+cuticolor
+cuticula
+cuticular
+cuticularization
+cuticularize
+cuticulate
+cutidure
+cutie
+cutification
+cutigeral
+cutin
+cutinization
+cutinize
+cutireaction
+cutis
+cutisector
+Cutiterebra
+cutitis
+cutization
+cutlass
+cutler
+cutleress
+Cutleria
+Cutleriaceae
+cutleriaceous
+Cutleriales
+cutlery
+cutlet
+cutling
+cutlips
+cutocellulose
+cutoff
+cutout
+cutover
+cutpurse
+cuttable
+cuttage
+cuttail
+cuttanee
+cutted
+cutter
+cutterhead
+cutterman
+cutthroat
+cutting
+cuttingly
+cuttingness
+cuttle
+cuttlebone
+cuttlefish
+cuttler
+cuttoo
+cutty
+cuttyhunk
+cutup
+cutwater
+cutweed
+cutwork
+cutworm
+cuvette
+Cuvierian
+cuvy
+cuya
+Cuzceno
+cwierc
+cwm
+cyamelide
+Cyamus
+cyan
+cyanacetic
+cyanamide
+cyananthrol
+Cyanastraceae
+Cyanastrum
+cyanate
+cyanaurate
+cyanauric
+cyanbenzyl
+cyancarbonic
+Cyanea
+cyanean
+cyanemia
+cyaneous
+cyanephidrosis
+cyanformate
+cyanformic
+cyanhidrosis
+cyanhydrate
+cyanhydric
+cyanhydrin
+cyanic
+cyanicide
+cyanidation
+cyanide
+cyanidin
+cyanidine
+cyanidrosis
+cyanimide
+cyanin
+cyanine
+cyanite
+cyanize
+cyanmethemoglobin
+cyanoacetate
+cyanoacetic
+cyanoaurate
+cyanoauric
+cyanobenzene
+cyanocarbonic
+cyanochlorous
+cyanochroia
+cyanochroic
+Cyanocitta
+cyanocrystallin
+cyanoderma
+cyanogen
+cyanogenesis
+cyanogenetic
+cyanogenic
+cyanoguanidine
+cyanohermidin
+cyanohydrin
+cyanol
+cyanole
+cyanomaclurin
+cyanometer
+cyanomethaemoglobin
+cyanomethemoglobin
+cyanometric
+cyanometry
+cyanopathic
+cyanopathy
+cyanophile
+cyanophilous
+cyanophoric
+cyanophose
+Cyanophyceae
+cyanophycean
+cyanophyceous
+cyanophycin
+cyanopia
+cyanoplastid
+cyanoplatinite
+cyanoplatinous
+cyanopsia
+cyanose
+cyanosed
+cyanosis
+Cyanospiza
+cyanotic
+cyanotrichite
+cyanotype
+cyanuramide
+cyanurate
+cyanuret
+cyanuric
+cyanurine
+cyanus
+cyaphenine
+cyath
+Cyathaspis
+Cyathea
+Cyatheaceae
+cyatheaceous
+cyathiform
+cyathium
+cyathoid
+cyatholith
+Cyathophyllidae
+cyathophylline
+cyathophylloid
+Cyathophyllum
+cyathos
+cyathozooid
+cyathus
+cybernetic
+cyberneticist
+cybernetics
+Cybister
+cycad
+Cycadaceae
+cycadaceous
+Cycadales
+cycadean
+cycadeoid
+Cycadeoidea
+cycadeous
+cycadiform
+cycadlike
+cycadofilicale
+Cycadofilicales
+Cycadofilices
+cycadofilicinean
+Cycadophyta
+Cycas
+Cycladic
+cyclamen
+cyclamin
+cyclamine
+cyclammonium
+cyclane
+Cyclanthaceae
+cyclanthaceous
+Cyclanthales
+Cyclanthus
+cyclar
+cyclarthrodial
+cyclarthrsis
+cyclas
+cycle
+cyclecar
+cycledom
+cyclene
+cycler
+cyclesmith
+Cycliae
+cyclian
+cyclic
+cyclical
+cyclically
+cyclicism
+cyclide
+cycling
+cyclism
+cyclist
+cyclistic
+cyclitic
+cyclitis
+cyclization
+cyclize
+cycloalkane
+Cyclobothra
+cyclobutane
+cyclocoelic
+cyclocoelous
+Cycloconium
+cyclodiolefin
+cycloganoid
+Cycloganoidei
+cyclogram
+cyclograph
+cyclographer
+cycloheptane
+cycloheptanone
+cyclohexane
+cyclohexanol
+cyclohexanone
+cyclohexene
+cyclohexyl
+cycloid
+cycloidal
+cycloidally
+cycloidean
+Cycloidei
+cycloidian
+cycloidotrope
+cyclolith
+Cycloloma
+cyclomania
+cyclometer
+cyclometric
+cyclometrical
+cyclometry
+Cyclomyaria
+cyclomyarian
+cyclonal
+cyclone
+cyclonic
+cyclonical
+cyclonically
+cyclonist
+cyclonite
+cyclonologist
+cyclonology
+cyclonometer
+cyclonoscope
+cycloolefin
+cycloparaffin
+cyclope
+Cyclopean
+cyclopean
+cyclopedia
+cyclopedic
+cyclopedical
+cyclopedically
+cyclopedist
+cyclopentadiene
+cyclopentane
+cyclopentanone
+cyclopentene
+Cyclopes
+cyclopes
+cyclophoria
+cyclophoric
+Cyclophorus
+cyclophrenia
+cyclopia
+Cyclopic
+cyclopism
+cyclopite
+cycloplegia
+cycloplegic
+cyclopoid
+cyclopropane
+Cyclops
+Cyclopteridae
+cyclopteroid
+cyclopterous
+cyclopy
+cyclorama
+cycloramic
+Cyclorrhapha
+cyclorrhaphous
+cycloscope
+cyclose
+cyclosis
+cyclospermous
+Cyclospondyli
+cyclospondylic
+cyclospondylous
+Cyclosporales
+Cyclosporeae
+Cyclosporinae
+cyclosporous
+Cyclostoma
+Cyclostomata
+cyclostomate
+Cyclostomatidae
+cyclostomatous
+cyclostome
+Cyclostomes
+Cyclostomi
+Cyclostomidae
+cyclostomous
+cyclostrophic
+cyclostyle
+Cyclotella
+cyclothem
+cyclothure
+cyclothurine
+Cyclothurus
+cyclothyme
+cyclothymia
+cyclothymiac
+cyclothymic
+cyclotome
+cyclotomic
+cyclotomy
+Cyclotosaurus
+cyclotron
+cyclovertebral
+cyclus
+Cydippe
+cydippian
+cydippid
+Cydippida
+Cydonia
+Cydonian
+cydonium
+cyesiology
+cyesis
+cygneous
+cygnet
+Cygnid
+Cygninae
+cygnine
+Cygnus
+cyke
+cylinder
+cylindered
+cylinderer
+cylinderlike
+cylindraceous
+cylindrarthrosis
+Cylindrella
+cylindrelloid
+cylindrenchyma
+cylindric
+cylindrical
+cylindricality
+cylindrically
+cylindricalness
+cylindricity
+cylindricule
+cylindriform
+cylindrite
+cylindrocellular
+cylindrocephalic
+cylindroconical
+cylindroconoidal
+cylindrocylindric
+cylindrodendrite
+cylindrograph
+cylindroid
+cylindroidal
+cylindroma
+cylindromatous
+cylindrometric
+cylindroogival
+Cylindrophis
+Cylindrosporium
+cylindruria
+cylix
+Cyllenian
+Cyllenius
+cyllosis
+cyma
+cymagraph
+cymaphen
+cymaphyte
+cymaphytic
+cymaphytism
+cymar
+cymation
+cymatium
+cymba
+cymbaeform
+cymbal
+Cymbalaria
+cymbaleer
+cymbaler
+cymbaline
+cymbalist
+cymballike
+cymbalo
+cymbalon
+cymbate
+Cymbella
+cymbiform
+Cymbium
+cymbling
+cymbocephalic
+cymbocephalous
+cymbocephaly
+Cymbopogon
+cyme
+cymelet
+cymene
+cymiferous
+cymling
+Cymodoceaceae
+cymogene
+cymograph
+cymographic
+cymoid
+Cymoidium
+cymometer
+cymophane
+cymophanous
+cymophenol
+cymoscope
+cymose
+cymosely
+cymotrichous
+cymotrichy
+cymous
+Cymraeg
+Cymric
+Cymry
+cymule
+cymulose
+cynanche
+Cynanchum
+cynanthropy
+Cynara
+cynaraceous
+cynarctomachy
+cynareous
+cynaroid
+cynebot
+cynegetic
+cynegetics
+cynegild
+cynhyena
+Cynias
+cyniatria
+cyniatrics
+cynic
+cynical
+cynically
+cynicalness
+cynicism
+cynicist
+cynipid
+Cynipidae
+cynipidous
+cynipoid
+Cynipoidea
+Cynips
+cynism
+cynocephalic
+cynocephalous
+cynocephalus
+cynoclept
+Cynocrambaceae
+cynocrambaceous
+Cynocrambe
+Cynodon
+cynodont
+Cynodontia
+Cynogale
+cynogenealogist
+cynogenealogy
+Cynoglossum
+Cynognathus
+cynography
+cynoid
+Cynoidea
+cynology
+Cynomoriaceae
+cynomoriaceous
+Cynomorium
+Cynomorpha
+cynomorphic
+cynomorphous
+Cynomys
+cynophile
+cynophilic
+cynophilist
+cynophobe
+cynophobia
+Cynopithecidae
+cynopithecoid
+cynopodous
+cynorrhodon
+Cynosarges
+Cynoscion
+Cynosura
+cynosural
+cynosure
+Cynosurus
+cynotherapy
+Cynoxylon
+Cynthia
+Cynthian
+Cynthiidae
+Cynthius
+cyp
+Cyperaceae
+cyperaceous
+Cyperus
+cyphella
+cyphellate
+Cyphomandra
+cyphonautes
+cyphonism
+Cypraea
+cypraeid
+Cypraeidae
+cypraeiform
+cypraeoid
+cypre
+cypres
+cypress
+cypressed
+cypressroot
+Cypria
+Cyprian
+Cyprididae
+Cypridina
+Cypridinidae
+cypridinoid
+Cyprina
+cyprine
+cyprinid
+Cyprinidae
+cypriniform
+cyprinine
+cyprinodont
+Cyprinodontes
+Cyprinodontidae
+cyprinodontoid
+cyprinoid
+Cyprinoidea
+cyprinoidean
+Cyprinus
+Cypriote
+Cypripedium
+Cypris
+cypsela
+Cypseli
+Cypselid
+Cypselidae
+cypseliform
+Cypseliformes
+cypseline
+cypseloid
+cypselomorph
+Cypselomorphae
+cypselomorphic
+cypselous
+Cypselus
+cyptozoic
+Cyrano
+Cyrenaic
+Cyrenaicism
+Cyrenian
+Cyril
+Cyrilla
+Cyrillaceae
+cyrillaceous
+Cyrillian
+Cyrillianism
+Cyrillic
+cyriologic
+cyriological
+Cyrtandraceae
+Cyrtidae
+cyrtoceracone
+Cyrtoceras
+cyrtoceratite
+cyrtoceratitic
+cyrtograph
+cyrtolite
+cyrtometer
+Cyrtomium
+cyrtopia
+cyrtosis
+Cyrus
+cyrus
+cyst
+cystadenoma
+cystadenosarcoma
+cystal
+cystalgia
+cystamine
+cystaster
+cystatrophia
+cystatrophy
+cystectasia
+cystectasy
+cystectomy
+cysted
+cysteine
+cysteinic
+cystelcosis
+cystenchyma
+cystenchymatous
+cystencyte
+cysterethism
+cystic
+cysticarpic
+cysticarpium
+cysticercoid
+cysticercoidal
+cysticercosis
+cysticercus
+cysticolous
+cystid
+Cystidea
+cystidean
+cystidicolous
+cystidium
+cystiferous
+cystiform
+cystigerous
+Cystignathidae
+cystignathine
+cystine
+cystinuria
+cystirrhea
+cystis
+cystitis
+cystitome
+cystoadenoma
+cystocarcinoma
+cystocarp
+cystocarpic
+cystocele
+cystocolostomy
+cystocyte
+cystodynia
+cystoelytroplasty
+cystoenterocele
+cystoepiplocele
+cystoepithelioma
+cystofibroma
+Cystoflagellata
+cystoflagellate
+cystogenesis
+cystogenous
+cystogram
+cystoid
+Cystoidea
+cystoidean
+cystolith
+cystolithectomy
+cystolithiasis
+cystolithic
+cystoma
+cystomatous
+cystomorphous
+cystomyoma
+cystomyxoma
+Cystonectae
+cystonectous
+cystonephrosis
+cystoneuralgia
+cystoparalysis
+Cystophora
+cystophore
+cystophotography
+cystophthisis
+cystoplasty
+cystoplegia
+cystoproctostomy
+Cystopteris
+cystoptosis
+Cystopus
+cystopyelitis
+cystopyelography
+cystopyelonephritis
+cystoradiography
+cystorrhagia
+cystorrhaphy
+cystorrhea
+cystosarcoma
+cystoschisis
+cystoscope
+cystoscopic
+cystoscopy
+cystose
+cystospasm
+cystospastic
+cystospore
+cystostomy
+cystosyrinx
+cystotome
+cystotomy
+cystotrachelotomy
+cystoureteritis
+cystourethritis
+cystous
+cytase
+cytasic
+Cytherea
+Cytherean
+Cytherella
+Cytherellidae
+Cytinaceae
+cytinaceous
+Cytinus
+cytioderm
+cytisine
+Cytisus
+cytitis
+cytoblast
+cytoblastema
+cytoblastemal
+cytoblastematous
+cytoblastemic
+cytoblastemous
+cytochemistry
+cytochrome
+cytochylema
+cytocide
+cytoclasis
+cytoclastic
+cytococcus
+cytocyst
+cytode
+cytodendrite
+cytoderm
+cytodiagnosis
+cytodieresis
+cytodieretic
+cytogamy
+cytogene
+cytogenesis
+cytogenetic
+cytogenetical
+cytogenetically
+cytogeneticist
+cytogenetics
+cytogenic
+cytogenous
+cytogeny
+cytoglobin
+cytohyaloplasm
+cytoid
+cytokinesis
+cytolist
+cytologic
+cytological
+cytologically
+cytologist
+cytology
+cytolymph
+cytolysin
+cytolysis
+cytolytic
+cytoma
+cytomere
+cytometer
+cytomicrosome
+cytomitome
+cytomorphosis
+cyton
+cytoparaplastin
+cytopathologic
+cytopathological
+cytopathologically
+cytopathology
+Cytophaga
+cytophagous
+cytophagy
+cytopharynx
+cytophil
+cytophysics
+cytophysiology
+cytoplasm
+cytoplasmic
+cytoplast
+cytoplastic
+cytoproct
+cytopyge
+cytoreticulum
+cytoryctes
+cytosine
+cytosome
+Cytospora
+Cytosporina
+cytost
+cytostomal
+cytostome
+cytostroma
+cytostromatic
+cytotactic
+cytotaxis
+cytotoxic
+cytotoxin
+cytotrophoblast
+cytotrophy
+cytotropic
+cytotropism
+cytozoic
+cytozoon
+cytozymase
+cytozyme
+cytula
+Cyzicene
+cyzicene
+czar
+czardas
+czardom
+czarevitch
+czarevna
+czarian
+czaric
+czarina
+czarinian
+czarish
+czarism
+czarist
+czaristic
+czaritza
+czarowitch
+czarowitz
+czarship
+Czech
+Czechic
+Czechish
+Czechization
+Czechoslovak
+Czechoslovakian
+D
+d
+da
+daalder
+dab
+dabb
+dabba
+dabber
+dabble
+dabbler
+dabbling
+dabblingly
+dabblingness
+dabby
+dabchick
+Dabih
+Dabitis
+dablet
+daboia
+daboya
+dabster
+dace
+Dacelo
+Daceloninae
+dacelonine
+dachshound
+dachshund
+Dacian
+dacite
+dacitic
+dacker
+dacoit
+dacoitage
+dacoity
+dacryadenalgia
+dacryadenitis
+dacryagogue
+dacrycystalgia
+Dacrydium
+dacryelcosis
+dacryoadenalgia
+dacryoadenitis
+dacryoblenorrhea
+dacryocele
+dacryocyst
+dacryocystalgia
+dacryocystitis
+dacryocystoblennorrhea
+dacryocystocele
+dacryocystoptosis
+dacryocystorhinostomy
+dacryocystosyringotomy
+dacryocystotome
+dacryocystotomy
+dacryohelcosis
+dacryohemorrhea
+dacryolite
+dacryolith
+dacryolithiasis
+dacryoma
+dacryon
+dacryops
+dacryopyorrhea
+dacryopyosis
+dacryosolenitis
+dacryostenosis
+dacryosyrinx
+dacryuria
+Dactyl
+dactyl
+dactylar
+dactylate
+dactylic
+dactylically
+dactylioglyph
+dactylioglyphic
+dactylioglyphist
+dactylioglyphtic
+dactylioglyphy
+dactyliographer
+dactyliographic
+dactyliography
+dactyliology
+dactyliomancy
+dactylion
+dactyliotheca
+Dactylis
+dactylist
+dactylitic
+dactylitis
+dactylogram
+dactylograph
+dactylographic
+dactylography
+dactyloid
+dactylology
+dactylomegaly
+dactylonomy
+dactylopatagium
+Dactylopius
+dactylopodite
+dactylopore
+Dactylopteridae
+Dactylopterus
+dactylorhiza
+dactyloscopic
+dactyloscopy
+dactylose
+dactylosternal
+dactylosymphysis
+dactylotheca
+dactylous
+dactylozooid
+dactylus
+Dacus
+dacyorrhea
+dad
+Dada
+dada
+Dadaism
+Dadaist
+dadap
+Dadayag
+dadder
+daddle
+daddock
+daddocky
+daddy
+daddynut
+dade
+dadenhudd
+dado
+Dadoxylon
+Dadu
+daduchus
+Dadupanthi
+dae
+Daedal
+daedal
+Daedalea
+Daedalean
+Daedalian
+Daedalic
+Daedalidae
+Daedalist
+daedaloid
+Daedalus
+daemon
+Daemonelix
+daemonic
+daemonurgist
+daemonurgy
+daemony
+daer
+daff
+daffery
+daffing
+daffish
+daffle
+daffodil
+daffodilly
+daffy
+daffydowndilly
+Dafla
+daft
+daftberry
+daftlike
+daftly
+daftness
+dag
+dagaba
+dagame
+dagassa
+Dagbamba
+Dagbane
+dagesh
+Dagestan
+dagga
+dagger
+daggerbush
+daggered
+daggerlike
+daggerproof
+daggers
+daggle
+daggletail
+daggletailed
+daggly
+daggy
+daghesh
+daglock
+Dagmar
+Dago
+dagoba
+Dagomba
+dags
+Daguerrean
+daguerreotype
+daguerreotyper
+daguerreotypic
+daguerreotypist
+daguerreotypy
+dah
+dahabeah
+Dahlia
+Dahoman
+Dahomeyan
+dahoon
+Daibutsu
+daidle
+daidly
+Daijo
+daiker
+daikon
+Dail
+Dailamite
+dailiness
+daily
+daimen
+daimiate
+daimio
+daimon
+daimonic
+daimonion
+daimonistic
+daimonology
+dain
+daincha
+dainteth
+daintify
+daintihood
+daintily
+daintiness
+daintith
+dainty
+Daira
+daira
+dairi
+dairy
+dairying
+dairymaid
+dairyman
+dairywoman
+dais
+daisied
+daisy
+daisybush
+daitya
+daiva
+dak
+daker
+Dakhini
+dakir
+Dakota
+daktylon
+daktylos
+dal
+dalar
+Dalarnian
+Dalbergia
+Dalcassian
+Dale
+dale
+Dalea
+Dalecarlian
+daleman
+daler
+dalesfolk
+dalesman
+dalespeople
+daleswoman
+daleth
+dali
+Dalibarda
+dalk
+dallack
+dalle
+dalles
+dalliance
+dallier
+dally
+dallying
+dallyingly
+Dalmania
+Dalmanites
+Dalmatian
+Dalmatic
+dalmatic
+Dalradian
+dalt
+dalteen
+Dalton
+dalton
+Daltonian
+Daltonic
+Daltonism
+Daltonist
+dam
+dama
+damage
+damageability
+damageable
+damageableness
+damageably
+damagement
+damager
+damages
+damagingly
+daman
+Damara
+Damascene
+damascene
+damascened
+damascener
+damascenine
+Damascus
+damask
+damaskeen
+damasse
+damassin
+Damayanti
+dambonitol
+dambose
+dambrod
+dame
+damenization
+damewort
+Damgalnunna
+Damia
+damiana
+Damianist
+damie
+damier
+damine
+damkjernite
+damlike
+dammar
+Dammara
+damme
+dammer
+dammish
+damn
+damnability
+damnable
+damnableness
+damnably
+damnation
+damnatory
+damned
+damner
+damnification
+damnify
+Damnii
+damning
+damningly
+damningness
+damnonians
+Damnonii
+damnous
+damnously
+Damoclean
+Damocles
+Damoetas
+damoiseau
+Damon
+Damone
+damonico
+damourite
+damp
+dampang
+damped
+dampen
+dampener
+damper
+damping
+dampish
+dampishly
+dampishness
+damply
+dampness
+dampproof
+dampproofer
+dampproofing
+dampy
+damsel
+damselfish
+damselhood
+damson
+Dan
+dan
+Dana
+Danaan
+Danagla
+Danai
+Danaid
+danaid
+Danaidae
+danaide
+Danaidean
+Danainae
+danaine
+Danais
+danaite
+Danakil
+danalite
+danburite
+dancalite
+dance
+dancer
+danceress
+dancery
+dancette
+dancing
+dancingly
+dand
+danda
+dandelion
+dander
+dandiacal
+dandiacally
+dandically
+dandification
+dandify
+dandilly
+dandily
+dandiprat
+dandizette
+dandle
+dandler
+dandling
+dandlingly
+dandruff
+dandruffy
+dandy
+dandydom
+dandyish
+dandyism
+dandyize
+dandyling
+Dane
+Daneball
+Daneflower
+Danegeld
+Danelaw
+Daneweed
+Danewort
+dang
+danger
+dangerful
+dangerfully
+dangerless
+dangerous
+dangerously
+dangerousness
+dangersome
+dangle
+dangleberry
+danglement
+dangler
+danglin
+dangling
+danglingly
+Dani
+Danian
+Danic
+danicism
+Daniel
+Daniele
+Danielic
+Danielle
+Daniglacial
+danio
+Danish
+Danism
+Danite
+Danization
+Danize
+dank
+Dankali
+dankish
+dankishness
+dankly
+dankness
+danli
+Dannebrog
+dannemorite
+danner
+Dannie
+dannock
+Danny
+danoranja
+dansant
+danseuse
+danta
+Dantean
+Dantesque
+Danthonia
+Dantist
+Dantology
+Dantomania
+danton
+Dantonesque
+Dantonist
+Dantophilist
+Dantophily
+Danube
+Danubian
+Danuri
+Danzig
+Danziger
+dao
+daoine
+dap
+Dapedium
+Dapedius
+Daphnaceae
+Daphne
+Daphnean
+Daphnephoria
+daphnetin
+Daphnia
+daphnin
+daphnioid
+Daphnis
+daphnoid
+dapicho
+dapico
+dapifer
+dapper
+dapperling
+dapperly
+dapperness
+dapple
+dappled
+dar
+darabukka
+darac
+daraf
+Darapti
+darat
+darbha
+darby
+Darbyism
+Darbyite
+Darci
+Dard
+Dardan
+dardanarius
+Dardani
+dardanium
+dardaol
+Dardic
+Dardistan
+dare
+dareall
+daredevil
+daredevilism
+daredevilry
+daredeviltry
+dareful
+Daren
+darer
+Dares
+daresay
+darg
+dargah
+darger
+Darghin
+Dargo
+dargsman
+dargue
+dari
+daribah
+daric
+Darien
+Darii
+Darin
+daring
+daringly
+daringness
+dariole
+Darius
+Darjeeling
+dark
+darken
+darkener
+darkening
+darkful
+darkhearted
+darkheartedness
+darkish
+darkishness
+darkle
+darkling
+darklings
+darkly
+darkmans
+darkness
+darkroom
+darkskin
+darksome
+darksomeness
+darky
+darling
+darlingly
+darlingness
+Darlingtonia
+darn
+darnation
+darned
+darnel
+darner
+darnex
+darning
+daroga
+daroo
+darr
+darrein
+Darrell
+Darren
+Darryl
+darshana
+Darsonval
+Darsonvalism
+darst
+dart
+Dartagnan
+dartars
+dartboard
+darter
+darting
+dartingly
+dartingness
+dartle
+dartlike
+dartman
+Dartmoor
+dartoic
+dartoid
+dartos
+dartre
+dartrose
+dartrous
+darts
+dartsman
+Darwinian
+Darwinical
+Darwinically
+Darwinism
+Darwinist
+Darwinistic
+Darwinite
+Darwinize
+Daryl
+darzee
+das
+Daschagga
+dash
+dashboard
+dashed
+dashedly
+dashee
+dasheen
+dasher
+dashing
+dashingly
+dashmaker
+Dashnak
+Dashnakist
+Dashnaktzutiun
+dashplate
+dashpot
+dashwheel
+dashy
+dasi
+Dasiphora
+dasnt
+dassie
+dassy
+dastard
+dastardize
+dastardliness
+dastardly
+dastur
+dasturi
+Dasya
+Dasyatidae
+Dasyatis
+Dasycladaceae
+dasycladaceous
+Dasylirion
+dasymeter
+dasypaedal
+dasypaedes
+dasypaedic
+Dasypeltis
+dasyphyllous
+Dasypodidae
+dasypodoid
+Dasyprocta
+Dasyproctidae
+dasyproctine
+Dasypus
+Dasystephana
+dasyure
+Dasyuridae
+dasyurine
+dasyuroid
+Dasyurus
+Dasyus
+data
+datable
+datableness
+datably
+dataria
+datary
+datch
+datcha
+date
+dateless
+datemark
+dater
+datil
+dating
+dation
+Datisca
+Datiscaceae
+datiscaceous
+datiscetin
+datiscin
+datiscoside
+Datisi
+Datism
+datival
+dative
+datively
+dativogerundial
+datolite
+datolitic
+dattock
+datum
+Datura
+daturic
+daturism
+daub
+daube
+Daubentonia
+Daubentoniidae
+dauber
+daubery
+daubing
+daubingly
+daubreeite
+daubreelite
+daubster
+dauby
+Daucus
+daud
+daughter
+daughterhood
+daughterkin
+daughterless
+daughterlike
+daughterliness
+daughterling
+daughterly
+daughtership
+Daulias
+daunch
+dauncy
+Daunii
+daunt
+daunter
+daunting
+dauntingly
+dauntingness
+dauntless
+dauntlessly
+dauntlessness
+daunton
+dauphin
+dauphine
+dauphiness
+Daur
+Dauri
+daut
+dautie
+dauw
+davach
+Davallia
+Dave
+daven
+davenport
+daver
+daverdy
+David
+Davidian
+Davidic
+Davidical
+Davidist
+davidsonite
+Daviesia
+daviesite
+davit
+davoch
+Davy
+davy
+davyne
+daw
+dawdle
+dawdler
+dawdling
+dawdlingly
+dawdy
+dawish
+dawkin
+Dawn
+dawn
+dawning
+dawnlight
+dawnlike
+dawnstreak
+dawnward
+dawny
+Dawson
+Dawsonia
+Dawsoniaceae
+dawsoniaceous
+dawsonite
+dawtet
+dawtit
+dawut
+day
+dayabhaga
+Dayakker
+dayal
+daybeam
+dayberry
+dayblush
+daybook
+daybreak
+daydawn
+daydream
+daydreamer
+daydreamy
+daydrudge
+dayflower
+dayfly
+daygoing
+dayless
+daylight
+daylit
+daylong
+dayman
+daymare
+daymark
+dayroom
+days
+dayshine
+daysman
+dayspring
+daystar
+daystreak
+daytale
+daytide
+daytime
+daytimes
+dayward
+daywork
+dayworker
+daywrit
+Daza
+daze
+dazed
+dazedly
+dazedness
+dazement
+dazingly
+dazy
+dazzle
+dazzlement
+dazzler
+dazzlingly
+de
+deacetylate
+deacetylation
+deacidification
+deacidify
+deacon
+deaconal
+deaconate
+deaconess
+deaconhood
+deaconize
+deaconry
+deaconship
+deactivate
+deactivation
+dead
+deadbeat
+deadborn
+deadcenter
+deaden
+deadener
+deadening
+deader
+deadeye
+deadfall
+deadhead
+deadheadism
+deadhearted
+deadheartedly
+deadheartedness
+deadhouse
+deading
+deadish
+deadishly
+deadishness
+deadlatch
+deadlight
+deadlily
+deadline
+deadliness
+deadlock
+deadly
+deadman
+deadmelt
+deadness
+deadpan
+deadpay
+deadtongue
+deadwood
+deadwort
+deaerate
+deaeration
+deaerator
+deaf
+deafen
+deafening
+deafeningly
+deafforest
+deafforestation
+deafish
+deafly
+deafness
+deair
+deal
+dealable
+dealate
+dealated
+dealation
+dealbate
+dealbation
+dealbuminize
+dealcoholist
+dealcoholization
+dealcoholize
+dealer
+dealerdom
+dealership
+dealfish
+dealing
+dealkalize
+dealkylate
+dealkylation
+dealt
+deambulation
+deambulatory
+deamidase
+deamidate
+deamidation
+deamidization
+deamidize
+deaminase
+deaminate
+deamination
+deaminization
+deaminize
+deammonation
+Dean
+dean
+deanathematize
+deaner
+deanery
+deaness
+deanimalize
+deanship
+deanthropomorphic
+deanthropomorphism
+deanthropomorphization
+deanthropomorphize
+deappetizing
+deaquation
+dear
+dearborn
+dearie
+dearly
+dearness
+dearomatize
+dearsenicate
+dearsenicator
+dearsenicize
+dearth
+dearthfu
+dearticulation
+dearworth
+dearworthily
+dearworthiness
+deary
+deash
+deasil
+deaspirate
+deaspiration
+deassimilation
+death
+deathbed
+deathblow
+deathday
+deathful
+deathfully
+deathfulness
+deathify
+deathin
+deathiness
+deathless
+deathlessly
+deathlessness
+deathlike
+deathliness
+deathling
+deathly
+deathroot
+deathshot
+deathsman
+deathtrap
+deathward
+deathwards
+deathwatch
+deathweed
+deathworm
+deathy
+deave
+deavely
+Deb
+deb
+debacle
+debadge
+debamboozle
+debar
+debarbarization
+debarbarize
+debark
+debarkation
+debarkment
+debarment
+debarrance
+debarrass
+debarration
+debase
+debasedness
+debasement
+debaser
+debasingly
+debatable
+debate
+debateful
+debatefully
+debatement
+debater
+debating
+debatingly
+debauch
+debauched
+debauchedly
+debauchedness
+debauchee
+debaucher
+debauchery
+debauchment
+Debbie
+Debby
+debby
+debeige
+debellate
+debellation
+debellator
+deben
+debenture
+debentured
+debenzolize
+Debi
+debile
+debilissima
+debilitant
+debilitate
+debilitated
+debilitation
+debilitative
+debility
+debind
+debit
+debiteuse
+debituminization
+debituminize
+deblaterate
+deblateration
+deboistly
+deboistness
+debonair
+debonaire
+debonairity
+debonairly
+debonairness
+debonnaire
+Deborah
+debord
+debordment
+debosh
+deboshed
+debouch
+debouchment
+debride
+debrief
+debris
+debrominate
+debromination
+debruise
+debt
+debtee
+debtful
+debtless
+debtor
+debtorship
+debullition
+debunk
+debunker
+debunkment
+debus
+Debussyan
+Debussyanize
+debut
+debutant
+debutante
+decachord
+decad
+decadactylous
+decadal
+decadally
+decadarch
+decadarchy
+decadary
+decadation
+decade
+decadence
+decadency
+decadent
+decadentism
+decadently
+decadescent
+decadianome
+decadic
+decadist
+decadrachm
+decadrachma
+decaesarize
+decaffeinate
+decaffeinize
+decafid
+decagon
+decagonal
+decagram
+decagramme
+decahedral
+decahedron
+decahydrate
+decahydrated
+decahydronaphthalene
+Decaisnea
+decal
+decalcification
+decalcifier
+decalcify
+decalcomania
+decalcomaniac
+decalescence
+decalescent
+Decalin
+decaliter
+decalitre
+decalobate
+Decalogist
+Decalogue
+decalvant
+decalvation
+decameral
+Decameron
+Decameronic
+decamerous
+decameter
+decametre
+decamp
+decampment
+decan
+decanal
+decanally
+decanate
+decane
+decangular
+decani
+decanically
+decannulation
+decanonization
+decanonize
+decant
+decantate
+decantation
+decanter
+decantherous
+decap
+decapetalous
+decaphyllous
+decapitable
+decapitalization
+decapitalize
+decapitate
+decapitation
+decapitator
+decapod
+Decapoda
+decapodal
+decapodan
+decapodiform
+decapodous
+decapper
+decapsulate
+decapsulation
+decarbonate
+decarbonator
+decarbonization
+decarbonize
+decarbonized
+decarbonizer
+decarboxylate
+decarboxylation
+decarboxylization
+decarboxylize
+decarburation
+decarburization
+decarburize
+decarch
+decarchy
+decardinalize
+decare
+decarhinus
+decarnate
+decarnated
+decart
+decasemic
+decasepalous
+decaspermal
+decaspermous
+decast
+decastellate
+decastere
+decastich
+decastyle
+decasualization
+decasualize
+decasyllabic
+decasyllable
+decasyllabon
+decate
+decathlon
+decatholicize
+decatize
+decatizer
+decatoic
+decator
+decatyl
+decaudate
+decaudation
+decay
+decayable
+decayed
+decayedness
+decayer
+decayless
+decease
+deceased
+decedent
+deceit
+deceitful
+deceitfully
+deceitfulness
+deceivability
+deceivable
+deceivableness
+deceivably
+deceive
+deceiver
+deceiving
+deceivingly
+decelerate
+deceleration
+decelerator
+decelerometer
+December
+Decemberish
+Decemberly
+Decembrist
+decemcostate
+decemdentate
+decemfid
+decemflorous
+decemfoliate
+decemfoliolate
+decemjugate
+decemlocular
+decempartite
+decempeda
+decempedal
+decempedate
+decempennate
+decemplex
+decemplicate
+decempunctate
+decemstriate
+decemuiri
+decemvir
+decemviral
+decemvirate
+decemvirship
+decenary
+decence
+decency
+decene
+decennal
+decennary
+decennia
+decenniad
+decennial
+decennially
+decennium
+decennoval
+decent
+decenter
+decently
+decentness
+decentralism
+decentralist
+decentralization
+decentralize
+decentration
+decentre
+decenyl
+decephalization
+deceptibility
+deceptible
+deception
+deceptious
+deceptiously
+deceptitious
+deceptive
+deceptively
+deceptiveness
+deceptivity
+decerebrate
+decerebration
+decerebrize
+decern
+decerniture
+decernment
+decess
+decession
+dechemicalization
+dechemicalize
+dechenite
+Dechlog
+dechlore
+dechlorination
+dechoralize
+dechristianization
+dechristianize
+Decian
+deciare
+deciatine
+decibel
+deciceronize
+decidable
+decide
+decided
+decidedly
+decidedness
+decider
+decidingly
+decidua
+decidual
+deciduary
+Deciduata
+deciduate
+deciduitis
+deciduoma
+deciduous
+deciduously
+deciduousness
+decigram
+decigramme
+decil
+decile
+deciliter
+decillion
+decillionth
+decima
+decimal
+decimalism
+decimalist
+decimalization
+decimalize
+decimally
+decimate
+decimation
+decimator
+decimestrial
+decimeter
+decimolar
+decimole
+decimosexto
+Decimus
+decinormal
+decipher
+decipherability
+decipherable
+decipherably
+decipherer
+decipherment
+decipium
+decipolar
+decision
+decisional
+decisive
+decisively
+decisiveness
+decistere
+decitizenize
+Decius
+decivilization
+decivilize
+deck
+decke
+decked
+deckel
+decker
+deckhead
+deckhouse
+deckie
+decking
+deckle
+deckload
+deckswabber
+declaim
+declaimant
+declaimer
+declamation
+declamatoriness
+declamatory
+declarable
+declarant
+declaration
+declarative
+declaratively
+declarator
+declaratorily
+declaratory
+declare
+declared
+declaredly
+declaredness
+declarer
+declass
+declassicize
+declassify
+declension
+declensional
+declensionally
+declericalize
+declimatize
+declinable
+declinal
+declinate
+declination
+declinational
+declinatory
+declinature
+decline
+declined
+declinedness
+decliner
+declinograph
+declinometer
+declivate
+declive
+declivitous
+declivity
+declivous
+declutch
+decoagulate
+decoagulation
+decoat
+decocainize
+decoct
+decoctible
+decoction
+decoctive
+decoctum
+decode
+Decodon
+decohere
+decoherence
+decoherer
+decohesion
+decoic
+decoke
+decollate
+decollated
+decollation
+decollator
+decolletage
+decollete
+decolor
+decolorant
+decolorate
+decoloration
+decolorimeter
+decolorization
+decolorize
+decolorizer
+decolour
+decommission
+decompensate
+decompensation
+decomplex
+decomponible
+decomposability
+decomposable
+decompose
+decomposed
+decomposer
+decomposite
+decomposition
+decomposure
+decompound
+decompoundable
+decompoundly
+decompress
+decompressing
+decompression
+decompressive
+deconcatenate
+deconcentrate
+deconcentration
+deconcentrator
+decongestive
+deconsecrate
+deconsecration
+deconsider
+deconsideration
+decontaminate
+decontamination
+decontrol
+deconventionalize
+decopperization
+decopperize
+decorability
+decorable
+decorably
+decorament
+decorate
+decorated
+decoration
+decorationist
+decorative
+decoratively
+decorativeness
+decorator
+decoratory
+decorist
+decorous
+decorously
+decorousness
+decorrugative
+decorticate
+decortication
+decorticator
+decorticosis
+decorum
+decostate
+decoy
+decoyer
+decoyman
+decrassify
+decream
+decrease
+decreaseless
+decreasing
+decreasingly
+decreation
+decreative
+decree
+decreeable
+decreement
+decreer
+decreet
+decrement
+decrementless
+decremeter
+decrepit
+decrepitate
+decrepitation
+decrepitly
+decrepitness
+decrepitude
+decrescence
+decrescendo
+decrescent
+decretal
+decretalist
+decrete
+decretist
+decretive
+decretively
+decretorial
+decretorily
+decretory
+decretum
+decrew
+decrial
+decried
+decrier
+decrown
+decrudescence
+decrustation
+decry
+decrystallization
+decubital
+decubitus
+decultivate
+deculturate
+decuman
+decumana
+decumanus
+Decumaria
+decumary
+decumbence
+decumbency
+decumbent
+decumbently
+decumbiture
+decuple
+decuplet
+decuria
+decurion
+decurionate
+decurrence
+decurrency
+decurrent
+decurrently
+decurring
+decursion
+decursive
+decursively
+decurtate
+decurvation
+decurvature
+decurve
+decury
+decus
+decussate
+decussated
+decussately
+decussation
+decussis
+decussorium
+decyl
+decylene
+decylenic
+decylic
+decyne
+Dedan
+Dedanim
+Dedanite
+dedecorate
+dedecoration
+dedecorous
+dedendum
+dedentition
+dedicant
+dedicate
+dedicatee
+dedication
+dedicational
+dedicative
+dedicator
+dedicatorial
+dedicatorily
+dedicatory
+dedicature
+dedifferentiate
+dedifferentiation
+dedimus
+deditician
+dediticiancy
+dedition
+dedo
+dedoggerelize
+dedogmatize
+dedolation
+deduce
+deducement
+deducibility
+deducible
+deducibleness
+deducibly
+deducive
+deduct
+deductible
+deduction
+deductive
+deductively
+deductory
+deduplication
+dee
+deed
+deedbox
+deedeed
+deedful
+deedfully
+deedily
+deediness
+deedless
+deedy
+deem
+deemer
+deemie
+deemster
+deemstership
+deep
+deepen
+deepener
+deepening
+deepeningly
+Deepfreeze
+deeping
+deepish
+deeplier
+deeply
+deepmost
+deepmouthed
+deepness
+deepsome
+deepwater
+deepwaterman
+deer
+deerberry
+deerdog
+deerdrive
+deerfood
+deerhair
+deerherd
+deerhorn
+deerhound
+deerlet
+deermeat
+deerskin
+deerstalker
+deerstalking
+deerstand
+deerstealer
+deertongue
+deerweed
+deerwood
+deeryard
+deevey
+deevilick
+deface
+defaceable
+defacement
+defacer
+defacing
+defacingly
+defalcate
+defalcation
+defalcator
+defalk
+defamation
+defamatory
+defame
+defamed
+defamer
+defamingly
+defassa
+defat
+default
+defaultant
+defaulter
+defaultless
+defaulture
+defeasance
+defeasanced
+defease
+defeasibility
+defeasible
+defeasibleness
+defeat
+defeater
+defeatism
+defeatist
+defeatment
+defeature
+defecant
+defecate
+defecation
+defecator
+defect
+defectibility
+defectible
+defection
+defectionist
+defectious
+defective
+defectively
+defectiveness
+defectless
+defectology
+defector
+defectoscope
+defedation
+defeminize
+defence
+defend
+defendable
+defendant
+defender
+defendress
+defenestration
+defensative
+defense
+defenseless
+defenselessly
+defenselessness
+defensibility
+defensible
+defensibleness
+defensibly
+defension
+defensive
+defensively
+defensiveness
+defensor
+defensorship
+defensory
+defer
+deferable
+deference
+deferent
+deferentectomy
+deferential
+deferentiality
+deferentially
+deferentitis
+deferment
+deferrable
+deferral
+deferred
+deferrer
+deferrization
+deferrize
+defervesce
+defervescence
+defervescent
+defeudalize
+defiable
+defial
+defiance
+defiant
+defiantly
+defiantness
+defiber
+defibrinate
+defibrination
+defibrinize
+deficience
+deficiency
+deficient
+deficiently
+deficit
+defier
+defiguration
+defilade
+defile
+defiled
+defiledness
+defilement
+defiler
+defiliation
+defiling
+defilingly
+definability
+definable
+definably
+define
+defined
+definedly
+definement
+definer
+definiendum
+definiens
+definite
+definitely
+definiteness
+definition
+definitional
+definitiones
+definitive
+definitively
+definitiveness
+definitization
+definitize
+definitor
+definitude
+deflagrability
+deflagrable
+deflagrate
+deflagration
+deflagrator
+deflate
+deflation
+deflationary
+deflationist
+deflator
+deflect
+deflectable
+deflected
+deflection
+deflectionization
+deflectionize
+deflective
+deflectometer
+deflector
+deflesh
+deflex
+deflexibility
+deflexible
+deflexion
+deflexure
+deflocculant
+deflocculate
+deflocculation
+deflocculator
+deflorate
+defloration
+deflorescence
+deflower
+deflowerer
+defluent
+defluous
+defluvium
+defluxion
+defoedation
+defog
+defoliage
+defoliate
+defoliated
+defoliation
+defoliator
+deforce
+deforcement
+deforceor
+deforcer
+deforciant
+deforest
+deforestation
+deforester
+deform
+deformability
+deformable
+deformalize
+deformation
+deformational
+deformative
+deformed
+deformedly
+deformedness
+deformer
+deformeter
+deformism
+deformity
+defortify
+defoul
+defraud
+defraudation
+defrauder
+defraudment
+defray
+defrayable
+defrayal
+defrayer
+defrayment
+defreeze
+defrication
+defrock
+defrost
+defroster
+deft
+defterdar
+deftly
+deftness
+defunct
+defunction
+defunctionalization
+defunctionalize
+defunctness
+defuse
+defusion
+defy
+defyingly
+deg
+deganglionate
+degarnish
+degas
+degasification
+degasifier
+degasify
+degasser
+degauss
+degelatinize
+degelation
+degeneracy
+degeneralize
+degenerate
+degenerately
+degenerateness
+degeneration
+degenerationist
+degenerative
+degenerescence
+degenerescent
+degentilize
+degerm
+degerminate
+degerminator
+degged
+degger
+deglaciation
+deglaze
+deglutinate
+deglutination
+deglutition
+deglutitious
+deglutitive
+deglutitory
+deglycerin
+deglycerine
+degorge
+degradable
+degradand
+degradation
+degradational
+degradative
+degrade
+degraded
+degradedly
+degradedness
+degradement
+degrader
+degrading
+degradingly
+degradingness
+degraduate
+degraduation
+degrain
+degrease
+degreaser
+degree
+degreeless
+degreewise
+degression
+degressive
+degressively
+degu
+Deguelia
+deguelin
+degum
+degummer
+degust
+degustation
+dehair
+dehairer
+Dehaites
+deheathenize
+dehematize
+dehepatize
+Dehgan
+dehisce
+dehiscence
+dehiscent
+dehistoricize
+Dehkan
+dehnstufe
+dehonestate
+dehonestation
+dehorn
+dehorner
+dehors
+dehort
+dehortation
+dehortative
+dehortatory
+dehorter
+dehull
+dehumanization
+dehumanize
+dehumidification
+dehumidifier
+dehumidify
+dehusk
+Dehwar
+dehydrant
+dehydrase
+dehydrate
+dehydration
+dehydrator
+dehydroascorbic
+dehydrocorydaline
+dehydrofreezing
+dehydrogenase
+dehydrogenate
+dehydrogenation
+dehydrogenization
+dehydrogenize
+dehydromucic
+dehydrosparteine
+dehypnotize
+deice
+deicer
+deicidal
+deicide
+deictic
+deictical
+deictically
+deidealize
+Deidesheimer
+deific
+deifical
+deification
+deificatory
+deifier
+deiform
+deiformity
+deify
+deign
+Deimos
+deincrustant
+deindividualization
+deindividualize
+deindividuate
+deindustrialization
+deindustrialize
+deink
+Deino
+Deinocephalia
+Deinoceras
+Deinodon
+Deinodontidae
+deinos
+Deinosauria
+Deinotherium
+deinsularize
+deintellectualization
+deintellectualize
+deionize
+Deipara
+deiparous
+Deiphobus
+deipnodiplomatic
+deipnophobia
+deipnosophism
+deipnosophist
+deipnosophistic
+deipotent
+Deirdre
+deiseal
+deisidaimonia
+deism
+deist
+deistic
+deistical
+deistically
+deisticalness
+deity
+deityship
+deject
+dejecta
+dejected
+dejectedly
+dejectedness
+dejectile
+dejection
+dejectly
+dejectory
+dejecture
+dejerate
+dejeration
+dejerator
+dejeune
+dejeuner
+dejunkerize
+Dekabrist
+dekaparsec
+dekapode
+dekko
+dekle
+deknight
+Del
+delabialization
+delabialize
+delacrimation
+delactation
+delaine
+delaminate
+delamination
+delapse
+delapsion
+delate
+delater
+delatinization
+delatinize
+delation
+delator
+delatorian
+Delaware
+Delawarean
+delawn
+delay
+delayable
+delayage
+delayer
+delayful
+delaying
+delayingly
+Delbert
+dele
+delead
+delectability
+delectable
+delectableness
+delectably
+delectate
+delectation
+delectus
+delegable
+delegacy
+delegalize
+delegant
+delegate
+delegatee
+delegateship
+delegation
+delegative
+delegator
+delegatory
+delenda
+Delesseria
+Delesseriaceae
+delesseriaceous
+delete
+deleterious
+deleteriously
+deleteriousness
+deletion
+deletive
+deletory
+delf
+delft
+delftware
+Delhi
+Delia
+Delian
+deliberalization
+deliberalize
+deliberant
+deliberate
+deliberately
+deliberateness
+deliberation
+deliberative
+deliberatively
+deliberativeness
+deliberator
+delible
+delicacy
+delicate
+delicately
+delicateness
+delicatesse
+delicatessen
+delicense
+Delichon
+delicioso
+Delicious
+delicious
+deliciously
+deliciousness
+delict
+delictum
+deligated
+deligation
+delight
+delightable
+delighted
+delightedly
+delightedness
+delighter
+delightful
+delightfully
+delightfulness
+delighting
+delightingly
+delightless
+delightsome
+delightsomely
+delightsomeness
+delignate
+delignification
+Delilah
+delime
+delimit
+delimitate
+delimitation
+delimitative
+delimiter
+delimitize
+delineable
+delineament
+delineate
+delineation
+delineative
+delineator
+delineatory
+delineature
+delinquence
+delinquency
+delinquent
+delinquently
+delint
+delinter
+deliquesce
+deliquescence
+deliquescent
+deliquium
+deliracy
+delirament
+deliration
+deliriant
+delirifacient
+delirious
+deliriously
+deliriousness
+delirium
+delitescence
+delitescency
+delitescent
+deliver
+deliverable
+deliverance
+deliverer
+deliveress
+deliveror
+delivery
+deliveryman
+dell
+Della
+dellenite
+Delobranchiata
+delocalization
+delocalize
+delomorphic
+delomorphous
+deloul
+delouse
+delphacid
+Delphacidae
+Delphian
+Delphin
+Delphinapterus
+delphine
+delphinic
+Delphinid
+Delphinidae
+delphinin
+delphinine
+delphinite
+Delphinium
+Delphinius
+delphinoid
+Delphinoidea
+delphinoidine
+Delphinus
+delphocurarine
+Delsarte
+Delsartean
+Delsartian
+Delta
+delta
+deltafication
+deltaic
+deltal
+deltarium
+deltation
+delthyrial
+delthyrium
+deltic
+deltidial
+deltidium
+deltiology
+deltohedron
+deltoid
+deltoidal
+delubrum
+deludable
+delude
+deluder
+deludher
+deluding
+deludingly
+deluge
+deluminize
+delundung
+delusion
+delusional
+delusionist
+delusive
+delusively
+delusiveness
+delusory
+deluster
+deluxe
+delve
+delver
+demagnetizable
+demagnetization
+demagnetize
+demagnetizer
+demagog
+demagogic
+demagogical
+demagogically
+demagogism
+demagogue
+demagoguery
+demagogy
+demal
+demand
+demandable
+demandant
+demander
+demanding
+demandingly
+demanganization
+demanganize
+demantoid
+demarcate
+demarcation
+demarcator
+demarch
+demarchy
+demargarinate
+demark
+demarkation
+demast
+dematerialization
+dematerialize
+Dematiaceae
+dematiaceous
+deme
+demean
+demeanor
+demegoric
+demency
+dement
+dementate
+dementation
+demented
+dementedly
+dementedness
+dementholize
+dementia
+demephitize
+demerit
+demeritorious
+demeritoriously
+Demerol
+demersal
+demersed
+demersion
+demesman
+demesmerize
+demesne
+demesnial
+demetallize
+demethylate
+demethylation
+Demetrian
+demetricize
+demi
+demiadult
+demiangel
+demiassignation
+demiatheism
+demiatheist
+demibarrel
+demibastion
+demibastioned
+demibath
+demibeast
+demibelt
+demibob
+demibombard
+demibrassart
+demibrigade
+demibrute
+demibuckram
+demicadence
+demicannon
+demicanon
+demicanton
+demicaponier
+demichamfron
+demicircle
+demicircular
+demicivilized
+demicolumn
+demicoronal
+demicritic
+demicuirass
+demiculverin
+demicylinder
+demicylindrical
+demidandiprat
+demideify
+demideity
+demidevil
+demidigested
+demidistance
+demiditone
+demidoctor
+demidog
+demidolmen
+demidome
+demieagle
+demifarthing
+demifigure
+demiflouncing
+demifusion
+demigardebras
+demigauntlet
+demigentleman
+demiglobe
+demigod
+demigoddess
+demigoddessship
+demigorge
+demigriffin
+demigroat
+demihag
+demihearse
+demiheavenly
+demihigh
+demihogshead
+demihorse
+demihuman
+demijambe
+demijohn
+demikindred
+demiking
+demilance
+demilancer
+demilawyer
+demilegato
+demilion
+demilitarization
+demilitarize
+demiliterate
+demilune
+demiluster
+demilustre
+demiman
+demimark
+demimentoniere
+demimetope
+demimillionaire
+demimondaine
+demimonde
+demimonk
+deminatured
+demineralization
+demineralize
+deminude
+deminudity
+demioctagonal
+demioctangular
+demiofficial
+demiorbit
+demiourgoi
+demiowl
+demiox
+demipagan
+demiparallel
+demipauldron
+demipectinate
+demipesade
+demipike
+demipillar
+demipique
+demiplacate
+demiplate
+demipomada
+demipremise
+demipremiss
+demipriest
+demipronation
+demipuppet
+demiquaver
+demiracle
+demiram
+demirelief
+demirep
+demirevetment
+demirhumb
+demirilievo
+demirobe
+demisability
+demisable
+demisacrilege
+demisang
+demisangue
+demisavage
+demise
+demiseason
+demisecond
+demisemiquaver
+demisemitone
+demisheath
+demishirt
+demisovereign
+demisphere
+demiss
+demission
+demissionary
+demissly
+demissness
+demissory
+demisuit
+demit
+demitasse
+demitint
+demitoilet
+demitone
+demitrain
+demitranslucence
+demitube
+demiturned
+demiurge
+demiurgeous
+demiurgic
+demiurgical
+demiurgically
+demiurgism
+demivambrace
+demivirgin
+demivoice
+demivol
+demivolt
+demivotary
+demiwivern
+demiwolf
+demnition
+demob
+demobilization
+demobilize
+democracy
+democrat
+democratian
+democratic
+democratical
+democratically
+democratifiable
+democratism
+democratist
+democratization
+democratize
+demodectic
+demoded
+Demodex
+Demodicidae
+Demodocus
+demodulation
+demodulator
+demogenic
+Demogorgon
+demographer
+demographic
+demographical
+demographically
+demographist
+demography
+demoid
+demoiselle
+demolish
+demolisher
+demolishment
+demolition
+demolitionary
+demolitionist
+demological
+demology
+Demon
+demon
+demonastery
+demoness
+demonetization
+demonetize
+demoniac
+demoniacal
+demoniacally
+demoniacism
+demonial
+demonian
+demonianism
+demoniast
+demonic
+demonical
+demonifuge
+demonish
+demonism
+demonist
+demonize
+demonkind
+demonland
+demonlike
+demonocracy
+demonograph
+demonographer
+demonography
+demonolater
+demonolatrous
+demonolatrously
+demonolatry
+demonologer
+demonologic
+demonological
+demonologically
+demonologist
+demonology
+demonomancy
+demonophobia
+demonry
+demonship
+demonstrability
+demonstrable
+demonstrableness
+demonstrably
+demonstrant
+demonstratable
+demonstrate
+demonstratedly
+demonstrater
+demonstration
+demonstrational
+demonstrationist
+demonstrative
+demonstratively
+demonstrativeness
+demonstrator
+demonstratorship
+demonstratory
+demophil
+demophilism
+demophobe
+Demophon
+Demophoon
+demoralization
+demoralize
+demoralizer
+demorphinization
+demorphism
+demos
+Demospongiae
+Demosthenean
+Demosthenic
+demote
+demotic
+demotics
+demotion
+demotist
+demount
+demountability
+demountable
+dempster
+demulce
+demulcent
+demulsibility
+demulsify
+demulsion
+demure
+demurely
+demureness
+demurity
+demurrable
+demurrage
+demurral
+demurrant
+demurrer
+demurring
+demurringly
+demutization
+demy
+demyship
+den
+denarcotization
+denarcotize
+denarius
+denaro
+denary
+denat
+denationalization
+denationalize
+denaturalization
+denaturalize
+denaturant
+denaturate
+denaturation
+denature
+denaturization
+denaturize
+denaturizer
+denazify
+denda
+dendrachate
+dendral
+Dendraspis
+dendraxon
+dendric
+dendriform
+dendrite
+Dendrites
+dendritic
+dendritical
+dendritically
+dendritiform
+Dendrium
+Dendrobates
+Dendrobatinae
+dendrobe
+Dendrobium
+Dendrocalamus
+Dendroceratina
+dendroceratine
+Dendrochirota
+dendrochronological
+dendrochronologist
+dendrochronology
+dendroclastic
+Dendrocoela
+dendrocoelan
+dendrocoele
+dendrocoelous
+Dendrocolaptidae
+dendrocolaptine
+Dendroctonus
+Dendrocygna
+dendrodont
+Dendrodus
+Dendroeca
+Dendrogaea
+Dendrogaean
+dendrograph
+dendrography
+Dendrohyrax
+Dendroica
+dendroid
+dendroidal
+Dendroidea
+Dendrolagus
+dendrolatry
+Dendrolene
+dendrolite
+dendrologic
+dendrological
+dendrologist
+dendrologous
+dendrology
+Dendromecon
+dendrometer
+dendron
+dendrophil
+dendrophile
+dendrophilous
+Dendropogon
+Dene
+dene
+Deneb
+Denebola
+denegate
+denegation
+denehole
+denervate
+denervation
+deneutralization
+dengue
+deniable
+denial
+denicotinize
+denier
+denierage
+denierer
+denigrate
+denigration
+denigrator
+denim
+Denis
+denitrate
+denitration
+denitrator
+denitrificant
+denitrification
+denitrificator
+denitrifier
+denitrify
+denitrize
+denization
+denizen
+denizenation
+denizenize
+denizenship
+Denmark
+dennet
+Dennis
+Dennstaedtia
+denominable
+denominate
+denomination
+denominational
+denominationalism
+denominationalist
+denominationalize
+denominationally
+denominative
+denominatively
+denominator
+denotable
+denotation
+denotative
+denotatively
+denotativeness
+denotatum
+denote
+denotement
+denotive
+denouement
+denounce
+denouncement
+denouncer
+dense
+densely
+densen
+denseness
+denshare
+densher
+denshire
+densification
+densifier
+densify
+densimeter
+densimetric
+densimetrically
+densimetry
+densitometer
+density
+dent
+dentagra
+dental
+dentale
+dentalgia
+Dentaliidae
+dentalism
+dentality
+Dentalium
+dentalization
+dentalize
+dentally
+dentaphone
+Dentaria
+dentary
+dentata
+dentate
+dentated
+dentately
+dentation
+dentatoangulate
+dentatocillitate
+dentatocostate
+dentatocrenate
+dentatoserrate
+dentatosetaceous
+dentatosinuate
+dentel
+dentelated
+dentelle
+dentelure
+denter
+dentex
+dentical
+denticate
+Denticeti
+denticle
+denticular
+denticulate
+denticulately
+denticulation
+denticule
+dentiferous
+dentification
+dentiform
+dentifrice
+dentigerous
+dentil
+dentilabial
+dentilated
+dentilation
+dentile
+dentilingual
+dentiloquist
+dentiloquy
+dentimeter
+dentin
+dentinal
+dentinalgia
+dentinasal
+dentine
+dentinitis
+dentinoblast
+dentinocemental
+dentinoid
+dentinoma
+dentiparous
+dentiphone
+dentiroster
+dentirostral
+dentirostrate
+Dentirostres
+dentiscalp
+dentist
+dentistic
+dentistical
+dentistry
+dentition
+dentoid
+dentolabial
+dentolingual
+dentonasal
+dentosurgical
+dentural
+denture
+denty
+denucleate
+denudant
+denudate
+denudation
+denudative
+denude
+denuder
+denumerable
+denumerably
+denumeral
+denumerant
+denumerantive
+denumeration
+denumerative
+denunciable
+denunciant
+denunciate
+denunciation
+denunciative
+denunciatively
+denunciator
+denunciatory
+denutrition
+deny
+denyingly
+deobstruct
+deobstruent
+deoccidentalize
+deoculate
+deodand
+deodara
+deodorant
+deodorization
+deodorize
+deodorizer
+deontological
+deontologist
+deontology
+deoperculate
+deoppilant
+deoppilate
+deoppilation
+deoppilative
+deordination
+deorganization
+deorganize
+deorientalize
+deorsumvergence
+deorsumversion
+deorusumduction
+deossification
+deossify
+deota
+deoxidant
+deoxidate
+deoxidation
+deoxidative
+deoxidator
+deoxidization
+deoxidize
+deoxidizer
+deoxygenate
+deoxygenation
+deoxygenization
+deozonization
+deozonize
+deozonizer
+depa
+depaganize
+depaint
+depancreatization
+depancreatize
+depark
+deparliament
+depart
+departed
+departer
+departisanize
+departition
+department
+departmental
+departmentalism
+departmentalization
+departmentalize
+departmentally
+departmentization
+departmentize
+departure
+depas
+depascent
+depass
+depasturable
+depasturage
+depasturation
+depasture
+depatriate
+depauperate
+depauperation
+depauperization
+depauperize
+depencil
+depend
+dependability
+dependable
+dependableness
+dependably
+dependence
+dependency
+dependent
+dependently
+depender
+depending
+dependingly
+depeople
+deperdite
+deperditely
+deperition
+depersonalization
+depersonalize
+depersonize
+depetalize
+depeter
+depetticoat
+dephase
+dephilosophize
+dephlegmate
+dephlegmation
+dephlegmatize
+dephlegmator
+dephlegmatory
+dephlegmedness
+dephlogisticate
+dephlogisticated
+dephlogistication
+dephosphorization
+dephosphorize
+dephysicalization
+dephysicalize
+depickle
+depict
+depicter
+depiction
+depictive
+depicture
+depiedmontize
+depigment
+depigmentate
+depigmentation
+depigmentize
+depilate
+depilation
+depilator
+depilatory
+depilitant
+depilous
+deplaceable
+deplane
+deplasmolysis
+deplaster
+deplenish
+deplete
+deplethoric
+depletion
+depletive
+depletory
+deploitation
+deplorability
+deplorable
+deplorableness
+deplorably
+deploration
+deplore
+deplored
+deploredly
+deploredness
+deplorer
+deploringly
+deploy
+deployment
+deplumate
+deplumated
+deplumation
+deplume
+deplump
+depoetize
+depoh
+depolarization
+depolarize
+depolarizer
+depolish
+depolishing
+depolymerization
+depolymerize
+depone
+deponent
+depopularize
+depopulate
+depopulation
+depopulative
+depopulator
+deport
+deportable
+deportation
+deportee
+deporter
+deportment
+deposable
+deposal
+depose
+deposer
+deposit
+depositary
+depositation
+depositee
+deposition
+depositional
+depositive
+depositor
+depository
+depositum
+depositure
+depot
+depotentiate
+depotentiation
+depravation
+deprave
+depraved
+depravedly
+depravedness
+depraver
+depravingly
+depravity
+deprecable
+deprecate
+deprecatingly
+deprecation
+deprecative
+deprecator
+deprecatorily
+deprecatoriness
+deprecatory
+depreciable
+depreciant
+depreciate
+depreciatingly
+depreciation
+depreciative
+depreciatively
+depreciator
+depreciatoriness
+depreciatory
+depredate
+depredation
+depredationist
+depredator
+depredatory
+depress
+depressant
+depressed
+depressibility
+depressible
+depressing
+depressingly
+depressingness
+depression
+depressive
+depressively
+depressiveness
+depressomotor
+depressor
+depreter
+deprint
+depriorize
+deprivable
+deprival
+deprivate
+deprivation
+deprivative
+deprive
+deprivement
+depriver
+deprovincialize
+depside
+depth
+depthen
+depthing
+depthless
+depthometer
+depthwise
+depullulation
+depurant
+depurate
+depuration
+depurative
+depurator
+depuratory
+depursement
+deputable
+deputation
+deputational
+deputationist
+deputationize
+deputative
+deputatively
+deputator
+depute
+deputize
+deputy
+deputyship
+dequeen
+derabbinize
+deracialize
+deracinate
+deracination
+deradelphus
+deradenitis
+deradenoncus
+derah
+deraign
+derail
+derailer
+derailment
+derange
+derangeable
+deranged
+derangement
+deranger
+derat
+derate
+derater
+derationalization
+derationalize
+deratization
+deray
+Derbend
+Derby
+derby
+derbylite
+dere
+deregister
+deregulationize
+dereism
+dereistic
+dereistically
+Derek
+derelict
+dereliction
+derelictly
+derelictness
+dereligion
+dereligionize
+derencephalocele
+derencephalus
+deresinate
+deresinize
+deric
+deride
+derider
+deridingly
+Deringa
+Deripia
+derisible
+derision
+derisive
+derisively
+derisiveness
+derisory
+derivability
+derivable
+derivably
+derival
+derivant
+derivate
+derivately
+derivation
+derivational
+derivationally
+derivationist
+derivatist
+derivative
+derivatively
+derivativeness
+derive
+derived
+derivedly
+derivedness
+deriver
+derm
+derma
+Dermacentor
+dermad
+dermahemia
+dermal
+dermalgia
+dermalith
+dermamyiasis
+dermanaplasty
+dermapostasis
+Dermaptera
+dermapteran
+dermapterous
+dermaskeleton
+dermasurgery
+dermatagra
+dermatalgia
+dermataneuria
+dermatatrophia
+dermatauxe
+dermathemia
+dermatic
+dermatine
+dermatitis
+Dermatobia
+dermatocele
+dermatocellulitis
+dermatoconiosis
+Dermatocoptes
+dermatocoptic
+dermatocyst
+dermatodynia
+dermatogen
+dermatoglyphics
+dermatograph
+dermatographia
+dermatography
+dermatoheteroplasty
+dermatoid
+dermatological
+dermatologist
+dermatology
+dermatolysis
+dermatoma
+dermatome
+dermatomere
+dermatomic
+dermatomuscular
+dermatomyces
+dermatomycosis
+dermatomyoma
+dermatoneural
+dermatoneurology
+dermatoneurosis
+dermatonosus
+dermatopathia
+dermatopathic
+dermatopathology
+dermatopathophobia
+Dermatophagus
+dermatophobia
+dermatophone
+dermatophony
+dermatophyte
+dermatophytic
+dermatophytosis
+dermatoplasm
+dermatoplast
+dermatoplastic
+dermatoplasty
+dermatopnagic
+dermatopsy
+Dermatoptera
+dermatoptic
+dermatorrhagia
+dermatorrhea
+dermatorrhoea
+dermatosclerosis
+dermatoscopy
+dermatosis
+dermatoskeleton
+dermatotherapy
+dermatotome
+dermatotomy
+dermatotropic
+dermatoxerasia
+dermatozoon
+dermatozoonosis
+dermatrophia
+dermatrophy
+dermenchysis
+Dermestes
+dermestid
+Dermestidae
+dermestoid
+dermic
+dermis
+dermitis
+dermoblast
+Dermobranchia
+dermobranchiata
+dermobranchiate
+Dermochelys
+dermochrome
+dermococcus
+dermogastric
+dermographia
+dermographic
+dermographism
+dermography
+dermohemal
+dermohemia
+dermohumeral
+dermoid
+dermoidal
+dermoidectomy
+dermol
+dermolysis
+dermomuscular
+dermomycosis
+dermoneural
+dermoneurosis
+dermonosology
+dermoosseous
+dermoossification
+dermopathic
+dermopathy
+dermophlebitis
+dermophobe
+dermophyte
+dermophytic
+dermoplasty
+Dermoptera
+dermopteran
+dermopterous
+dermoreaction
+Dermorhynchi
+dermorhynchous
+dermosclerite
+dermoskeletal
+dermoskeleton
+dermostenosis
+dermostosis
+dermosynovitis
+dermotropic
+dermovaccine
+dermutation
+dern
+dernier
+derodidymus
+derogate
+derogately
+derogation
+derogative
+derogatively
+derogator
+derogatorily
+derogatoriness
+derogatory
+Derotrema
+Derotremata
+derotremate
+derotrematous
+derotreme
+derout
+Derrick
+derrick
+derricking
+derrickman
+derride
+derries
+derringer
+Derris
+derry
+dertrotheca
+dertrum
+deruinate
+deruralize
+derust
+dervish
+dervishhood
+dervishism
+dervishlike
+desaccharification
+desacralization
+desacralize
+desalt
+desamidization
+desand
+desaturate
+desaturation
+desaurin
+descale
+descant
+descanter
+descantist
+descend
+descendable
+descendance
+descendant
+descendence
+descendent
+descendental
+descendentalism
+descendentalist
+descendentalistic
+descender
+descendibility
+descendible
+descending
+descendingly
+descension
+descensional
+descensionist
+descensive
+descent
+Deschampsia
+descloizite
+descort
+describability
+describable
+describably
+describe
+describer
+descrier
+descript
+description
+descriptionist
+descriptionless
+descriptive
+descriptively
+descriptiveness
+descriptory
+descrive
+descry
+deseasonalize
+desecrate
+desecrater
+desecration
+desectionalize
+deseed
+desegmentation
+desegmented
+desensitization
+desensitize
+desensitizer
+desentimentalize
+deseret
+desert
+deserted
+desertedly
+desertedness
+deserter
+desertful
+desertfully
+desertic
+deserticolous
+desertion
+desertism
+desertless
+desertlessly
+desertlike
+desertness
+desertress
+desertrice
+desertward
+deserve
+deserved
+deservedly
+deservedness
+deserveless
+deserver
+deserving
+deservingly
+deservingness
+desex
+desexualization
+desexualize
+deshabille
+desi
+desiccant
+desiccate
+desiccation
+desiccative
+desiccator
+desiccatory
+desiderant
+desiderata
+desiderate
+desideration
+desiderative
+desideratum
+desight
+desightment
+design
+designable
+designate
+designation
+designative
+designator
+designatory
+designatum
+designed
+designedly
+designedness
+designee
+designer
+designful
+designfully
+designfulness
+designing
+designingly
+designless
+designlessly
+designlessness
+desilicate
+desilicification
+desilicify
+desiliconization
+desiliconize
+desilver
+desilverization
+desilverize
+desilverizer
+desinence
+desinent
+desiodothyroxine
+desipience
+desipiency
+desipient
+desirability
+desirable
+desirableness
+desirably
+desire
+desired
+desiredly
+desiredness
+desireful
+desirefulness
+desireless
+desirer
+desiringly
+desirous
+desirously
+desirousness
+desist
+desistance
+desistive
+desition
+desize
+desk
+desklike
+deslime
+desma
+desmachymatous
+desmachyme
+desmacyte
+desman
+Desmanthus
+Desmarestia
+Desmarestiaceae
+desmarestiaceous
+Desmatippus
+desmectasia
+desmepithelium
+desmic
+desmid
+Desmidiaceae
+desmidiaceous
+Desmidiales
+desmidiologist
+desmidiology
+desmine
+desmitis
+desmocyte
+desmocytoma
+Desmodactyli
+Desmodium
+desmodont
+Desmodontidae
+Desmodus
+desmodynia
+desmogen
+desmogenous
+Desmognathae
+desmognathism
+desmognathous
+desmography
+desmohemoblast
+desmoid
+desmology
+desmoma
+Desmomyaria
+desmon
+Desmoncus
+desmoneoplasm
+desmonosology
+desmopathologist
+desmopathology
+desmopathy
+desmopelmous
+desmopexia
+desmopyknosis
+desmorrhexis
+Desmoscolecidae
+Desmoscolex
+desmosis
+desmosite
+Desmothoraca
+desmotomy
+desmotrope
+desmotropic
+desmotropism
+desocialization
+desocialize
+desolate
+desolately
+desolateness
+desolater
+desolating
+desolatingly
+desolation
+desolative
+desonation
+desophisticate
+desophistication
+desorption
+desoxalate
+desoxyanisoin
+desoxybenzoin
+desoxycinchonine
+desoxycorticosterone
+desoxymorphine
+desoxyribonucleic
+despair
+despairer
+despairful
+despairfully
+despairfulness
+despairing
+despairingly
+despairingness
+despecialization
+despecialize
+despecificate
+despecification
+despect
+desperacy
+desperado
+desperadoism
+desperate
+desperately
+desperateness
+desperation
+despicability
+despicable
+despicableness
+despicably
+despiritualization
+despiritualize
+despisable
+despisableness
+despisal
+despise
+despisedness
+despisement
+despiser
+despisingly
+despite
+despiteful
+despitefully
+despitefulness
+despiteous
+despiteously
+despoil
+despoiler
+despoilment
+despoliation
+despond
+despondence
+despondency
+despondent
+despondently
+desponder
+desponding
+despondingly
+despot
+despotat
+Despotes
+despotic
+despotically
+despoticalness
+despoticly
+despotism
+despotist
+despotize
+despumate
+despumation
+desquamate
+desquamation
+desquamative
+desquamatory
+dess
+dessa
+dessert
+dessertspoon
+dessertspoonful
+dessiatine
+dessil
+destabilize
+destain
+destandardize
+desterilization
+desterilize
+destinate
+destination
+destine
+destinezite
+destinism
+destinist
+destiny
+destitute
+destitutely
+destituteness
+destitution
+destour
+destress
+destrier
+destroy
+destroyable
+destroyer
+destroyingly
+destructibility
+destructible
+destructibleness
+destruction
+destructional
+destructionism
+destructionist
+destructive
+destructively
+destructiveness
+destructivism
+destructivity
+destructor
+destructuralize
+desubstantiate
+desucration
+desuete
+desuetude
+desugar
+desugarize
+Desulfovibrio
+desulphur
+desulphurate
+desulphuration
+desulphurization
+desulphurize
+desulphurizer
+desultor
+desultorily
+desultoriness
+desultorious
+desultory
+desuperheater
+desyatin
+desyl
+desynapsis
+desynaptic
+desynonymization
+desynonymize
+detach
+detachability
+detachable
+detachableness
+detachably
+detached
+detachedly
+detachedness
+detacher
+detachment
+detail
+detailed
+detailedly
+detailedness
+detailer
+detailism
+detailist
+detain
+detainable
+detainal
+detainer
+detainingly
+detainment
+detar
+detassel
+detax
+detect
+detectability
+detectable
+detectably
+detectaphone
+detecter
+detectible
+detection
+detective
+detectivism
+detector
+detenant
+detent
+detention
+detentive
+deter
+deterge
+detergence
+detergency
+detergent
+detergible
+deteriorate
+deterioration
+deteriorationist
+deteriorative
+deteriorator
+deteriorism
+deteriority
+determent
+determinability
+determinable
+determinableness
+determinably
+determinacy
+determinant
+determinantal
+determinate
+determinately
+determinateness
+determination
+determinative
+determinatively
+determinativeness
+determinator
+determine
+determined
+determinedly
+determinedness
+determiner
+determinism
+determinist
+deterministic
+determinoid
+deterrence
+deterrent
+detersion
+detersive
+detersively
+detersiveness
+detest
+detestability
+detestable
+detestableness
+detestably
+detestation
+detester
+dethronable
+dethrone
+dethronement
+dethroner
+dethyroidism
+detin
+detinet
+detinue
+detonable
+detonate
+detonation
+detonative
+detonator
+detorsion
+detour
+detoxicant
+detoxicate
+detoxication
+detoxicator
+detoxification
+detoxify
+detract
+detracter
+detractingly
+detraction
+detractive
+detractively
+detractiveness
+detractor
+detractory
+detractress
+detrain
+detrainment
+detribalization
+detribalize
+detriment
+detrimental
+detrimentality
+detrimentally
+detrimentalness
+detrital
+detrited
+detrition
+detritus
+Detroiter
+detrude
+detruncate
+detruncation
+detrusion
+detrusive
+detrusor
+detubation
+detumescence
+detune
+detur
+deuce
+deuced
+deucedly
+deul
+deurbanize
+deutencephalic
+deutencephalon
+deuteragonist
+deuteranomal
+deuteranomalous
+deuteranope
+deuteranopia
+deuteranopic
+deuteric
+deuteride
+deuterium
+deuteroalbumose
+deuterocanonical
+deuterocasease
+deuterocone
+deuteroconid
+deuterodome
+deuteroelastose
+deuterofibrinose
+deuterogamist
+deuterogamy
+deuterogelatose
+deuterogenic
+deuteroglobulose
+deuteromorphic
+Deuteromycetes
+deuteromyosinose
+deuteron
+Deuteronomic
+Deuteronomical
+Deuteronomist
+Deuteronomistic
+Deuteronomy
+deuteropathic
+deuteropathy
+deuteroplasm
+deuteroprism
+deuteroproteose
+deuteroscopic
+deuteroscopy
+deuterostoma
+Deuterostomata
+deuterostomatous
+deuterotokous
+deuterotoky
+deuterotype
+deuterovitellose
+deuterozooid
+deutobromide
+deutocarbonate
+deutochloride
+deutomala
+deutomalal
+deutomalar
+deutomerite
+deuton
+deutonephron
+deutonymph
+deutonymphal
+deutoplasm
+deutoplasmic
+deutoplastic
+deutoscolex
+deutoxide
+Deutzia
+dev
+deva
+devachan
+devadasi
+devall
+devaloka
+devalorize
+devaluate
+devaluation
+devalue
+devance
+devaporate
+devaporation
+devast
+devastate
+devastating
+devastatingly
+devastation
+devastative
+devastator
+devastavit
+devaster
+devata
+develin
+develop
+developability
+developable
+developedness
+developer
+developist
+development
+developmental
+developmentalist
+developmentally
+developmentarian
+developmentary
+developmentist
+developoid
+devertebrated
+devest
+deviability
+deviable
+deviancy
+deviant
+deviate
+deviation
+deviationism
+deviationist
+deviative
+deviator
+deviatory
+device
+deviceful
+devicefully
+devicefulness
+devil
+devilbird
+devildom
+deviled
+deviler
+deviless
+devilet
+devilfish
+devilhood
+deviling
+devilish
+devilishly
+devilishness
+devilism
+devilize
+devilkin
+devillike
+devilman
+devilment
+devilmonger
+devilry
+devilship
+deviltry
+devilward
+devilwise
+devilwood
+devily
+devious
+deviously
+deviousness
+devirginate
+devirgination
+devirginator
+devirilize
+devisable
+devisal
+deviscerate
+devisceration
+devise
+devisee
+deviser
+devisor
+devitalization
+devitalize
+devitalized
+devitaminize
+devitrification
+devitrify
+devocalization
+devocalize
+devoice
+devoid
+devoir
+devolatilize
+devolute
+devolution
+devolutionary
+devolutionist
+devolve
+devolvement
+Devon
+Devonian
+Devonic
+devonite
+devonport
+devonshire
+devorative
+devote
+devoted
+devotedly
+devotedness
+devotee
+devoteeism
+devotement
+devoter
+devotion
+devotional
+devotionalism
+devotionalist
+devotionality
+devotionally
+devotionalness
+devotionate
+devotionist
+devour
+devourable
+devourer
+devouress
+devouring
+devouringly
+devouringness
+devourment
+devout
+devoutless
+devoutlessly
+devoutlessness
+devoutly
+devoutness
+devow
+devulcanization
+devulcanize
+devulgarize
+devvel
+dew
+dewan
+dewanee
+dewanship
+dewater
+dewaterer
+dewax
+dewbeam
+dewberry
+dewclaw
+dewclawed
+dewcup
+dewdamp
+dewdrop
+dewdropper
+dewer
+Dewey
+deweylite
+dewfall
+dewflower
+dewily
+dewiness
+dewlap
+dewlapped
+dewless
+dewlight
+dewlike
+dewool
+deworm
+dewret
+dewtry
+dewworm
+dewy
+dexiocardia
+dexiotrope
+dexiotropic
+dexiotropism
+dexiotropous
+Dexter
+dexter
+dexterical
+dexterity
+dexterous
+dexterously
+dexterousness
+dextrad
+dextral
+dextrality
+dextrally
+dextran
+dextraural
+dextrin
+dextrinase
+dextrinate
+dextrinize
+dextrinous
+dextro
+dextroaural
+dextrocardia
+dextrocardial
+dextrocerebral
+dextrocular
+dextrocularity
+dextroduction
+dextroglucose
+dextrogyrate
+dextrogyration
+dextrogyratory
+dextrogyrous
+dextrolactic
+dextrolimonene
+dextropinene
+dextrorotary
+dextrorotatary
+dextrorotation
+dextrorsal
+dextrorse
+dextrorsely
+dextrosazone
+dextrose
+dextrosinistral
+dextrosinistrally
+dextrosuria
+dextrotartaric
+dextrotropic
+dextrotropous
+dextrous
+dextrously
+dextrousness
+dextroversion
+dey
+deyhouse
+deyship
+deywoman
+Dezaley
+dezinc
+dezincation
+dezincification
+dezincify
+dezymotize
+dha
+dhabb
+dhai
+dhak
+dhamnoo
+dhan
+dhangar
+dhanuk
+dhanush
+Dhanvantari
+dharana
+dharani
+dharma
+dharmakaya
+dharmashastra
+dharmasmriti
+dharmasutra
+dharmsala
+dharna
+dhaura
+dhauri
+dhava
+dhaw
+Dheneb
+dheri
+dhobi
+dhole
+dhoni
+dhoon
+dhoti
+dhoul
+dhow
+Dhritarashtra
+dhu
+dhunchee
+dhunchi
+Dhundia
+dhurra
+dhyal
+dhyana
+di
+diabase
+diabasic
+diabetes
+diabetic
+diabetogenic
+diabetogenous
+diabetometer
+diablerie
+diabolarch
+diabolarchy
+diabolatry
+diabolepsy
+diaboleptic
+diabolic
+diabolical
+diabolically
+diabolicalness
+diabolification
+diabolify
+diabolism
+diabolist
+diabolization
+diabolize
+diabological
+diabology
+diabolology
+diabrosis
+diabrotic
+Diabrotica
+diacanthous
+diacaustic
+diacetamide
+diacetate
+diacetic
+diacetin
+diacetine
+diacetonuria
+diaceturia
+diacetyl
+diacetylene
+diachoretic
+diachronic
+diachylon
+diachylum
+diacid
+diacipiperazine
+diaclase
+diaclasis
+diaclastic
+diacle
+diaclinal
+diacodion
+diacoele
+diacoelia
+diaconal
+diaconate
+diaconia
+diaconicon
+diaconicum
+diacope
+diacranterian
+diacranteric
+diacrisis
+diacritic
+diacritical
+diacritically
+Diacromyodi
+diacromyodian
+diact
+diactin
+diactinal
+diactinic
+diactinism
+Diadelphia
+diadelphian
+diadelphic
+diadelphous
+diadem
+Diadema
+Diadematoida
+diaderm
+diadermic
+diadoche
+Diadochi
+Diadochian
+diadochite
+diadochokinesia
+diadochokinetic
+diadromous
+diadumenus
+diaene
+diaereses
+diaeresis
+diaeretic
+diaetetae
+diagenesis
+diagenetic
+diageotropic
+diageotropism
+diaglyph
+diaglyphic
+diagnosable
+diagnose
+diagnoseable
+diagnoses
+diagnosis
+diagnostic
+diagnostically
+diagnosticate
+diagnostication
+diagnostician
+diagnostics
+diagometer
+diagonal
+diagonality
+diagonalize
+diagonally
+diagonalwise
+diagonic
+diagram
+diagrammatic
+diagrammatical
+diagrammatician
+diagrammatize
+diagrammeter
+diagrammitically
+diagraph
+diagraphic
+diagraphical
+diagraphics
+diagredium
+diagrydium
+Diaguitas
+Diaguite
+diaheliotropic
+diaheliotropically
+diaheliotropism
+diakinesis
+dial
+dialcohol
+dialdehyde
+dialect
+dialectal
+dialectalize
+dialectally
+dialectic
+dialectical
+dialectically
+dialectician
+dialecticism
+dialecticize
+dialectics
+dialectologer
+dialectological
+dialectologist
+dialectology
+dialector
+dialer
+dialin
+dialing
+dialist
+Dialister
+dialkyl
+dialkylamine
+diallage
+diallagic
+diallagite
+diallagoid
+diallel
+diallelon
+diallelus
+diallyl
+dialogic
+dialogical
+dialogically
+dialogism
+dialogist
+dialogistic
+dialogistical
+dialogistically
+dialogite
+dialogize
+dialogue
+dialoguer
+Dialonian
+dialuric
+dialycarpous
+Dialypetalae
+dialypetalous
+dialyphyllous
+dialysepalous
+dialysis
+dialystaminous
+dialystelic
+dialystely
+dialytic
+dialytically
+dialyzability
+dialyzable
+dialyzate
+dialyzation
+dialyzator
+dialyze
+dialyzer
+diamagnet
+diamagnetic
+diamagnetically
+diamagnetism
+diamantiferous
+diamantine
+diamantoid
+diamb
+diambic
+diamesogamous
+diameter
+diametral
+diametrally
+diametric
+diametrical
+diametrically
+diamicton
+diamide
+diamidogen
+diamine
+diaminogen
+diaminogene
+diammine
+diamminobromide
+diamminonitrate
+diammonium
+diamond
+diamondback
+diamonded
+diamondiferous
+diamondize
+diamondlike
+diamondwise
+diamondwork
+diamorphine
+diamylose
+Dian
+dian
+Diana
+Diancecht
+diander
+Diandria
+diandrian
+diandrous
+Diane
+dianetics
+Dianil
+dianilid
+dianilide
+dianisidin
+dianisidine
+dianite
+dianodal
+dianoetic
+dianoetical
+dianoetically
+Dianthaceae
+Dianthera
+Dianthus
+diapalma
+diapase
+diapasm
+diapason
+diapasonal
+diapause
+diapedesis
+diapedetic
+Diapensia
+Diapensiaceae
+diapensiaceous
+diapente
+diaper
+diapering
+diaphane
+diaphaneity
+diaphanie
+diaphanometer
+diaphanometric
+diaphanometry
+diaphanoscope
+diaphanoscopy
+diaphanotype
+diaphanous
+diaphanously
+diaphanousness
+diaphany
+diaphone
+diaphonia
+diaphonic
+diaphonical
+diaphony
+diaphoresis
+diaphoretic
+diaphoretical
+diaphorite
+diaphote
+diaphototropic
+diaphototropism
+diaphragm
+diaphragmal
+diaphragmatic
+diaphragmatically
+diaphtherin
+diaphysial
+diaphysis
+diaplasma
+diaplex
+diaplexal
+diaplexus
+diapnoic
+diapnotic
+diapophysial
+diapophysis
+Diaporthe
+diapositive
+diapsid
+Diapsida
+diapsidan
+diapyesis
+diapyetic
+diarch
+diarchial
+diarchic
+diarchy
+diarhemia
+diarial
+diarian
+diarist
+diaristic
+diarize
+diarrhea
+diarrheal
+diarrheic
+diarrhetic
+diarsenide
+diarthric
+diarthrodial
+diarthrosis
+diarticular
+diary
+diaschisis
+diaschisma
+diaschistic
+Diascia
+diascope
+diascopy
+diascord
+diascordium
+diaskeuasis
+diaskeuast
+Diaspidinae
+diaspidine
+Diaspinae
+diaspine
+diaspirin
+Diaspora
+diaspore
+diastaltic
+diastase
+diastasic
+diastasimetry
+diastasis
+diastataxic
+diastataxy
+diastatic
+diastatically
+diastem
+diastema
+diastematic
+diastematomyelia
+diaster
+diastole
+diastolic
+diastomatic
+diastral
+diastrophe
+diastrophic
+diastrophism
+diastrophy
+diasynthesis
+diasyrm
+diatessaron
+diathermacy
+diathermal
+diathermancy
+diathermaneity
+diathermanous
+diathermic
+diathermize
+diathermometer
+diathermotherapy
+diathermous
+diathermy
+diathesic
+diathesis
+diathetic
+diatom
+Diatoma
+Diatomaceae
+diatomacean
+diatomaceoid
+diatomaceous
+Diatomales
+Diatomeae
+diatomean
+diatomic
+diatomicity
+diatomiferous
+diatomin
+diatomist
+diatomite
+diatomous
+diatonic
+diatonical
+diatonically
+diatonous
+diatoric
+diatreme
+diatribe
+diatribist
+diatropic
+diatropism
+Diatryma
+Diatrymiformes
+Diau
+diaulic
+diaulos
+diaxial
+diaxon
+diazenithal
+diazeuctic
+diazeuxis
+diazide
+diazine
+diazoamine
+diazoamino
+diazoaminobenzene
+diazoanhydride
+diazoate
+diazobenzene
+diazohydroxide
+diazoic
+diazoimide
+diazoimido
+diazole
+diazoma
+diazomethane
+diazonium
+diazotate
+diazotic
+diazotizability
+diazotizable
+diazotization
+diazotize
+diazotype
+dib
+dibase
+dibasic
+dibasicity
+dibatag
+Dibatis
+dibber
+dibble
+dibbler
+dibbuk
+dibenzophenazine
+dibenzopyrrole
+dibenzoyl
+dibenzyl
+dibhole
+diblastula
+diborate
+Dibothriocephalus
+dibrach
+dibranch
+Dibranchia
+Dibranchiata
+dibranchiate
+dibranchious
+dibrom
+dibromid
+dibromide
+dibromoacetaldehyde
+dibromobenzene
+dibs
+dibstone
+dibutyrate
+dibutyrin
+dicacodyl
+Dicaeidae
+dicaeology
+dicalcic
+dicalcium
+dicarbonate
+dicarbonic
+dicarboxylate
+dicarboxylic
+dicarpellary
+dicaryon
+dicaryophase
+dicaryophyte
+dicaryotic
+dicast
+dicastery
+dicastic
+dicatalectic
+dicatalexis
+Diccon
+dice
+diceboard
+dicebox
+dicecup
+dicellate
+diceman
+Dicentra
+dicentrine
+dicephalism
+dicephalous
+dicephalus
+diceplay
+dicer
+Diceras
+Diceratidae
+dicerion
+dicerous
+dicetyl
+dich
+Dichapetalaceae
+Dichapetalum
+dichas
+dichasial
+dichasium
+dichastic
+Dichelyma
+dichlamydeous
+dichloramine
+dichlorhydrin
+dichloride
+dichloroacetic
+dichlorohydrin
+dichloromethane
+dichocarpism
+dichocarpous
+dichogamous
+dichogamy
+Dichondra
+Dichondraceae
+dichopodial
+dichoptic
+dichord
+dichoree
+Dichorisandra
+dichotic
+dichotomal
+dichotomic
+dichotomically
+dichotomist
+dichotomistic
+dichotomization
+dichotomize
+dichotomous
+dichotomously
+dichotomy
+dichroic
+dichroiscope
+dichroism
+dichroite
+dichroitic
+dichromasy
+dichromat
+dichromate
+dichromatic
+dichromatism
+dichromic
+dichromism
+dichronous
+dichrooscope
+dichroous
+dichroscope
+dichroscopic
+Dichter
+dicing
+Dick
+dick
+dickcissel
+dickens
+Dickensian
+Dickensiana
+dicker
+dickey
+dickeybird
+dickinsonite
+Dicksonia
+dicky
+Diclidantheraceae
+diclinic
+diclinism
+diclinous
+Diclytra
+dicoccous
+dicodeine
+dicoelious
+dicolic
+dicolon
+dicondylian
+dicot
+dicotyl
+dicotyledon
+dicotyledonary
+Dicotyledones
+dicotyledonous
+Dicotyles
+Dicotylidae
+dicotylous
+dicoumarin
+Dicranaceae
+dicranaceous
+dicranoid
+dicranterian
+Dicranum
+Dicrostonyx
+dicrotal
+dicrotic
+dicrotism
+dicrotous
+Dicruridae
+dicta
+Dictaen
+Dictamnus
+Dictaphone
+dictate
+dictatingly
+dictation
+dictational
+dictative
+dictator
+dictatorial
+dictatorialism
+dictatorially
+dictatorialness
+dictatorship
+dictatory
+dictatress
+dictatrix
+dictature
+dictic
+diction
+dictionary
+Dictograph
+dictum
+dictynid
+Dictynidae
+Dictyoceratina
+dictyoceratine
+dictyodromous
+dictyogen
+dictyogenous
+Dictyograptus
+dictyoid
+Dictyonema
+Dictyonina
+dictyonine
+Dictyophora
+dictyopteran
+Dictyopteris
+Dictyosiphon
+Dictyosiphonaceae
+dictyosiphonaceous
+dictyosome
+dictyostele
+dictyostelic
+Dictyota
+Dictyotaceae
+dictyotaceous
+Dictyotales
+dictyotic
+Dictyoxylon
+dicyanide
+dicyanine
+dicyanodiamide
+dicyanogen
+dicycle
+dicyclic
+Dicyclica
+dicyclist
+Dicyema
+Dicyemata
+dicyemid
+Dicyemida
+Dicyemidae
+Dicynodon
+dicynodont
+Dicynodontia
+Dicynodontidae
+did
+Didache
+Didachist
+didactic
+didactical
+didacticality
+didactically
+didactician
+didacticism
+didacticity
+didactics
+didactive
+didactyl
+didactylism
+didactylous
+didapper
+didascalar
+didascaliae
+didascalic
+didascalos
+didascaly
+didder
+diddle
+diddler
+diddy
+didelph
+Didelphia
+didelphian
+didelphic
+didelphid
+Didelphidae
+didelphine
+Didelphis
+didelphoid
+didelphous
+Didelphyidae
+didepsid
+didepside
+Dididae
+didie
+didine
+Didinium
+didle
+didna
+didnt
+Dido
+didodecahedral
+didodecahedron
+didrachma
+didrachmal
+didromy
+didst
+diductor
+Didunculidae
+Didunculinae
+Didunculus
+Didus
+didym
+didymate
+didymia
+didymitis
+didymium
+didymoid
+didymolite
+didymous
+didymus
+Didynamia
+didynamian
+didynamic
+didynamous
+didynamy
+die
+dieb
+dieback
+diectasis
+diedral
+diedric
+Dieffenbachia
+Diego
+Diegueno
+diehard
+dielectric
+dielectrically
+dielike
+Dielytra
+diem
+diemaker
+diemaking
+diencephalic
+diencephalon
+diene
+dier
+Dieri
+Diervilla
+diesel
+dieselization
+dieselize
+diesinker
+diesinking
+diesis
+diestock
+diet
+dietal
+dietarian
+dietary
+Dieter
+dieter
+dietetic
+dietetically
+dietetics
+dietetist
+diethanolamine
+diethyl
+diethylamine
+diethylenediamine
+diethylstilbestrol
+dietic
+dietician
+dietics
+dietine
+dietist
+dietitian
+dietotherapeutics
+dietotherapy
+dietotoxic
+dietotoxicity
+dietrichite
+dietzeite
+diewise
+Dieyerie
+diezeugmenon
+Difda
+diferrion
+diffame
+diffarreation
+differ
+difference
+differencingly
+different
+differentia
+differentiable
+differential
+differentialize
+differentially
+differentiant
+differentiate
+differentiation
+differentiator
+differently
+differentness
+differingly
+difficile
+difficileness
+difficult
+difficultly
+difficultness
+difficulty
+diffidation
+diffide
+diffidence
+diffident
+diffidently
+diffidentness
+diffinity
+diffluence
+diffluent
+Difflugia
+difform
+difformed
+difformity
+diffract
+diffraction
+diffractive
+diffractively
+diffractiveness
+diffractometer
+diffrangibility
+diffrangible
+diffugient
+diffusate
+diffuse
+diffused
+diffusedly
+diffusely
+diffuseness
+diffuser
+diffusibility
+diffusible
+diffusibleness
+diffusibly
+diffusimeter
+diffusiometer
+diffusion
+diffusionism
+diffusionist
+diffusive
+diffusively
+diffusiveness
+diffusivity
+diffusor
+diformin
+dig
+digallate
+digallic
+digametic
+digamist
+digamma
+digammated
+digammic
+digamous
+digamy
+digastric
+Digenea
+digeneous
+digenesis
+digenetic
+Digenetica
+digenic
+digenous
+digeny
+digerent
+digest
+digestant
+digested
+digestedly
+digestedness
+digester
+digestibility
+digestible
+digestibleness
+digestibly
+digestion
+digestional
+digestive
+digestively
+digestiveness
+digestment
+diggable
+digger
+digging
+diggings
+dight
+dighter
+digit
+digital
+digitalein
+digitalin
+digitalis
+digitalism
+digitalization
+digitalize
+digitally
+Digitaria
+digitate
+digitated
+digitately
+digitation
+digitiform
+Digitigrada
+digitigrade
+digitigradism
+digitinervate
+digitinerved
+digitipinnate
+digitize
+digitizer
+digitogenin
+digitonin
+digitoplantar
+digitorium
+digitoxin
+digitoxose
+digitule
+digitus
+digladiate
+digladiation
+digladiator
+diglossia
+diglot
+diglottic
+diglottism
+diglottist
+diglucoside
+diglyceride
+diglyph
+diglyphic
+digmeat
+dignification
+dignified
+dignifiedly
+dignifiedness
+dignify
+dignitarial
+dignitarian
+dignitary
+dignity
+digoneutic
+digoneutism
+digonoporous
+digonous
+Digor
+digram
+digraph
+digraphic
+digredience
+digrediency
+digredient
+digress
+digressingly
+digression
+digressional
+digressionary
+digressive
+digressively
+digressiveness
+digressory
+digs
+diguanide
+Digynia
+digynian
+digynous
+dihalide
+dihalo
+dihalogen
+dihedral
+dihedron
+dihexagonal
+dihexahedral
+dihexahedron
+dihybrid
+dihybridism
+dihydrate
+dihydrated
+dihydrazone
+dihydric
+dihydride
+dihydrite
+dihydrocupreine
+dihydrocuprin
+dihydrogen
+dihydrol
+dihydronaphthalene
+dihydronicotine
+dihydrotachysterol
+dihydroxy
+dihydroxysuccinic
+dihydroxytoluene
+dihysteria
+diiamb
+diiambus
+diiodide
+diiodo
+diiodoform
+diipenates
+Diipolia
+diisatogen
+dijudicate
+dijudication
+dika
+dikage
+dikamali
+dikaryon
+dikaryophase
+dikaryophasic
+dikaryophyte
+dikaryophytic
+dikaryotic
+Dike
+dike
+dikegrave
+dikelocephalid
+Dikelocephalus
+diker
+dikereeve
+dikeside
+diketo
+diketone
+dikkop
+diktyonite
+dilacerate
+dilaceration
+dilambdodont
+dilamination
+Dilantin
+dilapidate
+dilapidated
+dilapidation
+dilapidator
+dilatability
+dilatable
+dilatableness
+dilatably
+dilatancy
+dilatant
+dilatate
+dilatation
+dilatative
+dilatator
+dilatatory
+dilate
+dilated
+dilatedly
+dilatedness
+dilater
+dilatingly
+dilation
+dilative
+dilatometer
+dilatometric
+dilatometry
+dilator
+dilatorily
+dilatoriness
+dilatory
+dildo
+dilection
+Dilemi
+Dilemite
+dilemma
+dilemmatic
+dilemmatical
+dilemmatically
+dilettant
+dilettante
+dilettanteish
+dilettanteism
+dilettanteship
+dilettanti
+dilettantish
+dilettantism
+dilettantist
+diligence
+diligency
+diligent
+diligentia
+diligently
+diligentness
+dilker
+dill
+Dillenia
+Dilleniaceae
+dilleniaceous
+dilleniad
+dilli
+dillier
+dilligrout
+dilling
+dillseed
+dillue
+dilluer
+dillweed
+dilly
+dillydallier
+dillydally
+dillyman
+dilo
+dilogy
+diluent
+dilute
+diluted
+dilutedly
+dilutedness
+dilutee
+dilutely
+diluteness
+dilutent
+diluter
+dilution
+dilutive
+dilutor
+diluvia
+diluvial
+diluvialist
+diluvian
+diluvianism
+diluvion
+diluvium
+dim
+dimagnesic
+dimanganion
+dimanganous
+Dimaris
+dimastigate
+Dimatis
+dimber
+dimberdamber
+dimble
+dime
+dimensible
+dimension
+dimensional
+dimensionality
+dimensionally
+dimensioned
+dimensionless
+dimensive
+dimer
+Dimera
+dimeran
+dimercuric
+dimercurion
+dimercury
+dimeric
+dimeride
+dimerism
+dimerization
+dimerlie
+dimerous
+dimetallic
+dimeter
+dimethoxy
+dimethyl
+dimethylamine
+dimethylamino
+dimethylaniline
+dimethylbenzene
+dimetria
+dimetric
+Dimetry
+dimication
+dimidiate
+dimidiation
+diminish
+diminishable
+diminishableness
+diminisher
+diminishingly
+diminishment
+diminuendo
+diminutal
+diminute
+diminution
+diminutival
+diminutive
+diminutively
+diminutiveness
+diminutivize
+dimiss
+dimission
+dimissorial
+dimissory
+dimit
+Dimitry
+Dimittis
+dimity
+dimly
+dimmed
+dimmedness
+dimmer
+dimmest
+dimmet
+dimmish
+Dimna
+dimness
+dimolecular
+dimoric
+dimorph
+dimorphic
+dimorphism
+Dimorphotheca
+dimorphous
+dimple
+dimplement
+dimply
+dimps
+dimpsy
+Dimyaria
+dimyarian
+dimyaric
+din
+Dinah
+dinamode
+Dinantian
+dinaphthyl
+dinar
+Dinaric
+Dinarzade
+dinder
+dindle
+Dindymene
+Dindymus
+dine
+diner
+dinergate
+dineric
+dinero
+dinette
+dineuric
+ding
+dingar
+dingbat
+dingdong
+dinge
+dingee
+dinghee
+dinghy
+dingily
+dinginess
+dingle
+dingleberry
+dinglebird
+dingledangle
+dingly
+dingmaul
+dingo
+dingus
+Dingwall
+dingy
+dinheiro
+dinic
+dinical
+Dinichthys
+dining
+dinitrate
+dinitril
+dinitrile
+dinitro
+dinitrobenzene
+dinitrocellulose
+dinitrophenol
+dinitrotoluene
+dink
+Dinka
+dinkey
+dinkum
+dinky
+dinmont
+dinner
+dinnerless
+dinnerly
+dinnertime
+dinnerware
+dinnery
+Dinobryon
+Dinoceras
+Dinocerata
+dinoceratan
+dinoceratid
+Dinoceratidae
+Dinoflagellata
+Dinoflagellatae
+dinoflagellate
+Dinoflagellida
+dinomic
+Dinomys
+Dinophilea
+Dinophilus
+Dinophyceae
+Dinornis
+Dinornithes
+dinornithic
+dinornithid
+Dinornithidae
+Dinornithiformes
+dinornithine
+dinornithoid
+dinosaur
+Dinosauria
+dinosaurian
+dinothere
+Dinotheres
+dinotherian
+Dinotheriidae
+Dinotherium
+dinsome
+dint
+dintless
+dinus
+diobely
+diobol
+diocesan
+diocese
+Diocletian
+dioctahedral
+Dioctophyme
+diode
+Diodia
+Diodon
+diodont
+Diodontidae
+Dioecia
+dioecian
+dioeciodimorphous
+dioeciopolygamous
+dioecious
+dioeciously
+dioeciousness
+dioecism
+dioecy
+dioestrous
+dioestrum
+dioestrus
+Diogenean
+Diogenic
+diogenite
+dioicous
+diol
+diolefin
+diolefinic
+Diomedea
+Diomedeidae
+Dion
+Dionaea
+Dionaeaceae
+Dione
+dionise
+dionym
+dionymal
+Dionysia
+Dionysiac
+Dionysiacal
+Dionysiacally
+Dioon
+Diophantine
+Diopsidae
+diopside
+Diopsis
+dioptase
+diopter
+Dioptidae
+dioptograph
+dioptometer
+dioptometry
+dioptoscopy
+dioptra
+dioptral
+dioptrate
+dioptric
+dioptrical
+dioptrically
+dioptrics
+dioptrometer
+dioptrometry
+dioptroscopy
+dioptry
+diorama
+dioramic
+diordinal
+diorite
+dioritic
+diorthosis
+diorthotic
+Dioscorea
+Dioscoreaceae
+dioscoreaceous
+dioscorein
+dioscorine
+Dioscuri
+Dioscurian
+diose
+Diosma
+diosmin
+diosmose
+diosmosis
+diosmotic
+diosphenol
+Diospyraceae
+diospyraceous
+Diospyros
+diota
+diotic
+Diotocardia
+diovular
+dioxane
+dioxide
+dioxime
+dioxindole
+dioxy
+dip
+Dipala
+diparentum
+dipartite
+dipartition
+dipaschal
+dipentene
+dipeptid
+dipeptide
+dipetalous
+dipetto
+diphase
+diphaser
+diphasic
+diphead
+diphenol
+diphenyl
+diphenylamine
+diphenylchloroarsine
+diphenylene
+diphenylenimide
+diphenylguanidine
+diphenylmethane
+diphenylquinomethane
+diphenylthiourea
+diphosgene
+diphosphate
+diphosphide
+diphosphoric
+diphosphothiamine
+diphrelatic
+diphtheria
+diphtherial
+diphtherian
+diphtheric
+diphtheritic
+diphtheritically
+diphtheritis
+diphtheroid
+diphtheroidal
+diphtherotoxin
+diphthong
+diphthongal
+diphthongalize
+diphthongally
+diphthongation
+diphthongic
+diphthongization
+diphthongize
+diphycercal
+diphycercy
+Diphyes
+diphygenic
+diphyletic
+Diphylla
+Diphylleia
+Diphyllobothrium
+diphyllous
+diphyodont
+diphyozooid
+Diphysite
+Diphysitism
+diphyzooid
+dipicrate
+dipicrylamin
+dipicrylamine
+Diplacanthidae
+Diplacanthus
+diplacusis
+Dipladenia
+diplanar
+diplanetic
+diplanetism
+diplantidian
+diplarthrism
+diplarthrous
+diplasiasmus
+diplasic
+diplasion
+diplegia
+dipleidoscope
+dipleura
+dipleural
+dipleurogenesis
+dipleurogenetic
+diplex
+diplobacillus
+diplobacterium
+diploblastic
+diplocardia
+diplocardiac
+Diplocarpon
+diplocaulescent
+diplocephalous
+diplocephalus
+diplocephaly
+diplochlamydeous
+diplococcal
+diplococcemia
+diplococcic
+diplococcoid
+diplococcus
+diploconical
+diplocoria
+Diplodia
+Diplodocus
+Diplodus
+diploe
+diploetic
+diplogangliate
+diplogenesis
+diplogenetic
+diplogenic
+Diploglossata
+diploglossate
+diplograph
+diplographic
+diplographical
+diplography
+diplohedral
+diplohedron
+diploic
+diploid
+diploidic
+diploidion
+diploidy
+diplois
+diplokaryon
+diploma
+diplomacy
+diplomat
+diplomate
+diplomatic
+diplomatical
+diplomatically
+diplomatics
+diplomatism
+diplomatist
+diplomatize
+diplomatology
+diplomyelia
+diplonema
+diplonephridia
+diploneural
+diplont
+diploperistomic
+diplophase
+diplophyte
+diplopia
+diplopic
+diploplacula
+diploplacular
+diploplaculate
+diplopod
+Diplopoda
+diplopodic
+Diploptera
+diplopterous
+Diplopteryga
+diplopy
+diplosis
+diplosome
+diplosphenal
+diplosphene
+Diplospondyli
+diplospondylic
+diplospondylism
+diplostemonous
+diplostemony
+diplostichous
+Diplotaxis
+diplotegia
+diplotene
+Diplozoon
+diplumbic
+Dipneumona
+Dipneumones
+dipneumonous
+dipneustal
+Dipneusti
+dipnoan
+Dipnoi
+dipnoid
+dipnoous
+dipode
+dipodic
+Dipodidae
+Dipodomyinae
+Dipodomys
+dipody
+dipolar
+dipolarization
+dipolarize
+dipole
+diporpa
+dipotassic
+dipotassium
+dipped
+dipper
+dipperful
+dipping
+diprimary
+diprismatic
+dipropargyl
+dipropyl
+Diprotodon
+diprotodont
+Diprotodontia
+Dipsacaceae
+dipsacaceous
+Dipsaceae
+dipsaceous
+Dipsacus
+Dipsadinae
+dipsas
+dipsetic
+dipsey
+dipsomania
+dipsomaniac
+dipsomaniacal
+Dipsosaurus
+dipsosis
+dipter
+Diptera
+Dipteraceae
+dipteraceous
+dipterad
+dipteral
+dipteran
+dipterist
+dipterocarp
+Dipterocarpaceae
+dipterocarpaceous
+dipterocarpous
+Dipterocarpus
+dipterocecidium
+dipterological
+dipterologist
+dipterology
+dipteron
+dipteros
+dipterous
+Dipteryx
+diptote
+diptych
+Dipus
+dipware
+dipygus
+dipylon
+dipyre
+dipyrenous
+dipyridyl
+Dirca
+Dircaean
+dird
+dirdum
+dire
+direct
+directable
+directed
+directer
+direction
+directional
+directionally
+directionless
+directitude
+directive
+directively
+directiveness
+directivity
+directly
+directness
+Directoire
+director
+directoral
+directorate
+directorial
+directorially
+directorship
+directory
+directress
+directrices
+directrix
+direful
+direfully
+direfulness
+direly
+dirempt
+diremption
+direness
+direption
+dirge
+dirgeful
+dirgelike
+dirgeman
+dirgler
+dirhem
+Dirian
+Dirichletian
+dirigent
+dirigibility
+dirigible
+dirigomotor
+diriment
+Dirk
+dirk
+dirl
+dirndl
+dirt
+dirtbird
+dirtboard
+dirten
+dirtily
+dirtiness
+dirtplate
+dirty
+dis
+Disa
+disability
+disable
+disabled
+disablement
+disabusal
+disabuse
+disacceptance
+disaccharide
+disaccharose
+disaccommodate
+disaccommodation
+disaccord
+disaccordance
+disaccordant
+disaccustom
+disaccustomed
+disaccustomedness
+disacidify
+disacknowledge
+disacknowledgement
+disacquaint
+disacquaintance
+disadjust
+disadorn
+disadvance
+disadvantage
+disadvantageous
+disadvantageously
+disadvantageousness
+disadventure
+disadventurous
+disadvise
+disaffect
+disaffectation
+disaffected
+disaffectedly
+disaffectedness
+disaffection
+disaffectionate
+disaffiliate
+disaffiliation
+disaffirm
+disaffirmance
+disaffirmation
+disaffirmative
+disafforest
+disafforestation
+disafforestment
+disagglomeration
+disaggregate
+disaggregation
+disaggregative
+disagio
+disagree
+disagreeability
+disagreeable
+disagreeableness
+disagreeably
+disagreed
+disagreement
+disagreer
+disalicylide
+disalign
+disalignment
+disalike
+disallow
+disallowable
+disallowableness
+disallowance
+disally
+disamenity
+Disamis
+disanagrammatize
+disanalogous
+disangularize
+disanimal
+disanimate
+disanimation
+disannex
+disannexation
+disannul
+disannuller
+disannulment
+disanoint
+disanswerable
+disapostle
+disapparel
+disappear
+disappearance
+disappearer
+disappearing
+disappoint
+disappointed
+disappointedly
+disappointer
+disappointing
+disappointingly
+disappointingness
+disappointment
+disappreciate
+disappreciation
+disapprobation
+disapprobative
+disapprobatory
+disappropriate
+disappropriation
+disapprovable
+disapproval
+disapprove
+disapprover
+disapprovingly
+disaproned
+disarchbishop
+disarm
+disarmament
+disarmature
+disarmed
+disarmer
+disarming
+disarmingly
+disarrange
+disarrangement
+disarray
+disarticulate
+disarticulation
+disarticulator
+disasinate
+disasinize
+disassemble
+disassembly
+disassimilate
+disassimilation
+disassimilative
+disassociate
+disassociation
+disaster
+disastimeter
+disastrous
+disastrously
+disastrousness
+disattaint
+disattire
+disattune
+disauthenticate
+disauthorize
+disavow
+disavowable
+disavowal
+disavowedly
+disavower
+disavowment
+disawa
+disazo
+disbalance
+disbalancement
+disband
+disbandment
+disbar
+disbark
+disbarment
+disbelief
+disbelieve
+disbeliever
+disbelieving
+disbelievingly
+disbench
+disbenchment
+disbloom
+disbody
+disbosom
+disbowel
+disbrain
+disbranch
+disbud
+disbudder
+disburden
+disburdenment
+disbursable
+disburse
+disbursement
+disburser
+disburthen
+disbury
+disbutton
+disc
+discage
+discal
+discalceate
+discalced
+discanonization
+discanonize
+discanter
+discantus
+discapacitate
+discard
+discardable
+discarder
+discardment
+discarnate
+discarnation
+discase
+discastle
+discept
+disceptation
+disceptator
+discern
+discerner
+discernible
+discernibleness
+discernibly
+discerning
+discerningly
+discernment
+discerp
+discerpibility
+discerpible
+discerpibleness
+discerptibility
+discerptible
+discerptibleness
+discerption
+discharacter
+discharge
+dischargeable
+dischargee
+discharger
+discharging
+discharity
+discharm
+dischase
+Disciflorae
+discifloral
+disciform
+discigerous
+Discina
+discinct
+discinoid
+disciple
+disciplelike
+discipleship
+disciplinability
+disciplinable
+disciplinableness
+disciplinal
+disciplinant
+disciplinarian
+disciplinarianism
+disciplinarily
+disciplinary
+disciplinative
+disciplinatory
+discipline
+discipliner
+discipular
+discircumspection
+discission
+discitis
+disclaim
+disclaimant
+disclaimer
+disclamation
+disclamatory
+disclass
+disclassify
+disclike
+disclimax
+discloister
+disclose
+disclosed
+discloser
+disclosive
+disclosure
+discloud
+discoach
+discoactine
+discoblastic
+discoblastula
+discobolus
+discocarp
+discocarpium
+discocarpous
+discocephalous
+discodactyl
+discodactylous
+discogastrula
+discoglossid
+Discoglossidae
+discoglossoid
+discographical
+discography
+discohexaster
+discoid
+discoidal
+Discoidea
+Discoideae
+discolichen
+discolith
+discolor
+discolorate
+discoloration
+discolored
+discoloredness
+discolorization
+discolorment
+discolourization
+Discomedusae
+discomedusan
+discomedusoid
+discomfit
+discomfiter
+discomfiture
+discomfort
+discomfortable
+discomfortableness
+discomforting
+discomfortingly
+discommend
+discommendable
+discommendableness
+discommendably
+discommendation
+discommender
+discommode
+discommodious
+discommodiously
+discommodiousness
+discommodity
+discommon
+discommons
+discommunity
+discomorula
+discompliance
+discompose
+discomposed
+discomposedly
+discomposedness
+discomposing
+discomposingly
+discomposure
+discomycete
+Discomycetes
+discomycetous
+Disconanthae
+disconanthous
+disconcert
+disconcerted
+disconcertedly
+disconcertedness
+disconcerting
+disconcertingly
+disconcertingness
+disconcertion
+disconcertment
+disconcord
+disconduce
+disconducive
+Disconectae
+disconform
+disconformable
+disconformity
+discongruity
+disconjure
+disconnect
+disconnected
+disconnectedly
+disconnectedness
+disconnecter
+disconnection
+disconnective
+disconnectiveness
+disconnector
+disconsider
+disconsideration
+disconsolate
+disconsolately
+disconsolateness
+disconsolation
+disconsonancy
+disconsonant
+discontent
+discontented
+discontentedly
+discontentedness
+discontentful
+discontenting
+discontentive
+discontentment
+discontiguity
+discontiguous
+discontiguousness
+discontinuable
+discontinuance
+discontinuation
+discontinue
+discontinuee
+discontinuer
+discontinuity
+discontinuor
+discontinuous
+discontinuously
+discontinuousness
+disconula
+disconvenience
+disconvenient
+disconventicle
+discophile
+Discophora
+discophoran
+discophore
+discophorous
+discoplacenta
+discoplacental
+Discoplacentalia
+discoplacentalian
+discoplasm
+discopodous
+discord
+discordance
+discordancy
+discordant
+discordantly
+discordantness
+discordful
+Discordia
+discording
+discorporate
+discorrespondency
+discorrespondent
+discount
+discountable
+discountenance
+discountenancer
+discounter
+discouple
+discourage
+discourageable
+discouragement
+discourager
+discouraging
+discouragingly
+discouragingness
+discourse
+discourseless
+discourser
+discoursive
+discoursively
+discoursiveness
+discourteous
+discourteously
+discourteousness
+discourtesy
+discous
+discovenant
+discover
+discoverability
+discoverable
+discoverably
+discovered
+discoverer
+discovert
+discoverture
+discovery
+discreate
+discreation
+discredence
+discredit
+discreditability
+discreditable
+discreet
+discreetly
+discreetness
+discrepance
+discrepancy
+discrepant
+discrepantly
+discrepate
+discrepation
+discrested
+discrete
+discretely
+discreteness
+discretion
+discretional
+discretionally
+discretionarily
+discretionary
+discretive
+discretively
+discretiveness
+discriminability
+discriminable
+discriminal
+discriminant
+discriminantal
+discriminate
+discriminately
+discriminateness
+discriminating
+discriminatingly
+discrimination
+discriminational
+discriminative
+discriminatively
+discriminator
+discriminatory
+discrown
+disculpate
+disculpation
+disculpatory
+discumber
+discursative
+discursativeness
+discursify
+discursion
+discursive
+discursively
+discursiveness
+discursory
+discursus
+discurtain
+discus
+discuss
+discussable
+discussant
+discusser
+discussible
+discussion
+discussional
+discussionism
+discussionist
+discussive
+discussment
+discutable
+discutient
+disdain
+disdainable
+disdainer
+disdainful
+disdainfully
+disdainfulness
+disdainly
+disdeceive
+disdenominationalize
+disdiaclast
+disdiaclastic
+disdiapason
+disdiazo
+disdiplomatize
+disdodecahedroid
+disdub
+disease
+diseased
+diseasedly
+diseasedness
+diseaseful
+diseasefulness
+disecondary
+disedge
+disedification
+disedify
+diseducate
+diselder
+diselectrification
+diselectrify
+diselenide
+disematism
+disembargo
+disembark
+disembarkation
+disembarkment
+disembarrass
+disembarrassment
+disembattle
+disembed
+disembellish
+disembitter
+disembocation
+disembodiment
+disembody
+disembogue
+disemboguement
+disembosom
+disembowel
+disembowelment
+disembower
+disembroil
+disemburden
+diseme
+disemic
+disemplane
+disemploy
+disemployment
+disempower
+disenable
+disenablement
+disenact
+disenactment
+disenamor
+disenamour
+disenchain
+disenchant
+disenchanter
+disenchantingly
+disenchantment
+disenchantress
+disencharm
+disenclose
+disencumber
+disencumberment
+disencumbrance
+disendow
+disendower
+disendowment
+disenfranchise
+disenfranchisement
+disengage
+disengaged
+disengagedness
+disengagement
+disengirdle
+disenjoy
+disenjoyment
+disenmesh
+disennoble
+disennui
+disenshroud
+disenslave
+disensoul
+disensure
+disentail
+disentailment
+disentangle
+disentanglement
+disentangler
+disenthral
+disenthrall
+disenthrallment
+disenthralment
+disenthrone
+disenthronement
+disentitle
+disentomb
+disentombment
+disentrain
+disentrainment
+disentrammel
+disentrance
+disentrancement
+disentwine
+disenvelop
+disepalous
+disequalize
+disequalizer
+disequilibrate
+disequilibration
+disequilibrium
+disestablish
+disestablisher
+disestablishment
+disestablishmentarian
+disesteem
+disesteemer
+disestimation
+disexcommunicate
+disfaith
+disfame
+disfashion
+disfavor
+disfavorer
+disfeature
+disfeaturement
+disfellowship
+disfen
+disfiguration
+disfigurative
+disfigure
+disfigurement
+disfigurer
+disfiguringly
+disflesh
+disfoliage
+disforest
+disforestation
+disfranchise
+disfranchisement
+disfranchiser
+disfrequent
+disfriar
+disfrock
+disfurnish
+disfurnishment
+disgarland
+disgarnish
+disgarrison
+disgavel
+disgeneric
+disgenius
+disgig
+disglorify
+disglut
+disgood
+disgorge
+disgorgement
+disgorger
+disgospel
+disgown
+disgrace
+disgraceful
+disgracefully
+disgracefulness
+disgracement
+disgracer
+disgracious
+disgradation
+disgrade
+disgregate
+disgregation
+disgruntle
+disgruntlement
+disguisable
+disguisal
+disguise
+disguised
+disguisedly
+disguisedness
+disguiseless
+disguisement
+disguiser
+disguising
+disgulf
+disgust
+disgusted
+disgustedly
+disgustedness
+disguster
+disgustful
+disgustfully
+disgustfulness
+disgusting
+disgustingly
+disgustingness
+dish
+dishabilitate
+dishabilitation
+dishabille
+dishabituate
+dishallow
+dishallucination
+disharmonic
+disharmonical
+disharmonious
+disharmonism
+disharmonize
+disharmony
+dishboard
+dishcloth
+dishclout
+disheart
+dishearten
+disheartener
+disheartening
+dishearteningly
+disheartenment
+disheaven
+dished
+dishellenize
+dishelm
+disher
+disherent
+disherison
+disherit
+disheritment
+dishevel
+disheveled
+dishevelment
+dishexecontahedroid
+dishful
+Dishley
+dishlike
+dishling
+dishmaker
+dishmaking
+dishmonger
+dishome
+dishonest
+dishonestly
+dishonor
+dishonorable
+dishonorableness
+dishonorably
+dishonorary
+dishonorer
+dishorn
+dishorner
+dishorse
+dishouse
+dishpan
+dishpanful
+dishrag
+dishumanize
+dishwasher
+dishwashing
+dishwashings
+dishwater
+dishwatery
+dishwiper
+dishwiping
+disidentify
+disilane
+disilicane
+disilicate
+disilicic
+disilicid
+disilicide
+disillude
+disilluminate
+disillusion
+disillusionist
+disillusionize
+disillusionizer
+disillusionment
+disillusive
+disimagine
+disimbitter
+disimitate
+disimitation
+disimmure
+disimpark
+disimpassioned
+disimprison
+disimprisonment
+disimprove
+disimprovement
+disincarcerate
+disincarceration
+disincarnate
+disincarnation
+disinclination
+disincline
+disincorporate
+disincorporation
+disincrust
+disincrustant
+disincrustion
+disindividualize
+disinfect
+disinfectant
+disinfecter
+disinfection
+disinfective
+disinfector
+disinfest
+disinfestation
+disinfeudation
+disinflame
+disinflate
+disinflation
+disingenuity
+disingenuous
+disingenuously
+disingenuousness
+disinherison
+disinherit
+disinheritable
+disinheritance
+disinhume
+disinsulation
+disinsure
+disintegrable
+disintegrant
+disintegrate
+disintegration
+disintegrationist
+disintegrative
+disintegrator
+disintegratory
+disintegrity
+disintegrous
+disintensify
+disinter
+disinterest
+disinterested
+disinterestedly
+disinterestedness
+disinteresting
+disinterment
+disintertwine
+disintrench
+disintricate
+disinvagination
+disinvest
+disinvestiture
+disinvigorate
+disinvite
+disinvolve
+disjasked
+disject
+disjection
+disjoin
+disjoinable
+disjoint
+disjointed
+disjointedly
+disjointedness
+disjointly
+disjointure
+disjunct
+disjunction
+disjunctive
+disjunctively
+disjunctor
+disjuncture
+disjune
+disk
+diskelion
+diskless
+disklike
+dislaurel
+disleaf
+dislegitimate
+dislevelment
+dislicense
+dislikable
+dislike
+dislikelihood
+disliker
+disliking
+dislimn
+dislink
+dislip
+disload
+dislocability
+dislocable
+dislocate
+dislocated
+dislocatedly
+dislocatedness
+dislocation
+dislocator
+dislocatory
+dislodge
+dislodgeable
+dislodgement
+dislove
+disloyal
+disloyalist
+disloyally
+disloyalty
+disluster
+dismain
+dismal
+dismality
+dismalize
+dismally
+dismalness
+disman
+dismantle
+dismantlement
+dismantler
+dismarble
+dismark
+dismarket
+dismask
+dismast
+dismastment
+dismay
+dismayable
+dismayed
+dismayedness
+dismayful
+dismayfully
+dismayingly
+disme
+dismember
+dismembered
+dismemberer
+dismemberment
+dismembrate
+dismembrator
+disminion
+disminister
+dismiss
+dismissable
+dismissal
+dismissible
+dismissingly
+dismission
+dismissive
+dismissory
+dismoded
+dismount
+dismountable
+dismutation
+disna
+disnaturalization
+disnaturalize
+disnature
+disnest
+disnew
+disniche
+disnosed
+disnumber
+disobedience
+disobedient
+disobediently
+disobey
+disobeyal
+disobeyer
+disobligation
+disoblige
+disobliger
+disobliging
+disobligingly
+disobligingness
+disoccupation
+disoccupy
+disodic
+disodium
+disomatic
+disomatous
+disomic
+disomus
+disoperculate
+disorb
+disorchard
+disordained
+disorder
+disordered
+disorderedly
+disorderedness
+disorderer
+disorderliness
+disorderly
+disordinated
+disordination
+disorganic
+disorganization
+disorganize
+disorganizer
+disorient
+disorientate
+disorientation
+disown
+disownable
+disownment
+disoxygenate
+disoxygenation
+disozonize
+dispapalize
+disparage
+disparageable
+disparagement
+disparager
+disparaging
+disparagingly
+disparate
+disparately
+disparateness
+disparation
+disparity
+dispark
+dispart
+dispartment
+dispassionate
+dispassionately
+dispassionateness
+dispassioned
+dispatch
+dispatcher
+dispatchful
+dispatriated
+dispauper
+dispauperize
+dispeace
+dispeaceful
+dispel
+dispeller
+dispend
+dispender
+dispendious
+dispendiously
+dispenditure
+dispensability
+dispensable
+dispensableness
+dispensary
+dispensate
+dispensation
+dispensational
+dispensative
+dispensatively
+dispensator
+dispensatorily
+dispensatory
+dispensatress
+dispensatrix
+dispense
+dispenser
+dispensingly
+dispeople
+dispeoplement
+dispeopler
+dispergate
+dispergation
+dispergator
+dispericraniate
+disperiwig
+dispermic
+dispermous
+dispermy
+dispersal
+dispersant
+disperse
+dispersed
+dispersedly
+dispersedness
+dispersement
+disperser
+dispersibility
+dispersible
+dispersion
+dispersity
+dispersive
+dispersively
+dispersiveness
+dispersoid
+dispersoidological
+dispersoidology
+dispersonalize
+dispersonate
+dispersonification
+dispersonify
+dispetal
+disphenoid
+dispiece
+dispireme
+dispirit
+dispirited
+dispiritedly
+dispiritedness
+dispiritingly
+dispiritment
+dispiteous
+dispiteously
+dispiteousness
+displace
+displaceability
+displaceable
+displacement
+displacency
+displacer
+displant
+display
+displayable
+displayed
+displayer
+displease
+displeased
+displeasedly
+displeaser
+displeasing
+displeasingly
+displeasingness
+displeasurable
+displeasurably
+displeasure
+displeasurement
+displenish
+displicency
+displume
+displuviate
+dispondaic
+dispondee
+dispone
+disponee
+disponent
+disponer
+dispope
+dispopularize
+disporous
+disport
+disportive
+disportment
+Disporum
+disposability
+disposable
+disposableness
+disposal
+dispose
+disposed
+disposedly
+disposedness
+disposer
+disposingly
+disposition
+dispositional
+dispositioned
+dispositive
+dispositively
+dispossess
+dispossession
+dispossessor
+dispossessory
+dispost
+disposure
+dispowder
+dispractice
+dispraise
+dispraiser
+dispraisingly
+dispread
+dispreader
+disprejudice
+disprepare
+disprince
+disprison
+disprivacied
+disprivilege
+disprize
+disprobabilization
+disprobabilize
+disprobative
+dispromise
+disproof
+disproportion
+disproportionable
+disproportionableness
+disproportionably
+disproportional
+disproportionality
+disproportionally
+disproportionalness
+disproportionate
+disproportionately
+disproportionateness
+disproportionation
+disprovable
+disproval
+disprove
+disprovement
+disproven
+disprover
+dispulp
+dispunct
+dispunishable
+dispunitive
+disputability
+disputable
+disputableness
+disputably
+disputant
+disputation
+disputatious
+disputatiously
+disputatiousness
+disputative
+disputatively
+disputativeness
+disputator
+dispute
+disputeless
+disputer
+disqualification
+disqualify
+disquantity
+disquiet
+disquieted
+disquietedly
+disquietedness
+disquieten
+disquieter
+disquieting
+disquietingly
+disquietly
+disquietness
+disquietude
+disquiparancy
+disquiparant
+disquiparation
+disquisite
+disquisition
+disquisitional
+disquisitionary
+disquisitive
+disquisitively
+disquisitor
+disquisitorial
+disquisitory
+disquixote
+disrank
+disrate
+disrealize
+disrecommendation
+disregard
+disregardable
+disregardance
+disregardant
+disregarder
+disregardful
+disregardfully
+disregardfulness
+disrelated
+disrelation
+disrelish
+disrelishable
+disremember
+disrepair
+disreputability
+disreputable
+disreputableness
+disreputably
+disreputation
+disrepute
+disrespect
+disrespecter
+disrespectful
+disrespectfully
+disrespectfulness
+disrestore
+disring
+disrobe
+disrobement
+disrober
+disroof
+disroost
+disroot
+disrudder
+disrump
+disrupt
+disruptability
+disruptable
+disrupter
+disruption
+disruptionist
+disruptive
+disruptively
+disruptiveness
+disruptment
+disruptor
+disrupture
+diss
+dissatisfaction
+dissatisfactoriness
+dissatisfactory
+dissatisfied
+dissatisfiedly
+dissatisfiedness
+dissatisfy
+dissaturate
+disscepter
+disseat
+dissect
+dissected
+dissectible
+dissecting
+dissection
+dissectional
+dissective
+dissector
+disseize
+disseizee
+disseizin
+disseizor
+disseizoress
+disselboom
+dissemblance
+dissemble
+dissembler
+dissemblingly
+dissembly
+dissemilative
+disseminate
+dissemination
+disseminative
+disseminator
+disseminule
+dissension
+dissensualize
+dissent
+dissentaneous
+dissentaneousness
+dissenter
+dissenterism
+dissentience
+dissentiency
+dissentient
+dissenting
+dissentingly
+dissentious
+dissentiously
+dissentism
+dissentment
+dissepiment
+dissepimental
+dissert
+dissertate
+dissertation
+dissertational
+dissertationist
+dissertative
+dissertator
+disserve
+disservice
+disserviceable
+disserviceableness
+disserviceably
+dissettlement
+dissever
+disseverance
+disseverment
+disshadow
+dissheathe
+disshroud
+dissidence
+dissident
+dissidently
+dissight
+dissightly
+dissiliency
+dissilient
+dissimilar
+dissimilarity
+dissimilarly
+dissimilars
+dissimilate
+dissimilation
+dissimilatory
+dissimile
+dissimilitude
+dissimulate
+dissimulation
+dissimulative
+dissimulator
+dissimule
+dissimuler
+dissipable
+dissipate
+dissipated
+dissipatedly
+dissipatedness
+dissipater
+dissipation
+dissipative
+dissipativity
+dissipator
+dissociability
+dissociable
+dissociableness
+dissocial
+dissociality
+dissocialize
+dissociant
+dissociate
+dissociation
+dissociative
+dissoconch
+dissogeny
+dissogony
+dissolubility
+dissoluble
+dissolubleness
+dissolute
+dissolutely
+dissoluteness
+dissolution
+dissolutional
+dissolutionism
+dissolutionist
+dissolutive
+dissolvable
+dissolvableness
+dissolve
+dissolveability
+dissolvent
+dissolver
+dissolving
+dissolvingly
+dissonance
+dissonancy
+dissonant
+dissonantly
+dissonous
+dissoul
+dissuade
+dissuader
+dissuasion
+dissuasive
+dissuasively
+dissuasiveness
+dissuasory
+dissuit
+dissuitable
+dissuited
+dissyllabic
+dissyllabification
+dissyllabify
+dissyllabism
+dissyllabize
+dissyllable
+dissymmetric
+dissymmetrical
+dissymmetrically
+dissymmetry
+dissympathize
+dissympathy
+distad
+distaff
+distain
+distal
+distale
+distally
+distalwards
+distance
+distanceless
+distancy
+distannic
+distant
+distantly
+distantness
+distaste
+distasted
+distasteful
+distastefully
+distastefulness
+distater
+distemonous
+distemper
+distemperature
+distempered
+distemperedly
+distemperedness
+distemperer
+distenant
+distend
+distendedly
+distender
+distensibility
+distensible
+distensive
+distent
+distention
+disthene
+disthrall
+disthrone
+distich
+Distichlis
+distichous
+distichously
+distill
+distillable
+distillage
+distilland
+distillate
+distillation
+distillatory
+distilled
+distiller
+distillery
+distilling
+distillmint
+distinct
+distinctify
+distinction
+distinctional
+distinctionless
+distinctive
+distinctively
+distinctiveness
+distinctly
+distinctness
+distingue
+distinguish
+distinguishability
+distinguishable
+distinguishableness
+distinguishably
+distinguished
+distinguishedly
+distinguisher
+distinguishing
+distinguishingly
+distinguishment
+distoclusion
+Distoma
+Distomatidae
+distomatosis
+distomatous
+distome
+distomian
+distomiasis
+Distomidae
+Distomum
+distort
+distorted
+distortedly
+distortedness
+distorter
+distortion
+distortional
+distortionist
+distortionless
+distortive
+distract
+distracted
+distractedly
+distractedness
+distracter
+distractibility
+distractible
+distractingly
+distraction
+distractive
+distractively
+distrain
+distrainable
+distrainee
+distrainer
+distrainment
+distrainor
+distraint
+distrait
+distraite
+distraught
+distress
+distressed
+distressedly
+distressedness
+distressful
+distressfully
+distressfulness
+distressing
+distressingly
+distributable
+distributary
+distribute
+distributed
+distributedly
+distributee
+distributer
+distribution
+distributional
+distributionist
+distributival
+distributive
+distributively
+distributiveness
+distributor
+distributress
+district
+distrouser
+distrust
+distruster
+distrustful
+distrustfully
+distrustfulness
+distrustingly
+distune
+disturb
+disturbance
+disturbative
+disturbed
+disturbedly
+disturber
+disturbing
+disturbingly
+disturn
+disturnpike
+disubstituted
+disubstitution
+disulfonic
+disulfuric
+disulphate
+disulphide
+disulphonate
+disulphone
+disulphonic
+disulphoxide
+disulphuret
+disulphuric
+disuniform
+disuniformity
+disunify
+disunion
+disunionism
+disunionist
+disunite
+disuniter
+disunity
+disusage
+disusance
+disuse
+disutility
+disutilize
+disvaluation
+disvalue
+disvertebrate
+disvisage
+disvoice
+disvulnerability
+diswarren
+diswench
+diswood
+disworth
+disyllabic
+disyllable
+disyoke
+dit
+dita
+dital
+ditch
+ditchbank
+ditchbur
+ditchdigger
+ditchdown
+ditcher
+ditchless
+ditchside
+ditchwater
+dite
+diter
+diterpene
+ditertiary
+ditetragonal
+dithalous
+dithecal
+ditheism
+ditheist
+ditheistic
+ditheistical
+dithematic
+dither
+dithery
+dithiobenzoic
+dithioglycol
+dithioic
+dithion
+dithionate
+dithionic
+dithionite
+dithionous
+dithymol
+dithyramb
+dithyrambic
+dithyrambically
+Dithyrambos
+Dithyrambus
+ditokous
+ditolyl
+ditone
+ditrematous
+ditremid
+Ditremidae
+ditrichotomous
+ditriglyph
+ditriglyphic
+ditrigonal
+ditrigonally
+Ditrocha
+ditrochean
+ditrochee
+ditrochous
+ditroite
+dittamy
+dittander
+dittany
+dittay
+dittied
+ditto
+dittogram
+dittograph
+dittographic
+dittography
+dittology
+ditty
+diumvirate
+diuranate
+diureide
+diuresis
+diuretic
+diuretically
+diureticalness
+Diurna
+diurnal
+diurnally
+diurnalness
+diurnation
+diurne
+diurnule
+diuturnal
+diuturnity
+div
+diva
+divagate
+divagation
+divalence
+divalent
+divan
+divariant
+divaricate
+divaricately
+divaricating
+divaricatingly
+divarication
+divaricator
+divata
+dive
+divekeeper
+divel
+divellent
+divellicate
+diver
+diverge
+divergement
+divergence
+divergency
+divergent
+divergently
+diverging
+divergingly
+divers
+diverse
+diversely
+diverseness
+diversicolored
+diversifiability
+diversifiable
+diversification
+diversified
+diversifier
+diversiflorate
+diversiflorous
+diversifoliate
+diversifolious
+diversiform
+diversify
+diversion
+diversional
+diversionary
+diversipedate
+diversisporous
+diversity
+diversly
+diversory
+divert
+divertedly
+diverter
+divertibility
+divertible
+diverticle
+diverticular
+diverticulate
+diverticulitis
+diverticulosis
+diverticulum
+diverting
+divertingly
+divertingness
+divertisement
+divertive
+divertor
+divest
+divestible
+divestitive
+divestiture
+divestment
+divesture
+dividable
+dividableness
+divide
+divided
+dividedly
+dividedness
+dividend
+divider
+dividing
+dividingly
+dividual
+dividualism
+dividually
+dividuity
+dividuous
+divinable
+divinail
+divination
+divinator
+divinatory
+divine
+divinely
+divineness
+diviner
+divineress
+diving
+divinify
+divining
+diviningly
+divinity
+divinityship
+divinization
+divinize
+divinyl
+divisibility
+divisible
+divisibleness
+divisibly
+division
+divisional
+divisionally
+divisionary
+divisionism
+divisionist
+divisionistic
+divisive
+divisively
+divisiveness
+divisor
+divisorial
+divisory
+divisural
+divorce
+divorceable
+divorcee
+divorcement
+divorcer
+divorcible
+divorcive
+divot
+divoto
+divulgate
+divulgater
+divulgation
+divulgatory
+divulge
+divulgement
+divulgence
+divulger
+divulse
+divulsion
+divulsive
+divulsor
+divus
+Divvers
+divvy
+diwata
+dixenite
+Dixie
+dixie
+Dixiecrat
+dixit
+dixy
+dizain
+dizen
+dizenment
+dizoic
+dizygotic
+dizzard
+dizzily
+dizziness
+dizzy
+Djagatay
+djasakid
+djave
+djehad
+djerib
+djersa
+Djuka
+do
+doab
+doable
+doarium
+doat
+doated
+doater
+doating
+doatish
+Dob
+dob
+dobbed
+dobber
+dobbin
+dobbing
+dobby
+dobe
+dobla
+doblon
+dobra
+dobrao
+dobson
+doby
+doc
+docent
+docentship
+Docetae
+Docetic
+Docetically
+Docetism
+Docetist
+Docetistic
+Docetize
+dochmiac
+dochmiacal
+dochmiasis
+dochmius
+docibility
+docible
+docibleness
+docile
+docilely
+docility
+docimasia
+docimastic
+docimastical
+docimasy
+docimology
+docity
+dock
+dockage
+docken
+docker
+docket
+dockhead
+dockhouse
+dockization
+dockize
+dockland
+dockmackie
+dockman
+dockmaster
+dockside
+dockyard
+dockyardman
+docmac
+Docoglossa
+docoglossan
+docoglossate
+docosane
+doctor
+doctoral
+doctorally
+doctorate
+doctorbird
+doctordom
+doctoress
+doctorfish
+doctorhood
+doctorial
+doctorially
+doctorization
+doctorize
+doctorless
+doctorlike
+doctorly
+doctorship
+doctress
+doctrinaire
+doctrinairism
+doctrinal
+doctrinalism
+doctrinalist
+doctrinality
+doctrinally
+doctrinarian
+doctrinarianism
+doctrinarily
+doctrinarity
+doctrinary
+doctrinate
+doctrine
+doctrinism
+doctrinist
+doctrinization
+doctrinize
+doctrix
+document
+documental
+documentalist
+documentarily
+documentary
+documentation
+documentize
+dod
+dodd
+doddart
+dodded
+dodder
+doddered
+dodderer
+doddering
+doddery
+doddie
+dodding
+doddle
+doddy
+doddypoll
+Dode
+dodecade
+dodecadrachm
+dodecafid
+dodecagon
+dodecagonal
+dodecahedral
+dodecahedric
+dodecahedron
+dodecahydrate
+dodecahydrated
+dodecamerous
+dodecane
+Dodecanesian
+dodecanoic
+dodecant
+dodecapartite
+dodecapetalous
+dodecarch
+dodecarchy
+dodecasemic
+dodecastyle
+dodecastylos
+dodecasyllabic
+dodecasyllable
+dodecatemory
+Dodecatheon
+dodecatoic
+dodecatyl
+dodecatylic
+dodecuplet
+dodecyl
+dodecylene
+dodecylic
+dodge
+dodgeful
+dodger
+dodgery
+dodgily
+dodginess
+dodgy
+dodkin
+dodlet
+dodman
+dodo
+dodoism
+Dodona
+Dodonaea
+Dodonaeaceae
+Dodonaean
+Dodonean
+Dodonian
+dodrans
+doe
+doebird
+Doedicurus
+Doeg
+doeglic
+doegling
+doer
+does
+doeskin
+doesnt
+doest
+doff
+doffer
+doftberry
+dog
+dogal
+dogate
+dogbane
+Dogberry
+dogberry
+Dogberrydom
+Dogberryism
+dogbite
+dogblow
+dogboat
+dogbolt
+dogbush
+dogcart
+dogcatcher
+dogdom
+doge
+dogedom
+dogeless
+dogeship
+dogface
+dogfall
+dogfight
+dogfish
+dogfoot
+dogged
+doggedly
+doggedness
+dogger
+doggerel
+doggereler
+doggerelism
+doggerelist
+doggerelize
+doggerelizer
+doggery
+doggess
+doggish
+doggishly
+doggishness
+doggo
+doggone
+doggoned
+doggrel
+doggrelize
+doggy
+doghead
+doghearted
+doghole
+doghood
+doghouse
+dogie
+dogless
+doglike
+dogly
+dogma
+dogman
+dogmata
+dogmatic
+dogmatical
+dogmatically
+dogmaticalness
+dogmatician
+dogmatics
+dogmatism
+dogmatist
+dogmatization
+dogmatize
+dogmatizer
+dogmouth
+dogplate
+dogproof
+Dogra
+Dogrib
+dogs
+dogship
+dogshore
+dogskin
+dogsleep
+dogstone
+dogtail
+dogtie
+dogtooth
+dogtoothing
+dogtrick
+dogtrot
+dogvane
+dogwatch
+dogwood
+dogy
+doigt
+doiled
+doily
+doina
+doing
+doings
+doit
+doited
+doitkin
+doitrified
+doke
+Doketic
+Doketism
+dokhma
+dokimastic
+Dokmarok
+Doko
+Dol
+dola
+dolabra
+dolabrate
+dolabriform
+dolcan
+dolcian
+dolciano
+dolcino
+doldrum
+doldrums
+dole
+dolefish
+doleful
+dolefully
+dolefulness
+dolefuls
+dolent
+dolently
+dolerite
+doleritic
+dolerophanite
+dolesman
+dolesome
+dolesomely
+dolesomeness
+doless
+doli
+dolia
+dolichoblond
+dolichocephal
+dolichocephali
+dolichocephalic
+dolichocephalism
+dolichocephalize
+dolichocephalous
+dolichocephaly
+dolichocercic
+dolichocnemic
+dolichocranial
+dolichofacial
+Dolichoglossus
+dolichohieric
+Dolicholus
+dolichopellic
+dolichopodous
+dolichoprosopic
+Dolichopsyllidae
+Dolichos
+dolichos
+dolichosaur
+Dolichosauri
+Dolichosauria
+Dolichosaurus
+Dolichosoma
+dolichostylous
+dolichotmema
+dolichuric
+dolichurus
+Doliidae
+dolina
+doline
+dolioform
+Doliolidae
+Doliolum
+dolium
+doll
+dollar
+dollarbird
+dollardee
+dollardom
+dollarfish
+dollarleaf
+dollbeer
+dolldom
+dollface
+dollfish
+dollhood
+dollhouse
+dollier
+dolliness
+dollish
+dollishly
+dollishness
+dollmaker
+dollmaking
+dollop
+dollship
+dolly
+dollyman
+dollyway
+dolman
+dolmen
+dolmenic
+Dolomedes
+dolomite
+dolomitic
+dolomitization
+dolomitize
+dolomization
+dolomize
+dolor
+Dolores
+doloriferous
+dolorific
+dolorifuge
+dolorous
+dolorously
+dolorousness
+dolose
+dolous
+Dolph
+dolphin
+dolphinlike
+Dolphus
+dolt
+dolthead
+doltish
+doltishly
+doltishness
+dom
+domain
+domainal
+domal
+domanial
+domatium
+domatophobia
+domba
+Dombeya
+Domdaniel
+dome
+domelike
+doment
+domer
+domesday
+domestic
+domesticable
+domesticality
+domestically
+domesticate
+domestication
+domesticative
+domesticator
+domesticity
+domesticize
+domett
+domeykite
+domic
+domical
+domically
+Domicella
+domicile
+domicilement
+domiciliar
+domiciliary
+domiciliate
+domiciliation
+dominance
+dominancy
+dominant
+dominantly
+dominate
+dominated
+dominatingly
+domination
+dominative
+dominator
+domine
+domineer
+domineerer
+domineering
+domineeringly
+domineeringness
+dominial
+Dominic
+dominical
+dominicale
+Dominican
+Dominick
+dominie
+dominion
+dominionism
+dominionist
+Dominique
+dominium
+domino
+dominus
+domitable
+domite
+Domitian
+domitic
+domn
+domnei
+domoid
+dompt
+domy
+Don
+don
+donable
+Donacidae
+donaciform
+Donal
+Donald
+Donar
+donary
+donatary
+donate
+donated
+donatee
+Donatiaceae
+donation
+Donatism
+Donatist
+Donatistic
+Donatistical
+donative
+donatively
+donator
+donatory
+donatress
+donax
+doncella
+Dondia
+done
+donee
+Donet
+doney
+dong
+donga
+Dongola
+Dongolese
+dongon
+Donia
+donjon
+donkey
+donkeyback
+donkeyish
+donkeyism
+donkeyman
+donkeywork
+Donmeh
+Donn
+Donna
+donna
+Donne
+donnered
+donnert
+Donnie
+donnish
+donnishness
+donnism
+donnot
+donor
+donorship
+donought
+Donovan
+donship
+donsie
+dont
+donum
+doob
+doocot
+doodab
+doodad
+Doodia
+doodle
+doodlebug
+doodler
+doodlesack
+doohickey
+doohickus
+doohinkey
+doohinkus
+dooja
+dook
+dooket
+dookit
+dool
+doolee
+dooley
+dooli
+doolie
+dooly
+doom
+doomage
+doombook
+doomer
+doomful
+dooms
+doomsday
+doomsman
+doomstead
+doon
+door
+doorba
+doorbell
+doorboy
+doorbrand
+doorcase
+doorcheek
+doored
+doorframe
+doorhead
+doorjamb
+doorkeeper
+doorknob
+doorless
+doorlike
+doormaid
+doormaker
+doormaking
+doorman
+doornail
+doorplate
+doorpost
+doorsill
+doorstead
+doorstep
+doorstone
+doorstop
+doorward
+doorway
+doorweed
+doorwise
+dooryard
+dop
+dopa
+dopamelanin
+dopaoxidase
+dopatta
+dope
+dopebook
+doper
+dopester
+dopey
+doppelkummel
+Dopper
+dopper
+doppia
+Doppler
+dopplerite
+Dor
+dor
+Dora
+dorab
+dorad
+Doradidae
+dorado
+doraphobia
+Dorask
+Doraskean
+dorbeetle
+Dorcas
+dorcastry
+Dorcatherium
+Dorcopsis
+doree
+dorestane
+dorhawk
+Dori
+doria
+Dorian
+Doric
+Dorical
+Doricism
+Doricize
+Dorididae
+Dorine
+Doris
+Dorism
+Dorize
+dorje
+Dorking
+dorlach
+dorlot
+dorm
+dormancy
+dormant
+dormer
+dormered
+dormie
+dormient
+dormilona
+dormition
+dormitive
+dormitory
+dormouse
+dormy
+dorn
+dorneck
+dornic
+dornick
+dornock
+Dorobo
+Doronicum
+Dorosoma
+Dorothea
+Dorothy
+dorp
+dorsabdominal
+dorsabdominally
+dorsad
+dorsal
+dorsale
+dorsalgia
+dorsalis
+dorsally
+dorsalmost
+dorsalward
+dorsalwards
+dorsel
+dorser
+dorsibranch
+Dorsibranchiata
+dorsibranchiate
+dorsicollar
+dorsicolumn
+dorsicommissure
+dorsicornu
+dorsiduct
+dorsiferous
+dorsifixed
+dorsiflex
+dorsiflexion
+dorsiflexor
+dorsigrade
+dorsilateral
+dorsilumbar
+dorsimedian
+dorsimesal
+dorsimeson
+dorsiparous
+dorsispinal
+dorsiventral
+dorsiventrality
+dorsiventrally
+dorsoabdominal
+dorsoanterior
+dorsoapical
+Dorsobranchiata
+dorsocaudad
+dorsocaudal
+dorsocentral
+dorsocephalad
+dorsocephalic
+dorsocervical
+dorsocervically
+dorsodynia
+dorsoepitrochlear
+dorsointercostal
+dorsointestinal
+dorsolateral
+dorsolumbar
+dorsomedial
+dorsomedian
+dorsomesal
+dorsonasal
+dorsonuchal
+dorsopleural
+dorsoposteriad
+dorsoposterior
+dorsoradial
+dorsosacral
+dorsoscapular
+dorsosternal
+dorsothoracic
+dorsoventrad
+dorsoventral
+dorsoventrally
+Dorstenia
+dorsulum
+dorsum
+dorsumbonal
+dorter
+dortiness
+dortiship
+dorts
+dorty
+doruck
+Dory
+dory
+Doryanthes
+Dorylinae
+doryphorus
+dos
+dosa
+dosadh
+dosage
+dose
+doser
+dosimeter
+dosimetric
+dosimetrician
+dosimetrist
+dosimetry
+Dosinia
+dosiology
+dosis
+Dositheans
+dosology
+doss
+dossal
+dossel
+dosser
+dosseret
+dossier
+dossil
+dossman
+Dot
+dot
+dotage
+dotal
+dotard
+dotardism
+dotardly
+dotardy
+dotate
+dotation
+dotchin
+dote
+doted
+doter
+Dothideacea
+dothideaceous
+Dothideales
+Dothidella
+dothienenteritis
+Dothiorella
+dotiness
+doting
+dotingly
+dotingness
+dotish
+dotishness
+dotkin
+dotless
+dotlike
+Doto
+Dotonidae
+dotriacontane
+dotted
+dotter
+dotterel
+dottily
+dottiness
+dotting
+dottle
+dottler
+Dottore
+Dotty
+dotty
+doty
+douar
+double
+doubled
+doubledamn
+doubleganger
+doublegear
+doublehanded
+doublehandedly
+doublehandedness
+doublehatching
+doublehearted
+doubleheartedness
+doublehorned
+doubleleaf
+doublelunged
+doubleness
+doubler
+doublet
+doubleted
+doubleton
+doubletone
+doubletree
+doublets
+doubling
+doubloon
+doubly
+doubt
+doubtable
+doubtably
+doubtedly
+doubter
+doubtful
+doubtfully
+doubtfulness
+doubting
+doubtingly
+doubtingness
+doubtless
+doubtlessly
+doubtlessness
+doubtmonger
+doubtous
+doubtsome
+douc
+douce
+doucely
+douceness
+doucet
+douche
+doucin
+doucine
+doudle
+Doug
+dough
+doughbird
+doughboy
+doughface
+doughfaceism
+doughfoot
+doughhead
+doughiness
+doughlike
+doughmaker
+doughmaking
+doughman
+doughnut
+dought
+doughtily
+doughtiness
+doughty
+doughy
+Douglas
+doulocracy
+doum
+doundake
+doup
+douping
+dour
+dourine
+dourly
+dourness
+douse
+douser
+dout
+douter
+doutous
+douzepers
+douzieme
+dove
+dovecot
+doveflower
+dovefoot
+dovehouse
+dovekey
+dovekie
+dovelet
+dovelike
+doveling
+dover
+dovetail
+dovetailed
+dovetailer
+dovetailwise
+doveweed
+dovewood
+dovish
+Dovyalis
+dow
+dowable
+dowager
+dowagerism
+dowcet
+dowd
+dowdily
+dowdiness
+dowdy
+dowdyish
+dowdyism
+dowed
+dowel
+dower
+doweral
+doweress
+dowerless
+dowery
+dowf
+dowie
+Dowieism
+Dowieite
+dowily
+dowiness
+dowitch
+dowitcher
+dowl
+dowlas
+dowless
+down
+downbear
+downbeard
+downbeat
+downby
+downcast
+downcastly
+downcastness
+downcome
+downcomer
+downcoming
+downcry
+downcurved
+downcut
+downdale
+downdraft
+downer
+downface
+downfall
+downfallen
+downfalling
+downfeed
+downflow
+downfold
+downfolded
+downgate
+downgone
+downgrade
+downgrowth
+downhanging
+downhaul
+downheaded
+downhearted
+downheartedly
+downheartedness
+downhill
+downily
+downiness
+Downing
+Downingia
+downland
+downless
+downlie
+downlier
+downligging
+downlike
+downline
+downlooked
+downlooker
+downlying
+downmost
+downness
+downpour
+downpouring
+downright
+downrightly
+downrightness
+downrush
+downrushing
+downset
+downshare
+downshore
+downside
+downsinking
+downsitting
+downsliding
+downslip
+downslope
+downsman
+downspout
+downstage
+downstairs
+downstate
+downstater
+downstream
+downstreet
+downstroke
+downswing
+downtake
+downthrow
+downthrown
+downthrust
+Downton
+downtown
+downtrampling
+downtreading
+downtrend
+downtrodden
+downtroddenness
+downturn
+downward
+downwardly
+downwardness
+downway
+downweed
+downweigh
+downweight
+downweighted
+downwind
+downwith
+downy
+dowp
+dowry
+dowsabel
+dowse
+dowser
+dowset
+doxa
+Doxantha
+doxastic
+doxasticon
+doxographer
+doxographical
+doxography
+doxological
+doxologically
+doxologize
+doxology
+doxy
+Doyle
+doze
+dozed
+dozen
+dozener
+dozenth
+dozer
+dozily
+doziness
+dozy
+dozzled
+drab
+Draba
+drabbet
+drabbish
+drabble
+drabbler
+drabbletail
+drabbletailed
+drabby
+drably
+drabness
+Dracaena
+Dracaenaceae
+drachm
+drachma
+drachmae
+drachmai
+drachmal
+dracma
+Draco
+Dracocephalum
+Draconian
+Draconianism
+Draconic
+draconic
+Draconically
+Draconid
+Draconis
+Draconism
+draconites
+draconitic
+dracontian
+dracontiasis
+dracontic
+dracontine
+dracontites
+Dracontium
+dracunculus
+draegerman
+draff
+draffman
+draffy
+draft
+draftage
+draftee
+drafter
+draftily
+draftiness
+drafting
+draftman
+draftmanship
+draftproof
+draftsman
+draftsmanship
+draftswoman
+draftswomanship
+draftwoman
+drafty
+drag
+dragade
+dragbar
+dragbolt
+dragged
+dragger
+draggily
+dragginess
+dragging
+draggingly
+draggle
+draggletail
+draggletailed
+draggletailedly
+draggletailedness
+draggly
+draggy
+draghound
+dragline
+dragman
+dragnet
+drago
+dragoman
+dragomanate
+dragomanic
+dragomanish
+dragon
+dragonesque
+dragoness
+dragonet
+dragonfish
+dragonfly
+dragonhead
+dragonhood
+dragonish
+dragonism
+dragonize
+dragonkind
+dragonlike
+dragonnade
+dragonroot
+dragontail
+dragonwort
+dragoon
+dragoonable
+dragoonade
+dragoonage
+dragooner
+dragrope
+dragsaw
+dragsawing
+dragsman
+dragstaff
+drail
+drain
+drainable
+drainage
+drainboard
+draine
+drained
+drainer
+drainerman
+drainless
+drainman
+drainpipe
+draintile
+draisine
+drake
+drakestone
+drakonite
+dram
+drama
+dramalogue
+Dramamine
+dramatic
+dramatical
+dramatically
+dramaticism
+dramatics
+dramaticule
+dramatism
+dramatist
+dramatizable
+dramatization
+dramatize
+dramatizer
+dramaturge
+dramaturgic
+dramaturgical
+dramaturgist
+dramaturgy
+dramm
+drammage
+dramme
+drammed
+drammer
+dramming
+drammock
+dramseller
+dramshop
+drang
+drank
+drant
+drapable
+Draparnaldia
+drape
+drapeable
+draper
+draperess
+draperied
+drapery
+drapetomania
+drapping
+drassid
+Drassidae
+drastic
+drastically
+drat
+dratchell
+drate
+dratted
+dratting
+draught
+draughtboard
+draughthouse
+draughtman
+draughtmanship
+draughts
+draughtsman
+draughtsmanship
+draughtswoman
+draughtswomanship
+Dravida
+Dravidian
+Dravidic
+dravya
+draw
+drawable
+drawarm
+drawback
+drawbar
+drawbeam
+drawbench
+drawboard
+drawbolt
+drawbore
+drawboy
+drawbridge
+Drawcansir
+drawcut
+drawdown
+drawee
+drawer
+drawers
+drawfile
+drawfiling
+drawgate
+drawgear
+drawglove
+drawhead
+drawhorse
+drawing
+drawk
+drawknife
+drawknot
+drawl
+drawlatch
+drawler
+drawling
+drawlingly
+drawlingness
+drawlink
+drawloom
+drawly
+drawn
+drawnet
+drawoff
+drawout
+drawplate
+drawpoint
+drawrod
+drawshave
+drawsheet
+drawspan
+drawspring
+drawstop
+drawstring
+drawtongs
+drawtube
+dray
+drayage
+drayman
+drazel
+dread
+dreadable
+dreader
+dreadful
+dreadfully
+dreadfulness
+dreadingly
+dreadless
+dreadlessly
+dreadlessness
+dreadly
+dreadness
+dreadnought
+dream
+dreamage
+dreamer
+dreamery
+dreamful
+dreamfully
+dreamfulness
+dreamhole
+dreamily
+dreaminess
+dreamingly
+dreamish
+dreamland
+dreamless
+dreamlessly
+dreamlessness
+dreamlet
+dreamlike
+dreamlit
+dreamlore
+dreamsily
+dreamsiness
+dreamsy
+dreamt
+dreamtide
+dreamwhile
+dreamwise
+dreamworld
+dreamy
+drear
+drearfully
+drearily
+dreariment
+dreariness
+drearisome
+drearly
+drearness
+dreary
+dredge
+dredgeful
+dredger
+dredging
+dree
+dreep
+dreepiness
+dreepy
+dreg
+dreggily
+dregginess
+dreggish
+dreggy
+dregless
+dregs
+dreiling
+Dreissensia
+dreissiger
+drench
+drencher
+drenching
+drenchingly
+dreng
+drengage
+Drepanaspis
+Drepanidae
+Drepanididae
+drepaniform
+Drepanis
+drepanium
+drepanoid
+Dreparnaudia
+dress
+dressage
+dressed
+dresser
+dressership
+dressily
+dressiness
+dressing
+dressline
+dressmaker
+dressmakership
+dressmakery
+dressmaking
+dressy
+drest
+Drew
+drew
+drewite
+Dreyfusism
+Dreyfusist
+drias
+drib
+dribble
+dribblement
+dribbler
+driblet
+driddle
+dried
+drier
+drierman
+driest
+drift
+driftage
+driftbolt
+drifter
+drifting
+driftingly
+driftland
+driftless
+driftlessness
+driftlet
+driftman
+driftpiece
+driftpin
+driftway
+driftweed
+driftwind
+driftwood
+drifty
+drightin
+drill
+driller
+drillet
+drilling
+drillman
+drillmaster
+drillstock
+Drimys
+dringle
+drink
+drinkability
+drinkable
+drinkableness
+drinkably
+drinker
+drinking
+drinkless
+drinkproof
+drinn
+drip
+dripper
+dripping
+dripple
+dripproof
+drippy
+dripstick
+dripstone
+drisheen
+drisk
+drivable
+drivage
+drive
+driveaway
+driveboat
+drivebolt
+drivehead
+drivel
+driveler
+drivelingly
+driven
+drivepipe
+driver
+driverless
+drivership
+drivescrew
+driveway
+drivewell
+driving
+drivingly
+drizzle
+drizzly
+drochuil
+droddum
+drofland
+drogh
+drogher
+drogherman
+drogue
+droit
+droitsman
+droitural
+droiturel
+Drokpa
+droll
+drollery
+drollingly
+drollish
+drollishness
+drollist
+drollness
+drolly
+Dromaeognathae
+dromaeognathism
+dromaeognathous
+Dromaeus
+drome
+dromedarian
+dromedarist
+dromedary
+drometer
+Dromiacea
+dromic
+Dromiceiidae
+Dromiceius
+Dromicia
+dromograph
+dromomania
+dromometer
+dromond
+Dromornis
+dromos
+dromotropic
+drona
+dronage
+drone
+dronepipe
+droner
+drongo
+droningly
+dronish
+dronishly
+dronishness
+dronkgrass
+drony
+drool
+droop
+drooper
+drooping
+droopingly
+droopingness
+droopt
+droopy
+drop
+dropberry
+dropcloth
+dropflower
+drophead
+droplet
+droplight
+droplike
+dropling
+dropman
+dropout
+dropper
+dropping
+droppingly
+droppy
+dropseed
+dropsical
+dropsically
+dropsicalness
+dropsied
+dropsy
+dropsywort
+dropt
+dropwise
+dropworm
+dropwort
+Droschken
+Drosera
+Droseraceae
+droseraceous
+droshky
+drosky
+drosograph
+drosometer
+Drosophila
+Drosophilidae
+Drosophyllum
+dross
+drossel
+drosser
+drossiness
+drossless
+drossy
+drostdy
+droud
+drought
+droughtiness
+droughty
+drouk
+drove
+drover
+drovy
+drow
+drown
+drowner
+drowningly
+drowse
+drowsily
+drowsiness
+drowsy
+drub
+drubber
+drubbing
+drubbly
+drucken
+drudge
+drudger
+drudgery
+drudgingly
+drudgism
+druery
+drug
+drugeteria
+drugger
+druggery
+drugget
+druggeting
+druggist
+druggister
+druggy
+drugless
+drugman
+drugshop
+drugstore
+druid
+druidess
+druidic
+druidical
+druidism
+druidry
+druith
+Drukpa
+drum
+drumbeat
+drumble
+drumbledore
+drumbler
+drumfire
+drumfish
+drumhead
+drumheads
+drumlike
+drumlin
+drumline
+drumlinoid
+drumloid
+drumloidal
+drumly
+drummer
+drumming
+drummy
+drumskin
+drumstick
+drumwood
+drung
+drungar
+drunk
+drunkard
+drunken
+drunkenly
+drunkenness
+drunkensome
+drunkenwise
+drunkery
+Drupa
+Drupaceae
+drupaceous
+drupal
+drupe
+drupel
+drupelet
+drupeole
+drupetum
+drupiferous
+Druse
+druse
+Drusean
+Drusedom
+drusy
+druxiness
+druxy
+dry
+dryad
+dryadetum
+dryadic
+dryas
+dryasdust
+drybeard
+drybrained
+drycoal
+Drydenian
+Drydenism
+dryfoot
+drygoodsman
+dryhouse
+drying
+dryish
+dryly
+Drynaria
+dryness
+Dryobalanops
+Dryope
+Dryopes
+Dryophyllum
+Dryopians
+dryopithecid
+Dryopithecinae
+dryopithecine
+Dryopithecus
+Dryops
+Dryopteris
+dryopteroid
+drysalter
+drysaltery
+dryster
+dryth
+dryworker
+Dschubba
+duad
+duadic
+dual
+Duala
+duali
+dualin
+dualism
+dualist
+dualistic
+dualistically
+duality
+dualization
+dualize
+dually
+Dualmutef
+dualogue
+Duane
+duarch
+duarchy
+dub
+dubash
+dubb
+dubba
+dubbah
+dubbeltje
+dubber
+dubbing
+dubby
+Dubhe
+Dubhgall
+dubiety
+dubiocrystalline
+dubiosity
+dubious
+dubiously
+dubiousness
+dubitable
+dubitably
+dubitancy
+dubitant
+dubitate
+dubitatingly
+dubitation
+dubitative
+dubitatively
+Duboisia
+duboisin
+duboisine
+Dubonnet
+dubs
+ducal
+ducally
+ducamara
+ducape
+ducat
+ducato
+ducatoon
+ducdame
+duces
+Duchesnea
+Duchess
+duchess
+duchesse
+duchesslike
+duchy
+duck
+duckbill
+duckblind
+duckboard
+duckboat
+ducker
+duckery
+duckfoot
+duckhearted
+duckhood
+duckhouse
+duckhunting
+duckie
+ducking
+duckling
+ducklingship
+duckmeat
+duckpin
+duckpond
+duckstone
+duckweed
+duckwife
+duckwing
+Duco
+duct
+ducted
+ductibility
+ductible
+ductile
+ductilely
+ductileness
+ductilimeter
+ductility
+ductilize
+duction
+ductless
+ductor
+ductule
+Ducula
+Duculinae
+dud
+dudaim
+dudder
+duddery
+duddies
+dude
+dudeen
+dudgeon
+dudine
+dudish
+dudishness
+dudism
+dudler
+dudley
+Dudleya
+dudleyite
+dudman
+due
+duel
+dueler
+dueling
+duelist
+duelistic
+duello
+dueness
+duenna
+duennadom
+duennaship
+duer
+Duessa
+duet
+duettist
+duff
+duffadar
+duffel
+duffer
+dufferdom
+duffing
+dufoil
+dufrenite
+dufrenoysite
+dufter
+dufterdar
+duftery
+dug
+dugal
+dugdug
+duggler
+dugong
+Dugongidae
+dugout
+dugway
+duhat
+Duhr
+duiker
+duikerbok
+duim
+Duit
+duit
+dujan
+Duke
+duke
+dukedom
+dukeling
+dukely
+dukery
+dukeship
+dukhn
+dukker
+dukkeripen
+Dulanganes
+Dulat
+dulbert
+dulcet
+dulcetly
+dulcetness
+dulcian
+dulciana
+dulcification
+dulcifluous
+dulcify
+dulcigenic
+dulcimer
+Dulcin
+Dulcinea
+Dulcinist
+dulcitol
+dulcitude
+dulcose
+duledge
+duler
+dulia
+dull
+dullard
+dullardism
+dullardness
+dullbrained
+duller
+dullery
+dullhead
+dullhearted
+dullification
+dullify
+dullish
+dullity
+dullness
+dullpate
+dullsome
+dully
+dulosis
+dulotic
+dulse
+dulseman
+dult
+dultie
+dulwilly
+duly
+dum
+duma
+dumaist
+dumb
+dumba
+dumbbell
+dumbbeller
+dumbcow
+dumbfounder
+dumbfounderment
+dumbhead
+dumbledore
+dumbly
+dumbness
+dumdum
+dumetose
+dumfound
+dumfounder
+dumfounderment
+dummel
+dummered
+dumminess
+dummy
+dummyism
+dummyweed
+Dumontia
+Dumontiaceae
+dumontite
+dumortierite
+dumose
+dumosity
+dump
+dumpage
+dumpcart
+dumper
+dumpily
+dumpiness
+dumping
+dumpish
+dumpishly
+dumpishness
+dumple
+dumpling
+dumpoke
+dumpy
+dumsola
+dun
+dunair
+dunal
+dunbird
+Duncan
+dunce
+duncedom
+duncehood
+duncery
+dunch
+Dunciad
+duncical
+duncify
+duncish
+duncishly
+duncishness
+dundasite
+dunder
+dunderhead
+dunderheaded
+dunderheadedness
+dunderpate
+dune
+dunelike
+dunfish
+dung
+Dungan
+dungannonite
+dungaree
+dungbeck
+dungbird
+dungbred
+dungeon
+dungeoner
+dungeonlike
+dunger
+dunghill
+dunghilly
+dungol
+dungon
+dungy
+dungyard
+dunite
+dunk
+dunkadoo
+Dunkard
+Dunker
+dunker
+Dunkirk
+Dunkirker
+Dunlap
+dunlin
+Dunlop
+dunnage
+dunne
+dunner
+dunness
+dunnish
+dunnite
+dunnock
+dunny
+dunpickle
+Duns
+dunst
+dunstable
+dunt
+duntle
+duny
+dunziekte
+duo
+duocosane
+duodecahedral
+duodecahedron
+duodecane
+duodecennial
+duodecillion
+duodecimal
+duodecimality
+duodecimally
+duodecimfid
+duodecimo
+duodecimole
+duodecuple
+duodena
+duodenal
+duodenary
+duodenate
+duodenation
+duodene
+duodenectomy
+duodenitis
+duodenocholangitis
+duodenocholecystostomy
+duodenocholedochotomy
+duodenocystostomy
+duodenoenterostomy
+duodenogram
+duodenojejunal
+duodenojejunostomy
+duodenopancreatectomy
+duodenoscopy
+duodenostomy
+duodenotomy
+duodenum
+duodrama
+duograph
+duogravure
+duole
+duoliteral
+duologue
+duomachy
+duopod
+duopolistic
+duopoly
+duopsonistic
+duopsony
+duosecant
+duotone
+duotriacontane
+duotype
+dup
+dupability
+dupable
+dupe
+dupedom
+duper
+dupery
+dupion
+dupla
+duplation
+duple
+duplet
+duplex
+duplexity
+duplicability
+duplicable
+duplicand
+duplicate
+duplication
+duplicative
+duplicator
+duplicature
+duplicia
+duplicident
+Duplicidentata
+duplicidentate
+duplicipennate
+duplicitas
+duplicity
+duplification
+duplify
+duplone
+dupondius
+duppy
+dura
+durability
+durable
+durableness
+durably
+durain
+dural
+Duralumin
+duramatral
+duramen
+durance
+Durandarte
+durangite
+Durango
+Durani
+durant
+Duranta
+duraplasty
+duraquara
+duraspinalis
+duration
+durational
+durationless
+durative
+durax
+durbachite
+Durban
+durbar
+durdenite
+dure
+durene
+durenol
+duress
+duressor
+durgan
+Durham
+durian
+duridine
+Durindana
+during
+duringly
+Durio
+durity
+durmast
+durn
+duro
+Duroc
+durometer
+duroquinone
+durra
+durrie
+durrin
+durry
+durst
+durukuli
+durwaun
+duryl
+Duryodhana
+Durzada
+dusack
+duscle
+dush
+dusio
+dusk
+dusken
+duskily
+duskiness
+duskingtide
+duskish
+duskishly
+duskishness
+duskly
+duskness
+dusky
+dust
+dustbin
+dustbox
+dustcloth
+dustee
+duster
+dusterman
+dustfall
+dustily
+Dustin
+dustiness
+dusting
+dustless
+dustlessness
+dustman
+dustpan
+dustproof
+dustuck
+dustwoman
+dusty
+dustyfoot
+Dusun
+Dutch
+dutch
+Dutcher
+Dutchify
+Dutchman
+Dutchy
+duteous
+duteously
+duteousness
+dutiability
+dutiable
+dutied
+dutiful
+dutifully
+dutifulness
+dutra
+duty
+dutymonger
+duumvir
+duumviral
+duumvirate
+duvet
+duvetyn
+dux
+duyker
+dvaita
+dvandva
+dwale
+dwalm
+Dwamish
+dwang
+dwarf
+dwarfish
+dwarfishly
+dwarfishness
+dwarfism
+dwarfling
+dwarfness
+dwarfy
+dwayberry
+Dwayne
+dwell
+dwelled
+dweller
+dwelling
+dwelt
+Dwight
+dwindle
+dwindlement
+dwine
+Dwyka
+dyad
+dyadic
+Dyak
+dyakisdodecahedron
+Dyakish
+dyarchic
+dyarchical
+dyarchy
+Dyas
+Dyassic
+dyaster
+Dyaus
+dyce
+dye
+dyeable
+dyehouse
+dyeing
+dyeleaves
+dyemaker
+dyemaking
+dyer
+dyester
+dyestuff
+dyeware
+dyeweed
+dyewood
+dygogram
+dying
+dyingly
+dyingness
+dyke
+dykehopper
+dyker
+dykereeve
+Dylan
+dynagraph
+dynameter
+dynametric
+dynametrical
+dynamic
+dynamical
+dynamically
+dynamics
+dynamis
+dynamism
+dynamist
+dynamistic
+dynamitard
+dynamite
+dynamiter
+dynamitic
+dynamitical
+dynamitically
+dynamiting
+dynamitish
+dynamitism
+dynamitist
+dynamization
+dynamize
+dynamo
+dynamoelectric
+dynamoelectrical
+dynamogenesis
+dynamogenic
+dynamogenous
+dynamogenously
+dynamogeny
+dynamometamorphic
+dynamometamorphism
+dynamometamorphosed
+dynamometer
+dynamometric
+dynamometrical
+dynamometry
+dynamomorphic
+dynamoneure
+dynamophone
+dynamostatic
+dynamotor
+dynast
+Dynastes
+dynastical
+dynastically
+dynasticism
+dynastid
+dynastidan
+Dynastides
+Dynastinae
+dynasty
+dynatron
+dyne
+dyophone
+Dyophysite
+Dyophysitic
+Dyophysitical
+Dyophysitism
+dyotheism
+Dyothelete
+Dyotheletian
+Dyotheletic
+Dyotheletical
+Dyotheletism
+Dyothelism
+dyphone
+dysacousia
+dysacousis
+dysanalyte
+dysaphia
+dysarthria
+dysarthric
+dysarthrosis
+dysbulia
+dysbulic
+dyschiria
+dyschroa
+dyschroia
+dyschromatopsia
+dyschromatoptic
+dyschronous
+dyscrasia
+dyscrasial
+dyscrasic
+dyscrasite
+dyscratic
+dyscrystalline
+dysenteric
+dysenterical
+dysentery
+dysepulotic
+dysepulotical
+dyserethisia
+dysergasia
+dysergia
+dysesthesia
+dysesthetic
+dysfunction
+dysgenesic
+dysgenesis
+dysgenetic
+dysgenic
+dysgenical
+dysgenics
+dysgeogenous
+dysgnosia
+dysgraphia
+dysidrosis
+dyskeratosis
+dyskinesia
+dyskinetic
+dyslalia
+dyslexia
+dyslogia
+dyslogistic
+dyslogistically
+dyslogy
+dysluite
+dyslysin
+dysmenorrhea
+dysmenorrheal
+dysmerism
+dysmeristic
+dysmerogenesis
+dysmerogenetic
+dysmeromorph
+dysmeromorphic
+dysmetria
+dysmnesia
+dysmorphism
+dysmorphophobia
+dysneuria
+dysnomy
+dysodile
+dysodontiasis
+dysorexia
+dysorexy
+dysoxidation
+dysoxidizable
+dysoxidize
+dyspathetic
+dyspathy
+dyspepsia
+dyspepsy
+dyspeptic
+dyspeptical
+dyspeptically
+dysphagia
+dysphagic
+dysphasia
+dysphasic
+dysphemia
+dysphonia
+dysphonic
+dysphoria
+dysphoric
+dysphotic
+dysphrasia
+dysphrenia
+dyspituitarism
+dysplasia
+dysplastic
+dyspnea
+dyspneal
+dyspneic
+dyspnoic
+dysprosia
+dysprosium
+dysraphia
+dyssnite
+Dyssodia
+dysspermatism
+dyssynergia
+dyssystole
+dystaxia
+dystectic
+dysteleological
+dysteleologist
+dysteleology
+dysthyroidism
+dystocia
+dystocial
+dystome
+dystomic
+dystomous
+dystrophia
+dystrophic
+dystrophy
+dysuria
+dysuric
+dysyntribite
+dytiscid
+Dytiscidae
+Dytiscus
+dzeren
+Dzungar
+E
+e
+ea
+each
+eachwhere
+eager
+eagerly
+eagerness
+eagle
+eaglelike
+eagless
+eaglestone
+eaglet
+eaglewood
+eagre
+ean
+ear
+earache
+earbob
+earcap
+earcockle
+eardrop
+eardropper
+eardrum
+eared
+earflower
+earful
+earhole
+earing
+earjewel
+Earl
+earl
+earlap
+earldom
+Earle
+earless
+earlet
+earlike
+earliness
+earlish
+earlock
+earlship
+early
+earmark
+earn
+earner
+earnest
+earnestly
+earnestness
+earnful
+Earnie
+earning
+earnings
+earphone
+earpick
+earpiece
+earplug
+earreach
+earring
+earringed
+earscrew
+earshot
+earsore
+earsplitting
+eartab
+earth
+earthboard
+earthborn
+earthbred
+earthdrake
+earthed
+earthen
+earthenhearted
+earthenware
+earthfall
+earthfast
+earthgall
+earthgrubber
+earthian
+earthiness
+earthkin
+earthless
+earthlight
+earthlike
+earthliness
+earthling
+earthly
+earthmaker
+earthmaking
+earthnut
+earthpea
+earthquake
+earthquaked
+earthquaken
+earthquaking
+Earthshaker
+earthshine
+earthshock
+earthslide
+earthsmoke
+earthstar
+earthtongue
+earthwall
+earthward
+earthwards
+earthwork
+earthworm
+earthy
+earwax
+earwig
+earwigginess
+earwiggy
+earwitness
+earworm
+earwort
+ease
+easeful
+easefully
+easefulness
+easel
+easeless
+easement
+easer
+easier
+easiest
+easily
+easiness
+easing
+east
+eastabout
+eastbound
+Easter
+easter
+easterling
+easterly
+Eastern
+eastern
+easterner
+Easternism
+Easternly
+easternmost
+Eastertide
+easting
+Eastlake
+eastland
+eastmost
+Eastre
+eastward
+eastwardly
+easy
+easygoing
+easygoingness
+eat
+eatability
+eatable
+eatableness
+eatage
+Eatanswill
+eatberry
+eaten
+eater
+eatery
+eating
+eats
+eave
+eaved
+eavedrop
+eaver
+eaves
+eavesdrop
+eavesdropper
+eavesdropping
+ebb
+ebbman
+Eben
+Ebenaceae
+ebenaceous
+Ebenales
+ebeneous
+Ebenezer
+Eberthella
+Ebionism
+Ebionite
+Ebionitic
+Ebionitism
+Ebionize
+Eboe
+eboe
+ebon
+ebonist
+ebonite
+ebonize
+ebony
+ebracteate
+ebracteolate
+ebriate
+ebriety
+ebriosity
+ebrious
+ebriously
+ebullate
+ebullience
+ebulliency
+ebullient
+ebulliently
+ebulliometer
+ebullioscope
+ebullioscopic
+ebullioscopy
+ebullition
+ebullitive
+ebulus
+eburated
+eburine
+Eburna
+eburnated
+eburnation
+eburnean
+eburneoid
+eburneous
+eburnian
+eburnification
+ecad
+ecalcarate
+ecanda
+ecardinal
+Ecardines
+ecarinate
+ecarte
+Ecaudata
+ecaudate
+Ecballium
+ecbatic
+ecblastesis
+ecbole
+ecbolic
+Ecca
+eccaleobion
+eccentrate
+eccentric
+eccentrical
+eccentrically
+eccentricity
+eccentring
+eccentrometer
+ecchondroma
+ecchondrosis
+ecchondrotome
+ecchymoma
+ecchymose
+ecchymosis
+ecclesia
+ecclesial
+ecclesiarch
+ecclesiarchy
+ecclesiast
+Ecclesiastes
+ecclesiastic
+ecclesiastical
+ecclesiastically
+ecclesiasticism
+ecclesiasticize
+ecclesiastics
+Ecclesiasticus
+ecclesiastry
+ecclesioclastic
+ecclesiography
+ecclesiolater
+ecclesiolatry
+ecclesiologic
+ecclesiological
+ecclesiologically
+ecclesiologist
+ecclesiology
+ecclesiophobia
+eccoprotic
+eccoproticophoric
+eccrinology
+eccrisis
+eccritic
+eccyclema
+eccyesis
+ecdemic
+ecdemite
+ecderon
+ecderonic
+ecdysiast
+ecdysis
+ecesic
+ecesis
+ecgonine
+eche
+echea
+echelette
+echelon
+echelonment
+Echeloot
+Echeneidae
+echeneidid
+Echeneididae
+echeneidoid
+Echeneis
+Echeveria
+echidna
+Echidnidae
+Echimys
+Echinacea
+echinal
+echinate
+echinid
+Echinidea
+echinital
+echinite
+Echinocactus
+Echinocaris
+Echinocereus
+Echinochloa
+echinochrome
+echinococcus
+Echinoderes
+Echinoderidae
+echinoderm
+Echinoderma
+echinodermal
+Echinodermata
+echinodermatous
+echinodermic
+Echinodorus
+echinoid
+Echinoidea
+echinologist
+echinology
+Echinomys
+Echinopanax
+Echinops
+echinopsine
+Echinorhinidae
+Echinorhinus
+Echinorhynchus
+Echinospermum
+Echinosphaerites
+Echinosphaeritidae
+Echinostoma
+Echinostomatidae
+echinostome
+echinostomiasis
+Echinozoa
+echinulate
+echinulated
+echinulation
+echinuliform
+echinus
+Echis
+echitamine
+Echites
+Echium
+echiurid
+Echiurida
+echiuroid
+Echiuroidea
+Echiurus
+echo
+echoer
+echoic
+echoingly
+echoism
+echoist
+echoize
+echolalia
+echolalic
+echoless
+echometer
+echopractic
+echopraxia
+echowise
+Echuca
+eciliate
+Eciton
+ecize
+Eckehart
+ecklein
+eclair
+eclampsia
+eclamptic
+eclat
+eclectic
+eclectical
+eclectically
+eclecticism
+eclecticize
+Eclectics
+eclectism
+eclectist
+eclegm
+eclegma
+eclipsable
+eclipsareon
+eclipsation
+eclipse
+eclipser
+eclipsis
+ecliptic
+ecliptical
+ecliptically
+eclogite
+eclogue
+eclosion
+ecmnesia
+ecoid
+ecole
+ecologic
+ecological
+ecologically
+ecologist
+ecology
+econometer
+econometric
+econometrician
+econometrics
+economic
+economical
+economically
+economics
+economism
+economist
+Economite
+economization
+economize
+economizer
+economy
+ecophene
+ecophobia
+ecorticate
+ecospecies
+ecospecific
+ecospecifically
+ecostate
+ecosystem
+ecotonal
+ecotone
+ecotype
+ecotypic
+ecotypically
+ecphonesis
+ecphorable
+ecphore
+ecphoria
+ecphorization
+ecphorize
+ecphrasis
+ecrasite
+ecru
+ecrustaceous
+ecstasis
+ecstasize
+ecstasy
+ecstatic
+ecstatica
+ecstatical
+ecstatically
+ecstaticize
+ecstrophy
+ectad
+ectadenia
+ectal
+ectally
+ectasia
+ectasis
+ectatic
+ectene
+ectental
+ectepicondylar
+ectethmoid
+ectethmoidal
+Ecthesis
+ecthetically
+ecthlipsis
+ecthyma
+ectiris
+ectobatic
+ectoblast
+ectoblastic
+ectobronchium
+ectocardia
+Ectocarpaceae
+ectocarpaceous
+Ectocarpales
+ectocarpic
+ectocarpous
+Ectocarpus
+ectocinerea
+ectocinereal
+ectocoelic
+ectocondylar
+ectocondyle
+ectocondyloid
+ectocornea
+ectocranial
+ectocuneiform
+ectocuniform
+ectocyst
+ectodactylism
+ectoderm
+ectodermal
+ectodermic
+ectodermoidal
+ectodermosis
+ectodynamomorphic
+ectoentad
+ectoenzyme
+ectoethmoid
+ectogenesis
+ectogenic
+ectogenous
+ectoglia
+Ectognatha
+ectolecithal
+ectoloph
+ectomere
+ectomeric
+ectomesoblast
+ectomorph
+ectomorphic
+ectomorphy
+ectonephridium
+ectoparasite
+ectoparasitic
+Ectoparasitica
+ectopatagium
+ectophloic
+ectophyte
+ectophytic
+ectopia
+ectopic
+Ectopistes
+ectoplacenta
+ectoplasm
+ectoplasmatic
+ectoplasmic
+ectoplastic
+ectoplasy
+Ectoprocta
+ectoproctan
+ectoproctous
+ectopterygoid
+ectopy
+ectoretina
+ectorganism
+ectorhinal
+ectosarc
+ectosarcous
+ectoskeleton
+ectosomal
+ectosome
+ectosphenoid
+ectosphenotic
+ectosphere
+ectosteal
+ectosteally
+ectostosis
+ectotheca
+ectotoxin
+Ectotrophi
+ectotrophic
+ectozoa
+ectozoan
+ectozoic
+ectozoon
+ectrodactylia
+ectrodactylism
+ectrodactyly
+ectrogenic
+ectrogeny
+ectromelia
+ectromelian
+ectromelic
+ectromelus
+ectropion
+ectropium
+ectropometer
+ectrosyndactyly
+ectypal
+ectype
+ectypography
+Ecuadoran
+Ecuadorian
+ecuelling
+ecumenic
+ecumenical
+ecumenicalism
+ecumenicality
+ecumenically
+ecumenicity
+ecyphellate
+eczema
+eczematization
+eczematoid
+eczematosis
+eczematous
+Ed
+edacious
+edaciously
+edaciousness
+edacity
+Edana
+edaphic
+edaphology
+edaphon
+Edaphosauria
+Edaphosaurus
+Edda
+Eddaic
+edder
+Eddic
+Eddie
+eddish
+eddo
+Eddy
+eddy
+eddyroot
+edea
+edeagra
+edeitis
+edelweiss
+edema
+edematous
+edemic
+Eden
+Edenic
+edenite
+Edenization
+Edenize
+edental
+edentalous
+Edentata
+edentate
+edentulate
+edentulous
+edeodynia
+edeology
+edeomania
+edeoscopy
+edeotomy
+Edessan
+edestan
+edestin
+Edestosaurus
+Edgar
+edge
+edgebone
+edged
+edgeless
+edgemaker
+edgemaking
+edgeman
+edger
+edgerman
+edgeshot
+edgestone
+edgeways
+edgeweed
+edgewise
+edginess
+edging
+edgingly
+edgrew
+edgy
+edh
+edibility
+edible
+edibleness
+edict
+edictal
+edictally
+edicule
+edificable
+edification
+edificator
+edificatory
+edifice
+edificial
+edifier
+edify
+edifying
+edifyingly
+edifyingness
+edingtonite
+edit
+edital
+Edith
+edition
+editor
+editorial
+editorialize
+editorially
+editorship
+editress
+Ediya
+Edmond
+Edmund
+Edna
+Edo
+Edomite
+Edomitish
+Edoni
+Edriasteroidea
+Edrioasteroid
+Edrioasteroidea
+Edriophthalma
+edriophthalmatous
+edriophthalmian
+edriophthalmic
+edriophthalmous
+Eduardo
+Educabilia
+educabilian
+educability
+educable
+educand
+educatable
+educate
+educated
+educatee
+education
+educationable
+educational
+educationalism
+educationalist
+educationally
+educationary
+educationist
+educative
+educator
+educatory
+educatress
+educe
+educement
+educible
+educive
+educt
+eduction
+eductive
+eductor
+edulcorate
+edulcoration
+edulcorative
+edulcorator
+Eduskunta
+Edward
+Edwardean
+Edwardeanism
+Edwardian
+Edwardine
+Edwardsia
+Edwardsiidae
+Edwin
+Edwina
+eegrass
+eel
+eelboat
+eelbob
+eelbobber
+eelcake
+eelcatcher
+eeler
+eelery
+eelfare
+eelfish
+eelgrass
+eellike
+eelpot
+eelpout
+eelshop
+eelskin
+eelspear
+eelware
+eelworm
+eely
+eer
+eerie
+eerily
+eeriness
+eerisome
+effable
+efface
+effaceable
+effacement
+effacer
+effect
+effecter
+effectful
+effectible
+effective
+effectively
+effectiveness
+effectivity
+effectless
+effector
+effects
+effectual
+effectuality
+effectualize
+effectually
+effectualness
+effectuate
+effectuation
+effeminacy
+effeminate
+effeminately
+effeminateness
+effemination
+effeminatize
+effeminization
+effeminize
+effendi
+efferent
+effervesce
+effervescence
+effervescency
+effervescent
+effervescible
+effervescingly
+effervescive
+effete
+effeteness
+effetman
+efficacious
+efficaciously
+efficaciousness
+efficacity
+efficacy
+efficience
+efficiency
+efficient
+efficiently
+Effie
+effigial
+effigiate
+effigiation
+effigurate
+effiguration
+effigy
+efflate
+efflation
+effloresce
+efflorescence
+efflorescency
+efflorescent
+efflower
+effluence
+effluency
+effluent
+effluvia
+effluvial
+effluviate
+effluviography
+effluvious
+effluvium
+efflux
+effluxion
+effodient
+Effodientia
+efform
+efformation
+efformative
+effort
+effortful
+effortless
+effortlessly
+effossion
+effraction
+effranchise
+effranchisement
+effrontery
+effulge
+effulgence
+effulgent
+effulgently
+effund
+effuse
+effusiometer
+effusion
+effusive
+effusively
+effusiveness
+Efik
+eflagelliferous
+efoliolate
+efoliose
+efoveolate
+eft
+eftest
+eftsoons
+egad
+egalitarian
+egalitarianism
+egality
+Egba
+Egbert
+Egbo
+egence
+egeran
+Egeria
+egest
+egesta
+egestion
+egestive
+egg
+eggberry
+eggcup
+eggcupful
+eggeater
+egger
+eggfish
+eggfruit
+egghead
+egghot
+egging
+eggler
+eggless
+egglike
+eggnog
+eggplant
+eggshell
+eggy
+egilops
+egipto
+Eglamore
+eglandular
+eglandulose
+eglantine
+eglatere
+eglestonite
+egma
+ego
+egocentric
+egocentricity
+egocentrism
+Egocerus
+egohood
+egoism
+egoist
+egoistic
+egoistical
+egoistically
+egoity
+egoize
+egoizer
+egol
+egolatrous
+egomania
+egomaniac
+egomaniacal
+egomism
+egophonic
+egophony
+egosyntonic
+egotheism
+egotism
+egotist
+egotistic
+egotistical
+egotistically
+egotize
+egregious
+egregiously
+egregiousness
+egress
+egression
+egressive
+egressor
+egret
+Egretta
+egrimony
+egueiite
+egurgitate
+eguttulate
+Egypt
+Egyptian
+Egyptianism
+Egyptianization
+Egyptianize
+Egyptize
+Egyptologer
+Egyptologic
+Egyptological
+Egyptologist
+Egyptology
+eh
+Ehatisaht
+eheu
+ehlite
+Ehretia
+Ehretiaceae
+ehrwaldite
+ehuawa
+eichbergite
+Eichhornia
+eichwaldite
+eicosane
+eident
+eidently
+eider
+eidetic
+eidograph
+eidolic
+eidolism
+eidology
+eidolology
+eidolon
+eidoptometry
+eidouranion
+eigenfunction
+eigenvalue
+eight
+eighteen
+eighteenfold
+eighteenmo
+eighteenth
+eighteenthly
+eightfoil
+eightfold
+eighth
+eighthly
+eightieth
+eightling
+eightpenny
+eightscore
+eightsman
+eightsome
+eighty
+eightyfold
+eigne
+Eikonogen
+eikonology
+Eileen
+Eimak
+eimer
+Eimeria
+einkorn
+Einsteinian
+Eireannach
+Eirene
+eiresione
+eisegesis
+eisegetical
+eisodic
+eisteddfod
+eisteddfodic
+eisteddfodism
+either
+ejaculate
+ejaculation
+ejaculative
+ejaculator
+ejaculatory
+Ejam
+eject
+ejecta
+ejectable
+ejection
+ejective
+ejectively
+ejectivity
+ejectment
+ejector
+ejicient
+ejoo
+ekaboron
+ekacaesium
+ekaha
+ekamanganese
+ekasilicon
+ekatantalum
+eke
+ekebergite
+eker
+ekerite
+eking
+ekka
+Ekoi
+ekphore
+Ekron
+Ekronite
+ektene
+ektenes
+ektodynamorphic
+el
+elaborate
+elaborately
+elaborateness
+elaboration
+elaborative
+elaborator
+elaboratory
+elabrate
+Elachista
+Elachistaceae
+elachistaceous
+Elaeagnaceae
+elaeagnaceous
+Elaeagnus
+Elaeis
+elaeoblast
+elaeoblastic
+Elaeocarpaceae
+elaeocarpaceous
+Elaeocarpus
+Elaeococca
+Elaeodendron
+elaeodochon
+elaeomargaric
+elaeometer
+elaeoptene
+elaeosaccharum
+elaeothesium
+elaidate
+elaidic
+elaidin
+elaidinic
+elain
+Elaine
+elaine
+elaioleucite
+elaioplast
+elaiosome
+Elamite
+Elamitic
+Elamitish
+elance
+eland
+elanet
+Elanus
+Elaphe
+Elaphebolion
+elaphine
+Elaphodus
+Elaphoglossum
+Elaphomyces
+Elaphomycetaceae
+Elaphrium
+elaphure
+elaphurine
+Elaphurus
+elapid
+Elapidae
+Elapinae
+elapine
+elapoid
+Elaps
+elapse
+Elapsoidea
+elasmobranch
+elasmobranchian
+elasmobranchiate
+Elasmobranchii
+elasmosaur
+Elasmosaurus
+elasmothere
+Elasmotherium
+elastance
+elastic
+elastica
+elastically
+elastician
+elasticin
+elasticity
+elasticize
+elasticizer
+elasticness
+elastin
+elastivity
+elastomer
+elastomeric
+elastometer
+elastometry
+elastose
+elatcha
+elate
+elated
+elatedly
+elatedness
+elater
+elaterid
+Elateridae
+elaterin
+elaterite
+elaterium
+elateroid
+Elatha
+Elatinaceae
+elatinaceous
+Elatine
+elation
+elative
+elator
+elatrometer
+elb
+Elbert
+Elberta
+elbow
+elbowboard
+elbowbush
+elbowchair
+elbowed
+elbower
+elbowpiece
+elbowroom
+elbowy
+elcaja
+elchee
+eld
+elder
+elderberry
+elderbrotherhood
+elderbrotherish
+elderbrotherly
+elderbush
+elderhood
+elderliness
+elderly
+elderman
+eldership
+eldersisterly
+elderwoman
+elderwood
+elderwort
+eldest
+eldin
+elding
+Eldred
+eldress
+eldritch
+Elean
+Eleanor
+Eleatic
+Eleaticism
+Eleazar
+elecampane
+elect
+electable
+electee
+electicism
+election
+electionary
+electioneer
+electioneerer
+elective
+electively
+electiveness
+electivism
+electivity
+electly
+elector
+electoral
+electorally
+electorate
+electorial
+electorship
+Electra
+electragist
+electragy
+electralize
+electrepeter
+electress
+electret
+electric
+electrical
+electricalize
+electrically
+electricalness
+electrician
+electricity
+electricize
+electrics
+electriferous
+electrifiable
+electrification
+electrifier
+electrify
+electrion
+electrionic
+electrizable
+electrization
+electrize
+electrizer
+electro
+electroacoustic
+electroaffinity
+electroamalgamation
+electroanalysis
+electroanalytic
+electroanalytical
+electroanesthesia
+electroballistic
+electroballistics
+electrobath
+electrobiological
+electrobiologist
+electrobiology
+electrobioscopy
+electroblasting
+electrobrasser
+electrobus
+electrocapillarity
+electrocapillary
+electrocardiogram
+electrocardiograph
+electrocardiographic
+electrocardiography
+electrocatalysis
+electrocatalytic
+electrocataphoresis
+electrocataphoretic
+electrocauterization
+electrocautery
+electroceramic
+electrochemical
+electrochemically
+electrochemist
+electrochemistry
+electrochronograph
+electrochronographic
+electrochronometer
+electrochronometric
+electrocoagulation
+electrocoating
+electrocolloidal
+electrocontractility
+electrocorticogram
+electroculture
+electrocute
+electrocution
+electrocutional
+electrocutioner
+electrocystoscope
+electrode
+electrodeless
+electrodentistry
+electrodeposit
+electrodepositable
+electrodeposition
+electrodepositor
+electrodesiccate
+electrodesiccation
+electrodiagnosis
+electrodialysis
+electrodialyze
+electrodialyzer
+electrodiplomatic
+electrodispersive
+electrodissolution
+electrodynamic
+electrodynamical
+electrodynamics
+electrodynamism
+electrodynamometer
+electroencephalogram
+electroencephalograph
+electroencephalography
+electroendosmose
+electroendosmosis
+electroendosmotic
+electroengrave
+electroengraving
+electroergometer
+electroetching
+electroethereal
+electroextraction
+electroform
+electroforming
+electrofuse
+electrofused
+electrofusion
+electrogalvanic
+electrogalvanize
+electrogenesis
+electrogenetic
+electrogild
+electrogilding
+electrogilt
+electrograph
+electrographic
+electrographite
+electrography
+electroharmonic
+electrohemostasis
+electrohomeopathy
+electrohorticulture
+electrohydraulic
+electroimpulse
+electroindustrial
+electroionic
+electroirrigation
+electrokinematics
+electrokinetic
+electrokinetics
+electrolier
+electrolithotrity
+electrologic
+electrological
+electrologist
+electrology
+electroluminescence
+electroluminescent
+electrolysis
+electrolyte
+electrolytic
+electrolytical
+electrolytically
+electrolyzability
+electrolyzable
+electrolyzation
+electrolyze
+electrolyzer
+electromagnet
+electromagnetic
+electromagnetical
+electromagnetically
+electromagnetics
+electromagnetism
+electromagnetist
+electromassage
+electromechanical
+electromechanics
+electromedical
+electromer
+electromeric
+electromerism
+electrometallurgical
+electrometallurgist
+electrometallurgy
+electrometer
+electrometric
+electrometrical
+electrometrically
+electrometry
+electromobile
+electromobilism
+electromotion
+electromotive
+electromotivity
+electromotograph
+electromotor
+electromuscular
+electromyographic
+electron
+electronarcosis
+electronegative
+electronervous
+electronic
+electronics
+electronographic
+electrooptic
+electrooptical
+electrooptically
+electrooptics
+electroosmosis
+electroosmotic
+electroosmotically
+electrootiatrics
+electropathic
+electropathology
+electropathy
+electropercussive
+electrophobia
+electrophone
+electrophore
+electrophoresis
+electrophoretic
+electrophoric
+Electrophoridae
+electrophorus
+electrophotometer
+electrophotometry
+electrophototherapy
+electrophrenic
+electrophysics
+electrophysiological
+electrophysiologist
+electrophysiology
+electropism
+electroplate
+electroplater
+electroplating
+electroplax
+electropneumatic
+electropneumatically
+electropoion
+electropolar
+electropositive
+electropotential
+electropower
+electropsychrometer
+electropult
+electropuncturation
+electropuncture
+electropuncturing
+electropyrometer
+electroreceptive
+electroreduction
+electrorefine
+electroscission
+electroscope
+electroscopic
+electrosherardizing
+electroshock
+electrosmosis
+electrostatic
+electrostatical
+electrostatically
+electrostatics
+electrosteel
+electrostenolysis
+electrostenolytic
+electrostereotype
+electrostriction
+electrosurgery
+electrosurgical
+electrosynthesis
+electrosynthetic
+electrosynthetically
+electrotactic
+electrotautomerism
+electrotaxis
+electrotechnic
+electrotechnical
+electrotechnician
+electrotechnics
+electrotechnology
+electrotelegraphic
+electrotelegraphy
+electrotelethermometer
+electrotellurograph
+electrotest
+electrothanasia
+electrothanatosis
+electrotherapeutic
+electrotherapeutical
+electrotherapeutics
+electrotherapeutist
+electrotherapist
+electrotherapy
+electrothermal
+electrothermancy
+electrothermic
+electrothermics
+electrothermometer
+electrothermostat
+electrothermostatic
+electrothermotic
+electrotitration
+electrotonic
+electrotonicity
+electrotonize
+electrotonus
+electrotrephine
+electrotropic
+electrotropism
+electrotype
+electrotyper
+electrotypic
+electrotyping
+electrotypist
+electrotypy
+electrovalence
+electrovalency
+electrovection
+electroviscous
+electrovital
+electrowin
+electrum
+electuary
+eleemosynarily
+eleemosynariness
+eleemosynary
+elegance
+elegancy
+elegant
+elegantly
+elegiac
+elegiacal
+elegiambic
+elegiambus
+elegiast
+elegist
+elegit
+elegize
+elegy
+eleidin
+element
+elemental
+elementalism
+elementalist
+elementalistic
+elementalistically
+elementality
+elementalize
+elementally
+elementarily
+elementariness
+elementary
+elementoid
+elemi
+elemicin
+elemin
+elench
+elenchi
+elenchic
+elenchical
+elenchically
+elenchize
+elenchtic
+elenchtical
+elenctic
+elenge
+eleoblast
+Eleocharis
+eleolite
+eleomargaric
+eleometer
+eleonorite
+eleoptene
+eleostearate
+eleostearic
+elephant
+elephanta
+elephantiac
+elephantiasic
+elephantiasis
+elephantic
+elephanticide
+Elephantidae
+elephantine
+elephantlike
+elephantoid
+elephantoidal
+Elephantopus
+elephantous
+elephantry
+Elephas
+Elettaria
+Eleusine
+Eleusinia
+Eleusinian
+Eleusinion
+Eleut
+eleutherarch
+Eleutheri
+Eleutheria
+Eleutherian
+Eleutherios
+eleutherism
+eleutherodactyl
+Eleutherodactyli
+Eleutherodactylus
+eleutheromania
+eleutheromaniac
+eleutheromorph
+eleutheropetalous
+eleutherophyllous
+eleutherosepalous
+Eleutherozoa
+eleutherozoan
+elevate
+elevated
+elevatedly
+elevatedness
+elevating
+elevatingly
+elevation
+elevational
+elevator
+elevatory
+eleven
+elevener
+elevenfold
+eleventh
+eleventhly
+elevon
+elf
+elfenfolk
+elfhood
+elfic
+elfin
+elfinwood
+elfish
+elfishly
+elfishness
+elfkin
+elfland
+elflike
+elflock
+elfship
+elfwife
+elfwort
+Eli
+Elia
+Elian
+Elianic
+Elias
+eliasite
+elicit
+elicitable
+elicitate
+elicitation
+elicitor
+elicitory
+elide
+elidible
+eligibility
+eligible
+eligibleness
+eligibly
+Elihu
+Elijah
+eliminable
+eliminand
+eliminant
+eliminate
+elimination
+eliminative
+eliminator
+eliminatory
+Elinor
+Elinvar
+Eliot
+Eliphalet
+eliquate
+eliquation
+Elisabeth
+Elisha
+Elishah
+elision
+elisor
+Elissa
+elite
+elixir
+Eliza
+Elizabeth
+Elizabethan
+Elizabethanism
+Elizabethanize
+elk
+Elkanah
+Elkdom
+Elkesaite
+elkhorn
+elkhound
+Elkoshite
+elkslip
+Elkuma
+elkwood
+ell
+Ella
+ellachick
+ellagate
+ellagic
+ellagitannin
+Ellasar
+elle
+elleck
+Ellen
+ellenyard
+Ellerian
+ellfish
+Ellice
+Ellick
+Elliot
+Elliott
+ellipse
+ellipses
+ellipsis
+ellipsograph
+ellipsoid
+ellipsoidal
+ellipsone
+ellipsonic
+elliptic
+elliptical
+elliptically
+ellipticalness
+ellipticity
+elliptograph
+elliptoid
+ellops
+ellwand
+elm
+Elmer
+elmy
+Eloah
+elocular
+elocute
+elocution
+elocutionary
+elocutioner
+elocutionist
+elocutionize
+elod
+Elodea
+Elodeaceae
+Elodes
+eloge
+elogium
+Elohim
+Elohimic
+Elohism
+Elohist
+Elohistic
+eloign
+eloigner
+eloignment
+Eloise
+Elon
+elongate
+elongated
+elongation
+elongative
+Elonite
+elope
+elopement
+eloper
+Elopidae
+elops
+eloquence
+eloquent
+eloquential
+eloquently
+eloquentness
+Elotherium
+elotillo
+elpasolite
+elpidite
+Elric
+els
+Elsa
+else
+elsehow
+elsewards
+elseways
+elsewhen
+elsewhere
+elsewheres
+elsewhither
+elsewise
+Elsholtzia
+elsin
+elt
+eluate
+elucidate
+elucidation
+elucidative
+elucidator
+elucidatory
+elucubrate
+elucubration
+elude
+eluder
+elusion
+elusive
+elusively
+elusiveness
+elusoriness
+elusory
+elute
+elution
+elutor
+elutriate
+elutriation
+elutriator
+eluvial
+eluviate
+eluviation
+eluvium
+elvan
+elvanite
+elvanitic
+elver
+elves
+elvet
+Elvira
+Elvis
+elvish
+elvishly
+Elwood
+elydoric
+Elymi
+Elymus
+Elysee
+Elysia
+elysia
+Elysian
+Elysiidae
+Elysium
+elytral
+elytriferous
+elytriform
+elytrigerous
+elytrin
+elytrocele
+elytroclasia
+elytroid
+elytron
+elytroplastic
+elytropolypus
+elytroposis
+elytrorhagia
+elytrorrhagia
+elytrorrhaphy
+elytrostenosis
+elytrotomy
+elytrous
+elytrum
+Elzevir
+Elzevirian
+Em
+em
+emaciate
+emaciation
+emajagua
+emanant
+emanate
+emanation
+emanational
+emanationism
+emanationist
+emanatism
+emanatist
+emanatistic
+emanativ
+emanative
+emanatively
+emanator
+emanatory
+emancipate
+emancipation
+emancipationist
+emancipatist
+emancipative
+emancipator
+emancipatory
+emancipatress
+emancipist
+emandibulate
+emanium
+emarcid
+emarginate
+emarginately
+emargination
+Emarginula
+emasculate
+emasculation
+emasculative
+emasculator
+emasculatory
+Embadomonas
+emball
+emballonurid
+Emballonuridae
+emballonurine
+embalm
+embalmer
+embalmment
+embank
+embankment
+embannered
+embar
+embargo
+embargoist
+embark
+embarkation
+embarkment
+embarras
+embarrass
+embarrassed
+embarrassedly
+embarrassing
+embarrassingly
+embarrassment
+embarrel
+embassage
+embassy
+embastioned
+embathe
+embatholithic
+embattle
+embattled
+embattlement
+embay
+embayment
+Embden
+embed
+embedment
+embeggar
+Embelia
+embelic
+embellish
+embellisher
+embellishment
+ember
+embergoose
+Emberiza
+emberizidae
+Emberizinae
+emberizine
+embezzle
+embezzlement
+embezzler
+Embiidae
+Embiidina
+embind
+Embiodea
+Embioptera
+embiotocid
+Embiotocidae
+embiotocoid
+embira
+embitter
+embitterer
+embitterment
+emblaze
+emblazer
+emblazon
+emblazoner
+emblazonment
+emblazonry
+emblem
+emblema
+emblematic
+emblematical
+emblematically
+emblematicalness
+emblematicize
+emblematist
+emblematize
+emblematology
+emblement
+emblemist
+emblemize
+emblemology
+emblic
+emblossom
+embodier
+embodiment
+embody
+embog
+emboitement
+embolden
+emboldener
+embole
+embolectomy
+embolemia
+embolic
+emboliform
+embolism
+embolismic
+embolismus
+embolite
+embolium
+embolize
+embolo
+embololalia
+Embolomeri
+embolomerism
+embolomerous
+embolomycotic
+embolum
+embolus
+emboly
+emborder
+emboscata
+embosom
+emboss
+embossage
+embosser
+embossing
+embossman
+embossment
+embosture
+embottle
+embouchure
+embound
+embow
+embowed
+embowel
+emboweler
+embowelment
+embower
+embowerment
+embowment
+embox
+embrace
+embraceable
+embraceably
+embracement
+embraceor
+embracer
+embracery
+embracing
+embracingly
+embracingness
+embracive
+embrail
+embranchment
+embrangle
+embranglement
+embrasure
+embreathe
+embreathement
+Embrica
+embright
+embrittle
+embrittlement
+embroaden
+embrocate
+embrocation
+embroider
+embroiderer
+embroideress
+embroidery
+embroil
+embroiler
+embroilment
+embronze
+embrown
+embryectomy
+embryo
+embryocardia
+embryoctonic
+embryoctony
+embryoferous
+embryogenesis
+embryogenetic
+embryogenic
+embryogeny
+embryogony
+embryographer
+embryographic
+embryography
+embryoid
+embryoism
+embryologic
+embryological
+embryologically
+embryologist
+embryology
+embryoma
+embryon
+embryonal
+embryonary
+embryonate
+embryonated
+embryonic
+embryonically
+embryoniferous
+embryoniform
+embryony
+embryopathology
+embryophagous
+embryophore
+Embryophyta
+embryophyte
+embryoplastic
+embryoscope
+embryoscopic
+embryotega
+embryotic
+embryotome
+embryotomy
+embryotrophic
+embryotrophy
+embryous
+embryulcia
+embryulcus
+embubble
+embuia
+embus
+embusk
+embuskin
+emcee
+eme
+emeer
+emeership
+Emeline
+emend
+emendable
+emendandum
+emendate
+emendation
+emendator
+emendatory
+emender
+emerald
+emeraldine
+emeraude
+emerge
+emergence
+emergency
+emergent
+emergently
+emergentness
+Emerita
+emerited
+emeritus
+emerize
+emerse
+emersed
+emersion
+Emersonian
+Emersonianism
+Emery
+emery
+Emesa
+Emesidae
+emesis
+emetatrophia
+emetic
+emetically
+emetine
+emetocathartic
+emetology
+emetomorphine
+emgalla
+emication
+emiction
+emictory
+emigrant
+emigrate
+emigration
+emigrational
+emigrationist
+emigrative
+emigrator
+emigratory
+emigree
+Emil
+Emilia
+Emily
+Emim
+eminence
+eminency
+eminent
+eminently
+emir
+emirate
+emirship
+emissarium
+emissary
+emissaryship
+emissile
+emission
+emissive
+emissivity
+emit
+emittent
+emitter
+Emm
+Emma
+emma
+Emmanuel
+emmarble
+emmarvel
+emmenagogic
+emmenagogue
+emmenic
+emmeniopathy
+emmenology
+emmensite
+Emmental
+emmer
+emmergoose
+emmet
+emmetrope
+emmetropia
+emmetropic
+emmetropism
+emmetropy
+Emmett
+emodin
+emollescence
+emolliate
+emollient
+emoloa
+emolument
+emolumental
+emolumentary
+emote
+emotion
+emotionable
+emotional
+emotionalism
+emotionalist
+emotionality
+emotionalization
+emotionalize
+emotionally
+emotioned
+emotionist
+emotionize
+emotionless
+emotionlessness
+emotive
+emotively
+emotiveness
+emotivity
+empacket
+empaistic
+empall
+empanel
+empanelment
+empanoply
+empaper
+emparadise
+emparchment
+empark
+empasm
+empathic
+empathically
+empathize
+empathy
+Empedoclean
+empeirema
+Empeo
+emperor
+emperorship
+empery
+Empetraceae
+empetraceous
+Empetrum
+emphases
+emphasis
+emphasize
+emphatic
+emphatical
+emphatically
+emphaticalness
+emphlysis
+emphractic
+emphraxis
+emphysema
+emphysematous
+emphyteusis
+emphyteuta
+emphyteutic
+empicture
+Empididae
+Empidonax
+empiecement
+Empire
+empire
+empirema
+empiric
+empirical
+empiricalness
+empiricism
+empiricist
+empirics
+empiriocritcism
+empiriocritical
+empiriological
+empirism
+empiristic
+emplace
+emplacement
+emplane
+emplastic
+emplastration
+emplastrum
+emplectite
+empleomania
+employ
+employability
+employable
+employed
+employee
+employer
+employless
+employment
+emplume
+empocket
+empodium
+empoison
+empoisonment
+emporetic
+emporeutic
+emporia
+emporial
+emporium
+empower
+empowerment
+empress
+emprise
+emprosthotonic
+emprosthotonos
+emprosthotonus
+empt
+emptier
+emptily
+emptiness
+emptings
+emptins
+emption
+emptional
+emptor
+empty
+emptyhearted
+emptysis
+empurple
+Empusa
+empyema
+empyemic
+empyesis
+empyocele
+empyreal
+empyrean
+empyreuma
+empyreumatic
+empyreumatical
+empyreumatize
+empyromancy
+emu
+emulable
+emulant
+emulate
+emulation
+emulative
+emulatively
+emulator
+emulatory
+emulatress
+emulgence
+emulgent
+emulous
+emulously
+emulousness
+emulsibility
+emulsible
+emulsifiability
+emulsifiable
+emulsification
+emulsifier
+emulsify
+emulsin
+emulsion
+emulsionize
+emulsive
+emulsoid
+emulsor
+emunctory
+emundation
+emyd
+Emydea
+emydian
+Emydidae
+Emydinae
+Emydosauria
+emydosaurian
+Emys
+en
+enable
+enablement
+enabler
+enact
+enactable
+enaction
+enactive
+enactment
+enactor
+enactory
+enaena
+enage
+Enajim
+enalid
+Enaliornis
+enaliosaur
+Enaliosauria
+enaliosaurian
+enallachrome
+enallage
+enaluron
+enam
+enamber
+enambush
+enamdar
+enamel
+enameler
+enameling
+enamelist
+enamelless
+enamellist
+enameloma
+enamelware
+enamor
+enamorato
+enamored
+enamoredness
+enamorment
+enamourment
+enanguish
+enanthem
+enanthema
+enanthematous
+enanthesis
+enantiobiosis
+enantioblastic
+enantioblastous
+enantiomer
+enantiomeride
+enantiomorph
+enantiomorphic
+enantiomorphism
+enantiomorphous
+enantiomorphously
+enantiomorphy
+enantiopathia
+enantiopathic
+enantiopathy
+enantiosis
+enantiotropic
+enantiotropy
+enantobiosis
+enapt
+enarbor
+enarbour
+enarch
+enarched
+enargite
+enarm
+enarme
+enarthrodia
+enarthrodial
+enarthrosis
+enate
+enatic
+enation
+enbrave
+encaenia
+encage
+encake
+encalendar
+encallow
+encamp
+encampment
+encanker
+encanthis
+encapsulate
+encapsulation
+encapsule
+encarditis
+encarnadine
+encarnalize
+encarpium
+encarpus
+encase
+encasement
+encash
+encashable
+encashment
+encasserole
+encastage
+encatarrhaphy
+encauma
+encaustes
+encaustic
+encaustically
+encave
+encefalon
+Encelia
+encell
+encenter
+encephala
+encephalalgia
+Encephalartos
+encephalasthenia
+encephalic
+encephalin
+encephalitic
+encephalitis
+encephalocele
+encephalocoele
+encephalodialysis
+encephalogram
+encephalograph
+encephalography
+encephaloid
+encephalolith
+encephalology
+encephaloma
+encephalomalacia
+encephalomalacosis
+encephalomalaxis
+encephalomeningitis
+encephalomeningocele
+encephalomere
+encephalomeric
+encephalometer
+encephalometric
+encephalomyelitis
+encephalomyelopathy
+encephalon
+encephalonarcosis
+encephalopathia
+encephalopathic
+encephalopathy
+encephalophyma
+encephalopsychesis
+encephalopyosis
+encephalorrhagia
+encephalosclerosis
+encephaloscope
+encephaloscopy
+encephalosepsis
+encephalospinal
+encephalothlipsis
+encephalotome
+encephalotomy
+encephalous
+enchain
+enchainment
+enchair
+enchalice
+enchannel
+enchant
+enchanter
+enchanting
+enchantingly
+enchantingness
+enchantment
+enchantress
+encharge
+encharnel
+enchase
+enchaser
+enchasten
+Enchelycephali
+enchequer
+enchest
+enchilada
+enchiridion
+Enchodontid
+Enchodontidae
+Enchodontoid
+Enchodus
+enchondroma
+enchondromatous
+enchondrosis
+enchorial
+enchurch
+enchylema
+enchylematous
+enchymatous
+enchytrae
+enchytraeid
+Enchytraeidae
+Enchytraeus
+encina
+encinal
+encincture
+encinder
+encinillo
+encipher
+encircle
+encirclement
+encircler
+encist
+encitadel
+enclaret
+enclasp
+enclave
+enclavement
+enclisis
+enclitic
+enclitical
+enclitically
+encloak
+encloister
+enclose
+encloser
+enclosure
+enclothe
+encloud
+encoach
+encode
+encoffin
+encoignure
+encoil
+encolden
+encollar
+encolor
+encolpion
+encolumn
+encomendero
+encomia
+encomiast
+encomiastic
+encomiastical
+encomiastically
+encomic
+encomienda
+encomiologic
+encomium
+encommon
+encompass
+encompasser
+encompassment
+encoop
+encorbelment
+encore
+encoronal
+encoronate
+encoronet
+encounter
+encounterable
+encounterer
+encourage
+encouragement
+encourager
+encouraging
+encouragingly
+encowl
+encraal
+encradle
+encranial
+encratic
+Encratism
+Encratite
+encraty
+encreel
+encrimson
+encrinal
+encrinic
+Encrinidae
+encrinidae
+encrinital
+encrinite
+encrinitic
+encrinitical
+encrinoid
+Encrinoidea
+Encrinus
+encrisp
+encroach
+encroacher
+encroachingly
+encroachment
+encrotchet
+encrown
+encrownment
+encrust
+encrustment
+encrypt
+encryption
+encuirassed
+encumber
+encumberer
+encumberingly
+encumberment
+encumbrance
+encumbrancer
+encup
+encurl
+encurtain
+encushion
+encyclic
+encyclical
+encyclopedia
+encyclopediac
+encyclopediacal
+encyclopedial
+encyclopedian
+encyclopediast
+encyclopedic
+encyclopedically
+encyclopedism
+encyclopedist
+encyclopedize
+encyrtid
+Encyrtidae
+encyst
+encystation
+encystment
+end
+endable
+endamage
+endamageable
+endamagement
+endamask
+endameba
+endamebic
+Endamoeba
+endamoebiasis
+endamoebic
+Endamoebidae
+endanger
+endangerer
+endangerment
+endangium
+endaortic
+endaortitis
+endarch
+endarchy
+endarterial
+endarteritis
+endarterium
+endaspidean
+endaze
+endboard
+endbrain
+endear
+endearance
+endeared
+endearedly
+endearedness
+endearing
+endearingly
+endearingness
+endearment
+endeavor
+endeavorer
+ended
+endeictic
+endellionite
+endemial
+endemic
+endemically
+endemicity
+endemiological
+endemiology
+endemism
+endenizen
+ender
+endere
+endermatic
+endermic
+endermically
+enderon
+enderonic
+endevil
+endew
+endgate
+endiadem
+endiaper
+ending
+endite
+endive
+endless
+endlessly
+endlessness
+endlichite
+endlong
+endmatcher
+endmost
+endoabdominal
+endoangiitis
+endoaortitis
+endoappendicitis
+endoarteritis
+endoauscultation
+endobatholithic
+endobiotic
+endoblast
+endoblastic
+endobronchial
+endobronchially
+endobronchitis
+endocannibalism
+endocardiac
+endocardial
+endocarditic
+endocarditis
+endocardium
+endocarp
+endocarpal
+endocarpic
+endocarpoid
+endocellular
+endocentric
+Endoceras
+Endoceratidae
+endoceratite
+endoceratitic
+endocervical
+endocervicitis
+endochondral
+endochorion
+endochorionic
+endochrome
+endochylous
+endoclinal
+endocline
+endocoelar
+endocoele
+endocoeliac
+endocolitis
+endocolpitis
+endocondensation
+endocone
+endoconidium
+endocorpuscular
+endocortex
+endocranial
+endocranium
+endocrinal
+endocrine
+endocrinic
+endocrinism
+endocrinological
+endocrinologist
+endocrinology
+endocrinopathic
+endocrinopathy
+endocrinotherapy
+endocrinous
+endocritic
+endocycle
+endocyclic
+endocyemate
+endocyst
+endocystitis
+endoderm
+endodermal
+endodermic
+endodermis
+endodontia
+endodontic
+endodontist
+endodynamomorphic
+endoenteritis
+endoenzyme
+endoesophagitis
+endofaradism
+endogalvanism
+endogamic
+endogamous
+endogamy
+endogastric
+endogastrically
+endogastritis
+endogen
+Endogenae
+endogenesis
+endogenetic
+endogenic
+endogenous
+endogenously
+endogeny
+endoglobular
+endognath
+endognathal
+endognathion
+endogonidium
+endointoxication
+endokaryogamy
+endolabyrinthitis
+endolaryngeal
+endolemma
+endolumbar
+endolymph
+endolymphangial
+endolymphatic
+endolymphic
+endolysin
+endomastoiditis
+endome
+endomesoderm
+endometrial
+endometritis
+endometrium
+endometry
+endomitosis
+endomitotic
+endomixis
+endomorph
+endomorphic
+endomorphism
+endomorphy
+Endomyces
+Endomycetaceae
+endomysial
+endomysium
+endoneurial
+endoneurium
+endonuclear
+endonucleolus
+endoparasite
+endoparasitic
+Endoparasitica
+endopathic
+endopelvic
+endopericarditis
+endoperidial
+endoperidium
+endoperitonitis
+endophagous
+endophagy
+endophasia
+endophasic
+endophlebitis
+endophragm
+endophragmal
+Endophyllaceae
+endophyllous
+Endophyllum
+endophytal
+endophyte
+endophytic
+endophytically
+endophytous
+endoplasm
+endoplasma
+endoplasmic
+endoplast
+endoplastron
+endoplastular
+endoplastule
+endopleura
+endopleural
+endopleurite
+endopleuritic
+endopod
+endopodite
+endopoditic
+endoproct
+Endoprocta
+endoproctous
+endopsychic
+Endopterygota
+endopterygote
+endopterygotic
+endopterygotism
+endopterygotous
+endorachis
+endoral
+endore
+endorhinitis
+endorsable
+endorsation
+endorse
+endorsed
+endorsee
+endorsement
+endorser
+endorsingly
+endosalpingitis
+endosarc
+endosarcode
+endosarcous
+endosclerite
+endoscope
+endoscopic
+endoscopy
+endosecretory
+endosepsis
+endosiphon
+endosiphonal
+endosiphonate
+endosiphuncle
+endoskeletal
+endoskeleton
+endosmometer
+endosmometric
+endosmosic
+endosmosis
+endosmotic
+endosmotically
+endosome
+endosperm
+endospermic
+endospore
+endosporium
+endosporous
+endoss
+endosteal
+endosteally
+endosteitis
+endosteoma
+endosternite
+endosternum
+endosteum
+endostitis
+endostoma
+endostome
+endostosis
+endostracal
+endostracum
+endostylar
+endostyle
+endostylic
+endotheca
+endothecal
+endothecate
+endothecial
+endothecium
+endothelia
+endothelial
+endothelioblastoma
+endotheliocyte
+endothelioid
+endotheliolysin
+endotheliolytic
+endothelioma
+endotheliomyoma
+endotheliomyxoma
+endotheliotoxin
+endothelium
+endothermal
+endothermic
+endothermous
+endothermy
+Endothia
+endothoracic
+endothorax
+Endothrix
+endothys
+endotoxic
+endotoxin
+endotoxoid
+endotracheitis
+endotrachelitis
+Endotrophi
+endotrophic
+endotys
+endovaccination
+endovasculitis
+endovenous
+endow
+endower
+endowment
+endozoa
+endpiece
+Endromididae
+Endromis
+endue
+enduement
+endungeon
+endura
+endurability
+endurable
+endurableness
+endurably
+endurance
+endurant
+endure
+endurer
+enduring
+enduringly
+enduringness
+endways
+endwise
+endyma
+endymal
+Endymion
+endysis
+Eneas
+eneclann
+enema
+enemy
+enemylike
+enemyship
+enepidermic
+energeia
+energesis
+energetic
+energetical
+energetically
+energeticalness
+energeticist
+energetics
+energetistic
+energic
+energical
+energid
+energism
+energist
+energize
+energizer
+energumen
+energumenon
+energy
+enervate
+enervation
+enervative
+enervator
+eneuch
+eneugh
+enface
+enfacement
+enfamous
+enfasten
+enfatico
+enfeature
+enfeeble
+enfeeblement
+enfeebler
+enfelon
+enfeoff
+enfeoffment
+enfester
+enfetter
+enfever
+enfigure
+enfilade
+enfilading
+enfile
+enfiled
+enflagellate
+enflagellation
+enflesh
+enfleurage
+enflower
+enfoil
+enfold
+enfolden
+enfolder
+enfoldment
+enfonced
+enforce
+enforceability
+enforceable
+enforced
+enforcedly
+enforcement
+enforcer
+enforcibility
+enforcible
+enforcingly
+enfork
+enfoul
+enframe
+enframement
+enfranchisable
+enfranchise
+enfranchisement
+enfranchiser
+enfree
+enfrenzy
+enfuddle
+enfurrow
+engage
+engaged
+engagedly
+engagedness
+engagement
+engager
+engaging
+engagingly
+engagingness
+engaol
+engarb
+engarble
+engarland
+engarment
+engarrison
+engastrimyth
+engastrimythic
+engaud
+engaze
+Engelmannia
+engem
+engender
+engenderer
+engenderment
+engerminate
+enghosted
+engild
+engine
+engineer
+engineering
+engineership
+enginehouse
+engineless
+enginelike
+engineman
+enginery
+enginous
+engird
+engirdle
+engirt
+engjateigur
+englacial
+englacially
+englad
+engladden
+Englander
+Engler
+Englerophoenix
+Englifier
+Englify
+English
+Englishable
+Englisher
+Englishhood
+Englishism
+Englishize
+Englishly
+Englishman
+Englishness
+Englishry
+Englishwoman
+englobe
+englobement
+engloom
+englory
+englut
+englyn
+engnessang
+engobe
+engold
+engolden
+engore
+engorge
+engorgement
+engouled
+engrace
+engraff
+engraft
+engraftation
+engrafter
+engraftment
+engrail
+engrailed
+engrailment
+engrain
+engrained
+engrainedly
+engrainer
+engram
+engramma
+engrammatic
+engrammic
+engrandize
+engrandizement
+engraphia
+engraphic
+engraphically
+engraphy
+engrapple
+engrasp
+Engraulidae
+Engraulis
+engrave
+engraved
+engravement
+engraver
+engraving
+engreen
+engrieve
+engroove
+engross
+engrossed
+engrossedly
+engrosser
+engrossing
+engrossingly
+engrossingness
+engrossment
+enguard
+engulf
+engulfment
+engyscope
+engysseismology
+Engystomatidae
+enhallow
+enhalo
+enhamper
+enhance
+enhanced
+enhancement
+enhancer
+enhancive
+enharmonic
+enharmonical
+enharmonically
+enhat
+enhaunt
+enhearse
+enheart
+enhearten
+enhedge
+enhelm
+enhemospore
+enherit
+enheritage
+enheritance
+enhorror
+enhunger
+enhusk
+Enhydra
+Enhydrinae
+Enhydris
+enhydrite
+enhydritic
+enhydros
+enhydrous
+enhypostasia
+enhypostasis
+enhypostatic
+enhypostatize
+eniac
+Enicuridae
+Enid
+Enif
+enigma
+enigmatic
+enigmatical
+enigmatically
+enigmaticalness
+enigmatist
+enigmatization
+enigmatize
+enigmatographer
+enigmatography
+enigmatology
+enisle
+enjail
+enjamb
+enjambed
+enjambment
+enjelly
+enjeopard
+enjeopardy
+enjewel
+enjoin
+enjoinder
+enjoiner
+enjoinment
+enjoy
+enjoyable
+enjoyableness
+enjoyably
+enjoyer
+enjoying
+enjoyingly
+enjoyment
+enkerchief
+enkernel
+Enki
+Enkidu
+enkindle
+enkindler
+enkraal
+enlace
+enlacement
+enlard
+enlarge
+enlargeable
+enlargeableness
+enlarged
+enlargedly
+enlargedness
+enlargement
+enlarger
+enlarging
+enlargingly
+enlaurel
+enleaf
+enleague
+enlevement
+enlief
+enlife
+enlight
+enlighten
+enlightened
+enlightenedly
+enlightenedness
+enlightener
+enlightening
+enlighteningly
+enlightenment
+enlink
+enlinkment
+enlist
+enlisted
+enlister
+enlistment
+enliven
+enlivener
+enlivening
+enliveningly
+enlivenment
+enlock
+enlodge
+enlodgement
+enmarble
+enmask
+enmass
+enmesh
+enmeshment
+enmist
+enmity
+enmoss
+enmuffle
+enneacontahedral
+enneacontahedron
+ennead
+enneadianome
+enneadic
+enneagon
+enneagynous
+enneahedral
+enneahedria
+enneahedron
+enneapetalous
+enneaphyllous
+enneasemic
+enneasepalous
+enneaspermous
+enneastyle
+enneastylos
+enneasyllabic
+enneateric
+enneatic
+enneatical
+ennerve
+enniche
+ennoble
+ennoblement
+ennobler
+ennobling
+ennoblingly
+ennoic
+ennomic
+ennui
+Enoch
+Enochic
+enocyte
+enodal
+enodally
+enoil
+enol
+enolate
+enolic
+enolizable
+enolization
+enolize
+enomania
+enomaniac
+enomotarch
+enomoty
+enophthalmos
+enophthalmus
+Enopla
+enoplan
+enoptromancy
+enorganic
+enorm
+enormity
+enormous
+enormously
+enormousness
+Enos
+enostosis
+enough
+enounce
+enouncement
+enow
+enphytotic
+enplane
+enquicken
+enquire
+enquirer
+enquiry
+enrace
+enrage
+enraged
+enragedly
+enragement
+enrange
+enrank
+enrapt
+enrapture
+enrapturer
+enravish
+enravishingly
+enravishment
+enray
+enregiment
+enregister
+enregistration
+enregistry
+enrib
+enrich
+enricher
+enriching
+enrichingly
+enrichment
+enring
+enrive
+enrobe
+enrobement
+enrober
+enrockment
+enrol
+enroll
+enrolled
+enrollee
+enroller
+enrollment
+enrolment
+enroot
+enrough
+enruin
+enrut
+ens
+ensaffron
+ensaint
+ensample
+ensand
+ensandal
+ensanguine
+ensate
+enscene
+ensconce
+enscroll
+ensculpture
+ense
+enseam
+enseat
+enseem
+ensellure
+ensemble
+ensepulcher
+ensepulchre
+enseraph
+enserf
+ensete
+enshade
+enshadow
+enshawl
+ensheathe
+enshell
+enshelter
+enshield
+enshrine
+enshrinement
+enshroud
+Ensiferi
+ensiform
+ensign
+ensigncy
+ensignhood
+ensignment
+ensignry
+ensignship
+ensilage
+ensilate
+ensilation
+ensile
+ensilist
+ensilver
+ensisternum
+ensky
+enslave
+enslavedness
+enslavement
+enslaver
+ensmall
+ensnare
+ensnarement
+ensnarer
+ensnaring
+ensnaringly
+ensnarl
+ensnow
+ensorcelize
+ensorcell
+ensoul
+enspell
+ensphere
+enspirit
+enstamp
+enstar
+enstate
+enstatite
+enstatitic
+enstatolite
+ensteel
+enstool
+enstore
+enstrengthen
+ensuable
+ensuance
+ensuant
+ensue
+ensuer
+ensuingly
+ensulphur
+ensure
+ensurer
+enswathe
+enswathement
+ensweep
+entablature
+entablatured
+entablement
+entach
+entad
+Entada
+entail
+entailable
+entailer
+entailment
+ental
+entame
+Entamoeba
+entamoebiasis
+entamoebic
+entangle
+entangled
+entangledly
+entangledness
+entanglement
+entangler
+entangling
+entanglingly
+entapophysial
+entapophysis
+entarthrotic
+entasia
+entasis
+entelam
+entelechy
+entellus
+Entelodon
+entelodont
+entempest
+entemple
+entente
+Ententophil
+entepicondylar
+enter
+enterable
+enteraden
+enteradenographic
+enteradenography
+enteradenological
+enteradenology
+enteral
+enteralgia
+enterate
+enterauxe
+enterclose
+enterectomy
+enterer
+entergogenic
+enteria
+enteric
+entericoid
+entering
+enteritidis
+enteritis
+entermete
+enteroanastomosis
+enterobiliary
+enterocele
+enterocentesis
+enterochirurgia
+enterochlorophyll
+enterocholecystostomy
+enterocinesia
+enterocinetic
+enterocleisis
+enteroclisis
+enteroclysis
+Enterocoela
+enterocoele
+enterocoelic
+enterocoelous
+enterocolitis
+enterocolostomy
+enterocrinin
+enterocyst
+enterocystoma
+enterodynia
+enteroepiplocele
+enterogastritis
+enterogastrone
+enterogenous
+enterogram
+enterograph
+enterography
+enterohelcosis
+enterohemorrhage
+enterohepatitis
+enterohydrocele
+enteroid
+enterointestinal
+enteroischiocele
+enterokinase
+enterokinesia
+enterokinetic
+enterolith
+enterolithiasis
+Enterolobium
+enterology
+enteromegalia
+enteromegaly
+enteromere
+enteromesenteric
+Enteromorpha
+enteromycosis
+enteromyiasis
+enteron
+enteroneuritis
+enteroparalysis
+enteroparesis
+enteropathy
+enteropexia
+enteropexy
+enterophthisis
+enteroplasty
+enteroplegia
+enteropneust
+Enteropneusta
+enteropneustan
+enteroptosis
+enteroptotic
+enterorrhagia
+enterorrhaphy
+enterorrhea
+enteroscope
+enterosepsis
+enterospasm
+enterostasis
+enterostenosis
+enterostomy
+enterosyphilis
+enterotome
+enterotomy
+enterotoxemia
+enterotoxication
+enterozoa
+enterozoan
+enterozoic
+enterprise
+enterpriseless
+enterpriser
+enterprising
+enterprisingly
+enterritoriality
+entertain
+entertainable
+entertainer
+entertaining
+entertainingly
+entertainingness
+entertainment
+enthalpy
+entheal
+enthelmintha
+enthelminthes
+enthelminthic
+enthetic
+enthral
+enthraldom
+enthrall
+enthralldom
+enthraller
+enthralling
+enthrallingly
+enthrallment
+enthralment
+enthrone
+enthronement
+enthronization
+enthronize
+enthuse
+enthusiasm
+enthusiast
+enthusiastic
+enthusiastical
+enthusiastically
+enthusiastly
+enthymematic
+enthymematical
+enthymeme
+entia
+entice
+enticeable
+enticeful
+enticement
+enticer
+enticing
+enticingly
+enticingness
+entifical
+entification
+entify
+entincture
+entire
+entirely
+entireness
+entirety
+entiris
+entitative
+entitatively
+entitle
+entitlement
+entity
+entoblast
+entoblastic
+entobranchiate
+entobronchium
+entocalcaneal
+entocarotid
+entocele
+entocnemial
+entocoele
+entocoelic
+entocondylar
+entocondyle
+entocondyloid
+entocone
+entoconid
+entocornea
+entocranial
+entocuneiform
+entocuniform
+entocyemate
+entocyst
+entoderm
+entodermal
+entodermic
+entogastric
+entogenous
+entoglossal
+entohyal
+entoil
+entoilment
+Entoloma
+entomb
+entombment
+entomere
+entomeric
+entomic
+entomical
+entomion
+entomogenous
+entomoid
+entomologic
+entomological
+entomologically
+entomologist
+entomologize
+entomology
+Entomophaga
+entomophagan
+entomophagous
+Entomophila
+entomophilous
+entomophily
+Entomophthora
+Entomophthoraceae
+entomophthoraceous
+Entomophthorales
+entomophthorous
+entomophytous
+Entomosporium
+Entomostraca
+entomostracan
+entomostracous
+entomotaxy
+entomotomist
+entomotomy
+entone
+entonement
+entoolitic
+entoparasite
+entoparasitic
+entoperipheral
+entophytal
+entophyte
+entophytic
+entophytically
+entophytous
+entopic
+entopical
+entoplasm
+entoplastic
+entoplastral
+entoplastron
+entopopliteal
+Entoprocta
+entoproctous
+entopterygoid
+entoptic
+entoptical
+entoptically
+entoptics
+entoptoscope
+entoptoscopic
+entoptoscopy
+entoretina
+entorganism
+entosarc
+entosclerite
+entosphenal
+entosphenoid
+entosphere
+entosternal
+entosternite
+entosternum
+entothorax
+entotic
+Entotrophi
+entotympanic
+entourage
+entozoa
+entozoal
+entozoan
+entozoarian
+entozoic
+entozoological
+entozoologically
+entozoologist
+entozoology
+entozoon
+entracte
+entrail
+entrails
+entrain
+entrainer
+entrainment
+entrammel
+entrance
+entrancedly
+entrancement
+entranceway
+entrancing
+entrancingly
+entrant
+entrap
+entrapment
+entrapper
+entrappingly
+entreasure
+entreat
+entreating
+entreatingly
+entreatment
+entreaty
+entree
+entremets
+entrench
+entrenchment
+entrepas
+entrepot
+entrepreneur
+entrepreneurial
+entrepreneurship
+entresol
+entrochite
+entrochus
+entropion
+entropionize
+entropium
+entropy
+entrough
+entrust
+entrustment
+entry
+entryman
+entryway
+enturret
+entwine
+entwinement
+entwist
+Entyloma
+enucleate
+enucleation
+enucleator
+Enukki
+enumerable
+enumerate
+enumeration
+enumerative
+enumerator
+enunciability
+enunciable
+enunciate
+enunciation
+enunciative
+enunciatively
+enunciator
+enunciatory
+enure
+enuresis
+enuretic
+enurny
+envapor
+envapour
+envassal
+envassalage
+envault
+enveil
+envelop
+envelope
+enveloper
+envelopment
+envenom
+envenomation
+enverdure
+envermeil
+enviable
+enviableness
+enviably
+envied
+envier
+envineyard
+envious
+enviously
+enviousness
+environ
+environage
+environal
+environic
+environment
+environmental
+environmentalism
+environmentalist
+environmentally
+environs
+envisage
+envisagement
+envision
+envolume
+envoy
+envoyship
+envy
+envying
+envyingly
+enwallow
+enwiden
+enwind
+enwisen
+enwoman
+enwomb
+enwood
+enworthed
+enwound
+enwrap
+enwrapment
+enwreathe
+enwrite
+enwrought
+enzone
+enzootic
+enzooty
+enzym
+enzymatic
+enzyme
+enzymic
+enzymically
+enzymologist
+enzymology
+enzymolysis
+enzymolytic
+enzymosis
+enzymotic
+eoan
+Eoanthropus
+Eocarboniferous
+Eocene
+Eodevonian
+Eogaea
+Eogaean
+Eoghanacht
+Eohippus
+eolation
+eolith
+eolithic
+Eomecon
+eon
+eonism
+Eopalaeozoic
+Eopaleozoic
+eophyte
+eophytic
+eophyton
+eorhyolite
+eosate
+Eosaurus
+eoside
+eosin
+eosinate
+eosinic
+eosinoblast
+eosinophile
+eosinophilia
+eosinophilic
+eosinophilous
+eosphorite
+Eozoic
+eozoon
+eozoonal
+epacmaic
+epacme
+epacrid
+Epacridaceae
+epacridaceous
+Epacris
+epact
+epactal
+epagoge
+epagogic
+epagomenae
+epagomenal
+epagomenic
+epagomenous
+epaleaceous
+epalpate
+epanadiplosis
+Epanagoge
+epanalepsis
+epanaleptic
+epanaphora
+epanaphoral
+epanastrophe
+epanisognathism
+epanisognathous
+epanodos
+epanody
+Epanorthidae
+epanorthosis
+epanorthotic
+epanthous
+epapillate
+epappose
+eparch
+eparchate
+Eparchean
+eparchial
+eparchy
+eparcuale
+eparterial
+epaule
+epaulement
+epaulet
+epauleted
+epauletted
+epauliere
+epaxial
+epaxially
+epedaphic
+epee
+epeeist
+Epeira
+epeiric
+epeirid
+Epeiridae
+epeirogenesis
+epeirogenetic
+epeirogenic
+epeirogeny
+epeisodion
+epembryonic
+epencephal
+epencephalic
+epencephalon
+ependyma
+ependymal
+ependyme
+ependymitis
+ependymoma
+ependytes
+epenthesis
+epenthesize
+epenthetic
+epephragmal
+epepophysial
+epepophysis
+epergne
+eperotesis
+Eperua
+epexegesis
+epexegetic
+epexegetical
+epexegetically
+epha
+ephah
+epharmonic
+epharmony
+ephebe
+ephebeion
+ephebeum
+ephebic
+ephebos
+ephebus
+ephectic
+Ephedra
+Ephedraceae
+ephedrine
+ephelcystic
+ephelis
+Ephemera
+ephemera
+ephemerae
+ephemeral
+ephemerality
+ephemerally
+ephemeralness
+ephemeran
+ephemerid
+Ephemerida
+Ephemeridae
+ephemerides
+ephemeris
+ephemerist
+ephemeromorph
+ephemeromorphic
+ephemeron
+Ephemeroptera
+ephemerous
+Ephesian
+Ephesine
+ephetae
+ephete
+ephetic
+ephialtes
+ephidrosis
+ephippial
+ephippium
+ephod
+ephor
+ephoral
+ephoralty
+ephorate
+ephoric
+ephorship
+ephorus
+ephphatha
+Ephraim
+Ephraimite
+Ephraimitic
+Ephraimitish
+Ephraitic
+Ephrathite
+Ephthalite
+Ephthianura
+ephthianure
+Ephydra
+ephydriad
+ephydrid
+Ephydridae
+ephymnium
+ephyra
+ephyrula
+epibasal
+Epibaterium
+epibatholithic
+epibenthic
+epibenthos
+epiblast
+epiblastema
+epiblastic
+epiblema
+epibole
+epibolic
+epibolism
+epiboly
+epiboulangerite
+epibranchial
+epic
+epical
+epically
+epicalyx
+epicanthic
+epicanthus
+epicardia
+epicardiac
+epicardial
+epicardium
+epicarid
+epicaridan
+Epicaridea
+Epicarides
+epicarp
+Epicauta
+epicede
+epicedial
+epicedian
+epicedium
+epicele
+epicene
+epicenism
+epicenity
+epicenter
+epicentral
+epicentrum
+Epiceratodus
+epicerebral
+epicheirema
+epichil
+epichile
+epichilium
+epichindrotic
+epichirema
+epichondrosis
+epichordal
+epichorial
+epichoric
+epichorion
+epichoristic
+Epichristian
+epicism
+epicist
+epiclastic
+epicleidian
+epicleidium
+epiclesis
+epiclidal
+epiclinal
+epicly
+epicnemial
+Epicoela
+epicoelar
+epicoele
+epicoelia
+epicoeliac
+epicoelian
+epicoeloma
+epicoelous
+epicolic
+epicondylar
+epicondyle
+epicondylian
+epicondylic
+epicontinental
+epicoracohumeral
+epicoracoid
+epicoracoidal
+epicormic
+epicorolline
+epicortical
+epicostal
+epicotyl
+epicotyleal
+epicotyledonary
+epicranial
+epicranium
+epicranius
+Epicrates
+epicrisis
+epicritic
+epicrystalline
+Epictetian
+epicure
+Epicurean
+Epicureanism
+epicurish
+epicurishly
+Epicurism
+Epicurize
+epicycle
+epicyclic
+epicyclical
+epicycloid
+epicycloidal
+epicyemate
+epicyesis
+epicystotomy
+epicyte
+epideictic
+epideictical
+epideistic
+epidemic
+epidemical
+epidemically
+epidemicalness
+epidemicity
+epidemiographist
+epidemiography
+epidemiological
+epidemiologist
+epidemiology
+epidemy
+epidendral
+epidendric
+Epidendron
+Epidendrum
+epiderm
+epiderma
+epidermal
+epidermatic
+epidermatoid
+epidermatous
+epidermic
+epidermical
+epidermically
+epidermidalization
+epidermis
+epidermization
+epidermoid
+epidermoidal
+epidermolysis
+epidermomycosis
+Epidermophyton
+epidermophytosis
+epidermose
+epidermous
+epidesmine
+epidialogue
+epidiascope
+epidiascopic
+epidictic
+epidictical
+epididymal
+epididymectomy
+epididymis
+epididymite
+epididymitis
+epididymodeferentectomy
+epididymodeferential
+epididymovasostomy
+epidiorite
+epidiorthosis
+epidosite
+epidote
+epidotic
+epidotiferous
+epidotization
+epidural
+epidymides
+epifascial
+epifocal
+epifolliculitis
+Epigaea
+epigamic
+epigaster
+epigastraeum
+epigastral
+epigastrial
+epigastric
+epigastrical
+epigastriocele
+epigastrium
+epigastrocele
+epigeal
+epigean
+epigeic
+epigene
+epigenesis
+epigenesist
+epigenetic
+epigenetically
+epigenic
+epigenist
+epigenous
+epigeous
+epiglottal
+epiglottic
+epiglottidean
+epiglottiditis
+epiglottis
+epiglottitis
+epignathous
+epigonal
+epigonation
+epigone
+Epigoni
+epigonic
+Epigonichthyidae
+Epigonichthys
+epigonium
+epigonos
+epigonous
+Epigonus
+epigram
+epigrammatic
+epigrammatical
+epigrammatically
+epigrammatism
+epigrammatist
+epigrammatize
+epigrammatizer
+epigraph
+epigrapher
+epigraphic
+epigraphical
+epigraphically
+epigraphist
+epigraphy
+epiguanine
+epigyne
+epigynous
+epigynum
+epigyny
+Epihippus
+epihyal
+epihydric
+epihydrinic
+epikeia
+epiklesis
+Epikouros
+epilabrum
+Epilachna
+Epilachnides
+epilamellar
+epilaryngeal
+epilate
+epilation
+epilatory
+epilegomenon
+epilemma
+epilemmal
+epilepsy
+epileptic
+epileptically
+epileptiform
+epileptogenic
+epileptogenous
+epileptoid
+epileptologist
+epileptology
+epilimnion
+epilobe
+Epilobiaceae
+Epilobium
+epilogation
+epilogic
+epilogical
+epilogist
+epilogistic
+epilogize
+epilogue
+Epimachinae
+epimacus
+epimandibular
+epimanikia
+Epimedium
+Epimenidean
+epimer
+epimeral
+epimere
+epimeric
+epimeride
+epimerite
+epimeritic
+epimeron
+epimerum
+epimorphic
+epimorphosis
+epimysium
+epimyth
+epinaos
+epinastic
+epinastically
+epinasty
+epineolithic
+Epinephelidae
+Epinephelus
+epinephrine
+epinette
+epineural
+epineurial
+epineurium
+epinglette
+epinicial
+epinician
+epinicion
+epinine
+epiopticon
+epiotic
+Epipactis
+epipaleolithic
+epiparasite
+epiparodos
+epipastic
+epiperipheral
+epipetalous
+epiphanous
+Epiphany
+epipharyngeal
+epipharynx
+Epiphegus
+epiphenomenal
+epiphenomenalism
+epiphenomenalist
+epiphenomenon
+epiphloedal
+epiphloedic
+epiphloeum
+epiphonema
+epiphora
+epiphragm
+epiphylline
+epiphyllous
+Epiphyllum
+epiphysary
+epiphyseal
+epiphyseolysis
+epiphysial
+epiphysis
+epiphysitis
+epiphytal
+epiphyte
+epiphytic
+epiphytical
+epiphytically
+epiphytism
+epiphytology
+epiphytotic
+epiphytous
+epipial
+epiplankton
+epiplanktonic
+epiplasm
+epiplasmic
+epiplastral
+epiplastron
+epiplectic
+epipleura
+epipleural
+epiplexis
+epiploce
+epiplocele
+epiploic
+epiploitis
+epiploon
+epiplopexy
+epipodial
+epipodiale
+epipodite
+epipoditic
+epipodium
+epipolic
+epipolism
+epipolize
+epiprecoracoid
+Epipsychidion
+epipteric
+epipterous
+epipterygoid
+epipubic
+epipubis
+epirhizous
+epirogenic
+epirogeny
+Epirote
+Epirotic
+epirotulian
+epirrhema
+epirrhematic
+epirrheme
+episarcine
+episcenium
+episclera
+episcleral
+episcleritis
+episcopable
+episcopacy
+Episcopal
+episcopal
+episcopalian
+Episcopalianism
+Episcopalianize
+episcopalism
+episcopality
+Episcopally
+episcopally
+episcopate
+episcopature
+episcope
+episcopicide
+episcopization
+episcopize
+episcopolatry
+episcotister
+episematic
+episepalous
+episiocele
+episiohematoma
+episioplasty
+episiorrhagia
+episiorrhaphy
+episiostenosis
+episiotomy
+episkeletal
+episkotister
+episodal
+episode
+episodial
+episodic
+episodical
+episodically
+epispadiac
+epispadias
+epispastic
+episperm
+epispermic
+epispinal
+episplenitis
+episporangium
+epispore
+episporium
+epistapedial
+epistasis
+epistatic
+epistaxis
+epistemic
+epistemolog
+epistemological
+epistemologically
+epistemologist
+epistemology
+epistemonic
+epistemonical
+epistemophilia
+epistemophiliac
+epistemophilic
+episternal
+episternalia
+episternite
+episternum
+epistilbite
+epistlar
+epistle
+epistler
+epistolarian
+epistolarily
+epistolary
+epistolatory
+epistoler
+epistolet
+epistolic
+epistolical
+epistolist
+epistolizable
+epistolization
+epistolize
+epistolizer
+epistolographer
+epistolographic
+epistolographist
+epistolography
+epistoma
+epistomal
+epistome
+epistomian
+epistroma
+epistrophe
+epistropheal
+epistropheus
+epistrophic
+epistrophy
+epistylar
+epistyle
+Epistylis
+episyllogism
+episynaloephe
+episynthetic
+episyntheton
+epitactic
+epitaph
+epitapher
+epitaphial
+epitaphian
+epitaphic
+epitaphical
+epitaphist
+epitaphize
+epitaphless
+epitasis
+epitela
+epitendineum
+epitenon
+epithalamia
+epithalamial
+epithalamiast
+epithalamic
+epithalamion
+epithalamium
+epithalamize
+epithalamus
+epithalamy
+epithalline
+epitheca
+epithecal
+epithecate
+epithecium
+epithelia
+epithelial
+epithelioblastoma
+epithelioceptor
+epitheliogenetic
+epithelioglandular
+epithelioid
+epitheliolysin
+epitheliolysis
+epitheliolytic
+epithelioma
+epitheliomatous
+epitheliomuscular
+epitheliosis
+epitheliotoxin
+epithelium
+epithelization
+epithelize
+epitheloid
+epithem
+epithesis
+epithet
+epithetic
+epithetical
+epithetically
+epithetician
+epithetize
+epitheton
+epithumetic
+epithyme
+epithymetic
+epithymetical
+epitimesis
+epitoke
+epitomator
+epitomatory
+epitome
+epitomic
+epitomical
+epitomically
+epitomist
+epitomization
+epitomize
+epitomizer
+epitonic
+Epitoniidae
+epitonion
+Epitonium
+epitoxoid
+epitrachelion
+epitrichial
+epitrichium
+epitrite
+epitritic
+epitrochlea
+epitrochlear
+epitrochoid
+epitrochoidal
+epitrope
+epitrophic
+epitrophy
+epituberculosis
+epituberculous
+epitympanic
+epitympanum
+epityphlitis
+epityphlon
+epiural
+epivalve
+epixylous
+epizeuxis
+Epizoa
+epizoa
+epizoal
+epizoan
+epizoarian
+epizoic
+epizoicide
+epizoon
+epizootic
+epizootiology
+epoch
+epocha
+epochal
+epochally
+epochism
+epochist
+epode
+epodic
+epollicate
+Epomophorus
+eponychium
+eponym
+eponymic
+eponymism
+eponymist
+eponymize
+eponymous
+eponymus
+eponymy
+epoophoron
+epopee
+epopoean
+epopoeia
+epopoeist
+epopt
+epoptes
+epoptic
+epoptist
+epornitic
+epornitically
+epos
+Eppie
+Eppy
+Eproboscidea
+epruinose
+epsilon
+Epsom
+epsomite
+Eptatretidae
+Eptatretus
+epulary
+epulation
+epulis
+epulo
+epuloid
+epulosis
+epulotic
+epupillate
+epural
+epurate
+epuration
+epyllion
+equability
+equable
+equableness
+equably
+equaeval
+equal
+equalable
+equaling
+equalist
+equalitarian
+equalitarianism
+equality
+equalization
+equalize
+equalizer
+equalizing
+equalling
+equally
+equalness
+equangular
+equanimity
+equanimous
+equanimously
+equanimousness
+equant
+equatable
+equate
+equation
+equational
+equationally
+equationism
+equationist
+equator
+equatorial
+equatorially
+equatorward
+equatorwards
+equerry
+equerryship
+equestrial
+equestrian
+equestrianism
+equestrianize
+equestrianship
+equestrienne
+equianchorate
+equiangle
+equiangular
+equiangularity
+equianharmonic
+equiarticulate
+equiatomic
+equiaxed
+equiaxial
+equibalance
+equibiradiate
+equicellular
+equichangeable
+equicohesive
+equiconvex
+equicostate
+equicrural
+equicurve
+equid
+equidense
+equidensity
+equidiagonal
+equidifferent
+equidimensional
+equidistance
+equidistant
+equidistantial
+equidistantly
+equidistribution
+equidiurnal
+equidivision
+equidominant
+equidurable
+equielliptical
+equiexcellency
+equiform
+equiformal
+equiformity
+equiglacial
+equigranular
+equijacent
+equilateral
+equilaterally
+equilibrant
+equilibrate
+equilibration
+equilibrative
+equilibrator
+equilibratory
+equilibria
+equilibrial
+equilibriate
+equilibrio
+equilibrious
+equilibrist
+equilibristat
+equilibristic
+equilibrity
+equilibrium
+equilibrize
+equilobate
+equilobed
+equilocation
+equilucent
+equimodal
+equimolar
+equimolecular
+equimomental
+equimultiple
+equinate
+equine
+equinecessary
+equinely
+equinia
+equinity
+equinoctial
+equinoctially
+equinovarus
+equinox
+equinumerally
+equinus
+equiomnipotent
+equip
+equipaga
+equipage
+equiparant
+equiparate
+equiparation
+equipartile
+equipartisan
+equipartition
+equiped
+equipedal
+equiperiodic
+equipluve
+equipment
+equipoise
+equipollence
+equipollency
+equipollent
+equipollently
+equipollentness
+equiponderance
+equiponderancy
+equiponderant
+equiponderate
+equiponderation
+equipostile
+equipotent
+equipotential
+equipotentiality
+equipper
+equiprobabilism
+equiprobabilist
+equiprobability
+equiproducing
+equiproportional
+equiproportionality
+equiradial
+equiradiate
+equiradical
+equirotal
+equisegmented
+Equisetaceae
+equisetaceous
+Equisetales
+equisetic
+Equisetum
+equisided
+equisignal
+equisized
+equison
+equisonance
+equisonant
+equispaced
+equispatial
+equisufficiency
+equisurface
+equitable
+equitableness
+equitably
+equitangential
+equitant
+equitation
+equitative
+equitemporal
+equitemporaneous
+equites
+equitist
+equitriangular
+equity
+equivalence
+equivalenced
+equivalency
+equivalent
+equivalently
+equivaliant
+equivalue
+equivaluer
+equivalve
+equivalved
+equivalvular
+equivelocity
+equivocacy
+equivocal
+equivocality
+equivocally
+equivocalness
+equivocate
+equivocatingly
+equivocation
+equivocator
+equivocatory
+equivoluminal
+equivoque
+equivorous
+equivote
+equoid
+equoidean
+equuleus
+Equus
+er
+era
+erade
+eradiate
+eradiation
+eradicable
+eradicant
+eradicate
+eradication
+eradicative
+eradicator
+eradicatory
+eradiculose
+Eragrostis
+eral
+eranist
+Eranthemum
+Eranthis
+erasable
+erase
+erased
+erasement
+eraser
+erasion
+Erasmian
+Erasmus
+Erastian
+Erastianism
+Erastianize
+Erastus
+erasure
+Erava
+erbia
+erbium
+erd
+erdvark
+ere
+Erechtheum
+Erechtheus
+Erechtites
+erect
+erectable
+erecter
+erectile
+erectility
+erecting
+erection
+erective
+erectly
+erectness
+erectopatent
+erector
+erelong
+eremacausis
+Eremian
+eremic
+eremital
+eremite
+eremiteship
+eremitic
+eremitical
+eremitish
+eremitism
+Eremochaeta
+eremochaetous
+eremology
+eremophyte
+Eremopteris
+Eremurus
+erenach
+erenow
+erepsin
+erept
+ereptase
+ereptic
+ereption
+erethic
+erethisia
+erethism
+erethismic
+erethistic
+erethitic
+Erethizon
+Erethizontidae
+Eretrian
+erewhile
+erewhiles
+erg
+ergal
+ergamine
+Ergane
+ergasia
+ergasterion
+ergastic
+ergastoplasm
+ergastoplasmic
+ergastulum
+ergatandromorph
+ergatandromorphic
+ergatandrous
+ergatandry
+ergates
+ergatocracy
+ergatocrat
+ergatogyne
+ergatogynous
+ergatogyny
+ergatoid
+ergatomorph
+ergatomorphic
+ergatomorphism
+ergmeter
+ergodic
+ergogram
+ergograph
+ergographic
+ergoism
+ergology
+ergomaniac
+ergometer
+ergometric
+ergometrine
+ergon
+ergonovine
+ergophile
+ergophobia
+ergophobiac
+ergoplasm
+ergostat
+ergosterin
+ergosterol
+ergot
+ergotamine
+ergotaminine
+ergoted
+ergothioneine
+ergotic
+ergotin
+ergotinine
+ergotism
+ergotist
+ergotization
+ergotize
+ergotoxin
+ergotoxine
+ergusia
+eria
+Erian
+Erianthus
+Eric
+eric
+Erica
+Ericaceae
+ericaceous
+ericad
+erical
+Ericales
+ericetal
+ericeticolous
+ericetum
+erichthus
+erichtoid
+ericineous
+ericius
+Erick
+ericoid
+ericolin
+ericophyte
+Eridanid
+Erie
+Erigenia
+Erigeron
+erigible
+Eriglossa
+eriglossate
+Erik
+erika
+erikite
+Erinaceidae
+erinaceous
+Erinaceus
+erineum
+erinite
+Erinize
+erinose
+Eriobotrya
+Eriocaulaceae
+eriocaulaceous
+Eriocaulon
+Eriocomi
+Eriodendron
+Eriodictyon
+erioglaucine
+Eriogonum
+eriometer
+erionite
+Eriophorum
+Eriophyes
+Eriophyidae
+eriophyllous
+Eriosoma
+Eriphyle
+Eristalis
+eristic
+eristical
+eristically
+Erithacus
+Eritrean
+erizo
+erlking
+Erma
+Ermanaric
+Ermani
+Ermanrich
+ermelin
+ermine
+ermined
+erminee
+ermines
+erminites
+erminois
+erne
+Ernest
+Ernestine
+Ernie
+Ernst
+erode
+eroded
+erodent
+erodible
+Erodium
+erogeneity
+erogenesis
+erogenetic
+erogenic
+erogenous
+erogeny
+Eros
+eros
+erose
+erosely
+erosible
+erosion
+erosional
+erosionist
+erosive
+erostrate
+eroteme
+erotesis
+erotetic
+erotic
+erotica
+erotical
+erotically
+eroticism
+eroticize
+eroticomania
+erotism
+erotogenesis
+erotogenetic
+erotogenic
+erotogenicity
+erotomania
+erotomaniac
+erotopath
+erotopathic
+erotopathy
+Erotylidae
+Erpetoichthys
+erpetologist
+err
+errability
+errable
+errableness
+errabund
+errancy
+errand
+errant
+Errantia
+errantly
+errantness
+errantry
+errata
+erratic
+erratical
+erratically
+erraticalness
+erraticism
+erraticness
+erratum
+errhine
+erring
+erringly
+errite
+erroneous
+erroneously
+erroneousness
+error
+errorful
+errorist
+errorless
+ers
+Ersar
+ersatz
+Erse
+Ertebolle
+erth
+erthen
+erthling
+erthly
+erubescence
+erubescent
+erubescite
+eruc
+Eruca
+eruca
+erucic
+eruciform
+erucin
+erucivorous
+eruct
+eructance
+eructation
+eructative
+eruction
+erudit
+erudite
+eruditely
+eruditeness
+eruditical
+erudition
+eruditional
+eruditionist
+erugate
+erugation
+erugatory
+erumpent
+erupt
+eruption
+eruptional
+eruptive
+eruptively
+eruptiveness
+eruptivity
+ervenholder
+Ervipiame
+Ervum
+Erwin
+Erwinia
+eryhtrism
+Erymanthian
+Eryngium
+eryngo
+Eryon
+Eryops
+Erysibe
+Erysimum
+erysipelas
+erysipelatoid
+erysipelatous
+erysipeloid
+Erysipelothrix
+erysipelous
+Erysiphaceae
+Erysiphe
+Erythea
+erythema
+erythematic
+erythematous
+erythemic
+Erythraea
+Erythraean
+Erythraeidae
+erythrasma
+erythrean
+erythremia
+erythremomelalgia
+erythrene
+erythrin
+Erythrina
+erythrine
+Erythrinidae
+Erythrinus
+erythrismal
+erythristic
+erythrite
+erythritic
+erythritol
+erythroblast
+erythroblastic
+erythroblastosis
+erythrocarpous
+erythrocatalysis
+Erythrochaete
+erythrochroic
+erythrochroism
+erythroclasis
+erythroclastic
+erythrocyte
+erythrocytic
+erythrocytoblast
+erythrocytolysin
+erythrocytolysis
+erythrocytolytic
+erythrocytometer
+erythrocytorrhexis
+erythrocytoschisis
+erythrocytosis
+erythrodegenerative
+erythrodermia
+erythrodextrin
+erythrogenesis
+erythrogenic
+erythroglucin
+erythrogonium
+erythroid
+erythrol
+erythrolein
+erythrolitmin
+erythrolysin
+erythrolysis
+erythrolytic
+erythromelalgia
+erythron
+erythroneocytosis
+Erythronium
+erythronium
+erythropenia
+erythrophage
+erythrophagous
+erythrophilous
+erythrophleine
+erythrophobia
+erythrophore
+erythrophyll
+erythrophyllin
+erythropia
+erythroplastid
+erythropoiesis
+erythropoietic
+erythropsia
+erythropsin
+erythrorrhexis
+erythroscope
+erythrose
+erythrosiderite
+erythrosin
+erythrosinophile
+erythrosis
+Erythroxylaceae
+erythroxylaceous
+erythroxyline
+Erythroxylon
+Erythroxylum
+erythrozincite
+erythrozyme
+erythrulose
+Eryx
+es
+esca
+escadrille
+escalade
+escalader
+escalado
+escalan
+escalate
+Escalator
+escalator
+escalin
+Escallonia
+Escalloniaceae
+escalloniaceous
+escalop
+escaloped
+escambio
+escambron
+escapable
+escapade
+escapage
+escape
+escapee
+escapeful
+escapeless
+escapement
+escaper
+escapingly
+escapism
+escapist
+escarbuncle
+escargatoire
+escarole
+escarp
+escarpment
+eschalot
+eschar
+eschara
+escharine
+escharoid
+escharotic
+eschatocol
+eschatological
+eschatologist
+eschatology
+escheat
+escheatable
+escheatage
+escheatment
+escheator
+escheatorship
+Escherichia
+eschew
+eschewal
+eschewance
+eschewer
+Eschscholtzia
+eschynite
+esclavage
+escoba
+escobadura
+escobilla
+escobita
+escolar
+esconson
+escopette
+Escorial
+escort
+escortage
+escortee
+escortment
+escribe
+escritoire
+escritorial
+escrol
+escropulo
+escrow
+escruage
+escudo
+Esculapian
+esculent
+esculetin
+esculin
+escutcheon
+escutcheoned
+escutellate
+esdragol
+Esdras
+Esebrias
+esemplastic
+esemplasy
+eseptate
+esere
+eserine
+esexual
+eshin
+esiphonal
+esker
+Eskimauan
+Eskimo
+Eskimoic
+Eskimoid
+Eskimoized
+Eskualdun
+Eskuara
+Esmeralda
+Esmeraldan
+esmeraldite
+esne
+esoanhydride
+esocataphoria
+Esocidae
+esociform
+esocyclic
+esodic
+esoenteritis
+esoethmoiditis
+esogastritis
+esonarthex
+esoneural
+esophagal
+esophagalgia
+esophageal
+esophagean
+esophagectasia
+esophagectomy
+esophagi
+esophagism
+esophagismus
+esophagitis
+esophago
+esophagocele
+esophagodynia
+esophagogastroscopy
+esophagogastrostomy
+esophagomalacia
+esophagometer
+esophagomycosis
+esophagopathy
+esophagoplasty
+esophagoplegia
+esophagoplication
+esophagoptosis
+esophagorrhagia
+esophagoscope
+esophagoscopy
+esophagospasm
+esophagostenosis
+esophagostomy
+esophagotome
+esophagotomy
+esophagus
+esophoria
+esophoric
+Esopus
+esoteric
+esoterica
+esoterical
+esoterically
+esotericism
+esotericist
+esoterics
+esoterism
+esoterist
+esoterize
+esotery
+esothyropexy
+esotrope
+esotropia
+esotropic
+Esox
+espacement
+espadon
+espalier
+espantoon
+esparcet
+esparsette
+esparto
+espathate
+espave
+especial
+especially
+especialness
+esperance
+Esperantic
+Esperantidist
+Esperantido
+Esperantism
+Esperantist
+Esperanto
+espial
+espichellite
+espier
+espinal
+espingole
+espinillo
+espino
+espionage
+esplanade
+esplees
+esponton
+espousal
+espouse
+espousement
+espouser
+Espriella
+espringal
+espundia
+espy
+esquamate
+esquamulose
+Esquiline
+esquire
+esquirearchy
+esquiredom
+esquireship
+ess
+essang
+essay
+essayer
+essayette
+essayical
+essayish
+essayism
+essayist
+essayistic
+essayistical
+essaylet
+essed
+Essedones
+Esselen
+Esselenian
+essence
+essency
+Essene
+Essenian
+Essenianism
+Essenic
+Essenical
+Essenis
+Essenism
+Essenize
+essentia
+essential
+essentialism
+essentialist
+essentiality
+essentialize
+essentially
+essentialness
+essenwood
+Essex
+essexite
+Essie
+essling
+essoin
+essoinee
+essoiner
+essoinment
+essonite
+essorant
+establish
+establishable
+established
+establisher
+establishment
+establishmentarian
+establishmentarianism
+establishmentism
+estacade
+estadal
+estadio
+estado
+estafette
+estafetted
+estamene
+estamp
+estampage
+estampede
+estampedero
+estate
+estatesman
+esteem
+esteemable
+esteemer
+Estella
+ester
+esterase
+esterellite
+esteriferous
+esterification
+esterify
+esterization
+esterize
+esterlin
+esterling
+estevin
+Esth
+Esthacyte
+esthematology
+Esther
+Estheria
+estherian
+Estheriidae
+esthesia
+esthesio
+esthesioblast
+esthesiogen
+esthesiogenic
+esthesiogeny
+esthesiography
+esthesiology
+esthesiometer
+esthesiometric
+esthesiometry
+esthesioneurosis
+esthesiophysiology
+esthesis
+esthetology
+esthetophore
+esthiomene
+estimable
+estimableness
+estimably
+estimate
+estimatingly
+estimation
+estimative
+estimator
+estipulate
+estivage
+estival
+estivate
+estivation
+estivator
+estmark
+estoc
+estoile
+Estonian
+estop
+estoppage
+estoppel
+Estotiland
+estovers
+estrade
+estradiol
+estradiot
+estragole
+estrange
+estrangedness
+estrangement
+estranger
+estrapade
+estray
+estre
+estreat
+estrepe
+estrepement
+estriate
+estriche
+estrin
+estriol
+estrogen
+estrogenic
+estrone
+estrous
+estrual
+estruate
+estruation
+estuarial
+estuarine
+estuary
+estufa
+estuous
+estus
+esugarization
+esurience
+esurient
+esuriently
+eta
+etaballi
+etacism
+etacist
+etalon
+Etamin
+etamine
+etch
+Etchareottine
+etcher
+Etchimin
+etching
+Eteoclus
+Eteocretes
+Eteocreton
+eternal
+eternalism
+eternalist
+eternalization
+eternalize
+eternally
+eternalness
+eternity
+eternization
+eternize
+etesian
+ethal
+ethaldehyde
+Ethan
+ethanal
+ethanamide
+ethane
+ethanedial
+ethanediol
+ethanedithiol
+ethanethial
+ethanethiol
+Ethanim
+ethanol
+ethanolamine
+ethanolysis
+ethanoyl
+Ethel
+ethel
+ethene
+Etheneldeli
+ethenic
+ethenoid
+ethenoidal
+ethenol
+ethenyl
+Etheostoma
+Etheostomidae
+Etheostominae
+etheostomoid
+ether
+etherate
+ethereal
+etherealism
+ethereality
+etherealization
+etherealize
+ethereally
+etherealness
+etherean
+ethered
+ethereous
+Etheria
+etheric
+etherification
+etheriform
+etherify
+Etheriidae
+etherin
+etherion
+etherism
+etherization
+etherize
+etherizer
+etherolate
+etherous
+ethic
+ethical
+ethicalism
+ethicality
+ethically
+ethicalness
+ethician
+ethicism
+ethicist
+ethicize
+ethicoaesthetic
+ethicophysical
+ethicopolitical
+ethicoreligious
+ethicosocial
+ethics
+ethid
+ethide
+ethidene
+ethine
+ethiodide
+ethionic
+Ethiop
+Ethiopia
+Ethiopian
+Ethiopic
+ethiops
+ethmofrontal
+ethmoid
+ethmoidal
+ethmoiditis
+ethmolachrymal
+ethmolith
+ethmomaxillary
+ethmonasal
+ethmopalatal
+ethmopalatine
+ethmophysal
+ethmopresphenoidal
+ethmosphenoid
+ethmosphenoidal
+ethmoturbinal
+ethmoturbinate
+ethmovomer
+ethmovomerine
+ethmyphitis
+ethnal
+ethnarch
+ethnarchy
+ethnic
+ethnical
+ethnically
+ethnicism
+ethnicist
+ethnicize
+ethnicon
+ethnize
+ethnobiological
+ethnobiology
+ethnobotanic
+ethnobotanical
+ethnobotanist
+ethnobotany
+ethnocentric
+ethnocentrism
+ethnocracy
+ethnodicy
+ethnoflora
+ethnogenic
+ethnogeny
+ethnogeographer
+ethnogeographic
+ethnogeographical
+ethnogeographically
+ethnogeography
+ethnographer
+ethnographic
+ethnographical
+ethnographically
+ethnographist
+ethnography
+ethnologer
+ethnologic
+ethnological
+ethnologically
+ethnologist
+ethnology
+ethnomaniac
+ethnopsychic
+ethnopsychological
+ethnopsychology
+ethnos
+ethnotechnics
+ethnotechnography
+ethnozoological
+ethnozoology
+ethography
+etholide
+ethologic
+ethological
+ethology
+ethonomic
+ethonomics
+ethopoeia
+ethos
+ethoxide
+ethoxycaffeine
+ethoxyl
+ethrog
+ethyl
+ethylamide
+ethylamine
+ethylate
+ethylation
+ethylene
+ethylenediamine
+ethylenic
+ethylenimine
+ethylenoid
+ethylhydrocupreine
+ethylic
+ethylidene
+ethylidyne
+ethylin
+ethylmorphine
+ethylsulphuric
+ethyne
+ethynyl
+etiogenic
+etiolate
+etiolation
+etiolin
+etiolize
+etiological
+etiologically
+etiologist
+etiologue
+etiology
+etiophyllin
+etioporphyrin
+etiotropic
+etiotropically
+etiquette
+etiquettical
+etna
+Etnean
+Etonian
+Etrurian
+Etruscan
+Etruscologist
+Etruscology
+Etta
+Ettarre
+ettle
+etua
+etude
+etui
+etym
+etymic
+etymography
+etymologer
+etymologic
+etymological
+etymologically
+etymologicon
+etymologist
+etymologization
+etymologize
+etymology
+etymon
+etymonic
+etypic
+etypical
+etypically
+eu
+Euahlayi
+euangiotic
+Euascomycetes
+euaster
+Eubacteriales
+eubacterium
+Eubasidii
+Euboean
+Euboic
+Eubranchipus
+eucaine
+eucairite
+eucalypt
+eucalypteol
+eucalyptian
+eucalyptic
+eucalyptography
+eucalyptol
+eucalyptole
+Eucalyptus
+eucalyptus
+Eucarida
+eucatropine
+eucephalous
+Eucharis
+Eucharist
+eucharistial
+eucharistic
+eucharistical
+Eucharistically
+eucharistically
+eucharistize
+Eucharitidae
+Euchite
+Euchlaena
+euchlorhydria
+euchloric
+euchlorine
+Euchlorophyceae
+euchological
+euchologion
+euchology
+Euchorda
+euchre
+euchred
+euchroic
+euchroite
+euchromatic
+euchromatin
+euchrome
+euchromosome
+euchrone
+Eucirripedia
+euclase
+Euclea
+Eucleidae
+Euclid
+Euclidean
+Euclideanism
+Eucnemidae
+eucolite
+Eucommia
+Eucommiaceae
+eucone
+euconic
+Euconjugatae
+Eucopepoda
+Eucosia
+eucosmid
+Eucosmidae
+eucrasia
+eucrasite
+eucrasy
+eucrite
+Eucryphia
+Eucryphiaceae
+eucryphiaceous
+eucryptite
+eucrystalline
+euctical
+eucyclic
+eudaemon
+eudaemonia
+eudaemonic
+eudaemonical
+eudaemonics
+eudaemonism
+eudaemonist
+eudaemonistic
+eudaemonistical
+eudaemonistically
+eudaemonize
+eudaemony
+eudaimonia
+eudaimonism
+eudaimonist
+Eudemian
+Eudendrium
+Eudeve
+eudiagnostic
+eudialyte
+eudiaphoresis
+eudidymite
+eudiometer
+eudiometric
+eudiometrical
+eudiometrically
+eudiometry
+eudipleural
+Eudist
+Eudora
+Eudorina
+Eudoxian
+Eudromias
+Eudyptes
+Euergetes
+euge
+Eugene
+eugenesic
+eugenesis
+eugenetic
+Eugenia
+eugenic
+eugenical
+eugenically
+eugenicist
+eugenics
+Eugenie
+eugenism
+eugenist
+eugenol
+eugenolate
+eugeny
+Euglandina
+Euglena
+Euglenaceae
+Euglenales
+Euglenida
+Euglenidae
+Euglenineae
+euglenoid
+Euglenoidina
+euglobulin
+eugranitic
+Eugregarinida
+Eugubine
+Eugubium
+euharmonic
+euhedral
+euhemerism
+euhemerist
+euhemeristic
+euhemeristically
+euhemerize
+euhyostylic
+euhyostyly
+euktolite
+eulachon
+Eulalia
+eulalia
+eulamellibranch
+Eulamellibranchia
+Eulamellibranchiata
+Eulima
+Eulimidae
+eulogia
+eulogic
+eulogical
+eulogically
+eulogious
+eulogism
+eulogist
+eulogistic
+eulogistical
+eulogistically
+eulogium
+eulogization
+eulogize
+eulogizer
+eulogy
+eulysite
+eulytine
+eulytite
+Eumenes
+eumenid
+Eumenidae
+Eumenidean
+Eumenides
+eumenorrhea
+eumerism
+eumeristic
+eumerogenesis
+eumerogenetic
+eumeromorph
+eumeromorphic
+eumitosis
+eumitotic
+eumoiriety
+eumoirous
+Eumolpides
+Eumolpus
+eumorphous
+eumycete
+Eumycetes
+eumycetic
+Eunectes
+Eunice
+eunicid
+Eunicidae
+Eunomia
+Eunomian
+Eunomianism
+eunomy
+eunuch
+eunuchal
+eunuchism
+eunuchize
+eunuchoid
+eunuchoidism
+eunuchry
+euomphalid
+Euomphalus
+euonym
+euonymin
+euonymous
+Euonymus
+euonymy
+Euornithes
+euornithic
+Euorthoptera
+euosmite
+euouae
+eupad
+Eupanorthidae
+Eupanorthus
+eupathy
+eupatoriaceous
+eupatorin
+Eupatorium
+eupatory
+eupatrid
+eupatridae
+eupepsia
+eupepsy
+eupeptic
+eupepticism
+eupepticity
+Euphausia
+Euphausiacea
+euphausiid
+Euphausiidae
+Euphemia
+euphemian
+euphemious
+euphemiously
+euphemism
+euphemist
+euphemistic
+euphemistical
+euphemistically
+euphemize
+euphemizer
+euphemous
+euphemy
+euphon
+euphone
+euphonetic
+euphonetics
+euphonia
+euphonic
+euphonical
+euphonically
+euphonicalness
+euphonious
+euphoniously
+euphoniousness
+euphonism
+euphonium
+euphonize
+euphonon
+euphonous
+euphony
+euphonym
+Euphorbia
+Euphorbiaceae
+euphorbiaceous
+euphorbium
+euphoria
+euphoric
+euphory
+Euphrasia
+euphrasy
+Euphratean
+euphroe
+Euphrosyne
+Euphues
+euphuism
+euphuist
+euphuistic
+euphuistical
+euphuistically
+euphuize
+Euphyllopoda
+eupione
+eupittonic
+euplastic
+Euplectella
+Euplexoptera
+Euplocomi
+Euploeinae
+euploid
+euploidy
+eupnea
+Eupolidean
+Eupolyzoa
+eupolyzoan
+Eupomatia
+Eupomatiaceae
+eupractic
+eupraxia
+Euprepia
+Euproctis
+eupsychics
+Euptelea
+Eupterotidae
+eupyrchroite
+eupyrene
+eupyrion
+Eurafric
+Eurafrican
+Euraquilo
+Eurasian
+Eurasianism
+Eurasiatic
+eureka
+eurhodine
+eurhodol
+Eurindic
+Euripidean
+euripus
+eurite
+Euroaquilo
+eurobin
+Euroclydon
+Europa
+Europasian
+European
+Europeanism
+Europeanization
+Europeanize
+Europeanly
+Europeward
+europium
+Europocentric
+Eurus
+Euryalae
+Euryale
+Euryaleae
+euryalean
+Euryalida
+euryalidan
+Euryalus
+eurybathic
+eurybenthic
+eurycephalic
+eurycephalous
+Eurycerotidae
+Euryclea
+Eurydice
+Eurygaea
+Eurygaean
+eurygnathic
+eurygnathism
+eurygnathous
+euryhaline
+Eurylaimi
+Eurylaimidae
+eurylaimoid
+Eurylaimus
+Eurymus
+euryon
+Eurypelma
+Eurypharyngidae
+Eurypharynx
+euryprognathous
+euryprosopic
+eurypterid
+Eurypterida
+eurypteroid
+Eurypteroidea
+Eurypterus
+Eurypyga
+Eurypygae
+Eurypygidae
+eurypylous
+euryscope
+Eurystheus
+eurystomatous
+eurythermal
+eurythermic
+eurythmic
+eurythmical
+eurythmics
+eurythmy
+eurytomid
+Eurytomidae
+Eurytus
+euryzygous
+Euscaro
+Eusebian
+Euselachii
+Euskaldun
+Euskara
+Euskarian
+Euskaric
+Euskera
+eusol
+Euspongia
+eusporangiate
+Eustace
+Eustachian
+eustachium
+Eustathian
+eustatic
+Eusthenopteron
+eustomatous
+eustyle
+Eusuchia
+eusuchian
+eusynchite
+Eutaenia
+eutannin
+eutaxic
+eutaxite
+eutaxitic
+eutaxy
+eutechnic
+eutechnics
+eutectic
+eutectoid
+Euterpe
+Euterpean
+eutexia
+Euthamia
+euthanasia
+euthanasy
+euthenics
+euthenist
+Eutheria
+eutherian
+euthermic
+Euthycomi
+euthycomic
+Euthyneura
+euthyneural
+euthyneurous
+euthytatic
+euthytropic
+eutomous
+eutony
+Eutopia
+Eutopian
+eutrophic
+eutrophy
+eutropic
+eutropous
+Eutychian
+Eutychianism
+euxanthate
+euxanthic
+euxanthone
+euxenite
+Euxine
+Eva
+evacuant
+evacuate
+evacuation
+evacuative
+evacuator
+evacue
+evacuee
+evadable
+evade
+evader
+evadingly
+Evadne
+evagation
+evaginable
+evaginate
+evagination
+evaluable
+evaluate
+evaluation
+evaluative
+evalue
+Evan
+evanesce
+evanescence
+evanescency
+evanescent
+evanescently
+evanescible
+evangel
+evangelary
+evangelian
+evangeliarium
+evangeliary
+evangelical
+evangelicalism
+evangelicality
+evangelically
+evangelicalness
+evangelican
+evangelicism
+evangelicity
+Evangeline
+evangelion
+evangelism
+evangelist
+evangelistarion
+evangelistarium
+evangelistary
+evangelistic
+evangelistically
+evangelistics
+evangelistship
+evangelium
+evangelization
+evangelize
+evangelizer
+Evaniidae
+evanish
+evanishment
+evanition
+evansite
+evaporability
+evaporable
+evaporate
+evaporation
+evaporative
+evaporativity
+evaporator
+evaporimeter
+evaporize
+evaporometer
+evase
+evasible
+evasion
+evasional
+evasive
+evasively
+evasiveness
+Eve
+eve
+Evea
+evechurr
+evection
+evectional
+Evehood
+evejar
+Eveless
+evelight
+Evelina
+Eveline
+evelong
+Evelyn
+even
+evenblush
+evendown
+evener
+evenfall
+evenforth
+evenglow
+evenhanded
+evenhandedly
+evenhandedness
+evening
+evenlight
+evenlong
+evenly
+evenmete
+evenminded
+evenmindedness
+evenness
+evens
+evensong
+event
+eventful
+eventfully
+eventfulness
+eventide
+eventime
+eventless
+eventlessly
+eventlessness
+eventognath
+Eventognathi
+eventognathous
+eventration
+eventual
+eventuality
+eventualize
+eventually
+eventuate
+eventuation
+evenwise
+evenworthy
+eveque
+ever
+Everard
+everbearer
+everbearing
+everbloomer
+everblooming
+everduring
+Everett
+everglade
+evergreen
+evergreenery
+evergreenite
+everlasting
+everlastingly
+everlastingness
+everliving
+evermore
+Evernia
+evernioid
+eversible
+eversion
+eversive
+eversporting
+evert
+evertebral
+Evertebrata
+evertebrate
+evertile
+evertor
+everwhich
+everwho
+every
+everybody
+everyday
+everydayness
+everyhow
+everylike
+Everyman
+everyman
+everyness
+everyone
+everything
+everywhen
+everywhence
+everywhere
+everywhereness
+everywheres
+everywhither
+evestar
+evetide
+eveweed
+evict
+eviction
+evictor
+evidence
+evidencive
+evident
+evidential
+evidentially
+evidentiary
+evidently
+evidentness
+evil
+evildoer
+evilhearted
+evilly
+evilmouthed
+evilness
+evilproof
+evilsayer
+evilspeaker
+evilspeaking
+evilwishing
+evince
+evincement
+evincible
+evincibly
+evincingly
+evincive
+evirate
+eviration
+eviscerate
+evisceration
+evisite
+evitable
+evitate
+evitation
+evittate
+evocable
+evocate
+evocation
+evocative
+evocatively
+evocator
+evocatory
+evocatrix
+Evodia
+evoe
+evoke
+evoker
+evolute
+evolution
+evolutional
+evolutionally
+evolutionary
+evolutionism
+evolutionist
+evolutionize
+evolutive
+evolutoid
+evolvable
+evolve
+evolvement
+evolvent
+evolver
+Evonymus
+evovae
+evulgate
+evulgation
+evulse
+evulsion
+evzone
+ewder
+Ewe
+ewe
+ewelease
+ewer
+ewerer
+ewery
+ewry
+ex
+exacerbate
+exacerbation
+exacerbescence
+exacerbescent
+exact
+exactable
+exacter
+exacting
+exactingly
+exactingness
+exaction
+exactitude
+exactive
+exactiveness
+exactly
+exactment
+exactness
+exactor
+exactress
+exadversum
+exaggerate
+exaggerated
+exaggeratedly
+exaggerating
+exaggeratingly
+exaggeration
+exaggerative
+exaggeratively
+exaggerativeness
+exaggerator
+exaggeratory
+exagitate
+exagitation
+exairesis
+exalate
+exalbuminose
+exalbuminous
+exallotriote
+exalt
+exaltation
+exaltative
+exalted
+exaltedly
+exaltedness
+exalter
+exam
+examen
+examinability
+examinable
+examinant
+examinate
+examination
+examinational
+examinationism
+examinationist
+examinative
+examinator
+examinatorial
+examinatory
+examine
+examinee
+examiner
+examinership
+examining
+examiningly
+example
+exampleless
+exampleship
+exanimate
+exanimation
+exanthem
+exanthema
+exanthematic
+exanthematous
+exappendiculate
+exarate
+exaration
+exarch
+exarchal
+exarchate
+exarchateship
+Exarchic
+Exarchist
+exarchist
+exarchy
+exareolate
+exarillate
+exaristate
+exarteritis
+exarticulate
+exarticulation
+exasperate
+exasperated
+exasperatedly
+exasperater
+exasperating
+exasperatingly
+exasperation
+exasperative
+exaspidean
+Exaudi
+exaugurate
+exauguration
+excalate
+excalation
+excalcarate
+excalceate
+excalceation
+Excalibur
+excamb
+excamber
+excambion
+excandescence
+excandescency
+excandescent
+excantation
+excarnate
+excarnation
+excathedral
+excaudate
+excavate
+excavation
+excavationist
+excavator
+excavatorial
+excavatory
+excave
+excecate
+excecation
+excedent
+exceed
+exceeder
+exceeding
+exceedingly
+exceedingness
+excel
+excelente
+excellence
+excellency
+excellent
+excellently
+excelsin
+Excelsior
+excelsior
+excelsitude
+excentral
+excentric
+excentrical
+excentricity
+except
+exceptant
+excepting
+exception
+exceptionable
+exceptionableness
+exceptionably
+exceptional
+exceptionality
+exceptionally
+exceptionalness
+exceptionary
+exceptionless
+exceptious
+exceptiousness
+exceptive
+exceptively
+exceptiveness
+exceptor
+excerebration
+excerpt
+excerptible
+excerption
+excerptive
+excerptor
+excess
+excessive
+excessively
+excessiveness
+excessman
+exchange
+exchangeability
+exchangeable
+exchangeably
+exchanger
+Exchangite
+Exchequer
+exchequer
+excide
+excipient
+exciple
+Excipulaceae
+excipular
+excipule
+excipuliform
+excipulum
+excircle
+excisable
+excise
+exciseman
+excisemanship
+excision
+excisor
+excitability
+excitable
+excitableness
+excitancy
+excitant
+excitation
+excitative
+excitator
+excitatory
+excite
+excited
+excitedly
+excitedness
+excitement
+exciter
+exciting
+excitingly
+excitive
+excitoglandular
+excitometabolic
+excitomotion
+excitomotor
+excitomotory
+excitomuscular
+excitonutrient
+excitor
+excitory
+excitosecretory
+excitovascular
+exclaim
+exclaimer
+exclaiming
+exclaimingly
+exclamation
+exclamational
+exclamative
+exclamatively
+exclamatorily
+exclamatory
+exclave
+exclosure
+excludable
+exclude
+excluder
+excluding
+excludingly
+exclusion
+exclusionary
+exclusioner
+exclusionism
+exclusionist
+exclusive
+exclusively
+exclusiveness
+exclusivism
+exclusivist
+exclusivity
+exclusory
+Excoecaria
+excogitable
+excogitate
+excogitation
+excogitative
+excogitator
+excommunicable
+excommunicant
+excommunicate
+excommunication
+excommunicative
+excommunicator
+excommunicatory
+exconjugant
+excoriable
+excoriate
+excoriation
+excoriator
+excorticate
+excortication
+excrement
+excremental
+excrementary
+excrementitial
+excrementitious
+excrementitiously
+excrementitiousness
+excrementive
+excresce
+excrescence
+excrescency
+excrescent
+excrescential
+excreta
+excretal
+excrete
+excreter
+excretes
+excretion
+excretionary
+excretitious
+excretive
+excretory
+excriminate
+excruciable
+excruciate
+excruciating
+excruciatingly
+excruciation
+excruciator
+excubant
+excudate
+exculpable
+exculpate
+exculpation
+exculpative
+exculpatorily
+exculpatory
+excurrent
+excurse
+excursion
+excursional
+excursionary
+excursioner
+excursionism
+excursionist
+excursionize
+excursive
+excursively
+excursiveness
+excursory
+excursus
+excurvate
+excurvated
+excurvation
+excurvature
+excurved
+excusability
+excusable
+excusableness
+excusably
+excusal
+excusative
+excusator
+excusatory
+excuse
+excuseful
+excusefully
+excuseless
+excuser
+excusing
+excusingly
+excusive
+excuss
+excyst
+excystation
+excysted
+excystment
+exdelicto
+exdie
+exeat
+execrable
+execrableness
+execrably
+execrate
+execration
+execrative
+execratively
+execrator
+execratory
+executable
+executancy
+executant
+execute
+executed
+executer
+execution
+executional
+executioneering
+executioner
+executioneress
+executionist
+executive
+executively
+executiveness
+executiveship
+executor
+executorial
+executorship
+executory
+executress
+executrices
+executrix
+executrixship
+executry
+exedent
+exedra
+exegeses
+exegesis
+exegesist
+exegete
+exegetic
+exegetical
+exegetically
+exegetics
+exegetist
+exemplar
+exemplaric
+exemplarily
+exemplariness
+exemplarism
+exemplarity
+exemplary
+exemplifiable
+exemplification
+exemplificational
+exemplificative
+exemplificator
+exemplifier
+exemplify
+exempt
+exemptible
+exemptile
+exemption
+exemptionist
+exemptive
+exencephalia
+exencephalic
+exencephalous
+exencephalus
+exendospermic
+exendospermous
+exenterate
+exenteration
+exequatur
+exequial
+exequy
+exercisable
+exercise
+exerciser
+exercitant
+exercitation
+exercitor
+exercitorial
+exercitorian
+exeresis
+exergual
+exergue
+exert
+exertion
+exertionless
+exertive
+exes
+exeunt
+exfiguration
+exfigure
+exfiltration
+exflagellate
+exflagellation
+exflect
+exfodiate
+exfodiation
+exfoliate
+exfoliation
+exfoliative
+exfoliatory
+exgorgitation
+exhalable
+exhalant
+exhalation
+exhalatory
+exhale
+exhaust
+exhausted
+exhaustedly
+exhaustedness
+exhauster
+exhaustibility
+exhaustible
+exhausting
+exhaustingly
+exhaustion
+exhaustive
+exhaustively
+exhaustiveness
+exhaustless
+exhaustlessly
+exhaustlessness
+exheredate
+exheredation
+exhibit
+exhibitable
+exhibitant
+exhibiter
+exhibition
+exhibitional
+exhibitioner
+exhibitionism
+exhibitionist
+exhibitionistic
+exhibitionize
+exhibitive
+exhibitively
+exhibitor
+exhibitorial
+exhibitorship
+exhibitory
+exhilarant
+exhilarate
+exhilarating
+exhilaratingly
+exhilaration
+exhilarative
+exhilarator
+exhilaratory
+exhort
+exhortation
+exhortative
+exhortatively
+exhortator
+exhortatory
+exhorter
+exhortingly
+exhumate
+exhumation
+exhumator
+exhumatory
+exhume
+exhumer
+exigence
+exigency
+exigent
+exigenter
+exigently
+exigible
+exiguity
+exiguous
+exiguously
+exiguousness
+exilarch
+exilarchate
+exile
+exiledom
+exilement
+exiler
+exilian
+exilic
+exility
+eximious
+eximiously
+eximiousness
+exinanite
+exinanition
+exindusiate
+exinguinal
+exist
+existability
+existence
+existent
+existential
+existentialism
+existentialist
+existentialistic
+existentialize
+existentially
+existently
+exister
+existibility
+existible
+existlessness
+exit
+exite
+exition
+exitus
+exlex
+exmeridian
+Exmoor
+exoarteritis
+Exoascaceae
+exoascaceous
+Exoascales
+Exoascus
+Exobasidiaceae
+Exobasidiales
+Exobasidium
+exocannibalism
+exocardia
+exocardiac
+exocardial
+exocarp
+exocataphoria
+exoccipital
+exocentric
+Exochorda
+exochorion
+exoclinal
+exocline
+exocoelar
+exocoele
+exocoelic
+exocoelom
+Exocoetidae
+Exocoetus
+exocolitis
+exocone
+exocrine
+exoculate
+exoculation
+exocyclic
+Exocyclica
+Exocycloida
+exode
+exoderm
+exodermis
+exodic
+exodist
+exodontia
+exodontist
+exodos
+exodromic
+exodromy
+exodus
+exody
+exoenzyme
+exoenzymic
+exoerythrocytic
+exogamic
+exogamous
+exogamy
+exogastric
+exogastrically
+exogastritis
+exogen
+Exogenae
+exogenetic
+exogenic
+exogenous
+exogenously
+exogeny
+exognathion
+exognathite
+Exogonium
+Exogyra
+exolemma
+exometritis
+exomion
+exomis
+exomologesis
+exomorphic
+exomorphism
+exomphalos
+exomphalous
+exomphalus
+Exon
+exon
+exonarthex
+exoner
+exonerate
+exoneration
+exonerative
+exonerator
+exoneural
+Exonian
+exonship
+exopathic
+exoperidium
+exophagous
+exophagy
+exophasia
+exophasic
+exophoria
+exophoric
+exophthalmic
+exophthalmos
+exoplasm
+exopod
+exopodite
+exopoditic
+Exopterygota
+exopterygotic
+exopterygotism
+exopterygotous
+exorability
+exorable
+exorableness
+exorbital
+exorbitance
+exorbitancy
+exorbitant
+exorbitantly
+exorbitate
+exorbitation
+exorcisation
+exorcise
+exorcisement
+exorciser
+exorcism
+exorcismal
+exorcisory
+exorcist
+exorcistic
+exorcistical
+exordia
+exordial
+exordium
+exordize
+exorganic
+exorhason
+exormia
+exornation
+exosepsis
+exoskeletal
+exoskeleton
+exosmic
+exosmose
+exosmosis
+exosmotic
+exosperm
+exosporal
+exospore
+exosporium
+exosporous
+Exostema
+exostome
+exostosed
+exostosis
+exostotic
+exostra
+exostracism
+exostracize
+exoteric
+exoterical
+exoterically
+exotericism
+exoterics
+exotheca
+exothecal
+exothecate
+exothecium
+exothermal
+exothermic
+exothermous
+exotic
+exotically
+exoticalness
+exoticism
+exoticist
+exoticity
+exoticness
+exotism
+exotospore
+exotoxic
+exotoxin
+exotropia
+exotropic
+exotropism
+expalpate
+expand
+expanded
+expandedly
+expandedness
+expander
+expanding
+expandingly
+expanse
+expansibility
+expansible
+expansibleness
+expansibly
+expansile
+expansion
+expansional
+expansionary
+expansionism
+expansionist
+expansive
+expansively
+expansiveness
+expansivity
+expansometer
+expansure
+expatiate
+expatiater
+expatiatingly
+expatiation
+expatiative
+expatiator
+expatiatory
+expatriate
+expatriation
+expect
+expectable
+expectance
+expectancy
+expectant
+expectantly
+expectation
+expectative
+expectedly
+expecter
+expectingly
+expective
+expectorant
+expectorate
+expectoration
+expectorative
+expectorator
+expede
+expediate
+expedience
+expediency
+expedient
+expediential
+expedientially
+expedientist
+expediently
+expeditate
+expeditation
+expedite
+expedited
+expeditely
+expediteness
+expediter
+expedition
+expeditionary
+expeditionist
+expeditious
+expeditiously
+expeditiousness
+expel
+expellable
+expellant
+expellee
+expeller
+expend
+expendability
+expendable
+expender
+expendible
+expenditor
+expenditrix
+expenditure
+expense
+expenseful
+expensefully
+expensefulness
+expenseless
+expensilation
+expensive
+expensively
+expensiveness
+expenthesis
+expergefacient
+expergefaction
+experience
+experienceable
+experienced
+experienceless
+experiencer
+experiencible
+experient
+experiential
+experientialism
+experientialist
+experientially
+experiment
+experimental
+experimentalism
+experimentalist
+experimentalize
+experimentally
+experimentarian
+experimentation
+experimentative
+experimentator
+experimented
+experimentee
+experimenter
+experimentist
+experimentize
+experimently
+expert
+expertism
+expertize
+expertly
+expertness
+expertship
+expiable
+expiate
+expiation
+expiational
+expiatist
+expiative
+expiator
+expiatoriness
+expiatory
+expilate
+expilation
+expilator
+expirable
+expirant
+expirate
+expiration
+expirator
+expiratory
+expire
+expiree
+expirer
+expiring
+expiringly
+expiry
+expiscate
+expiscation
+expiscator
+expiscatory
+explain
+explainable
+explainer
+explaining
+explainingly
+explanate
+explanation
+explanative
+explanatively
+explanator
+explanatorily
+explanatoriness
+explanatory
+explant
+explantation
+explement
+explemental
+expletive
+expletively
+expletiveness
+expletory
+explicable
+explicableness
+explicate
+explication
+explicative
+explicatively
+explicator
+explicatory
+explicit
+explicitly
+explicitness
+explodable
+explode
+exploded
+explodent
+exploder
+exploit
+exploitable
+exploitage
+exploitation
+exploitationist
+exploitative
+exploiter
+exploitive
+exploiture
+explorable
+exploration
+explorational
+explorative
+exploratively
+explorativeness
+explorator
+exploratory
+explore
+explorement
+explorer
+exploring
+exploringly
+explosibility
+explosible
+explosion
+explosionist
+explosive
+explosively
+explosiveness
+expone
+exponence
+exponency
+exponent
+exponential
+exponentially
+exponentiation
+exponible
+export
+exportability
+exportable
+exportation
+exporter
+exposal
+expose
+exposed
+exposedness
+exposer
+exposit
+exposition
+expositional
+expositionary
+expositive
+expositively
+expositor
+expositorial
+expositorially
+expositorily
+expositoriness
+expository
+expositress
+expostulate
+expostulating
+expostulatingly
+expostulation
+expostulative
+expostulatively
+expostulator
+expostulatory
+exposure
+expound
+expoundable
+expounder
+express
+expressable
+expressage
+expressed
+expresser
+expressibility
+expressible
+expressibly
+expression
+expressionable
+expressional
+expressionful
+expressionism
+expressionist
+expressionistic
+expressionless
+expressionlessly
+expressionlessness
+expressive
+expressively
+expressiveness
+expressivism
+expressivity
+expressless
+expressly
+expressman
+expressness
+expressway
+exprimable
+exprobrate
+exprobration
+exprobratory
+expromission
+expromissor
+expropriable
+expropriate
+expropriation
+expropriator
+expugn
+expugnable
+expuition
+expulsatory
+expulse
+expulser
+expulsion
+expulsionist
+expulsive
+expulsory
+expunction
+expunge
+expungeable
+expungement
+expunger
+expurgate
+expurgation
+expurgative
+expurgator
+expurgatorial
+expurgatory
+expurge
+exquisite
+exquisitely
+exquisiteness
+exquisitism
+exquisitively
+exradio
+exradius
+exrupeal
+exsanguinate
+exsanguination
+exsanguine
+exsanguineous
+exsanguinity
+exsanguinous
+exsanguious
+exscind
+exscissor
+exscriptural
+exsculptate
+exscutellate
+exsect
+exsectile
+exsection
+exsector
+exsequatur
+exsert
+exserted
+exsertile
+exsertion
+exship
+exsibilate
+exsibilation
+exsiccant
+exsiccatae
+exsiccate
+exsiccation
+exsiccative
+exsiccator
+exsiliency
+exsomatic
+exspuition
+exsputory
+exstipulate
+exstrophy
+exsuccous
+exsuction
+exsufflate
+exsufflation
+exsufflicate
+exsurge
+exsurgent
+extant
+extemporal
+extemporally
+extemporalness
+extemporaneity
+extemporaneous
+extemporaneously
+extemporaneousness
+extemporarily
+extemporariness
+extemporary
+extempore
+extemporization
+extemporize
+extemporizer
+extend
+extended
+extendedly
+extendedness
+extender
+extendibility
+extendible
+extending
+extense
+extensibility
+extensible
+extensibleness
+extensile
+extensimeter
+extension
+extensional
+extensionist
+extensity
+extensive
+extensively
+extensiveness
+extensometer
+extensor
+extensory
+extensum
+extent
+extenuate
+extenuating
+extenuatingly
+extenuation
+extenuative
+extenuator
+extenuatory
+exter
+exterior
+exteriorate
+exterioration
+exteriority
+exteriorization
+exteriorize
+exteriorly
+exteriorness
+exterminable
+exterminate
+extermination
+exterminative
+exterminator
+exterminatory
+exterminatress
+exterminatrix
+exterminist
+extern
+external
+externalism
+externalist
+externalistic
+externality
+externalization
+externalize
+externally
+externals
+externate
+externation
+externe
+externity
+externization
+externize
+externomedian
+externum
+exteroceptist
+exteroceptive
+exteroceptor
+exterraneous
+exterrestrial
+exterritorial
+exterritoriality
+exterritorialize
+exterritorially
+extima
+extinct
+extinction
+extinctionist
+extinctive
+extinctor
+extine
+extinguish
+extinguishable
+extinguishant
+extinguished
+extinguisher
+extinguishment
+extipulate
+extirpate
+extirpation
+extirpationist
+extirpative
+extirpator
+extirpatory
+extispex
+extispicious
+extispicy
+extogenous
+extol
+extoll
+extollation
+extoller
+extollingly
+extollment
+extolment
+extoolitic
+extorsive
+extorsively
+extort
+extorter
+extortion
+extortionary
+extortionate
+extortionately
+extortioner
+extortionist
+extortive
+extra
+extrabold
+extrabranchial
+extrabronchial
+extrabuccal
+extrabulbar
+extrabureau
+extraburghal
+extracalendar
+extracalicular
+extracanonical
+extracapsular
+extracardial
+extracarpal
+extracathedral
+extracellular
+extracellularly
+extracerebral
+extracivic
+extracivically
+extraclassroom
+extraclaustral
+extracloacal
+extracollegiate
+extracolumella
+extraconscious
+extraconstellated
+extraconstitutional
+extracorporeal
+extracorpuscular
+extracosmic
+extracosmical
+extracostal
+extracranial
+extract
+extractable
+extractant
+extracted
+extractible
+extractiform
+extraction
+extractive
+extractor
+extractorship
+extracultural
+extracurial
+extracurricular
+extracurriculum
+extracutaneous
+extracystic
+extradecretal
+extradialectal
+extraditable
+extradite
+extradition
+extradomestic
+extrados
+extradosed
+extradotal
+extraduction
+extradural
+extraembryonic
+extraenteric
+extraepiphyseal
+extraequilibrium
+extraessential
+extraessentially
+extrafascicular
+extrafloral
+extrafocal
+extrafoliaceous
+extraforaneous
+extraformal
+extragalactic
+extragastric
+extrait
+extrajudicial
+extrajudicially
+extralateral
+extralite
+extrality
+extramarginal
+extramatrical
+extramedullary
+extramental
+extrameridian
+extrameridional
+extrametaphysical
+extrametrical
+extrametropolitan
+extramodal
+extramolecular
+extramorainal
+extramorainic
+extramoral
+extramoralist
+extramundane
+extramural
+extramurally
+extramusical
+extranational
+extranatural
+extranean
+extraneity
+extraneous
+extraneously
+extraneousness
+extranidal
+extranormal
+extranuclear
+extraocular
+extraofficial
+extraoral
+extraorbital
+extraorbitally
+extraordinarily
+extraordinariness
+extraordinary
+extraorganismal
+extraovate
+extraovular
+extraparenchymal
+extraparental
+extraparietal
+extraparliamentary
+extraparochial
+extraparochially
+extrapatriarchal
+extrapelvic
+extraperineal
+extraperiodic
+extraperiosteal
+extraperitoneal
+extraphenomenal
+extraphysical
+extraphysiological
+extrapituitary
+extraplacental
+extraplanetary
+extrapleural
+extrapoetical
+extrapolar
+extrapolate
+extrapolation
+extrapolative
+extrapolator
+extrapopular
+extraprofessional
+extraprostatic
+extraprovincial
+extrapulmonary
+extrapyramidal
+extraquiz
+extrared
+extraregarding
+extraregular
+extraregularly
+extrarenal
+extraretinal
+extrarhythmical
+extrasacerdotal
+extrascholastic
+extraschool
+extrascientific
+extrascriptural
+extrascripturality
+extrasensible
+extrasensory
+extrasensuous
+extraserous
+extrasocial
+extrasolar
+extrasomatic
+extraspectral
+extraspherical
+extraspinal
+extrastapedial
+extrastate
+extrasterile
+extrastomachal
+extrasyllabic
+extrasyllogistic
+extrasyphilitic
+extrasystole
+extrasystolic
+extratabular
+extratarsal
+extratellurian
+extratelluric
+extratemporal
+extratension
+extratensive
+extraterrene
+extraterrestrial
+extraterritorial
+extraterritoriality
+extraterritorially
+extrathecal
+extratheistic
+extrathermodynamic
+extrathoracic
+extratorrid
+extratracheal
+extratribal
+extratropical
+extratubal
+extratympanic
+extrauterine
+extravagance
+extravagancy
+extravagant
+Extravagantes
+extravagantly
+extravagantness
+extravaganza
+extravagate
+extravaginal
+extravasate
+extravasation
+extravascular
+extraventricular
+extraversion
+extravert
+extravillar
+extraviolet
+extravisceral
+extrazodiacal
+extreme
+extremeless
+extremely
+extremeness
+extremism
+extremist
+extremistic
+extremital
+extremity
+extricable
+extricably
+extricate
+extricated
+extrication
+extrinsic
+extrinsical
+extrinsicality
+extrinsically
+extrinsicalness
+extrinsicate
+extrinsication
+extroitive
+extropical
+extrorsal
+extrorse
+extrorsely
+extrospect
+extrospection
+extrospective
+extroversion
+extroversive
+extrovert
+extrovertish
+extrude
+extruder
+extruding
+extrusile
+extrusion
+extrusive
+extrusory
+extubate
+extubation
+extumescence
+extund
+extusion
+exuberance
+exuberancy
+exuberant
+exuberantly
+exuberantness
+exuberate
+exuberation
+exudate
+exudation
+exudative
+exude
+exudence
+exulcerate
+exulceration
+exulcerative
+exulceratory
+exult
+exultance
+exultancy
+exultant
+exultantly
+exultation
+exultet
+exultingly
+exululate
+exumbral
+exumbrella
+exumbrellar
+exundance
+exundancy
+exundate
+exundation
+exuviability
+exuviable
+exuviae
+exuvial
+exuviate
+exuviation
+exzodiacal
+ey
+eyah
+eyalet
+eyas
+eye
+eyeball
+eyebalm
+eyebar
+eyebeam
+eyeberry
+eyeblink
+eyebolt
+eyebree
+eyebridled
+eyebright
+eyebrow
+eyecup
+eyed
+eyedness
+eyedot
+eyedrop
+eyeflap
+eyeful
+eyeglance
+eyeglass
+eyehole
+Eyeish
+eyelash
+eyeless
+eyelessness
+eyelet
+eyeleteer
+eyeletter
+eyelid
+eyelight
+eyelike
+eyeline
+eyemark
+eyen
+eyepiece
+eyepit
+eyepoint
+eyer
+eyereach
+eyeroot
+eyesalve
+eyeseed
+eyeservant
+eyeserver
+eyeservice
+eyeshade
+eyeshield
+eyeshot
+eyesight
+eyesome
+eyesore
+eyespot
+eyestalk
+eyestone
+eyestrain
+eyestring
+eyetooth
+eyewaiter
+eyewash
+eyewater
+eyewear
+eyewink
+eyewinker
+eyewitness
+eyewort
+eyey
+eying
+eyn
+eyne
+eyot
+eyoty
+eyra
+eyre
+eyrie
+eyrir
+ezba
+Ezekiel
+Ezra
+F
+f
+fa
+Faba
+Fabaceae
+fabaceous
+fabella
+fabes
+Fabian
+Fabianism
+Fabianist
+fabiform
+fable
+fabled
+fabledom
+fableist
+fableland
+fablemaker
+fablemonger
+fablemongering
+fabler
+fabliau
+fabling
+Fabraea
+fabric
+fabricant
+fabricate
+fabrication
+fabricative
+fabricator
+fabricatress
+Fabrikoid
+fabrikoid
+Fabronia
+Fabroniaceae
+fabular
+fabulist
+fabulosity
+fabulous
+fabulously
+fabulousness
+faburden
+facadal
+facade
+face
+faceable
+facebread
+facecloth
+faced
+faceless
+facellite
+facemaker
+facemaking
+faceman
+facemark
+facepiece
+faceplate
+facer
+facet
+facete
+faceted
+facetely
+faceteness
+facetiae
+facetiation
+facetious
+facetiously
+facetiousness
+facewise
+facework
+facia
+facial
+facially
+faciation
+faciend
+facient
+facies
+facile
+facilely
+facileness
+facilitate
+facilitation
+facilitative
+facilitator
+facility
+facing
+facingly
+facinorous
+facinorousness
+faciobrachial
+faciocervical
+faciolingual
+facioplegia
+facioscapulohumeral
+fack
+fackeltanz
+fackings
+fackins
+facks
+facsimile
+facsimilist
+facsimilize
+fact
+factable
+factabling
+factful
+Factice
+facticide
+faction
+factional
+factionalism
+factionary
+factioneer
+factionist
+factionistism
+factious
+factiously
+factiousness
+factish
+factitial
+factitious
+factitiously
+factitive
+factitively
+factitude
+factive
+factor
+factorability
+factorable
+factorage
+factordom
+factoress
+factorial
+factorially
+factorist
+factorization
+factorize
+factorship
+factory
+factoryship
+factotum
+factrix
+factual
+factuality
+factually
+factualness
+factum
+facture
+facty
+facula
+facular
+faculous
+facultate
+facultative
+facultatively
+facultied
+facultize
+faculty
+facund
+facy
+fad
+fadable
+faddiness
+faddish
+faddishness
+faddism
+faddist
+faddle
+faddy
+fade
+fadeaway
+faded
+fadedly
+fadedness
+fadeless
+faden
+fader
+fadge
+fading
+fadingly
+fadingness
+fadmonger
+fadmongering
+fadmongery
+fadridden
+fady
+fae
+faerie
+Faeroe
+faery
+faeryland
+faff
+faffle
+faffy
+fag
+Fagaceae
+fagaceous
+fagald
+Fagales
+Fagara
+fage
+Fagelia
+fager
+fagger
+faggery
+fagging
+faggingly
+fagine
+fagopyrism
+fagopyrismus
+Fagopyrum
+fagot
+fagoter
+fagoting
+fagottino
+fagottist
+fagoty
+Fagus
+faham
+fahlerz
+fahlore
+fahlunite
+Fahrenheit
+faience
+fail
+failing
+failingly
+failingness
+faille
+failure
+fain
+fainaigue
+fainaiguer
+faineance
+faineancy
+faineant
+faineantism
+fainly
+fainness
+fains
+faint
+fainter
+faintful
+faintheart
+fainthearted
+faintheartedly
+faintheartedness
+fainting
+faintingly
+faintish
+faintishness
+faintly
+faintness
+faints
+fainty
+faipule
+fair
+fairer
+fairfieldite
+fairgoer
+fairgoing
+fairgrass
+fairground
+fairily
+fairing
+fairish
+fairishly
+fairkeeper
+fairlike
+fairling
+fairly
+fairm
+fairness
+fairstead
+fairtime
+fairwater
+fairway
+fairy
+fairydom
+fairyfolk
+fairyhood
+fairyish
+fairyism
+fairyland
+fairylike
+fairyologist
+fairyology
+fairyship
+faith
+faithbreach
+faithbreaker
+faithful
+faithfully
+faithfulness
+faithless
+faithlessly
+faithlessness
+faithwise
+faithworthiness
+faithworthy
+faitour
+fake
+fakement
+faker
+fakery
+fakiness
+fakir
+fakirism
+Fakofo
+faky
+falanaka
+Falange
+Falangism
+Falangist
+Falasha
+falbala
+falcade
+Falcata
+falcate
+falcated
+falcation
+falcer
+falces
+falchion
+falcial
+Falcidian
+falciform
+Falcinellus
+falciparum
+Falco
+falcon
+falconbill
+falconelle
+falconer
+Falcones
+falconet
+Falconidae
+Falconiformes
+Falconinae
+falconine
+falconlike
+falconoid
+falconry
+falcopern
+falcula
+falcular
+falculate
+Falcunculus
+faldage
+falderal
+faldfee
+faldstool
+Falerian
+Falernian
+Falerno
+Faliscan
+Falisci
+Falkland
+fall
+fallace
+fallacious
+fallaciously
+fallaciousness
+fallacy
+fallage
+fallation
+fallaway
+fallback
+fallectomy
+fallen
+fallenness
+faller
+fallfish
+fallibility
+fallible
+fallibleness
+fallibly
+falling
+Fallopian
+fallostomy
+fallotomy
+fallow
+fallowist
+fallowness
+falltime
+fallway
+fally
+falsary
+false
+falsehearted
+falseheartedly
+falseheartedness
+falsehood
+falsely
+falsen
+falseness
+falser
+falsettist
+falsetto
+falsework
+falsidical
+falsie
+falsifiable
+falsificate
+falsification
+falsificator
+falsifier
+falsify
+falsism
+Falstaffian
+faltboat
+faltche
+falter
+falterer
+faltering
+falteringly
+Falunian
+Faluns
+falutin
+falx
+fam
+Fama
+famatinite
+famble
+fame
+fameflower
+fameful
+fameless
+famelessly
+famelessness
+Fameuse
+fameworthy
+familia
+familial
+familiar
+familiarism
+familiarity
+familiarization
+familiarize
+familiarizer
+familiarizingly
+familiarly
+familiarness
+familism
+familist
+familistery
+familistic
+familistical
+family
+familyish
+famine
+famish
+famishment
+famous
+famously
+famousness
+famulary
+famulus
+Fan
+fan
+fana
+fanal
+fanam
+fanatic
+fanatical
+fanatically
+fanaticalness
+fanaticism
+fanaticize
+fanback
+fanbearer
+fanciable
+fancical
+fancied
+fancier
+fanciful
+fancifully
+fancifulness
+fancify
+fanciless
+fancy
+fancymonger
+fancysick
+fancywork
+fand
+fandangle
+fandango
+fandom
+fanega
+fanegada
+fanfarade
+Fanfare
+fanfare
+fanfaron
+fanfaronade
+fanfaronading
+fanflower
+fanfoot
+fang
+fanged
+fangle
+fangled
+fanglement
+fangless
+fanglet
+fanglomerate
+fangot
+fangy
+fanhouse
+faniente
+fanion
+fanioned
+fanlight
+fanlike
+fanmaker
+fanmaking
+fanman
+fannel
+fanner
+Fannia
+fannier
+fanning
+Fanny
+fanon
+fant
+fantail
+fantasia
+fantasie
+fantasied
+fantasist
+fantasque
+fantassin
+fantast
+fantastic
+fantastical
+fantasticality
+fantastically
+fantasticalness
+fantasticate
+fantastication
+fantasticism
+fantasticly
+fantasticness
+fantastico
+fantastry
+fantasy
+Fanti
+fantigue
+fantoccini
+fantocine
+fantod
+fantoddish
+Fanwe
+fanweed
+fanwise
+fanwork
+fanwort
+fanwright
+Fany
+faon
+Fapesmo
+far
+farad
+faradaic
+faraday
+faradic
+faradism
+faradization
+faradize
+faradizer
+faradmeter
+faradocontractility
+faradomuscular
+faradonervous
+faradopalpation
+farandole
+farasula
+faraway
+farawayness
+farce
+farcelike
+farcer
+farcetta
+farcial
+farcialize
+farcical
+farcicality
+farcically
+farcicalness
+farcied
+farcify
+farcing
+farcinoma
+farcist
+farctate
+farcy
+farde
+fardel
+fardelet
+fardh
+fardo
+fare
+farer
+farewell
+farfara
+farfel
+farfetched
+farfetchedness
+Farfugium
+fargoing
+fargood
+farina
+farinaceous
+farinaceously
+faring
+farinometer
+farinose
+farinosely
+farinulent
+Farish
+farish
+farkleberry
+farl
+farleu
+farm
+farmable
+farmage
+farmer
+farmeress
+farmerette
+farmerlike
+farmership
+farmery
+farmhold
+farmhouse
+farmhousey
+farming
+farmost
+farmplace
+farmstead
+farmsteading
+farmtown
+farmy
+farmyard
+farmyardy
+farnesol
+farness
+Farnovian
+faro
+Faroeish
+Faroese
+farolito
+Farouk
+farraginous
+farrago
+farrand
+farrandly
+farrantly
+farreate
+farreation
+farrier
+farrierlike
+farriery
+farrisite
+farrow
+farruca
+farsalah
+farse
+farseeing
+farseeingness
+farseer
+farset
+Farsi
+farsighted
+farsightedly
+farsightedness
+farther
+farthermost
+farthest
+farthing
+farthingale
+farthingless
+farweltered
+fasces
+fascet
+fascia
+fascial
+fasciate
+fasciated
+fasciately
+fasciation
+fascicle
+fascicled
+fascicular
+fascicularly
+fasciculate
+fasciculated
+fasciculately
+fasciculation
+fascicule
+fasciculus
+fascinate
+fascinated
+fascinatedly
+fascinating
+fascinatingly
+fascination
+fascinative
+fascinator
+fascinatress
+fascine
+fascinery
+Fascio
+fasciodesis
+fasciola
+fasciolar
+Fasciolaria
+Fasciolariidae
+fasciole
+fasciolet
+fascioliasis
+Fasciolidae
+fascioloid
+fascioplasty
+fasciotomy
+fascis
+fascism
+fascist
+Fascista
+Fascisti
+fascisticization
+fascisticize
+fascistization
+fascistize
+fash
+fasher
+fashery
+fashion
+fashionability
+fashionable
+fashionableness
+fashionably
+fashioned
+fashioner
+fashionist
+fashionize
+fashionless
+fashionmonger
+fashionmonging
+fashious
+fashiousness
+fasibitikite
+fasinite
+fass
+fassalite
+fast
+fasten
+fastener
+fastening
+faster
+fastgoing
+fasthold
+fastidiosity
+fastidious
+fastidiously
+fastidiousness
+fastidium
+fastigate
+fastigated
+fastigiate
+fastigium
+fasting
+fastingly
+fastish
+fastland
+fastness
+fastuous
+fastuously
+fastuousness
+fastus
+fat
+Fatagaga
+fatal
+fatalism
+fatalist
+fatalistic
+fatalistically
+fatality
+fatalize
+fatally
+fatalness
+fatbird
+fatbrained
+fate
+fated
+fateful
+fatefully
+fatefulness
+fatelike
+fathead
+fatheaded
+fatheadedness
+fathearted
+father
+fathercraft
+fathered
+fatherhood
+fatherland
+fatherlandish
+fatherless
+fatherlessness
+fatherlike
+fatherliness
+fatherling
+fatherly
+fathership
+fathmur
+fathom
+fathomable
+fathomage
+fathomer
+Fathometer
+fathomless
+fathomlessly
+fathomlessness
+fatidic
+fatidical
+fatidically
+fatiferous
+fatigability
+fatigable
+fatigableness
+fatigue
+fatigueless
+fatiguesome
+fatiguing
+fatiguingly
+fatiha
+fatil
+fatiloquent
+Fatima
+Fatimid
+fatiscence
+fatiscent
+fatless
+fatling
+fatly
+fatness
+fatsia
+fattable
+fatten
+fattenable
+fattener
+fatter
+fattily
+fattiness
+fattish
+fattishness
+fattrels
+fatty
+fatuism
+fatuitous
+fatuitousness
+fatuity
+fatuoid
+fatuous
+fatuously
+fatuousness
+fatwood
+faucal
+faucalize
+fauces
+faucet
+fauchard
+faucial
+faucitis
+faucre
+faugh
+faujasite
+fauld
+Faulkland
+fault
+faultage
+faulter
+faultfind
+faultfinder
+faultfinding
+faultful
+faultfully
+faultily
+faultiness
+faulting
+faultless
+faultlessly
+faultlessness
+faultsman
+faulty
+faun
+Fauna
+faunal
+faunally
+faunated
+faunish
+faunist
+faunistic
+faunistical
+faunistically
+faunlike
+faunological
+faunology
+faunule
+fause
+faussebraie
+faussebrayed
+faust
+Faustian
+fauterer
+fautor
+fautorship
+fauve
+Fauvism
+Fauvist
+favaginous
+favella
+favellidium
+favelloid
+Faventine
+faveolate
+faveolus
+faviform
+favilla
+favillous
+favism
+favissa
+favn
+favonian
+Favonius
+favor
+favorable
+favorableness
+favorably
+favored
+favoredly
+favoredness
+favorer
+favoress
+favoring
+favoringly
+favorite
+favoritism
+favorless
+favose
+favosely
+favosite
+Favosites
+Favositidae
+favositoid
+favous
+favus
+fawn
+fawner
+fawnery
+fawning
+fawningly
+fawningness
+fawnlike
+fawnskin
+fawny
+Fay
+fay
+Fayal
+fayalite
+Fayettism
+fayles
+Fayumic
+faze
+fazenda
+fe
+feaberry
+feague
+feak
+feal
+fealty
+fear
+fearable
+feared
+fearedly
+fearedness
+fearer
+fearful
+fearfully
+fearfulness
+fearingly
+fearless
+fearlessly
+fearlessness
+fearnought
+fearsome
+fearsomely
+fearsomeness
+feasance
+feasibility
+feasible
+feasibleness
+feasibly
+feasor
+feast
+feasten
+feaster
+feastful
+feastfully
+feastless
+feat
+feather
+featherback
+featherbed
+featherbedding
+featherbird
+featherbone
+featherbrain
+featherbrained
+featherdom
+feathered
+featheredge
+featheredged
+featherer
+featherfew
+featherfoil
+featherhead
+featherheaded
+featheriness
+feathering
+featherleaf
+featherless
+featherlessness
+featherlet
+featherlike
+featherman
+feathermonger
+featherpate
+featherpated
+featherstitch
+featherstitching
+feathertop
+featherway
+featherweed
+featherweight
+featherwing
+featherwise
+featherwood
+featherwork
+featherworker
+feathery
+featliness
+featly
+featness
+featous
+featural
+featurally
+feature
+featured
+featureful
+featureless
+featureliness
+featurely
+featy
+feaze
+feazings
+febricant
+febricide
+febricity
+febricula
+febrifacient
+febriferous
+febrific
+febrifugal
+febrifuge
+febrile
+febrility
+Febronian
+Febronianism
+Februarius
+February
+februation
+fecal
+fecalith
+fecaloid
+feces
+Fechnerian
+feck
+feckful
+feckfully
+feckless
+fecklessly
+fecklessness
+feckly
+fecula
+feculence
+feculency
+feculent
+fecund
+fecundate
+fecundation
+fecundative
+fecundator
+fecundatory
+fecundify
+fecundity
+fecundize
+fed
+feddan
+federacy
+Federal
+federal
+federalism
+federalist
+federalization
+federalize
+federally
+federalness
+federate
+federation
+federationist
+federatist
+federative
+federatively
+federator
+Fedia
+Fedora
+fee
+feeable
+feeble
+feeblebrained
+feeblehearted
+feebleheartedly
+feebleheartedness
+feebleness
+feebling
+feeblish
+feebly
+feed
+feedable
+feedback
+feedbin
+feedboard
+feedbox
+feeder
+feedhead
+feeding
+feedman
+feedsman
+feedstuff
+feedway
+feedy
+feel
+feelable
+feeler
+feeless
+feeling
+feelingful
+feelingless
+feelinglessly
+feelingly
+feelingness
+feer
+feere
+feering
+feetage
+feetless
+feeze
+fefnicute
+fegary
+Fegatella
+Fehmic
+fei
+feif
+feigher
+feign
+feigned
+feignedly
+feignedness
+feigner
+feigning
+feigningly
+Feijoa
+feil
+feint
+feis
+feist
+feisty
+Felapton
+feldsher
+feldspar
+feldsparphyre
+feldspathic
+feldspathization
+feldspathoid
+Felichthys
+felicide
+felicific
+felicitate
+felicitation
+felicitator
+felicitous
+felicitously
+felicitousness
+felicity
+felid
+Felidae
+feliform
+Felinae
+feline
+felinely
+felineness
+felinity
+felinophile
+felinophobe
+Felis
+Felix
+fell
+fellable
+fellage
+fellah
+fellaheen
+fellahin
+Fellani
+Fellata
+Fellatah
+fellatio
+fellation
+fellen
+feller
+fellic
+felliducous
+fellifluous
+felling
+fellingbird
+fellinic
+fellmonger
+fellmongering
+fellmongery
+fellness
+felloe
+fellow
+fellowcraft
+fellowess
+fellowheirship
+fellowless
+fellowlike
+fellowship
+fellside
+fellsman
+felly
+feloid
+felon
+feloness
+felonious
+feloniously
+feloniousness
+felonry
+felonsetter
+felonsetting
+felonweed
+felonwood
+felonwort
+felony
+fels
+felsite
+felsitic
+felsobanyite
+felsophyre
+felsophyric
+felsosphaerite
+felstone
+felt
+felted
+felter
+felting
+feltlike
+feltmaker
+feltmaking
+feltmonger
+feltness
+feltwork
+feltwort
+felty
+feltyfare
+felucca
+Felup
+felwort
+female
+femalely
+femaleness
+femality
+femalize
+Feme
+feme
+femerell
+femic
+femicide
+feminacy
+feminal
+feminality
+feminate
+femineity
+feminie
+feminility
+feminin
+feminine
+femininely
+feminineness
+femininism
+femininity
+feminism
+feminist
+feministic
+feministics
+feminity
+feminization
+feminize
+feminologist
+feminology
+feminophobe
+femora
+femoral
+femorocaudal
+femorocele
+femorococcygeal
+femorofibular
+femoropopliteal
+femororotulian
+femorotibial
+femur
+fen
+fenbank
+fenberry
+fence
+fenceful
+fenceless
+fencelessness
+fencelet
+fenceplay
+fencer
+fenceress
+fenchene
+fenchone
+fenchyl
+fencible
+fencing
+fend
+fendable
+fender
+fendering
+fenderless
+fendillate
+fendillation
+fendy
+feneration
+fenestella
+Fenestellidae
+fenestra
+fenestral
+fenestrate
+fenestrated
+fenestration
+fenestrato
+fenestrule
+Fenian
+Fenianism
+fenite
+fenks
+fenland
+fenlander
+fenman
+fennec
+fennel
+fennelflower
+fennig
+fennish
+Fennoman
+fenny
+fenouillet
+Fenrir
+fensive
+fent
+fenter
+fenugreek
+Fenzelia
+feod
+feodal
+feodality
+feodary
+feodatory
+feoff
+feoffee
+feoffeeship
+feoffment
+feoffor
+feower
+feracious
+feracity
+Ferae
+Ferahan
+feral
+feralin
+Feramorz
+ferash
+ferberite
+Ferdiad
+ferdwit
+feretory
+feretrum
+ferfathmur
+ferfet
+ferganite
+Fergus
+fergusite
+Ferguson
+fergusonite
+feria
+ferial
+feridgi
+ferie
+ferine
+ferinely
+ferineness
+Feringi
+Ferio
+Ferison
+ferity
+ferk
+ferling
+ferly
+fermail
+Fermatian
+ferme
+ferment
+fermentability
+fermentable
+fermentarian
+fermentation
+fermentative
+fermentatively
+fermentativeness
+fermentatory
+fermenter
+fermentescible
+fermentitious
+fermentive
+fermentology
+fermentor
+fermentum
+fermerer
+fermery
+fermila
+fermorite
+fern
+fernandinite
+Fernando
+fernbird
+fernbrake
+ferned
+fernery
+ferngale
+ferngrower
+fernland
+fernleaf
+fernless
+fernlike
+fernshaw
+fernsick
+ferntickle
+ferntickled
+fernwort
+ferny
+Ferocactus
+ferocious
+ferociously
+ferociousness
+ferocity
+feroher
+Feronia
+ferrado
+ferrament
+Ferrara
+Ferrarese
+ferrate
+ferrated
+ferrateen
+ferratin
+ferrean
+ferreous
+ferret
+ferreter
+ferreting
+ferretto
+ferrety
+ferri
+ferriage
+ferric
+ferrichloride
+ferricyanate
+ferricyanhydric
+ferricyanic
+ferricyanide
+ferricyanogen
+ferrier
+ferriferous
+ferrihydrocyanic
+ferriprussiate
+ferriprussic
+ferrite
+ferritization
+ferritungstite
+ferrivorous
+ferroalloy
+ferroaluminum
+ferroboron
+ferrocalcite
+ferrocerium
+ferrochrome
+ferrochromium
+ferroconcrete
+ferroconcretor
+ferrocyanate
+ferrocyanhydric
+ferrocyanic
+ferrocyanide
+ferrocyanogen
+ferroglass
+ferrogoslarite
+ferrohydrocyanic
+ferroinclave
+ferromagnesian
+ferromagnetic
+ferromagnetism
+ferromanganese
+ferromolybdenum
+ferronatrite
+ferronickel
+ferrophosphorus
+ferroprint
+ferroprussiate
+ferroprussic
+ferrosilicon
+ferrotitanium
+ferrotungsten
+ferrotype
+ferrotyper
+ferrous
+ferrovanadium
+ferrozirconium
+ferruginate
+ferrugination
+ferruginean
+ferruginous
+ferrule
+ferruler
+ferrum
+ferruminate
+ferrumination
+ferry
+ferryboat
+ferryhouse
+ferryman
+ferryway
+ferthumlungur
+Fertil
+fertile
+fertilely
+fertileness
+fertility
+fertilizable
+fertilization
+fertilizational
+fertilize
+fertilizer
+feru
+ferula
+ferulaceous
+ferule
+ferulic
+fervanite
+fervency
+fervent
+fervently
+ferventness
+fervescence
+fervescent
+fervid
+fervidity
+fervidly
+fervidness
+Fervidor
+fervor
+fervorless
+Fesapo
+Fescennine
+fescenninity
+fescue
+fess
+fessely
+fesswise
+fest
+festal
+festally
+Feste
+fester
+festerment
+festilogy
+festinance
+festinate
+festinately
+festination
+festine
+Festino
+festival
+festivally
+festive
+festively
+festiveness
+festivity
+festivous
+festology
+festoon
+festoonery
+festoony
+festuca
+festucine
+fet
+fetal
+fetalism
+fetalization
+fetation
+fetch
+fetched
+fetcher
+fetching
+fetchingly
+feteless
+feterita
+fetial
+fetiales
+fetichmonger
+feticidal
+feticide
+fetid
+fetidity
+fetidly
+fetidness
+fetiferous
+fetiparous
+fetish
+fetisheer
+fetishic
+fetishism
+fetishist
+fetishistic
+fetishization
+fetishize
+fetishmonger
+fetishry
+fetlock
+fetlocked
+fetlow
+fetography
+fetometry
+fetoplacental
+fetor
+fetter
+fetterbush
+fetterer
+fetterless
+fetterlock
+fetticus
+fettle
+fettler
+fettling
+fetus
+feu
+feuage
+feuar
+feucht
+feud
+feudal
+feudalism
+feudalist
+feudalistic
+feudality
+feudalizable
+feudalization
+feudalize
+feudally
+feudatorial
+feudatory
+feudee
+feudist
+feudovassalism
+feued
+Feuillants
+feuille
+feuilletonism
+feuilletonist
+feuilletonistic
+feulamort
+fever
+feverberry
+feverbush
+fevercup
+feveret
+feverfew
+fevergum
+feverish
+feverishly
+feverishness
+feverless
+feverlike
+feverous
+feverously
+feverroot
+fevertrap
+fevertwig
+fevertwitch
+feverweed
+feverwort
+few
+fewness
+fewsome
+fewter
+fewterer
+fewtrils
+fey
+feyness
+fez
+Fezzan
+fezzed
+Fezziwig
+fezzy
+fi
+fiacre
+fiance
+fiancee
+fianchetto
+Fianna
+fiar
+fiard
+fiasco
+fiat
+fiatconfirmatio
+fib
+fibber
+fibbery
+fibdom
+Fiber
+fiber
+fiberboard
+fibered
+Fiberglas
+fiberize
+fiberizer
+fiberless
+fiberware
+fibration
+fibreless
+fibreware
+fibriform
+fibril
+fibrilla
+fibrillar
+fibrillary
+fibrillate
+fibrillated
+fibrillation
+fibrilled
+fibrilliferous
+fibrilliform
+fibrillose
+fibrillous
+fibrin
+fibrinate
+fibrination
+fibrine
+fibrinemia
+fibrinoalbuminous
+fibrinocellular
+fibrinogen
+fibrinogenetic
+fibrinogenic
+fibrinogenous
+fibrinolysin
+fibrinolysis
+fibrinolytic
+fibrinoplastic
+fibrinoplastin
+fibrinopurulent
+fibrinose
+fibrinosis
+fibrinous
+fibrinuria
+fibroadenia
+fibroadenoma
+fibroadipose
+fibroangioma
+fibroareolar
+fibroblast
+fibroblastic
+fibrobronchitis
+fibrocalcareous
+fibrocarcinoma
+fibrocartilage
+fibrocartilaginous
+fibrocaseose
+fibrocaseous
+fibrocellular
+fibrochondritis
+fibrochondroma
+fibrochondrosteal
+fibrocrystalline
+fibrocyst
+fibrocystic
+fibrocystoma
+fibrocyte
+fibroelastic
+fibroenchondroma
+fibrofatty
+fibroferrite
+fibroglia
+fibroglioma
+fibrohemorrhagic
+fibroid
+fibroin
+fibrointestinal
+fibroligamentous
+fibrolipoma
+fibrolipomatous
+fibrolite
+fibrolitic
+fibroma
+fibromata
+fibromatoid
+fibromatosis
+fibromatous
+fibromembrane
+fibromembranous
+fibromucous
+fibromuscular
+fibromyectomy
+fibromyitis
+fibromyoma
+fibromyomatous
+fibromyomectomy
+fibromyositis
+fibromyotomy
+fibromyxoma
+fibromyxosarcoma
+fibroneuroma
+fibronuclear
+fibronucleated
+fibropapilloma
+fibropericarditis
+fibroplastic
+fibropolypus
+fibropsammoma
+fibropurulent
+fibroreticulate
+fibrosarcoma
+fibrose
+fibroserous
+fibrosis
+fibrositis
+Fibrospongiae
+fibrotic
+fibrotuberculosis
+fibrous
+fibrously
+fibrousness
+fibrovasal
+fibrovascular
+fibry
+fibster
+fibula
+fibulae
+fibular
+fibulare
+fibulocalcaneal
+Ficaria
+ficary
+fice
+ficelle
+fiche
+Fichtean
+Fichteanism
+fichtelite
+fichu
+ficiform
+fickle
+ficklehearted
+fickleness
+ficklety
+ficklewise
+fickly
+fico
+ficoid
+Ficoidaceae
+Ficoideae
+ficoides
+fictation
+fictile
+fictileness
+fictility
+fiction
+fictional
+fictionalize
+fictionally
+fictionary
+fictioneer
+fictioner
+fictionist
+fictionistic
+fictionization
+fictionize
+fictionmonger
+fictious
+fictitious
+fictitiously
+fictitiousness
+fictive
+fictively
+Ficula
+Ficus
+fid
+Fidac
+fidalgo
+fidate
+fidation
+fiddle
+fiddleback
+fiddlebrained
+fiddlecome
+fiddledeedee
+fiddlefaced
+fiddlehead
+fiddleheaded
+fiddler
+fiddlerfish
+fiddlery
+fiddlestick
+fiddlestring
+fiddlewood
+fiddley
+fiddling
+fide
+fideicommiss
+fideicommissary
+fideicommission
+fideicommissioner
+fideicommissor
+fideicommissum
+fideism
+fideist
+fidejussion
+fidejussionary
+fidejussor
+fidejussory
+Fidele
+Fidelia
+Fidelio
+fidelity
+fidepromission
+fidepromissor
+Fides
+Fidessa
+fidfad
+fidge
+fidget
+fidgeter
+fidgetily
+fidgetiness
+fidgeting
+fidgetingly
+fidgety
+Fidia
+fidicinal
+fidicinales
+fidicula
+Fido
+fiducia
+fiducial
+fiducially
+fiduciarily
+fiduciary
+fiducinales
+fie
+fiedlerite
+fiefdom
+field
+fieldball
+fieldbird
+fielded
+fielder
+fieldfare
+fieldish
+fieldman
+fieldpiece
+fieldsman
+fieldward
+fieldwards
+fieldwork
+fieldworker
+fieldwort
+fieldy
+fiend
+fiendful
+fiendfully
+fiendhead
+fiendish
+fiendishly
+fiendishness
+fiendism
+fiendlike
+fiendliness
+fiendly
+fiendship
+fient
+Fierabras
+Fierasfer
+fierasferid
+Fierasferidae
+fierasferoid
+fierce
+fiercehearted
+fiercely
+fiercen
+fierceness
+fierding
+fierily
+fieriness
+fiery
+fiesta
+fieulamort
+Fife
+fife
+fifer
+fifie
+fifish
+fifo
+fifteen
+fifteener
+fifteenfold
+fifteenth
+fifteenthly
+fifth
+fifthly
+fiftieth
+fifty
+fiftyfold
+fig
+figaro
+figbird
+figeater
+figent
+figged
+figgery
+figging
+figgle
+figgy
+fight
+fightable
+fighter
+fighteress
+fighting
+fightingly
+fightwite
+Figitidae
+figless
+figlike
+figment
+figmental
+figpecker
+figshell
+figulate
+figulated
+figuline
+figurability
+figurable
+figural
+figurant
+figurante
+figurate
+figurately
+figuration
+figurative
+figuratively
+figurativeness
+figure
+figured
+figuredly
+figurehead
+figureheadless
+figureheadship
+figureless
+figurer
+figuresome
+figurette
+figurial
+figurine
+figurism
+figurist
+figurize
+figury
+figworm
+figwort
+Fiji
+Fijian
+fike
+fikie
+filace
+filaceous
+filacer
+Filago
+filament
+filamentar
+filamentary
+filamented
+filamentiferous
+filamentoid
+filamentose
+filamentous
+filamentule
+filander
+filanders
+filao
+filar
+Filaria
+filaria
+filarial
+filarian
+filariasis
+filaricidal
+filariform
+filariid
+Filariidae
+filarious
+filasse
+filate
+filator
+filature
+filbert
+filch
+filcher
+filchery
+filching
+filchingly
+file
+filefish
+filelike
+filemaker
+filemaking
+filemot
+filer
+filesmith
+filet
+filial
+filiality
+filially
+filialness
+filiate
+filiation
+filibeg
+filibranch
+Filibranchia
+filibranchiate
+filibuster
+filibusterer
+filibusterism
+filibusterous
+filical
+Filicales
+filicauline
+Filices
+filicic
+filicidal
+filicide
+filiciform
+filicin
+Filicineae
+filicinean
+filicite
+Filicites
+filicologist
+filicology
+Filicornia
+filiety
+filiferous
+filiform
+filiformed
+Filigera
+filigerous
+filigree
+filing
+filings
+filionymic
+filiopietistic
+filioque
+Filipendula
+filipendulous
+Filipina
+Filipiniana
+Filipinization
+Filipinize
+Filipino
+filippo
+filipuncture
+filite
+Filix
+fill
+fillable
+filled
+fillemot
+filler
+fillercap
+fillet
+filleter
+filleting
+filletlike
+filletster
+filleul
+filling
+fillingly
+fillingness
+fillip
+fillipeen
+fillister
+fillmass
+fillock
+fillowite
+filly
+film
+filmable
+filmdom
+filmet
+filmgoer
+filmgoing
+filmic
+filmiform
+filmily
+filminess
+filmish
+filmist
+filmize
+filmland
+filmlike
+filmogen
+filmslide
+filmstrip
+filmy
+filo
+filoplumaceous
+filoplume
+filopodium
+Filosa
+filose
+filoselle
+fils
+filter
+filterability
+filterable
+filterableness
+filterer
+filtering
+filterman
+filth
+filthify
+filthily
+filthiness
+filthless
+filthy
+filtrability
+filtrable
+filtratable
+filtrate
+filtration
+fimble
+fimbria
+fimbrial
+fimbriate
+fimbriated
+fimbriation
+fimbriatum
+fimbricate
+fimbricated
+fimbrilla
+fimbrillate
+fimbrilliferous
+fimbrillose
+fimbriodentate
+Fimbristylis
+fimetarious
+fimicolous
+Fin
+fin
+finable
+finableness
+finagle
+finagler
+final
+finale
+finalism
+finalist
+finality
+finalize
+finally
+finance
+financial
+financialist
+financially
+financier
+financiery
+financist
+finback
+finch
+finchbacked
+finched
+finchery
+find
+findability
+findable
+findal
+finder
+findfault
+finding
+findjan
+fine
+fineable
+finebent
+fineish
+fineleaf
+fineless
+finely
+finement
+fineness
+finer
+finery
+finespun
+finesse
+finesser
+finestill
+finestiller
+finetop
+finfish
+finfoot
+Fingal
+Fingall
+Fingallian
+fingent
+finger
+fingerable
+fingerberry
+fingerbreadth
+fingered
+fingerer
+fingerfish
+fingerflower
+fingerhold
+fingerhook
+fingering
+fingerleaf
+fingerless
+fingerlet
+fingerlike
+fingerling
+fingernail
+fingerparted
+fingerprint
+fingerprinting
+fingerroot
+fingersmith
+fingerspin
+fingerstall
+fingerstone
+fingertip
+fingerwise
+fingerwork
+fingery
+fingrigo
+Fingu
+finial
+finialed
+finical
+finicality
+finically
+finicalness
+finicism
+finick
+finickily
+finickiness
+finicking
+finickingly
+finickingness
+finific
+finify
+Finiglacial
+finikin
+finiking
+fining
+finis
+finish
+finishable
+finished
+finisher
+finishing
+finite
+finitely
+finiteness
+finitesimal
+finitive
+finitude
+finity
+finjan
+fink
+finkel
+finland
+Finlander
+finless
+finlet
+finlike
+Finmark
+Finn
+finnac
+finned
+finner
+finnesko
+Finnic
+Finnicize
+finnip
+Finnish
+finny
+finochio
+Fionnuala
+fiord
+fiorded
+Fioretti
+fiorin
+fiorite
+Fiot
+fip
+fipenny
+fipple
+fique
+fir
+Firbolg
+firca
+fire
+fireable
+firearm
+firearmed
+fireback
+fireball
+firebird
+fireblende
+fireboard
+fireboat
+firebolt
+firebolted
+firebote
+firebox
+fireboy
+firebrand
+firebrat
+firebreak
+firebrick
+firebug
+fireburn
+firecoat
+firecracker
+firecrest
+fired
+firedamp
+firedog
+firedrake
+firefall
+firefang
+firefanged
+fireflaught
+fireflirt
+fireflower
+firefly
+fireguard
+firehouse
+fireless
+firelight
+firelike
+fireling
+firelit
+firelock
+fireman
+firemanship
+firemaster
+fireplace
+fireplug
+firepower
+fireproof
+fireproofing
+fireproofness
+firer
+fireroom
+firesafe
+firesafeness
+firesafety
+fireshaft
+fireshine
+fireside
+firesider
+firesideship
+firespout
+firestone
+firestopping
+firetail
+firetop
+firetrap
+firewarden
+firewater
+fireweed
+firewood
+firework
+fireworkless
+fireworky
+fireworm
+firing
+firk
+firker
+firkin
+firlot
+firm
+firmament
+firmamental
+firman
+firmance
+firmer
+firmhearted
+firmisternal
+Firmisternia
+firmisternial
+firmisternous
+firmly
+firmness
+firn
+Firnismalerei
+Firoloida
+firring
+firry
+first
+firstcomer
+firsthand
+firstling
+firstly
+firstness
+firstship
+firth
+fisc
+fiscal
+fiscalify
+fiscalism
+fiscalization
+fiscalize
+fiscally
+fischerite
+fise
+fisetin
+fish
+fishable
+fishback
+fishbed
+fishberry
+fishbolt
+fishbone
+fisheater
+fished
+fisher
+fisherboat
+fisherboy
+fisheress
+fisherfolk
+fishergirl
+fisherman
+fisherpeople
+fisherwoman
+fishery
+fishet
+fisheye
+fishfall
+fishful
+fishgarth
+fishgig
+fishhood
+fishhook
+fishhooks
+fishhouse
+fishify
+fishily
+fishiness
+fishing
+fishingly
+fishless
+fishlet
+fishlike
+fishline
+fishling
+fishman
+fishmonger
+fishmouth
+fishplate
+fishpond
+fishpool
+fishpot
+fishpotter
+fishpound
+fishskin
+fishtail
+fishway
+fishweed
+fishweir
+fishwife
+fishwoman
+fishwood
+fishworker
+fishworks
+fishworm
+fishy
+fishyard
+fisnoga
+fissate
+fissicostate
+fissidactyl
+Fissidens
+Fissidentaceae
+fissidentaceous
+fissile
+fissileness
+fissilingual
+Fissilinguia
+fissility
+fission
+fissionable
+fissipalmate
+fissipalmation
+fissiparation
+fissiparism
+fissiparity
+fissiparous
+fissiparously
+fissiparousness
+fissiped
+Fissipeda
+fissipedal
+fissipedate
+Fissipedia
+fissipedial
+Fissipes
+fissirostral
+fissirostrate
+Fissirostres
+fissive
+fissural
+fissuration
+fissure
+fissureless
+Fissurella
+Fissurellidae
+fissuriform
+fissury
+fist
+fisted
+fister
+fistful
+fistiana
+fistic
+fistical
+fisticuff
+fisticuffer
+fisticuffery
+fistify
+fistiness
+fisting
+fistlike
+fistmele
+fistnote
+fistuca
+fistula
+Fistulana
+fistular
+Fistularia
+Fistulariidae
+fistularioid
+fistulate
+fistulated
+fistulatome
+fistulatous
+fistule
+fistuliform
+Fistulina
+fistulize
+fistulose
+fistulous
+fistwise
+fisty
+fit
+fitch
+fitched
+fitchee
+fitcher
+fitchery
+fitchet
+fitchew
+fitful
+fitfully
+fitfulness
+fitly
+fitment
+fitness
+fitout
+fitroot
+fittable
+fittage
+fitted
+fittedness
+fitten
+fitter
+fitters
+fittily
+fittiness
+fitting
+fittingly
+fittingness
+Fittonia
+fitty
+fittyfied
+fittyways
+fittywise
+fitweed
+Fitzclarence
+Fitzroy
+Fitzroya
+Fiuman
+five
+fivebar
+fivefold
+fivefoldness
+fiveling
+fivepence
+fivepenny
+fivepins
+fiver
+fives
+fivescore
+fivesome
+fivestones
+fix
+fixable
+fixage
+fixate
+fixatif
+fixation
+fixative
+fixator
+fixature
+fixed
+fixedly
+fixedness
+fixer
+fixidity
+fixing
+fixity
+fixture
+fixtureless
+fixure
+fizelyite
+fizgig
+fizz
+fizzer
+fizzle
+fizzy
+fjarding
+fjeld
+fjerding
+Fjorgyn
+flabbergast
+flabbergastation
+flabbily
+flabbiness
+flabby
+flabellarium
+flabellate
+flabellation
+flabellifoliate
+flabelliform
+flabellinerved
+flabellum
+flabrum
+flaccid
+flaccidity
+flaccidly
+flaccidness
+flacherie
+Flacian
+Flacianism
+Flacianist
+flack
+flacked
+flacker
+flacket
+Flacourtia
+Flacourtiaceae
+flacourtiaceous
+flaff
+flaffer
+flag
+flagboat
+flagellant
+flagellantism
+flagellar
+Flagellaria
+Flagellariaceae
+flagellariaceous
+Flagellata
+Flagellatae
+flagellate
+flagellated
+flagellation
+flagellative
+flagellator
+flagellatory
+flagelliferous
+flagelliform
+flagellist
+flagellosis
+flagellula
+flagellum
+flageolet
+flagfall
+flagger
+flaggery
+flaggily
+flagginess
+flagging
+flaggingly
+flaggish
+flaggy
+flagitate
+flagitation
+flagitious
+flagitiously
+flagitiousness
+flagleaf
+flagless
+flaglet
+flaglike
+flagmaker
+flagmaking
+flagman
+flagon
+flagonet
+flagonless
+flagpole
+flagrance
+flagrancy
+flagrant
+flagrantly
+flagrantness
+flagroot
+flagship
+flagstaff
+flagstick
+flagstone
+flagworm
+flail
+flaillike
+flair
+flaith
+flaithship
+flajolotite
+flak
+flakage
+flake
+flakeless
+flakelet
+flaker
+flakily
+flakiness
+flaky
+flam
+Flamandization
+Flamandize
+flamant
+flamb
+flambeau
+flambeaux
+flamberg
+flamboyance
+flamboyancy
+flamboyant
+flamboyantism
+flamboyantize
+flamboyantly
+flamboyer
+flame
+flamed
+flameflower
+flameless
+flamelet
+flamelike
+flamen
+flamenco
+flamenship
+flameproof
+flamer
+flamfew
+flamineous
+flaming
+Flamingant
+flamingly
+flamingo
+Flaminian
+flaminica
+flaminical
+flammability
+flammable
+flammeous
+flammiferous
+flammulated
+flammulation
+flammule
+flamy
+flan
+flancard
+flanch
+flanched
+flanconade
+flandan
+flandowser
+flane
+flange
+flangeless
+flanger
+flangeway
+flank
+flankard
+flanked
+flanker
+flanking
+flankwise
+flanky
+flannel
+flannelbush
+flanneled
+flannelette
+flannelflower
+flannelleaf
+flannelly
+flannelmouth
+flannelmouthed
+flannels
+flanque
+flap
+flapcake
+flapdock
+flapdoodle
+flapdragon
+flapjack
+flapmouthed
+flapper
+flapperdom
+flapperhood
+flapperish
+flapperism
+flare
+flareback
+flareboard
+flareless
+flaring
+flaringly
+flary
+flaser
+flash
+flashboard
+flasher
+flashet
+flashily
+flashiness
+flashing
+flashingly
+flashlight
+flashlike
+flashly
+flashness
+flashover
+flashpan
+flashproof
+flashtester
+flashy
+flask
+flasker
+flasket
+flasklet
+flasque
+flat
+flatboat
+flatbottom
+flatcap
+flatcar
+flatdom
+flated
+flatfish
+flatfoot
+flathat
+flathead
+flatiron
+flatland
+flatlet
+flatling
+flatly
+flatman
+flatness
+flatnose
+flatten
+flattener
+flattening
+flatter
+flatterable
+flattercap
+flatterdock
+flatterer
+flattering
+flatteringly
+flatteringness
+flattery
+flattie
+flatting
+flattish
+flattop
+flatulence
+flatulency
+flatulent
+flatulently
+flatulentness
+flatus
+flatware
+flatway
+flatways
+flatweed
+flatwise
+flatwoods
+flatwork
+flatworm
+Flaubertian
+flaught
+flaughter
+flaunt
+flaunter
+flauntily
+flauntiness
+flaunting
+flauntingly
+flaunty
+flautino
+flautist
+flavanilin
+flavaniline
+flavanthrene
+flavanthrone
+flavedo
+Flaveria
+flavescence
+flavescent
+Flavia
+Flavian
+flavic
+flavicant
+flavid
+flavin
+flavine
+Flavius
+flavo
+Flavobacterium
+flavone
+flavoprotein
+flavopurpurin
+flavor
+flavored
+flavorer
+flavorful
+flavoring
+flavorless
+flavorous
+flavorsome
+flavory
+flavour
+flaw
+flawed
+flawflower
+flawful
+flawless
+flawlessly
+flawlessness
+flawn
+flawy
+flax
+flaxboard
+flaxbush
+flaxdrop
+flaxen
+flaxlike
+flaxman
+flaxseed
+flaxtail
+flaxweed
+flaxwench
+flaxwife
+flaxwoman
+flaxwort
+flaxy
+flay
+flayer
+flayflint
+flea
+fleabane
+fleabite
+fleadock
+fleam
+fleaseed
+fleaweed
+fleawood
+fleawort
+fleay
+flebile
+fleche
+flechette
+fleck
+flecken
+flecker
+fleckiness
+fleckled
+fleckless
+flecklessly
+flecky
+flecnodal
+flecnode
+flection
+flectional
+flectionless
+flector
+fled
+fledge
+fledgeless
+fledgling
+fledgy
+flee
+fleece
+fleeceable
+fleeced
+fleeceflower
+fleeceless
+fleecelike
+fleecer
+fleech
+fleechment
+fleecily
+fleeciness
+fleecy
+fleer
+fleerer
+fleering
+fleeringly
+fleet
+fleeter
+fleetful
+fleeting
+fleetingly
+fleetingness
+fleetings
+fleetly
+fleetness
+fleetwing
+Flem
+Fleming
+Flemish
+flemish
+flench
+flense
+flenser
+flerry
+flesh
+fleshbrush
+fleshed
+fleshen
+flesher
+fleshful
+fleshhood
+fleshhook
+fleshiness
+fleshing
+fleshings
+fleshless
+fleshlike
+fleshlily
+fleshliness
+fleshly
+fleshment
+fleshmonger
+fleshpot
+fleshy
+flet
+Fleta
+fletch
+Fletcher
+fletcher
+Fletcherism
+Fletcherite
+Fletcherize
+flether
+fleuret
+fleurettee
+fleuronnee
+fleury
+flew
+flewed
+flewit
+flews
+flex
+flexanimous
+flexed
+flexibility
+flexible
+flexibleness
+flexibly
+flexile
+flexility
+flexion
+flexionless
+flexor
+flexuose
+flexuosity
+flexuous
+flexuously
+flexuousness
+flexural
+flexure
+flexured
+fley
+fleyedly
+fleyedness
+fleyland
+fleysome
+flibbertigibbet
+flicflac
+flick
+flicker
+flickering
+flickeringly
+flickerproof
+flickertail
+flickery
+flicky
+flidder
+flier
+fligger
+flight
+flighted
+flighter
+flightful
+flightily
+flightiness
+flighting
+flightless
+flightshot
+flighty
+flimflam
+flimflammer
+flimflammery
+flimmer
+flimp
+flimsily
+flimsiness
+flimsy
+flinch
+flincher
+flinching
+flinchingly
+flinder
+Flindersia
+flindosa
+flindosy
+fling
+flinger
+flingy
+flinkite
+flint
+flinter
+flinthearted
+flintify
+flintily
+flintiness
+flintless
+flintlike
+flintlock
+flintwood
+flintwork
+flintworker
+flinty
+flioma
+flip
+flipe
+flipjack
+flippancy
+flippant
+flippantly
+flippantness
+flipper
+flipperling
+flippery
+flirt
+flirtable
+flirtation
+flirtational
+flirtationless
+flirtatious
+flirtatiously
+flirtatiousness
+flirter
+flirtigig
+flirting
+flirtingly
+flirtish
+flirtishness
+flirtling
+flirty
+flisk
+flisky
+flit
+flitch
+flitchen
+flite
+flitfold
+fliting
+flitter
+flitterbat
+flittermouse
+flittern
+flitting
+flittingly
+flitwite
+flivver
+flix
+flixweed
+Flo
+float
+floatability
+floatable
+floatage
+floatation
+floatative
+floatboard
+floater
+floatiness
+floating
+floatingly
+floative
+floatless
+floatmaker
+floatman
+floatplane
+floatsman
+floatstone
+floaty
+flob
+flobby
+floc
+floccillation
+floccipend
+floccose
+floccosely
+flocculable
+flocculant
+floccular
+flocculate
+flocculation
+flocculator
+floccule
+flocculence
+flocculency
+flocculent
+flocculently
+flocculose
+flocculus
+floccus
+flock
+flocker
+flocking
+flockless
+flocklike
+flockman
+flockmaster
+flockowner
+flockwise
+flocky
+flocoon
+flodge
+floe
+floeberg
+Floerkea
+floey
+flog
+floggable
+flogger
+flogging
+floggingly
+flogmaster
+flogster
+flokite
+flong
+flood
+floodable
+floodage
+floodboard
+floodcock
+flooded
+flooder
+floodgate
+flooding
+floodless
+floodlet
+floodlight
+floodlighting
+floodlike
+floodmark
+floodometer
+floodproof
+floodtime
+floodwater
+floodway
+floodwood
+floody
+floor
+floorage
+floorcloth
+floorer
+floorhead
+flooring
+floorless
+floorman
+floorwalker
+floorward
+floorway
+floorwise
+floozy
+flop
+flophouse
+flopover
+flopper
+floppers
+floppily
+floppiness
+floppy
+flopwing
+Flora
+flora
+floral
+Floralia
+floralize
+florally
+floramor
+floran
+florate
+floreal
+floreate
+Florence
+florence
+florent
+Florentine
+Florentinism
+florentium
+flores
+florescence
+florescent
+floressence
+floret
+floreted
+floretum
+Floria
+Florian
+floriate
+floriated
+floriation
+florican
+floricin
+floricultural
+floriculturally
+floriculture
+floriculturist
+florid
+Florida
+Floridan
+Florideae
+floridean
+florideous
+Floridian
+floridity
+floridly
+floridness
+floriferous
+floriferously
+floriferousness
+florification
+floriform
+florigen
+florigenic
+florigraphy
+florikan
+floriken
+florilegium
+florimania
+florimanist
+florin
+Florinda
+floriparous
+floripondio
+floriscope
+Florissant
+florist
+floristic
+floristically
+floristics
+floristry
+florisugent
+florivorous
+floroon
+floroscope
+florula
+florulent
+flory
+floscular
+Floscularia
+floscularian
+Flosculariidae
+floscule
+flosculose
+flosculous
+flosh
+floss
+flosser
+flossflower
+Flossie
+flossification
+flossing
+flossy
+flot
+flota
+flotage
+flotant
+flotation
+flotative
+flotilla
+flotorial
+flotsam
+flounce
+flouncey
+flouncing
+flounder
+floundering
+flounderingly
+flour
+flourish
+flourishable
+flourisher
+flourishing
+flourishingly
+flourishment
+flourishy
+flourlike
+floury
+flouse
+flout
+flouter
+flouting
+floutingly
+flow
+flowable
+flowage
+flower
+flowerage
+flowered
+flowerer
+floweret
+flowerful
+flowerily
+floweriness
+flowering
+flowerist
+flowerless
+flowerlessness
+flowerlet
+flowerlike
+flowerpecker
+flowerpot
+flowerwork
+flowery
+flowing
+flowingly
+flowingness
+flowmanostat
+flowmeter
+flown
+flowoff
+Floyd
+flu
+fluate
+fluavil
+flub
+flubdub
+flubdubbery
+flucan
+fluctiferous
+fluctigerous
+fluctisonant
+fluctisonous
+fluctuability
+fluctuable
+fluctuant
+fluctuate
+fluctuation
+fluctuosity
+fluctuous
+flue
+flued
+flueless
+fluellen
+fluellite
+flueman
+fluency
+fluent
+fluently
+fluentness
+fluer
+fluework
+fluey
+fluff
+fluffer
+fluffily
+fluffiness
+fluffy
+Flugelhorn
+flugelman
+fluible
+fluid
+fluidacetextract
+fluidal
+fluidally
+fluidextract
+fluidglycerate
+fluidible
+fluidic
+fluidification
+fluidifier
+fluidify
+fluidimeter
+fluidism
+fluidist
+fluidity
+fluidization
+fluidize
+fluidly
+fluidness
+fluidram
+fluigram
+fluitant
+fluke
+fluked
+flukeless
+flukeworm
+flukewort
+flukily
+flukiness
+fluking
+fluky
+flumdiddle
+flume
+flumerin
+fluminose
+flummadiddle
+flummer
+flummery
+flummox
+flummydiddle
+flump
+flung
+flunk
+flunker
+flunkeydom
+flunkeyhood
+flunkeyish
+flunkeyize
+flunky
+flunkydom
+flunkyhood
+flunkyish
+flunkyism
+flunkyistic
+flunkyite
+flunkyize
+fluoaluminate
+fluoaluminic
+fluoarsenate
+fluoborate
+fluoboric
+fluoborid
+fluoboride
+fluoborite
+fluobromide
+fluocarbonate
+fluocerine
+fluocerite
+fluochloride
+fluohydric
+fluophosphate
+fluor
+fluoran
+fluoranthene
+fluorapatite
+fluorate
+fluorbenzene
+fluorene
+fluorenyl
+fluoresage
+fluoresce
+fluorescein
+fluorescence
+fluorescent
+fluorescigenic
+fluorescigenous
+fluorescin
+fluorhydric
+fluoric
+fluoridate
+fluoridation
+fluoride
+fluoridization
+fluoridize
+fluorimeter
+fluorinate
+fluorination
+fluorindine
+fluorine
+fluorite
+fluormeter
+fluorobenzene
+fluoroborate
+fluoroform
+fluoroformol
+fluorogen
+fluorogenic
+fluorography
+fluoroid
+fluorometer
+fluoroscope
+fluoroscopic
+fluoroscopy
+fluorosis
+fluorotype
+fluorspar
+fluoryl
+fluosilicate
+fluosilicic
+fluotantalate
+fluotantalic
+fluotitanate
+fluotitanic
+fluozirconic
+flurn
+flurr
+flurried
+flurriedly
+flurriment
+flurry
+flush
+flushboard
+flusher
+flusherman
+flushgate
+flushing
+flushingly
+flushness
+flushy
+flusk
+flusker
+fluster
+flusterate
+flusteration
+flusterer
+flusterment
+flustery
+Flustra
+flustrine
+flustroid
+flustrum
+flute
+flutebird
+fluted
+flutelike
+flutemouth
+fluter
+flutework
+Flutidae
+flutina
+fluting
+flutist
+flutter
+flutterable
+flutteration
+flutterer
+fluttering
+flutteringly
+flutterless
+flutterment
+fluttersome
+fluttery
+fluty
+fluvial
+fluvialist
+fluviatic
+fluviatile
+fluvicoline
+fluvioglacial
+fluviograph
+fluviolacustrine
+fluviology
+fluviomarine
+fluviometer
+fluviose
+fluvioterrestrial
+fluviovolcanic
+flux
+fluxation
+fluxer
+fluxibility
+fluxible
+fluxibleness
+fluxibly
+fluxile
+fluxility
+fluxion
+fluxional
+fluxionally
+fluxionary
+fluxionist
+fluxmeter
+fluxroot
+fluxweed
+fly
+flyable
+flyaway
+flyback
+flyball
+flybane
+flybelt
+flyblow
+flyblown
+flyboat
+flyboy
+flycatcher
+flyeater
+flyer
+flyflap
+flyflapper
+flyflower
+flying
+flyingly
+flyleaf
+flyless
+flyman
+flyness
+flypaper
+flype
+flyproof
+Flysch
+flyspeck
+flytail
+flytier
+flytrap
+flyway
+flyweight
+flywheel
+flywinch
+flywort
+Fo
+foal
+foalfoot
+foalhood
+foaly
+foam
+foambow
+foamer
+foamflower
+foamily
+foaminess
+foaming
+foamingly
+foamless
+foamlike
+foamy
+fob
+focal
+focalization
+focalize
+focally
+focaloid
+foci
+focimeter
+focimetry
+focoids
+focometer
+focometry
+focsle
+focus
+focusable
+focuser
+focusless
+fod
+fodda
+fodder
+fodderer
+foddering
+fodderless
+foder
+fodge
+fodgel
+fodient
+Fodientia
+foe
+foehn
+foehnlike
+foeish
+foeless
+foelike
+foeman
+foemanship
+Foeniculum
+foenngreek
+foeship
+foetalization
+fog
+fogbound
+fogbow
+fogdog
+fogdom
+fogeater
+fogey
+fogfruit
+foggage
+fogged
+fogger
+foggily
+fogginess
+foggish
+foggy
+foghorn
+fogle
+fogless
+fogman
+fogo
+fogon
+fogou
+fogproof
+fogram
+fogramite
+fogramity
+fogscoffer
+fogus
+fogy
+fogydom
+fogyish
+fogyism
+fohat
+foible
+foil
+foilable
+foiler
+foiling
+foilsman
+foining
+foiningly
+Foism
+foison
+foisonless
+Foist
+foist
+foister
+foistiness
+foisty
+foiter
+Fokker
+fold
+foldable
+foldage
+foldboat
+foldcourse
+folded
+foldedly
+folden
+folder
+folding
+foldless
+foldskirt
+foldure
+foldwards
+foldy
+fole
+folgerite
+folia
+foliaceous
+foliaceousness
+foliage
+foliaged
+foliageous
+folial
+foliar
+foliary
+foliate
+foliated
+foliation
+foliature
+folie
+foliicolous
+foliiferous
+foliiform
+folio
+foliobranch
+foliobranchiate
+foliocellosis
+foliolate
+foliole
+folioliferous
+foliolose
+foliose
+foliosity
+foliot
+folious
+foliously
+folium
+folk
+folkcraft
+folkfree
+folkland
+folklore
+folkloric
+folklorish
+folklorism
+folklorist
+folkloristic
+folkmoot
+folkmooter
+folkmot
+folkmote
+folkmoter
+folkright
+folksiness
+folksy
+Folkvang
+Folkvangr
+folkway
+folky
+folles
+folletage
+follicle
+follicular
+folliculate
+folliculated
+follicule
+folliculin
+Folliculina
+folliculitis
+folliculose
+folliculosis
+folliculous
+folliful
+follis
+follow
+followable
+follower
+followership
+following
+followingly
+folly
+follyproof
+Fomalhaut
+foment
+fomentation
+fomenter
+fomes
+fomites
+Fon
+fondak
+fondant
+fondish
+fondle
+fondler
+fondlesome
+fondlike
+fondling
+fondlingly
+fondly
+fondness
+fondu
+fondue
+fonduk
+fonly
+fonnish
+fono
+fons
+font
+Fontainea
+fontal
+fontally
+fontanel
+fontange
+fonted
+fontful
+fonticulus
+fontinal
+Fontinalaceae
+fontinalaceous
+Fontinalis
+fontlet
+foo
+Foochow
+Foochowese
+food
+fooder
+foodful
+foodless
+foodlessness
+foodstuff
+foody
+foofaraw
+fool
+fooldom
+foolery
+fooless
+foolfish
+foolhardihood
+foolhardily
+foolhardiness
+foolhardiship
+foolhardy
+fooling
+foolish
+foolishly
+foolishness
+foollike
+foolocracy
+foolproof
+foolproofness
+foolscap
+foolship
+fooner
+fooster
+foosterer
+foot
+footage
+footback
+football
+footballer
+footballist
+footband
+footblower
+footboard
+footboy
+footbreadth
+footbridge
+footcloth
+footed
+footeite
+footer
+footfall
+footfarer
+footfault
+footfolk
+footful
+footganger
+footgear
+footgeld
+foothalt
+foothill
+foothold
+foothook
+foothot
+footing
+footingly
+footings
+footle
+footler
+footless
+footlicker
+footlight
+footlights
+footling
+footlining
+footlock
+footmaker
+footman
+footmanhood
+footmanry
+footmanship
+footmark
+footnote
+footnoted
+footpace
+footpad
+footpaddery
+footpath
+footpick
+footplate
+footprint
+footrail
+footrest
+footrill
+footroom
+footrope
+foots
+footscald
+footslog
+footslogger
+footsore
+footsoreness
+footstalk
+footstall
+footstep
+footstick
+footstock
+footstone
+footstool
+footwalk
+footwall
+footway
+footwear
+footwork
+footworn
+footy
+fooyoung
+foozle
+foozler
+fop
+fopling
+foppery
+foppish
+foppishly
+foppishness
+foppy
+fopship
+For
+for
+fora
+forage
+foragement
+forager
+foralite
+foramen
+foraminated
+foramination
+foraminifer
+Foraminifera
+foraminiferal
+foraminiferan
+foraminiferous
+foraminose
+foraminous
+foraminulate
+foraminule
+foraminulose
+foraminulous
+forane
+foraneen
+foraneous
+forasmuch
+foray
+forayer
+forb
+forbade
+forbar
+forbathe
+forbear
+forbearable
+forbearance
+forbearant
+forbearantly
+forbearer
+forbearing
+forbearingly
+forbearingness
+forbesite
+forbid
+forbiddable
+forbiddal
+forbiddance
+forbidden
+forbiddenly
+forbiddenness
+forbidder
+forbidding
+forbiddingly
+forbiddingness
+forbit
+forbled
+forblow
+forbore
+forborne
+forbow
+forby
+force
+forceable
+forced
+forcedly
+forcedness
+forceful
+forcefully
+forcefulness
+forceless
+forcemeat
+forcement
+forceps
+forcepslike
+forcer
+forchase
+forche
+forcibility
+forcible
+forcibleness
+forcibly
+forcing
+forcingly
+forcipate
+forcipated
+forcipes
+forcipiform
+forcipressure
+Forcipulata
+forcipulate
+forcleave
+forconceit
+ford
+fordable
+fordableness
+fordays
+Fordicidia
+fording
+fordless
+fordo
+fordone
+fordwine
+fordy
+fore
+foreaccounting
+foreaccustom
+foreacquaint
+foreact
+foreadapt
+foreadmonish
+foreadvertise
+foreadvice
+foreadvise
+foreallege
+foreallot
+foreannounce
+foreannouncement
+foreanswer
+foreappoint
+foreappointment
+forearm
+foreassign
+foreassurance
+forebackwardly
+forebay
+forebear
+forebemoan
+forebemoaned
+forebespeak
+forebitt
+forebitten
+forebitter
+forebless
+foreboard
+forebode
+forebodement
+foreboder
+foreboding
+forebodingly
+forebodingness
+forebody
+foreboot
+forebowels
+forebowline
+forebrace
+forebrain
+forebreast
+forebridge
+foreburton
+forebush
+forecar
+forecarriage
+forecast
+forecaster
+forecasting
+forecastingly
+forecastle
+forecastlehead
+forecastleman
+forecatching
+forecatharping
+forechamber
+forechase
+forechoice
+forechoose
+forechurch
+forecited
+foreclaw
+foreclosable
+foreclose
+foreclosure
+forecome
+forecomingness
+forecommend
+foreconceive
+foreconclude
+forecondemn
+foreconscious
+foreconsent
+foreconsider
+forecontrive
+forecool
+forecooler
+forecounsel
+forecount
+forecourse
+forecourt
+forecover
+forecovert
+foredate
+foredawn
+foreday
+foredeck
+foredeclare
+foredecree
+foredeep
+foredefeated
+foredefine
+foredenounce
+foredescribe
+foredeserved
+foredesign
+foredesignment
+foredesk
+foredestine
+foredestiny
+foredetermination
+foredetermine
+foredevised
+foredevote
+forediscern
+foredispose
+foredivine
+foredone
+foredoom
+foredoomer
+foredoor
+foreface
+forefather
+forefatherly
+forefault
+forefeel
+forefeeling
+forefeelingly
+forefelt
+forefield
+forefigure
+forefin
+forefinger
+forefit
+foreflank
+foreflap
+foreflipper
+forefoot
+forefront
+foregallery
+foregame
+foreganger
+foregate
+foregift
+foregirth
+foreglance
+foregleam
+foreglimpse
+foreglow
+forego
+foregoer
+foregoing
+foregone
+foregoneness
+foreground
+foreguess
+foreguidance
+forehalf
+forehall
+forehammer
+forehand
+forehanded
+forehandedness
+forehandsel
+forehard
+forehatch
+forehatchway
+forehead
+foreheaded
+forehear
+forehearth
+foreheater
+forehill
+forehinting
+forehold
+forehood
+forehoof
+forehook
+foreign
+foreigneering
+foreigner
+foreignership
+foreignism
+foreignization
+foreignize
+foreignly
+foreignness
+foreimagination
+foreimagine
+foreimpressed
+foreimpression
+foreinclined
+foreinstruct
+foreintend
+foreiron
+forejudge
+forejudgment
+forekeel
+foreking
+foreknee
+foreknow
+foreknowable
+foreknower
+foreknowing
+foreknowingly
+foreknowledge
+forel
+forelady
+foreland
+forelay
+foreleech
+foreleg
+forelimb
+forelive
+forellenstein
+forelock
+forelook
+foreloop
+forelooper
+foreloper
+foremade
+foreman
+foremanship
+foremarch
+foremark
+foremartyr
+foremast
+foremasthand
+foremastman
+foremean
+foremeant
+foremelt
+foremention
+forementioned
+foremessenger
+foremilk
+foremisgiving
+foremistress
+foremost
+foremostly
+foremother
+forename
+forenamed
+forenews
+forenight
+forenoon
+forenote
+forenoted
+forenotice
+forenotion
+forensal
+forensic
+forensical
+forensicality
+forensically
+foreordain
+foreordainment
+foreorder
+foreordinate
+foreordination
+foreorlop
+forepad
+forepale
+foreparents
+forepart
+forepassed
+forepast
+forepaw
+forepayment
+forepeak
+foreperiod
+forepiece
+foreplace
+foreplan
+foreplanting
+forepole
+foreporch
+forepossessed
+forepost
+forepredicament
+forepreparation
+foreprepare
+forepretended
+foreproduct
+foreproffer
+forepromise
+forepromised
+foreprovided
+foreprovision
+forepurpose
+forequarter
+forequoted
+foreran
+forerank
+forereach
+forereaching
+foreread
+forereading
+forerecited
+forereckon
+forerehearsed
+foreremembered
+forereport
+forerequest
+forerevelation
+forerib
+forerigging
+foreright
+foreroom
+foreroyal
+forerun
+forerunner
+forerunnership
+forerunnings
+foresaddle
+foresaid
+foresail
+foresay
+forescene
+forescent
+foreschool
+foreschooling
+forescript
+foreseason
+foreseat
+foresee
+foreseeability
+foreseeable
+foreseeingly
+foreseer
+foreseize
+foresend
+foresense
+foresentence
+foreset
+foresettle
+foresettled
+foreshadow
+foreshadower
+foreshaft
+foreshank
+foreshape
+foresheet
+foreshift
+foreship
+foreshock
+foreshoe
+foreshop
+foreshore
+foreshorten
+foreshortening
+foreshot
+foreshoulder
+foreshow
+foreshower
+foreshroud
+foreside
+foresight
+foresighted
+foresightedness
+foresightful
+foresightless
+foresign
+foresignify
+foresin
+foresing
+foresinger
+foreskin
+foreskirt
+foresleeve
+foresound
+forespeak
+forespecified
+forespeed
+forespencer
+forest
+forestaff
+forestage
+forestair
+forestal
+forestall
+forestaller
+forestallment
+forestarling
+forestate
+forestation
+forestay
+forestaysail
+forestcraft
+forested
+foresteep
+forestem
+forestep
+forester
+forestership
+forestful
+forestial
+Forestian
+forestick
+Forestiera
+forestine
+forestish
+forestless
+forestlike
+forestology
+forestral
+forestress
+forestry
+forestside
+forestudy
+forestwards
+foresty
+foresummer
+foresummon
+foresweat
+foretack
+foretackle
+foretalk
+foretalking
+foretaste
+foretaster
+foretell
+foretellable
+foreteller
+forethink
+forethinker
+forethought
+forethoughted
+forethoughtful
+forethoughtfully
+forethoughtfulness
+forethoughtless
+forethrift
+foretime
+foretimed
+foretoken
+foretold
+foretop
+foretopman
+foretrace
+foretrysail
+foreturn
+foretype
+foretypified
+foreuse
+foreutter
+forevalue
+forever
+forevermore
+foreview
+forevision
+forevouch
+forevouched
+forevow
+forewarm
+forewarmer
+forewarn
+forewarner
+forewarning
+forewarningly
+forewaters
+foreween
+foreweep
+foreweigh
+forewing
+forewinning
+forewisdom
+forewish
+forewoman
+forewonted
+foreword
+foreworld
+foreworn
+forewritten
+forewrought
+foreyard
+foreyear
+forfairn
+forfar
+forfare
+forfars
+forfault
+forfaulture
+forfeit
+forfeiter
+forfeits
+forfeiture
+forfend
+forficate
+forficated
+forfication
+forficiform
+Forficula
+forficulate
+Forficulidae
+forfouchten
+forfoughen
+forfoughten
+forgainst
+forgather
+forge
+forgeability
+forgeable
+forged
+forgedly
+forgeful
+forgeman
+forger
+forgery
+forget
+forgetful
+forgetfully
+forgetfulness
+forgetive
+forgetness
+forgettable
+forgetter
+forgetting
+forgettingly
+forgie
+forging
+forgivable
+forgivableness
+forgivably
+forgive
+forgiveless
+forgiveness
+forgiver
+forgiving
+forgivingly
+forgivingness
+forgo
+forgoer
+forgot
+forgotten
+forgottenness
+forgrow
+forgrown
+forhoo
+forhooy
+forhow
+forinsec
+forint
+forisfamiliate
+forisfamiliation
+forjesket
+forjudge
+forjudger
+fork
+forkable
+forkbeard
+forked
+forkedly
+forkedness
+forker
+forkful
+forkhead
+forkiness
+forkless
+forklike
+forkman
+forksmith
+forktail
+forkwise
+forky
+forleft
+forlet
+forlorn
+forlornity
+forlornly
+forlornness
+form
+formability
+formable
+formably
+formagen
+formagenic
+formal
+formalazine
+formaldehyde
+formaldehydesulphoxylate
+formaldehydesulphoxylic
+formaldoxime
+formalesque
+Formalin
+formalism
+formalist
+formalistic
+formalith
+formality
+formalization
+formalize
+formalizer
+formally
+formalness
+formamide
+formamidine
+formamido
+formamidoxime
+formanilide
+formant
+format
+formate
+formation
+formational
+formative
+formatively
+formativeness
+formature
+formazyl
+forme
+formed
+formedon
+formee
+formel
+formene
+formenic
+former
+formeret
+formerly
+formerness
+formful
+formiate
+formic
+Formica
+formican
+Formicariae
+formicarian
+Formicariidae
+formicarioid
+formicarium
+formicaroid
+formicary
+formicate
+formication
+formicative
+formicicide
+formicid
+Formicidae
+formicide
+Formicina
+Formicinae
+formicine
+Formicivora
+formicivorous
+Formicoidea
+formidability
+formidable
+formidableness
+formidably
+formin
+forminate
+forming
+formless
+formlessly
+formlessness
+Formol
+formolite
+formonitrile
+Formosan
+formose
+formoxime
+formula
+formulable
+formulae
+formulaic
+formular
+formularism
+formularist
+formularistic
+formularization
+formularize
+formulary
+formulate
+formulation
+formulator
+formulatory
+formule
+formulism
+formulist
+formulistic
+formulization
+formulize
+formulizer
+formwork
+formy
+formyl
+formylal
+formylate
+formylation
+fornacic
+Fornax
+fornaxid
+fornenst
+fornent
+fornical
+fornicate
+fornicated
+fornication
+fornicator
+fornicatress
+fornicatrix
+forniciform
+forninst
+fornix
+forpet
+forpine
+forpit
+forprise
+forrad
+forrard
+forride
+forrit
+forritsome
+forrue
+forsake
+forsaken
+forsakenly
+forsakenness
+forsaker
+forset
+forslow
+forsooth
+forspeak
+forspend
+forspread
+Forst
+forsterite
+forswear
+forswearer
+forsworn
+forswornness
+Forsythia
+fort
+fortalice
+forte
+fortescue
+fortescure
+forth
+forthbring
+forthbringer
+forthcome
+forthcomer
+forthcoming
+forthcomingness
+forthcut
+forthfare
+forthfigured
+forthgaze
+forthgo
+forthgoing
+forthink
+forthputting
+forthright
+forthrightly
+forthrightness
+forthrights
+forthtell
+forthteller
+forthwith
+forthy
+forties
+fortieth
+fortifiable
+fortification
+fortifier
+fortify
+fortifying
+fortifyingly
+fortin
+fortis
+fortissimo
+fortitude
+fortitudinous
+fortlet
+fortnight
+fortnightly
+fortravail
+fortread
+fortress
+fortuitism
+fortuitist
+fortuitous
+fortuitously
+fortuitousness
+fortuity
+fortunate
+fortunately
+fortunateness
+fortune
+fortuned
+fortuneless
+Fortunella
+fortunetell
+fortuneteller
+fortunetelling
+fortunite
+forty
+fortyfold
+forum
+forumize
+forwander
+forward
+forwardal
+forwardation
+forwarder
+forwarding
+forwardly
+forwardness
+forwards
+forwean
+forweend
+forwent
+forwoden
+forworden
+fosh
+fosie
+Fosite
+fossa
+fossage
+fossane
+fossarian
+fosse
+fossed
+fossette
+fossick
+fossicker
+fossiform
+fossil
+fossilage
+fossilated
+fossilation
+fossildom
+fossiled
+fossiliferous
+fossilification
+fossilify
+fossilism
+fossilist
+fossilizable
+fossilization
+fossilize
+fossillike
+fossilogist
+fossilogy
+fossilological
+fossilologist
+fossilology
+fossor
+Fossores
+Fossoria
+fossorial
+fossorious
+fossula
+fossulate
+fossule
+fossulet
+fostell
+Foster
+foster
+fosterable
+fosterage
+fosterer
+fosterhood
+fostering
+fosteringly
+fosterite
+fosterland
+fosterling
+fostership
+fostress
+fot
+fotch
+fother
+Fothergilla
+fotmal
+fotui
+fou
+foud
+foudroyant
+fouette
+fougade
+fougasse
+fought
+foughten
+foughty
+foujdar
+foujdary
+foul
+foulage
+foulard
+fouler
+fouling
+foulish
+foully
+foulmouthed
+foulmouthedly
+foulmouthedness
+foulness
+foulsome
+foumart
+foun
+found
+foundation
+foundational
+foundationally
+foundationary
+foundationed
+foundationer
+foundationless
+foundationlessness
+founder
+founderous
+foundership
+foundery
+founding
+foundling
+foundress
+foundry
+foundryman
+fount
+fountain
+fountained
+fountaineer
+fountainhead
+fountainless
+fountainlet
+fountainous
+fountainously
+fountainwise
+fountful
+Fouquieria
+Fouquieriaceae
+fouquieriaceous
+four
+fourble
+fourche
+fourchee
+fourcher
+fourchette
+fourchite
+fourer
+fourflusher
+fourfold
+Fourierian
+Fourierism
+Fourierist
+Fourieristic
+Fourierite
+fourling
+fourpence
+fourpenny
+fourpounder
+fourre
+fourrier
+fourscore
+foursome
+foursquare
+foursquarely
+foursquareness
+fourstrand
+fourteen
+fourteener
+fourteenfold
+fourteenth
+fourteenthly
+fourth
+fourther
+fourthly
+foussa
+foute
+fouter
+fouth
+fovea
+foveal
+foveate
+foveated
+foveation
+foveiform
+foveola
+foveolarious
+foveolate
+foveolated
+foveole
+foveolet
+fow
+fowk
+fowl
+fowler
+fowlerite
+fowlery
+fowlfoot
+fowling
+fox
+foxbane
+foxberry
+foxchop
+foxer
+foxery
+foxfeet
+foxfinger
+foxfish
+foxglove
+foxhole
+foxhound
+foxily
+foxiness
+foxing
+foxish
+foxlike
+foxproof
+foxship
+foxskin
+foxtail
+foxtailed
+foxtongue
+foxwood
+foxy
+foy
+foyaite
+foyaitic
+foyboat
+foyer
+foziness
+fozy
+fra
+frab
+frabbit
+frabjous
+frabjously
+frabous
+fracas
+fracedinous
+frache
+frack
+fractable
+fractabling
+fracted
+Fracticipita
+fractile
+fraction
+fractional
+fractionalism
+fractionalize
+fractionally
+fractionary
+fractionate
+fractionating
+fractionation
+fractionator
+fractionization
+fractionize
+fractionlet
+fractious
+fractiously
+fractiousness
+fractocumulus
+fractonimbus
+fractostratus
+fractuosity
+fracturable
+fractural
+fracture
+fractureproof
+frae
+Fragaria
+fraghan
+Fragilaria
+Fragilariaceae
+fragile
+fragilely
+fragileness
+fragility
+fragment
+fragmental
+fragmentally
+fragmentarily
+fragmentariness
+fragmentary
+fragmentation
+fragmented
+fragmentist
+fragmentitious
+fragmentize
+fragrance
+fragrancy
+fragrant
+fragrantly
+fragrantness
+fraid
+fraik
+frail
+frailejon
+frailish
+frailly
+frailness
+frailty
+fraise
+fraiser
+Fram
+framable
+framableness
+frambesia
+frame
+framea
+frameable
+frameableness
+framed
+frameless
+framer
+framesmith
+framework
+framing
+frammit
+frampler
+frampold
+franc
+Frances
+franchisal
+franchise
+franchisement
+franchiser
+Francic
+Francis
+francisc
+francisca
+Franciscan
+Franciscanism
+Francisco
+francium
+Francize
+franco
+Francois
+francolin
+francolite
+Francomania
+Franconian
+Francophile
+Francophilism
+Francophobe
+Francophobia
+frangent
+Frangi
+frangibility
+frangible
+frangibleness
+frangipane
+frangipani
+frangula
+Frangulaceae
+frangulic
+frangulin
+frangulinic
+Frank
+frank
+frankability
+frankable
+frankalmoign
+Frankenia
+Frankeniaceae
+frankeniaceous
+Frankenstein
+franker
+frankfurter
+frankhearted
+frankheartedly
+frankheartedness
+Frankify
+frankincense
+frankincensed
+franking
+Frankish
+Frankist
+franklandite
+Franklin
+franklin
+Franklinia
+Franklinian
+Frankliniana
+Franklinic
+Franklinism
+Franklinist
+franklinite
+Franklinization
+frankly
+frankmarriage
+frankness
+frankpledge
+frantic
+frantically
+franticly
+franticness
+franzy
+frap
+frappe
+frapping
+frasco
+frase
+Frasera
+frasier
+frass
+frat
+fratch
+fratched
+fratcheous
+fratcher
+fratchety
+fratchy
+frater
+Fratercula
+fraternal
+fraternalism
+fraternalist
+fraternality
+fraternally
+fraternate
+fraternation
+fraternism
+fraternity
+fraternization
+fraternize
+fraternizer
+fratery
+Fraticelli
+Fraticellian
+fratority
+Fratricelli
+fratricidal
+fratricide
+fratry
+fraud
+fraudful
+fraudfully
+fraudless
+fraudlessly
+fraudlessness
+fraudproof
+fraudulence
+fraudulency
+fraudulent
+fraudulently
+fraudulentness
+fraughan
+fraught
+frawn
+fraxetin
+fraxin
+fraxinella
+Fraxinus
+fray
+frayed
+frayedly
+frayedness
+fraying
+frayn
+frayproof
+fraze
+frazer
+frazil
+frazzle
+frazzling
+freak
+freakdom
+freakery
+freakful
+freakily
+freakiness
+freakish
+freakishly
+freakishness
+freaky
+fream
+freath
+freck
+frecken
+freckened
+frecket
+freckle
+freckled
+freckledness
+freckleproof
+freckling
+frecklish
+freckly
+Fred
+Freddie
+Freddy
+Frederic
+Frederica
+Frederick
+frederik
+fredricite
+free
+freeboard
+freeboot
+freebooter
+freebootery
+freebooting
+freeborn
+Freechurchism
+freed
+freedman
+freedom
+freedwoman
+freehand
+freehanded
+freehandedly
+freehandedness
+freehearted
+freeheartedly
+freeheartedness
+freehold
+freeholder
+freeholdership
+freeholding
+freeing
+freeish
+Freekirker
+freelage
+freeloving
+freelovism
+freely
+freeman
+freemanship
+freemartin
+freemason
+freemasonic
+freemasonical
+freemasonism
+freemasonry
+freeness
+freer
+Freesia
+freesilverism
+freesilverite
+freestanding
+freestone
+freet
+freethinker
+freethinking
+freetrader
+freety
+freeward
+freeway
+freewheel
+freewheeler
+freewheeling
+freewill
+freewoman
+freezable
+freeze
+freezer
+freezing
+freezingly
+Fregata
+Fregatae
+Fregatidae
+freibergite
+freieslebenite
+freight
+freightage
+freighter
+freightless
+freightment
+freir
+freit
+freity
+fremd
+fremdly
+fremdness
+fremescence
+fremescent
+fremitus
+Fremontia
+Fremontodendron
+frenal
+Frenatae
+frenate
+French
+frenched
+Frenchification
+frenchification
+Frenchify
+frenchify
+Frenchily
+Frenchiness
+frenching
+Frenchism
+Frenchize
+Frenchless
+Frenchly
+Frenchman
+Frenchness
+Frenchwise
+Frenchwoman
+Frenchy
+frenetic
+frenetical
+frenetically
+Frenghi
+frenular
+frenulum
+frenum
+frenzelite
+frenzied
+frenziedly
+frenzy
+Freon
+frequence
+frequency
+frequent
+frequentable
+frequentage
+frequentation
+frequentative
+frequenter
+frequently
+frequentness
+frescade
+fresco
+frescoer
+frescoist
+fresh
+freshen
+freshener
+freshet
+freshhearted
+freshish
+freshly
+freshman
+freshmanhood
+freshmanic
+freshmanship
+freshness
+freshwoman
+Fresison
+fresnel
+fresno
+fret
+fretful
+fretfully
+fretfulness
+fretless
+fretsome
+frett
+frettage
+frettation
+frette
+fretted
+fretter
+fretting
+frettingly
+fretty
+fretum
+fretways
+fretwise
+fretwork
+fretworked
+Freudian
+Freudianism
+Freudism
+Freudist
+Freya
+freyalite
+Freycinetia
+Freyja
+Freyr
+friability
+friable
+friableness
+friand
+friandise
+friar
+friarbird
+friarhood
+friarling
+friarly
+friary
+frib
+fribble
+fribbleism
+fribbler
+fribblery
+fribbling
+fribblish
+fribby
+fricandeau
+fricandel
+fricassee
+frication
+fricative
+fricatrice
+friction
+frictionable
+frictional
+frictionally
+frictionize
+frictionless
+frictionlessly
+frictionproof
+Friday
+Fridila
+fridstool
+fried
+Frieda
+friedcake
+friedelite
+friedrichsdor
+friend
+friended
+friendless
+friendlessness
+friendlike
+friendlily
+friendliness
+friendliwise
+friendly
+friendship
+frier
+frieseite
+Friesian
+Friesic
+Friesish
+frieze
+friezer
+friezy
+frig
+frigate
+frigatoon
+friggle
+fright
+frightable
+frighten
+frightenable
+frightened
+frightenedly
+frightenedness
+frightener
+frightening
+frighteningly
+frighter
+frightful
+frightfully
+frightfulness
+frightless
+frightment
+frighty
+frigid
+Frigidaire
+frigidarium
+frigidity
+frigidly
+frigidness
+frigiferous
+frigolabile
+frigoric
+frigorific
+frigorifical
+frigorify
+frigorimeter
+frigostable
+frigotherapy
+Frija
+frijol
+frijolillo
+frijolito
+frike
+frill
+frillback
+frilled
+friller
+frillery
+frillily
+frilliness
+frilling
+frilly
+frim
+Frimaire
+fringe
+fringed
+fringeflower
+fringeless
+fringelet
+fringent
+fringepod
+Fringetail
+Fringilla
+fringillaceous
+Fringillidae
+fringilliform
+Fringilliformes
+fringilline
+fringilloid
+fringing
+fringy
+fripperer
+frippery
+frisca
+Frisesomorum
+frisette
+Frisian
+Frisii
+frisk
+frisker
+frisket
+friskful
+friskily
+friskiness
+frisking
+friskingly
+frisky
+frisolee
+frison
+frist
+frisure
+frit
+frith
+frithborh
+frithbot
+frithles
+frithsoken
+frithstool
+frithwork
+Fritillaria
+fritillary
+fritt
+fritter
+fritterer
+Fritz
+Friulian
+frivol
+frivoler
+frivolism
+frivolist
+frivolity
+frivolize
+frivolous
+frivolously
+frivolousness
+frixion
+friz
+frize
+frizer
+frizz
+frizzer
+frizzily
+frizziness
+frizzing
+frizzle
+frizzler
+frizzly
+frizzy
+fro
+frock
+frocking
+frockless
+frocklike
+frockmaker
+froe
+Froebelian
+Froebelism
+Froebelist
+frog
+frogbit
+frogeater
+frogeye
+frogface
+frogfish
+frogflower
+frogfoot
+frogged
+froggery
+frogginess
+frogging
+froggish
+froggy
+froghood
+froghopper
+frogland
+frogleaf
+frogleg
+froglet
+froglike
+frogling
+frogman
+frogmouth
+frognose
+frogskin
+frogstool
+frogtongue
+frogwort
+froise
+frolic
+frolicful
+frolicker
+frolicky
+frolicly
+frolicness
+frolicsome
+frolicsomely
+frolicsomeness
+from
+fromward
+fromwards
+frond
+frondage
+fronded
+frondent
+frondesce
+frondescence
+frondescent
+frondiferous
+frondiform
+frondigerous
+frondivorous
+frondlet
+frondose
+frondosely
+frondous
+front
+frontad
+frontage
+frontager
+frontal
+frontalis
+frontality
+frontally
+frontbencher
+fronted
+fronter
+frontier
+frontierlike
+frontierman
+frontiersman
+Frontignan
+fronting
+frontingly
+Frontirostria
+frontispiece
+frontless
+frontlessly
+frontlessness
+frontlet
+frontoauricular
+frontoethmoid
+frontogenesis
+frontolysis
+frontomallar
+frontomaxillary
+frontomental
+frontonasal
+frontooccipital
+frontoorbital
+frontoparietal
+frontopontine
+frontosphenoidal
+frontosquamosal
+frontotemporal
+frontozygomatic
+frontpiece
+frontsman
+frontstall
+frontward
+frontways
+frontwise
+froom
+frore
+frory
+frosh
+frost
+frostation
+frostbird
+frostbite
+frostbow
+frosted
+froster
+frostfish
+frostflower
+frostily
+frostiness
+frosting
+frostless
+frostlike
+frostproof
+frostproofing
+frostroot
+frostweed
+frostwork
+frostwort
+frosty
+frot
+froth
+frother
+Frothi
+frothily
+frothiness
+frothing
+frothless
+frothsome
+frothy
+frotton
+froufrou
+frough
+froughy
+frounce
+frounceless
+frow
+froward
+frowardly
+frowardness
+frower
+frowl
+frown
+frowner
+frownful
+frowning
+frowningly
+frownless
+frowny
+frowst
+frowstily
+frowstiness
+frowsty
+frowy
+frowze
+frowzily
+frowziness
+frowzled
+frowzly
+frowzy
+froze
+frozen
+frozenhearted
+frozenly
+frozenness
+fruchtschiefer
+fructed
+fructescence
+fructescent
+fructicultural
+fructiculture
+Fructidor
+fructiferous
+fructiferously
+fructification
+fructificative
+fructifier
+fructiform
+fructify
+fructiparous
+fructivorous
+fructose
+fructoside
+fructuary
+fructuosity
+fructuous
+fructuously
+fructuousness
+frugal
+frugalism
+frugalist
+frugality
+frugally
+frugalness
+fruggan
+Frugivora
+frugivorous
+fruit
+fruitade
+fruitage
+fruitarian
+fruitarianism
+fruitcake
+fruited
+fruiter
+fruiterer
+fruiteress
+fruitery
+fruitful
+fruitfullness
+fruitfully
+fruitgrower
+fruitgrowing
+fruitiness
+fruiting
+fruition
+fruitist
+fruitive
+fruitless
+fruitlessly
+fruitlessness
+fruitlet
+fruitling
+fruitstalk
+fruittime
+fruitwise
+fruitwoman
+fruitwood
+fruitworm
+fruity
+frumentaceous
+frumentarious
+frumentation
+frumenty
+frump
+frumpery
+frumpily
+frumpiness
+frumpish
+frumpishly
+frumpishness
+frumple
+frumpy
+frush
+frustrate
+frustrately
+frustrater
+frustration
+frustrative
+frustratory
+frustule
+frustulent
+frustulose
+frustum
+frutescence
+frutescent
+fruticetum
+fruticose
+fruticous
+fruticulose
+frutify
+fry
+fryer
+fu
+fub
+fubby
+fubsy
+Fucaceae
+fucaceous
+Fucales
+fucate
+fucation
+fucatious
+Fuchsia
+Fuchsian
+fuchsin
+fuchsine
+fuchsinophil
+fuchsinophilous
+fuchsite
+fuchsone
+fuci
+fucinita
+fuciphagous
+fucoid
+fucoidal
+Fucoideae
+fucosan
+fucose
+fucous
+fucoxanthin
+fucus
+fud
+fuddle
+fuddler
+fuder
+fudge
+fudger
+fudgy
+Fuegian
+fuel
+fueler
+fuelizer
+fuerte
+fuff
+fuffy
+fugacious
+fugaciously
+fugaciousness
+fugacity
+fugal
+fugally
+fuggy
+fugient
+fugitate
+fugitation
+fugitive
+fugitively
+fugitiveness
+fugitivism
+fugitivity
+fugle
+fugleman
+fuglemanship
+fugler
+fugu
+fugue
+fuguist
+fuidhir
+fuirdays
+Fuirena
+fuji
+Fulah
+fulciform
+fulcral
+fulcrate
+fulcrum
+fulcrumage
+fulfill
+fulfiller
+fulfillment
+Fulfulde
+fulgent
+fulgently
+fulgentness
+fulgid
+fulgide
+fulgidity
+fulgor
+Fulgora
+fulgorid
+Fulgoridae
+Fulgoroidea
+fulgorous
+Fulgur
+fulgural
+fulgurant
+fulgurantly
+fulgurata
+fulgurate
+fulgurating
+fulguration
+fulgurator
+fulgurite
+fulgurous
+fulham
+Fulica
+Fulicinae
+fulicine
+fuliginosity
+fuliginous
+fuliginously
+fuliginousness
+Fuligula
+Fuligulinae
+fuliguline
+fulk
+full
+fullam
+fullback
+fuller
+fullering
+fullery
+fullface
+fullhearted
+fulling
+fullish
+fullmouth
+fullmouthed
+fullmouthedly
+fullness
+fullom
+Fullonian
+fully
+fulmar
+Fulmarus
+fulmicotton
+fulminancy
+fulminant
+fulminate
+fulminating
+fulmination
+fulminator
+fulminatory
+fulmine
+fulmineous
+fulminic
+fulminous
+fulminurate
+fulminuric
+fulsome
+fulsomely
+fulsomeness
+fulth
+Fultz
+Fulup
+fulvene
+fulvescent
+fulvid
+fulvidness
+fulvous
+fulwa
+fulyie
+fulzie
+fum
+fumacious
+fumado
+fumage
+fumagine
+Fumago
+fumarate
+Fumaria
+Fumariaceae
+fumariaceous
+fumaric
+fumarine
+fumarium
+fumaroid
+fumaroidal
+fumarole
+fumarolic
+fumaryl
+fumatorium
+fumatory
+fumble
+fumbler
+fumbling
+fume
+fumeless
+fumer
+fumeroot
+fumet
+fumette
+fumewort
+fumiduct
+fumiferous
+fumigant
+fumigate
+fumigation
+fumigator
+fumigatorium
+fumigatory
+fumily
+fuminess
+fuming
+fumingly
+fumistery
+fumitory
+fumose
+fumosity
+fumous
+fumously
+fumy
+fun
+funambulate
+funambulation
+funambulator
+funambulatory
+funambulic
+funambulism
+funambulist
+funambulo
+Funaria
+Funariaceae
+funariaceous
+function
+functional
+functionalism
+functionalist
+functionality
+functionalize
+functionally
+functionarism
+functionary
+functionate
+functionation
+functionize
+functionless
+fund
+fundable
+fundal
+fundament
+fundamental
+fundamentalism
+fundamentalist
+fundamentality
+fundamentally
+fundamentalness
+fundatorial
+fundatrix
+funded
+funder
+fundholder
+fundi
+fundic
+fundiform
+funditor
+fundless
+fundmonger
+fundmongering
+funds
+Fundulinae
+funduline
+Fundulus
+fundungi
+fundus
+funebrial
+funeral
+funeralize
+funerary
+funereal
+funereally
+funest
+fungaceous
+fungal
+Fungales
+fungate
+fungation
+fungi
+Fungia
+fungian
+fungibility
+fungible
+fungic
+fungicidal
+fungicide
+fungicolous
+fungiferous
+fungiform
+fungilliform
+fungin
+fungistatic
+fungivorous
+fungo
+fungoid
+fungoidal
+fungological
+fungologist
+fungology
+fungose
+fungosity
+fungous
+fungus
+fungused
+funguslike
+fungusy
+funicle
+funicular
+funiculate
+funicule
+funiculitis
+funiculus
+funiform
+funipendulous
+funis
+Funje
+funk
+funker
+Funkia
+funkiness
+funky
+funmaker
+funmaking
+funnel
+funneled
+funnelform
+funnellike
+funnelwise
+funnily
+funniment
+funniness
+funny
+funnyman
+funori
+funt
+Funtumia
+Fur
+fur
+furacious
+furaciousness
+furacity
+fural
+furaldehyde
+furan
+furanoid
+furazan
+furazane
+furbelow
+furbish
+furbishable
+furbisher
+furbishment
+furca
+furcal
+furcate
+furcately
+furcation
+Furcellaria
+furcellate
+furciferine
+furciferous
+furciform
+Furcraea
+furcula
+furcular
+furculum
+furdel
+Furfooz
+furfur
+furfuraceous
+furfuraceously
+furfural
+furfuralcohol
+furfuraldehyde
+furfuramide
+furfuran
+furfuration
+furfurine
+furfuroid
+furfurole
+furfurous
+furfuryl
+furfurylidene
+furiant
+furibund
+furied
+Furies
+furify
+furil
+furilic
+furiosa
+furiosity
+furioso
+furious
+furiously
+furiousness
+furison
+furl
+furlable
+Furlan
+furler
+furless
+furlong
+furlough
+furnace
+furnacelike
+furnaceman
+furnacer
+furnacite
+furnage
+Furnariidae
+Furnariides
+Furnarius
+furner
+furnish
+furnishable
+furnished
+furnisher
+furnishing
+furnishment
+furniture
+furnitureless
+furodiazole
+furoic
+furoid
+furoin
+furole
+furomethyl
+furomonazole
+furor
+furore
+furphy
+furred
+furrier
+furriered
+furriery
+furrily
+furriness
+furring
+furrow
+furrower
+furrowless
+furrowlike
+furrowy
+furry
+furstone
+further
+furtherance
+furtherer
+furtherest
+furtherly
+furthermore
+furthermost
+furthersome
+furthest
+furtive
+furtively
+furtiveness
+Furud
+furuncle
+furuncular
+furunculoid
+furunculosis
+furunculous
+fury
+furyl
+furze
+furzechat
+furzed
+furzeling
+furzery
+furzetop
+furzy
+fusain
+fusarial
+fusariose
+fusariosis
+Fusarium
+fusarole
+fusate
+fusc
+fuscescent
+fuscin
+fuscohyaline
+fuscous
+fuse
+fuseboard
+fused
+fusee
+fuselage
+fuseplug
+fusht
+fusibility
+fusible
+fusibleness
+fusibly
+Fusicladium
+Fusicoccum
+fusiform
+Fusiformis
+fusil
+fusilier
+fusillade
+fusilly
+fusinist
+fusion
+fusional
+fusionism
+fusionist
+fusionless
+fusoid
+fuss
+fusser
+fussification
+fussify
+fussily
+fussiness
+fussock
+fussy
+fust
+fustanella
+fustee
+fusteric
+fustet
+fustian
+fustianish
+fustianist
+fustianize
+fustic
+fustigate
+fustigation
+fustigator
+fustigatory
+fustilugs
+fustily
+fustin
+fustiness
+fustle
+fusty
+Fusulina
+fusuma
+fusure
+Fusus
+fut
+futchel
+fute
+futhorc
+futile
+futilely
+futileness
+futilitarian
+futilitarianism
+futility
+futilize
+futtermassel
+futtock
+futural
+future
+futureless
+futureness
+futuric
+futurism
+futurist
+futuristic
+futurition
+futurity
+futurize
+futwa
+fuye
+fuze
+fuzz
+fuzzball
+fuzzily
+fuzziness
+fuzzy
+fyke
+fylfot
+fyrd
+G
+g
+Ga
+ga
+gab
+gabardine
+gabbard
+gabber
+gabble
+gabblement
+gabbler
+gabbro
+gabbroic
+gabbroid
+gabbroitic
+gabby
+Gabe
+gabelle
+gabelled
+gabelleman
+gabeller
+gaberdine
+gaberlunzie
+gabgab
+gabi
+gabion
+gabionade
+gabionage
+gabioned
+gablatores
+gable
+gableboard
+gablelike
+gablet
+gablewise
+gablock
+Gaboon
+Gabriel
+Gabriella
+Gabrielrache
+Gabunese
+gaby
+Gad
+gad
+Gadaba
+gadabout
+Gadarene
+Gadaria
+gadbee
+gadbush
+Gaddang
+gadded
+gadder
+Gaddi
+gaddi
+gadding
+gaddingly
+gaddish
+gaddishness
+gade
+gadfly
+gadge
+gadger
+gadget
+gadid
+Gadidae
+gadinine
+Gaditan
+gadling
+gadman
+gadoid
+Gadoidea
+gadolinia
+gadolinic
+gadolinite
+gadolinium
+gadroon
+gadroonage
+Gadsbodikins
+Gadsbud
+Gadslid
+gadsman
+Gadswoons
+gaduin
+Gadus
+gadwall
+Gadzooks
+Gael
+Gaeldom
+Gaelic
+Gaelicism
+Gaelicist
+Gaelicization
+Gaelicize
+Gaeltacht
+gaen
+Gaertnerian
+gaet
+Gaetulan
+Gaetuli
+Gaetulian
+gaff
+gaffe
+gaffer
+Gaffkya
+gaffle
+gaffsman
+gag
+gagate
+gage
+gageable
+gagee
+gageite
+gagelike
+gager
+gagership
+gagger
+gaggery
+gaggle
+gaggler
+gagman
+gagor
+gagroot
+gagtooth
+gahnite
+Gahrwali
+Gaia
+gaiassa
+Gaidropsaridae
+gaiety
+Gail
+Gaillardia
+gaily
+gain
+gainable
+gainage
+gainbirth
+gaincall
+gaincome
+gaine
+gainer
+gainful
+gainfully
+gainfulness
+gaining
+gainless
+gainlessness
+gainliness
+gainly
+gains
+gainsay
+gainsayer
+gainset
+gainsome
+gainspeaker
+gainspeaking
+gainst
+gainstrive
+gainturn
+gaintwist
+gainyield
+gair
+gairfish
+gaisling
+gait
+gaited
+gaiter
+gaiterless
+gaiting
+gaize
+gaj
+gal
+gala
+Galacaceae
+galactagogue
+galactagoguic
+galactan
+galactase
+galactemia
+galacthidrosis
+Galactia
+galactic
+galactidrosis
+galactite
+galactocele
+galactodendron
+galactodensimeter
+galactogenetic
+galactohemia
+galactoid
+galactolipide
+galactolipin
+galactolysis
+galactolytic
+galactoma
+galactometer
+galactometry
+galactonic
+galactopathy
+galactophagist
+galactophagous
+galactophlebitis
+galactophlysis
+galactophore
+galactophoritis
+galactophorous
+galactophthysis
+galactophygous
+galactopoiesis
+galactopoietic
+galactopyra
+galactorrhea
+galactorrhoea
+galactoscope
+galactose
+galactoside
+galactosis
+galactostasis
+galactosuria
+galactotherapy
+galactotrophy
+galacturia
+galagala
+Galaginae
+Galago
+galah
+galanas
+galanga
+galangin
+galant
+Galanthus
+galantine
+galany
+galapago
+Galatae
+galatea
+Galatian
+Galatic
+galatotrophic
+Galax
+galaxian
+Galaxias
+Galaxiidae
+galaxy
+galban
+galbanum
+Galbula
+Galbulae
+Galbulidae
+Galbulinae
+galbulus
+Galcha
+Galchic
+Gale
+gale
+galea
+galeage
+galeate
+galeated
+galee
+galeeny
+Galega
+galegine
+Galei
+galeid
+Galeidae
+galeiform
+galempung
+Galen
+galena
+Galenian
+Galenic
+galenic
+Galenical
+galenical
+Galenism
+Galenist
+galenite
+galenobismutite
+galenoid
+Galeodes
+Galeodidae
+galeoid
+Galeopithecus
+Galeopsis
+Galeorchis
+Galeorhinidae
+Galeorhinus
+galeproof
+galera
+galericulate
+galerum
+galerus
+Galesaurus
+galet
+Galeus
+galewort
+galey
+Galga
+galgal
+Galgulidae
+gali
+Galibi
+Galician
+Galictis
+Galidia
+Galidictis
+Galik
+Galilean
+galilee
+galimatias
+galingale
+Galinsoga
+galiongee
+galiot
+galipidine
+galipine
+galipoidin
+galipoidine
+galipoipin
+galipot
+Galium
+gall
+Galla
+galla
+gallacetophenone
+gallah
+gallanilide
+gallant
+gallantize
+gallantly
+gallantness
+gallantry
+gallate
+gallature
+gallberry
+gallbush
+galleass
+galled
+Gallegan
+gallein
+galleon
+galler
+Galleria
+gallerian
+galleried
+Galleriidae
+gallery
+gallerylike
+gallet
+galley
+galleylike
+galleyman
+galleyworm
+gallflower
+gallfly
+Galli
+galliambic
+galliambus
+Gallian
+galliard
+galliardise
+galliardly
+galliardness
+Gallic
+gallic
+Gallican
+Gallicanism
+Gallicism
+Gallicization
+Gallicize
+Gallicizer
+gallicola
+Gallicolae
+gallicole
+gallicolous
+galliferous
+Gallification
+gallification
+galliform
+Galliformes
+Gallify
+galligaskin
+gallimaufry
+Gallinaceae
+gallinacean
+Gallinacei
+gallinaceous
+Gallinae
+Gallinago
+gallinazo
+galline
+galling
+gallingly
+gallingness
+gallinipper
+Gallinula
+gallinule
+Gallinulinae
+gallinuline
+gallipot
+Gallirallus
+gallisin
+gallium
+gallivant
+gallivanter
+gallivat
+gallivorous
+galliwasp
+gallnut
+gallocyanin
+gallocyanine
+galloflavine
+galloglass
+Galloman
+Gallomania
+Gallomaniac
+gallon
+gallonage
+galloner
+galloon
+gallooned
+gallop
+gallopade
+galloper
+Galloperdix
+Gallophile
+Gallophilism
+Gallophobe
+Gallophobia
+galloping
+galloptious
+gallotannate
+gallotannic
+gallotannin
+gallous
+Gallovidian
+Galloway
+galloway
+gallowglass
+gallows
+gallowsmaker
+gallowsness
+gallowsward
+gallstone
+Gallus
+galluses
+gallweed
+gallwort
+gally
+gallybagger
+gallybeggar
+gallycrow
+Galoisian
+galoot
+galop
+galore
+galosh
+galp
+galravage
+galravitch
+galt
+Galtonia
+Galtonian
+galuchat
+galumph
+galumptious
+Galusha
+galuth
+galvanic
+galvanical
+galvanically
+galvanism
+galvanist
+galvanization
+galvanize
+galvanized
+galvanizer
+galvanocauterization
+galvanocautery
+galvanocontractility
+galvanofaradization
+galvanoglyph
+galvanoglyphy
+galvanograph
+galvanographic
+galvanography
+galvanologist
+galvanology
+galvanolysis
+galvanomagnet
+galvanomagnetic
+galvanomagnetism
+galvanometer
+galvanometric
+galvanometrical
+galvanometrically
+galvanometry
+galvanoplastic
+galvanoplastical
+galvanoplastically
+galvanoplastics
+galvanoplasty
+galvanopsychic
+galvanopuncture
+galvanoscope
+galvanoscopic
+galvanoscopy
+galvanosurgery
+galvanotactic
+galvanotaxis
+galvanotherapy
+galvanothermometer
+galvanothermy
+galvanotonic
+galvanotropic
+galvanotropism
+galvayne
+galvayning
+Galways
+Galwegian
+galyac
+galyak
+galziekte
+gam
+gamahe
+Gamaliel
+gamashes
+gamasid
+Gamasidae
+Gamasoidea
+gamb
+gamba
+gambade
+gambado
+gambang
+gambeer
+gambeson
+gambet
+gambette
+gambia
+gambier
+gambist
+gambit
+gamble
+gambler
+gamblesome
+gamblesomeness
+gambling
+gambodic
+gamboge
+gambogian
+gambogic
+gamboised
+gambol
+gambrel
+gambreled
+gambroon
+Gambusia
+gamdeboo
+game
+gamebag
+gameball
+gamecock
+gamecraft
+gameful
+gamekeeper
+gamekeeping
+gamelang
+gameless
+gamelike
+Gamelion
+gamelotte
+gamely
+gamene
+gameness
+gamesome
+gamesomely
+gamesomeness
+gamester
+gamestress
+gametal
+gametange
+gametangium
+gamete
+gametic
+gametically
+gametocyst
+gametocyte
+gametogenesis
+gametogenic
+gametogenous
+gametogeny
+gametogonium
+gametogony
+gametoid
+gametophagia
+gametophore
+gametophyll
+gametophyte
+gametophytic
+gamic
+gamily
+gamin
+gaminesque
+gaminess
+gaming
+gaminish
+gamma
+gammacism
+gammacismus
+gammadion
+gammarid
+Gammaridae
+gammarine
+gammaroid
+Gammarus
+gammation
+gammelost
+gammer
+gammerel
+gammerstang
+Gammexane
+gammick
+gammock
+gammon
+gammoner
+gammoning
+gammy
+gamobium
+gamodesmic
+gamodesmy
+gamogenesis
+gamogenetic
+gamogenetical
+gamogenetically
+gamogony
+Gamolepis
+gamomania
+gamont
+Gamopetalae
+gamopetalous
+gamophagia
+gamophagy
+gamophyllous
+gamori
+gamosepalous
+gamostele
+gamostelic
+gamostely
+gamotropic
+gamotropism
+gamp
+gamphrel
+gamut
+gamy
+gan
+ganam
+ganancial
+Ganapati
+ganch
+Ganda
+gander
+ganderess
+gandergoose
+gandermooner
+ganderteeth
+Gandhara
+Gandharva
+Gandhiism
+Gandhism
+Gandhist
+gandul
+gandum
+gandurah
+gane
+ganef
+gang
+Ganga
+ganga
+Gangamopteris
+gangan
+gangava
+gangboard
+gangdom
+gange
+ganger
+Gangetic
+ganggang
+ganging
+gangism
+gangland
+ganglander
+ganglia
+gangliac
+ganglial
+gangliar
+gangliasthenia
+gangliate
+gangliated
+gangliectomy
+gangliform
+gangliitis
+gangling
+ganglioblast
+gangliocyte
+ganglioform
+ganglioid
+ganglioma
+ganglion
+ganglionary
+ganglionate
+ganglionectomy
+ganglioneural
+ganglioneure
+ganglioneuroma
+ganglioneuron
+ganglionic
+ganglionitis
+ganglionless
+ganglioplexus
+gangly
+gangman
+gangmaster
+gangplank
+gangrel
+gangrene
+gangrenescent
+gangrenous
+gangsman
+gangster
+gangsterism
+gangtide
+gangue
+Ganguela
+gangway
+gangwayman
+ganister
+ganja
+ganner
+gannet
+Ganocephala
+ganocephalan
+ganocephalous
+ganodont
+Ganodonta
+Ganodus
+ganoid
+ganoidal
+ganoidean
+Ganoidei
+ganoidian
+ganoin
+ganomalite
+ganophyllite
+ganosis
+Ganowanian
+gansel
+gansey
+gansy
+gant
+ganta
+gantang
+gantlet
+gantline
+ganton
+gantries
+gantry
+gantryman
+gantsl
+Ganymede
+Ganymedes
+ganza
+ganzie
+gaol
+gaolbird
+gaoler
+Gaon
+Gaonate
+Gaonic
+gap
+Gapa
+gapa
+gape
+gaper
+gapes
+gapeseed
+gapeworm
+gaping
+gapingly
+gapingstock
+gapo
+gappy
+gapy
+gar
+gara
+garabato
+garad
+garage
+garageman
+Garamond
+garance
+garancine
+garapata
+garava
+garavance
+garawi
+garb
+garbage
+garbardine
+garbel
+garbell
+garbill
+garble
+garbleable
+garbler
+garbless
+garbling
+garboard
+garboil
+garbure
+garce
+Garcinia
+gardant
+gardeen
+garden
+gardenable
+gardencraft
+gardened
+gardener
+gardenership
+gardenesque
+gardenful
+gardenhood
+Gardenia
+gardenin
+gardening
+gardenize
+gardenless
+gardenlike
+gardenly
+gardenmaker
+gardenmaking
+gardenwards
+gardenwise
+gardeny
+garderobe
+gardevin
+gardy
+gardyloo
+gare
+garefowl
+gareh
+garetta
+garewaite
+garfish
+garganey
+Gargantua
+Gargantuan
+garget
+gargety
+gargle
+gargol
+gargoyle
+gargoyled
+gargoyley
+gargoylish
+gargoylishly
+gargoylism
+Garhwali
+garial
+gariba
+garibaldi
+Garibaldian
+garish
+garishly
+garishness
+garland
+garlandage
+garlandless
+garlandlike
+garlandry
+garlandwise
+garle
+garlic
+garlicky
+garliclike
+garlicmonger
+garlicwort
+garment
+garmentless
+garmentmaker
+garmenture
+garmentworker
+garn
+garnel
+garner
+garnerage
+garnet
+garnetberry
+garneter
+garnetiferous
+garnets
+garnett
+garnetter
+garnetwork
+garnetz
+garnice
+garniec
+garnierite
+garnish
+garnishable
+garnished
+garnishee
+garnisheement
+garnisher
+garnishment
+garnishry
+garniture
+Garo
+garoo
+garookuh
+garrafa
+garran
+Garret
+garret
+garreted
+garreteer
+garretmaster
+garrison
+Garrisonian
+Garrisonism
+garrot
+garrote
+garroter
+Garrulinae
+garruline
+garrulity
+garrulous
+garrulously
+garrulousness
+Garrulus
+garrupa
+Garrya
+Garryaceae
+garse
+Garshuni
+garsil
+garston
+garten
+garter
+gartered
+gartering
+garterless
+garth
+garthman
+Garuda
+garum
+garvanzo
+garvey
+garvock
+Gary
+gas
+Gasan
+gasbag
+gascoigny
+Gascon
+gasconade
+gasconader
+Gasconism
+gascromh
+gaseity
+gaselier
+gaseosity
+gaseous
+gaseousness
+gasfiring
+gash
+gashes
+gashful
+gashliness
+gashly
+gasholder
+gashouse
+gashy
+gasifiable
+gasification
+gasifier
+gasiform
+gasify
+gasket
+gaskin
+gasking
+gaskins
+gasless
+gaslight
+gaslighted
+gaslighting
+gaslit
+gaslock
+gasmaker
+gasman
+gasogenic
+gasoliery
+gasoline
+gasolineless
+gasoliner
+gasometer
+gasometric
+gasometrical
+gasometry
+gasp
+Gaspar
+gasparillo
+gasper
+gaspereau
+gaspergou
+gaspiness
+gasping
+gaspingly
+gasproof
+gaspy
+gasser
+Gasserian
+gassiness
+gassing
+gassy
+gast
+gastaldite
+gastaldo
+gaster
+gasteralgia
+Gasterolichenes
+gasteromycete
+Gasteromycetes
+gasteromycetous
+Gasterophilus
+gasteropod
+Gasteropoda
+gasterosteid
+Gasterosteidae
+gasterosteiform
+gasterosteoid
+Gasterosteus
+gasterotheca
+gasterothecal
+Gasterotricha
+gasterotrichan
+gasterozooid
+gastight
+gastightness
+Gastornis
+Gastornithidae
+gastradenitis
+gastraea
+gastraead
+Gastraeadae
+gastraeal
+gastraeum
+gastral
+gastralgia
+gastralgic
+gastralgy
+gastraneuria
+gastrasthenia
+gastratrophia
+gastrectasia
+gastrectasis
+gastrectomy
+gastrelcosis
+gastric
+gastricism
+gastrilegous
+gastriloquial
+gastriloquism
+gastriloquist
+gastriloquous
+gastriloquy
+gastrin
+gastritic
+gastritis
+gastroadenitis
+gastroadynamic
+gastroalbuminorrhea
+gastroanastomosis
+gastroarthritis
+gastroatonia
+gastroatrophia
+gastroblennorrhea
+gastrocatarrhal
+gastrocele
+gastrocentrous
+Gastrochaena
+Gastrochaenidae
+gastrocnemial
+gastrocnemian
+gastrocnemius
+gastrocoel
+gastrocolic
+gastrocoloptosis
+gastrocolostomy
+gastrocolotomy
+gastrocolpotomy
+gastrocystic
+gastrocystis
+gastrodialysis
+gastrodiaphanoscopy
+gastrodidymus
+gastrodisk
+gastroduodenal
+gastroduodenitis
+gastroduodenoscopy
+gastroduodenotomy
+gastrodynia
+gastroelytrotomy
+gastroenteralgia
+gastroenteric
+gastroenteritic
+gastroenteritis
+gastroenteroanastomosis
+gastroenterocolitis
+gastroenterocolostomy
+gastroenterological
+gastroenterologist
+gastroenterology
+gastroenteroptosis
+gastroenterostomy
+gastroenterotomy
+gastroepiploic
+gastroesophageal
+gastroesophagostomy
+gastrogastrotomy
+gastrogenital
+gastrograph
+gastrohelcosis
+gastrohepatic
+gastrohepatitis
+gastrohydrorrhea
+gastrohyperneuria
+gastrohypertonic
+gastrohysterectomy
+gastrohysteropexy
+gastrohysterorrhaphy
+gastrohysterotomy
+gastroid
+gastrointestinal
+gastrojejunal
+gastrojejunostomy
+gastrolater
+gastrolatrous
+gastrolienal
+gastrolith
+Gastrolobium
+gastrologer
+gastrological
+gastrologist
+gastrology
+gastrolysis
+gastrolytic
+gastromalacia
+gastromancy
+gastromelus
+gastromenia
+gastromyces
+gastromycosis
+gastromyxorrhea
+gastronephritis
+gastronome
+gastronomer
+gastronomic
+gastronomical
+gastronomically
+gastronomist
+gastronomy
+gastronosus
+gastropancreatic
+gastropancreatitis
+gastroparalysis
+gastroparesis
+gastroparietal
+gastropathic
+gastropathy
+gastroperiodynia
+gastropexy
+gastrophile
+gastrophilism
+gastrophilist
+gastrophilite
+Gastrophilus
+gastrophrenic
+gastrophthisis
+gastroplasty
+gastroplenic
+gastropleuritis
+gastroplication
+gastropneumatic
+gastropneumonic
+gastropod
+Gastropoda
+gastropodan
+gastropodous
+gastropore
+gastroptosia
+gastroptosis
+gastropulmonary
+gastropulmonic
+gastropyloric
+gastrorrhagia
+gastrorrhaphy
+gastrorrhea
+gastroschisis
+gastroscope
+gastroscopic
+gastroscopy
+gastrosoph
+gastrosopher
+gastrosophy
+gastrospasm
+gastrosplenic
+gastrostaxis
+gastrostegal
+gastrostege
+gastrostenosis
+gastrostomize
+Gastrostomus
+gastrostomy
+gastrosuccorrhea
+gastrotheca
+gastrothecal
+gastrotome
+gastrotomic
+gastrotomy
+Gastrotricha
+gastrotrichan
+gastrotubotomy
+gastrotympanites
+gastrovascular
+gastroxynsis
+gastrozooid
+gastrula
+gastrular
+gastrulate
+gastrulation
+gasworker
+gasworks
+gat
+gata
+gatch
+gatchwork
+gate
+gateado
+gateage
+gated
+gatehouse
+gatekeeper
+gateless
+gatelike
+gatemaker
+gateman
+gatepost
+gater
+gatetender
+gateward
+gatewards
+gateway
+gatewayman
+gatewise
+gatewoman
+gateworks
+gatewright
+Gatha
+gather
+gatherable
+gatherer
+gathering
+Gathic
+gating
+gator
+gatter
+gatteridge
+gau
+gaub
+gauby
+gauche
+gauchely
+gaucheness
+gaucherie
+Gaucho
+gaud
+gaudery
+Gaudete
+gaudful
+gaudily
+gaudiness
+gaudless
+gaudsman
+gaudy
+gaufer
+gauffer
+gauffered
+gauffre
+gaufre
+gaufrette
+gauge
+gaugeable
+gauger
+gaugership
+gauging
+Gaul
+gaulding
+gauleiter
+Gaulic
+gaulin
+Gaulish
+Gaullism
+Gaullist
+Gault
+gault
+gaulter
+gaultherase
+Gaultheria
+gaultherin
+gaum
+gaumish
+gaumless
+gaumlike
+gaumy
+gaun
+gaunt
+gaunted
+gauntlet
+gauntleted
+gauntly
+gauntness
+gauntry
+gaunty
+gaup
+gaupus
+gaur
+Gaura
+Gaurian
+gaus
+gauss
+gaussage
+gaussbergite
+Gaussian
+gauster
+gausterer
+gaut
+gauteite
+gauze
+gauzelike
+gauzewing
+gauzily
+gauziness
+gauzy
+gavall
+gave
+gavel
+gaveler
+gavelkind
+gavelkinder
+gavelman
+gavelock
+Gavia
+Gaviae
+gavial
+Gavialis
+gavialoid
+Gaviiformes
+gavotte
+gavyuti
+gaw
+gawby
+gawcie
+gawk
+gawkhammer
+gawkihood
+gawkily
+gawkiness
+gawkish
+gawkishly
+gawkishness
+gawky
+gawm
+gawn
+gawney
+gawsie
+gay
+gayal
+gayatri
+gaybine
+gaycat
+gaydiang
+gayish
+Gaylussacia
+gaylussite
+gayment
+gayness
+Gaypoo
+gaysome
+gaywings
+gayyou
+gaz
+gazabo
+gazangabin
+Gazania
+gaze
+gazebo
+gazee
+gazehound
+gazel
+gazeless
+Gazella
+gazelle
+gazelline
+gazement
+gazer
+gazettal
+gazette
+gazetteer
+gazetteerage
+gazetteerish
+gazetteership
+gazi
+gazing
+gazingly
+gazingstock
+gazogene
+gazon
+gazophylacium
+gazy
+gazzetta
+Ge
+ge
+Geadephaga
+geadephagous
+geal
+gean
+geanticlinal
+geanticline
+gear
+gearbox
+geared
+gearing
+gearksutite
+gearless
+gearman
+gearset
+gearshift
+gearwheel
+gease
+geason
+Geaster
+Geat
+geat
+Geatas
+gebang
+gebanga
+gebbie
+gebur
+Gecarcinidae
+Gecarcinus
+geck
+gecko
+geckoid
+geckotian
+geckotid
+Geckotidae
+geckotoid
+Ged
+ged
+gedackt
+gedanite
+gedder
+gedeckt
+gedecktwork
+Gederathite
+Gederite
+gedrite
+Gee
+gee
+geebong
+geebung
+Geechee
+geejee
+geek
+geelbec
+geeldikkop
+geelhout
+geepound
+geerah
+geest
+geet
+Geez
+geezer
+Gegenschein
+gegg
+geggee
+gegger
+geggery
+Geheimrat
+Gehenna
+gehlenite
+Geikia
+geikielite
+gein
+geira
+Geisenheimer
+geisha
+geison
+geisotherm
+geisothermal
+Geissoloma
+Geissolomataceae
+Geissolomataceous
+Geissorhiza
+geissospermin
+geissospermine
+geitjie
+geitonogamous
+geitonogamy
+Gekko
+Gekkones
+gekkonid
+Gekkonidae
+gekkonoid
+Gekkota
+gel
+gelable
+gelada
+gelandejump
+gelandelaufer
+gelandesprung
+Gelasian
+Gelasimus
+gelastic
+Gelastocoridae
+gelatification
+gelatigenous
+gelatin
+gelatinate
+gelatination
+gelatined
+gelatiniferous
+gelatiniform
+gelatinify
+gelatinigerous
+gelatinity
+gelatinizability
+gelatinizable
+gelatinization
+gelatinize
+gelatinizer
+gelatinobromide
+gelatinochloride
+gelatinoid
+gelatinotype
+gelatinous
+gelatinously
+gelatinousness
+gelation
+gelatose
+geld
+geldability
+geldable
+geldant
+gelder
+gelding
+Gelechia
+gelechiid
+Gelechiidae
+Gelfomino
+gelid
+Gelidiaceae
+gelidity
+Gelidium
+gelidly
+gelidness
+gelignite
+gelilah
+gelinotte
+gell
+Gellert
+gelly
+gelogenic
+gelong
+geloscopy
+gelose
+gelosin
+gelotherapy
+gelotometer
+gelotoscopy
+gelototherapy
+gelsemic
+gelsemine
+gelseminic
+gelseminine
+Gelsemium
+gelt
+gem
+Gemara
+Gemaric
+Gemarist
+gematria
+gematrical
+gemauve
+gemel
+gemeled
+gemellione
+gemellus
+geminate
+geminated
+geminately
+gemination
+geminative
+Gemini
+Geminid
+geminiflorous
+geminiform
+geminous
+Gemitores
+gemitorial
+gemless
+gemlike
+Gemma
+gemma
+gemmaceous
+gemmae
+gemmate
+gemmation
+gemmative
+gemmeous
+gemmer
+gemmiferous
+gemmiferousness
+gemmification
+gemmiform
+gemmily
+gemminess
+Gemmingia
+gemmipara
+gemmipares
+gemmiparity
+gemmiparous
+gemmiparously
+gemmoid
+gemmology
+gemmula
+gemmulation
+gemmule
+gemmuliferous
+gemmy
+gemot
+gemsbok
+gemsbuck
+gemshorn
+gemul
+gemuti
+gemwork
+gen
+gena
+genal
+genapp
+genapper
+genarch
+genarcha
+genarchaship
+genarchship
+gendarme
+gendarmery
+gender
+genderer
+genderless
+Gene
+gene
+genealogic
+genealogical
+genealogically
+genealogist
+genealogize
+genealogizer
+genealogy
+genear
+geneat
+genecologic
+genecological
+genecologically
+genecologist
+genecology
+geneki
+genep
+genera
+generability
+generable
+generableness
+general
+generalate
+generalcy
+generale
+generalia
+Generalidad
+generalific
+generalism
+generalissima
+generalissimo
+generalist
+generalistic
+generality
+generalizable
+generalization
+generalize
+generalized
+generalizer
+generall
+generally
+generalness
+generalship
+generalty
+generant
+generate
+generating
+generation
+generational
+generationism
+generative
+generatively
+generativeness
+generator
+generatrix
+generic
+generical
+generically
+genericalness
+generification
+generosity
+generous
+generously
+generousness
+Genesee
+geneserine
+Genesiac
+Genesiacal
+genesial
+genesic
+genesiology
+genesis
+Genesitic
+genesiurgic
+genet
+genethliac
+genethliacal
+genethliacally
+genethliacon
+genethliacs
+genethlialogic
+genethlialogical
+genethlialogy
+genethlic
+genetic
+genetical
+genetically
+geneticism
+geneticist
+genetics
+genetmoil
+genetous
+Genetrix
+genetrix
+Genetta
+Geneura
+Geneva
+geneva
+Genevan
+Genevese
+Genevieve
+Genevois
+genevoise
+genial
+geniality
+genialize
+genially
+genialness
+genian
+genic
+genicular
+geniculate
+geniculated
+geniculately
+geniculation
+geniculum
+genie
+genii
+genin
+genioglossal
+genioglossi
+genioglossus
+geniohyoglossal
+geniohyoglossus
+geniohyoid
+geniolatry
+genion
+genioplasty
+genip
+Genipa
+genipa
+genipap
+genipapada
+genisaro
+Genista
+genista
+genistein
+genital
+genitalia
+genitals
+genitival
+genitivally
+genitive
+genitocrural
+genitofemoral
+genitor
+genitorial
+genitory
+genitourinary
+geniture
+genius
+genizah
+genizero
+Genny
+Genoa
+genoblast
+genoblastic
+genocidal
+genocide
+Genoese
+genoese
+genom
+genome
+genomic
+genonema
+genos
+genotype
+genotypic
+genotypical
+genotypically
+Genoveva
+genovino
+genre
+genro
+gens
+genson
+gent
+genteel
+genteelish
+genteelism
+genteelize
+genteelly
+genteelness
+gentes
+genthite
+gentian
+Gentiana
+Gentianaceae
+gentianaceous
+Gentianales
+gentianella
+gentianic
+gentianin
+gentianose
+gentianwort
+gentile
+gentiledom
+gentilesse
+gentilic
+gentilism
+gentilitial
+gentilitian
+gentilitious
+gentility
+gentilization
+gentilize
+gentiobiose
+gentiopicrin
+gentisein
+gentisic
+gentisin
+gentle
+gentlefolk
+gentlehearted
+gentleheartedly
+gentleheartedness
+gentlehood
+gentleman
+gentlemanhood
+gentlemanism
+gentlemanize
+gentlemanlike
+gentlemanlikeness
+gentlemanliness
+gentlemanly
+gentlemanship
+gentlemens
+gentlemouthed
+gentleness
+gentlepeople
+gentleship
+gentlewoman
+gentlewomanhood
+gentlewomanish
+gentlewomanlike
+gentlewomanliness
+gentlewomanly
+gently
+gentman
+Gentoo
+gentrice
+gentry
+genty
+genu
+genua
+genual
+genuclast
+genuflect
+genuflection
+genuflector
+genuflectory
+genuflex
+genuflexuous
+genuine
+genuinely
+genuineness
+genus
+genyantrum
+Genyophrynidae
+genyoplasty
+genys
+geo
+geoaesthesia
+geoagronomic
+geobiologic
+geobiology
+geobiont
+geobios
+geoblast
+geobotanic
+geobotanical
+geobotanist
+geobotany
+geocarpic
+geocentric
+geocentrical
+geocentrically
+geocentricism
+geocerite
+geochemical
+geochemist
+geochemistry
+geochronic
+geochronology
+geochrony
+Geococcyx
+geocoronium
+geocratic
+geocronite
+geocyclic
+geodaesia
+geodal
+geode
+geodesic
+geodesical
+geodesist
+geodesy
+geodete
+geodetic
+geodetical
+geodetically
+geodetician
+geodetics
+geodiatropism
+geodic
+geodiferous
+geodist
+geoduck
+geodynamic
+geodynamical
+geodynamics
+geoethnic
+Geoff
+Geoffrey
+geoffroyin
+geoffroyine
+geoform
+geogenesis
+geogenetic
+geogenic
+geogenous
+geogeny
+Geoglossaceae
+Geoglossum
+geoglyphic
+geognosis
+geognosist
+geognost
+geognostic
+geognostical
+geognostically
+geognosy
+geogonic
+geogonical
+geogony
+geographer
+geographic
+geographical
+geographically
+geographics
+geographism
+geographize
+geography
+geohydrologist
+geohydrology
+geoid
+geoidal
+geoisotherm
+geolatry
+geologer
+geologian
+geologic
+geological
+geologically
+geologician
+geologist
+geologize
+geology
+geomagnetic
+geomagnetician
+geomagnetics
+geomagnetist
+geomalic
+geomalism
+geomaly
+geomance
+geomancer
+geomancy
+geomant
+geomantic
+geomantical
+geomantically
+geometer
+geometric
+geometrical
+geometrically
+geometrician
+geometricize
+geometrid
+Geometridae
+geometriform
+Geometrina
+geometrine
+geometrize
+geometroid
+Geometroidea
+geometry
+geomoroi
+geomorphic
+geomorphist
+geomorphogenic
+geomorphogenist
+geomorphogeny
+geomorphological
+geomorphology
+geomorphy
+geomyid
+Geomyidae
+Geomys
+Geon
+geonavigation
+geonegative
+Geonic
+Geonim
+Geonoma
+geonoma
+geonyctinastic
+geonyctitropic
+geoparallelotropic
+geophagia
+geophagism
+geophagist
+geophagous
+geophagy
+Geophila
+geophilid
+Geophilidae
+geophilous
+Geophilus
+Geophone
+geophone
+geophysical
+geophysicist
+geophysics
+geophyte
+geophytic
+geoplagiotropism
+Geoplana
+Geoplanidae
+geopolar
+geopolitic
+geopolitical
+geopolitically
+geopolitician
+geopolitics
+Geopolitik
+geoponic
+geoponical
+geoponics
+geopony
+geopositive
+Geoprumnon
+georama
+Geordie
+George
+Georgemas
+Georgette
+Georgia
+georgiadesite
+Georgian
+Georgiana
+georgic
+Georgie
+geoscopic
+geoscopy
+geoselenic
+geosid
+geoside
+geosphere
+Geospiza
+geostatic
+geostatics
+geostrategic
+geostrategist
+geostrategy
+geostrophic
+geosynclinal
+geosyncline
+geotactic
+geotactically
+geotaxis
+geotaxy
+geotechnic
+geotechnics
+geotectology
+geotectonic
+geotectonics
+Geoteuthis
+geotherm
+geothermal
+geothermic
+geothermometer
+Geothlypis
+geotic
+geotical
+geotilla
+geotonic
+geotonus
+geotropic
+geotropically
+geotropism
+geotropy
+geoty
+Gepeoo
+Gephyrea
+gephyrean
+gephyrocercal
+gephyrocercy
+Gepidae
+ger
+gerah
+Gerald
+Geraldine
+Geraniaceae
+geraniaceous
+geranial
+Geraniales
+geranic
+geraniol
+Geranium
+geranium
+geranomorph
+Geranomorphae
+geranomorphic
+geranyl
+Gerard
+gerardia
+Gerasene
+gerastian
+gerate
+gerated
+geratic
+geratologic
+geratologous
+geratology
+geraty
+gerb
+gerbe
+Gerbera
+Gerberia
+gerbil
+Gerbillinae
+Gerbillus
+gercrow
+gereagle
+gerefa
+gerenda
+gerendum
+gerent
+gerenuk
+gerfalcon
+gerhardtite
+geriatric
+geriatrician
+geriatrics
+gerim
+gerip
+germ
+germal
+German
+german
+germander
+germane
+germanely
+germaneness
+Germanesque
+Germanhood
+Germania
+Germanic
+germanic
+Germanical
+Germanically
+Germanics
+Germanification
+Germanify
+germanious
+Germanish
+Germanism
+Germanist
+Germanistic
+germanite
+Germanity
+germanity
+germanium
+Germanization
+germanization
+Germanize
+germanize
+Germanizer
+Germanly
+Germanness
+Germanocentric
+Germanomania
+Germanomaniac
+Germanophile
+Germanophilist
+Germanophobe
+Germanophobia
+Germanophobic
+Germanophobist
+germanous
+Germantown
+germanyl
+germarium
+germen
+germfree
+germicidal
+germicide
+germifuge
+germigenous
+germin
+germina
+germinability
+germinable
+Germinal
+germinal
+germinally
+germinance
+germinancy
+germinant
+germinate
+germination
+germinative
+germinatively
+germinator
+germing
+germinogony
+germiparity
+germless
+germlike
+germling
+germon
+germproof
+germule
+germy
+gernitz
+gerocomia
+gerocomical
+gerocomy
+geromorphism
+Geronomite
+geront
+gerontal
+gerontes
+gerontic
+gerontine
+gerontism
+geronto
+gerontocracy
+gerontocrat
+gerontocratic
+gerontogeous
+gerontology
+gerontophilia
+gerontoxon
+Gerres
+gerrhosaurid
+Gerrhosauridae
+Gerridae
+gerrymander
+gerrymanderer
+gers
+gersdorffite
+Gershom
+Gershon
+Gershonite
+gersum
+Gertie
+Gertrude
+gerund
+gerundial
+gerundially
+gerundival
+gerundive
+gerundively
+gerusia
+Gervais
+gervao
+Gervas
+Gervase
+Gerygone
+gerygone
+Geryonia
+geryonid
+Geryonidae
+Geryoniidae
+Ges
+Gesan
+Geshurites
+gesith
+gesithcund
+gesithcundman
+Gesnera
+Gesneraceae
+gesneraceous
+Gesneria
+gesneria
+Gesneriaceae
+gesneriaceous
+Gesnerian
+gesning
+gessamine
+gesso
+gest
+Gestalt
+gestalter
+gestaltist
+gestant
+Gestapo
+gestate
+gestation
+gestational
+gestative
+gestatorial
+gestatorium
+gestatory
+geste
+gested
+gesten
+gestening
+gestic
+gestical
+gesticulacious
+gesticulant
+gesticular
+gesticularious
+gesticulate
+gesticulation
+gesticulative
+gesticulatively
+gesticulator
+gesticulatory
+gestion
+gestning
+gestural
+gesture
+gestureless
+gesturer
+get
+geta
+Getae
+getah
+getaway
+gether
+Gethsemane
+gethsemane
+Gethsemanic
+gethsemanic
+Getic
+getling
+getpenny
+Getsul
+gettable
+getter
+getting
+getup
+Geullah
+Geum
+geum
+gewgaw
+gewgawed
+gewgawish
+gewgawry
+gewgawy
+gey
+geyan
+geyerite
+geyser
+geyseral
+geyseric
+geyserine
+geyserish
+geyserite
+gez
+ghafir
+ghaist
+ghalva
+Ghan
+gharial
+gharnao
+gharry
+Ghassanid
+ghastily
+ghastlily
+ghastliness
+ghastly
+ghat
+ghatti
+ghatwal
+ghatwazi
+ghazi
+ghazism
+Ghaznevid
+Gheber
+ghebeta
+Ghedda
+ghee
+Gheg
+Ghegish
+gheleem
+Ghent
+gherkin
+ghetchoo
+ghetti
+ghetto
+ghettoization
+ghettoize
+Ghibelline
+Ghibellinism
+Ghilzai
+Ghiordes
+ghizite
+ghoom
+ghost
+ghostcraft
+ghostdom
+ghoster
+ghostess
+ghostfish
+ghostflower
+ghosthood
+ghostified
+ghostily
+ghostish
+ghostism
+ghostland
+ghostless
+ghostlet
+ghostlify
+ghostlike
+ghostlily
+ghostliness
+ghostly
+ghostmonger
+ghostology
+ghostship
+ghostweed
+ghostwrite
+ghosty
+ghoul
+ghoulery
+ghoulish
+ghoulishly
+ghoulishness
+ghrush
+ghurry
+Ghuz
+Gi
+Giansar
+giant
+giantesque
+giantess
+gianthood
+giantish
+giantism
+giantize
+giantkind
+giantlike
+giantly
+giantry
+giantship
+Giardia
+giardia
+giardiasis
+giarra
+giarre
+Gib
+gib
+gibaro
+gibbals
+gibbed
+gibber
+Gibberella
+gibbergunyah
+gibberish
+gibberose
+gibberosity
+gibbet
+gibbetwise
+Gibbi
+gibblegabble
+gibblegabbler
+gibbles
+gibbon
+gibbose
+gibbosity
+gibbous
+gibbously
+gibbousness
+gibbsite
+gibbus
+gibby
+gibe
+gibel
+gibelite
+Gibeonite
+giber
+gibing
+gibingly
+gibleh
+giblet
+giblets
+Gibraltar
+Gibson
+gibstaff
+gibus
+gid
+giddap
+giddea
+giddify
+giddily
+giddiness
+giddy
+giddyberry
+giddybrain
+giddyhead
+giddyish
+Gideon
+Gideonite
+gidgee
+gie
+gied
+gien
+Gienah
+gieseckite
+gif
+giffgaff
+Gifola
+gift
+gifted
+giftedly
+giftedness
+giftie
+giftless
+giftling
+giftware
+gig
+gigantean
+gigantesque
+gigantic
+gigantical
+gigantically
+giganticidal
+giganticide
+giganticness
+gigantism
+gigantize
+gigantoblast
+gigantocyte
+gigantolite
+gigantological
+gigantology
+gigantomachy
+Gigantopithecus
+Gigantosaurus
+Gigantostraca
+gigantostracan
+gigantostracous
+Gigartina
+Gigartinaceae
+gigartinaceous
+Gigartinales
+gigback
+gigelira
+gigeria
+gigerium
+gigful
+gigger
+giggish
+giggit
+giggle
+giggledom
+gigglement
+giggler
+gigglesome
+giggling
+gigglingly
+gigglish
+giggly
+Gigi
+giglet
+gigliato
+giglot
+gigman
+gigmaness
+gigmanhood
+gigmania
+gigmanic
+gigmanically
+gigmanism
+gigmanity
+gignate
+gignitive
+gigolo
+gigot
+gigsman
+gigster
+gigtree
+gigunu
+Gil
+Gila
+Gilaki
+Gilbert
+gilbert
+gilbertage
+Gilbertese
+Gilbertian
+Gilbertianism
+gilbertite
+gild
+gildable
+gilded
+gilden
+gilder
+gilding
+Gileadite
+Gileno
+Giles
+gilguy
+Gilia
+gilia
+Giliak
+gilim
+Gill
+gill
+gillaroo
+gillbird
+gilled
+Gillenia
+giller
+Gilles
+gillflirt
+gillhooter
+Gillian
+gillie
+gilliflirt
+gilling
+gilliver
+gillotage
+gillotype
+gillstoup
+gilly
+gillyflower
+gillygaupus
+gilo
+gilpy
+gilravage
+gilravager
+gilse
+gilsonite
+gilt
+giltcup
+gilthead
+gilttail
+gim
+gimbal
+gimbaled
+gimbaljawed
+gimberjawed
+gimble
+gimcrack
+gimcrackery
+gimcrackiness
+gimcracky
+gimel
+Gimirrai
+gimlet
+gimleteyed
+gimlety
+gimmal
+gimmer
+gimmerpet
+gimmick
+gimp
+gimped
+gimper
+gimping
+gin
+ging
+ginger
+gingerade
+gingerberry
+gingerbread
+gingerbready
+gingerin
+gingerleaf
+gingerline
+gingerliness
+gingerly
+gingerness
+gingernut
+gingerol
+gingerous
+gingerroot
+gingersnap
+gingerspice
+gingerwork
+gingerwort
+gingery
+gingham
+ginghamed
+gingili
+gingiva
+gingivae
+gingival
+gingivalgia
+gingivectomy
+gingivitis
+gingivoglossitis
+gingivolabial
+ginglyform
+ginglymoarthrodia
+ginglymoarthrodial
+Ginglymodi
+ginglymodian
+ginglymoid
+ginglymoidal
+Ginglymostoma
+ginglymostomoid
+ginglymus
+ginglyni
+ginhouse
+gink
+Ginkgo
+ginkgo
+Ginkgoaceae
+ginkgoaceous
+Ginkgoales
+ginned
+ginner
+ginners
+ginnery
+ginney
+ginning
+ginnle
+Ginny
+ginny
+ginseng
+ginward
+gio
+giobertite
+giornata
+giornatate
+Giottesque
+Giovanni
+gip
+gipon
+gipper
+Gippy
+gipser
+gipsire
+gipsyweed
+Giraffa
+giraffe
+giraffesque
+Giraffidae
+giraffine
+giraffoid
+girandola
+girandole
+girasol
+girasole
+girba
+gird
+girder
+girderage
+girderless
+girding
+girdingly
+girdle
+girdlecake
+girdlelike
+girdler
+girdlestead
+girdling
+girdlingly
+Girella
+Girellidae
+Girgashite
+Girgasite
+girl
+girleen
+girlery
+girlfully
+girlhood
+girlie
+girliness
+girling
+girlish
+girlishly
+girlishness
+girlism
+girllike
+girly
+girn
+girny
+giro
+giroflore
+Girondin
+Girondism
+Girondist
+girouette
+girouettism
+girr
+girse
+girsh
+girsle
+girt
+girth
+girtline
+gisarme
+gish
+gisla
+gisler
+gismondine
+gismondite
+gist
+git
+gitaligenin
+gitalin
+Gitanemuck
+gith
+Gitksan
+gitonin
+gitoxigenin
+gitoxin
+gittern
+Gittite
+gittith
+Giuseppe
+giustina
+give
+giveable
+giveaway
+given
+givenness
+giver
+givey
+giving
+gizz
+gizzard
+gizzen
+gizzern
+glabella
+glabellae
+glabellar
+glabellous
+glabellum
+glabrate
+glabrescent
+glabrous
+glace
+glaceed
+glaceing
+glaciable
+glacial
+glacialism
+glacialist
+glacialize
+glacially
+glaciaria
+glaciarium
+glaciate
+glaciation
+glacier
+glaciered
+glacieret
+glacierist
+glacification
+glacioaqueous
+glaciolacustrine
+glaciological
+glaciologist
+glaciology
+glaciomarine
+glaciometer
+glacionatant
+glacis
+glack
+glad
+gladden
+gladdener
+gladdon
+gladdy
+glade
+gladelike
+gladeye
+gladful
+gladfully
+gladfulness
+gladhearted
+gladiate
+gladiator
+gladiatorial
+gladiatorism
+gladiatorship
+gladiatrix
+gladify
+gladii
+gladiola
+gladiolar
+gladiole
+gladioli
+gladiolus
+gladius
+gladkaite
+gladless
+gladly
+gladness
+gladsome
+gladsomely
+gladsomeness
+Gladstone
+Gladstonian
+Gladstonianism
+glady
+Gladys
+glaga
+Glagol
+Glagolic
+Glagolitic
+Glagolitsa
+glaieul
+glaik
+glaiket
+glaiketness
+glair
+glaireous
+glairiness
+glairy
+glaister
+glaive
+glaived
+glaked
+glaky
+glam
+glamberry
+glamorize
+glamorous
+glamorously
+glamour
+glamoury
+glance
+glancer
+glancing
+glancingly
+gland
+glandaceous
+glandarious
+glandered
+glanderous
+glanders
+glandes
+glandiferous
+glandiform
+glandless
+glandlike
+glandular
+glandularly
+glandule
+glanduliferous
+glanduliform
+glanduligerous
+glandulose
+glandulosity
+glandulous
+glandulousness
+Glaniostomi
+glans
+glar
+glare
+glareless
+Glareola
+glareole
+Glareolidae
+glareous
+glareproof
+glareworm
+glarily
+glariness
+glaring
+glaringly
+glaringness
+glarry
+glary
+Glaserian
+glaserite
+glashan
+glass
+glassen
+glasser
+glasses
+glassfish
+glassful
+glasshouse
+glassie
+glassily
+glassine
+glassiness
+Glassite
+glassless
+glasslike
+glassmaker
+glassmaking
+glassman
+glassophone
+glassrope
+glassteel
+glassware
+glassweed
+glasswork
+glassworker
+glassworking
+glassworks
+glasswort
+glassy
+Glaswegian
+Glathsheim
+Glathsheimr
+glauberite
+glaucescence
+glaucescent
+Glaucidium
+glaucin
+glaucine
+Glaucionetta
+Glaucium
+glaucochroite
+glaucodot
+glaucolite
+glaucoma
+glaucomatous
+Glaucomys
+Glauconia
+glauconiferous
+Glauconiidae
+glauconite
+glauconitic
+glauconitization
+glaucophane
+glaucophanite
+glaucophanization
+glaucophanize
+glaucophyllous
+Glaucopis
+glaucosuria
+glaucous
+glaucously
+Glauke
+glaum
+glaumrie
+glaur
+glaury
+Glaux
+glaver
+glaze
+glazed
+glazen
+glazer
+glazework
+glazier
+glaziery
+glazily
+glaziness
+glazing
+glazy
+gleam
+gleamily
+gleaminess
+gleaming
+gleamingly
+gleamless
+gleamy
+glean
+gleanable
+gleaner
+gleaning
+gleary
+gleba
+glebal
+glebe
+glebeless
+glebous
+Glecoma
+glede
+Gleditsia
+gledy
+glee
+gleed
+gleeful
+gleefully
+gleefulness
+gleeishly
+gleek
+gleemaiden
+gleeman
+gleesome
+gleesomely
+gleesomeness
+gleet
+gleety
+gleewoman
+gleg
+glegly
+glegness
+Glen
+glen
+Glengarry
+Glenn
+glenohumeral
+glenoid
+glenoidal
+glent
+glessite
+gleyde
+glia
+gliadin
+glial
+glib
+glibbery
+glibly
+glibness
+glidder
+gliddery
+glide
+glideless
+glideness
+glider
+gliderport
+glidewort
+gliding
+glidingly
+gliff
+gliffing
+glime
+glimmer
+glimmering
+glimmeringly
+glimmerite
+glimmerous
+glimmery
+glimpse
+glimpser
+glink
+glint
+glioma
+gliomatous
+gliosa
+gliosis
+Glires
+Gliridae
+gliriform
+Gliriformia
+glirine
+Glis
+glisk
+glisky
+glissade
+glissader
+glissando
+glissette
+glisten
+glistening
+glisteningly
+glister
+glisteringly
+Glitnir
+glitter
+glitterance
+glittering
+glitteringly
+glittersome
+glittery
+gloam
+gloaming
+gloat
+gloater
+gloating
+gloatingly
+global
+globally
+globate
+globated
+globe
+globed
+globefish
+globeflower
+globeholder
+globelet
+Globicephala
+globiferous
+Globigerina
+globigerine
+Globigerinidae
+globin
+Globiocephalus
+globoid
+globose
+globosely
+globoseness
+globosite
+globosity
+globosphaerite
+globous
+globously
+globousness
+globular
+Globularia
+Globulariaceae
+globulariaceous
+globularity
+globularly
+globularness
+globule
+globulet
+globulicidal
+globulicide
+globuliferous
+globuliform
+globulimeter
+globulin
+globulinuria
+globulite
+globulitic
+globuloid
+globulolysis
+globulose
+globulous
+globulousness
+globulysis
+globy
+glochid
+glochideous
+glochidia
+glochidial
+glochidian
+glochidiate
+glochidium
+glochis
+glockenspiel
+gloea
+gloeal
+Gloeocapsa
+gloeocapsoid
+gloeosporiose
+Gloeosporium
+Gloiopeltis
+Gloiosiphonia
+Gloiosiphoniaceae
+glom
+glome
+glomerate
+glomeration
+Glomerella
+glomeroporphyritic
+glomerular
+glomerulate
+glomerule
+glomerulitis
+glomerulonephritis
+glomerulose
+glomerulus
+glommox
+glomus
+glonoin
+glonoine
+gloom
+gloomful
+gloomfully
+gloomily
+gloominess
+glooming
+gloomingly
+gloomless
+gloomth
+gloomy
+glop
+gloppen
+glor
+glore
+Gloria
+Gloriana
+gloriation
+gloriette
+glorifiable
+glorification
+glorifier
+glorify
+gloriole
+Gloriosa
+gloriosity
+glorious
+gloriously
+gloriousness
+glory
+gloryful
+glorying
+gloryingly
+gloryless
+gloss
+glossa
+glossagra
+glossal
+glossalgia
+glossalgy
+glossanthrax
+glossarial
+glossarially
+glossarian
+glossarist
+glossarize
+glossary
+Glossata
+glossate
+glossator
+glossatorial
+glossectomy
+glossed
+glosser
+glossic
+glossily
+Glossina
+glossiness
+glossing
+glossingly
+Glossiphonia
+Glossiphonidae
+glossist
+glossitic
+glossitis
+glossless
+glossmeter
+glossocarcinoma
+glossocele
+glossocoma
+glossocomon
+glossodynamometer
+glossodynia
+glossoepiglottic
+glossoepiglottidean
+glossograph
+glossographer
+glossographical
+glossography
+glossohyal
+glossoid
+glossokinesthetic
+glossolabial
+glossolabiolaryngeal
+glossolabiopharyngeal
+glossolalia
+glossolalist
+glossolaly
+glossolaryngeal
+glossological
+glossologist
+glossology
+glossolysis
+glossoncus
+glossopalatine
+glossopalatinus
+glossopathy
+glossopetra
+Glossophaga
+glossophagine
+glossopharyngeal
+glossopharyngeus
+Glossophora
+glossophorous
+glossophytia
+glossoplasty
+glossoplegia
+glossopode
+glossopodium
+Glossopteris
+glossoptosis
+glossopyrosis
+glossorrhaphy
+glossoscopia
+glossoscopy
+glossospasm
+glossosteresis
+Glossotherium
+glossotomy
+glossotype
+glossy
+glost
+glottal
+glottalite
+glottalize
+glottic
+glottid
+glottidean
+glottis
+glottiscope
+glottogonic
+glottogonist
+glottogony
+glottologic
+glottological
+glottologist
+glottology
+Gloucester
+glout
+glove
+gloveless
+glovelike
+glovemaker
+glovemaking
+glover
+gloveress
+glovey
+gloving
+glow
+glower
+glowerer
+glowering
+gloweringly
+glowfly
+glowing
+glowingly
+glowworm
+Gloxinia
+gloy
+gloze
+glozing
+glozingly
+glub
+glucase
+glucemia
+glucid
+glucide
+glucidic
+glucina
+glucine
+glucinic
+glucinium
+glucinum
+gluck
+glucofrangulin
+glucokinin
+glucolipid
+glucolipide
+glucolipin
+glucolipine
+glucolysis
+glucosaemia
+glucosamine
+glucosan
+glucosane
+glucosazone
+glucose
+glucosemia
+glucosic
+glucosid
+glucosidal
+glucosidase
+glucoside
+glucosidic
+glucosidically
+glucosin
+glucosine
+glucosone
+glucosuria
+glucuronic
+glue
+glued
+gluemaker
+gluemaking
+gluepot
+gluer
+gluey
+glueyness
+glug
+gluish
+gluishness
+glum
+gluma
+Glumaceae
+glumaceous
+glumal
+Glumales
+glume
+glumiferous
+Glumiflorae
+glumly
+glummy
+glumness
+glumose
+glumosity
+glump
+glumpily
+glumpiness
+glumpish
+glumpy
+glunch
+Gluneamie
+glusid
+gluside
+glut
+glutamic
+glutamine
+glutaminic
+glutaric
+glutathione
+glutch
+gluteal
+glutelin
+gluten
+glutenin
+glutenous
+gluteofemoral
+gluteoinguinal
+gluteoperineal
+gluteus
+glutin
+glutinate
+glutination
+glutinative
+glutinize
+glutinose
+glutinosity
+glutinous
+glutinously
+glutinousness
+glutition
+glutoid
+glutose
+glutter
+gluttery
+glutting
+gluttingly
+glutton
+gluttoness
+gluttonish
+gluttonism
+gluttonize
+gluttonous
+gluttonously
+gluttonousness
+gluttony
+glyceraldehyde
+glycerate
+Glyceria
+glyceric
+glyceride
+glycerin
+glycerinate
+glycerination
+glycerine
+glycerinize
+glycerite
+glycerize
+glycerizin
+glycerizine
+glycerogel
+glycerogelatin
+glycerol
+glycerolate
+glycerole
+glycerolize
+glycerophosphate
+glycerophosphoric
+glycerose
+glyceroxide
+glyceryl
+glycid
+glycide
+glycidic
+glycidol
+Glycine
+glycine
+glycinin
+glycocholate
+glycocholic
+glycocin
+glycocoll
+glycogelatin
+glycogen
+glycogenesis
+glycogenetic
+glycogenic
+glycogenize
+glycogenolysis
+glycogenous
+glycogeny
+glycohaemia
+glycohemia
+glycol
+glycolaldehyde
+glycolate
+glycolic
+glycolide
+glycolipid
+glycolipide
+glycolipin
+glycolipine
+glycoluric
+glycoluril
+glycolyl
+glycolylurea
+glycolysis
+glycolytic
+glycolytically
+Glyconian
+Glyconic
+glyconic
+glyconin
+glycoproteid
+glycoprotein
+glycosaemia
+glycose
+glycosemia
+glycosin
+glycosine
+glycosuria
+glycosuric
+glycuresis
+glycuronic
+glycyl
+glycyphyllin
+Glycyrrhiza
+glycyrrhizin
+Glynn
+glyoxal
+glyoxalase
+glyoxalic
+glyoxalin
+glyoxaline
+glyoxim
+glyoxime
+glyoxyl
+glyoxylic
+glyph
+glyphic
+glyphograph
+glyphographer
+glyphographic
+glyphography
+glyptic
+glyptical
+glyptician
+Glyptodon
+glyptodont
+Glyptodontidae
+glyptodontoid
+glyptograph
+glyptographer
+glyptographic
+glyptography
+glyptolith
+glyptological
+glyptologist
+glyptology
+glyptotheca
+Glyptotherium
+glyster
+Gmelina
+gmelinite
+gnabble
+Gnaeus
+gnaphalioid
+Gnaphalium
+gnar
+gnarl
+gnarled
+gnarliness
+gnarly
+gnash
+gnashingly
+gnat
+gnatcatcher
+gnatflower
+gnathal
+gnathalgia
+gnathic
+gnathidium
+gnathion
+gnathism
+gnathite
+gnathitis
+Gnatho
+gnathobase
+gnathobasic
+Gnathobdellae
+Gnathobdellida
+gnathometer
+gnathonic
+gnathonical
+gnathonically
+gnathonism
+gnathonize
+gnathophorous
+gnathoplasty
+gnathopod
+Gnathopoda
+gnathopodite
+gnathopodous
+gnathostegite
+Gnathostoma
+Gnathostomata
+gnathostomatous
+gnathostome
+Gnathostomi
+gnathostomous
+gnathotheca
+gnatling
+gnatproof
+gnatsnap
+gnatsnapper
+gnatter
+gnatty
+gnatworm
+gnaw
+gnawable
+gnawer
+gnawing
+gnawingly
+gnawn
+gneiss
+gneissic
+gneissitic
+gneissoid
+gneissose
+gneissy
+Gnetaceae
+gnetaceous
+Gnetales
+Gnetum
+gnocchetti
+gnome
+gnomed
+gnomesque
+gnomic
+gnomical
+gnomically
+gnomide
+gnomish
+gnomist
+gnomologic
+gnomological
+gnomologist
+gnomology
+gnomon
+Gnomonia
+Gnomoniaceae
+gnomonic
+gnomonical
+gnomonics
+gnomonological
+gnomonologically
+gnomonology
+gnosiological
+gnosiology
+gnosis
+Gnostic
+gnostic
+gnostical
+gnostically
+Gnosticism
+gnosticity
+gnosticize
+gnosticizer
+gnostology
+gnu
+go
+goa
+goad
+goadsman
+goadster
+goaf
+Goajiro
+goal
+Goala
+goalage
+goalee
+goalie
+goalkeeper
+goalkeeping
+goalless
+goalmouth
+Goan
+Goanese
+goanna
+Goasila
+goat
+goatbeard
+goatbrush
+goatbush
+goatee
+goateed
+goatfish
+goatherd
+goatherdess
+goatish
+goatishly
+goatishness
+goatland
+goatlike
+goatling
+goatly
+goatroot
+goatsbane
+goatsbeard
+goatsfoot
+goatskin
+goatstone
+goatsucker
+goatweed
+goaty
+goave
+gob
+goback
+goban
+gobang
+gobbe
+gobber
+gobbet
+gobbin
+gobbing
+gobble
+gobbledygook
+gobbler
+gobby
+Gobelin
+gobelin
+gobernadora
+gobi
+Gobia
+Gobian
+gobiesocid
+Gobiesocidae
+gobiesociform
+Gobiesox
+gobiid
+Gobiidae
+gobiiform
+Gobiiformes
+Gobinism
+Gobinist
+Gobio
+gobioid
+Gobioidea
+Gobioidei
+goblet
+gobleted
+gobletful
+goblin
+gobline
+goblinesque
+goblinish
+goblinism
+goblinize
+goblinry
+gobmouthed
+gobo
+gobonated
+gobony
+gobstick
+goburra
+goby
+gobylike
+gocart
+Goclenian
+God
+god
+godchild
+Goddam
+Goddard
+goddard
+goddaughter
+godded
+goddess
+goddesshood
+goddessship
+goddikin
+goddize
+gode
+godet
+Godetia
+godfather
+godfatherhood
+godfathership
+Godforsaken
+Godfrey
+Godful
+godhead
+godhood
+Godiva
+godkin
+godless
+godlessly
+godlessness
+godlet
+godlike
+godlikeness
+godlily
+godliness
+godling
+godly
+godmaker
+godmaking
+godmamma
+godmother
+godmotherhood
+godmothership
+godown
+godpapa
+godparent
+Godsake
+godsend
+godship
+godson
+godsonship
+Godspeed
+Godward
+Godwin
+Godwinian
+godwit
+goeduck
+goel
+goelism
+Goemagot
+Goemot
+goer
+goes
+Goetae
+Goethian
+goetia
+goetic
+goetical
+goety
+goff
+goffer
+goffered
+gofferer
+goffering
+goffle
+gog
+gogga
+goggan
+goggle
+goggled
+goggler
+gogglers
+goggly
+goglet
+Gogo
+gogo
+Gohila
+goi
+goiabada
+Goidel
+Goidelic
+going
+goitcho
+goiter
+goitered
+goitral
+goitrogen
+goitrogenic
+goitrous
+Gokuraku
+gol
+gola
+golach
+goladar
+golandaas
+golandause
+Golaseccan
+Golconda
+Gold
+gold
+goldbeater
+goldbeating
+Goldbird
+goldbrick
+goldbricker
+goldbug
+goldcrest
+goldcup
+golden
+goldenback
+goldeneye
+goldenfleece
+goldenhair
+goldenknop
+goldenlocks
+goldenly
+Goldenmouth
+goldenmouthed
+goldenness
+goldenpert
+goldenrod
+goldenseal
+goldentop
+goldenwing
+golder
+goldfielder
+goldfinch
+goldfinny
+goldfish
+goldflower
+goldhammer
+goldhead
+Goldi
+Goldic
+goldie
+goldilocks
+goldin
+goldish
+goldless
+goldlike
+Goldonian
+goldseed
+goldsinny
+goldsmith
+goldsmithery
+goldsmithing
+goldspink
+goldstone
+goldtail
+goldtit
+goldwater
+goldweed
+goldwork
+goldworker
+Goldy
+goldy
+golee
+golem
+golf
+golfdom
+golfer
+Golgi
+Golgotha
+goli
+goliard
+goliardery
+goliardic
+Goliath
+goliath
+goliathize
+golkakra
+Goll
+golland
+gollar
+golliwogg
+golly
+Golo
+goloe
+golpe
+Goma
+gomari
+Gomarian
+Gomarist
+Gomarite
+gomart
+gomashta
+gomavel
+gombay
+gombeen
+gombeenism
+gombroon
+Gomeisa
+gomer
+gomeral
+gomlah
+gommelin
+Gomontia
+Gomorrhean
+Gomphocarpus
+gomphodont
+Gompholobium
+gomphosis
+Gomphrena
+gomuti
+gon
+Gona
+gonad
+gonadal
+gonadial
+gonadic
+gonadotropic
+gonadotropin
+gonaduct
+gonagra
+gonakie
+gonal
+gonalgia
+gonangial
+gonangium
+gonapod
+gonapophysal
+gonapophysial
+gonapophysis
+gonarthritis
+Gond
+gondang
+Gondi
+gondite
+gondola
+gondolet
+gondolier
+gone
+goneness
+goneoclinic
+gonepoiesis
+gonepoietic
+goner
+Goneril
+gonesome
+gonfalcon
+gonfalonier
+gonfalonierate
+gonfaloniership
+gonfanon
+gong
+gongman
+Gongoresque
+Gongorism
+Gongorist
+gongoristic
+gonia
+goniac
+gonial
+goniale
+Goniaster
+goniatite
+Goniatites
+goniatitic
+goniatitid
+Goniatitidae
+goniatitoid
+gonid
+gonidangium
+gonidia
+gonidial
+gonidic
+gonidiferous
+gonidiogenous
+gonidioid
+gonidiophore
+gonidiose
+gonidiospore
+gonidium
+gonimic
+gonimium
+gonimolobe
+gonimous
+goniocraniometry
+Goniodoridae
+Goniodorididae
+Goniodoris
+goniometer
+goniometric
+goniometrical
+goniometrically
+goniometry
+gonion
+Goniopholidae
+Goniopholis
+goniostat
+goniotropous
+gonitis
+Gonium
+gonium
+gonnardite
+gonne
+gonoblast
+gonoblastic
+gonoblastidial
+gonoblastidium
+gonocalycine
+gonocalyx
+gonocheme
+gonochorism
+gonochorismal
+gonochorismus
+gonochoristic
+gonococcal
+gonococcic
+gonococcoid
+gonococcus
+gonocoel
+gonocyte
+gonoecium
+Gonolobus
+gonomere
+gonomery
+gonophore
+gonophoric
+gonophorous
+gonoplasm
+gonopoietic
+gonorrhea
+gonorrheal
+gonorrheic
+gonosomal
+gonosome
+gonosphere
+gonostyle
+gonotheca
+gonothecal
+gonotokont
+gonotome
+gonotype
+gonozooid
+gony
+gonyalgia
+gonydeal
+gonydial
+gonyocele
+gonyoncus
+gonys
+Gonystylaceae
+gonystylaceous
+Gonystylus
+gonytheca
+Gonzalo
+goo
+goober
+good
+Goodenia
+Goodeniaceae
+goodeniaceous
+Goodenoviaceae
+goodhearted
+goodheartedly
+goodheartedness
+gooding
+goodish
+goodishness
+goodlihead
+goodlike
+goodliness
+goodly
+goodman
+goodmanship
+goodness
+goods
+goodsome
+goodwife
+goodwill
+goodwillit
+goodwilly
+goody
+goodyear
+Goodyera
+goodyish
+goodyism
+goodyness
+goodyship
+goof
+goofer
+goofily
+goofiness
+goofy
+googly
+googol
+googolplex
+googul
+gook
+gool
+goolah
+gools
+gooma
+goon
+goondie
+goonie
+Goop
+goosander
+goose
+goosebeak
+gooseberry
+goosebill
+goosebird
+goosebone
+gooseboy
+goosecap
+goosefish
+gooseflower
+goosefoot
+goosegirl
+goosegog
+gooseherd
+goosehouse
+gooselike
+goosemouth
+gooseneck
+goosenecked
+gooserumped
+goosery
+goosetongue
+gooseweed
+goosewing
+goosewinged
+goosish
+goosishly
+goosishness
+goosy
+gopher
+gopherberry
+gopherroot
+gopherwood
+gopura
+Gor
+gor
+gora
+goracco
+goral
+goran
+gorb
+gorbal
+gorbellied
+gorbelly
+gorbet
+gorble
+gorblimy
+gorce
+gorcock
+gorcrow
+Gordiacea
+gordiacean
+gordiaceous
+Gordian
+Gordiidae
+Gordioidea
+Gordius
+gordolobo
+Gordon
+Gordonia
+gordunite
+Gordyaean
+gore
+gorer
+gorevan
+gorfly
+gorge
+gorgeable
+gorged
+gorgedly
+gorgelet
+gorgeous
+gorgeously
+gorgeousness
+gorger
+gorgerin
+gorget
+gorgeted
+gorglin
+Gorgon
+Gorgonacea
+gorgonacean
+gorgonaceous
+gorgonesque
+gorgoneum
+Gorgonia
+Gorgoniacea
+gorgoniacean
+gorgoniaceous
+Gorgonian
+gorgonian
+gorgonin
+gorgonize
+gorgonlike
+Gorgonzola
+Gorgosaurus
+gorhen
+goric
+gorilla
+gorillaship
+gorillian
+gorilline
+gorilloid
+gorily
+goriness
+goring
+Gorkhali
+Gorkiesque
+gorlin
+gorlois
+gormandize
+gormandizer
+gormaw
+gormed
+gorra
+gorraf
+gorry
+gorse
+gorsebird
+gorsechat
+gorsedd
+gorsehatch
+gorsy
+Gortonian
+Gortonite
+gory
+gos
+gosain
+goschen
+gosh
+goshawk
+Goshen
+goshenite
+goslarite
+goslet
+gosling
+gosmore
+gospel
+gospeler
+gospelist
+gospelize
+gospellike
+gospelly
+gospelmonger
+gospelwards
+Gosplan
+gospodar
+gosport
+gossamer
+gossamered
+gossamery
+gossampine
+gossan
+gossaniferous
+gossard
+gossip
+gossipdom
+gossipee
+gossiper
+gossiphood
+gossipiness
+gossiping
+gossipingly
+gossipmonger
+gossipred
+gossipry
+gossipy
+gossoon
+gossy
+gossypine
+Gossypium
+gossypol
+gossypose
+got
+gotch
+gote
+Goth
+Gotha
+Gotham
+Gothamite
+Gothic
+Gothically
+Gothicism
+Gothicist
+Gothicity
+Gothicize
+Gothicizer
+Gothicness
+Gothish
+Gothism
+gothite
+Gothlander
+Gothonic
+Gotiglacial
+gotra
+gotraja
+gotten
+Gottfried
+Gottlieb
+gouaree
+Gouda
+Goudy
+gouge
+gouger
+goujon
+goulash
+goumi
+goup
+Goura
+gourami
+gourd
+gourde
+gourdful
+gourdhead
+gourdiness
+gourdlike
+gourdworm
+gourdy
+Gourinae
+gourmand
+gourmander
+gourmanderie
+gourmandism
+gourmet
+gourmetism
+gourounut
+goustrous
+gousty
+gout
+goutify
+goutily
+goutiness
+goutish
+goutte
+goutweed
+goutwort
+gouty
+gove
+govern
+governability
+governable
+governableness
+governably
+governail
+governance
+governess
+governessdom
+governesshood
+governessy
+governing
+governingly
+government
+governmental
+governmentalism
+governmentalist
+governmentalize
+governmentally
+governmentish
+governor
+governorate
+governorship
+gowan
+gowdnie
+gowf
+gowfer
+gowiddie
+gowk
+gowked
+gowkedly
+gowkedness
+gowkit
+gowl
+gown
+gownlet
+gownsman
+gowpen
+goy
+Goyana
+goyazite
+Goyetian
+goyim
+goyin
+goyle
+gozell
+gozzard
+gra
+Graafian
+grab
+grabbable
+grabber
+grabble
+grabbler
+grabbling
+grabbots
+graben
+grabhook
+grabouche
+Grace
+grace
+graceful
+gracefully
+gracefulness
+graceless
+gracelessly
+gracelessness
+gracelike
+gracer
+Gracilaria
+gracilariid
+Gracilariidae
+gracile
+gracileness
+gracilescent
+gracilis
+gracility
+graciosity
+gracioso
+gracious
+graciously
+graciousness
+grackle
+Graculus
+grad
+gradable
+gradal
+gradate
+gradation
+gradational
+gradationally
+gradationately
+gradative
+gradatively
+gradatory
+graddan
+grade
+graded
+gradefinder
+gradely
+grader
+Gradgrind
+gradgrind
+Gradgrindian
+Gradgrindish
+Gradgrindism
+gradient
+gradienter
+Gradientia
+gradin
+gradine
+grading
+gradiometer
+gradiometric
+gradometer
+gradual
+gradualism
+gradualist
+gradualistic
+graduality
+gradually
+gradualness
+graduand
+graduate
+graduated
+graduateship
+graduatical
+graduating
+graduation
+graduator
+gradus
+Graeae
+Graeculus
+Graeme
+graff
+graffage
+graffer
+Graffias
+graffito
+grafship
+graft
+graftage
+graftdom
+grafted
+grafter
+grafting
+graftonite
+graftproof
+Graham
+graham
+grahamite
+Graian
+grail
+grailer
+grailing
+grain
+grainage
+grained
+grainedness
+grainer
+grainering
+grainery
+grainfield
+graininess
+graining
+grainland
+grainless
+grainman
+grainsick
+grainsickness
+grainsman
+grainways
+grainy
+graip
+graisse
+graith
+Grallae
+Grallatores
+grallatorial
+grallatory
+grallic
+Grallina
+gralline
+gralloch
+gram
+grama
+gramarye
+gramashes
+grame
+gramenite
+gramicidin
+Graminaceae
+graminaceous
+Gramineae
+gramineal
+gramineous
+gramineousness
+graminicolous
+graminiferous
+graminifolious
+graminiform
+graminin
+graminivore
+graminivorous
+graminological
+graminology
+graminous
+grammalogue
+grammar
+grammarian
+grammarianism
+grammarless
+grammatic
+grammatical
+grammatically
+grammaticalness
+grammaticaster
+grammaticism
+grammaticize
+grammatics
+grammatist
+grammatistical
+grammatite
+grammatolator
+grammatolatry
+Grammatophyllum
+gramme
+Grammontine
+gramoches
+Gramophone
+gramophone
+gramophonic
+gramophonical
+gramophonically
+gramophonist
+gramp
+grampa
+grampus
+granada
+granadilla
+granadillo
+Granadine
+granage
+granary
+granate
+granatum
+granch
+grand
+grandam
+grandame
+grandaunt
+grandchild
+granddad
+granddaddy
+granddaughter
+granddaughterly
+grandee
+grandeeism
+grandeeship
+grandesque
+grandeur
+grandeval
+grandfather
+grandfatherhood
+grandfatherish
+grandfatherless
+grandfatherly
+grandfathership
+grandfer
+grandfilial
+grandiloquence
+grandiloquent
+grandiloquently
+grandiloquous
+grandiose
+grandiosely
+grandiosity
+grandisonant
+Grandisonian
+Grandisonianism
+grandisonous
+grandly
+grandma
+grandmaternal
+Grandmontine
+grandmother
+grandmotherhood
+grandmotherism
+grandmotherliness
+grandmotherly
+grandnephew
+grandness
+grandniece
+grandpa
+grandparent
+grandparentage
+grandparental
+grandpaternal
+grandsire
+grandson
+grandsonship
+grandstand
+grandstander
+granduncle
+grane
+grange
+granger
+grangerism
+grangerite
+grangerization
+grangerize
+grangerizer
+Grangousier
+graniform
+granilla
+granite
+granitelike
+graniteware
+granitic
+granitical
+graniticoline
+granitiferous
+granitification
+granitiform
+granitite
+granitization
+granitize
+granitoid
+granivore
+granivorous
+granjeno
+grank
+grannom
+granny
+grannybush
+grano
+granoblastic
+granodiorite
+granogabbro
+granolite
+granolith
+granolithic
+granomerite
+granophyre
+granophyric
+granose
+granospherite
+Grant
+grant
+grantable
+grantedly
+grantee
+granter
+Granth
+Grantha
+Grantia
+Grantiidae
+grantor
+granula
+granular
+granularity
+granularly
+granulary
+granulate
+granulated
+granulater
+granulation
+granulative
+granulator
+granule
+granulet
+granuliferous
+granuliform
+granulite
+granulitic
+granulitis
+granulitization
+granulitize
+granulize
+granuloadipose
+granulocyte
+granuloma
+granulomatous
+granulometric
+granulosa
+granulose
+granulous
+Granville
+granza
+granzita
+grape
+graped
+grapeflower
+grapefruit
+grapeful
+grapeless
+grapelet
+grapelike
+grapenuts
+graperoot
+grapery
+grapeshot
+grapeskin
+grapestalk
+grapestone
+grapevine
+grapewise
+grapewort
+graph
+graphalloy
+graphic
+graphical
+graphically
+graphicalness
+graphicly
+graphicness
+graphics
+Graphidiaceae
+Graphiola
+graphiological
+graphiologist
+graphiology
+Graphis
+graphite
+graphiter
+graphitic
+graphitization
+graphitize
+graphitoid
+graphitoidal
+Graphium
+graphologic
+graphological
+graphologist
+graphology
+graphomania
+graphomaniac
+graphometer
+graphometric
+graphometrical
+graphometry
+graphomotor
+Graphophone
+graphophone
+graphophonic
+graphorrhea
+graphoscope
+graphospasm
+graphostatic
+graphostatical
+graphostatics
+graphotype
+graphotypic
+graphy
+graping
+grapnel
+grappa
+grapple
+grappler
+grappling
+Grapsidae
+grapsoid
+Grapsus
+Grapta
+graptolite
+Graptolitha
+Graptolithida
+Graptolithina
+graptolitic
+Graptolitoidea
+Graptoloidea
+graptomancy
+grapy
+grasp
+graspable
+grasper
+grasping
+graspingly
+graspingness
+graspless
+grass
+grassant
+grassation
+grassbird
+grasschat
+grasscut
+grasscutter
+grassed
+grasser
+grasset
+grassflat
+grassflower
+grasshop
+grasshopper
+grasshopperdom
+grasshopperish
+grasshouse
+grassiness
+grassing
+grassland
+grassless
+grasslike
+grassman
+grassnut
+grassplot
+grassquit
+grasswards
+grassweed
+grasswidowhood
+grasswork
+grassworm
+grassy
+grat
+grate
+grateful
+gratefully
+gratefulness
+grateless
+grateman
+grater
+gratewise
+grather
+Gratia
+Gratiano
+graticulate
+graticulation
+graticule
+gratification
+gratified
+gratifiedly
+gratifier
+gratify
+gratifying
+gratifyingly
+gratility
+gratillity
+gratinate
+grating
+Gratiola
+gratiolin
+gratiosolin
+gratis
+gratitude
+gratten
+grattoir
+gratuitant
+gratuitous
+gratuitously
+gratuitousness
+gratuity
+gratulant
+gratulate
+gratulation
+gratulatorily
+gratulatory
+graupel
+gravamen
+gravamina
+grave
+graveclod
+gravecloth
+graveclothes
+graved
+gravedigger
+gravegarth
+gravel
+graveless
+gravelike
+graveling
+gravelish
+gravelliness
+gravelly
+gravelroot
+gravelstone
+gravelweed
+gravely
+gravemaker
+gravemaking
+graveman
+gravemaster
+graven
+graveness
+Gravenstein
+graveolence
+graveolency
+graveolent
+graver
+Graves
+graveship
+graveside
+gravestead
+gravestone
+graveward
+gravewards
+graveyard
+gravic
+gravicembalo
+gravid
+gravidity
+gravidly
+gravidness
+Gravigrada
+gravigrade
+gravimeter
+gravimetric
+gravimetrical
+gravimetrically
+gravimetry
+graving
+gravitate
+gravitater
+gravitation
+gravitational
+gravitationally
+gravitative
+gravitometer
+gravity
+gravure
+gravy
+grawls
+gray
+grayback
+graybeard
+graycoat
+grayfish
+grayfly
+grayhead
+grayish
+graylag
+grayling
+grayly
+graymalkin
+graymill
+grayness
+graypate
+graywacke
+grayware
+graywether
+grazable
+graze
+grazeable
+grazer
+grazier
+grazierdom
+graziery
+grazing
+grazingly
+grease
+greasebush
+greasehorn
+greaseless
+greaselessness
+greaseproof
+greaseproofness
+greaser
+greasewood
+greasily
+greasiness
+greasy
+great
+greatcoat
+greatcoated
+greaten
+greater
+greathead
+greatheart
+greathearted
+greatheartedness
+greatish
+greatly
+greatmouthed
+greatness
+greave
+greaved
+greaves
+grebe
+Grebo
+grece
+Grecian
+Grecianize
+Grecism
+Grecize
+Grecomania
+Grecomaniac
+Grecophil
+gree
+greed
+greedily
+greediness
+greedless
+greedsome
+greedy
+greedygut
+greedyguts
+Greek
+Greekdom
+Greekery
+Greekess
+Greekish
+Greekism
+Greekist
+Greekize
+Greekless
+Greekling
+green
+greenable
+greenage
+greenalite
+greenback
+Greenbacker
+Greenbackism
+greenbark
+greenbone
+greenbrier
+Greencloth
+greencoat
+greener
+greenery
+greeney
+greenfinch
+greenfish
+greengage
+greengill
+greengrocer
+greengrocery
+greenhead
+greenheaded
+greenheart
+greenhearted
+greenhew
+greenhide
+greenhood
+greenhorn
+greenhornism
+greenhouse
+greening
+greenish
+greenishness
+greenkeeper
+greenkeeping
+Greenland
+Greenlander
+Greenlandic
+Greenlandish
+greenlandite
+Greenlandman
+greenleek
+greenless
+greenlet
+greenling
+greenly
+greenness
+greenockite
+greenovite
+greenroom
+greensand
+greensauce
+greenshank
+greensick
+greensickness
+greenside
+greenstone
+greenstuff
+greensward
+greenswarded
+greentail
+greenth
+greenuk
+greenweed
+Greenwich
+greenwing
+greenwithe
+greenwood
+greenwort
+greeny
+greenyard
+greet
+greeter
+greeting
+greetingless
+greetingly
+greffier
+greffotome
+Greg
+gregal
+gregale
+gregaloid
+gregarian
+gregarianism
+Gregarina
+Gregarinae
+Gregarinaria
+gregarine
+Gregarinida
+gregarinidal
+gregariniform
+Gregarinina
+Gregarinoidea
+gregarinosis
+gregarinous
+gregarious
+gregariously
+gregariousness
+gregaritic
+grege
+Gregg
+Gregge
+greggle
+grego
+Gregor
+Gregorian
+Gregorianist
+Gregorianize
+Gregorianizer
+Gregory
+greige
+grein
+greisen
+gremial
+gremlin
+grenade
+Grenadian
+grenadier
+grenadierial
+grenadierly
+grenadiership
+grenadin
+grenadine
+Grendel
+Grenelle
+Gressoria
+gressorial
+gressorious
+Greta
+Gretchen
+Gretel
+greund
+Grevillea
+grew
+grewhound
+Grewia
+grey
+greyhound
+Greyiaceae
+greyly
+greyness
+gribble
+grice
+grid
+griddle
+griddlecake
+griddler
+gride
+gridelin
+gridiron
+griece
+grieced
+grief
+griefful
+grieffully
+griefless
+grieflessness
+grieshoch
+grievance
+grieve
+grieved
+grievedly
+griever
+grieveship
+grieving
+grievingly
+grievous
+grievously
+grievousness
+Griff
+griff
+griffade
+griffado
+griffaun
+griffe
+griffin
+griffinage
+griffinesque
+griffinhood
+griffinish
+griffinism
+Griffith
+griffithite
+Griffon
+griffon
+griffonage
+griffonne
+grift
+grifter
+grig
+griggles
+grignet
+grigri
+grihastha
+grihyasutra
+grike
+grill
+grillade
+grillage
+grille
+grilled
+griller
+grillroom
+grillwork
+grilse
+grim
+grimace
+grimacer
+grimacier
+grimacing
+grimacingly
+grimalkin
+grime
+grimful
+grimgribber
+grimily
+griminess
+grimliness
+grimly
+grimme
+Grimmia
+Grimmiaceae
+grimmiaceous
+grimmish
+grimness
+grimp
+grimy
+grin
+grinagog
+grinch
+grind
+grindable
+Grindelia
+grinder
+grinderman
+grindery
+grinding
+grindingly
+grindle
+grindstone
+gringo
+gringolee
+gringophobia
+Grinnellia
+grinner
+grinning
+grinningly
+grinny
+grintern
+grip
+gripe
+gripeful
+griper
+gripgrass
+griphite
+Griphosaurus
+griping
+gripingly
+gripless
+gripman
+gripment
+grippal
+grippe
+gripper
+grippiness
+gripping
+grippingly
+grippingness
+gripple
+grippleness
+grippotoxin
+grippy
+gripsack
+gripy
+Griqua
+griquaite
+Griqualander
+gris
+grisaille
+grisard
+Griselda
+griseous
+grisette
+grisettish
+grisgris
+griskin
+grisliness
+grisly
+Grison
+grison
+grisounite
+grisoutine
+Grissel
+grissens
+grissons
+grist
+gristbite
+grister
+Gristhorbia
+gristle
+gristliness
+gristly
+gristmill
+gristmiller
+gristmilling
+gristy
+grit
+grith
+grithbreach
+grithman
+gritless
+gritrock
+grits
+gritstone
+gritten
+gritter
+grittily
+grittiness
+grittle
+gritty
+grivet
+grivna
+Grizel
+Grizzel
+grizzle
+grizzled
+grizzler
+grizzly
+grizzlyman
+groan
+groaner
+groanful
+groaning
+groaningly
+groat
+groats
+groatsworth
+grobian
+grobianism
+grocer
+grocerdom
+groceress
+grocerly
+grocerwise
+grocery
+groceryman
+Groenendael
+groff
+grog
+groggery
+groggily
+grogginess
+groggy
+grogram
+grogshop
+groin
+groined
+groinery
+groining
+Grolier
+Grolieresque
+gromatic
+gromatics
+Gromia
+grommet
+gromwell
+groom
+groomer
+groomish
+groomishly
+groomlet
+groomling
+groomsman
+groomy
+groop
+groose
+groot
+grooty
+groove
+grooveless
+groovelike
+groover
+grooverhead
+grooviness
+grooving
+groovy
+grope
+groper
+groping
+gropingly
+gropple
+grorudite
+gros
+grosbeak
+groschen
+groser
+groset
+grosgrain
+grosgrained
+gross
+grossart
+grossen
+grosser
+grossification
+grossify
+grossly
+grossness
+grosso
+grossulaceous
+grossular
+Grossularia
+grossularia
+Grossulariaceae
+grossulariaceous
+grossularious
+grossularite
+grosz
+groszy
+grot
+grotesque
+grotesquely
+grotesqueness
+grotesquerie
+grothine
+grothite
+Grotian
+Grotianism
+grottesco
+grotto
+grottoed
+grottolike
+grottowork
+grouch
+grouchily
+grouchiness
+grouchingly
+grouchy
+grouf
+grough
+ground
+groundable
+groundably
+groundage
+groundberry
+groundbird
+grounded
+groundedly
+groundedness
+groundenell
+grounder
+groundflower
+grounding
+groundless
+groundlessly
+groundlessness
+groundliness
+groundling
+groundly
+groundman
+groundmass
+groundneedle
+groundnut
+groundplot
+grounds
+groundsel
+groundsill
+groundsman
+groundward
+groundwood
+groundwork
+groundy
+group
+groupage
+groupageness
+grouped
+grouper
+grouping
+groupist
+grouplet
+groupment
+groupwise
+grouse
+grouseberry
+grouseless
+grouser
+grouseward
+grousewards
+grousy
+grout
+grouter
+grouthead
+grouts
+grouty
+grouze
+grove
+groved
+grovel
+groveler
+groveless
+groveling
+grovelingly
+grovelings
+grovy
+grow
+growable
+growan
+growed
+grower
+growing
+growingly
+growingupness
+growl
+growler
+growlery
+growling
+growlingly
+growly
+grown
+grownup
+growse
+growsome
+growth
+growthful
+growthiness
+growthless
+growthy
+grozart
+grozet
+grr
+grub
+grubbed
+grubber
+grubbery
+grubbily
+grubbiness
+grubby
+grubhood
+grubless
+grubroot
+grubs
+grubstake
+grubstaker
+Grubstreet
+grubstreet
+grubworm
+grudge
+grudgeful
+grudgefully
+grudgekin
+grudgeless
+grudger
+grudgery
+grudging
+grudgingly
+grudgingness
+grudgment
+grue
+gruel
+grueler
+grueling
+gruelly
+Grues
+gruesome
+gruesomely
+gruesomeness
+gruff
+gruffily
+gruffiness
+gruffish
+gruffly
+gruffness
+gruffs
+gruffy
+grufted
+grugru
+Gruidae
+gruiform
+Gruiformes
+gruine
+Gruis
+grum
+grumble
+grumbler
+grumblesome
+Grumbletonian
+grumbling
+grumblingly
+grumbly
+grume
+Grumium
+grumly
+grummel
+grummels
+grummet
+grummeter
+grumness
+grumose
+grumous
+grumousness
+grump
+grumph
+grumphie
+grumphy
+grumpily
+grumpiness
+grumpish
+grumpy
+grun
+Grundified
+Grundlov
+grundy
+Grundyism
+Grundyist
+Grundyite
+grunerite
+gruneritization
+grunion
+grunt
+grunter
+Grunth
+grunting
+gruntingly
+gruntle
+gruntled
+gruntling
+Grus
+grush
+grushie
+Grusian
+Grusinian
+gruss
+grutch
+grutten
+gryde
+grylli
+gryllid
+Gryllidae
+gryllos
+Gryllotalpa
+Gryllus
+gryllus
+grypanian
+Gryphaea
+Gryphosaurus
+gryposis
+Grypotherium
+grysbok
+guaba
+guacacoa
+guachamaca
+guacharo
+guachipilin
+Guacho
+Guacico
+guacimo
+guacin
+guaco
+guaconize
+Guadagnini
+guadalcazarite
+Guaharibo
+Guahiban
+Guahibo
+Guahivo
+guaiac
+guaiacol
+guaiacolize
+guaiaconic
+guaiacum
+guaiaretic
+guaiasanol
+guaiol
+guaka
+Gualaca
+guama
+guan
+Guana
+guana
+guanabana
+guanabano
+guanaco
+guanajuatite
+guanamine
+guanase
+guanay
+Guanche
+guaneide
+guango
+guanidine
+guanidopropionic
+guaniferous
+guanine
+guanize
+guano
+guanophore
+guanosine
+guanyl
+guanylic
+guao
+guapena
+guapilla
+guapinol
+Guaque
+guar
+guara
+guarabu
+guaracha
+guaraguao
+guarana
+Guarani
+guarani
+Guaranian
+guaranine
+guarantee
+guaranteeship
+guarantor
+guarantorship
+guaranty
+guarapucu
+Guaraunan
+Guarauno
+guard
+guardable
+guardant
+guarded
+guardedly
+guardedness
+guardeen
+guarder
+guardfish
+guardful
+guardfully
+guardhouse
+guardian
+guardiancy
+guardianess
+guardianless
+guardianly
+guardianship
+guarding
+guardingly
+guardless
+guardlike
+guardo
+guardrail
+guardroom
+guardship
+guardsman
+guardstone
+Guarea
+guariba
+guarinite
+guarneri
+Guarnerius
+Guarnieri
+Guarrau
+guarri
+Guaruan
+guasa
+Guastalline
+guatambu
+Guatemalan
+Guatemaltecan
+guativere
+Guato
+Guatoan
+Guatusan
+Guatuso
+Guauaenok
+guava
+guavaberry
+guavina
+guayaba
+guayabi
+guayabo
+guayacan
+Guayaqui
+Guaycuru
+Guaycuruan
+Guaymie
+guayroto
+guayule
+guaza
+Guazuma
+gubbertush
+Gubbin
+gubbo
+gubernacula
+gubernacular
+gubernaculum
+gubernative
+gubernator
+gubernatorial
+gubernatrix
+guberniya
+gucki
+gud
+gudame
+guddle
+gude
+gudebrother
+gudefather
+gudemother
+gudesake
+gudesakes
+gudesire
+gudewife
+gudge
+gudgeon
+gudget
+gudok
+gue
+guebucu
+guejarite
+Guelph
+Guelphic
+Guelphish
+Guelphism
+guemal
+guenepe
+guenon
+guepard
+guerdon
+guerdonable
+guerdoner
+guerdonless
+guereza
+Guerickian
+Guerinet
+Guernsey
+guernsey
+guernseyed
+guerrilla
+guerrillaism
+guerrillaship
+Guesdism
+Guesdist
+guess
+guessable
+guesser
+guessing
+guessingly
+guesswork
+guessworker
+guest
+guestchamber
+guesten
+guester
+guesthouse
+guesting
+guestive
+guestless
+Guestling
+guestling
+guestmaster
+guestship
+guestwise
+Guetar
+Guetare
+gufa
+guff
+guffaw
+guffer
+guffin
+guffy
+gugal
+guggle
+gugglet
+guglet
+guglia
+guglio
+gugu
+Guha
+Guhayna
+guhr
+Guiana
+Guianan
+Guianese
+guib
+guiba
+guidable
+guidage
+guidance
+guide
+guideboard
+guidebook
+guidebookish
+guidecraft
+guideless
+guideline
+guidepost
+guider
+guideress
+guidership
+guideship
+guideway
+guidman
+Guido
+guidon
+Guidonian
+guidwilly
+guige
+Guignardia
+guignol
+guijo
+Guilandina
+guild
+guilder
+guildhall
+guildic
+guildry
+guildship
+guildsman
+guile
+guileful
+guilefully
+guilefulness
+guileless
+guilelessly
+guilelessness
+guilery
+guillemet
+guillemot
+Guillermo
+guillevat
+guilloche
+guillochee
+guillotinade
+guillotine
+guillotinement
+guillotiner
+guillotinism
+guillotinist
+guilt
+guiltily
+guiltiness
+guiltless
+guiltlessly
+guiltlessness
+guiltsick
+guilty
+guily
+guimbard
+guimpe
+Guinea
+guinea
+Guineaman
+Guinean
+Guinevere
+guipure
+Guisard
+guisard
+guise
+guiser
+Guisian
+guising
+guitar
+guitarfish
+guitarist
+guitermanite
+guitguit
+Guittonian
+Gujar
+Gujarati
+Gujrati
+gul
+gula
+gulae
+gulaman
+gulancha
+Gulanganes
+gular
+gularis
+gulch
+gulden
+guldengroschen
+gule
+gules
+Gulf
+gulf
+gulflike
+gulfside
+gulfwards
+gulfweed
+gulfy
+gulgul
+gulinula
+gulinulae
+gulinular
+gulix
+gull
+Gullah
+gullery
+gullet
+gulleting
+gullibility
+gullible
+gullibly
+gullion
+gullish
+gullishly
+gullishness
+gully
+gullyhole
+Gulo
+gulonic
+gulose
+gulosity
+gulp
+gulper
+gulpin
+gulping
+gulpingly
+gulpy
+gulravage
+gulsach
+Gum
+gum
+gumbo
+gumboil
+gumbotil
+gumby
+gumchewer
+gumdigger
+gumdigging
+gumdrop
+gumfield
+gumflower
+gumihan
+gumless
+gumlike
+gumly
+gumma
+gummage
+gummaker
+gummaking
+gummata
+gummatous
+gummed
+gummer
+gummiferous
+gumminess
+gumming
+gummite
+gummose
+gummosis
+gummosity
+gummous
+gummy
+gump
+gumphion
+gumption
+gumptionless
+gumptious
+gumpus
+gumshoe
+gumweed
+gumwood
+gun
+guna
+gunate
+gunation
+gunbearer
+gunboat
+gunbright
+gunbuilder
+guncotton
+gundi
+gundy
+gunebo
+gunfire
+gunflint
+gunge
+gunhouse
+Gunite
+gunite
+gunj
+gunk
+gunl
+gunless
+gunlock
+gunmaker
+gunmaking
+gunman
+gunmanship
+gunnage
+Gunnar
+gunne
+gunnel
+gunner
+Gunnera
+Gunneraceae
+gunneress
+gunnership
+gunnery
+gunnies
+gunning
+gunnung
+gunny
+gunocracy
+gunong
+gunpaper
+gunplay
+gunpowder
+gunpowderous
+gunpowdery
+gunpower
+gunrack
+gunreach
+gunrunner
+gunrunning
+gunsel
+gunshop
+gunshot
+gunsman
+gunsmith
+gunsmithery
+gunsmithing
+gunster
+gunstick
+gunstock
+gunstocker
+gunstocking
+gunstone
+Gunter
+gunter
+Gunther
+gunwale
+gunyah
+gunyang
+gunyeh
+Gunz
+Gunzian
+gup
+guppy
+guptavidya
+gur
+Guran
+gurdfish
+gurdle
+gurdwara
+gurge
+gurgeon
+gurgeons
+gurges
+gurgitation
+gurgle
+gurglet
+gurgling
+gurglingly
+gurgly
+gurgoyle
+gurgulation
+Gurian
+Guric
+Gurish
+Gurjara
+gurjun
+gurk
+Gurkha
+gurl
+gurly
+Gurmukhi
+gurnard
+gurnet
+gurnetty
+Gurneyite
+gurniad
+gurr
+gurrah
+gurry
+gurt
+guru
+guruship
+Gus
+gush
+gusher
+gushet
+gushily
+gushiness
+gushing
+gushingly
+gushingness
+gushy
+gusla
+gusle
+guss
+gusset
+Gussie
+gussie
+gust
+gustable
+gustation
+gustative
+gustativeness
+gustatory
+Gustavus
+gustful
+gustfully
+gustfulness
+gustily
+gustiness
+gustless
+gusto
+gustoish
+Gustus
+gusty
+gut
+Guti
+Gutium
+gutless
+gutlike
+gutling
+Gutnic
+Gutnish
+gutt
+gutta
+guttable
+guttate
+guttated
+guttatim
+guttation
+gutte
+gutter
+Guttera
+gutterblood
+guttering
+gutterlike
+gutterling
+gutterman
+guttersnipe
+guttersnipish
+gutterspout
+gutterwise
+guttery
+gutti
+guttide
+guttie
+Guttiferae
+guttiferal
+Guttiferales
+guttiferous
+guttiform
+guttiness
+guttle
+guttler
+guttula
+guttulae
+guttular
+guttulate
+guttule
+guttural
+gutturalism
+gutturality
+gutturalization
+gutturalize
+gutturally
+gutturalness
+gutturize
+gutturonasal
+gutturopalatal
+gutturopalatine
+gutturotetany
+guttus
+gutty
+gutweed
+gutwise
+gutwort
+guvacine
+guvacoline
+Guy
+guy
+Guyandot
+guydom
+guyer
+guytrash
+guz
+guze
+Guzmania
+guzmania
+Guzul
+guzzle
+guzzledom
+guzzler
+gwag
+gweduc
+gweed
+gweeon
+gwely
+Gwen
+Gwendolen
+gwine
+gwyniad
+Gyarung
+gyascutus
+Gyges
+Gygis
+gyle
+gym
+gymel
+gymkhana
+Gymnadenia
+Gymnadeniopsis
+Gymnanthes
+gymnanthous
+Gymnarchidae
+Gymnarchus
+gymnasia
+gymnasial
+gymnasiarch
+gymnasiarchy
+gymnasiast
+gymnasic
+gymnasium
+gymnast
+gymnastic
+gymnastically
+gymnastics
+gymnemic
+gymnetrous
+gymnic
+gymnical
+gymnics
+gymnite
+Gymnoblastea
+gymnoblastic
+Gymnocalycium
+gymnocarpic
+gymnocarpous
+Gymnocerata
+gymnoceratous
+gymnocidium
+Gymnocladus
+Gymnoconia
+Gymnoderinae
+Gymnodiniaceae
+gymnodiniaceous
+Gymnodiniidae
+Gymnodinium
+gymnodont
+Gymnodontes
+gymnogen
+gymnogenous
+Gymnoglossa
+gymnoglossate
+gymnogynous
+Gymnogyps
+Gymnolaema
+Gymnolaemata
+gymnolaematous
+Gymnonoti
+Gymnopaedes
+gymnopaedic
+gymnophiona
+gymnoplast
+Gymnorhina
+gymnorhinal
+Gymnorhininae
+gymnosoph
+gymnosophist
+gymnosophy
+gymnosperm
+Gymnospermae
+gymnospermal
+gymnospermic
+gymnospermism
+Gymnospermous
+gymnospermy
+Gymnosporangium
+gymnospore
+gymnosporous
+Gymnostomata
+Gymnostomina
+gymnostomous
+Gymnothorax
+gymnotid
+Gymnotidae
+Gymnotoka
+gymnotokous
+Gymnotus
+Gymnura
+gymnure
+Gymnurinae
+gymnurine
+gympie
+gyn
+gynaecea
+gynaeceum
+gynaecocoenic
+gynander
+gynandrarchic
+gynandrarchy
+Gynandria
+gynandria
+gynandrian
+gynandrism
+gynandroid
+gynandromorph
+gynandromorphic
+gynandromorphism
+gynandromorphous
+gynandromorphy
+gynandrophore
+gynandrosporous
+gynandrous
+gynandry
+gynantherous
+gynarchic
+gynarchy
+gyne
+gynecic
+gynecidal
+gynecide
+gynecocentric
+gynecocracy
+gynecocrat
+gynecocratic
+gynecocratical
+gynecoid
+gynecolatry
+gynecologic
+gynecological
+gynecologist
+gynecology
+gynecomania
+gynecomastia
+gynecomastism
+gynecomasty
+gynecomazia
+gynecomorphous
+gyneconitis
+gynecopathic
+gynecopathy
+gynecophore
+gynecophoric
+gynecophorous
+gynecotelic
+gynecratic
+gyneocracy
+gyneolater
+gyneolatry
+gynephobia
+Gynerium
+gynethusia
+gyniatrics
+gyniatry
+gynic
+gynics
+gynobase
+gynobaseous
+gynobasic
+gynocardia
+gynocardic
+gynocracy
+gynocratic
+gynodioecious
+gynodioeciously
+gynodioecism
+gynoecia
+gynoecium
+gynogenesis
+gynomonecious
+gynomonoeciously
+gynomonoecism
+gynophagite
+gynophore
+gynophoric
+gynosporangium
+gynospore
+gynostegia
+gynostegium
+gynostemium
+Gynura
+gyp
+Gypaetus
+gype
+gypper
+Gyppo
+Gyps
+gyps
+gypseian
+gypseous
+gypsiferous
+gypsine
+gypsiologist
+gypsite
+gypsography
+gypsologist
+gypsology
+Gypsophila
+gypsophila
+gypsophilous
+gypsophily
+gypsoplast
+gypsous
+gypster
+gypsum
+Gypsy
+gypsy
+gypsydom
+gypsyesque
+gypsyfy
+gypsyhead
+gypsyhood
+gypsyish
+gypsyism
+gypsylike
+gypsyry
+gypsyweed
+gypsywise
+gypsywort
+Gyracanthus
+gyral
+gyrally
+gyrant
+gyrate
+gyration
+gyrational
+gyrator
+gyratory
+gyre
+Gyrencephala
+gyrencephalate
+gyrencephalic
+gyrencephalous
+gyrene
+gyrfalcon
+gyri
+gyric
+gyrinid
+Gyrinidae
+Gyrinus
+gyro
+gyrocar
+gyroceracone
+gyroceran
+Gyroceras
+gyrochrome
+gyrocompass
+Gyrodactylidae
+Gyrodactylus
+gyrogonite
+gyrograph
+gyroidal
+gyroidally
+gyrolite
+gyrolith
+gyroma
+gyromagnetic
+gyromancy
+gyromele
+gyrometer
+Gyromitra
+gyron
+gyronny
+Gyrophora
+Gyrophoraceae
+Gyrophoraceous
+gyrophoric
+gyropigeon
+gyroplane
+gyroscope
+gyroscopic
+gyroscopically
+gyroscopics
+gyrose
+gyrostabilizer
+Gyrostachys
+gyrostat
+gyrostatic
+gyrostatically
+gyrostatics
+Gyrotheca
+gyrous
+gyrovagi
+gyrovagues
+gyrowheel
+gyrus
+gyte
+gytling
+gyve
+H
+h
+ha
+haab
+haaf
+Habab
+habanera
+Habbe
+habble
+habdalah
+Habe
+habeas
+habena
+habenal
+habenar
+Habenaria
+habendum
+habenula
+habenular
+haberdash
+haberdasher
+haberdasheress
+haberdashery
+haberdine
+habergeon
+habilable
+habilatory
+habile
+habiliment
+habilimentation
+habilimented
+habilitate
+habilitation
+habilitator
+hability
+habille
+Habiri
+Habiru
+habit
+habitability
+habitable
+habitableness
+habitably
+habitacle
+habitacule
+habitally
+habitan
+habitance
+habitancy
+habitant
+habitat
+habitate
+habitation
+habitational
+habitative
+habited
+habitual
+habituality
+habitualize
+habitually
+habitualness
+habituate
+habituation
+habitude
+habitudinal
+habitue
+habitus
+habnab
+haboob
+Habronema
+habronemiasis
+habronemic
+habu
+habutai
+habutaye
+hache
+Hachiman
+hachure
+hacienda
+hack
+hackamatak
+hackamore
+hackbarrow
+hackberry
+hackbolt
+hackbush
+hackbut
+hackbuteer
+hacked
+hackee
+hacker
+hackery
+hackin
+hacking
+hackingly
+hackle
+hackleback
+hackler
+hacklog
+hackly
+hackmack
+hackman
+hackmatack
+hackney
+hackneyed
+hackneyer
+hackneyism
+hackneyman
+hacksaw
+hacksilber
+hackster
+hackthorn
+hacktree
+hackwood
+hacky
+had
+Hadassah
+hadbot
+hadden
+haddie
+haddo
+haddock
+haddocker
+hade
+Hadean
+Hadendoa
+Hadendowa
+hadentomoid
+Hadentomoidea
+Hades
+Hadhramautian
+hading
+Hadith
+hadj
+Hadjemi
+hadji
+hadland
+Hadramautian
+hadrome
+Hadromerina
+hadromycosis
+hadrosaur
+Hadrosaurus
+haec
+haecceity
+Haeckelian
+Haeckelism
+haem
+Haemamoeba
+Haemanthus
+Haemaphysalis
+haemaspectroscope
+haematherm
+haemathermal
+haemathermous
+haematinon
+haematinum
+haematite
+Haematobranchia
+haematobranchiate
+Haematocrya
+haematocryal
+Haematophilina
+haematophiline
+Haematopus
+haematorrhachis
+haematosepsis
+Haematotherma
+haematothermal
+haematoxylic
+haematoxylin
+Haematoxylon
+haemoconcentration
+haemodilution
+Haemodoraceae
+haemodoraceous
+haemoglobin
+haemogram
+Haemogregarina
+Haemogregarinidae
+haemonchiasis
+haemonchosis
+Haemonchus
+haemony
+haemophile
+Haemoproteus
+haemorrhage
+haemorrhagia
+haemorrhagic
+haemorrhoid
+haemorrhoidal
+haemosporid
+Haemosporidia
+haemosporidian
+Haemosporidium
+Haemulidae
+haemuloid
+haeremai
+haet
+haff
+haffet
+haffkinize
+haffle
+Hafgan
+hafiz
+hafnium
+hafnyl
+haft
+hafter
+hag
+Haganah
+Hagarite
+hagberry
+hagboat
+hagborn
+hagbush
+hagdon
+hageen
+Hagenia
+hagfish
+haggada
+haggaday
+haggadic
+haggadical
+haggadist
+haggadistic
+haggard
+haggardly
+haggardness
+hagged
+hagger
+haggis
+haggish
+haggishly
+haggishness
+haggister
+haggle
+haggler
+haggly
+haggy
+hagi
+hagia
+hagiarchy
+hagiocracy
+Hagiographa
+hagiographal
+hagiographer
+hagiographic
+hagiographical
+hagiographist
+hagiography
+hagiolater
+hagiolatrous
+hagiolatry
+hagiologic
+hagiological
+hagiologist
+hagiology
+hagiophobia
+hagioscope
+hagioscopic
+haglet
+haglike
+haglin
+hagride
+hagrope
+hagseed
+hagship
+hagstone
+hagtaper
+hagweed
+hagworm
+hah
+Hahnemannian
+Hahnemannism
+Haiathalah
+Haida
+Haidan
+Haidee
+haidingerite
+Haiduk
+haik
+haikai
+haikal
+Haikh
+haikwan
+hail
+hailer
+hailproof
+hailse
+hailshot
+hailstone
+hailstorm
+hailweed
+haily
+Haimavati
+hain
+Hainai
+Hainan
+Hainanese
+hainberry
+haine
+hair
+hairband
+hairbeard
+hairbird
+hairbrain
+hairbreadth
+hairbrush
+haircloth
+haircut
+haircutter
+haircutting
+hairdo
+hairdress
+hairdresser
+hairdressing
+haire
+haired
+hairen
+hairhoof
+hairhound
+hairif
+hairiness
+hairlace
+hairless
+hairlessness
+hairlet
+hairline
+hairlock
+hairmeal
+hairmonger
+hairpin
+hairsplitter
+hairsplitting
+hairspring
+hairstone
+hairstreak
+hairtail
+hairup
+hairweed
+hairwood
+hairwork
+hairworm
+hairy
+Haisla
+Haithal
+Haitian
+haje
+hajib
+hajilij
+hak
+hakam
+hakdar
+hake
+Hakea
+hakeem
+hakenkreuz
+Hakenkreuzler
+hakim
+Hakka
+hako
+haku
+Hal
+hala
+halakah
+halakic
+halakist
+halakistic
+halal
+halalcor
+halation
+Halawi
+halazone
+halberd
+halberdier
+halberdman
+halberdsman
+halbert
+halch
+halcyon
+halcyonian
+halcyonic
+Halcyonidae
+Halcyoninae
+halcyonine
+Haldanite
+hale
+halebi
+Halecomorphi
+haleness
+Halenia
+haler
+halerz
+Halesia
+halesome
+half
+halfback
+halfbeak
+halfer
+halfheaded
+halfhearted
+halfheartedly
+halfheartedness
+halfling
+halfman
+halfness
+halfpace
+halfpaced
+halfpenny
+halfpennyworth
+halfway
+halfwise
+Haliaeetus
+halibios
+halibiotic
+halibiu
+halibut
+halibuter
+Halicarnassean
+Halicarnassian
+Halichondriae
+halichondrine
+halichondroid
+Halicore
+Halicoridae
+halide
+halidom
+halieutic
+halieutically
+halieutics
+Haligonian
+Halimeda
+halimous
+halinous
+haliographer
+haliography
+Haliotidae
+Haliotis
+haliotoid
+haliplankton
+haliplid
+Haliplidae
+Haliserites
+halisteresis
+halisteretic
+halite
+Halitheriidae
+Halitherium
+halitosis
+halituosity
+halituous
+halitus
+hall
+hallabaloo
+hallage
+hallah
+hallan
+hallanshaker
+hallebardier
+hallecret
+halleflinta
+halleflintoid
+hallel
+hallelujah
+hallelujatic
+hallex
+Halleyan
+halliblash
+halling
+hallman
+hallmark
+hallmarked
+hallmarker
+hallmoot
+halloo
+Hallopididae
+hallopodous
+Hallopus
+hallow
+Hallowday
+hallowed
+hallowedly
+hallowedness
+Halloween
+hallower
+Hallowmas
+Hallowtide
+halloysite
+Hallstatt
+Hallstattian
+hallucal
+hallucinate
+hallucination
+hallucinational
+hallucinative
+hallucinator
+hallucinatory
+hallucined
+hallucinosis
+hallux
+hallway
+halma
+halmalille
+halmawise
+halo
+Haloa
+Halobates
+halobios
+halobiotic
+halochromism
+halochromy
+Halocynthiidae
+haloesque
+halogen
+halogenate
+halogenation
+halogenoid
+halogenous
+Halogeton
+halohydrin
+haloid
+halolike
+halolimnic
+halomancy
+halometer
+halomorphic
+halophile
+halophilism
+halophilous
+halophyte
+halophytic
+halophytism
+Halopsyche
+Halopsychidae
+Haloragidaceae
+haloragidaceous
+Halosauridae
+Halosaurus
+haloscope
+Halosphaera
+halotrichite
+haloxene
+hals
+halse
+halsen
+halsfang
+halt
+halter
+halterbreak
+halteres
+Halteridium
+halterproof
+Haltica
+halting
+haltingly
+haltingness
+haltless
+halucket
+halukkah
+halurgist
+halurgy
+halutz
+halvaner
+halvans
+halve
+halved
+halvelings
+halver
+halves
+halyard
+Halysites
+ham
+hamacratic
+Hamadan
+hamadryad
+Hamal
+hamal
+hamald
+Hamamelidaceae
+hamamelidaceous
+Hamamelidanthemum
+hamamelidin
+Hamamelidoxylon
+hamamelin
+Hamamelis
+Hamamelites
+hamartiologist
+hamartiology
+hamartite
+hamate
+hamated
+Hamathite
+hamatum
+hambergite
+hamble
+hambroline
+hamburger
+hame
+hameil
+hamel
+Hamelia
+hamesucken
+hamewith
+hamfat
+hamfatter
+hami
+Hamidian
+Hamidieh
+hamiform
+Hamilton
+Hamiltonian
+Hamiltonianism
+Hamiltonism
+hamingja
+hamirostrate
+Hamital
+Hamite
+Hamites
+Hamitic
+Hamiticized
+Hamitism
+Hamitoid
+hamlah
+hamlet
+hamleted
+hamleteer
+hamletization
+hamletize
+hamlinite
+hammada
+hammam
+hammer
+hammerable
+hammerbird
+hammercloth
+hammerdress
+hammerer
+hammerfish
+hammerhead
+hammerheaded
+hammering
+hammeringly
+hammerkop
+hammerless
+hammerlike
+hammerman
+hammersmith
+hammerstone
+hammertoe
+hammerwise
+hammerwork
+hammerwort
+hammochrysos
+hammock
+hammy
+hamose
+hamous
+hamper
+hamperedly
+hamperedness
+hamperer
+hamperman
+Hampshire
+hamrongite
+hamsa
+hamshackle
+hamster
+hamstring
+hamular
+hamulate
+hamule
+Hamulites
+hamulose
+hamulus
+hamus
+hamza
+han
+Hanafi
+Hanafite
+hanaper
+hanaster
+Hanbalite
+hanbury
+hance
+hanced
+hanch
+hancockite
+hand
+handbag
+handball
+handballer
+handbank
+handbanker
+handbarrow
+handbill
+handblow
+handbolt
+handbook
+handbow
+handbreadth
+handcar
+handcart
+handclap
+handclasp
+handcloth
+handcraft
+handcraftman
+handcraftsman
+handcuff
+handed
+handedness
+Handelian
+hander
+handersome
+handfast
+handfasting
+handfastly
+handfastness
+handflower
+handful
+handgrasp
+handgravure
+handgrip
+handgriping
+handgun
+handhaving
+handhold
+handhole
+handicap
+handicapped
+handicapper
+handicraft
+handicraftship
+handicraftsman
+handicraftsmanship
+handicraftswoman
+handicuff
+handily
+handiness
+handistroke
+handiwork
+handkercher
+handkerchief
+handkerchiefful
+handlaid
+handle
+handleable
+handled
+handleless
+handler
+handless
+handlike
+handling
+handmade
+handmaid
+handmaiden
+handmaidenly
+handout
+handpost
+handprint
+handrail
+handrailing
+handreader
+handreading
+handsale
+handsaw
+handsbreadth
+handscrape
+handsel
+handseller
+handset
+handshake
+handshaker
+handshaking
+handsmooth
+handsome
+handsomeish
+handsomely
+handsomeness
+handspade
+handspike
+handspoke
+handspring
+handstaff
+handstand
+handstone
+handstroke
+handwear
+handwheel
+handwhile
+handwork
+handworkman
+handwrist
+handwrite
+handwriting
+handy
+handyblow
+handybook
+handygrip
+hangability
+hangable
+hangalai
+hangar
+hangbird
+hangby
+hangdog
+hange
+hangee
+hanger
+hangfire
+hangie
+hanging
+hangingly
+hangkang
+hangle
+hangman
+hangmanship
+hangment
+hangnail
+hangnest
+hangout
+hangul
+hangwoman
+hangworm
+hangworthy
+hanif
+hanifism
+hanifite
+hanifiya
+Hank
+hank
+hanker
+hankerer
+hankering
+hankeringly
+hankie
+hankle
+hanksite
+hanky
+hanna
+hannayite
+Hannibal
+Hannibalian
+Hannibalic
+Hano
+Hanoverian
+Hanoverianize
+Hanoverize
+Hans
+hansa
+Hansard
+Hansardization
+Hansardize
+Hanse
+hanse
+Hanseatic
+hansel
+hansgrave
+hansom
+hant
+hantle
+Hanukkah
+Hanuman
+hao
+haole
+haoma
+haori
+hap
+Hapale
+Hapalidae
+hapalote
+Hapalotis
+hapaxanthous
+haphazard
+haphazardly
+haphazardness
+haphtarah
+Hapi
+hapless
+haplessly
+haplessness
+haplite
+haplocaulescent
+haplochlamydeous
+Haplodoci
+Haplodon
+haplodont
+haplodonty
+haplography
+haploid
+haploidic
+haploidy
+haplolaly
+haplologic
+haplology
+haploma
+Haplomi
+haplomid
+haplomous
+haplont
+haploperistomic
+haploperistomous
+haplopetalous
+haplophase
+haplophyte
+haploscope
+haploscopic
+haplosis
+haplostemonous
+haplotype
+haply
+happen
+happening
+happenstance
+happier
+happiest
+happify
+happiless
+happily
+happiness
+happing
+happy
+hapten
+haptene
+haptenic
+haptere
+hapteron
+haptic
+haptics
+haptometer
+haptophor
+haptophoric
+haptophorous
+haptotropic
+haptotropically
+haptotropism
+hapu
+hapuku
+haqueton
+harakeke
+harangue
+harangueful
+haranguer
+Hararese
+Harari
+harass
+harassable
+harassedly
+harasser
+harassingly
+harassment
+haratch
+Haratin
+Haraya
+Harb
+harbergage
+harbi
+harbinge
+harbinger
+harbingership
+harbingery
+harbor
+harborage
+harborer
+harborless
+harborous
+harborside
+harborward
+hard
+hardanger
+hardback
+hardbake
+hardbeam
+hardberry
+harden
+hardenable
+Hardenbergia
+hardener
+hardening
+hardenite
+harder
+Harderian
+hardfern
+hardfist
+hardfisted
+hardfistedness
+hardhack
+hardhanded
+hardhandedness
+hardhead
+hardheaded
+hardheadedly
+hardheadedness
+hardhearted
+hardheartedly
+hardheartedness
+hardihood
+hardily
+hardim
+hardiment
+hardiness
+hardish
+hardishrew
+hardly
+hardmouth
+hardmouthed
+hardness
+hardock
+hardpan
+hardship
+hardstand
+hardstanding
+hardtack
+hardtail
+hardware
+hardwareman
+Hardwickia
+hardwood
+hardy
+hardystonite
+hare
+harebell
+harebottle
+harebrain
+harebrained
+harebrainedly
+harebrainedness
+harebur
+harefoot
+harefooted
+harehearted
+harehound
+Harelda
+harelike
+harelip
+harelipped
+harem
+haremism
+haremlik
+harengiform
+harfang
+haricot
+harigalds
+hariolate
+hariolation
+hariolize
+harish
+hark
+harka
+harl
+Harleian
+Harlemese
+Harlemite
+harlequin
+harlequina
+harlequinade
+harlequinery
+harlequinesque
+harlequinic
+harlequinism
+harlequinize
+harling
+harlock
+harlot
+harlotry
+harm
+Harmachis
+harmal
+harmala
+harmaline
+harman
+harmattan
+harmel
+harmer
+harmful
+harmfully
+harmfulness
+harmine
+harminic
+harmless
+harmlessly
+harmlessness
+Harmon
+harmonia
+harmoniacal
+harmonial
+harmonic
+harmonica
+harmonical
+harmonically
+harmonicalness
+harmonichord
+harmonici
+harmonicism
+harmonicon
+harmonics
+harmonious
+harmoniously
+harmoniousness
+harmoniphon
+harmoniphone
+harmonist
+harmonistic
+harmonistically
+Harmonite
+harmonium
+harmonizable
+harmonization
+harmonize
+harmonizer
+harmonogram
+harmonograph
+harmonometer
+harmony
+harmost
+harmotome
+harmotomic
+harmproof
+harn
+harness
+harnesser
+harnessry
+harnpan
+Harold
+harp
+Harpa
+harpago
+harpagon
+Harpagornis
+Harpalides
+Harpalinae
+Harpalus
+harper
+harperess
+Harpidae
+harpier
+harpings
+harpist
+harpless
+harplike
+Harpocrates
+harpoon
+harpooner
+Harporhynchus
+harpress
+harpsichord
+harpsichordist
+harpula
+Harpullia
+harpwaytuning
+harpwise
+Harpy
+Harpyia
+harpylike
+harquebus
+harquebusade
+harquebusier
+harr
+harrateen
+harridan
+harrier
+Harris
+Harrisia
+harrisite
+Harrovian
+harrow
+harrower
+harrowing
+harrowingly
+harrowingness
+harrowment
+Harry
+harry
+harsh
+harshen
+harshish
+harshly
+harshness
+harshweed
+harstigite
+hart
+hartal
+hartberry
+hartebeest
+hartin
+hartite
+Hartleian
+Hartleyan
+Hartmann
+Hartmannia
+Hartogia
+hartshorn
+hartstongue
+harttite
+Hartungen
+haruspex
+haruspical
+haruspicate
+haruspication
+haruspice
+haruspices
+haruspicy
+Harv
+Harvard
+Harvardian
+Harvardize
+Harveian
+harvest
+harvestbug
+harvester
+harvestless
+harvestman
+harvestry
+harvesttime
+Harvey
+Harveyize
+harzburgite
+hasan
+hasenpfeffer
+hash
+hashab
+hasher
+Hashimite
+hashish
+Hashiya
+hashy
+Hasidean
+Hasidic
+Hasidim
+Hasidism
+Hasinai
+hask
+Haskalah
+haskness
+hasky
+haslet
+haslock
+Hasmonaean
+hasp
+hassar
+hassel
+hassle
+hassock
+hassocky
+hasta
+hastate
+hastately
+hastati
+hastatolanceolate
+hastatosagittate
+haste
+hasteful
+hastefully
+hasteless
+hastelessness
+hasten
+hastener
+hasteproof
+haster
+hastilude
+hastily
+hastiness
+hastings
+hastingsite
+hastish
+hastler
+hasty
+hat
+hatable
+hatband
+hatbox
+hatbrim
+hatbrush
+hatch
+hatchability
+hatchable
+hatchel
+hatcheler
+hatcher
+hatchery
+hatcheryman
+hatchet
+hatchetback
+hatchetfish
+hatchetlike
+hatchetman
+hatchettine
+hatchettolite
+hatchety
+hatchgate
+hatching
+hatchling
+hatchman
+hatchment
+hatchminder
+hatchway
+hatchwayman
+hate
+hateable
+hateful
+hatefully
+hatefulness
+hateless
+hatelessness
+hater
+hatful
+hath
+hatherlite
+hathi
+Hathor
+Hathoric
+Hati
+Hatikvah
+hatless
+hatlessness
+hatlike
+hatmaker
+hatmaking
+hatpin
+hatrack
+hatrail
+hatred
+hatress
+hatstand
+hatt
+hatted
+Hattemist
+hatter
+Hatteria
+hattery
+Hatti
+Hattic
+Hattie
+hatting
+Hattism
+Hattize
+hattock
+Hatty
+hatty
+hau
+hauberget
+hauberk
+hauchecornite
+hauerite
+haugh
+haughland
+haught
+haughtily
+haughtiness
+haughtly
+haughtness
+haughtonite
+haughty
+haul
+haulabout
+haulage
+haulageway
+haulback
+hauld
+hauler
+haulier
+haulm
+haulmy
+haulster
+haunch
+haunched
+hauncher
+haunching
+haunchless
+haunchy
+haunt
+haunter
+hauntingly
+haunty
+Hauranitic
+hauriant
+haurient
+Hausa
+hause
+hausen
+hausmannite
+hausse
+Haussmannization
+Haussmannize
+haustellate
+haustellated
+haustellous
+haustellum
+haustement
+haustorial
+haustorium
+haustral
+haustrum
+hautboy
+hautboyist
+hauteur
+hauynite
+hauynophyre
+havage
+Havaiki
+Havaikian
+Havana
+Havanese
+have
+haveable
+haveage
+havel
+haveless
+havelock
+haven
+havenage
+havener
+havenership
+havenet
+havenful
+havenless
+havent
+havenward
+haver
+havercake
+haverel
+haverer
+havergrass
+havermeal
+havers
+haversack
+Haversian
+haversine
+havier
+havildar
+havingness
+havoc
+havocker
+haw
+Hawaiian
+hawaiite
+hawbuck
+hawcubite
+hawer
+hawfinch
+Hawiya
+hawk
+hawkbill
+hawkbit
+hawked
+hawker
+hawkery
+Hawkeye
+hawkie
+hawking
+hawkish
+hawklike
+hawknut
+hawkweed
+hawkwise
+hawky
+hawm
+hawok
+Haworthia
+hawse
+hawsehole
+hawseman
+hawsepiece
+hawsepipe
+hawser
+hawserwise
+hawthorn
+hawthorned
+hawthorny
+hay
+haya
+hayband
+haybird
+haybote
+haycap
+haycart
+haycock
+haydenite
+hayey
+hayfield
+hayfork
+haygrower
+haylift
+hayloft
+haymaker
+haymaking
+haymarket
+haymow
+hayrack
+hayrake
+hayraker
+hayrick
+hayseed
+haysel
+haystack
+haysuck
+haytime
+hayward
+hayweed
+haywire
+hayz
+Hazara
+hazard
+hazardable
+hazarder
+hazardful
+hazardize
+hazardless
+hazardous
+hazardously
+hazardousness
+hazardry
+haze
+Hazel
+hazel
+hazeled
+hazeless
+hazelly
+hazelnut
+hazelwood
+hazelwort
+hazen
+hazer
+hazily
+haziness
+hazing
+hazle
+haznadar
+hazy
+hazzan
+he
+head
+headache
+headachy
+headband
+headbander
+headboard
+headborough
+headcap
+headchair
+headcheese
+headchute
+headcloth
+headdress
+headed
+headender
+header
+headfirst
+headforemost
+headframe
+headful
+headgear
+headily
+headiness
+heading
+headkerchief
+headland
+headledge
+headless
+headlessness
+headlight
+headlighting
+headlike
+headline
+headliner
+headlock
+headlong
+headlongly
+headlongs
+headlongwise
+headman
+headmark
+headmaster
+headmasterly
+headmastership
+headmistress
+headmistressship
+headmold
+headmost
+headnote
+headpenny
+headphone
+headpiece
+headplate
+headpost
+headquarter
+headquarters
+headrace
+headrail
+headreach
+headrent
+headrest
+headright
+headring
+headroom
+headrope
+headsail
+headset
+headshake
+headship
+headsill
+headskin
+headsman
+headspring
+headstall
+headstand
+headstick
+headstock
+headstone
+headstream
+headstrong
+headstrongly
+headstrongness
+headwaiter
+headwall
+headward
+headwark
+headwater
+headway
+headwear
+headwork
+headworker
+headworking
+heady
+heaf
+heal
+healable
+heald
+healder
+healer
+healful
+healing
+healingly
+healless
+healsome
+healsomeness
+health
+healthcraft
+healthful
+healthfully
+healthfulness
+healthguard
+healthily
+healthiness
+healthless
+healthlessness
+healthsome
+healthsomely
+healthsomeness
+healthward
+healthy
+heap
+heaper
+heaps
+heapstead
+heapy
+hear
+hearable
+hearer
+hearing
+hearingless
+hearken
+hearkener
+hearsay
+hearse
+hearsecloth
+hearselike
+hearst
+heart
+heartache
+heartaching
+heartbeat
+heartbird
+heartblood
+heartbreak
+heartbreaker
+heartbreaking
+heartbreakingly
+heartbroken
+heartbrokenly
+heartbrokenness
+heartburn
+heartburning
+heartdeep
+heartease
+hearted
+heartedly
+heartedness
+hearten
+heartener
+heartening
+hearteningly
+heartfelt
+heartful
+heartfully
+heartfulness
+heartgrief
+hearth
+hearthless
+hearthman
+hearthpenny
+hearthrug
+hearthstead
+hearthstone
+hearthward
+hearthwarming
+heartikin
+heartily
+heartiness
+hearting
+heartland
+heartleaf
+heartless
+heartlessly
+heartlessness
+heartlet
+heartling
+heartly
+heartnut
+heartpea
+heartquake
+heartroot
+hearts
+heartscald
+heartsease
+heartseed
+heartsette
+heartsick
+heartsickening
+heartsickness
+heartsome
+heartsomely
+heartsomeness
+heartsore
+heartstring
+heartthrob
+heartward
+heartwater
+heartweed
+heartwise
+heartwood
+heartwort
+hearty
+heat
+heatable
+heatdrop
+heatedly
+heater
+heaterman
+heatful
+heath
+heathberry
+heathbird
+heathen
+heathendom
+heatheness
+heathenesse
+heathenhood
+heathenish
+heathenishly
+heathenishness
+heathenism
+heathenize
+heathenness
+heathenry
+heathenship
+Heather
+heather
+heathered
+heatheriness
+heathery
+heathless
+heathlike
+heathwort
+heathy
+heating
+heatingly
+heatless
+heatlike
+heatmaker
+heatmaking
+heatproof
+heatronic
+heatsman
+heatstroke
+heaume
+heaumer
+heautarit
+heautomorphism
+Heautontimorumenos
+heautophany
+heave
+heaveless
+heaven
+Heavenese
+heavenful
+heavenhood
+heavenish
+heavenishly
+heavenize
+heavenless
+heavenlike
+heavenliness
+heavenly
+heavens
+heavenward
+heavenwardly
+heavenwardness
+heavenwards
+heaver
+heavies
+heavily
+heaviness
+heaving
+heavisome
+heavity
+heavy
+heavyback
+heavyhanded
+heavyhandedness
+heavyheaded
+heavyhearted
+heavyheartedness
+heavyweight
+hebamic
+hebdomad
+hebdomadal
+hebdomadally
+hebdomadary
+hebdomader
+hebdomarian
+hebdomary
+hebeanthous
+hebecarpous
+hebecladous
+hebegynous
+hebenon
+hebeosteotomy
+hebepetalous
+hebephrenia
+hebephrenic
+hebetate
+hebetation
+hebetative
+hebete
+hebetic
+hebetomy
+hebetude
+hebetudinous
+Hebraean
+Hebraic
+Hebraica
+Hebraical
+Hebraically
+Hebraicize
+Hebraism
+Hebraist
+Hebraistic
+Hebraistical
+Hebraistically
+Hebraization
+Hebraize
+Hebraizer
+Hebrew
+Hebrewdom
+Hebrewess
+Hebrewism
+Hebrician
+Hebridean
+Hebronite
+hebronite
+hecastotheism
+Hecate
+Hecatean
+Hecatic
+Hecatine
+hecatomb
+Hecatombaeon
+hecatomped
+hecatompedon
+hecatonstylon
+hecatontarchy
+hecatontome
+hecatophyllous
+hech
+Hechtia
+heck
+heckelphone
+Heckerism
+heckimal
+heckle
+heckler
+hectare
+hecte
+hectic
+hectical
+hectically
+hecticly
+hecticness
+hectocotyl
+hectocotyle
+hectocotyliferous
+hectocotylization
+hectocotylize
+hectocotylus
+hectogram
+hectograph
+hectographic
+hectography
+hectoliter
+hectometer
+Hector
+hector
+Hectorean
+Hectorian
+hectoringly
+hectorism
+hectorly
+hectorship
+hectostere
+hectowatt
+heddle
+heddlemaker
+heddler
+hedebo
+hedenbergite
+Hedeoma
+heder
+Hedera
+hederaceous
+hederaceously
+hederated
+hederic
+hederiferous
+hederiform
+hederigerent
+hederin
+hederose
+hedge
+hedgeberry
+hedgeborn
+hedgebote
+hedgebreaker
+hedgehog
+hedgehoggy
+hedgehop
+hedgehopper
+hedgeless
+hedgemaker
+hedgemaking
+hedger
+hedgerow
+hedgesmith
+hedgeweed
+hedgewise
+hedgewood
+hedging
+hedgingly
+hedgy
+hedonic
+hedonical
+hedonically
+hedonics
+hedonism
+hedonist
+hedonistic
+hedonistically
+hedonology
+hedriophthalmous
+hedrocele
+hedrumite
+Hedychium
+hedyphane
+Hedysarum
+heed
+heeder
+heedful
+heedfully
+heedfulness
+heedily
+heediness
+heedless
+heedlessly
+heedlessness
+heedy
+heehaw
+heel
+heelball
+heelband
+heelcap
+heeled
+heeler
+heelgrip
+heelless
+heelmaker
+heelmaking
+heelpath
+heelpiece
+heelplate
+heelpost
+heelprint
+heelstrap
+heeltap
+heeltree
+heemraad
+heer
+heeze
+heezie
+heezy
+heft
+hefter
+heftily
+heftiness
+hefty
+hegari
+Hegelian
+Hegelianism
+Hegelianize
+Hegelizer
+hegemon
+hegemonic
+hegemonical
+hegemonist
+hegemonizer
+hegemony
+hegira
+hegumen
+hegumene
+Hehe
+hei
+heiau
+Heidi
+heifer
+heiferhood
+heigh
+heighday
+height
+heighten
+heightener
+heii
+Heikum
+Heiltsuk
+heimin
+Hein
+Heinesque
+Heinie
+heinous
+heinously
+heinousness
+Heinrich
+heintzite
+Heinz
+heir
+heirdom
+heiress
+heiressdom
+heiresshood
+heirless
+heirloom
+heirship
+heirskip
+heitiki
+Hejazi
+Hejazian
+hekteus
+helbeh
+helcoid
+helcology
+helcoplasty
+helcosis
+helcotic
+heldentenor
+helder
+Helderbergian
+hele
+Helen
+Helena
+helenin
+helenioid
+Helenium
+Helenus
+helepole
+Helge
+heliacal
+heliacally
+Heliaea
+heliaean
+Heliamphora
+Heliand
+helianthaceous
+Helianthemum
+helianthic
+helianthin
+Helianthium
+Helianthoidea
+Helianthoidean
+Helianthus
+heliast
+heliastic
+heliazophyte
+helical
+helically
+heliced
+helices
+helichryse
+helichrysum
+Helicidae
+heliciform
+helicin
+Helicina
+helicine
+Helicinidae
+helicitic
+helicline
+helicograph
+helicogyrate
+helicogyre
+helicoid
+helicoidal
+helicoidally
+helicometry
+helicon
+Heliconia
+Heliconian
+Heliconiidae
+Heliconiinae
+heliconist
+Heliconius
+helicoprotein
+helicopter
+helicorubin
+helicotrema
+Helicteres
+helictite
+helide
+Heligmus
+heling
+helio
+heliocentric
+heliocentrical
+heliocentrically
+heliocentricism
+heliocentricity
+heliochrome
+heliochromic
+heliochromoscope
+heliochromotype
+heliochromy
+helioculture
+heliodon
+heliodor
+helioelectric
+helioengraving
+heliofugal
+Heliogabalize
+Heliogabalus
+heliogram
+heliograph
+heliographer
+heliographic
+heliographical
+heliographically
+heliography
+heliogravure
+helioid
+heliolater
+heliolatrous
+heliolatry
+heliolite
+Heliolites
+heliolithic
+Heliolitidae
+heliologist
+heliology
+heliometer
+heliometric
+heliometrical
+heliometrically
+heliometry
+heliomicrometer
+Helion
+heliophilia
+heliophiliac
+heliophilous
+heliophobe
+heliophobia
+heliophobic
+heliophobous
+heliophotography
+heliophyllite
+heliophyte
+Heliopora
+Helioporidae
+Heliopsis
+heliopticon
+Heliornis
+Heliornithes
+Heliornithidae
+Helios
+helioscope
+helioscopic
+helioscopy
+heliosis
+heliostat
+heliostatic
+heliotactic
+heliotaxis
+heliotherapy
+heliothermometer
+Heliothis
+heliotrope
+heliotroper
+Heliotropiaceae
+heliotropian
+heliotropic
+heliotropical
+heliotropically
+heliotropine
+heliotropism
+Heliotropium
+heliotropy
+heliotype
+heliotypic
+heliotypically
+heliotypography
+heliotypy
+Heliozoa
+heliozoan
+heliozoic
+heliport
+Helipterum
+helispheric
+helispherical
+helium
+helix
+helizitic
+hell
+Helladian
+Helladic
+Helladotherium
+hellandite
+hellanodic
+hellbender
+hellborn
+hellbox
+hellbred
+hellbroth
+hellcat
+helldog
+helleboraceous
+helleboraster
+hellebore
+helleborein
+helleboric
+helleborin
+Helleborine
+helleborism
+Helleborus
+Hellelt
+Hellen
+Hellene
+Hellenian
+Hellenic
+Hellenically
+Hellenicism
+Hellenism
+Hellenist
+Hellenistic
+Hellenistical
+Hellenistically
+Hellenisticism
+Hellenization
+Hellenize
+Hellenizer
+Hellenocentric
+Hellenophile
+heller
+helleri
+Hellespont
+Hellespontine
+hellgrammite
+hellhag
+hellhole
+hellhound
+hellicat
+hellier
+hellion
+hellish
+hellishly
+hellishness
+hellkite
+hellness
+hello
+hellroot
+hellship
+helluo
+hellward
+hellweed
+helly
+helm
+helmage
+helmed
+helmet
+helmeted
+helmetlike
+helmetmaker
+helmetmaking
+Helmholtzian
+helminth
+helminthagogic
+helminthagogue
+Helminthes
+helminthiasis
+helminthic
+helminthism
+helminthite
+Helminthocladiaceae
+helminthoid
+helminthologic
+helminthological
+helminthologist
+helminthology
+helminthosporiose
+Helminthosporium
+helminthosporoid
+helminthous
+helmless
+helmsman
+helmsmanship
+helobious
+heloderm
+Heloderma
+Helodermatidae
+helodermatoid
+helodermatous
+helodes
+heloe
+heloma
+Helonias
+helonin
+helosis
+Helot
+helotage
+helotism
+helotize
+helotomy
+helotry
+help
+helpable
+helper
+helpful
+helpfully
+helpfulness
+helping
+helpingly
+helpless
+helplessly
+helplessness
+helply
+helpmate
+helpmeet
+helpsome
+helpworthy
+helsingkite
+helve
+helvell
+Helvella
+Helvellaceae
+helvellaceous
+Helvellales
+helvellic
+helver
+Helvetia
+Helvetian
+Helvetic
+Helvetii
+Helvidian
+helvite
+hem
+hemabarometer
+hemachate
+hemachrome
+hemachrosis
+hemacite
+hemad
+hemadrometer
+hemadrometry
+hemadromograph
+hemadromometer
+hemadynameter
+hemadynamic
+hemadynamics
+hemadynamometer
+hemafibrite
+hemagglutinate
+hemagglutination
+hemagglutinative
+hemagglutinin
+hemagogic
+hemagogue
+hemal
+hemalbumen
+hemamoeba
+hemangioma
+hemangiomatosis
+hemangiosarcoma
+hemaphein
+hemapod
+hemapodous
+hemapoiesis
+hemapoietic
+hemapophyseal
+hemapophysial
+hemapophysis
+hemarthrosis
+hemase
+hemaspectroscope
+hemastatics
+hematachometer
+hematachometry
+hematal
+hematein
+hematemesis
+hematemetic
+hematencephalon
+hematherapy
+hematherm
+hemathermal
+hemathermous
+hemathidrosis
+hematic
+hematid
+hematidrosis
+hematimeter
+hematin
+hematinic
+hematinometer
+hematinometric
+hematinuria
+hematite
+hematitic
+hematobic
+hematobious
+hematobium
+hematoblast
+hematobranchiate
+hematocatharsis
+hematocathartic
+hematocele
+hematochezia
+hematochrome
+hematochyluria
+hematoclasia
+hematoclasis
+hematocolpus
+hematocrit
+hematocryal
+hematocrystallin
+hematocyanin
+hematocyst
+hematocystis
+hematocyte
+hematocytoblast
+hematocytogenesis
+hematocytometer
+hematocytotripsis
+hematocytozoon
+hematocyturia
+hematodynamics
+hematodynamometer
+hematodystrophy
+hematogen
+hematogenesis
+hematogenetic
+hematogenic
+hematogenous
+hematoglobulin
+hematography
+hematohidrosis
+hematoid
+hematoidin
+hematolin
+hematolite
+hematological
+hematologist
+hematology
+hematolymphangioma
+hematolysis
+hematolytic
+hematoma
+hematomancy
+hematometer
+hematometra
+hematometry
+hematomphalocele
+hematomyelia
+hematomyelitis
+hematonephrosis
+hematonic
+hematopathology
+hematopericardium
+hematopexis
+hematophobia
+hematophyte
+hematoplast
+hematoplastic
+hematopoiesis
+hematopoietic
+hematoporphyrin
+hematoporphyrinuria
+hematorrhachis
+hematorrhea
+hematosalpinx
+hematoscope
+hematoscopy
+hematose
+hematosepsis
+hematosin
+hematosis
+hematospectrophotometer
+hematospectroscope
+hematospermatocele
+hematospermia
+hematostibiite
+hematotherapy
+hematothermal
+hematothorax
+hematoxic
+hematozoal
+hematozoan
+hematozoic
+hematozoon
+hematozymosis
+hematozymotic
+hematuresis
+hematuria
+hematuric
+hemautogram
+hemautograph
+hemautographic
+hemautography
+heme
+hemellitene
+hemellitic
+hemelytral
+hemelytron
+hemen
+hemera
+hemeralope
+hemeralopia
+hemeralopic
+Hemerobaptism
+Hemerobaptist
+Hemerobian
+Hemerobiid
+Hemerobiidae
+Hemerobius
+Hemerocallis
+hemerologium
+hemerology
+hemerythrin
+hemiablepsia
+hemiacetal
+hemiachromatopsia
+hemiageusia
+hemiageustia
+hemialbumin
+hemialbumose
+hemialbumosuria
+hemialgia
+hemiamaurosis
+hemiamb
+hemiamblyopia
+hemiamyosthenia
+hemianacusia
+hemianalgesia
+hemianatropous
+hemianesthesia
+hemianopia
+hemianopic
+hemianopsia
+hemianoptic
+hemianosmia
+hemiapraxia
+Hemiascales
+Hemiasci
+Hemiascomycetes
+hemiasynergia
+hemiataxia
+hemiataxy
+hemiathetosis
+hemiatrophy
+hemiazygous
+Hemibasidiales
+Hemibasidii
+Hemibasidiomycetes
+hemibasidium
+hemibathybian
+hemibenthic
+hemibenthonic
+hemibranch
+hemibranchiate
+Hemibranchii
+hemic
+hemicanities
+hemicardia
+hemicardiac
+hemicarp
+hemicatalepsy
+hemicataleptic
+hemicellulose
+hemicentrum
+hemicephalous
+hemicerebrum
+Hemichorda
+hemichordate
+hemichorea
+hemichromatopsia
+hemicircle
+hemicircular
+hemiclastic
+hemicollin
+hemicrane
+hemicrania
+hemicranic
+hemicrany
+hemicrystalline
+hemicycle
+hemicyclic
+hemicyclium
+hemicylindrical
+hemidactylous
+Hemidactylus
+hemidemisemiquaver
+hemidiapente
+hemidiaphoresis
+hemiditone
+hemidomatic
+hemidome
+hemidrachm
+hemidysergia
+hemidysesthesia
+hemidystrophy
+hemiekton
+hemielliptic
+hemiepilepsy
+hemifacial
+hemiform
+Hemigale
+Hemigalus
+Hemiganus
+hemigastrectomy
+hemigeusia
+hemiglossal
+hemiglossitis
+hemiglyph
+hemignathous
+hemihdry
+hemihedral
+hemihedrally
+hemihedric
+hemihedrism
+hemihedron
+hemiholohedral
+hemihydrate
+hemihydrated
+hemihydrosis
+hemihypalgesia
+hemihyperesthesia
+hemihyperidrosis
+hemihypertonia
+hemihypertrophy
+hemihypesthesia
+hemihypoesthesia
+hemihypotonia
+hemikaryon
+hemikaryotic
+hemilaminectomy
+hemilaryngectomy
+Hemileia
+hemilethargy
+hemiligulate
+hemilingual
+hemimellitene
+hemimellitic
+hemimelus
+Hemimeridae
+Hemimerus
+Hemimetabola
+hemimetabole
+hemimetabolic
+hemimetabolism
+hemimetabolous
+hemimetaboly
+hemimetamorphic
+hemimetamorphosis
+hemimetamorphous
+hemimorph
+hemimorphic
+hemimorphism
+hemimorphite
+hemimorphy
+Hemimyaria
+hemin
+hemina
+hemine
+heminee
+hemineurasthenia
+hemiobol
+hemiolia
+hemiolic
+hemionus
+hemiope
+hemiopia
+hemiopic
+hemiorthotype
+hemiparalysis
+hemiparanesthesia
+hemiparaplegia
+hemiparasite
+hemiparasitic
+hemiparasitism
+hemiparesis
+hemiparesthesia
+hemiparetic
+hemipenis
+hemipeptone
+hemiphrase
+hemipic
+hemipinnate
+hemiplane
+hemiplankton
+hemiplegia
+hemiplegic
+hemiplegy
+hemipodan
+hemipode
+Hemipodii
+Hemipodius
+hemiprism
+hemiprismatic
+hemiprotein
+hemipter
+Hemiptera
+hemipteral
+hemipteran
+hemipteroid
+hemipterological
+hemipterology
+hemipteron
+hemipterous
+hemipyramid
+hemiquinonoid
+hemiramph
+Hemiramphidae
+Hemiramphinae
+hemiramphine
+Hemiramphus
+hemisaprophyte
+hemisaprophytic
+hemiscotosis
+hemisect
+hemisection
+hemispasm
+hemispheral
+hemisphere
+hemisphered
+hemispherical
+hemispherically
+hemispheroid
+hemispheroidal
+hemispherule
+hemistater
+hemistich
+hemistichal
+hemistrumectomy
+hemisymmetrical
+hemisymmetry
+hemisystole
+hemiterata
+hemiteratic
+hemiteratics
+hemiteria
+hemiterpene
+hemitery
+hemithyroidectomy
+hemitone
+hemitremor
+hemitrichous
+hemitriglyph
+hemitropal
+hemitrope
+hemitropic
+hemitropism
+hemitropous
+hemitropy
+hemitype
+hemitypic
+hemivagotony
+heml
+hemlock
+hemmel
+hemmer
+hemoalkalimeter
+hemoblast
+hemochromatosis
+hemochrome
+hemochromogen
+hemochromometer
+hemochromometry
+hemoclasia
+hemoclasis
+hemoclastic
+hemocoel
+hemocoele
+hemocoelic
+hemocoelom
+hemoconcentration
+hemoconia
+hemoconiosis
+hemocry
+hemocrystallin
+hemoculture
+hemocyanin
+hemocyte
+hemocytoblast
+hemocytogenesis
+hemocytolysis
+hemocytometer
+hemocytotripsis
+hemocytozoon
+hemocyturia
+hemodiagnosis
+hemodilution
+hemodrometer
+hemodrometry
+hemodromograph
+hemodromometer
+hemodynameter
+hemodynamic
+hemodynamics
+hemodystrophy
+hemoerythrin
+hemoflagellate
+hemofuscin
+hemogastric
+hemogenesis
+hemogenetic
+hemogenic
+hemogenous
+hemoglobic
+hemoglobin
+hemoglobinemia
+hemoglobiniferous
+hemoglobinocholia
+hemoglobinometer
+hemoglobinophilic
+hemoglobinous
+hemoglobinuria
+hemoglobinuric
+hemoglobulin
+hemogram
+hemogregarine
+hemoid
+hemokonia
+hemokoniosis
+hemol
+hemoleucocyte
+hemoleucocytic
+hemologist
+hemology
+hemolymph
+hemolymphatic
+hemolysin
+hemolysis
+hemolytic
+hemolyze
+hemomanometer
+hemometer
+hemometry
+hemonephrosis
+hemopathology
+hemopathy
+hemopericardium
+hemoperitoneum
+hemopexis
+hemophage
+hemophagia
+hemophagocyte
+hemophagocytosis
+hemophagous
+hemophagy
+hemophile
+Hemophileae
+hemophilia
+hemophiliac
+hemophilic
+Hemophilus
+hemophobia
+hemophthalmia
+hemophthisis
+hemopiezometer
+hemoplasmodium
+hemoplastic
+hemopneumothorax
+hemopod
+hemopoiesis
+hemopoietic
+hemoproctia
+hemoptoe
+hemoptysis
+hemopyrrole
+hemorrhage
+hemorrhagic
+hemorrhagin
+hemorrhea
+hemorrhodin
+hemorrhoid
+hemorrhoidal
+hemorrhoidectomy
+hemosalpinx
+hemoscope
+hemoscopy
+hemosiderin
+hemosiderosis
+hemospasia
+hemospastic
+hemospermia
+hemosporid
+hemosporidian
+hemostasia
+hemostasis
+hemostat
+hemostatic
+hemotachometer
+hemotherapeutics
+hemotherapy
+hemothorax
+hemotoxic
+hemotoxin
+hemotrophe
+hemotropic
+hemozoon
+hemp
+hempbush
+hempen
+hemplike
+hempseed
+hempstring
+hempweed
+hempwort
+hempy
+hemstitch
+hemstitcher
+hen
+henad
+henbane
+henbill
+henbit
+hence
+henceforth
+henceforward
+henceforwards
+henchboy
+henchman
+henchmanship
+hencoop
+hencote
+hend
+hendecacolic
+hendecagon
+hendecagonal
+hendecahedron
+hendecane
+hendecasemic
+hendecasyllabic
+hendecasyllable
+hendecatoic
+hendecoic
+hendecyl
+hendiadys
+hendly
+hendness
+heneicosane
+henequen
+henfish
+henhearted
+henhouse
+henhussy
+henism
+henlike
+henmoldy
+henna
+Hennebique
+hennery
+hennin
+hennish
+henny
+henogeny
+henotheism
+henotheist
+henotheistic
+henotic
+henpeck
+henpen
+Henrician
+Henrietta
+henroost
+Henry
+henry
+hent
+Hentenian
+henter
+hentriacontane
+henware
+henwife
+henwise
+henwoodite
+henyard
+heortological
+heortologion
+heortology
+hep
+hepar
+heparin
+heparinize
+hepatalgia
+hepatatrophia
+hepatatrophy
+hepatauxe
+hepatectomy
+hepatic
+Hepatica
+hepatica
+Hepaticae
+hepatical
+hepaticoduodenostomy
+hepaticoenterostomy
+hepaticogastrostomy
+hepaticologist
+hepaticology
+hepaticopulmonary
+hepaticostomy
+hepaticotomy
+hepatite
+hepatitis
+hepatization
+hepatize
+hepatocele
+hepatocirrhosis
+hepatocolic
+hepatocystic
+hepatoduodenal
+hepatoduodenostomy
+hepatodynia
+hepatodysentery
+hepatoenteric
+hepatoflavin
+hepatogastric
+hepatogenic
+hepatogenous
+hepatography
+hepatoid
+hepatolenticular
+hepatolith
+hepatolithiasis
+hepatolithic
+hepatological
+hepatologist
+hepatology
+hepatolysis
+hepatolytic
+hepatoma
+hepatomalacia
+hepatomegalia
+hepatomegaly
+hepatomelanosis
+hepatonephric
+hepatopathy
+hepatoperitonitis
+hepatopexia
+hepatopexy
+hepatophlebitis
+hepatophlebotomy
+hepatophyma
+hepatopneumonic
+hepatoportal
+hepatoptosia
+hepatoptosis
+hepatopulmonary
+hepatorenal
+hepatorrhagia
+hepatorrhaphy
+hepatorrhea
+hepatorrhexis
+hepatorrhoea
+hepatoscopy
+hepatostomy
+hepatotherapy
+hepatotomy
+hepatotoxemia
+hepatoumbilical
+hepcat
+Hephaesteum
+Hephaestian
+Hephaestic
+Hephaestus
+hephthemimer
+hephthemimeral
+hepialid
+Hepialidae
+Hepialus
+heppen
+hepper
+heptacapsular
+heptace
+heptachord
+heptachronous
+heptacolic
+heptacosane
+heptad
+heptadecane
+heptadecyl
+heptaglot
+heptagon
+heptagonal
+heptagynous
+heptahedral
+heptahedrical
+heptahedron
+heptahexahedral
+heptahydrate
+heptahydrated
+heptahydric
+heptahydroxy
+heptal
+heptameride
+Heptameron
+heptamerous
+heptameter
+heptamethylene
+heptametrical
+heptanaphthene
+Heptanchus
+heptandrous
+heptane
+Heptanesian
+heptangular
+heptanoic
+heptanone
+heptapetalous
+heptaphyllous
+heptaploid
+heptaploidy
+heptapodic
+heptapody
+heptarch
+heptarchal
+heptarchic
+heptarchical
+heptarchist
+heptarchy
+heptasemic
+heptasepalous
+heptaspermous
+heptastich
+heptastrophic
+heptastylar
+heptastyle
+heptasulphide
+heptasyllabic
+Heptateuch
+heptatomic
+heptatonic
+Heptatrema
+heptavalent
+heptene
+hepteris
+heptine
+heptite
+heptitol
+heptoic
+heptorite
+heptose
+heptoxide
+Heptranchias
+heptyl
+heptylene
+heptylic
+heptyne
+her
+Heraclean
+Heracleidan
+Heracleonite
+Heracleopolitan
+Heracleopolite
+Heracleum
+Heraclid
+Heraclidae
+Heraclidan
+Heraclitean
+Heracliteanism
+Heraclitic
+Heraclitical
+Heraclitism
+Herakles
+herald
+heraldess
+heraldic
+heraldical
+heraldically
+heraldist
+heraldize
+heraldress
+heraldry
+heraldship
+herapathite
+Herat
+Herb
+herb
+herbaceous
+herbaceously
+herbage
+herbaged
+herbager
+herbagious
+herbal
+herbalism
+herbalist
+herbalize
+herbane
+herbaria
+herbarial
+herbarian
+herbarism
+herbarist
+herbarium
+herbarize
+Herbartian
+Herbartianism
+herbary
+Herbert
+herbescent
+herbicidal
+herbicide
+herbicolous
+herbiferous
+herbish
+herbist
+Herbivora
+herbivore
+herbivority
+herbivorous
+herbless
+herblet
+herblike
+herbman
+herborist
+herborization
+herborize
+herborizer
+herbose
+herbosity
+herbous
+herbwife
+herbwoman
+herby
+hercogamous
+hercogamy
+Herculanean
+Herculanensian
+Herculanian
+Herculean
+Hercules
+Herculid
+Hercynian
+hercynite
+herd
+herdbook
+herdboy
+herder
+herderite
+herdic
+herding
+herdship
+herdsman
+herdswoman
+herdwick
+here
+hereabout
+hereadays
+hereafter
+hereafterward
+hereamong
+hereat
+hereaway
+hereaways
+herebefore
+hereby
+heredipetous
+heredipety
+hereditability
+hereditable
+hereditably
+hereditament
+hereditarian
+hereditarianism
+hereditarily
+hereditariness
+hereditarist
+hereditary
+hereditation
+hereditative
+hereditism
+hereditist
+hereditivity
+heredity
+heredium
+heredofamilial
+heredolues
+heredoluetic
+heredosyphilis
+heredosyphilitic
+heredosyphilogy
+heredotuberculosis
+Hereford
+herefrom
+heregeld
+herein
+hereinabove
+hereinafter
+hereinbefore
+hereinto
+herem
+hereness
+hereniging
+hereof
+hereon
+hereright
+Herero
+heresiarch
+heresimach
+heresiographer
+heresiography
+heresiologer
+heresiologist
+heresiology
+heresy
+heresyphobia
+heresyproof
+heretic
+heretical
+heretically
+hereticalness
+hereticate
+heretication
+hereticator
+hereticide
+hereticize
+hereto
+heretoch
+heretofore
+heretoforetime
+heretoga
+heretrix
+hereunder
+hereunto
+hereupon
+hereward
+herewith
+herewithal
+herile
+heriot
+heriotable
+herisson
+heritability
+heritable
+heritably
+heritage
+heritance
+Heritiera
+heritor
+heritress
+heritrix
+herl
+herling
+herma
+hermaean
+hermaic
+Herman
+hermaphrodite
+hermaphroditic
+hermaphroditical
+hermaphroditically
+hermaphroditish
+hermaphroditism
+hermaphroditize
+Hermaphroditus
+hermeneut
+hermeneutic
+hermeneutical
+hermeneutically
+hermeneutics
+hermeneutist
+Hermes
+Hermesian
+Hermesianism
+Hermetic
+hermetic
+hermetical
+hermetically
+hermeticism
+Hermetics
+Hermetism
+Hermetist
+hermidin
+Herminone
+Hermione
+Hermit
+hermit
+hermitage
+hermitary
+hermitess
+hermitic
+hermitical
+hermitically
+hermitish
+hermitism
+hermitize
+hermitry
+hermitship
+Hermo
+hermodact
+hermodactyl
+Hermogenian
+hermoglyphic
+hermoglyphist
+hermokopid
+hern
+Hernandia
+Hernandiaceae
+hernandiaceous
+hernanesell
+hernani
+hernant
+herne
+hernia
+hernial
+Herniaria
+herniarin
+herniary
+herniate
+herniated
+herniation
+hernioenterotomy
+hernioid
+herniology
+herniopuncture
+herniorrhaphy
+herniotome
+herniotomist
+herniotomy
+hero
+heroarchy
+Herodian
+herodian
+Herodianic
+Herodii
+Herodiones
+herodionine
+heroess
+herohead
+herohood
+heroic
+heroical
+heroically
+heroicalness
+heroicity
+heroicly
+heroicness
+heroicomic
+heroicomical
+heroid
+Heroides
+heroify
+Heroin
+heroin
+heroine
+heroineship
+heroinism
+heroinize
+heroism
+heroistic
+heroization
+heroize
+herolike
+heromonger
+heron
+heroner
+heronite
+heronry
+heroogony
+heroologist
+heroology
+Herophile
+Herophilist
+heroship
+herotheism
+herpes
+Herpestes
+Herpestinae
+herpestine
+herpetic
+herpetiform
+herpetism
+herpetography
+herpetoid
+herpetologic
+herpetological
+herpetologically
+herpetologist
+herpetology
+herpetomonad
+Herpetomonas
+herpetophobia
+herpetotomist
+herpetotomy
+herpolhode
+Herpotrichia
+herrengrundite
+Herrenvolk
+herring
+herringbone
+herringer
+Herrnhuter
+hers
+Herschelian
+herschelite
+herse
+hersed
+herself
+hership
+hersir
+hertz
+hertzian
+Heruli
+Herulian
+Hervati
+Herve
+Herzegovinian
+Hesiodic
+Hesione
+Hesionidae
+hesitance
+hesitancy
+hesitant
+hesitantly
+hesitate
+hesitater
+hesitating
+hesitatingly
+hesitatingness
+hesitation
+hesitative
+hesitatively
+hesitatory
+Hesper
+Hespera
+Hesperia
+Hesperian
+Hesperic
+Hesperid
+hesperid
+hesperidate
+hesperidene
+hesperideous
+Hesperides
+Hesperidian
+hesperidin
+hesperidium
+hesperiid
+Hesperiidae
+hesperinon
+Hesperis
+hesperitin
+Hesperornis
+Hesperornithes
+hesperornithid
+Hesperornithiformes
+hesperornithoid
+Hesperus
+Hessian
+hessite
+hessonite
+hest
+Hester
+hestern
+hesternal
+Hesther
+hesthogenous
+Hesychasm
+Hesychast
+hesychastic
+het
+hetaera
+hetaeria
+hetaeric
+hetaerism
+Hetaerist
+hetaerist
+hetaeristic
+hetaerocracy
+hetaerolite
+hetaery
+heteradenia
+heteradenic
+heterakid
+Heterakis
+Heteralocha
+heterandrous
+heterandry
+heteratomic
+heterauxesis
+heteraxial
+heteric
+heterically
+hetericism
+hetericist
+heterism
+heterization
+heterize
+hetero
+heteroagglutinin
+heteroalbumose
+heteroauxin
+heteroblastic
+heteroblastically
+heteroblasty
+heterocarpism
+heterocarpous
+Heterocarpus
+heterocaseose
+heterocellular
+heterocentric
+heterocephalous
+Heterocera
+heterocerc
+heterocercal
+heterocercality
+heterocercy
+heterocerous
+heterochiral
+heterochlamydeous
+Heterochloridales
+heterochromatic
+heterochromatin
+heterochromatism
+heterochromatization
+heterochromatized
+heterochrome
+heterochromia
+heterochromic
+heterochromosome
+heterochromous
+heterochromy
+heterochronic
+heterochronism
+heterochronistic
+heterochronous
+heterochrony
+heterochrosis
+heterochthon
+heterochthonous
+heterocline
+heteroclinous
+heteroclital
+heteroclite
+heteroclitica
+heteroclitous
+Heterocoela
+heterocoelous
+Heterocotylea
+heterocycle
+heterocyclic
+heterocyst
+heterocystous
+heterodactyl
+Heterodactylae
+heterodactylous
+Heterodera
+Heterodon
+heterodont
+Heterodonta
+Heterodontidae
+heterodontism
+heterodontoid
+Heterodontus
+heterodox
+heterodoxal
+heterodoxical
+heterodoxly
+heterodoxness
+heterodoxy
+heterodromous
+heterodromy
+heterodyne
+heteroecious
+heteroeciously
+heteroeciousness
+heteroecism
+heteroecismal
+heteroecy
+heteroepic
+heteroepy
+heteroerotic
+heteroerotism
+heterofermentative
+heterofertilization
+heterogalactic
+heterogamete
+heterogametic
+heterogametism
+heterogamety
+heterogamic
+heterogamous
+heterogamy
+heterogangliate
+heterogen
+heterogene
+heterogeneal
+heterogenean
+heterogeneity
+heterogeneous
+heterogeneously
+heterogeneousness
+heterogenesis
+heterogenetic
+heterogenic
+heterogenicity
+heterogenist
+heterogenous
+heterogeny
+heteroglobulose
+heterognath
+Heterognathi
+heterogone
+heterogonism
+heterogonous
+heterogonously
+heterogony
+heterograft
+heterographic
+heterographical
+heterography
+Heterogyna
+heterogynal
+heterogynous
+heteroicous
+heteroimmune
+heteroinfection
+heteroinoculable
+heteroinoculation
+heterointoxication
+heterokaryon
+heterokaryosis
+heterokaryotic
+heterokinesis
+heterokinetic
+Heterokontae
+heterokontan
+heterolalia
+heterolateral
+heterolecithal
+heterolith
+heterolobous
+heterologic
+heterological
+heterologically
+heterologous
+heterology
+heterolysin
+heterolysis
+heterolytic
+heteromallous
+heteromastigate
+heteromastigote
+Heteromeles
+Heteromera
+heteromeral
+Heteromeran
+Heteromeri
+heteromeric
+heteromerous
+Heterometabola
+heterometabole
+heterometabolic
+heterometabolism
+heterometabolous
+heterometaboly
+heterometric
+Heteromi
+Heteromita
+Heteromorpha
+Heteromorphae
+heteromorphic
+heteromorphism
+heteromorphite
+heteromorphosis
+heteromorphous
+heteromorphy
+Heteromya
+Heteromyaria
+heteromyarian
+Heteromyidae
+Heteromys
+heteronereid
+heteronereis
+Heteroneura
+heteronomous
+heteronomously
+heteronomy
+heteronuclear
+heteronym
+heteronymic
+heteronymous
+heteronymously
+heteronymy
+heteroousia
+Heteroousian
+heteroousian
+Heteroousiast
+heteroousious
+heteropathic
+heteropathy
+heteropelmous
+heteropetalous
+Heterophaga
+Heterophagi
+heterophagous
+heterophasia
+heterophemism
+heterophemist
+heterophemistic
+heterophemize
+heterophemy
+heterophile
+heterophoria
+heterophoric
+heterophylesis
+heterophyletic
+heterophyllous
+heterophylly
+heterophyly
+heterophyte
+heterophytic
+Heteropia
+Heteropidae
+heteroplasia
+heteroplasm
+heteroplastic
+heteroplasty
+heteroploid
+heteroploidy
+heteropod
+Heteropoda
+heteropodal
+heteropodous
+heteropolar
+heteropolarity
+heteropoly
+heteroproteide
+heteroproteose
+heteropter
+Heteroptera
+heteropterous
+heteroptics
+heteropycnosis
+Heterorhachis
+heteroscope
+heteroscopy
+heterosexual
+heterosexuality
+heteroside
+Heterosiphonales
+heterosis
+Heterosomata
+Heterosomati
+heterosomatous
+heterosome
+Heterosomi
+heterosomous
+Heterosporeae
+heterosporic
+Heterosporium
+heterosporous
+heterospory
+heterostatic
+heterostemonous
+Heterostraca
+heterostracan
+Heterostraci
+heterostrophic
+heterostrophous
+heterostrophy
+heterostyled
+heterostylism
+heterostylous
+heterostyly
+heterosuggestion
+heterosyllabic
+heterotactic
+heterotactous
+heterotaxia
+heterotaxic
+heterotaxis
+heterotaxy
+heterotelic
+heterothallic
+heterothallism
+heterothermal
+heterothermic
+heterotic
+heterotopia
+heterotopic
+heterotopism
+heterotopous
+heterotopy
+heterotransplant
+heterotransplantation
+heterotrich
+Heterotricha
+Heterotrichales
+Heterotrichida
+heterotrichosis
+heterotrichous
+heterotropal
+heterotroph
+heterotrophic
+heterotrophy
+heterotropia
+heterotropic
+heterotropous
+heterotype
+heterotypic
+heterotypical
+heteroxanthine
+heteroxenous
+heterozetesis
+heterozygosis
+heterozygosity
+heterozygote
+heterozygotic
+heterozygous
+heterozygousness
+hething
+hetman
+hetmanate
+hetmanship
+hetter
+hetterly
+Hettie
+Hetty
+heuau
+Heuchera
+heugh
+heulandite
+heumite
+heuretic
+heuristic
+heuristically
+Hevea
+hevi
+hew
+hewable
+hewel
+hewer
+hewettite
+hewhall
+hewn
+hewt
+hex
+hexa
+hexabasic
+Hexabiblos
+hexabiose
+hexabromide
+hexacanth
+hexacanthous
+hexacapsular
+hexacarbon
+hexace
+hexachloride
+hexachlorocyclohexane
+hexachloroethane
+hexachord
+hexachronous
+hexacid
+hexacolic
+Hexacoralla
+hexacorallan
+Hexacorallia
+hexacosane
+hexacosihedroid
+hexact
+hexactinal
+hexactine
+hexactinellid
+Hexactinellida
+hexactinellidan
+hexactinelline
+hexactinian
+hexacyclic
+hexad
+hexadactyle
+hexadactylic
+hexadactylism
+hexadactylous
+hexadactyly
+hexadecahedroid
+hexadecane
+hexadecanoic
+hexadecene
+hexadecyl
+hexadic
+hexadiene
+hexadiyne
+hexafoil
+hexaglot
+hexagon
+hexagonal
+hexagonally
+hexagonial
+hexagonical
+hexagonous
+hexagram
+Hexagrammidae
+hexagrammoid
+Hexagrammos
+hexagyn
+Hexagynia
+hexagynian
+hexagynous
+hexahedral
+hexahedron
+hexahydrate
+hexahydrated
+hexahydric
+hexahydride
+hexahydrite
+hexahydrobenzene
+hexahydroxy
+hexakisoctahedron
+hexakistetrahedron
+hexameral
+hexameric
+hexamerism
+hexameron
+hexamerous
+hexameter
+hexamethylenamine
+hexamethylene
+hexamethylenetetramine
+hexametral
+hexametric
+hexametrical
+hexametrist
+hexametrize
+hexametrographer
+Hexamita
+hexamitiasis
+hexammine
+hexammino
+hexanaphthene
+Hexanchidae
+Hexanchus
+Hexandria
+hexandric
+hexandrous
+hexandry
+hexane
+hexanedione
+hexangular
+hexangularly
+hexanitrate
+hexanitrodiphenylamine
+hexapartite
+hexaped
+hexapetaloid
+hexapetaloideous
+hexapetalous
+hexaphyllous
+hexapla
+hexaplar
+hexaplarian
+hexaplaric
+hexaploid
+hexaploidy
+hexapod
+Hexapoda
+hexapodal
+hexapodan
+hexapodous
+hexapody
+hexapterous
+hexaradial
+hexarch
+hexarchy
+hexaseme
+hexasemic
+hexasepalous
+hexaspermous
+hexastemonous
+hexaster
+hexastich
+hexastichic
+hexastichon
+hexastichous
+hexastichy
+hexastigm
+hexastylar
+hexastyle
+hexastylos
+hexasulphide
+hexasyllabic
+hexatetrahedron
+Hexateuch
+Hexateuchal
+hexathlon
+hexatomic
+hexatriacontane
+hexatriose
+hexavalent
+hexecontane
+hexenbesen
+hexene
+hexer
+hexerei
+hexeris
+hexestrol
+hexicological
+hexicology
+hexine
+hexiological
+hexiology
+hexis
+hexitol
+hexoctahedral
+hexoctahedron
+hexode
+hexoestrol
+hexogen
+hexoic
+hexokinase
+hexone
+hexonic
+hexosamine
+hexosaminic
+hexosan
+hexose
+hexosediphosphoric
+hexosemonophosphoric
+hexosephosphatase
+hexosephosphoric
+hexoylene
+hexpartite
+hexyl
+hexylene
+hexylic
+hexylresorcinol
+hexyne
+hey
+heyday
+Hezron
+Hezronites
+hi
+hia
+Hianakoto
+hiant
+hiatal
+hiate
+hiation
+hiatus
+Hibbertia
+hibbin
+hibernacle
+hibernacular
+hibernaculum
+hibernal
+hibernate
+hibernation
+hibernator
+Hibernia
+Hibernian
+Hibernianism
+Hibernic
+Hibernical
+Hibernically
+Hibernicism
+Hibernicize
+Hibernization
+Hibernize
+Hibernologist
+Hibernology
+Hibiscus
+Hibito
+Hibitos
+Hibunci
+hic
+hicatee
+hiccup
+hick
+hickey
+hickory
+Hicksite
+hickwall
+Hicoria
+hidable
+hidage
+hidalgism
+hidalgo
+hidalgoism
+hidated
+hidation
+Hidatsa
+hidden
+hiddenite
+hiddenly
+hiddenmost
+hiddenness
+hide
+hideaway
+hidebind
+hidebound
+hideboundness
+hided
+hideland
+hideless
+hideling
+hideosity
+hideous
+hideously
+hideousness
+hider
+hidling
+hidlings
+hidradenitis
+hidrocystoma
+hidromancy
+hidropoiesis
+hidrosis
+hidrotic
+hie
+hieder
+hielaman
+hield
+hielmite
+hiemal
+hiemation
+Hienz
+Hieracian
+Hieracium
+hieracosphinx
+hierapicra
+hierarch
+hierarchal
+hierarchic
+hierarchical
+hierarchically
+hierarchism
+hierarchist
+hierarchize
+hierarchy
+hieratic
+hieratical
+hieratically
+hieraticism
+hieratite
+Hierochloe
+hierocracy
+hierocratic
+hierocratical
+hierodule
+hierodulic
+Hierofalco
+hierogamy
+hieroglyph
+hieroglypher
+hieroglyphic
+hieroglyphical
+hieroglyphically
+hieroglyphist
+hieroglyphize
+hieroglyphology
+hieroglyphy
+hierogram
+hierogrammat
+hierogrammate
+hierogrammateus
+hierogrammatic
+hierogrammatical
+hierogrammatist
+hierograph
+hierographer
+hierographic
+hierographical
+hierography
+hierolatry
+hierologic
+hierological
+hierologist
+hierology
+hieromachy
+hieromancy
+hieromnemon
+hieromonach
+hieron
+Hieronymic
+Hieronymite
+hieropathic
+hierophancy
+hierophant
+hierophantes
+hierophantic
+hierophantically
+hierophanticly
+hieros
+hieroscopy
+Hierosolymitan
+Hierosolymite
+hierurgical
+hierurgy
+hifalutin
+higdon
+higgaion
+higginsite
+higgle
+higglehaggle
+higgler
+higglery
+high
+highball
+highbelia
+highbinder
+highborn
+highboy
+highbred
+higher
+highermost
+highest
+highfalutin
+highfaluting
+highfalutinism
+highflying
+highhanded
+highhandedly
+highhandedness
+highhearted
+highheartedly
+highheartedness
+highish
+highjack
+highjacker
+highland
+highlander
+highlandish
+Highlandman
+Highlandry
+highlight
+highliving
+highly
+highman
+highmoor
+highmost
+highness
+highroad
+hight
+hightoby
+hightop
+highway
+highwayman
+higuero
+hijack
+hike
+hiker
+Hilaria
+hilarious
+hilariously
+hilariousness
+hilarity
+Hilary
+Hilarymas
+Hilarytide
+hilasmic
+hilch
+Hilda
+Hildebrand
+Hildebrandian
+Hildebrandic
+Hildebrandine
+Hildebrandism
+Hildebrandist
+Hildebrandslied
+Hildegarde
+hilding
+hiliferous
+hill
+Hillary
+hillberry
+hillbilly
+hillculture
+hillebrandite
+Hillel
+hiller
+hillet
+Hillhousia
+hilliness
+hillman
+hillock
+hillocked
+hillocky
+hillsale
+hillsalesman
+hillside
+hillsman
+hilltop
+hilltrot
+hillward
+hillwoman
+hilly
+hilsa
+hilt
+hiltless
+hilum
+hilus
+him
+Hima
+Himalaya
+Himalayan
+Himantopus
+himation
+Himawan
+himp
+himself
+himward
+himwards
+Himyaric
+Himyarite
+Himyaritic
+hin
+hinau
+Hinayana
+hinch
+hind
+hindberry
+hindbrain
+hindcast
+hinddeck
+hinder
+hinderance
+hinderer
+hinderest
+hinderful
+hinderfully
+hinderingly
+hinderlands
+hinderlings
+hinderlins
+hinderly
+hinderment
+hindermost
+hindersome
+hindhand
+hindhead
+Hindi
+hindmost
+hindquarter
+hindrance
+hindsaddle
+hindsight
+Hindu
+Hinduism
+Hinduize
+Hindustani
+hindward
+hing
+hinge
+hingecorner
+hingeflower
+hingeless
+hingelike
+hinger
+hingeways
+hingle
+hinney
+hinnible
+Hinnites
+hinny
+hinoid
+hinoideous
+hinoki
+hinsdalite
+hint
+hintedly
+hinter
+hinterland
+hintingly
+hintproof
+hintzeite
+Hiodon
+hiodont
+Hiodontidae
+hiortdahlite
+hip
+hipbone
+hipe
+hiper
+hiphalt
+hipless
+hipmold
+Hippa
+hippalectryon
+hipparch
+Hipparion
+Hippeastrum
+hipped
+Hippelates
+hippen
+Hippia
+hippian
+hippiater
+hippiatric
+hippiatrical
+hippiatrics
+hippiatrist
+hippiatry
+hippic
+Hippidae
+Hippidion
+Hippidium
+hipping
+hippish
+hipple
+hippo
+Hippobosca
+hippoboscid
+Hippoboscidae
+hippocamp
+hippocampal
+hippocampi
+hippocampine
+hippocampus
+Hippocastanaceae
+hippocastanaceous
+hippocaust
+hippocentaur
+hippocentauric
+hippocerf
+hippocoprosterol
+hippocras
+Hippocratea
+Hippocrateaceae
+hippocrateaceous
+Hippocratian
+Hippocratic
+Hippocratical
+Hippocratism
+Hippocrene
+Hippocrenian
+hippocrepian
+hippocrepiform
+Hippodamia
+hippodamous
+hippodrome
+hippodromic
+hippodromist
+hippogastronomy
+Hippoglosinae
+Hippoglossidae
+Hippoglossus
+hippogriff
+hippogriffin
+hippoid
+hippolite
+hippolith
+hippological
+hippologist
+hippology
+Hippolytan
+Hippolyte
+Hippolytidae
+Hippolytus
+hippomachy
+hippomancy
+hippomanes
+Hippomedon
+hippomelanin
+Hippomenes
+hippometer
+hippometric
+hippometry
+Hipponactean
+hipponosological
+hipponosology
+hippopathological
+hippopathology
+hippophagi
+hippophagism
+hippophagist
+hippophagistical
+hippophagous
+hippophagy
+hippophile
+hippophobia
+hippopod
+hippopotami
+hippopotamian
+hippopotamic
+Hippopotamidae
+hippopotamine
+hippopotamoid
+hippopotamus
+Hipposelinum
+hippotigrine
+Hippotigris
+hippotomical
+hippotomist
+hippotomy
+hippotragine
+Hippotragus
+hippurate
+hippuric
+hippurid
+Hippuridaceae
+Hippuris
+hippurite
+Hippurites
+hippuritic
+Hippuritidae
+hippuritoid
+hippus
+hippy
+hipshot
+hipwort
+hirable
+hiragana
+Hiram
+Hiramite
+hircarra
+hircine
+hircinous
+hircocerf
+hircocervus
+hircosity
+hire
+hired
+hireless
+hireling
+hireman
+Hiren
+hirer
+hirmologion
+hirmos
+Hirneola
+hiro
+Hirofumi
+hirondelle
+Hirotoshi
+Hiroyuki
+hirple
+hirrient
+hirse
+hirsel
+hirsle
+hirsute
+hirsuteness
+hirsuties
+hirsutism
+hirsutulous
+Hirtella
+hirtellous
+Hirudin
+hirudine
+Hirudinea
+hirudinean
+hirudiniculture
+Hirudinidae
+hirudinize
+hirudinoid
+Hirudo
+hirundine
+Hirundinidae
+hirundinous
+Hirundo
+his
+hish
+hisingerite
+hisn
+Hispa
+Hispania
+Hispanic
+Hispanicism
+Hispanicize
+hispanidad
+Hispaniolate
+Hispaniolize
+Hispanist
+Hispanize
+Hispanophile
+Hispanophobe
+hispid
+hispidity
+hispidulate
+hispidulous
+Hispinae
+hiss
+hisser
+hissing
+hissingly
+hissproof
+hist
+histaminase
+histamine
+histaminic
+histidine
+histie
+histiocyte
+histiocytic
+histioid
+histiology
+Histiophoridae
+Histiophorus
+histoblast
+histochemic
+histochemical
+histochemistry
+histoclastic
+histocyte
+histodiagnosis
+histodialysis
+histodialytic
+histogen
+histogenesis
+histogenetic
+histogenetically
+histogenic
+histogenous
+histogeny
+histogram
+histographer
+histographic
+histographical
+histography
+histoid
+histologic
+histological
+histologically
+histologist
+histology
+histolysis
+histolytic
+histometabasis
+histomorphological
+histomorphologically
+histomorphology
+histon
+histonal
+histone
+histonomy
+histopathologic
+histopathological
+histopathologist
+histopathology
+histophyly
+histophysiological
+histophysiology
+Histoplasma
+histoplasmin
+histoplasmosis
+historial
+historian
+historiated
+historic
+historical
+historically
+historicalness
+historician
+historicism
+historicity
+historicize
+historicocabbalistical
+historicocritical
+historicocultural
+historicodogmatic
+historicogeographical
+historicophilosophica
+historicophysical
+historicopolitical
+historicoprophetic
+historicoreligious
+historics
+historicus
+historied
+historier
+historiette
+historify
+historiograph
+historiographer
+historiographership
+historiographic
+historiographical
+historiographically
+historiography
+historiological
+historiology
+historiometric
+historiometry
+historionomer
+historious
+historism
+historize
+history
+histotherapist
+histotherapy
+histotome
+histotomy
+histotrophic
+histotrophy
+histotropic
+histozoic
+histozyme
+histrio
+Histriobdella
+Histriomastix
+histrion
+histrionic
+histrionical
+histrionically
+histrionicism
+histrionism
+hit
+hitch
+hitcher
+hitchhike
+hitchhiker
+hitchily
+hitchiness
+Hitchiti
+hitchproof
+hitchy
+hithe
+hither
+hithermost
+hitherto
+hitherward
+Hitlerism
+Hitlerite
+hitless
+Hitoshi
+hittable
+hitter
+Hittite
+Hittitics
+Hittitology
+Hittology
+hive
+hiveless
+hiver
+hives
+hiveward
+Hivite
+hizz
+Hler
+Hlidhskjalf
+Hlithskjalf
+Hlorrithi
+Ho
+ho
+hoar
+hoard
+hoarder
+hoarding
+hoardward
+hoarfrost
+hoarhead
+hoarheaded
+hoarhound
+hoarily
+hoariness
+hoarish
+hoarness
+hoarse
+hoarsely
+hoarsen
+hoarseness
+hoarstone
+hoarwort
+hoary
+hoaryheaded
+hoast
+hoastman
+hoatzin
+hoax
+hoaxee
+hoaxer
+hoaxproof
+hob
+hobber
+Hobbesian
+hobbet
+Hobbian
+hobbil
+Hobbism
+Hobbist
+Hobbistical
+hobble
+hobblebush
+hobbledehoy
+hobbledehoydom
+hobbledehoyhood
+hobbledehoyish
+hobbledehoyishness
+hobbledehoyism
+hobbledygee
+hobbler
+hobbling
+hobblingly
+hobbly
+hobby
+hobbyhorse
+hobbyhorsical
+hobbyhorsically
+hobbyism
+hobbyist
+hobbyless
+hobgoblin
+hoblike
+hobnail
+hobnailed
+hobnailer
+hobnob
+hobo
+hoboism
+Hobomoco
+hobthrush
+hocco
+Hochelaga
+Hochheimer
+hock
+Hockday
+hockelty
+hocker
+hocket
+hockey
+hockshin
+Hocktide
+hocky
+hocus
+hod
+hodden
+hodder
+hoddle
+hoddy
+hodening
+hodful
+hodgepodge
+Hodgkin
+hodgkinsonite
+hodiernal
+hodman
+hodmandod
+hodograph
+hodometer
+hodometrical
+hoe
+hoecake
+hoedown
+hoeful
+hoer
+hoernesite
+Hoffmannist
+Hoffmannite
+hog
+hoga
+hogan
+Hogarthian
+hogback
+hogbush
+hogfish
+hogframe
+hogged
+hogger
+hoggerel
+hoggery
+hogget
+hoggie
+hoggin
+hoggish
+hoggishly
+hoggishness
+hoggism
+hoggy
+hogherd
+hoghide
+hoghood
+hoglike
+hogling
+hogmace
+hogmanay
+Hogni
+hognose
+hognut
+hogpen
+hogreeve
+hogrophyte
+hogshead
+hogship
+hogshouther
+hogskin
+hogsty
+hogward
+hogwash
+hogweed
+hogwort
+hogyard
+Hohe
+Hohenzollern
+Hohenzollernism
+Hohn
+Hohokam
+hoi
+hoick
+hoin
+hoise
+hoist
+hoistaway
+hoister
+hoisting
+hoistman
+hoistway
+hoit
+hoju
+Hokan
+hokey
+hokeypokey
+hokum
+holagogue
+holarctic
+holard
+holarthritic
+holarthritis
+holaspidean
+holcad
+holcodont
+Holconoti
+Holcus
+hold
+holdable
+holdall
+holdback
+holden
+holdenite
+holder
+holdership
+holdfast
+holdfastness
+holding
+holdingly
+holdout
+holdover
+holdsman
+holdup
+hole
+holeable
+Holectypina
+holectypoid
+holeless
+holeman
+holeproof
+holer
+holethnic
+holethnos
+holewort
+holey
+holia
+holiday
+holidayer
+holidayism
+holidaymaker
+holidaymaking
+holily
+holiness
+holing
+holinight
+holism
+holistic
+holistically
+holl
+holla
+hollaite
+Holland
+hollandaise
+Hollander
+Hollandish
+hollandite
+Hollands
+Hollantide
+holler
+hollin
+holliper
+hollo
+hollock
+hollong
+hollow
+hollower
+hollowfaced
+hollowfoot
+hollowhearted
+hollowheartedness
+hollowly
+hollowness
+holluschick
+Holly
+holly
+hollyhock
+Hollywood
+Hollywooder
+Hollywoodize
+holm
+holmberry
+holmgang
+holmia
+holmic
+holmium
+holmos
+holobaptist
+holobenthic
+holoblastic
+holoblastically
+holobranch
+holocaine
+holocarpic
+holocarpous
+holocaust
+holocaustal
+holocaustic
+Holocene
+holocentrid
+Holocentridae
+holocentroid
+Holocentrus
+Holocephala
+holocephalan
+Holocephali
+holocephalian
+holocephalous
+Holochoanites
+holochoanitic
+holochoanoid
+Holochoanoida
+holochoanoidal
+holochordate
+holochroal
+holoclastic
+holocrine
+holocryptic
+holocrystalline
+holodactylic
+holodedron
+Holodiscus
+hologamous
+hologamy
+hologastrula
+hologastrular
+Holognatha
+holognathous
+hologonidium
+holograph
+holographic
+holographical
+holohedral
+holohedric
+holohedrism
+holohemihedral
+holohyaline
+holomastigote
+Holometabola
+holometabole
+holometabolian
+holometabolic
+holometabolism
+holometabolous
+holometaboly
+holometer
+holomorph
+holomorphic
+holomorphism
+holomorphosis
+holomorphy
+Holomyaria
+holomyarian
+Holomyarii
+holoparasite
+holoparasitic
+Holophane
+holophane
+holophotal
+holophote
+holophotometer
+holophrase
+holophrasis
+holophrasm
+holophrastic
+holophyte
+holophytic
+holoplankton
+holoplanktonic
+holoplexia
+holopneustic
+holoproteide
+holoptic
+holoptychian
+holoptychiid
+Holoptychiidae
+Holoptychius
+holoquinoid
+holoquinoidal
+holoquinonic
+holoquinonoid
+holorhinal
+holosaprophyte
+holosaprophytic
+holosericeous
+holoside
+holosiderite
+Holosiphona
+holosiphonate
+Holosomata
+holosomatous
+holospondaic
+holostean
+Holostei
+holosteous
+holosteric
+Holosteum
+Holostomata
+holostomate
+holostomatous
+holostome
+holostomous
+holostylic
+holosymmetric
+holosymmetrical
+holosymmetry
+holosystematic
+holosystolic
+holothecal
+holothoracic
+Holothuria
+holothurian
+Holothuridea
+holothurioid
+Holothurioidea
+holotonia
+holotonic
+holotony
+holotrich
+Holotricha
+holotrichal
+Holotrichida
+holotrichous
+holotype
+holour
+holozoic
+Holstein
+holster
+holstered
+holt
+holy
+holyday
+holyokeite
+holystone
+holytide
+homage
+homageable
+homager
+Homalocenchrus
+homalogonatous
+homalographic
+homaloid
+homaloidal
+Homalonotus
+Homalopsinae
+Homaloptera
+Homalopterous
+homalosternal
+Homalosternii
+Homam
+Homaridae
+homarine
+homaroid
+Homarus
+homatomic
+homaxial
+homaxonial
+homaxonic
+Homburg
+home
+homebody
+homeborn
+homebound
+homebred
+homecomer
+homecraft
+homecroft
+homecrofter
+homecrofting
+homefarer
+homefelt
+homegoer
+homekeeper
+homekeeping
+homeland
+homelander
+homeless
+homelessly
+homelessness
+homelet
+homelike
+homelikeness
+homelily
+homeliness
+homeling
+homely
+homelyn
+homemade
+homemaker
+homemaking
+homeoblastic
+homeochromatic
+homeochromatism
+homeochronous
+homeocrystalline
+homeogenic
+homeogenous
+homeoid
+homeoidal
+homeoidality
+homeokinesis
+homeokinetic
+homeomerous
+homeomorph
+homeomorphic
+homeomorphism
+homeomorphous
+homeomorphy
+homeopath
+homeopathic
+homeopathically
+homeopathician
+homeopathicity
+homeopathist
+homeopathy
+homeophony
+homeoplasia
+homeoplastic
+homeoplasy
+homeopolar
+homeosis
+homeostasis
+homeostatic
+homeotic
+homeotransplant
+homeotransplantation
+homeotype
+homeotypic
+homeotypical
+homeowner
+homeozoic
+Homer
+homer
+Homerian
+Homeric
+Homerical
+Homerically
+Homerid
+Homeridae
+Homeridian
+Homerist
+Homerologist
+Homerology
+Homeromastix
+homeseeker
+homesick
+homesickly
+homesickness
+homesite
+homesome
+homespun
+homestall
+homestead
+homesteader
+homester
+homestretch
+homeward
+homewardly
+homework
+homeworker
+homewort
+homey
+homeyness
+homicidal
+homicidally
+homicide
+homicidious
+homiculture
+homilete
+homiletic
+homiletical
+homiletically
+homiletics
+homiliarium
+homiliary
+homilist
+homilite
+homilize
+homily
+hominal
+hominess
+Hominian
+hominid
+Hominidae
+hominiform
+hominify
+hominine
+hominisection
+hominivorous
+hominoid
+hominy
+homish
+homishness
+homo
+homoanisaldehyde
+homoanisic
+homoarecoline
+homobaric
+homoblastic
+homoblasty
+homocarpous
+homocategoric
+homocentric
+homocentrical
+homocentrically
+homocerc
+homocercal
+homocercality
+homocercy
+homocerebrin
+homochiral
+homochlamydeous
+homochromatic
+homochromatism
+homochrome
+homochromic
+homochromosome
+homochromous
+homochromy
+homochronous
+homoclinal
+homocline
+Homocoela
+homocoelous
+homocreosol
+homocyclic
+homodermic
+homodermy
+homodont
+homodontism
+homodox
+homodoxian
+homodromal
+homodrome
+homodromous
+homodromy
+homodynamic
+homodynamous
+homodynamy
+homodyne
+Homoean
+Homoeanism
+homoecious
+homoeoarchy
+homoeoblastic
+homoeochromatic
+homoeochronous
+homoeocrystalline
+homoeogenic
+homoeogenous
+homoeography
+homoeokinesis
+homoeomerae
+Homoeomeri
+homoeomeria
+homoeomerian
+homoeomerianism
+homoeomeric
+homoeomerical
+homoeomerous
+homoeomery
+homoeomorph
+homoeomorphic
+homoeomorphism
+homoeomorphous
+homoeomorphy
+homoeopath
+homoeopathic
+homoeopathically
+homoeopathician
+homoeopathicity
+homoeopathist
+homoeopathy
+homoeophony
+homoeophyllous
+homoeoplasia
+homoeoplastic
+homoeoplasy
+homoeopolar
+homoeosis
+homoeotel
+homoeoteleutic
+homoeoteleuton
+homoeotic
+homoeotopy
+homoeotype
+homoeotypic
+homoeotypical
+homoeozoic
+homoerotic
+homoerotism
+homofermentative
+homogametic
+homogamic
+homogamous
+homogamy
+homogangliate
+homogen
+homogenate
+homogene
+homogeneal
+homogenealness
+homogeneate
+homogeneity
+homogeneization
+homogeneize
+homogeneous
+homogeneously
+homogeneousness
+homogenesis
+homogenetic
+homogenetical
+homogenic
+homogenization
+homogenize
+homogenizer
+homogenous
+homogentisic
+homogeny
+homoglot
+homogone
+homogonous
+homogonously
+homogony
+homograft
+homograph
+homographic
+homography
+homohedral
+homoiotherm
+homoiothermal
+homoiothermic
+homoiothermism
+homoiothermous
+homoiousia
+Homoiousian
+homoiousian
+Homoiousianism
+homoiousious
+homolateral
+homolecithal
+homolegalis
+homologate
+homologation
+homologic
+homological
+homologically
+homologist
+homologize
+homologizer
+homologon
+homologoumena
+homologous
+homolographic
+homolography
+homologue
+homology
+homolosine
+homolysin
+homolysis
+homomallous
+homomeral
+homomerous
+homometrical
+homometrically
+homomorph
+Homomorpha
+homomorphic
+homomorphism
+homomorphosis
+homomorphous
+homomorphy
+Homoneura
+homonomous
+homonomy
+homonuclear
+homonym
+homonymic
+homonymous
+homonymously
+homonymy
+homoousia
+Homoousian
+Homoousianism
+Homoousianist
+Homoousiast
+Homoousion
+homoousious
+homopathy
+homoperiodic
+homopetalous
+homophene
+homophenous
+homophone
+homophonic
+homophonous
+homophony
+homophthalic
+homophylic
+homophyllous
+homophyly
+homopiperonyl
+homoplasis
+homoplasmic
+homoplasmy
+homoplast
+homoplastic
+homoplasy
+homopolar
+homopolarity
+homopolic
+homopter
+Homoptera
+homopteran
+homopteron
+homopterous
+Homorelaps
+homorganic
+homoseismal
+homosexual
+homosexualism
+homosexualist
+homosexuality
+homosporous
+homospory
+Homosteus
+homostyled
+homostylic
+homostylism
+homostylous
+homostyly
+homosystemic
+homotactic
+homotatic
+homotaxeous
+homotaxia
+homotaxial
+homotaxially
+homotaxic
+homotaxis
+homotaxy
+homothallic
+homothallism
+homothetic
+homothety
+homotonic
+homotonous
+homotonously
+homotony
+homotopic
+homotransplant
+homotransplantation
+homotropal
+homotropous
+homotypal
+homotype
+homotypic
+homotypical
+homotypy
+homovanillic
+homovanillin
+homoveratric
+homoveratrole
+homozygosis
+homozygosity
+homozygote
+homozygous
+homozygousness
+homrai
+homuncle
+homuncular
+homunculus
+homy
+Hon
+honda
+hondo
+Honduran
+Honduranean
+Honduranian
+Hondurean
+Hondurian
+hone
+honest
+honestly
+honestness
+honestone
+honesty
+honewort
+honey
+honeybee
+honeyberry
+honeybind
+honeyblob
+honeybloom
+honeycomb
+honeycombed
+honeydew
+honeydewed
+honeydrop
+honeyed
+honeyedly
+honeyedness
+honeyfall
+honeyflower
+honeyfogle
+honeyful
+honeyhearted
+honeyless
+honeylike
+honeylipped
+honeymoon
+honeymooner
+honeymoonlight
+honeymoonshine
+honeymoonstruck
+honeymoony
+honeymouthed
+honeypod
+honeypot
+honeystone
+honeysuck
+honeysucker
+honeysuckle
+honeysuckled
+honeysweet
+honeyware
+Honeywood
+honeywood
+honeywort
+hong
+honied
+honily
+honk
+honker
+honor
+Honora
+honorability
+honorable
+honorableness
+honorableship
+honorably
+honorance
+honoraria
+honorarily
+honorarium
+honorary
+honoree
+honorer
+honoress
+honorific
+honorifically
+honorless
+honorous
+honorsman
+honorworthy
+hontish
+hontous
+Honzo
+hooch
+hoochinoo
+hood
+hoodcap
+hooded
+hoodedness
+hoodful
+hoodie
+hoodless
+hoodlike
+hoodlum
+hoodlumish
+hoodlumism
+hoodlumize
+hoodman
+hoodmold
+hoodoo
+hoodsheaf
+hoodshy
+hoodshyness
+hoodwink
+hoodwinkable
+hoodwinker
+hoodwise
+hoodwort
+hooey
+hoof
+hoofbeat
+hoofbound
+hoofed
+hoofer
+hoofiness
+hoofish
+hoofless
+hooflet
+hooflike
+hoofmark
+hoofprint
+hoofrot
+hoofs
+hoofworm
+hoofy
+hook
+hookah
+hookaroon
+hooked
+hookedness
+hookedwise
+hooker
+Hookera
+hookerman
+hookers
+hookheal
+hookish
+hookless
+hooklet
+hooklike
+hookmaker
+hookmaking
+hookman
+hooknose
+hooksmith
+hooktip
+hookum
+hookup
+hookweed
+hookwise
+hookworm
+hookwormer
+hookwormy
+hooky
+hooligan
+hooliganism
+hooliganize
+hoolock
+hooly
+hoon
+hoonoomaun
+hoop
+hooped
+hooper
+hooping
+hoopla
+hoople
+hoopless
+hooplike
+hoopmaker
+hoopman
+hoopoe
+hoopstick
+hoopwood
+hoose
+hoosegow
+hoosh
+Hoosier
+Hoosierdom
+Hoosierese
+Hoosierize
+hoot
+hootay
+hooter
+hootingly
+hoove
+hooven
+Hooverism
+Hooverize
+hoovey
+hop
+hopbine
+hopbush
+Hopcalite
+hopcrease
+hope
+hoped
+hopeful
+hopefully
+hopefulness
+hopeite
+hopeless
+hopelessly
+hopelessness
+hoper
+Hopi
+hopi
+hopingly
+Hopkinsian
+Hopkinsianism
+Hopkinsonian
+hoplite
+hoplitic
+hoplitodromos
+Hoplocephalus
+hoplology
+hoplomachic
+hoplomachist
+hoplomachos
+hoplomachy
+Hoplonemertea
+hoplonemertean
+hoplonemertine
+Hoplonemertini
+hopoff
+hopped
+hopper
+hopperburn
+hopperdozer
+hopperette
+hoppergrass
+hopperings
+hopperman
+hoppers
+hoppestere
+hoppet
+hoppingly
+hoppity
+hopple
+hoppy
+hopscotch
+hopscotcher
+hoptoad
+hopvine
+hopyard
+hora
+horal
+horary
+Horatian
+Horatio
+Horatius
+horbachite
+hordarian
+hordary
+horde
+hordeaceous
+hordeiform
+hordein
+hordenine
+Hordeum
+horehound
+Horim
+horismology
+horizometer
+horizon
+horizonless
+horizontal
+horizontalism
+horizontality
+horizontalization
+horizontalize
+horizontally
+horizontalness
+horizontic
+horizontical
+horizontically
+horizonward
+horme
+hormic
+hormigo
+hormion
+hormist
+hormogon
+Hormogonales
+Hormogoneae
+Hormogoneales
+hormogonium
+hormogonous
+hormonal
+hormone
+hormonic
+hormonize
+hormonogenesis
+hormonogenic
+hormonology
+hormonopoiesis
+hormonopoietic
+hormos
+horn
+hornbeam
+hornbill
+hornblende
+hornblendic
+hornblendite
+hornblendophyre
+hornblower
+hornbook
+horned
+hornedness
+horner
+hornerah
+hornet
+hornety
+hornfair
+hornfels
+hornfish
+hornful
+horngeld
+Hornie
+hornify
+hornily
+horniness
+horning
+hornish
+hornist
+hornito
+hornless
+hornlessness
+hornlet
+hornlike
+hornotine
+hornpipe
+hornplant
+hornsman
+hornstay
+hornstone
+hornswoggle
+horntail
+hornthumb
+horntip
+hornwood
+hornwork
+hornworm
+hornwort
+horny
+hornyhanded
+hornyhead
+horograph
+horographer
+horography
+horokaka
+horologe
+horologer
+horologic
+horological
+horologically
+horologiography
+horologist
+horologium
+horologue
+horology
+horometrical
+horometry
+Horonite
+horopito
+horopter
+horopteric
+horoptery
+horoscopal
+horoscope
+horoscoper
+horoscopic
+horoscopical
+horoscopist
+horoscopy
+Horouta
+horrendous
+horrendously
+horrent
+horrescent
+horreum
+horribility
+horrible
+horribleness
+horribly
+horrid
+horridity
+horridly
+horridness
+horrific
+horrifically
+horrification
+horrify
+horripilant
+horripilate
+horripilation
+horrisonant
+horror
+horrorful
+horrorish
+horrorist
+horrorize
+horrormonger
+horrormongering
+horrorous
+horrorsome
+horse
+horseback
+horsebacker
+horseboy
+horsebreaker
+horsecar
+horsecloth
+horsecraft
+horsedom
+horsefair
+horsefettler
+horsefight
+horsefish
+horseflesh
+horsefly
+horsefoot
+horsegate
+horsehair
+horsehaired
+horsehead
+horseherd
+horsehide
+horsehood
+horsehoof
+horsejockey
+horsekeeper
+horselaugh
+horselaugher
+horselaughter
+horseleech
+horseless
+horselike
+horseload
+horseman
+horsemanship
+horsemastership
+horsemint
+horsemonger
+horseplay
+horseplayful
+horsepond
+horsepower
+horsepox
+horser
+horseshoe
+horseshoer
+horsetail
+horsetongue
+Horsetown
+horsetree
+horseway
+horseweed
+horsewhip
+horsewhipper
+horsewoman
+horsewomanship
+horsewood
+horsfordite
+horsify
+horsily
+horsiness
+horsing
+Horst
+horst
+horsy
+horsyism
+hortation
+hortative
+hortatively
+hortator
+hortatorily
+hortatory
+Hortense
+Hortensia
+hortensial
+Hortensian
+hortensian
+horticultural
+horticulturally
+horticulture
+horticulturist
+hortite
+hortonolite
+hortulan
+Horvatian
+hory
+Hosackia
+hosanna
+hose
+hosed
+hosel
+hoseless
+hoselike
+hoseman
+hosier
+hosiery
+hosiomartyr
+hospice
+hospitable
+hospitableness
+hospitably
+hospitage
+hospital
+hospitalary
+hospitaler
+hospitalism
+hospitality
+hospitalization
+hospitalize
+hospitant
+hospitate
+hospitation
+hospitator
+hospitious
+hospitium
+hospitize
+hospodar
+hospodariat
+hospodariate
+host
+Hosta
+hostage
+hostager
+hostageship
+hostel
+hosteler
+hostelry
+hoster
+hostess
+hostie
+hostile
+hostilely
+hostileness
+hostility
+hostilize
+hosting
+hostler
+hostlership
+hostlerwife
+hostless
+hostly
+hostry
+hostship
+hot
+hotbed
+hotblood
+hotbox
+hotbrained
+hotch
+hotchpot
+hotchpotch
+hotchpotchly
+hotel
+hoteldom
+hotelhood
+hotelier
+hotelization
+hotelize
+hotelkeeper
+hotelless
+hotelward
+hotfoot
+hothead
+hotheaded
+hotheadedly
+hotheadedness
+hothearted
+hotheartedly
+hotheartedness
+hothouse
+hoti
+hotly
+hotmouthed
+hotness
+hotspur
+hotspurred
+Hotta
+Hottentot
+Hottentotese
+Hottentotic
+Hottentotish
+Hottentotism
+hotter
+hottery
+hottish
+Hottonia
+houbara
+Houdan
+hough
+houghband
+hougher
+houghite
+houghmagandy
+Houghton
+hounce
+hound
+hounder
+houndfish
+hounding
+houndish
+houndlike
+houndman
+houndsbane
+houndsberry
+houndshark
+houndy
+houppelande
+hour
+hourful
+hourglass
+houri
+hourless
+hourly
+housage
+housal
+Housatonic
+house
+houseball
+houseboat
+houseboating
+housebote
+housebound
+houseboy
+housebreak
+housebreaker
+housebreaking
+housebroke
+housebroken
+housebug
+housebuilder
+housebuilding
+housecarl
+housecoat
+housecraft
+housefast
+housefather
+housefly
+houseful
+housefurnishings
+household
+householder
+householdership
+householding
+householdry
+housekeep
+housekeeper
+housekeeperlike
+housekeeperly
+housekeeping
+housel
+houseleek
+houseless
+houselessness
+houselet
+houseline
+houseling
+housemaid
+housemaidenly
+housemaiding
+housemaidy
+houseman
+housemaster
+housemastership
+housemate
+housemating
+houseminder
+housemistress
+housemother
+housemotherly
+houseowner
+houser
+houseridden
+houseroom
+housesmith
+housetop
+houseward
+housewares
+housewarm
+housewarmer
+housewarming
+housewear
+housewife
+housewifeliness
+housewifely
+housewifery
+housewifeship
+housewifish
+housewive
+housework
+housewright
+housing
+Houstonia
+housty
+housy
+houtou
+houvari
+Hova
+hove
+hovedance
+hovel
+hoveler
+hoven
+Hovenia
+hover
+hoverer
+hovering
+hoveringly
+hoverly
+how
+howadji
+Howard
+howardite
+howbeit
+howdah
+howder
+howdie
+howdy
+howe
+Howea
+howel
+however
+howff
+howish
+howitzer
+howk
+howkit
+howl
+howler
+howlet
+howling
+howlingly
+howlite
+howso
+howsoever
+howsomever
+hox
+hoy
+Hoya
+hoyden
+hoydenhood
+hoydenish
+hoydenism
+hoyle
+hoyman
+Hrimfaxi
+Hrothgar
+Hsi
+Hsuan
+Hu
+huaca
+huaco
+huajillo
+huamuchil
+huantajayite
+huaracho
+Huari
+huarizo
+Huashi
+Huastec
+Huastecan
+Huave
+Huavean
+hub
+hubb
+hubba
+hubber
+Hubbite
+hubble
+hubbly
+hubbub
+hubbuboo
+hubby
+Hubert
+hubmaker
+hubmaking
+hubnerite
+hubristic
+hubshi
+huccatoon
+huchen
+Huchnom
+hucho
+huck
+huckaback
+huckle
+huckleback
+hucklebacked
+huckleberry
+hucklebone
+huckmuck
+huckster
+hucksterage
+hucksterer
+hucksteress
+hucksterize
+huckstery
+hud
+huddle
+huddledom
+huddlement
+huddler
+huddling
+huddlingly
+huddock
+huddroun
+huddup
+Hudibras
+Hudibrastic
+Hudibrastically
+Hudsonia
+Hudsonian
+hudsonite
+hue
+hued
+hueful
+hueless
+huelessness
+huer
+Huey
+huff
+huffier
+huffily
+huffiness
+huffingly
+huffish
+huffishly
+huffishness
+huffle
+huffler
+huffy
+hug
+huge
+Hugelia
+hugelite
+hugely
+hugeness
+hugeous
+hugeously
+hugeousness
+huggable
+hugger
+huggermugger
+huggermuggery
+Huggin
+hugging
+huggingly
+huggle
+Hugh
+Hughes
+Hughoc
+Hugo
+Hugoesque
+hugsome
+Huguenot
+Huguenotic
+Huguenotism
+huh
+Hui
+huia
+huipil
+huisache
+huiscoyol
+huitain
+Huk
+Hukbalahap
+huke
+hula
+Huldah
+huldee
+hulk
+hulkage
+hulking
+hulky
+hull
+hullabaloo
+huller
+hullock
+hulloo
+hulotheism
+Hulsean
+hulsite
+hulster
+hulu
+hulver
+hulverhead
+hulverheaded
+hum
+Huma
+human
+humane
+humanely
+humaneness
+humanhood
+humanics
+humanification
+humaniform
+humaniformian
+humanify
+humanish
+humanism
+humanist
+humanistic
+humanistical
+humanistically
+humanitarian
+humanitarianism
+humanitarianist
+humanitarianize
+humanitary
+humanitian
+humanity
+humanitymonger
+humanization
+humanize
+humanizer
+humankind
+humanlike
+humanly
+humanness
+humanoid
+humate
+humble
+humblebee
+humblehearted
+humblemouthed
+humbleness
+humbler
+humblie
+humblingly
+humbly
+humbo
+humboldtilite
+humboldtine
+humboldtite
+humbug
+humbugability
+humbugable
+humbugger
+humbuggery
+humbuggism
+humbuzz
+humdinger
+humdrum
+humdrumminess
+humdrummish
+humdrummishness
+humdudgeon
+Hume
+Humean
+humect
+humectant
+humectate
+humectation
+humective
+humeral
+humeri
+humeroabdominal
+humerocubital
+humerodigital
+humerodorsal
+humerometacarpal
+humeroradial
+humeroscapular
+humeroulnar
+humerus
+humet
+humetty
+humhum
+humic
+humicubation
+humid
+humidate
+humidification
+humidifier
+humidify
+humidistat
+humidity
+humidityproof
+humidly
+humidness
+humidor
+humific
+humification
+humifuse
+humify
+humiliant
+humiliate
+humiliating
+humiliatingly
+humiliation
+humiliative
+humiliator
+humiliatory
+humilific
+humilitude
+humility
+humin
+Humiria
+Humiriaceae
+Humiriaceous
+Humism
+Humist
+humistratous
+humite
+humlie
+hummel
+hummeler
+hummer
+hummie
+humming
+hummingbird
+hummock
+hummocky
+humor
+humoral
+humoralism
+humoralist
+humoralistic
+humoresque
+humoresquely
+humorful
+humorific
+humorism
+humorist
+humoristic
+humoristical
+humorize
+humorless
+humorlessness
+humorology
+humorous
+humorously
+humorousness
+humorproof
+humorsome
+humorsomely
+humorsomeness
+humourful
+humous
+hump
+humpback
+humpbacked
+humped
+humph
+Humphrey
+humpiness
+humpless
+humpty
+humpy
+humstrum
+humulene
+humulone
+Humulus
+humus
+humuslike
+Hun
+Hunanese
+hunch
+Hunchakist
+hunchback
+hunchbacked
+hunchet
+hunchy
+hundi
+hundred
+hundredal
+hundredary
+hundreder
+hundredfold
+hundredman
+hundredpenny
+hundredth
+hundredweight
+hundredwork
+hung
+Hungaria
+Hungarian
+hungarite
+hunger
+hungerer
+hungeringly
+hungerless
+hungerly
+hungerproof
+hungerweed
+hungrify
+hungrily
+hungriness
+hungry
+hunh
+hunk
+Hunker
+hunker
+Hunkerism
+hunkerous
+hunkerousness
+hunkers
+hunkies
+Hunkpapa
+hunks
+hunky
+Hunlike
+Hunnian
+Hunnic
+Hunnican
+Hunnish
+Hunnishness
+hunt
+huntable
+huntedly
+Hunter
+Hunterian
+hunterlike
+huntilite
+hunting
+huntress
+huntsman
+huntsmanship
+huntswoman
+Hunyak
+hup
+Hupa
+hupaithric
+Hura
+hura
+hurcheon
+hurdies
+hurdis
+hurdle
+hurdleman
+hurdler
+hurdlewise
+hurds
+hure
+hureaulite
+hureek
+Hurf
+hurgila
+hurkle
+hurl
+hurlbarrow
+hurled
+hurler
+hurley
+hurleyhouse
+hurling
+hurlock
+hurly
+Huron
+huron
+Huronian
+hurr
+hurrah
+Hurri
+Hurrian
+hurricane
+hurricanize
+hurricano
+hurried
+hurriedly
+hurriedness
+hurrier
+hurrisome
+hurrock
+hurroo
+hurroosh
+hurry
+hurryingly
+hurryproof
+hursinghar
+hurst
+hurt
+hurtable
+hurted
+hurter
+hurtful
+hurtfully
+hurtfulness
+hurting
+hurtingest
+hurtle
+hurtleberry
+hurtless
+hurtlessly
+hurtlessness
+hurtlingly
+hurtsome
+hurty
+husband
+husbandable
+husbandage
+husbander
+husbandfield
+husbandhood
+husbandland
+husbandless
+husbandlike
+husbandliness
+husbandly
+husbandman
+husbandress
+husbandry
+husbandship
+huse
+hush
+hushable
+hushaby
+hushcloth
+hushedly
+husheen
+hushel
+husher
+hushful
+hushfully
+hushing
+hushingly
+hushion
+husho
+husk
+huskanaw
+husked
+huskened
+husker
+huskershredder
+huskily
+huskiness
+husking
+huskroot
+huskwort
+Husky
+husky
+huso
+huspil
+huss
+hussar
+Hussite
+Hussitism
+hussy
+hussydom
+hussyness
+husting
+hustle
+hustlecap
+hustlement
+hustler
+hut
+hutch
+hutcher
+hutchet
+Hutchinsonian
+Hutchinsonianism
+hutchinsonite
+Huterian
+huthold
+hutholder
+hutia
+hutkeeper
+hutlet
+hutment
+Hutsulian
+Hutterites
+Huttonian
+Huttonianism
+huttoning
+huttonweed
+hutukhtu
+huvelyk
+Huxleian
+Huygenian
+huzoor
+Huzvaresh
+huzz
+huzza
+huzzard
+Hwa
+Hy
+hyacinth
+Hyacinthia
+hyacinthian
+hyacinthine
+Hyacinthus
+Hyades
+hyaena
+Hyaenanche
+Hyaenarctos
+Hyaenidae
+Hyaenodon
+hyaenodont
+hyaenodontoid
+Hyakume
+hyalescence
+hyalescent
+hyaline
+hyalinization
+hyalinize
+hyalinocrystalline
+hyalinosis
+hyalite
+hyalitis
+hyaloandesite
+hyalobasalt
+hyalocrystalline
+hyalodacite
+hyalogen
+hyalograph
+hyalographer
+hyalography
+hyaloid
+hyaloiditis
+hyaloliparite
+hyalolith
+hyalomelan
+hyalomucoid
+Hyalonema
+hyalophagia
+hyalophane
+hyalophyre
+hyalopilitic
+hyaloplasm
+hyaloplasma
+hyaloplasmic
+hyalopsite
+hyalopterous
+hyalosiderite
+Hyalospongia
+hyalotekite
+hyalotype
+hyaluronic
+hyaluronidase
+Hybanthus
+Hybla
+Hyblaea
+Hyblaean
+Hyblan
+hybodont
+Hybodus
+hybosis
+hybrid
+hybridal
+hybridation
+hybridism
+hybridist
+hybridity
+hybridizable
+hybridization
+hybridize
+hybridizer
+hybridous
+hydantoate
+hydantoic
+hydantoin
+hydathode
+hydatid
+hydatidiform
+hydatidinous
+hydatidocele
+hydatiform
+hydatigenous
+Hydatina
+hydatogenesis
+hydatogenic
+hydatogenous
+hydatoid
+hydatomorphic
+hydatomorphism
+hydatopneumatic
+hydatopneumatolytic
+hydatopyrogenic
+hydatoscopy
+Hydnaceae
+hydnaceous
+hydnocarpate
+hydnocarpic
+Hydnocarpus
+hydnoid
+Hydnora
+Hydnoraceae
+hydnoraceous
+Hydnum
+Hydra
+hydracetin
+Hydrachna
+hydrachnid
+Hydrachnidae
+hydracid
+hydracoral
+hydracrylate
+hydracrylic
+Hydractinia
+hydractinian
+Hydradephaga
+hydradephagan
+hydradephagous
+hydragogue
+hydragogy
+hydramine
+hydramnion
+hydramnios
+Hydrangea
+Hydrangeaceae
+hydrangeaceous
+hydrant
+hydranth
+hydrarch
+hydrargillite
+hydrargyrate
+hydrargyria
+hydrargyriasis
+hydrargyric
+hydrargyrism
+hydrargyrosis
+hydrargyrum
+hydrarthrosis
+hydrarthrus
+hydrastine
+Hydrastis
+hydrate
+hydrated
+hydration
+hydrator
+hydratropic
+hydraucone
+hydraulic
+hydraulically
+hydraulician
+hydraulicity
+hydraulicked
+hydraulicon
+hydraulics
+hydraulist
+hydraulus
+hydrazide
+hydrazidine
+hydrazimethylene
+hydrazine
+hydrazino
+hydrazo
+hydrazoate
+hydrazobenzene
+hydrazoic
+hydrazone
+hydrazyl
+hydremia
+hydremic
+hydrencephalocele
+hydrencephaloid
+hydrencephalus
+hydria
+hydriatric
+hydriatrist
+hydriatry
+hydric
+hydrically
+Hydrid
+hydride
+hydriform
+hydrindene
+hydriodate
+hydriodic
+hydriodide
+hydriotaphia
+Hydriote
+hydro
+hydroa
+hydroadipsia
+hydroaeric
+hydroalcoholic
+hydroaromatic
+hydroatmospheric
+hydroaviation
+hydrobarometer
+Hydrobates
+Hydrobatidae
+hydrobenzoin
+hydrobilirubin
+hydrobiological
+hydrobiologist
+hydrobiology
+hydrobiosis
+hydrobiplane
+hydrobomb
+hydroboracite
+hydroborofluoric
+hydrobranchiate
+hydrobromate
+hydrobromic
+hydrobromide
+hydrocarbide
+hydrocarbon
+hydrocarbonaceous
+hydrocarbonate
+hydrocarbonic
+hydrocarbonous
+hydrocarbostyril
+hydrocardia
+Hydrocaryaceae
+hydrocaryaceous
+hydrocatalysis
+hydrocauline
+hydrocaulus
+hydrocele
+hydrocellulose
+hydrocephalic
+hydrocephalocele
+hydrocephaloid
+hydrocephalous
+hydrocephalus
+hydrocephaly
+hydroceramic
+hydrocerussite
+Hydrocharidaceae
+hydrocharidaceous
+Hydrocharis
+Hydrocharitaceae
+hydrocharitaceous
+Hydrochelidon
+hydrochemical
+hydrochemistry
+hydrochlorate
+hydrochlorauric
+hydrochloric
+hydrochloride
+hydrochlorplatinic
+hydrochlorplatinous
+Hydrochoerus
+hydrocholecystis
+hydrocinchonine
+hydrocinnamic
+hydrocirsocele
+hydrocladium
+hydroclastic
+Hydrocleis
+hydroclimate
+hydrocobalticyanic
+hydrocoele
+hydrocollidine
+hydroconion
+Hydrocorallia
+Hydrocorallinae
+hydrocoralline
+Hydrocores
+Hydrocorisae
+hydrocorisan
+hydrocotarnine
+Hydrocotyle
+hydrocoumaric
+hydrocupreine
+hydrocyanate
+hydrocyanic
+hydrocyanide
+hydrocycle
+hydrocyclic
+hydrocyclist
+Hydrocyon
+hydrocyst
+hydrocystic
+Hydrodamalidae
+Hydrodamalis
+Hydrodictyaceae
+Hydrodictyon
+hydrodrome
+Hydrodromica
+hydrodromican
+hydrodynamic
+hydrodynamical
+hydrodynamics
+hydrodynamometer
+hydroeconomics
+hydroelectric
+hydroelectricity
+hydroelectrization
+hydroergotinine
+hydroextract
+hydroextractor
+hydroferricyanic
+hydroferrocyanate
+hydroferrocyanic
+hydrofluate
+hydrofluoboric
+hydrofluoric
+hydrofluorid
+hydrofluoride
+hydrofluosilicate
+hydrofluosilicic
+hydrofluozirconic
+hydrofoil
+hydroforming
+hydrofranklinite
+hydrofuge
+hydrogalvanic
+hydrogel
+hydrogen
+hydrogenase
+hydrogenate
+hydrogenation
+hydrogenator
+hydrogenic
+hydrogenide
+hydrogenium
+hydrogenization
+hydrogenize
+hydrogenolysis
+Hydrogenomonas
+hydrogenous
+hydrogeological
+hydrogeology
+hydroglider
+hydrognosy
+hydrogode
+hydrograph
+hydrographer
+hydrographic
+hydrographical
+hydrographically
+hydrography
+hydrogymnastics
+hydrohalide
+hydrohematite
+hydrohemothorax
+hydroid
+Hydroida
+Hydroidea
+hydroidean
+hydroiodic
+hydrokinetic
+hydrokinetical
+hydrokinetics
+hydrol
+hydrolase
+hydrolatry
+Hydrolea
+Hydroleaceae
+hydrolize
+hydrologic
+hydrological
+hydrologically
+hydrologist
+hydrology
+hydrolysis
+hydrolyst
+hydrolyte
+hydrolytic
+hydrolyzable
+hydrolyzate
+hydrolyzation
+hydrolyze
+hydromagnesite
+hydromancer
+hydromancy
+hydromania
+hydromaniac
+hydromantic
+hydromantical
+hydromantically
+hydrome
+hydromechanical
+hydromechanics
+hydromedusa
+Hydromedusae
+hydromedusan
+hydromedusoid
+hydromel
+hydromeningitis
+hydromeningocele
+hydrometallurgical
+hydrometallurgically
+hydrometallurgy
+hydrometamorphism
+hydrometeor
+hydrometeorological
+hydrometeorology
+hydrometer
+hydrometra
+hydrometric
+hydrometrical
+hydrometrid
+Hydrometridae
+hydrometry
+hydromica
+hydromicaceous
+hydromonoplane
+hydromorph
+hydromorphic
+hydromorphous
+hydromorphy
+hydromotor
+hydromyelia
+hydromyelocele
+hydromyoma
+Hydromys
+hydrone
+hydronegative
+hydronephelite
+hydronephrosis
+hydronephrotic
+hydronitric
+hydronitroprussic
+hydronitrous
+hydronium
+hydroparacoumaric
+Hydroparastatae
+hydropath
+hydropathic
+hydropathical
+hydropathist
+hydropathy
+hydropericarditis
+hydropericardium
+hydroperiod
+hydroperitoneum
+hydroperitonitis
+hydroperoxide
+hydrophane
+hydrophanous
+hydrophid
+Hydrophidae
+hydrophil
+hydrophile
+hydrophilic
+hydrophilid
+Hydrophilidae
+hydrophilism
+hydrophilite
+hydrophiloid
+hydrophilous
+hydrophily
+Hydrophinae
+Hydrophis
+hydrophobe
+hydrophobia
+hydrophobic
+hydrophobical
+hydrophobist
+hydrophobophobia
+hydrophobous
+hydrophoby
+hydrophoid
+hydrophone
+Hydrophora
+hydrophoran
+hydrophore
+hydrophoria
+hydrophorous
+hydrophthalmia
+hydrophthalmos
+hydrophthalmus
+hydrophylacium
+hydrophyll
+Hydrophyllaceae
+hydrophyllaceous
+hydrophylliaceous
+hydrophyllium
+Hydrophyllum
+hydrophysometra
+hydrophyte
+hydrophytic
+hydrophytism
+hydrophyton
+hydrophytous
+hydropic
+hydropical
+hydropically
+hydropigenous
+hydroplane
+hydroplanula
+hydroplatinocyanic
+hydroplutonic
+hydropneumatic
+hydropneumatosis
+hydropneumopericardium
+hydropneumothorax
+hydropolyp
+hydroponic
+hydroponicist
+hydroponics
+hydroponist
+hydropositive
+hydropot
+Hydropotes
+hydropropulsion
+hydrops
+hydropsy
+Hydropterideae
+hydroptic
+hydropult
+hydropultic
+hydroquinine
+hydroquinol
+hydroquinoline
+hydroquinone
+hydrorachis
+hydrorhiza
+hydrorhizal
+hydrorrhachis
+hydrorrhachitis
+hydrorrhea
+hydrorrhoea
+hydrorubber
+hydrosalpinx
+hydrosalt
+hydrosarcocele
+hydroscope
+hydroscopic
+hydroscopical
+hydroscopicity
+hydroscopist
+hydroselenic
+hydroselenide
+hydroselenuret
+hydroseparation
+hydrosilicate
+hydrosilicon
+hydrosol
+hydrosomal
+hydrosomatous
+hydrosome
+hydrosorbic
+hydrosphere
+hydrospire
+hydrospiric
+hydrostat
+hydrostatic
+hydrostatical
+hydrostatically
+hydrostatician
+hydrostatics
+hydrostome
+hydrosulphate
+hydrosulphide
+hydrosulphite
+hydrosulphocyanic
+hydrosulphurated
+hydrosulphuret
+hydrosulphureted
+hydrosulphuric
+hydrosulphurous
+hydrosulphuryl
+hydrotachymeter
+hydrotactic
+hydrotalcite
+hydrotasimeter
+hydrotaxis
+hydrotechnic
+hydrotechnical
+hydrotechnologist
+hydrotechny
+hydroterpene
+hydrotheca
+hydrothecal
+hydrotherapeutic
+hydrotherapeutics
+hydrotherapy
+hydrothermal
+hydrothoracic
+hydrothorax
+hydrotic
+hydrotical
+hydrotimeter
+hydrotimetric
+hydrotimetry
+hydrotomy
+hydrotropic
+hydrotropism
+hydroturbine
+hydrotype
+hydrous
+hydrovane
+hydroxamic
+hydroxamino
+hydroxide
+hydroximic
+hydroxy
+hydroxyacetic
+hydroxyanthraquinone
+hydroxybutyricacid
+hydroxyketone
+hydroxyl
+hydroxylactone
+hydroxylamine
+hydroxylate
+hydroxylation
+hydroxylic
+hydroxylization
+hydroxylize
+hydrozincite
+Hydrozoa
+hydrozoal
+hydrozoan
+hydrozoic
+hydrozoon
+hydrula
+Hydruntine
+Hydrurus
+Hydrus
+hydurilate
+hydurilic
+hyena
+hyenadog
+hyenanchin
+hyenic
+hyeniform
+hyenine
+hyenoid
+hyetal
+hyetograph
+hyetographic
+hyetographical
+hyetographically
+hyetography
+hyetological
+hyetology
+hyetometer
+hyetometrograph
+Hygeia
+Hygeian
+hygeiolatry
+hygeist
+hygeistic
+hygeology
+hygiantic
+hygiantics
+hygiastic
+hygiastics
+hygieist
+hygienal
+hygiene
+hygienic
+hygienical
+hygienically
+hygienics
+hygienist
+hygienization
+hygienize
+hygiologist
+hygiology
+hygric
+hygrine
+hygroblepharic
+hygrodeik
+hygroexpansivity
+hygrograph
+hygrology
+hygroma
+hygromatous
+hygrometer
+hygrometric
+hygrometrical
+hygrometrically
+hygrometry
+hygrophaneity
+hygrophanous
+hygrophilous
+hygrophobia
+hygrophthalmic
+hygrophyte
+hygrophytic
+hygroplasm
+hygroplasma
+hygroscope
+hygroscopic
+hygroscopical
+hygroscopically
+hygroscopicity
+hygroscopy
+hygrostat
+hygrostatics
+hygrostomia
+hygrothermal
+hygrothermograph
+hying
+hyke
+Hyla
+hylactic
+hylactism
+hylarchic
+hylarchical
+hyle
+hyleg
+hylegiacal
+hylic
+hylicism
+hylicist
+Hylidae
+hylism
+hylist
+Hyllus
+Hylobates
+hylobatian
+hylobatic
+hylobatine
+Hylocereus
+Hylocichla
+Hylocomium
+Hylodes
+hylogenesis
+hylogeny
+hyloid
+hylology
+hylomorphic
+hylomorphical
+hylomorphism
+hylomorphist
+hylomorphous
+Hylomys
+hylopathism
+hylopathist
+hylopathy
+hylophagous
+hylotheism
+hylotheist
+hylotheistic
+hylotheistical
+hylotomous
+hylozoic
+hylozoism
+hylozoist
+hylozoistic
+hylozoistically
+hymen
+Hymenaea
+Hymenaeus
+Hymenaic
+hymenal
+hymeneal
+hymeneally
+hymeneals
+hymenean
+hymenial
+hymenic
+hymenicolar
+hymeniferous
+hymeniophore
+hymenium
+Hymenocallis
+Hymenochaete
+Hymenogaster
+Hymenogastraceae
+hymenogeny
+hymenoid
+Hymenolepis
+hymenomycetal
+hymenomycete
+Hymenomycetes
+hymenomycetoid
+hymenomycetous
+hymenophore
+hymenophorum
+Hymenophyllaceae
+hymenophyllaceous
+Hymenophyllites
+Hymenophyllum
+hymenopter
+Hymenoptera
+hymenopteran
+hymenopterist
+hymenopterological
+hymenopterologist
+hymenopterology
+hymenopteron
+hymenopterous
+hymenotomy
+Hymettian
+Hymettic
+hymn
+hymnal
+hymnarium
+hymnary
+hymnbook
+hymner
+hymnic
+hymnist
+hymnless
+hymnlike
+hymnode
+hymnodical
+hymnodist
+hymnody
+hymnographer
+hymnography
+hymnologic
+hymnological
+hymnologically
+hymnologist
+hymnology
+hymnwise
+hynde
+hyne
+hyobranchial
+hyocholalic
+hyocholic
+hyoepiglottic
+hyoepiglottidean
+hyoglossal
+hyoglossus
+hyoglycocholic
+hyoid
+hyoidal
+hyoidan
+hyoideal
+hyoidean
+hyoides
+Hyolithes
+hyolithid
+Hyolithidae
+hyolithoid
+hyomandibula
+hyomandibular
+hyomental
+hyoplastral
+hyoplastron
+hyoscapular
+hyoscine
+hyoscyamine
+Hyoscyamus
+hyosternal
+hyosternum
+hyostylic
+hyostyly
+hyothere
+Hyotherium
+hyothyreoid
+hyothyroid
+hyp
+hypabyssal
+hypaethral
+hypaethron
+hypaethros
+hypaethrum
+hypalgesia
+hypalgia
+hypalgic
+hypallactic
+hypallage
+hypanthial
+hypanthium
+hypantrum
+Hypapante
+hypapophysial
+hypapophysis
+hyparterial
+hypaspist
+hypate
+hypaton
+hypautomorphic
+hypaxial
+Hypenantron
+hyper
+hyperabelian
+hyperabsorption
+hyperaccurate
+hyperacid
+hyperacidaminuria
+hyperacidity
+hyperacoustics
+hyperaction
+hyperactive
+hyperactivity
+hyperacuity
+hyperacusia
+hyperacusis
+hyperacute
+hyperacuteness
+hyperadenosis
+hyperadiposis
+hyperadiposity
+hyperadrenalemia
+hyperaeolism
+hyperalbuminosis
+hyperalgebra
+hyperalgesia
+hyperalgesic
+hyperalgesis
+hyperalgetic
+hyperalimentation
+hyperalkalinity
+hyperaltruism
+hyperaminoacidemia
+hyperanabolic
+hyperanarchy
+hyperangelical
+hyperaphia
+hyperaphic
+hyperapophyseal
+hyperapophysial
+hyperapophysis
+hyperarchaeological
+hyperarchepiscopal
+hyperazotemia
+hyperbarbarous
+hyperbatic
+hyperbatically
+hyperbaton
+hyperbola
+hyperbolaeon
+hyperbole
+hyperbolic
+hyperbolically
+hyperbolicly
+hyperbolism
+hyperbolize
+hyperboloid
+hyperboloidal
+hyperboreal
+Hyperborean
+hyperborean
+hyperbrachycephal
+hyperbrachycephalic
+hyperbrachycephaly
+hyperbrachycranial
+hyperbrachyskelic
+hyperbranchia
+hyperbrutal
+hyperbulia
+hypercalcemia
+hypercarbamidemia
+hypercarbureted
+hypercarburetted
+hypercarnal
+hypercatalectic
+hypercatalexis
+hypercatharsis
+hypercathartic
+hypercathexis
+hypercenosis
+hyperchamaerrhine
+hyperchlorhydria
+hyperchloric
+hypercholesterinemia
+hypercholesterolemia
+hypercholia
+hypercivilization
+hypercivilized
+hyperclassical
+hyperclimax
+hypercoagulability
+hypercoagulable
+hypercomplex
+hypercomposite
+hyperconcentration
+hypercone
+hyperconfident
+hyperconformist
+hyperconscientious
+hyperconscientiousness
+hyperconscious
+hyperconsciousness
+hyperconservatism
+hyperconstitutional
+hypercoracoid
+hypercorrect
+hypercorrection
+hypercorrectness
+hypercosmic
+hypercreaturely
+hypercritic
+hypercritical
+hypercritically
+hypercriticism
+hypercriticize
+hypercryalgesia
+hypercube
+hypercyanotic
+hypercycle
+hypercylinder
+hyperdactyl
+hyperdactylia
+hyperdactyly
+hyperdeify
+hyperdelicacy
+hyperdelicate
+hyperdemocracy
+hyperdemocratic
+hyperdeterminant
+hyperdiabolical
+hyperdialectism
+hyperdiapason
+hyperdiapente
+hyperdiastole
+hyperdiatessaron
+hyperdiazeuxis
+hyperdicrotic
+hyperdicrotism
+hyperdicrotous
+hyperdimensional
+hyperdimensionality
+hyperdissyllable
+hyperdistention
+hyperditone
+hyperdivision
+hyperdolichocephal
+hyperdolichocephalic
+hyperdolichocephaly
+hyperdolichocranial
+hyperdoricism
+hyperdulia
+hyperdulic
+hyperdulical
+hyperelegant
+hyperelliptic
+hyperemesis
+hyperemetic
+hyperemia
+hyperemic
+hyperemotivity
+hyperemphasize
+hyperenthusiasm
+hypereosinophilia
+hyperephidrosis
+hyperequatorial
+hypererethism
+hyperessence
+hyperesthesia
+hyperesthetic
+hyperethical
+hypereuryprosopic
+hypereutectic
+hypereutectoid
+hyperexaltation
+hyperexcitability
+hyperexcitable
+hyperexcitement
+hyperexcursive
+hyperexophoria
+hyperextend
+hyperextension
+hyperfastidious
+hyperfederalist
+hyperfine
+hyperflexion
+hyperfocal
+hyperfunction
+hyperfunctional
+hyperfunctioning
+hypergalactia
+hypergamous
+hypergamy
+hypergenesis
+hypergenetic
+hypergeometric
+hypergeometrical
+hypergeometry
+hypergeusia
+hypergeustia
+hyperglycemia
+hyperglycemic
+hyperglycorrhachia
+hyperglycosuria
+hypergoddess
+hypergol
+hypergolic
+Hypergon
+hypergrammatical
+hyperhedonia
+hyperhemoglobinemia
+hyperhilarious
+hyperhypocrisy
+Hypericaceae
+hypericaceous
+Hypericales
+hypericin
+hypericism
+Hypericum
+hypericum
+hyperidealistic
+hyperideation
+hyperimmune
+hyperimmunity
+hyperimmunization
+hyperimmunize
+hyperingenuity
+hyperinosis
+hyperinotic
+hyperinsulinization
+hyperinsulinize
+hyperintellectual
+hyperintelligence
+hyperinvolution
+hyperirritability
+hyperirritable
+hyperisotonic
+hyperite
+hyperkeratosis
+hyperkinesia
+hyperkinesis
+hyperkinetic
+hyperlactation
+hyperleptoprosopic
+hyperleucocytosis
+hyperlipemia
+hyperlipoidemia
+hyperlithuria
+hyperlogical
+hyperlustrous
+hypermagical
+hypermakroskelic
+hypermedication
+hypermenorrhea
+hypermetabolism
+hypermetamorphic
+hypermetamorphism
+hypermetamorphosis
+hypermetamorphotic
+hypermetaphorical
+hypermetaphysical
+hypermetaplasia
+hypermeter
+hypermetric
+hypermetrical
+hypermetron
+hypermetrope
+hypermetropia
+hypermetropic
+hypermetropical
+hypermetropy
+hypermiraculous
+hypermixolydian
+hypermnesia
+hypermnesic
+hypermnesis
+hypermnestic
+hypermodest
+hypermonosyllable
+hypermoral
+hypermorph
+hypermorphism
+hypermorphosis
+hypermotile
+hypermotility
+hypermyotonia
+hypermyotrophy
+hypermyriorama
+hypermystical
+hypernatural
+hypernephroma
+hyperneuria
+hyperneurotic
+hypernic
+hypernitrogenous
+hypernomian
+hypernomic
+hypernormal
+hypernote
+hypernutrition
+Hyperoartia
+hyperoartian
+hyperobtrusive
+hyperodontogeny
+Hyperoodon
+hyperoon
+hyperope
+hyperopia
+hyperopic
+hyperorganic
+hyperorthognathic
+hyperorthognathous
+hyperorthognathy
+hyperosmia
+hyperosmic
+hyperostosis
+hyperostotic
+hyperothodox
+hyperothodoxy
+Hyperotreta
+hyperotretan
+Hyperotreti
+hyperotretous
+hyperoxidation
+hyperoxide
+hyperoxygenate
+hyperoxygenation
+hyperoxygenize
+hyperpanegyric
+hyperparasite
+hyperparasitic
+hyperparasitism
+hyperparasitize
+hyperparoxysm
+hyperpathetic
+hyperpatriotic
+hyperpencil
+hyperpepsinia
+hyperper
+hyperperistalsis
+hyperperistaltic
+hyperpersonal
+hyperphalangeal
+hyperphalangism
+hyperpharyngeal
+hyperphenomena
+hyperphoria
+hyperphoric
+hyperphosphorescence
+hyperphysical
+hyperphysically
+hyperphysics
+hyperpiesia
+hyperpiesis
+hyperpietic
+hyperpietist
+hyperpigmentation
+hyperpigmented
+hyperpinealism
+hyperpituitarism
+hyperplagiarism
+hyperplane
+hyperplasia
+hyperplasic
+hyperplastic
+hyperplatyrrhine
+hyperploid
+hyperploidy
+hyperpnea
+hyperpnoea
+hyperpolysyllabic
+hyperpredator
+hyperprism
+hyperproduction
+hyperprognathous
+hyperprophetical
+hyperprosexia
+hyperpulmonary
+hyperpure
+hyperpurist
+hyperpyramid
+hyperpyretic
+hyperpyrexia
+hyperpyrexial
+hyperquadric
+hyperrational
+hyperreactive
+hyperrealize
+hyperresonance
+hyperresonant
+hyperreverential
+hyperrhythmical
+hyperridiculous
+hyperritualism
+hypersacerdotal
+hypersaintly
+hypersalivation
+hypersceptical
+hyperscholastic
+hyperscrupulosity
+hypersecretion
+hypersensibility
+hypersensitive
+hypersensitiveness
+hypersensitivity
+hypersensitization
+hypersensitize
+hypersensual
+hypersensualism
+hypersensuous
+hypersentimental
+hypersolid
+hypersomnia
+hypersonic
+hypersophisticated
+hyperspace
+hyperspatial
+hyperspeculative
+hypersphere
+hyperspherical
+hyperspiritualizing
+hypersplenia
+hypersplenism
+hypersthene
+hypersthenia
+hypersthenic
+hypersthenite
+hyperstoic
+hyperstrophic
+hypersubtlety
+hypersuggestibility
+hypersuperlative
+hypersurface
+hypersusceptibility
+hypersusceptible
+hypersystole
+hypersystolic
+hypertechnical
+hypertelic
+hypertely
+hypertense
+hypertensin
+hypertension
+hypertensive
+hyperterrestrial
+hypertetrahedron
+hyperthermal
+hyperthermalgesia
+hyperthermesthesia
+hyperthermia
+hyperthermic
+hyperthermy
+hyperthesis
+hyperthetic
+hyperthetical
+hyperthyreosis
+hyperthyroid
+hyperthyroidism
+hyperthyroidization
+hyperthyroidize
+hypertonia
+hypertonic
+hypertonicity
+hypertonus
+hypertorrid
+hypertoxic
+hypertoxicity
+hypertragical
+hypertragically
+hypertranscendent
+hypertrichosis
+hypertridimensional
+hypertrophic
+hypertrophied
+hypertrophous
+hypertrophy
+hypertropia
+hypertropical
+hypertype
+hypertypic
+hypertypical
+hyperurbanism
+hyperuresis
+hypervascular
+hypervascularity
+hypervenosity
+hyperventilate
+hyperventilation
+hypervigilant
+hyperviscosity
+hypervitalization
+hypervitalize
+hypervitaminosis
+hypervolume
+hyperwrought
+hypesthesia
+hypesthesic
+hypethral
+hypha
+Hyphaene
+hyphaeresis
+hyphal
+hyphedonia
+hyphema
+hyphen
+hyphenate
+hyphenated
+hyphenation
+hyphenic
+hyphenism
+hyphenization
+hyphenize
+hypho
+hyphodrome
+Hyphomycetales
+hyphomycete
+Hyphomycetes
+hyphomycetic
+hyphomycetous
+hyphomycosis
+hypidiomorphic
+hypidiomorphically
+hypinosis
+hypinotic
+Hypnaceae
+hypnaceous
+hypnagogic
+hypnesthesis
+hypnesthetic
+hypnoanalysis
+hypnobate
+hypnocyst
+hypnody
+hypnoetic
+hypnogenesis
+hypnogenetic
+hypnoid
+hypnoidal
+hypnoidization
+hypnoidize
+hypnologic
+hypnological
+hypnologist
+hypnology
+hypnone
+hypnophobia
+hypnophobic
+hypnophoby
+hypnopompic
+Hypnos
+hypnoses
+hypnosis
+hypnosperm
+hypnosporangium
+hypnospore
+hypnosporic
+hypnotherapy
+hypnotic
+hypnotically
+hypnotism
+hypnotist
+hypnotistic
+hypnotizability
+hypnotizable
+hypnotization
+hypnotize
+hypnotizer
+hypnotoid
+hypnotoxin
+Hypnum
+hypo
+hypoacid
+hypoacidity
+hypoactive
+hypoactivity
+hypoadenia
+hypoadrenia
+hypoaeolian
+hypoalimentation
+hypoalkaline
+hypoalkalinity
+hypoaminoacidemia
+hypoantimonate
+hypoazoturia
+hypobasal
+hypobatholithic
+hypobenthonic
+hypobenthos
+hypoblast
+hypoblastic
+hypobole
+hypobranchial
+hypobranchiate
+hypobromite
+hypobromous
+hypobulia
+hypobulic
+hypocalcemia
+hypocarp
+hypocarpium
+hypocarpogean
+hypocatharsis
+hypocathartic
+hypocathexis
+hypocaust
+hypocentrum
+hypocephalus
+Hypochaeris
+hypochil
+hypochilium
+hypochlorhydria
+hypochlorhydric
+hypochloric
+hypochlorite
+hypochlorous
+hypochloruria
+Hypochnaceae
+hypochnose
+Hypochnus
+hypochondria
+hypochondriac
+hypochondriacal
+hypochondriacally
+hypochondriacism
+hypochondrial
+hypochondriasis
+hypochondriast
+hypochondrium
+hypochondry
+hypochordal
+hypochromia
+hypochrosis
+hypochylia
+hypocist
+hypocleidian
+hypocleidium
+hypocoelom
+hypocondylar
+hypocone
+hypoconid
+hypoconule
+hypoconulid
+hypocoracoid
+hypocorism
+hypocoristic
+hypocoristical
+hypocoristically
+hypocotyl
+hypocotyleal
+hypocotyledonary
+hypocotyledonous
+hypocotylous
+hypocrater
+hypocrateriform
+hypocraterimorphous
+Hypocreaceae
+hypocreaceous
+Hypocreales
+hypocrisis
+hypocrisy
+hypocrital
+hypocrite
+hypocritic
+hypocritical
+hypocritically
+hypocrize
+hypocrystalline
+hypocycloid
+hypocycloidal
+hypocystotomy
+hypocytosis
+hypodactylum
+hypoderm
+hypoderma
+hypodermal
+hypodermatic
+hypodermatically
+hypodermatoclysis
+hypodermatomy
+Hypodermella
+hypodermic
+hypodermically
+hypodermis
+hypodermoclysis
+hypodermosis
+hypodermous
+hypodiapason
+hypodiapente
+hypodiastole
+hypodiatessaron
+hypodiazeuxis
+hypodicrotic
+hypodicrotous
+hypoditone
+hypodorian
+hypodynamia
+hypodynamic
+hypoeliminator
+hypoendocrinism
+hypoeosinophilia
+hypoeutectic
+hypoeutectoid
+hypofunction
+hypogastric
+hypogastrium
+hypogastrocele
+hypogeal
+hypogean
+hypogee
+hypogeic
+hypogeiody
+hypogene
+hypogenesis
+hypogenetic
+hypogenic
+hypogenous
+hypogeocarpous
+hypogeous
+hypogeum
+hypogeusia
+hypoglobulia
+hypoglossal
+hypoglossitis
+hypoglossus
+hypoglottis
+hypoglycemia
+hypoglycemic
+hypognathism
+hypognathous
+hypogonation
+hypogynic
+hypogynium
+hypogynous
+hypogyny
+hypohalous
+hypohemia
+hypohidrosis
+Hypohippus
+hypohyal
+hypohyaline
+hypoid
+hypoiodite
+hypoiodous
+hypoionian
+hypoischium
+hypoisotonic
+hypokeimenometry
+hypokinesia
+hypokinesis
+hypokinetic
+hypokoristikon
+hypolemniscus
+hypoleptically
+hypoleucocytosis
+hypolimnion
+hypolocrian
+hypolydian
+hypomania
+hypomanic
+hypomelancholia
+hypomeral
+hypomere
+hypomeron
+hypometropia
+hypomixolydian
+hypomnematic
+hypomnesis
+hypomochlion
+hypomorph
+hypomotility
+hypomyotonia
+hyponastic
+hyponastically
+hyponasty
+hyponeuria
+hyponitric
+hyponitrite
+hyponitrous
+hyponoetic
+hyponoia
+hyponome
+hyponomic
+hyponychial
+hyponychium
+hyponym
+hyponymic
+hyponymous
+Hypoparia
+hypopepsia
+hypopepsinia
+hypopepsy
+hypopetalous
+hypopetaly
+hypophalangism
+hypophamin
+hypophamine
+hypophare
+hypopharyngeal
+hypopharynx
+hypophloeodal
+hypophloeodic
+hypophloeous
+hypophonic
+hypophonous
+hypophora
+hypophoria
+hypophosphate
+hypophosphite
+hypophosphoric
+hypophosphorous
+hypophrenia
+hypophrenic
+hypophrenosis
+hypophrygian
+hypophyge
+hypophyll
+hypophyllium
+hypophyllous
+hypophyllum
+hypophyse
+hypophyseal
+hypophysectomize
+hypophysectomy
+hypophyseoprivic
+hypophyseoprivous
+hypophysial
+hypophysical
+hypophysics
+hypophysis
+hypopial
+hypopinealism
+hypopituitarism
+Hypopitys
+hypoplankton
+hypoplanktonic
+hypoplasia
+hypoplastic
+hypoplastral
+hypoplastron
+hypoplasty
+hypoplasy
+hypoploid
+hypoploidy
+hypopodium
+hypopraxia
+hypoprosexia
+hypopselaphesia
+hypopteral
+hypopteron
+hypoptilar
+hypoptilum
+hypoptosis
+hypoptyalism
+hypopus
+hypopygial
+hypopygidium
+hypopygium
+hypopyon
+hyporadial
+hyporadiolus
+hyporadius
+hyporchema
+hyporchematic
+hyporcheme
+hyporchesis
+hyporhachidian
+hyporhachis
+hyporhined
+hyporit
+hyporrhythmic
+hyposcenium
+hyposcleral
+hyposcope
+hyposecretion
+hyposensitization
+hyposensitize
+hyposkeletal
+hyposmia
+hypospadiac
+hypospadias
+hyposphene
+hypospray
+hypostase
+hypostasis
+hypostasization
+hypostasize
+hypostasy
+hypostatic
+hypostatical
+hypostatically
+hypostatization
+hypostatize
+hyposternal
+hyposternum
+hyposthenia
+hyposthenic
+hyposthenuria
+hypostigma
+hypostilbite
+hypostoma
+Hypostomata
+hypostomatic
+hypostomatous
+hypostome
+hypostomial
+Hypostomides
+hypostomous
+hypostrophe
+hypostyle
+hypostypsis
+hypostyptic
+hyposulphite
+hyposulphurous
+hyposuprarenalism
+hyposyllogistic
+hyposynaphe
+hyposynergia
+hyposystole
+hypotactic
+hypotarsal
+hypotarsus
+hypotaxia
+hypotaxic
+hypotaxis
+hypotension
+hypotensive
+hypotensor
+hypotenusal
+hypotenuse
+hypothalamic
+hypothalamus
+hypothalline
+hypothallus
+hypothec
+hypotheca
+hypothecal
+hypothecary
+hypothecate
+hypothecation
+hypothecative
+hypothecator
+hypothecatory
+hypothecial
+hypothecium
+hypothenal
+hypothenar
+Hypotheria
+hypothermal
+hypothermia
+hypothermic
+hypothermy
+hypotheses
+hypothesis
+hypothesist
+hypothesize
+hypothesizer
+hypothetic
+hypothetical
+hypothetically
+hypothetics
+hypothetist
+hypothetize
+hypothetizer
+hypothyreosis
+hypothyroid
+hypothyroidism
+hypotonia
+hypotonic
+hypotonicity
+hypotonus
+hypotony
+hypotoxic
+hypotoxicity
+hypotrachelium
+Hypotremata
+hypotrich
+Hypotricha
+Hypotrichida
+hypotrichosis
+hypotrichous
+hypotrochanteric
+hypotrochoid
+hypotrochoidal
+hypotrophic
+hypotrophy
+hypotympanic
+hypotypic
+hypotypical
+hypotyposis
+hypovalve
+hypovanadate
+hypovanadic
+hypovanadious
+hypovanadous
+hypovitaminosis
+hypoxanthic
+hypoxanthine
+Hypoxis
+Hypoxylon
+hypozeugma
+hypozeuxis
+Hypozoa
+hypozoan
+hypozoic
+hyppish
+hypsibrachycephalic
+hypsibrachycephalism
+hypsibrachycephaly
+hypsicephalic
+hypsicephaly
+hypsidolichocephalic
+hypsidolichocephalism
+hypsidolichocephaly
+hypsiliform
+hypsiloid
+Hypsilophodon
+hypsilophodont
+hypsilophodontid
+Hypsilophodontidae
+hypsilophodontoid
+Hypsiprymninae
+Hypsiprymnodontinae
+Hypsiprymnus
+Hypsistarian
+hypsistenocephalic
+hypsistenocephalism
+hypsistenocephaly
+hypsobathymetric
+hypsocephalous
+hypsochrome
+hypsochromic
+hypsochromy
+hypsodont
+hypsodontism
+hypsodonty
+hypsographic
+hypsographical
+hypsography
+hypsoisotherm
+hypsometer
+hypsometric
+hypsometrical
+hypsometrically
+hypsometrist
+hypsometry
+hypsophobia
+hypsophonous
+hypsophyll
+hypsophyllar
+hypsophyllary
+hypsophyllous
+hypsophyllum
+hypsothermometer
+hypural
+hyraces
+hyraceum
+Hyrachyus
+hyracid
+Hyracidae
+hyraciform
+Hyracina
+Hyracodon
+hyracodont
+hyracodontid
+Hyracodontidae
+hyracodontoid
+hyracoid
+Hyracoidea
+hyracoidean
+hyracothere
+hyracotherian
+Hyracotheriinae
+Hyracotherium
+hyrax
+Hyrcan
+Hyrcanian
+hyson
+hyssop
+Hyssopus
+hystazarin
+hysteralgia
+hysteralgic
+hysteranthous
+hysterectomy
+hysterelcosis
+hysteresial
+hysteresis
+hysteretic
+hysteretically
+hysteria
+hysteriac
+Hysteriales
+hysteric
+hysterical
+hysterically
+hystericky
+hysterics
+hysteriform
+hysterioid
+Hysterocarpus
+hysterocatalepsy
+hysterocele
+hysterocleisis
+hysterocrystalline
+hysterocystic
+hysterodynia
+hysterogen
+hysterogenetic
+hysterogenic
+hysterogenous
+hysterogeny
+hysteroid
+hysterolaparotomy
+hysterolith
+hysterolithiasis
+hysterology
+hysterolysis
+hysteromania
+hysterometer
+hysterometry
+hysteromorphous
+hysteromyoma
+hysteromyomectomy
+hysteron
+hysteroneurasthenia
+hysteropathy
+hysteropexia
+hysteropexy
+hysterophore
+Hysterophyta
+hysterophytal
+hysterophyte
+hysteroproterize
+hysteroptosia
+hysteroptosis
+hysterorrhaphy
+hysterorrhexis
+hysteroscope
+hysterosis
+hysterotome
+hysterotomy
+hysterotraumatism
+hystriciasis
+hystricid
+Hystricidae
+Hystricinae
+hystricine
+hystricism
+hystricismus
+hystricoid
+hystricomorph
+Hystricomorpha
+hystricomorphic
+hystricomorphous
+Hystrix
+I
+i
+Iacchic
+Iacchos
+Iacchus
+Iachimo
+iamatology
+iamb
+Iambe
+iambelegus
+iambi
+iambic
+iambically
+iambist
+iambize
+iambographer
+iambus
+Ian
+Ianthina
+ianthine
+ianthinite
+Ianus
+iao
+Iapetus
+Iapyges
+Iapygian
+Iapygii
+iatraliptic
+iatraliptics
+iatric
+iatrical
+iatrochemic
+iatrochemical
+iatrochemist
+iatrochemistry
+iatrological
+iatrology
+iatromathematical
+iatromathematician
+iatromathematics
+iatromechanical
+iatromechanist
+iatrophysical
+iatrophysicist
+iatrophysics
+iatrotechnics
+iba
+Ibad
+Ibadite
+Iban
+Ibanag
+Iberes
+Iberi
+Iberia
+Iberian
+Iberic
+Iberis
+Iberism
+iberite
+ibex
+ibices
+ibid
+Ibididae
+Ibidinae
+ibidine
+Ibidium
+Ibilao
+ibis
+ibisbill
+Ibo
+ibolium
+ibota
+Ibsenian
+Ibsenic
+Ibsenish
+Ibsenism
+Ibsenite
+Ibycter
+Ibycus
+Icacinaceae
+icacinaceous
+icaco
+Icacorea
+Icaria
+Icarian
+Icarianism
+Icarus
+ice
+iceberg
+iceblink
+iceboat
+icebone
+icebound
+icebox
+icebreaker
+icecap
+icecraft
+iced
+icefall
+icefish
+icehouse
+Iceland
+iceland
+Icelander
+Icelandian
+Icelandic
+iceleaf
+iceless
+Icelidae
+icelike
+iceman
+Iceni
+icequake
+iceroot
+Icerya
+icework
+ich
+Ichneumia
+ichneumon
+ichneumoned
+Ichneumones
+ichneumonid
+Ichneumonidae
+ichneumonidan
+Ichneumonides
+ichneumoniform
+ichneumonized
+ichneumonoid
+Ichneumonoidea
+ichneumonology
+ichneumous
+ichneutic
+ichnite
+ichnographic
+ichnographical
+ichnographically
+ichnography
+ichnolite
+ichnolithology
+ichnolitic
+ichnological
+ichnology
+ichnomancy
+icho
+ichoglan
+ichor
+ichorous
+ichorrhea
+ichorrhemia
+ichthulin
+ichthulinic
+ichthus
+ichthyal
+ichthyic
+ichthyism
+ichthyismus
+ichthyization
+ichthyized
+ichthyobatrachian
+Ichthyocephali
+ichthyocephalous
+ichthyocol
+ichthyocolla
+ichthyocoprolite
+Ichthyodea
+Ichthyodectidae
+ichthyodian
+ichthyodont
+ichthyodorulite
+ichthyofauna
+ichthyoform
+ichthyographer
+ichthyographia
+ichthyographic
+ichthyography
+ichthyoid
+ichthyoidal
+Ichthyoidea
+Ichthyol
+ichthyolatrous
+ichthyolatry
+ichthyolite
+ichthyolitic
+ichthyologic
+ichthyological
+ichthyologically
+ichthyologist
+ichthyology
+ichthyomancy
+ichthyomantic
+Ichthyomorpha
+ichthyomorphic
+ichthyomorphous
+ichthyonomy
+ichthyopaleontology
+ichthyophagan
+ichthyophagi
+ichthyophagian
+ichthyophagist
+ichthyophagize
+ichthyophagous
+ichthyophagy
+ichthyophile
+ichthyophobia
+ichthyophthalmite
+ichthyophthiriasis
+ichthyopolism
+ichthyopolist
+ichthyopsid
+Ichthyopsida
+ichthyopsidan
+Ichthyopterygia
+ichthyopterygian
+ichthyopterygium
+Ichthyornis
+Ichthyornithes
+ichthyornithic
+Ichthyornithidae
+Ichthyornithiformes
+ichthyornithoid
+ichthyosaur
+Ichthyosauria
+ichthyosaurian
+ichthyosaurid
+Ichthyosauridae
+ichthyosauroid
+Ichthyosaurus
+ichthyosis
+ichthyosism
+ichthyotic
+Ichthyotomi
+ichthyotomist
+ichthyotomous
+ichthyotomy
+ichthyotoxin
+ichthyotoxism
+ichthytaxidermy
+ichu
+icica
+icicle
+icicled
+icily
+iciness
+icing
+icon
+Iconian
+iconic
+iconical
+iconism
+iconoclasm
+iconoclast
+iconoclastic
+iconoclastically
+iconoclasticism
+iconodule
+iconodulic
+iconodulist
+iconoduly
+iconograph
+iconographer
+iconographic
+iconographical
+iconographist
+iconography
+iconolater
+iconolatrous
+iconolatry
+iconological
+iconologist
+iconology
+iconomachal
+iconomachist
+iconomachy
+iconomania
+iconomatic
+iconomatically
+iconomaticism
+iconomatography
+iconometer
+iconometric
+iconometrical
+iconometrically
+iconometry
+iconophile
+iconophilism
+iconophilist
+iconophily
+iconoplast
+iconoscope
+iconostas
+iconostasion
+iconostasis
+iconotype
+icosahedral
+Icosandria
+icosasemic
+icosian
+icositetrahedron
+icosteid
+Icosteidae
+icosteine
+Icosteus
+icotype
+icteric
+icterical
+Icteridae
+icterine
+icteritious
+icterode
+icterogenetic
+icterogenic
+icterogenous
+icterohematuria
+icteroid
+icterus
+ictic
+Ictonyx
+ictuate
+ictus
+icy
+id
+Ida
+Idaean
+Idaho
+Idahoan
+Idaic
+idalia
+Idalian
+idant
+iddat
+Iddio
+ide
+idea
+ideaed
+ideaful
+ideagenous
+ideal
+idealess
+idealism
+idealist
+idealistic
+idealistical
+idealistically
+ideality
+idealization
+idealize
+idealizer
+idealless
+ideally
+idealness
+ideamonger
+Idean
+ideate
+ideation
+ideational
+ideationally
+ideative
+ideist
+idempotent
+identic
+identical
+identicalism
+identically
+identicalness
+identifiable
+identifiableness
+identification
+identifier
+identify
+identism
+identity
+ideogenetic
+ideogenical
+ideogenous
+ideogeny
+ideoglyph
+ideogram
+ideogrammic
+ideograph
+ideographic
+ideographical
+ideographically
+ideography
+ideolatry
+ideologic
+ideological
+ideologically
+ideologist
+ideologize
+ideologue
+ideology
+ideomotion
+ideomotor
+ideophone
+ideophonetics
+ideophonous
+ideoplastia
+ideoplastic
+ideoplastics
+ideoplasty
+ideopraxist
+ides
+idgah
+idiasm
+idic
+idiobiology
+idioblast
+idioblastic
+idiochromatic
+idiochromatin
+idiochromosome
+idiocrasis
+idiocrasy
+idiocratic
+idiocratical
+idiocy
+idiocyclophanous
+idioelectric
+idioelectrical
+Idiogastra
+idiogenesis
+idiogenetic
+idiogenous
+idioglossia
+idioglottic
+idiograph
+idiographic
+idiographical
+idiohypnotism
+idiolalia
+idiolatry
+idiologism
+idiolysin
+idiom
+idiomatic
+idiomatical
+idiomatically
+idiomaticalness
+idiomelon
+idiometer
+idiomography
+idiomology
+idiomorphic
+idiomorphically
+idiomorphism
+idiomorphous
+idiomuscular
+idiopathetic
+idiopathic
+idiopathical
+idiopathically
+idiopathy
+idiophanism
+idiophanous
+idiophonic
+idioplasm
+idioplasmatic
+idioplasmic
+idiopsychological
+idiopsychology
+idioreflex
+idiorepulsive
+idioretinal
+idiorrhythmic
+Idiosepiidae
+Idiosepion
+idiosome
+idiospasm
+idiospastic
+idiostatic
+idiosyncrasy
+idiosyncratic
+idiosyncratical
+idiosyncratically
+idiot
+idiotcy
+idiothalamous
+idiothermous
+idiothermy
+idiotic
+idiotical
+idiotically
+idioticalness
+idioticon
+idiotish
+idiotism
+idiotize
+idiotropian
+idiotry
+idiotype
+idiotypic
+Idism
+Idist
+Idistic
+idite
+iditol
+idle
+idleful
+idleheaded
+idlehood
+idleman
+idlement
+idleness
+idler
+idleset
+idleship
+idlety
+idlish
+idly
+Ido
+idocrase
+Idoism
+Idoist
+Idoistic
+idol
+idola
+idolaster
+idolater
+idolatress
+idolatric
+idolatrize
+idolatrizer
+idolatrous
+idolatrously
+idolatrousness
+idolatry
+idolify
+idolism
+idolist
+idolistic
+idolization
+idolize
+idolizer
+idoloclast
+idoloclastic
+idolodulia
+idolographical
+idololatrical
+idololatry
+idolomancy
+idolomania
+idolothyte
+idolothytic
+idolous
+idolum
+Idomeneus
+idoneal
+idoneity
+idoneous
+idoneousness
+idorgan
+idosaccharic
+idose
+Idotea
+Idoteidae
+Idothea
+Idotheidae
+idrialin
+idrialine
+idrialite
+Idrisid
+Idrisite
+idryl
+Idumaean
+idyl
+idyler
+idylism
+idylist
+idylize
+idyllian
+idyllic
+idyllical
+idyllically
+idyllicism
+ie
+Ierne
+if
+ife
+iffy
+Ifugao
+Igara
+Igbira
+Igdyr
+igelstromite
+igloo
+Iglulirmiut
+ignatia
+Ignatian
+Ignatianist
+Ignatius
+ignavia
+igneoaqueous
+igneous
+ignescent
+ignicolist
+igniferous
+igniferousness
+igniform
+ignifuge
+ignify
+ignigenous
+ignipotent
+ignipuncture
+ignitability
+ignite
+igniter
+ignitibility
+ignitible
+ignition
+ignitive
+ignitor
+ignitron
+ignivomous
+ignivomousness
+ignobility
+ignoble
+ignobleness
+ignoblesse
+ignobly
+ignominious
+ignominiously
+ignominiousness
+ignominy
+ignorable
+ignoramus
+ignorance
+ignorant
+Ignorantine
+ignorantism
+ignorantist
+ignorantly
+ignorantness
+ignoration
+ignore
+ignorement
+ignorer
+ignote
+Igorot
+iguana
+Iguania
+iguanian
+iguanid
+Iguanidae
+iguaniform
+Iguanodon
+iguanodont
+Iguanodontia
+Iguanodontidae
+iguanodontoid
+Iguanodontoidea
+iguanoid
+Iguvine
+ihi
+Ihlat
+ihleite
+ihram
+iiwi
+ijma
+Ijo
+ijolite
+Ijore
+ijussite
+ikat
+Ike
+ikey
+ikeyness
+Ikhwan
+ikona
+ikra
+Ila
+ileac
+ileectomy
+ileitis
+ileocaecal
+ileocaecum
+ileocolic
+ileocolitis
+ileocolostomy
+ileocolotomy
+ileon
+ileosigmoidostomy
+ileostomy
+ileotomy
+ilesite
+ileum
+ileus
+ilex
+ilia
+Iliac
+iliac
+iliacus
+Iliad
+Iliadic
+Iliadist
+Iliadize
+iliahi
+ilial
+Ilian
+iliau
+Ilicaceae
+ilicaceous
+ilicic
+ilicin
+ilima
+iliocaudal
+iliocaudalis
+iliococcygeal
+iliococcygeus
+iliococcygian
+iliocostal
+iliocostalis
+iliodorsal
+iliofemoral
+iliohypogastric
+ilioinguinal
+ilioischiac
+ilioischiatic
+iliolumbar
+iliopectineal
+iliopelvic
+ilioperoneal
+iliopsoas
+iliopsoatic
+iliopubic
+iliosacral
+iliosciatic
+ilioscrotal
+iliospinal
+iliotibial
+iliotrochanteric
+Ilissus
+ilium
+ilk
+ilka
+ilkane
+ill
+illaborate
+illachrymable
+illachrymableness
+Illaenus
+Illano
+Illanun
+illapsable
+illapse
+illapsive
+illaqueate
+illaqueation
+illation
+illative
+illatively
+illaudable
+illaudably
+illaudation
+illaudatory
+Illecebraceae
+illecebrous
+illeck
+illegal
+illegality
+illegalize
+illegally
+illegalness
+illegibility
+illegible
+illegibleness
+illegibly
+illegitimacy
+illegitimate
+illegitimately
+illegitimateness
+illegitimation
+illegitimatize
+illeism
+illeist
+illess
+illfare
+illguide
+illiberal
+illiberalism
+illiberality
+illiberalize
+illiberally
+illiberalness
+illicit
+illicitly
+illicitness
+Illicium
+illimitability
+illimitable
+illimitableness
+illimitably
+illimitate
+illimitation
+illimited
+illimitedly
+illimitedness
+illinition
+illinium
+Illinoian
+Illinois
+Illinoisan
+Illinoisian
+Illipe
+illipene
+illiquation
+illiquid
+illiquidity
+illiquidly
+illish
+illision
+illiteracy
+illiteral
+illiterate
+illiterately
+illiterateness
+illiterature
+illium
+illness
+illocal
+illocality
+illocally
+illogic
+illogical
+illogicality
+illogically
+illogicalness
+illogician
+illogicity
+Illoricata
+illoricate
+illoricated
+illoyal
+illoyalty
+illth
+illucidate
+illucidation
+illucidative
+illude
+illudedly
+illuder
+illume
+illumer
+illuminability
+illuminable
+illuminance
+illuminant
+illuminate
+illuminated
+illuminati
+illuminating
+illuminatingly
+illumination
+illuminational
+illuminatism
+illuminatist
+illuminative
+illuminato
+illuminator
+illuminatory
+illuminatus
+illumine
+illuminee
+illuminer
+Illuminism
+illuminist
+Illuministic
+Illuminize
+illuminometer
+illuminous
+illupi
+illure
+illurement
+illusible
+illusion
+illusionable
+illusional
+illusionary
+illusioned
+illusionism
+illusionist
+illusionistic
+illusive
+illusively
+illusiveness
+illusor
+illusorily
+illusoriness
+illusory
+illustrable
+illustratable
+illustrate
+illustration
+illustrational
+illustrative
+illustratively
+illustrator
+illustratory
+illustratress
+illustre
+illustricity
+illustrious
+illustriously
+illustriousness
+illutate
+illutation
+illuvial
+illuviate
+illuviation
+illy
+Illyrian
+Illyric
+ilmenite
+ilmenitite
+ilmenorutile
+Ilocano
+Ilokano
+Iloko
+Ilongot
+ilot
+Ilpirra
+ilvaite
+Ilya
+Ilysanthes
+Ilysia
+Ilysiidae
+ilysioid
+Ima
+image
+imageable
+imageless
+imager
+imagerial
+imagerially
+imagery
+imaginability
+imaginable
+imaginableness
+imaginably
+imaginal
+imaginant
+imaginarily
+imaginariness
+imaginary
+imaginate
+imagination
+imaginational
+imaginationalism
+imaginative
+imaginatively
+imaginativeness
+imaginator
+imagine
+imaginer
+imagines
+imaginist
+imaginous
+imagism
+imagist
+imagistic
+imago
+imam
+imamah
+imamate
+imambarah
+imamic
+imamship
+Imantophyllum
+imaret
+imbalance
+imban
+imband
+imbannered
+imbarge
+imbark
+imbarn
+imbased
+imbastardize
+imbat
+imbauba
+imbe
+imbecile
+imbecilely
+imbecilic
+imbecilitate
+imbecility
+imbed
+imbellious
+imber
+imbibe
+imbiber
+imbibition
+imbibitional
+imbibitory
+imbirussu
+imbitter
+imbitterment
+imbolish
+imbondo
+imbonity
+imbordure
+imborsation
+imbosom
+imbower
+imbreathe
+imbreviate
+imbrex
+imbricate
+imbricated
+imbricately
+imbrication
+imbricative
+imbroglio
+imbrue
+imbruement
+imbrute
+imbrutement
+imbue
+imbuement
+imburse
+imbursement
+Imer
+Imerina
+Imeritian
+imi
+imidazole
+imidazolyl
+imide
+imidic
+imidogen
+iminazole
+imine
+imino
+iminohydrin
+imitability
+imitable
+imitableness
+imitancy
+imitant
+imitate
+imitatee
+imitation
+imitational
+imitationist
+imitative
+imitatively
+imitativeness
+imitator
+imitatorship
+imitatress
+imitatrix
+immaculacy
+immaculance
+immaculate
+immaculately
+immaculateness
+immalleable
+immanacle
+immanation
+immane
+immanely
+immanence
+immanency
+immaneness
+immanent
+immanental
+immanentism
+immanentist
+immanently
+Immanes
+immanifest
+immanifestness
+immanity
+immantle
+Immanuel
+immarble
+immarcescible
+immarcescibly
+immarcibleness
+immarginate
+immask
+immatchable
+immaterial
+immaterialism
+immaterialist
+immateriality
+immaterialize
+immaterially
+immaterialness
+immaterials
+immateriate
+immatriculate
+immatriculation
+immature
+immatured
+immaturely
+immatureness
+immaturity
+immeability
+immeasurability
+immeasurable
+immeasurableness
+immeasurably
+immeasured
+immechanical
+immechanically
+immediacy
+immedial
+immediate
+immediately
+immediateness
+immediatism
+immediatist
+immedicable
+immedicableness
+immedicably
+immelodious
+immember
+immemorable
+immemorial
+immemorially
+immense
+immensely
+immenseness
+immensity
+immensive
+immensurability
+immensurable
+immensurableness
+immensurate
+immerd
+immerge
+immergence
+immergent
+immerit
+immerited
+immeritorious
+immeritoriously
+immeritous
+immerse
+immersement
+immersible
+immersion
+immersionism
+immersionist
+immersive
+immethodic
+immethodical
+immethodically
+immethodicalness
+immethodize
+immetrical
+immetrically
+immetricalness
+immew
+immi
+immigrant
+immigrate
+immigration
+immigrator
+immigratory
+imminence
+imminency
+imminent
+imminently
+imminentness
+immingle
+imminution
+immiscibility
+immiscible
+immiscibly
+immission
+immit
+immitigability
+immitigable
+immitigably
+immix
+immixable
+immixture
+immobile
+immobility
+immobilization
+immobilize
+immoderacy
+immoderate
+immoderately
+immoderateness
+immoderation
+immodest
+immodestly
+immodesty
+immodulated
+immolate
+immolation
+immolator
+immoment
+immomentous
+immonastered
+immoral
+immoralism
+immoralist
+immorality
+immoralize
+immorally
+immorigerous
+immorigerousness
+immortability
+immortable
+immortal
+immortalism
+immortalist
+immortality
+immortalizable
+immortalization
+immortalize
+immortalizer
+immortally
+immortalness
+immortalship
+immortelle
+immortification
+immortified
+immotile
+immotioned
+immotive
+immound
+immovability
+immovable
+immovableness
+immovably
+immund
+immundity
+immune
+immunist
+immunity
+immunization
+immunize
+immunochemistry
+immunogen
+immunogenetic
+immunogenetics
+immunogenic
+immunogenically
+immunogenicity
+immunologic
+immunological
+immunologically
+immunologist
+immunology
+immunoreaction
+immunotoxin
+immuration
+immure
+immurement
+immusical
+immusically
+immutability
+immutable
+immutableness
+immutably
+immutation
+immute
+immutilate
+immutual
+Imogen
+Imolinda
+imonium
+imp
+impacability
+impacable
+impack
+impackment
+impact
+impacted
+impaction
+impactionize
+impactment
+impactual
+impages
+impaint
+impair
+impairable
+impairer
+impairment
+impala
+impalace
+impalatable
+impale
+impalement
+impaler
+impall
+impalm
+impalpability
+impalpable
+impalpably
+impalsy
+impaludism
+impanate
+impanation
+impanator
+impane
+impanel
+impanelment
+impapase
+impapyrate
+impar
+imparadise
+imparalleled
+imparasitic
+impardonable
+impardonably
+imparidigitate
+imparipinnate
+imparisyllabic
+imparity
+impark
+imparkation
+imparl
+imparlance
+imparsonee
+impart
+impartable
+impartance
+impartation
+imparter
+impartial
+impartialism
+impartialist
+impartiality
+impartially
+impartialness
+impartibilibly
+impartibility
+impartible
+impartibly
+imparticipable
+impartite
+impartive
+impartivity
+impartment
+impassability
+impassable
+impassableness
+impassably
+impasse
+impassibilibly
+impassibility
+impassible
+impassibleness
+impassion
+impassionable
+impassionate
+impassionately
+impassioned
+impassionedly
+impassionedness
+impassionment
+impassive
+impassively
+impassiveness
+impassivity
+impastation
+impaste
+impasto
+impasture
+impaternate
+impatible
+impatience
+impatiency
+Impatiens
+impatient
+Impatientaceae
+impatientaceous
+impatiently
+impatientness
+impatronize
+impave
+impavid
+impavidity
+impavidly
+impawn
+impayable
+impeach
+impeachability
+impeachable
+impeacher
+impeachment
+impearl
+impeccability
+impeccable
+impeccably
+impeccance
+impeccancy
+impeccant
+impectinate
+impecuniary
+impecuniosity
+impecunious
+impecuniously
+impecuniousness
+impedance
+impede
+impeder
+impedibility
+impedible
+impedient
+impediment
+impedimenta
+impedimental
+impedimentary
+impeding
+impedingly
+impedite
+impedition
+impeditive
+impedometer
+impeevish
+impel
+impellent
+impeller
+impen
+impend
+impendence
+impendency
+impendent
+impending
+impenetrability
+impenetrable
+impenetrableness
+impenetrably
+impenetrate
+impenetration
+impenetrative
+impenitence
+impenitent
+impenitently
+impenitentness
+impenitible
+impenitibleness
+impennate
+Impennes
+impent
+imperance
+imperant
+Imperata
+imperate
+imperation
+imperatival
+imperative
+imperatively
+imperativeness
+imperator
+imperatorial
+imperatorially
+imperatorian
+imperatorious
+imperatorship
+imperatory
+imperatrix
+imperceivable
+imperceivableness
+imperceivably
+imperceived
+imperceiverant
+imperceptibility
+imperceptible
+imperceptibleness
+imperceptibly
+imperception
+imperceptive
+imperceptiveness
+imperceptivity
+impercipience
+impercipient
+imperence
+imperent
+imperfect
+imperfected
+imperfectibility
+imperfectible
+imperfection
+imperfectious
+imperfective
+imperfectly
+imperfectness
+imperforable
+Imperforata
+imperforate
+imperforated
+imperforation
+imperformable
+imperia
+imperial
+imperialin
+imperialine
+imperialism
+imperialist
+imperialistic
+imperialistically
+imperiality
+imperialization
+imperialize
+imperially
+imperialness
+imperialty
+imperil
+imperilment
+imperious
+imperiously
+imperiousness
+imperish
+imperishability
+imperishable
+imperishableness
+imperishably
+imperite
+imperium
+impermanence
+impermanency
+impermanent
+impermanently
+impermeability
+impermeabilization
+impermeabilize
+impermeable
+impermeableness
+impermeably
+impermeated
+impermeator
+impermissible
+impermutable
+imperscriptible
+imperscrutable
+impersonable
+impersonal
+impersonality
+impersonalization
+impersonalize
+impersonally
+impersonate
+impersonation
+impersonative
+impersonator
+impersonatress
+impersonatrix
+impersonification
+impersonify
+impersonization
+impersonize
+imperspicuity
+imperspicuous
+imperspirability
+imperspirable
+impersuadable
+impersuadableness
+impersuasibility
+impersuasible
+impersuasibleness
+impersuasibly
+impertinacy
+impertinence
+impertinency
+impertinent
+impertinently
+impertinentness
+impertransible
+imperturbability
+imperturbable
+imperturbableness
+imperturbably
+imperturbation
+imperturbed
+imperverse
+impervertible
+impervestigable
+imperviability
+imperviable
+imperviableness
+impervial
+impervious
+imperviously
+imperviousness
+impest
+impestation
+impester
+impeticos
+impetiginous
+impetigo
+impetition
+impetrate
+impetration
+impetrative
+impetrator
+impetratory
+impetre
+impetulant
+impetulantly
+impetuosity
+impetuous
+impetuously
+impetuousness
+impetus
+Impeyan
+imphee
+impi
+impicture
+impierceable
+impiety
+impignorate
+impignoration
+impinge
+impingement
+impingence
+impingent
+impinger
+impinguate
+impious
+impiously
+impiousness
+impish
+impishly
+impishness
+impiteous
+impitiably
+implacability
+implacable
+implacableness
+implacably
+implacement
+implacental
+Implacentalia
+implacentate
+implant
+implantation
+implanter
+implastic
+implasticity
+implate
+implausibility
+implausible
+implausibleness
+implausibly
+impleach
+implead
+impleadable
+impleader
+impledge
+implement
+implemental
+implementation
+implementiferous
+implete
+impletion
+impletive
+implex
+impliable
+implial
+implicant
+implicate
+implicately
+implicateness
+implication
+implicational
+implicative
+implicatively
+implicatory
+implicit
+implicitly
+implicitness
+impliedly
+impliedness
+impling
+implode
+implodent
+implorable
+imploration
+implorator
+imploratory
+implore
+implorer
+imploring
+imploringly
+imploringness
+implosion
+implosive
+implosively
+implume
+implumed
+implunge
+impluvium
+imply
+impocket
+impofo
+impoison
+impoisoner
+impolarizable
+impolicy
+impolished
+impolite
+impolitely
+impoliteness
+impolitic
+impolitical
+impolitically
+impoliticalness
+impoliticly
+impoliticness
+impollute
+imponderabilia
+imponderability
+imponderable
+imponderableness
+imponderably
+imponderous
+impone
+imponent
+impoor
+impopular
+impopularly
+imporosity
+imporous
+import
+importability
+importable
+importableness
+importably
+importance
+importancy
+important
+importantly
+importation
+importer
+importless
+importment
+importraiture
+importray
+importunacy
+importunance
+importunate
+importunately
+importunateness
+importunator
+importune
+importunely
+importunement
+importuner
+importunity
+imposable
+imposableness
+imposal
+impose
+imposement
+imposer
+imposing
+imposingly
+imposingness
+imposition
+impositional
+impositive
+impossibilification
+impossibilism
+impossibilist
+impossibilitate
+impossibility
+impossible
+impossibleness
+impossibly
+impost
+imposter
+imposterous
+impostor
+impostorism
+impostorship
+impostress
+impostrix
+impostrous
+impostumate
+impostumation
+impostume
+imposture
+imposturism
+imposturous
+imposure
+impot
+impotable
+impotence
+impotency
+impotent
+impotently
+impotentness
+impound
+impoundable
+impoundage
+impounder
+impoundment
+impoverish
+impoverisher
+impoverishment
+impracticability
+impracticable
+impracticableness
+impracticably
+impractical
+impracticality
+impracticalness
+imprecant
+imprecate
+imprecation
+imprecator
+imprecatorily
+imprecatory
+imprecise
+imprecisely
+imprecision
+impredicability
+impredicable
+impreg
+impregn
+impregnability
+impregnable
+impregnableness
+impregnably
+impregnant
+impregnate
+impregnation
+impregnative
+impregnator
+impregnatory
+imprejudice
+impremeditate
+impreparation
+impresa
+impresario
+imprescience
+imprescribable
+imprescriptibility
+imprescriptible
+imprescriptibly
+imprese
+impress
+impressable
+impressedly
+impresser
+impressibility
+impressible
+impressibleness
+impressibly
+impression
+impressionability
+impressionable
+impressionableness
+impressionably
+impressional
+impressionalist
+impressionality
+impressionally
+impressionary
+impressionism
+impressionist
+impressionistic
+impressionistically
+impressionless
+impressive
+impressively
+impressiveness
+impressment
+impressor
+impressure
+imprest
+imprestable
+impreventability
+impreventable
+imprevisibility
+imprevisible
+imprevision
+imprimatur
+imprime
+imprimitive
+imprimitivity
+imprint
+imprinter
+imprison
+imprisonable
+imprisoner
+imprisonment
+improbability
+improbabilize
+improbable
+improbableness
+improbably
+improbation
+improbative
+improbatory
+improbity
+improcreant
+improcurability
+improcurable
+improducible
+improficience
+improficiency
+improgressive
+improgressively
+improgressiveness
+improlificical
+impromptitude
+impromptu
+impromptuary
+impromptuist
+improof
+improper
+improperation
+improperly
+improperness
+impropriate
+impropriation
+impropriator
+impropriatrix
+impropriety
+improvability
+improvable
+improvableness
+improvably
+improve
+improvement
+improver
+improvership
+improvidence
+improvident
+improvidentially
+improvidently
+improving
+improvingly
+improvisate
+improvisation
+improvisational
+improvisator
+improvisatorial
+improvisatorially
+improvisatorize
+improvisatory
+improvise
+improvisedly
+improviser
+improvision
+improviso
+improvisor
+imprudence
+imprudency
+imprudent
+imprudential
+imprudently
+imprudentness
+impship
+impuberal
+impuberate
+impuberty
+impubic
+impudence
+impudency
+impudent
+impudently
+impudentness
+impudicity
+impugn
+impugnability
+impugnable
+impugnation
+impugner
+impugnment
+impuissance
+impuissant
+impulse
+impulsion
+impulsive
+impulsively
+impulsiveness
+impulsivity
+impulsory
+impunctate
+impunctual
+impunctuality
+impunely
+impunible
+impunibly
+impunity
+impure
+impurely
+impureness
+impuritan
+impuritanism
+impurity
+imputability
+imputable
+imputableness
+imputably
+imputation
+imputative
+imputatively
+imputativeness
+impute
+imputedly
+imputer
+imputrescence
+imputrescibility
+imputrescible
+imputrid
+impy
+imshi
+imsonic
+imu
+in
+inability
+inabordable
+inabstinence
+inaccentuated
+inaccentuation
+inacceptable
+inaccessibility
+inaccessible
+inaccessibleness
+inaccessibly
+inaccordance
+inaccordancy
+inaccordant
+inaccordantly
+inaccuracy
+inaccurate
+inaccurately
+inaccurateness
+inachid
+Inachidae
+inachoid
+Inachus
+inacquaintance
+inacquiescent
+inactinic
+inaction
+inactionist
+inactivate
+inactivation
+inactive
+inactively
+inactiveness
+inactivity
+inactuate
+inactuation
+inadaptability
+inadaptable
+inadaptation
+inadaptive
+inadept
+inadequacy
+inadequate
+inadequately
+inadequateness
+inadequation
+inadequative
+inadequatively
+inadherent
+inadhesion
+inadhesive
+inadjustability
+inadjustable
+inadmissibility
+inadmissible
+inadmissibly
+inadventurous
+inadvertence
+inadvertency
+inadvertent
+inadvertently
+inadvisability
+inadvisable
+inadvisableness
+inadvisedly
+inaesthetic
+inaffability
+inaffable
+inaffectation
+inagglutinability
+inagglutinable
+inaggressive
+inagile
+inaidable
+inaja
+inalacrity
+inalienability
+inalienable
+inalienableness
+inalienably
+inalimental
+inalterability
+inalterable
+inalterableness
+inalterably
+inamissibility
+inamissible
+inamissibleness
+inamorata
+inamorate
+inamoration
+inamorato
+inamovability
+inamovable
+inane
+inanely
+inanga
+inangulate
+inanimadvertence
+inanimate
+inanimated
+inanimately
+inanimateness
+inanimation
+inanition
+inanity
+inantherate
+inapathy
+inapostate
+inapparent
+inappealable
+inappeasable
+inappellability
+inappellable
+inappendiculate
+inapperceptible
+inappertinent
+inappetence
+inappetency
+inappetent
+inappetible
+inapplicability
+inapplicable
+inapplicableness
+inapplicably
+inapplication
+inapposite
+inappositely
+inappositeness
+inappreciable
+inappreciably
+inappreciation
+inappreciative
+inappreciatively
+inappreciativeness
+inapprehensible
+inapprehension
+inapprehensive
+inapprehensiveness
+inapproachability
+inapproachable
+inapproachably
+inappropriable
+inappropriableness
+inappropriate
+inappropriately
+inappropriateness
+inapt
+inaptitude
+inaptly
+inaptness
+inaqueous
+inarable
+inarch
+inarculum
+inarguable
+inarguably
+inarm
+inarticulacy
+Inarticulata
+inarticulate
+inarticulated
+inarticulately
+inarticulateness
+inarticulation
+inartificial
+inartificiality
+inartificially
+inartificialness
+inartistic
+inartistical
+inartisticality
+inartistically
+inasmuch
+inassimilable
+inassimilation
+inassuageable
+inattackable
+inattention
+inattentive
+inattentively
+inattentiveness
+inaudibility
+inaudible
+inaudibleness
+inaudibly
+inaugur
+inaugural
+inaugurate
+inauguration
+inaugurative
+inaugurator
+inauguratory
+inaugurer
+inaurate
+inauration
+inauspicious
+inauspiciously
+inauspiciousness
+inauthentic
+inauthenticity
+inauthoritative
+inauthoritativeness
+inaxon
+inbe
+inbeaming
+inbearing
+inbeing
+inbending
+inbent
+inbirth
+inblow
+inblowing
+inblown
+inboard
+inbond
+inborn
+inbound
+inbread
+inbreak
+inbreaking
+inbreathe
+inbreather
+inbred
+inbreed
+inbring
+inbringer
+inbuilt
+inburning
+inburnt
+inburst
+inby
+Inca
+Incaic
+incalculability
+incalculable
+incalculableness
+incalculably
+incalescence
+incalescency
+incalescent
+incaliculate
+incalver
+incalving
+incameration
+Incan
+incandent
+incandesce
+incandescence
+incandescency
+incandescent
+incandescently
+incanous
+incantation
+incantational
+incantator
+incantatory
+incanton
+incapability
+incapable
+incapableness
+incapably
+incapacious
+incapaciousness
+incapacitate
+incapacitation
+incapacity
+incapsulate
+incapsulation
+incaptivate
+incarcerate
+incarceration
+incarcerator
+incardinate
+incardination
+Incarial
+incarmined
+incarn
+incarnadine
+incarnant
+incarnate
+incarnation
+incarnational
+incarnationist
+incarnative
+Incarvillea
+incase
+incasement
+incast
+incatenate
+incatenation
+incaution
+incautious
+incautiously
+incautiousness
+incavate
+incavated
+incavation
+incavern
+incedingly
+incelebrity
+incendiarism
+incendiary
+incendivity
+incensation
+incense
+incenseless
+incensement
+incensory
+incensurable
+incensurably
+incenter
+incentive
+incentively
+incentor
+incept
+inception
+inceptive
+inceptively
+inceptor
+inceration
+incertitude
+incessable
+incessably
+incessancy
+incessant
+incessantly
+incessantness
+incest
+incestuous
+incestuously
+incestuousness
+inch
+inched
+inchmeal
+inchoacy
+inchoant
+inchoate
+inchoately
+inchoateness
+inchoation
+inchoative
+inchpin
+inchworm
+incide
+incidence
+incident
+incidental
+incidentalist
+incidentally
+incidentalness
+incidentless
+incidently
+incinerable
+incinerate
+incineration
+incinerator
+incipience
+incipient
+incipiently
+incircumscription
+incircumspect
+incircumspection
+incircumspectly
+incircumspectness
+incisal
+incise
+incisely
+incisiform
+incision
+incisive
+incisively
+incisiveness
+incisor
+incisorial
+incisory
+incisure
+incitability
+incitable
+incitant
+incitation
+incite
+incitement
+inciter
+incitingly
+incitive
+incitress
+incivic
+incivility
+incivilization
+incivism
+inclemency
+inclement
+inclemently
+inclementness
+inclinable
+inclinableness
+inclination
+inclinational
+inclinator
+inclinatorily
+inclinatorium
+inclinatory
+incline
+incliner
+inclinograph
+inclinometer
+inclip
+inclose
+inclosure
+includable
+include
+included
+includedness
+includer
+inclusa
+incluse
+inclusion
+inclusionist
+inclusive
+inclusively
+inclusiveness
+inclusory
+incoagulable
+incoalescence
+incoercible
+incog
+incogent
+incogitability
+incogitable
+incogitancy
+incogitant
+incogitantly
+incogitative
+incognita
+incognitive
+incognito
+incognizability
+incognizable
+incognizance
+incognizant
+incognoscent
+incognoscibility
+incognoscible
+incoherence
+incoherency
+incoherent
+incoherentific
+incoherently
+incoherentness
+incohering
+incohesion
+incohesive
+incoincidence
+incoincident
+incombustibility
+incombustible
+incombustibleness
+incombustibly
+incombustion
+income
+incomeless
+incomer
+incoming
+incommensurability
+incommensurable
+incommensurableness
+incommensurably
+incommensurate
+incommensurately
+incommensurateness
+incommiscibility
+incommiscible
+incommodate
+incommodation
+incommode
+incommodement
+incommodious
+incommodiously
+incommodiousness
+incommodity
+incommunicability
+incommunicable
+incommunicableness
+incommunicably
+incommunicado
+incommunicative
+incommunicatively
+incommunicativeness
+incommutability
+incommutable
+incommutableness
+incommutably
+incompact
+incompactly
+incompactness
+incomparability
+incomparable
+incomparableness
+incomparably
+incompassionate
+incompassionately
+incompassionateness
+incompatibility
+incompatible
+incompatibleness
+incompatibly
+incompendious
+incompensated
+incompensation
+incompetence
+incompetency
+incompetent
+incompetently
+incompetentness
+incompletability
+incompletable
+incompletableness
+incomplete
+incompleted
+incompletely
+incompleteness
+incompletion
+incomplex
+incompliance
+incompliancy
+incompliant
+incompliantly
+incomplicate
+incomplying
+incomposed
+incomposedly
+incomposedness
+incomposite
+incompossibility
+incompossible
+incomprehended
+incomprehending
+incomprehendingly
+incomprehensibility
+incomprehensible
+incomprehensibleness
+incomprehensibly
+incomprehension
+incomprehensive
+incomprehensively
+incomprehensiveness
+incompressibility
+incompressible
+incompressibleness
+incompressibly
+incomputable
+inconcealable
+inconceivability
+inconceivable
+inconceivableness
+inconceivably
+inconcinnate
+inconcinnately
+inconcinnity
+inconcinnous
+inconcludent
+inconcluding
+inconclusion
+inconclusive
+inconclusively
+inconclusiveness
+inconcrete
+inconcurrent
+inconcurring
+incondensability
+incondensable
+incondensibility
+incondensible
+incondite
+inconditionate
+inconditioned
+inconducive
+inconfirm
+inconformable
+inconformably
+inconformity
+inconfused
+inconfusedly
+inconfusion
+inconfutable
+inconfutably
+incongealable
+incongealableness
+incongenerous
+incongenial
+incongeniality
+inconglomerate
+incongruence
+incongruent
+incongruently
+incongruity
+incongruous
+incongruously
+incongruousness
+inconjoinable
+inconnected
+inconnectedness
+inconnu
+inconscience
+inconscient
+inconsciently
+inconscious
+inconsciously
+inconsecutive
+inconsecutively
+inconsecutiveness
+inconsequence
+inconsequent
+inconsequential
+inconsequentiality
+inconsequentially
+inconsequently
+inconsequentness
+inconsiderable
+inconsiderableness
+inconsiderably
+inconsiderate
+inconsiderately
+inconsiderateness
+inconsideration
+inconsidered
+inconsistence
+inconsistency
+inconsistent
+inconsistently
+inconsistentness
+inconsolability
+inconsolable
+inconsolableness
+inconsolably
+inconsolate
+inconsolately
+inconsonance
+inconsonant
+inconsonantly
+inconspicuous
+inconspicuously
+inconspicuousness
+inconstancy
+inconstant
+inconstantly
+inconstantness
+inconstruable
+inconsultable
+inconsumable
+inconsumably
+inconsumed
+incontaminable
+incontaminate
+incontaminateness
+incontemptible
+incontestability
+incontestable
+incontestableness
+incontestably
+incontinence
+incontinency
+incontinent
+incontinently
+incontinuity
+incontinuous
+incontracted
+incontractile
+incontraction
+incontrollable
+incontrollably
+incontrolled
+incontrovertibility
+incontrovertible
+incontrovertibleness
+incontrovertibly
+inconvenience
+inconveniency
+inconvenient
+inconveniently
+inconvenientness
+inconversable
+inconversant
+inconversibility
+inconvertibility
+inconvertible
+inconvertibleness
+inconvertibly
+inconvinced
+inconvincedly
+inconvincibility
+inconvincible
+inconvincibly
+incopresentability
+incopresentable
+incoronate
+incoronated
+incoronation
+incorporable
+incorporate
+incorporated
+incorporatedness
+incorporation
+incorporative
+incorporator
+incorporeal
+incorporealism
+incorporealist
+incorporeality
+incorporealize
+incorporeally
+incorporeity
+incorporeous
+incorpse
+incorrect
+incorrection
+incorrectly
+incorrectness
+incorrespondence
+incorrespondency
+incorrespondent
+incorresponding
+incorrigibility
+incorrigible
+incorrigibleness
+incorrigibly
+incorrodable
+incorrodible
+incorrosive
+incorrupt
+incorrupted
+incorruptibility
+Incorruptible
+incorruptible
+incorruptibleness
+incorruptibly
+incorruption
+incorruptly
+incorruptness
+incourteous
+incourteously
+incrash
+incrassate
+incrassated
+incrassation
+incrassative
+increasable
+increasableness
+increase
+increasedly
+increaseful
+increasement
+increaser
+increasing
+increasingly
+increate
+increately
+increative
+incredibility
+incredible
+incredibleness
+incredibly
+increditable
+incredited
+incredulity
+incredulous
+incredulously
+incredulousness
+increep
+incremate
+incremation
+increment
+incremental
+incrementation
+increpate
+increpation
+increscence
+increscent
+increst
+incretion
+incretionary
+incretory
+incriminate
+incrimination
+incriminator
+incriminatory
+incross
+incrossbred
+incrossing
+incrotchet
+incruent
+incruental
+incruentous
+incrust
+incrustant
+Incrustata
+incrustate
+incrustation
+incrustator
+incrustive
+incrustment
+incrystal
+incrystallizable
+incubate
+incubation
+incubational
+incubative
+incubator
+incubatorium
+incubatory
+incubi
+incubous
+incubus
+incudal
+incudate
+incudectomy
+incudes
+incudomalleal
+incudostapedial
+inculcate
+inculcation
+inculcative
+inculcator
+inculcatory
+inculpability
+inculpable
+inculpableness
+inculpably
+inculpate
+inculpation
+inculpative
+inculpatory
+incult
+incultivation
+inculture
+incumbence
+incumbency
+incumbent
+incumbentess
+incumbently
+incumber
+incumberment
+incumbrance
+incumbrancer
+incunable
+incunabula
+incunabular
+incunabulist
+incunabulum
+incuneation
+incur
+incurability
+incurable
+incurableness
+incurably
+incuriosity
+incurious
+incuriously
+incuriousness
+incurrable
+incurrence
+incurrent
+incurse
+incursion
+incursionist
+incursive
+incurvate
+incurvation
+incurvature
+incurve
+incus
+incuse
+incut
+incutting
+Ind
+indaba
+indaconitine
+indagate
+indagation
+indagative
+indagator
+indagatory
+indamine
+indan
+indane
+Indanthrene
+indanthrene
+indart
+indazin
+indazine
+indazol
+indazole
+inde
+indebt
+indebted
+indebtedness
+indebtment
+indecence
+indecency
+indecent
+indecently
+indecentness
+Indecidua
+indeciduate
+indeciduous
+indecipherability
+indecipherable
+indecipherableness
+indecipherably
+indecision
+indecisive
+indecisively
+indecisiveness
+indeclinable
+indeclinableness
+indeclinably
+indecomponible
+indecomposable
+indecomposableness
+indecorous
+indecorously
+indecorousness
+indecorum
+indeed
+indeedy
+indefaceable
+indefatigability
+indefatigable
+indefatigableness
+indefatigably
+indefeasibility
+indefeasible
+indefeasibleness
+indefeasibly
+indefeatable
+indefectibility
+indefectible
+indefectibly
+indefective
+indefensibility
+indefensible
+indefensibleness
+indefensibly
+indefensive
+indeficiency
+indeficient
+indeficiently
+indefinable
+indefinableness
+indefinably
+indefinite
+indefinitely
+indefiniteness
+indefinitive
+indefinitively
+indefinitiveness
+indefinitude
+indefinity
+indeflectible
+indefluent
+indeformable
+indehiscence
+indehiscent
+indelectable
+indelegability
+indelegable
+indeliberate
+indeliberately
+indeliberateness
+indeliberation
+indelibility
+indelible
+indelibleness
+indelibly
+indelicacy
+indelicate
+indelicately
+indelicateness
+indemnification
+indemnificator
+indemnificatory
+indemnifier
+indemnify
+indemnitee
+indemnitor
+indemnity
+indemnization
+indemoniate
+indemonstrability
+indemonstrable
+indemonstrableness
+indemonstrably
+indene
+indent
+indentation
+indented
+indentedly
+indentee
+indenter
+indention
+indentment
+indentor
+indenture
+indentured
+indentureship
+indentwise
+independable
+independence
+independency
+independent
+independentism
+independently
+Independista
+indeposable
+indeprehensible
+indeprivability
+indeprivable
+inderivative
+indescribability
+indescribable
+indescribableness
+indescribably
+indescript
+indescriptive
+indesert
+indesignate
+indesirable
+indestructibility
+indestructible
+indestructibleness
+indestructibly
+indetectable
+indeterminable
+indeterminableness
+indeterminably
+indeterminacy
+indeterminate
+indeterminately
+indeterminateness
+indetermination
+indeterminative
+indetermined
+indeterminism
+indeterminist
+indeterministic
+indevirginate
+indevoted
+indevotion
+indevotional
+indevout
+indevoutly
+indevoutness
+index
+indexed
+indexer
+indexical
+indexically
+indexing
+indexless
+indexlessness
+indexterity
+India
+indiadem
+Indiaman
+Indian
+Indiana
+indianaite
+Indianan
+Indianeer
+Indianesque
+Indianhood
+Indianian
+Indianism
+Indianist
+indianite
+indianization
+indianize
+Indic
+indic
+indicable
+indican
+indicant
+indicanuria
+indicate
+indication
+indicative
+indicatively
+indicator
+Indicatoridae
+Indicatorinae
+indicatory
+indicatrix
+indices
+indicia
+indicial
+indicible
+indicium
+indicolite
+indict
+indictable
+indictably
+indictee
+indicter
+indiction
+indictional
+indictive
+indictment
+indictor
+Indies
+indiferous
+indifference
+indifferency
+indifferent
+indifferential
+indifferentism
+indifferentist
+indifferentistic
+indifferently
+indigena
+indigenal
+indigenate
+indigence
+indigency
+indigene
+indigeneity
+Indigenismo
+indigenist
+indigenity
+indigenous
+indigenously
+indigenousness
+indigent
+indigently
+indigested
+indigestedness
+indigestibility
+indigestible
+indigestibleness
+indigestibly
+indigestion
+indigestive
+indigitamenta
+indigitate
+indigitation
+indign
+indignance
+indignancy
+indignant
+indignantly
+indignation
+indignatory
+indignify
+indignity
+indignly
+indigo
+indigoberry
+Indigofera
+indigoferous
+indigoid
+indigotic
+indigotin
+indigotindisulphonic
+indiguria
+indimensible
+indimensional
+indiminishable
+indimple
+indirect
+indirected
+indirection
+indirectly
+indirectness
+indirubin
+indiscernibility
+indiscernible
+indiscernibleness
+indiscernibly
+indiscerptibility
+indiscerptible
+indiscerptibleness
+indiscerptibly
+indisciplinable
+indiscipline
+indisciplined
+indiscoverable
+indiscoverably
+indiscovered
+indiscreet
+indiscreetly
+indiscreetness
+indiscrete
+indiscretely
+indiscretion
+indiscretionary
+indiscriminate
+indiscriminated
+indiscriminately
+indiscriminateness
+indiscriminating
+indiscriminatingly
+indiscrimination
+indiscriminative
+indiscriminatively
+indiscriminatory
+indiscussable
+indiscussible
+indispellable
+indispensability
+indispensable
+indispensableness
+indispensably
+indispose
+indisposed
+indisposedness
+indisposition
+indisputability
+indisputable
+indisputableness
+indisputably
+indissipable
+indissociable
+indissolubility
+indissoluble
+indissolubleness
+indissolubly
+indissolute
+indissolvability
+indissolvable
+indissolvableness
+indissolvably
+indissuadable
+indissuadably
+indistinct
+indistinction
+indistinctive
+indistinctively
+indistinctiveness
+indistinctly
+indistinctness
+indistinguishability
+indistinguishable
+indistinguishableness
+indistinguishably
+indistinguished
+indistortable
+indistributable
+indisturbable
+indisturbance
+indisturbed
+indite
+inditement
+inditer
+indium
+indivertible
+indivertibly
+individable
+individua
+individual
+individualism
+individualist
+individualistic
+individualistically
+individuality
+individualization
+individualize
+individualizer
+individualizingly
+individually
+individuate
+individuation
+individuative
+individuator
+individuity
+individuum
+indivinable
+indivisibility
+indivisible
+indivisibleness
+indivisibly
+indivision
+indocibility
+indocible
+indocibleness
+indocile
+indocility
+indoctrinate
+indoctrination
+indoctrinator
+indoctrine
+indoctrinization
+indoctrinize
+Indogaea
+Indogaean
+indogen
+indogenide
+indole
+indolence
+indolent
+indolently
+indoles
+indoline
+Indologian
+Indologist
+Indologue
+Indology
+indoloid
+indolyl
+indomitability
+indomitable
+indomitableness
+indomitably
+Indone
+Indonesian
+indoor
+indoors
+indophenin
+indophenol
+Indophile
+Indophilism
+Indophilist
+indorsation
+indorse
+indoxyl
+indoxylic
+indoxylsulphuric
+Indra
+indraft
+indraught
+indrawal
+indrawing
+indrawn
+indri
+Indris
+indubious
+indubiously
+indubitable
+indubitableness
+indubitably
+indubitatively
+induce
+induced
+inducedly
+inducement
+inducer
+induciae
+inducible
+inducive
+induct
+inductance
+inductee
+inducteous
+inductile
+inductility
+induction
+inductional
+inductionally
+inductionless
+inductive
+inductively
+inductiveness
+inductivity
+inductometer
+inductophone
+inductor
+inductorium
+inductory
+inductoscope
+indue
+induement
+indulge
+indulgeable
+indulgement
+indulgence
+indulgenced
+indulgency
+indulgent
+indulgential
+indulgentially
+indulgently
+indulgentness
+indulger
+indulging
+indulgingly
+induline
+indult
+indulto
+indument
+indumentum
+induna
+induplicate
+induplication
+induplicative
+indurable
+indurate
+induration
+indurative
+indurite
+Indus
+indusial
+indusiate
+indusiated
+indusiform
+indusioid
+indusium
+industrial
+industrialism
+industrialist
+industrialization
+industrialize
+industrially
+industrialness
+industrious
+industriously
+industriousness
+industrochemical
+industry
+induviae
+induvial
+induviate
+indwell
+indweller
+indy
+indyl
+indylic
+inearth
+inebriacy
+inebriant
+inebriate
+inebriation
+inebriative
+inebriety
+inebrious
+ineconomic
+ineconomy
+inedibility
+inedible
+inedited
+Ineducabilia
+ineducabilian
+ineducability
+ineducable
+ineducation
+ineffability
+ineffable
+ineffableness
+ineffably
+ineffaceability
+ineffaceable
+ineffaceably
+ineffectible
+ineffectibly
+ineffective
+ineffectively
+ineffectiveness
+ineffectual
+ineffectuality
+ineffectually
+ineffectualness
+ineffervescence
+ineffervescent
+ineffervescibility
+ineffervescible
+inefficacious
+inefficaciously
+inefficaciousness
+inefficacity
+inefficacy
+inefficience
+inefficiency
+inefficient
+inefficiently
+ineffulgent
+inelaborate
+inelaborated
+inelaborately
+inelastic
+inelasticate
+inelasticity
+inelegance
+inelegancy
+inelegant
+inelegantly
+ineligibility
+ineligible
+ineligibleness
+ineligibly
+ineliminable
+ineloquence
+ineloquent
+ineloquently
+ineluctability
+ineluctable
+ineluctably
+ineludible
+ineludibly
+inembryonate
+inemendable
+inemotivity
+inemulous
+inenarrable
+inenergetic
+inenubilable
+inenucleable
+inept
+ineptitude
+ineptly
+ineptness
+inequable
+inequal
+inequalitarian
+inequality
+inequally
+inequalness
+inequation
+inequiaxial
+inequicostate
+inequidistant
+inequigranular
+inequilateral
+inequilibrium
+inequilobate
+inequilobed
+inequipotential
+inequipotentiality
+inequitable
+inequitableness
+inequitably
+inequity
+inequivalent
+inequivalve
+inequivalvular
+ineradicable
+ineradicableness
+ineradicably
+inerasable
+inerasableness
+inerasably
+inerasible
+Ineri
+inerm
+Inermes
+Inermi
+Inermia
+inermous
+inerrability
+inerrable
+inerrableness
+inerrably
+inerrancy
+inerrant
+inerrantly
+inerratic
+inerring
+inerringly
+inerroneous
+inert
+inertance
+inertia
+inertial
+inertion
+inertly
+inertness
+inerubescent
+inerudite
+ineruditely
+inerudition
+inescapable
+inescapableness
+inescapably
+inesculent
+inescutcheon
+inesite
+inessential
+inessentiality
+inestimability
+inestimable
+inestimableness
+inestimably
+inestivation
+inethical
+ineunt
+ineuphonious
+inevadible
+inevadibly
+inevaporable
+inevasible
+inevidence
+inevident
+inevitability
+inevitable
+inevitableness
+inevitably
+inexact
+inexacting
+inexactitude
+inexactly
+inexactness
+inexcellence
+inexcitability
+inexcitable
+inexclusive
+inexclusively
+inexcommunicable
+inexcusability
+inexcusable
+inexcusableness
+inexcusably
+inexecutable
+inexecution
+inexertion
+inexhausted
+inexhaustedly
+inexhaustibility
+inexhaustible
+inexhaustibleness
+inexhaustibly
+inexhaustive
+inexhaustively
+inexigible
+inexist
+inexistence
+inexistency
+inexistent
+inexorability
+inexorable
+inexorableness
+inexorably
+inexpansible
+inexpansive
+inexpectancy
+inexpectant
+inexpectation
+inexpected
+inexpectedly
+inexpectedness
+inexpedience
+inexpediency
+inexpedient
+inexpediently
+inexpensive
+inexpensively
+inexpensiveness
+inexperience
+inexperienced
+inexpert
+inexpertly
+inexpertness
+inexpiable
+inexpiableness
+inexpiably
+inexpiate
+inexplainable
+inexplicability
+inexplicable
+inexplicableness
+inexplicables
+inexplicably
+inexplicit
+inexplicitly
+inexplicitness
+inexplorable
+inexplosive
+inexportable
+inexposable
+inexposure
+inexpress
+inexpressibility
+inexpressible
+inexpressibleness
+inexpressibles
+inexpressibly
+inexpressive
+inexpressively
+inexpressiveness
+inexpugnability
+inexpugnable
+inexpugnableness
+inexpugnably
+inexpungeable
+inexpungible
+inextant
+inextended
+inextensibility
+inextensible
+inextensile
+inextension
+inextensional
+inextensive
+inexterminable
+inextinct
+inextinguishable
+inextinguishably
+inextirpable
+inextirpableness
+inextricability
+inextricable
+inextricableness
+inextricably
+Inez
+inface
+infall
+infallibilism
+infallibilist
+infallibility
+infallible
+infallibleness
+infallibly
+infalling
+infalsificable
+infame
+infamiliar
+infamiliarity
+infamize
+infamonize
+infamous
+infamously
+infamousness
+infamy
+infancy
+infand
+infandous
+infang
+infanglement
+infangthief
+infant
+infanta
+infantado
+infante
+infanthood
+infanticidal
+infanticide
+infantile
+infantilism
+infantility
+infantine
+infantlike
+infantry
+infantryman
+infarct
+infarctate
+infarcted
+infarction
+infare
+infatuate
+infatuatedly
+infatuation
+infatuator
+infaust
+infeasibility
+infeasible
+infeasibleness
+infect
+infectant
+infected
+infectedness
+infecter
+infectible
+infection
+infectionist
+infectious
+infectiously
+infectiousness
+infective
+infectiveness
+infectivity
+infector
+infectress
+infectuous
+infecund
+infecundity
+infeed
+infeft
+infeftment
+infelicific
+infelicitous
+infelicitously
+infelicitousness
+infelicity
+infelonious
+infelt
+infeminine
+infer
+inferable
+inference
+inferent
+inferential
+inferentialism
+inferentialist
+inferentially
+inferior
+inferiorism
+inferiority
+inferiorize
+inferiorly
+infern
+infernal
+infernalism
+infernality
+infernalize
+infernally
+infernalry
+infernalship
+inferno
+inferoanterior
+inferobranchiate
+inferofrontal
+inferolateral
+inferomedian
+inferoposterior
+inferrer
+inferribility
+inferrible
+inferringly
+infertile
+infertilely
+infertileness
+infertility
+infest
+infestant
+infestation
+infester
+infestive
+infestivity
+infestment
+infeudation
+infibulate
+infibulation
+inficete
+infidel
+infidelic
+infidelical
+infidelism
+infidelistic
+infidelity
+infidelize
+infidelly
+infield
+infielder
+infieldsman
+infighter
+infighting
+infill
+infilling
+infilm
+infilter
+infiltrate
+infiltration
+infiltrative
+infinitant
+infinitarily
+infinitary
+infinitate
+infinitation
+infinite
+infinitely
+infiniteness
+infinitesimal
+infinitesimalism
+infinitesimality
+infinitesimally
+infinitesimalness
+infiniteth
+infinitieth
+infinitival
+infinitivally
+infinitive
+infinitively
+infinitize
+infinitude
+infinituple
+infinity
+infirm
+infirmarer
+infirmaress
+infirmarian
+infirmary
+infirmate
+infirmation
+infirmative
+infirmity
+infirmly
+infirmness
+infissile
+infit
+infitter
+infix
+infixion
+inflame
+inflamed
+inflamedly
+inflamedness
+inflamer
+inflaming
+inflamingly
+inflammability
+inflammable
+inflammableness
+inflammably
+inflammation
+inflammative
+inflammatorily
+inflammatory
+inflatable
+inflate
+inflated
+inflatedly
+inflatedness
+inflater
+inflatile
+inflatingly
+inflation
+inflationary
+inflationism
+inflationist
+inflative
+inflatus
+inflect
+inflected
+inflectedness
+inflection
+inflectional
+inflectionally
+inflectionless
+inflective
+inflector
+inflex
+inflexed
+inflexibility
+inflexible
+inflexibleness
+inflexibly
+inflexive
+inflict
+inflictable
+inflicter
+infliction
+inflictive
+inflood
+inflorescence
+inflorescent
+inflow
+inflowering
+influence
+influenceable
+influencer
+influencive
+influent
+influential
+influentiality
+influentially
+influenza
+influenzal
+influenzic
+influx
+influxable
+influxible
+influxibly
+influxion
+influxionism
+infold
+infolder
+infolding
+infoldment
+infoliate
+inform
+informable
+informal
+informality
+informalize
+informally
+informant
+information
+informational
+informative
+informatively
+informatory
+informed
+informedly
+informer
+informidable
+informingly
+informity
+infortiate
+infortitude
+infortunate
+infortunately
+infortunateness
+infortune
+infra
+infrabasal
+infrabestial
+infrabranchial
+infrabuccal
+infracanthal
+infracaudal
+infracelestial
+infracentral
+infracephalic
+infraclavicle
+infraclavicular
+infraclusion
+infraconscious
+infracortical
+infracostal
+infracostalis
+infracotyloid
+infract
+infractible
+infraction
+infractor
+infradentary
+infradiaphragmatic
+infragenual
+infraglacial
+infraglenoid
+infraglottic
+infragrant
+infragular
+infrahuman
+infrahyoid
+infralabial
+infralapsarian
+infralapsarianism
+infralinear
+infralittoral
+inframammary
+inframammillary
+inframandibular
+inframarginal
+inframaxillary
+inframedian
+inframercurial
+inframercurian
+inframolecular
+inframontane
+inframundane
+infranatural
+infranaturalism
+infrangibility
+infrangible
+infrangibleness
+infrangibly
+infranodal
+infranuclear
+infraoccipital
+infraocclusion
+infraocular
+infraoral
+infraorbital
+infraordinary
+infrapapillary
+infrapatellar
+infraperipherial
+infrapose
+infraposition
+infraprotein
+infrapubian
+infraradular
+infrared
+infrarenal
+infrarenally
+infrarimal
+infrascapular
+infrascapularis
+infrascientific
+infraspinal
+infraspinate
+infraspinatus
+infraspinous
+infrastapedial
+infrasternal
+infrastigmatal
+infrastipular
+infrastructure
+infrasutral
+infratemporal
+infraterrene
+infraterritorial
+infrathoracic
+infratonsillar
+infratracheal
+infratrochanteric
+infratrochlear
+infratubal
+infraturbinal
+infravaginal
+infraventral
+infrequency
+infrequent
+infrequently
+infrigidate
+infrigidation
+infrigidative
+infringe
+infringement
+infringer
+infringible
+infructiferous
+infructuose
+infructuosity
+infructuous
+infructuously
+infrugal
+infrustrable
+infrustrably
+infula
+infumate
+infumated
+infumation
+infundibular
+Infundibulata
+infundibulate
+infundibuliform
+infundibulum
+infuriate
+infuriately
+infuriatingly
+infuriation
+infuscate
+infuscation
+infuse
+infusedly
+infuser
+infusibility
+infusible
+infusibleness
+infusile
+infusion
+infusionism
+infusionist
+infusive
+Infusoria
+infusorial
+infusorian
+infusoriform
+infusorioid
+infusorium
+infusory
+Ing
+ing
+Inga
+Ingaevones
+Ingaevonic
+ingallantry
+ingate
+ingather
+ingatherer
+ingathering
+ingeldable
+ingeminate
+ingemination
+ingenerability
+ingenerable
+ingenerably
+ingenerate
+ingenerately
+ingeneration
+ingenerative
+ingeniosity
+ingenious
+ingeniously
+ingeniousness
+ingenit
+ingenue
+ingenuity
+ingenuous
+ingenuously
+ingenuousness
+Inger
+ingerminate
+ingest
+ingesta
+ingestible
+ingestion
+ingestive
+Inghamite
+Inghilois
+ingiver
+ingiving
+ingle
+inglenook
+ingleside
+inglobate
+inglobe
+inglorious
+ingloriously
+ingloriousness
+inglutition
+ingluvial
+ingluvies
+ingluviitis
+ingoing
+Ingomar
+ingot
+ingotman
+ingraft
+ingrain
+ingrained
+ingrainedly
+ingrainedness
+Ingram
+ingrammaticism
+ingrandize
+ingrate
+ingrateful
+ingratefully
+ingratefulness
+ingrately
+ingratiate
+ingratiating
+ingratiatingly
+ingratiation
+ingratiatory
+ingratitude
+ingravescent
+ingravidate
+ingravidation
+ingredient
+ingress
+ingression
+ingressive
+ingressiveness
+ingross
+ingrow
+ingrown
+ingrownness
+ingrowth
+inguen
+inguinal
+inguinoabdominal
+inguinocrural
+inguinocutaneous
+inguinodynia
+inguinolabial
+inguinoscrotal
+Inguklimiut
+ingulf
+ingulfment
+ingurgitate
+ingurgitation
+Ingush
+inhabit
+inhabitability
+inhabitable
+inhabitancy
+inhabitant
+inhabitation
+inhabitative
+inhabitativeness
+inhabited
+inhabitedness
+inhabiter
+inhabitiveness
+inhabitress
+inhalant
+inhalation
+inhalator
+inhale
+inhalement
+inhalent
+inhaler
+inharmonic
+inharmonical
+inharmonious
+inharmoniously
+inharmoniousness
+inharmony
+inhaul
+inhauler
+inhaust
+inhaustion
+inhearse
+inheaven
+inhere
+inherence
+inherency
+inherent
+inherently
+inherit
+inheritability
+inheritable
+inheritableness
+inheritably
+inheritage
+inheritance
+inheritor
+inheritress
+inheritrice
+inheritrix
+inhesion
+inhiate
+inhibit
+inhibitable
+inhibiter
+inhibition
+inhibitionist
+inhibitive
+inhibitor
+inhibitory
+inhomogeneity
+inhomogeneous
+inhomogeneously
+inhospitable
+inhospitableness
+inhospitably
+inhospitality
+inhuman
+inhumane
+inhumanely
+inhumanism
+inhumanity
+inhumanize
+inhumanly
+inhumanness
+inhumate
+inhumation
+inhumationist
+inhume
+inhumer
+inhumorous
+inhumorously
+Inia
+inial
+inidoneity
+inidoneous
+Inigo
+inimicable
+inimical
+inimicality
+inimically
+inimicalness
+inimitability
+inimitable
+inimitableness
+inimitably
+iniome
+Iniomi
+iniomous
+inion
+iniquitable
+iniquitably
+iniquitous
+iniquitously
+iniquitousness
+iniquity
+inirritability
+inirritable
+inirritant
+inirritative
+inissuable
+initial
+initialer
+initialist
+initialize
+initially
+initiant
+initiary
+initiate
+initiation
+initiative
+initiatively
+initiator
+initiatorily
+initiatory
+initiatress
+initiatrix
+initis
+initive
+inject
+injectable
+injection
+injector
+injelly
+injudicial
+injudicially
+injudicious
+injudiciously
+injudiciousness
+Injun
+injunct
+injunction
+injunctive
+injunctively
+injurable
+injure
+injured
+injuredly
+injuredness
+injurer
+injurious
+injuriously
+injuriousness
+injury
+injustice
+ink
+inkberry
+inkbush
+inken
+inker
+Inkerman
+inket
+inkfish
+inkholder
+inkhorn
+inkhornism
+inkhornist
+inkhornize
+inkhornizer
+inkindle
+inkiness
+inkish
+inkle
+inkless
+inklike
+inkling
+inkmaker
+inkmaking
+inknot
+inkosi
+inkpot
+Inkra
+inkroot
+inks
+inkshed
+inkslinger
+inkslinging
+inkstain
+inkstand
+inkstandish
+inkstone
+inkweed
+inkwell
+inkwood
+inkwriter
+inky
+inlagation
+inlaid
+inlaik
+inlake
+inland
+inlander
+inlandish
+inlaut
+inlaw
+inlawry
+inlay
+inlayer
+inlaying
+inleague
+inleak
+inleakage
+inlet
+inlier
+inlook
+inlooker
+inly
+inlying
+inmate
+inmeats
+inmixture
+inmost
+inn
+innascibility
+innascible
+innate
+innately
+innateness
+innatism
+innative
+innatural
+innaturality
+innaturally
+inneity
+inner
+innerly
+innermore
+innermost
+innermostly
+innerness
+innervate
+innervation
+innervational
+innerve
+inness
+innest
+innet
+innholder
+inning
+inninmorite
+Innisfail
+innkeeper
+innless
+innocence
+innocency
+innocent
+innocently
+innocentness
+innocuity
+innocuous
+innocuously
+innocuousness
+innominable
+innominables
+innominata
+innominate
+innominatum
+innovant
+innovate
+innovation
+innovational
+innovationist
+innovative
+innovator
+innovatory
+innoxious
+innoxiously
+innoxiousness
+innuendo
+Innuit
+innumerability
+innumerable
+innumerableness
+innumerably
+innumerous
+innutrient
+innutrition
+innutritious
+innutritive
+innyard
+Ino
+inobedience
+inobedient
+inobediently
+inoblast
+inobnoxious
+inobscurable
+inobservable
+inobservance
+inobservancy
+inobservant
+inobservantly
+inobservantness
+inobservation
+inobtainable
+inobtrusive
+inobtrusively
+inobtrusiveness
+inobvious
+Inocarpus
+inoccupation
+Inoceramus
+inochondritis
+inochondroma
+inoculability
+inoculable
+inoculant
+inocular
+inoculate
+inoculation
+inoculative
+inoculator
+inoculum
+inocystoma
+inocyte
+Inodes
+inodorous
+inodorously
+inodorousness
+inoepithelioma
+inoffending
+inoffensive
+inoffensively
+inoffensiveness
+inofficial
+inofficially
+inofficiosity
+inofficious
+inofficiously
+inofficiousness
+inogen
+inogenesis
+inogenic
+inogenous
+inoglia
+inohymenitic
+inolith
+inoma
+inominous
+inomyoma
+inomyositis
+inomyxoma
+inone
+inoneuroma
+inoperable
+inoperative
+inoperativeness
+inopercular
+Inoperculata
+inoperculate
+inopinable
+inopinate
+inopinately
+inopine
+inopportune
+inopportunely
+inopportuneness
+inopportunism
+inopportunist
+inopportunity
+inoppressive
+inoppugnable
+inopulent
+inorb
+inorderly
+inordinacy
+inordinary
+inordinate
+inordinately
+inordinateness
+inorganic
+inorganical
+inorganically
+inorganizable
+inorganization
+inorganized
+inoriginate
+inornate
+inosclerosis
+inoscopy
+inosculate
+inosculation
+inosic
+inosin
+inosinic
+inosite
+inositol
+inostensible
+inostensibly
+inotropic
+inower
+inoxidability
+inoxidable
+inoxidizable
+inoxidize
+inparabola
+inpardonable
+inpatient
+inpayment
+inpensioner
+inphase
+inpolygon
+inpolyhedron
+inport
+inpour
+inpush
+input
+inquaintance
+inquartation
+inquest
+inquestual
+inquiet
+inquietation
+inquietly
+inquietness
+inquietude
+Inquilinae
+inquiline
+inquilinism
+inquilinity
+inquilinous
+inquinate
+inquination
+inquirable
+inquirant
+inquiration
+inquire
+inquirendo
+inquirent
+inquirer
+inquiring
+inquiringly
+inquiry
+inquisite
+inquisition
+inquisitional
+inquisitionist
+inquisitive
+inquisitively
+inquisitiveness
+inquisitor
+inquisitorial
+inquisitorially
+inquisitorialness
+inquisitorious
+inquisitorship
+inquisitory
+inquisitress
+inquisitrix
+inquisiturient
+inradius
+inreality
+inrigged
+inrigger
+inrighted
+inring
+inro
+inroad
+inroader
+inroll
+inrooted
+inrub
+inrun
+inrunning
+inruption
+inrush
+insack
+insagacity
+insalivate
+insalivation
+insalubrious
+insalubrity
+insalutary
+insalvability
+insalvable
+insane
+insanely
+insaneness
+insanify
+insanitariness
+insanitary
+insanitation
+insanity
+insapiency
+insapient
+insatiability
+insatiable
+insatiableness
+insatiably
+insatiate
+insatiated
+insatiately
+insatiateness
+insatiety
+insatisfaction
+insatisfactorily
+insaturable
+inscenation
+inscibile
+inscience
+inscient
+inscribable
+inscribableness
+inscribe
+inscriber
+inscript
+inscriptible
+inscription
+inscriptional
+inscriptioned
+inscriptionist
+inscriptionless
+inscriptive
+inscriptively
+inscriptured
+inscroll
+inscrutability
+inscrutable
+inscrutableness
+inscrutables
+inscrutably
+insculp
+insculpture
+insea
+inseam
+insect
+Insecta
+insectan
+insectarium
+insectary
+insectean
+insected
+insecticidal
+insecticide
+insectiferous
+insectiform
+insectifuge
+insectile
+insectine
+insection
+insectival
+Insectivora
+insectivore
+insectivorous
+insectlike
+insectmonger
+insectologer
+insectologist
+insectology
+insectproof
+insecure
+insecurely
+insecureness
+insecurity
+insee
+inseer
+inselberg
+inseminate
+insemination
+insenescible
+insensate
+insensately
+insensateness
+insense
+insensibility
+insensibilization
+insensibilize
+insensibilizer
+insensible
+insensibleness
+insensibly
+insensitive
+insensitiveness
+insensitivity
+insensuous
+insentience
+insentiency
+insentient
+inseparability
+inseparable
+inseparableness
+inseparably
+inseparate
+inseparately
+insequent
+insert
+insertable
+inserted
+inserter
+insertion
+insertional
+insertive
+inserviceable
+insessor
+Insessores
+insessorial
+inset
+insetter
+inseverable
+inseverably
+inshave
+insheathe
+inshell
+inshining
+inship
+inshoe
+inshoot
+inshore
+inside
+insider
+insidiosity
+insidious
+insidiously
+insidiousness
+insight
+insightful
+insigne
+insignia
+insignificance
+insignificancy
+insignificant
+insignificantly
+insimplicity
+insincere
+insincerely
+insincerity
+insinking
+insinuant
+insinuate
+insinuating
+insinuatingly
+insinuation
+insinuative
+insinuatively
+insinuativeness
+insinuator
+insinuatory
+insinuendo
+insipid
+insipidity
+insipidly
+insipidness
+insipience
+insipient
+insipiently
+insist
+insistence
+insistency
+insistent
+insistently
+insister
+insistingly
+insistive
+insititious
+insnare
+insnarement
+insnarer
+insobriety
+insociability
+insociable
+insociableness
+insociably
+insocial
+insocially
+insofar
+insolate
+insolation
+insole
+insolence
+insolency
+insolent
+insolently
+insolentness
+insolid
+insolidity
+insolubility
+insoluble
+insolubleness
+insolubly
+insolvability
+insolvable
+insolvably
+insolvence
+insolvency
+insolvent
+insomnia
+insomniac
+insomnious
+insomnolence
+insomnolency
+insomnolent
+insomuch
+insonorous
+insooth
+insorb
+insorbent
+insouciance
+insouciant
+insouciantly
+insoul
+inspan
+inspeak
+inspect
+inspectability
+inspectable
+inspectingly
+inspection
+inspectional
+inspectioneer
+inspective
+inspector
+inspectoral
+inspectorate
+inspectorial
+inspectorship
+inspectress
+inspectrix
+inspheration
+insphere
+inspirability
+inspirable
+inspirant
+inspiration
+inspirational
+inspirationalism
+inspirationally
+inspirationist
+inspirative
+inspirator
+inspiratory
+inspiratrix
+inspire
+inspired
+inspiredly
+inspirer
+inspiring
+inspiringly
+inspirit
+inspiriter
+inspiriting
+inspiritingly
+inspiritment
+inspirometer
+inspissant
+inspissate
+inspissation
+inspissator
+inspissosis
+inspoke
+inspoken
+inspreith
+instability
+instable
+install
+installant
+installation
+installer
+installment
+instance
+instancy
+instanding
+instant
+instantaneity
+instantaneous
+instantaneously
+instantaneousness
+instanter
+instantial
+instantly
+instantness
+instar
+instate
+instatement
+instaurate
+instauration
+instaurator
+instead
+instealing
+insteam
+insteep
+instellation
+instep
+instigant
+instigate
+instigatingly
+instigation
+instigative
+instigator
+instigatrix
+instill
+instillation
+instillator
+instillatory
+instiller
+instillment
+instinct
+instinctive
+instinctively
+instinctivist
+instinctivity
+instinctual
+instipulate
+institor
+institorial
+institorian
+institory
+institute
+instituter
+institution
+institutional
+institutionalism
+institutionalist
+institutionality
+institutionalization
+institutionalize
+institutionally
+institutionary
+institutionize
+institutive
+institutively
+institutor
+institutress
+institutrix
+instonement
+instratified
+instreaming
+instrengthen
+instressed
+instroke
+instruct
+instructed
+instructedly
+instructedness
+instructer
+instructible
+instruction
+instructional
+instructionary
+instructive
+instructively
+instructiveness
+instructor
+instructorship
+instructress
+instrument
+instrumental
+instrumentalism
+instrumentalist
+instrumentality
+instrumentalize
+instrumentally
+instrumentary
+instrumentate
+instrumentation
+instrumentative
+instrumentist
+instrumentman
+insuavity
+insubduable
+insubjection
+insubmergible
+insubmersible
+insubmission
+insubmissive
+insubordinate
+insubordinately
+insubordinateness
+insubordination
+insubstantial
+insubstantiality
+insubstantiate
+insubstantiation
+insubvertible
+insuccess
+insuccessful
+insucken
+insuetude
+insufferable
+insufferableness
+insufferably
+insufficience
+insufficiency
+insufficient
+insufficiently
+insufflate
+insufflation
+insufflator
+insula
+insulance
+insulant
+insular
+insularism
+insularity
+insularize
+insularly
+insulary
+insulate
+insulated
+insulating
+insulation
+insulator
+insulin
+insulize
+insulse
+insulsity
+insult
+insultable
+insultant
+insultation
+insulter
+insulting
+insultingly
+insultproof
+insunk
+insuperability
+insuperable
+insuperableness
+insuperably
+insupportable
+insupportableness
+insupportably
+insupposable
+insuppressible
+insuppressibly
+insuppressive
+insurability
+insurable
+insurance
+insurant
+insure
+insured
+insurer
+insurge
+insurgence
+insurgency
+insurgent
+insurgentism
+insurgescence
+insurmountability
+insurmountable
+insurmountableness
+insurmountably
+insurpassable
+insurrect
+insurrection
+insurrectional
+insurrectionally
+insurrectionary
+insurrectionism
+insurrectionist
+insurrectionize
+insurrectory
+insusceptibility
+insusceptible
+insusceptibly
+insusceptive
+inswamp
+inswarming
+insweeping
+inswell
+inswept
+inswing
+inswinger
+intabulate
+intact
+intactile
+intactly
+intactness
+intagliated
+intagliation
+intaglio
+intagliotype
+intake
+intaker
+intangibility
+intangible
+intangibleness
+intangibly
+intarissable
+intarsia
+intarsiate
+intarsist
+intastable
+intaxable
+intechnicality
+integer
+integrability
+integrable
+integral
+integrality
+integralization
+integralize
+integrally
+integrand
+integrant
+integraph
+integrate
+integration
+integrative
+integrator
+integrifolious
+integrious
+integriously
+integripalliate
+integrity
+integrodifferential
+integropallial
+Integropallialia
+Integropalliata
+integropalliate
+integument
+integumental
+integumentary
+integumentation
+inteind
+intellect
+intellectation
+intellected
+intellectible
+intellection
+intellective
+intellectively
+intellectual
+intellectualism
+intellectualist
+intellectualistic
+intellectualistically
+intellectuality
+intellectualization
+intellectualize
+intellectualizer
+intellectually
+intellectualness
+intelligence
+intelligenced
+intelligencer
+intelligency
+intelligent
+intelligential
+intelligently
+intelligentsia
+intelligibility
+intelligible
+intelligibleness
+intelligibly
+intelligize
+intemerate
+intemerately
+intemerateness
+intemeration
+intemperable
+intemperably
+intemperament
+intemperance
+intemperate
+intemperately
+intemperateness
+intemperature
+intempestive
+intempestively
+intempestivity
+intemporal
+intemporally
+intenability
+intenable
+intenancy
+intend
+intendance
+intendancy
+intendant
+intendantism
+intendantship
+intended
+intendedly
+intendedness
+intendence
+intender
+intendible
+intending
+intendingly
+intendit
+intendment
+intenerate
+inteneration
+intenible
+intensate
+intensation
+intensative
+intense
+intensely
+intenseness
+intensification
+intensifier
+intensify
+intension
+intensional
+intensionally
+intensitive
+intensity
+intensive
+intensively
+intensiveness
+intent
+intention
+intentional
+intentionalism
+intentionality
+intentionally
+intentioned
+intentionless
+intentive
+intentively
+intentiveness
+intently
+intentness
+inter
+interabsorption
+interacademic
+interaccessory
+interaccuse
+interacinar
+interacinous
+interact
+interaction
+interactional
+interactionism
+interactionist
+interactive
+interactivity
+interadaptation
+interadditive
+interadventual
+interaffiliation
+interagency
+interagent
+interagglutinate
+interagglutination
+interagree
+interagreement
+interalar
+interallied
+interally
+interalveolar
+interambulacral
+interambulacrum
+interamnian
+interangular
+interanimate
+interannular
+interantagonism
+interantennal
+interantennary
+interapophyseal
+interapplication
+interarboration
+interarch
+interarcualis
+interarmy
+interarticular
+interartistic
+interarytenoid
+interassociation
+interassure
+interasteroidal
+interastral
+interatomic
+interatrial
+interattrition
+interaulic
+interaural
+interauricular
+interavailability
+interavailable
+interaxal
+interaxial
+interaxillary
+interaxis
+interbalance
+interbanded
+interbank
+interbedded
+interbelligerent
+interblend
+interbody
+interbonding
+interborough
+interbourse
+interbrachial
+interbrain
+interbranch
+interbranchial
+interbreath
+interbreed
+interbrigade
+interbring
+interbronchial
+intercadence
+intercadent
+intercalare
+intercalarily
+intercalarium
+intercalary
+intercalate
+intercalation
+intercalative
+intercalatory
+intercale
+intercalm
+intercanal
+intercanalicular
+intercapillary
+intercardinal
+intercarotid
+intercarpal
+intercarpellary
+intercarrier
+intercartilaginous
+intercaste
+intercatenated
+intercausative
+intercavernous
+intercede
+interceder
+intercellular
+intercensal
+intercentral
+intercentrum
+intercept
+intercepter
+intercepting
+interception
+interceptive
+interceptor
+interceptress
+intercerebral
+intercession
+intercessional
+intercessionary
+intercessionment
+intercessive
+intercessor
+intercessorial
+intercessory
+interchaff
+interchange
+interchangeability
+interchangeable
+interchangeableness
+interchangeably
+interchanger
+interchapter
+intercharge
+interchase
+intercheck
+interchoke
+interchondral
+interchurch
+Intercidona
+interciliary
+intercilium
+intercircle
+intercirculate
+intercirculation
+intercision
+intercitizenship
+intercity
+intercivic
+intercivilization
+interclash
+interclasp
+interclass
+interclavicle
+interclavicular
+interclerical
+intercloud
+interclub
+intercoastal
+intercoccygeal
+intercoccygean
+intercohesion
+intercollege
+intercollegian
+intercollegiate
+intercolline
+intercolonial
+intercolonially
+intercolonization
+intercolumn
+intercolumnal
+intercolumnar
+intercolumniation
+intercom
+intercombat
+intercombination
+intercombine
+intercome
+intercommission
+intercommon
+intercommonable
+intercommonage
+intercommoner
+intercommunal
+intercommune
+intercommuner
+intercommunicability
+intercommunicable
+intercommunicate
+intercommunication
+intercommunicative
+intercommunicator
+intercommunion
+intercommunity
+intercompany
+intercomparable
+intercompare
+intercomparison
+intercomplexity
+intercomplimentary
+interconal
+interconciliary
+intercondenser
+intercondylar
+intercondylic
+intercondyloid
+interconfessional
+interconfound
+interconnect
+interconnection
+intercontinental
+intercontorted
+intercontradiction
+intercontradictory
+interconversion
+interconvertibility
+interconvertible
+interconvertibly
+intercooler
+intercooling
+intercoracoid
+intercorporate
+intercorpuscular
+intercorrelate
+intercorrelation
+intercortical
+intercosmic
+intercosmically
+intercostal
+intercostally
+intercostobrachial
+intercostohumeral
+intercotylar
+intercounty
+intercourse
+intercoxal
+intercranial
+intercreate
+intercrescence
+intercrinal
+intercrop
+intercross
+intercrural
+intercrust
+intercrystalline
+intercrystallization
+intercrystallize
+intercultural
+interculture
+intercurl
+intercurrence
+intercurrent
+intercurrently
+intercursation
+intercuspidal
+intercutaneous
+intercystic
+interdash
+interdebate
+interdenominational
+interdental
+interdentally
+interdentil
+interdepartmental
+interdepartmentally
+interdepend
+interdependable
+interdependence
+interdependency
+interdependent
+interdependently
+interderivative
+interdespise
+interdestructive
+interdestructiveness
+interdetermination
+interdetermine
+interdevour
+interdict
+interdiction
+interdictive
+interdictor
+interdictory
+interdictum
+interdifferentiation
+interdiffuse
+interdiffusion
+interdiffusive
+interdiffusiveness
+interdigital
+interdigitate
+interdigitation
+interdine
+interdiscal
+interdispensation
+interdistinguish
+interdistrict
+interdivision
+interdome
+interdorsal
+interdrink
+intereat
+interelectrode
+interelectrodic
+interempire
+interenjoy
+interentangle
+interentanglement
+interepidemic
+interepimeral
+interepithelial
+interequinoctial
+interessee
+interest
+interested
+interestedly
+interestedness
+interester
+interesting
+interestingly
+interestingness
+interestless
+interestuarine
+interface
+interfacial
+interfactional
+interfamily
+interfascicular
+interfault
+interfector
+interfederation
+interfemoral
+interfenestral
+interfenestration
+interferant
+interfere
+interference
+interferent
+interferential
+interferer
+interfering
+interferingly
+interferingness
+interferometer
+interferometry
+interferric
+interfertile
+interfertility
+interfibrillar
+interfibrillary
+interfibrous
+interfilamentar
+interfilamentary
+interfilamentous
+interfilar
+interfiltrate
+interfinger
+interflange
+interflashing
+interflow
+interfluence
+interfluent
+interfluminal
+interfluous
+interfluve
+interfluvial
+interflux
+interfold
+interfoliaceous
+interfoliar
+interfoliate
+interfollicular
+interforce
+interfraternal
+interfraternity
+interfret
+interfretted
+interfriction
+interfrontal
+interfruitful
+interfulgent
+interfuse
+interfusion
+interganglionic
+intergenerant
+intergenerating
+intergeneration
+intergential
+intergesture
+intergilt
+interglacial
+interglandular
+interglobular
+interglyph
+intergossip
+intergovernmental
+intergradation
+intergrade
+intergradient
+intergraft
+intergranular
+intergrapple
+intergrave
+intergroupal
+intergrow
+intergrown
+intergrowth
+intergular
+intergyral
+interhabitation
+interhemal
+interhemispheric
+interhostile
+interhuman
+interhyal
+interhybridize
+interim
+interimist
+interimistic
+interimistical
+interimistically
+interimperial
+interincorporation
+interindependence
+interindicate
+interindividual
+interinfluence
+interinhibition
+interinhibitive
+interinsert
+interinsular
+interinsurance
+interinsurer
+interinvolve
+interionic
+interior
+interiority
+interiorize
+interiorly
+interiorness
+interirrigation
+interisland
+interjacence
+interjacency
+interjacent
+interjaculate
+interjaculatory
+interjangle
+interjealousy
+interject
+interjection
+interjectional
+interjectionalize
+interjectionally
+interjectionary
+interjectionize
+interjectiveness
+interjector
+interjectorily
+interjectory
+interjectural
+interjoin
+interjoist
+interjudgment
+interjunction
+interkinesis
+interkinetic
+interknit
+interknot
+interknow
+interknowledge
+interlaboratory
+interlace
+interlaced
+interlacedly
+interlacement
+interlacery
+interlacustrine
+interlaid
+interlake
+interlamellar
+interlamellation
+interlaminar
+interlaminate
+interlamination
+interlanguage
+interlap
+interlapse
+interlard
+interlardation
+interlardment
+interlatitudinal
+interlaudation
+interlay
+interleaf
+interleague
+interleave
+interleaver
+interlibel
+interlibrary
+interlie
+interligamentary
+interligamentous
+interlight
+interlimitation
+interline
+interlineal
+interlineally
+interlinear
+interlinearily
+interlinearly
+interlineary
+interlineate
+interlineation
+interlinement
+interliner
+Interlingua
+interlingual
+interlinguist
+interlinguistic
+interlining
+interlink
+interloan
+interlobar
+interlobate
+interlobular
+interlocal
+interlocally
+interlocate
+interlocation
+interlock
+interlocker
+interlocular
+interloculus
+interlocution
+interlocutive
+interlocutor
+interlocutorily
+interlocutory
+interlocutress
+interlocutrice
+interlocutrix
+interloop
+interlope
+interloper
+interlot
+interlucation
+interlucent
+interlude
+interluder
+interludial
+interlunar
+interlunation
+interlying
+intermalleolar
+intermammary
+intermammillary
+intermandibular
+intermanorial
+intermarginal
+intermarine
+intermarriage
+intermarriageable
+intermarry
+intermason
+intermastoid
+intermat
+intermatch
+intermaxilla
+intermaxillar
+intermaxillary
+intermaze
+intermeasurable
+intermeasure
+intermeddle
+intermeddlement
+intermeddler
+intermeddlesome
+intermeddlesomeness
+intermeddling
+intermeddlingly
+intermediacy
+intermediae
+intermedial
+intermediary
+intermediate
+intermediately
+intermediateness
+intermediation
+intermediator
+intermediatory
+intermedium
+intermedius
+intermeet
+intermelt
+intermembral
+intermembranous
+intermeningeal
+intermenstrual
+intermenstruum
+interment
+intermental
+intermention
+intermercurial
+intermesenterial
+intermesenteric
+intermesh
+intermessage
+intermessenger
+intermetacarpal
+intermetallic
+intermetameric
+intermetatarsal
+intermew
+intermewed
+intermewer
+intermezzo
+intermigration
+interminability
+interminable
+interminableness
+interminably
+interminant
+interminate
+intermine
+intermingle
+intermingledom
+interminglement
+interminister
+interministerial
+interministerium
+intermission
+intermissive
+intermit
+intermitted
+intermittedly
+intermittence
+intermittency
+intermittent
+intermittently
+intermitter
+intermitting
+intermittingly
+intermix
+intermixedly
+intermixtly
+intermixture
+intermobility
+intermodification
+intermodillion
+intermodulation
+intermolar
+intermolecular
+intermomentary
+intermontane
+intermorainic
+intermotion
+intermountain
+intermundane
+intermundial
+intermundian
+intermundium
+intermunicipal
+intermunicipality
+intermural
+intermuscular
+intermutation
+intermutual
+intermutually
+intermutule
+intern
+internal
+internality
+internalization
+internalize
+internally
+internalness
+internals
+internarial
+internasal
+internation
+international
+internationalism
+internationalist
+internationality
+internationalization
+internationalize
+internationally
+interneciary
+internecinal
+internecine
+internecion
+internecive
+internee
+internetted
+interneural
+interneuronic
+internidal
+internist
+internment
+internobasal
+internodal
+internode
+internodial
+internodian
+internodium
+internodular
+internship
+internuclear
+internuncial
+internunciary
+internunciatory
+internuncio
+internuncioship
+internuncius
+internuptial
+interobjective
+interoceanic
+interoceptive
+interoceptor
+interocular
+interoffice
+interolivary
+interopercle
+interopercular
+interoperculum
+interoptic
+interorbital
+interorbitally
+interoscillate
+interosculant
+interosculate
+interosculation
+interosseal
+interosseous
+interownership
+interpage
+interpalatine
+interpalpebral
+interpapillary
+interparenchymal
+interparental
+interparenthetical
+interparenthetically
+interparietal
+interparietale
+interparliament
+interparliamentary
+interparoxysmal
+interparty
+interpause
+interpave
+interpeal
+interpectoral
+interpeduncular
+interpel
+interpellant
+interpellate
+interpellation
+interpellator
+interpenetrable
+interpenetrant
+interpenetrate
+interpenetration
+interpenetrative
+interpenetratively
+interpermeate
+interpersonal
+interpervade
+interpetaloid
+interpetiolar
+interpetiolary
+interphalangeal
+interphase
+interphone
+interpiece
+interpilaster
+interpilastering
+interplacental
+interplait
+interplanetary
+interplant
+interplanting
+interplay
+interplea
+interplead
+interpleader
+interpledge
+interpleural
+interplical
+interplicate
+interplication
+interplight
+interpoint
+interpolable
+interpolar
+interpolary
+interpolate
+interpolater
+interpolation
+interpolative
+interpolatively
+interpolator
+interpole
+interpolitical
+interpolity
+interpollinate
+interpolymer
+interpone
+interportal
+interposable
+interposal
+interpose
+interposer
+interposing
+interposingly
+interposition
+interposure
+interpour
+interprater
+interpressure
+interpret
+interpretability
+interpretable
+interpretableness
+interpretably
+interpretament
+interpretation
+interpretational
+interpretative
+interpretatively
+interpreter
+interpretership
+interpretive
+interpretively
+interpretorial
+interpretress
+interprismatic
+interproduce
+interprofessional
+interproglottidal
+interproportional
+interprotoplasmic
+interprovincial
+interproximal
+interproximate
+interpterygoid
+interpubic
+interpulmonary
+interpunct
+interpunction
+interpunctuate
+interpunctuation
+interpupillary
+interquarrel
+interquarter
+interrace
+interracial
+interracialism
+interradial
+interradially
+interradiate
+interradiation
+interradium
+interradius
+interrailway
+interramal
+interramicorn
+interramification
+interreceive
+interreflection
+interregal
+interregimental
+interregional
+interregna
+interregnal
+interregnum
+interreign
+interrelate
+interrelated
+interrelatedly
+interrelatedness
+interrelation
+interrelationship
+interreligious
+interrenal
+interrenalism
+interrepellent
+interrepulsion
+interrer
+interresponsibility
+interresponsible
+interreticular
+interreticulation
+interrex
+interrhyme
+interright
+interriven
+interroad
+interrogability
+interrogable
+interrogant
+interrogate
+interrogatedness
+interrogatee
+interrogatingly
+interrogation
+interrogational
+interrogative
+interrogatively
+interrogator
+interrogatorily
+interrogatory
+interrogatrix
+interrogee
+interroom
+interrule
+interrun
+interrupt
+interrupted
+interruptedly
+interruptedness
+interrupter
+interruptible
+interrupting
+interruptingly
+interruption
+interruptive
+interruptively
+interruptor
+interruptory
+intersale
+intersalute
+interscapilium
+interscapular
+interscapulum
+interscene
+interscholastic
+interschool
+interscience
+interscribe
+interscription
+interseaboard
+interseamed
+intersect
+intersectant
+intersection
+intersectional
+intersegmental
+interseminal
+intersentimental
+interseptal
+intersertal
+intersesamoid
+intersession
+intersessional
+interset
+intersex
+intersexual
+intersexualism
+intersexuality
+intershade
+intershifting
+intershock
+intershoot
+intershop
+intersidereal
+intersituate
+intersocial
+intersocietal
+intersociety
+intersole
+intersolubility
+intersoluble
+intersomnial
+intersomnious
+intersonant
+intersow
+interspace
+interspatial
+interspatially
+interspeaker
+interspecial
+interspecific
+interspersal
+intersperse
+interspersedly
+interspersion
+interspheral
+intersphere
+interspicular
+interspinal
+interspinalis
+interspinous
+interspiral
+interspiration
+intersporal
+intersprinkle
+intersqueeze
+interstadial
+interstage
+interstaminal
+interstapedial
+interstate
+interstation
+interstellar
+interstellary
+intersterile
+intersterility
+intersternal
+interstice
+intersticed
+interstimulate
+interstimulation
+interstitial
+interstitially
+interstitious
+interstratification
+interstratify
+interstreak
+interstream
+interstreet
+interstrial
+interstriation
+interstrive
+intersubjective
+intersubsistence
+intersubstitution
+intersuperciliary
+intersusceptation
+intersystem
+intersystematical
+intertalk
+intertangle
+intertanglement
+intertarsal
+interteam
+intertentacular
+intertergal
+interterminal
+interterritorial
+intertessellation
+intertexture
+interthing
+interthreaded
+interthronging
+intertidal
+intertie
+intertill
+intertillage
+intertinge
+intertissued
+intertone
+intertongue
+intertonic
+intertouch
+intertown
+intertrabecular
+intertrace
+intertrade
+intertrading
+intertraffic
+intertragian
+intertransformability
+intertransformable
+intertransmissible
+intertransmission
+intertranspicuous
+intertransversal
+intertransversalis
+intertransversary
+intertransverse
+intertrappean
+intertribal
+intertriginous
+intertriglyph
+intertrigo
+intertrinitarian
+intertrochanteric
+intertropic
+intertropical
+intertropics
+intertrude
+intertuberal
+intertubercular
+intertubular
+intertwin
+intertwine
+intertwinement
+intertwining
+intertwiningly
+intertwist
+intertwistingly
+Intertype
+interungular
+interungulate
+interunion
+interuniversity
+interurban
+interureteric
+intervaginal
+interval
+intervale
+intervalley
+intervallic
+intervallum
+intervalvular
+intervarietal
+intervary
+intervascular
+intervein
+interveinal
+intervenant
+intervene
+intervener
+intervenience
+interveniency
+intervenient
+intervenium
+intervention
+interventional
+interventionism
+interventionist
+interventive
+interventor
+interventral
+interventralia
+interventricular
+intervenular
+interverbal
+interversion
+intervert
+intervertebra
+intervertebral
+intervertebrally
+intervesicular
+interview
+interviewable
+interviewee
+interviewer
+intervillous
+intervisibility
+intervisible
+intervisit
+intervisitation
+intervital
+intervocal
+intervocalic
+intervolute
+intervolution
+intervolve
+interwar
+interweave
+interweavement
+interweaver
+interweaving
+interweavingly
+interwed
+interweld
+interwhiff
+interwhile
+interwhistle
+interwind
+interwish
+interword
+interwork
+interworks
+interworld
+interworry
+interwound
+interwove
+interwoven
+interwovenly
+interwrap
+interwreathe
+interwrought
+interxylary
+interzonal
+interzone
+interzooecial
+interzygapophysial
+intestable
+intestacy
+intestate
+intestation
+intestinal
+intestinally
+intestine
+intestineness
+intestiniform
+intestinovesical
+intext
+intextine
+intexture
+inthrall
+inthrallment
+inthrong
+inthronistic
+inthronization
+inthronize
+inthrow
+inthrust
+intil
+intima
+intimacy
+intimal
+intimate
+intimately
+intimateness
+intimater
+intimation
+intimidate
+intimidation
+intimidator
+intimidatory
+intimidity
+intimity
+intinction
+intine
+intitule
+into
+intoed
+intolerability
+intolerable
+intolerableness
+intolerably
+intolerance
+intolerancy
+intolerant
+intolerantly
+intolerantness
+intolerated
+intolerating
+intoleration
+intonable
+intonate
+intonation
+intonator
+intone
+intonement
+intoner
+intoothed
+intorsion
+intort
+intortillage
+intown
+intoxation
+intoxicable
+intoxicant
+intoxicate
+intoxicated
+intoxicatedly
+intoxicatedness
+intoxicating
+intoxicatingly
+intoxication
+intoxicative
+intoxicator
+intrabiontic
+intrabranchial
+intrabred
+intrabronchial
+intrabuccal
+intracalicular
+intracanalicular
+intracanonical
+intracapsular
+intracardiac
+intracardial
+intracarpal
+intracarpellary
+intracartilaginous
+intracellular
+intracellularly
+intracephalic
+intracerebellar
+intracerebral
+intracerebrally
+intracervical
+intrachordal
+intracistern
+intracity
+intraclitelline
+intracloacal
+intracoastal
+intracoelomic
+intracolic
+intracollegiate
+intracommunication
+intracompany
+intracontinental
+intracorporeal
+intracorpuscular
+intracortical
+intracosmic
+intracosmical
+intracosmically
+intracostal
+intracranial
+intracranially
+intractability
+intractable
+intractableness
+intractably
+intractile
+intracutaneous
+intracystic
+intrada
+intradepartmental
+intradermal
+intradermally
+intradermic
+intradermically
+intradermo
+intradistrict
+intradivisional
+intrados
+intraduodenal
+intradural
+intraecclesiastical
+intraepiphyseal
+intraepithelial
+intrafactory
+intrafascicular
+intrafissural
+intrafistular
+intrafoliaceous
+intraformational
+intrafusal
+intragastric
+intragemmal
+intraglacial
+intraglandular
+intraglobular
+intragroup
+intragroupal
+intragyral
+intrahepatic
+intrahyoid
+intraimperial
+intrait
+intrajugular
+intralamellar
+intralaryngeal
+intralaryngeally
+intraleukocytic
+intraligamentary
+intraligamentous
+intralingual
+intralobar
+intralobular
+intralocular
+intralogical
+intralumbar
+intramammary
+intramarginal
+intramastoid
+intramatrical
+intramatrically
+intramedullary
+intramembranous
+intrameningeal
+intramental
+intrametropolitan
+intramolecular
+intramontane
+intramorainic
+intramundane
+intramural
+intramuralism
+intramuscular
+intramuscularly
+intramyocardial
+intranarial
+intranasal
+intranatal
+intranational
+intraneous
+intraneural
+intranidal
+intranquil
+intranquillity
+intranscalency
+intranscalent
+intransferable
+intransformable
+intransfusible
+intransgressible
+intransient
+intransigency
+intransigent
+intransigentism
+intransigentist
+intransigently
+intransitable
+intransitive
+intransitively
+intransitiveness
+intransitivity
+intranslatable
+intransmissible
+intransmutability
+intransmutable
+intransparency
+intransparent
+intrant
+intranuclear
+intraoctave
+intraocular
+intraoral
+intraorbital
+intraorganization
+intraossal
+intraosseous
+intraosteal
+intraovarian
+intrapair
+intraparenchymatous
+intraparietal
+intraparochial
+intraparty
+intrapelvic
+intrapericardiac
+intrapericardial
+intraperineal
+intraperiosteal
+intraperitoneal
+intraperitoneally
+intrapetiolar
+intraphilosophic
+intrapial
+intraplacental
+intraplant
+intrapleural
+intrapolar
+intrapontine
+intraprostatic
+intraprotoplasmic
+intrapsychic
+intrapsychical
+intrapsychically
+intrapulmonary
+intrapyretic
+intrarachidian
+intrarectal
+intrarelation
+intrarenal
+intraretinal
+intrarhachidian
+intraschool
+intrascrotal
+intrasegmental
+intraselection
+intrasellar
+intraseminal
+intraseptal
+intraserous
+intrashop
+intraspecific
+intraspinal
+intrastate
+intrastromal
+intrasusception
+intrasynovial
+intratarsal
+intratelluric
+intraterritorial
+intratesticular
+intrathecal
+intrathoracic
+intrathyroid
+intratomic
+intratonsillar
+intratrabecular
+intratracheal
+intratracheally
+intratropical
+intratubal
+intratubular
+intratympanic
+intravaginal
+intravalvular
+intravasation
+intravascular
+intravenous
+intravenously
+intraventricular
+intraverbal
+intraversable
+intravertebral
+intravertebrally
+intravesical
+intravital
+intravitelline
+intravitreous
+intraxylary
+intreat
+intrench
+intrenchant
+intrencher
+intrenchment
+intrepid
+intrepidity
+intrepidly
+intrepidness
+intricacy
+intricate
+intricately
+intricateness
+intrication
+intrigant
+intrigue
+intrigueproof
+intriguer
+intriguery
+intriguess
+intriguing
+intriguingly
+intrine
+intrinse
+intrinsic
+intrinsical
+intrinsicality
+intrinsically
+intrinsicalness
+introactive
+introceptive
+introconversion
+introconvertibility
+introconvertible
+introdden
+introduce
+introducee
+introducement
+introducer
+introducible
+introduction
+introductive
+introductively
+introductor
+introductorily
+introductoriness
+introductory
+introductress
+introflex
+introflexion
+introgression
+introgressive
+introinflection
+introit
+introitus
+introject
+introjection
+introjective
+intromissibility
+intromissible
+intromission
+intromissive
+intromit
+intromittence
+intromittent
+intromitter
+intropression
+intropulsive
+introreception
+introrsal
+introrse
+introrsely
+introsensible
+introsentient
+introspect
+introspectable
+introspection
+introspectional
+introspectionism
+introspectionist
+introspective
+introspectively
+introspectiveness
+introspectivism
+introspectivist
+introspector
+introsuction
+introsuscept
+introsusception
+introthoracic
+introtraction
+introvenient
+introverse
+introversibility
+introversible
+introversion
+introversive
+introversively
+introvert
+introverted
+introvertive
+introvision
+introvolution
+intrudance
+intrude
+intruder
+intruding
+intrudingly
+intrudress
+intruse
+intrusion
+intrusional
+intrusionism
+intrusionist
+intrusive
+intrusively
+intrusiveness
+intrust
+intubate
+intubation
+intubationist
+intubator
+intube
+intue
+intuent
+intuicity
+intuit
+intuitable
+intuition
+intuitional
+intuitionalism
+intuitionalist
+intuitionally
+intuitionism
+intuitionist
+intuitionistic
+intuitionless
+intuitive
+intuitively
+intuitiveness
+intuitivism
+intuitivist
+intumesce
+intumescence
+intumescent
+inturbidate
+inturn
+inturned
+inturning
+intussuscept
+intussusception
+intussusceptive
+intwist
+inula
+inulaceous
+inulase
+inulin
+inuloid
+inumbrate
+inumbration
+inunct
+inunction
+inunctum
+inunctuosity
+inunctuous
+inundable
+inundant
+inundate
+inundation
+inundator
+inundatory
+inunderstandable
+inurbane
+inurbanely
+inurbaneness
+inurbanity
+inure
+inured
+inuredness
+inurement
+inurn
+inusitate
+inusitateness
+inusitation
+inustion
+inutile
+inutilely
+inutility
+inutilized
+inutterable
+invaccinate
+invaccination
+invadable
+invade
+invader
+invaginable
+invaginate
+invagination
+invalescence
+invalid
+invalidate
+invalidation
+invalidator
+invalidcy
+invalidhood
+invalidish
+invalidism
+invalidity
+invalidly
+invalidness
+invalidship
+invalorous
+invaluable
+invaluableness
+invaluably
+invalued
+Invar
+invariability
+invariable
+invariableness
+invariably
+invariance
+invariancy
+invariant
+invariantive
+invariantively
+invariantly
+invaried
+invasion
+invasionist
+invasive
+invecked
+invected
+invection
+invective
+invectively
+invectiveness
+invectivist
+invector
+inveigh
+inveigher
+inveigle
+inveiglement
+inveigler
+inveil
+invein
+invendibility
+invendible
+invendibleness
+invenient
+invent
+inventable
+inventary
+inventer
+inventful
+inventibility
+inventible
+inventibleness
+invention
+inventional
+inventionless
+inventive
+inventively
+inventiveness
+inventor
+inventoriable
+inventorial
+inventorially
+inventory
+inventress
+inventurous
+inveracious
+inveracity
+inverisimilitude
+inverity
+inverminate
+invermination
+invernacular
+Inverness
+inversable
+inversatile
+inverse
+inversed
+inversedly
+inversely
+inversion
+inversionist
+inversive
+invert
+invertase
+invertebracy
+invertebral
+Invertebrata
+invertebrate
+invertebrated
+inverted
+invertedly
+invertend
+inverter
+invertibility
+invertible
+invertile
+invertin
+invertive
+invertor
+invest
+investable
+investible
+investigable
+investigatable
+investigate
+investigating
+investigatingly
+investigation
+investigational
+investigative
+investigator
+investigatorial
+investigatory
+investitive
+investitor
+investiture
+investment
+investor
+inveteracy
+inveterate
+inveterately
+inveterateness
+inviability
+invictive
+invidious
+invidiously
+invidiousness
+invigilance
+invigilancy
+invigilation
+invigilator
+invigor
+invigorant
+invigorate
+invigorating
+invigoratingly
+invigoratingness
+invigoration
+invigorative
+invigoratively
+invigorator
+invinate
+invination
+invincibility
+invincible
+invincibleness
+invincibly
+inviolability
+inviolable
+inviolableness
+inviolably
+inviolacy
+inviolate
+inviolated
+inviolately
+inviolateness
+invirile
+invirility
+invirtuate
+inviscate
+inviscation
+inviscid
+inviscidity
+invised
+invisibility
+invisible
+invisibleness
+invisibly
+invitable
+invital
+invitant
+invitation
+invitational
+invitatory
+invite
+invitee
+invitement
+inviter
+invitiate
+inviting
+invitingly
+invitingness
+invitress
+invitrifiable
+invivid
+invocable
+invocant
+invocate
+invocation
+invocative
+invocator
+invocatory
+invoice
+invoke
+invoker
+involatile
+involatility
+involucel
+involucellate
+involucellated
+involucral
+involucrate
+involucre
+involucred
+involucriform
+involucrum
+involuntarily
+involuntariness
+involuntary
+involute
+involuted
+involutedly
+involutely
+involution
+involutional
+involutionary
+involutorial
+involutory
+involve
+involved
+involvedly
+involvedness
+involvement
+involvent
+involver
+invulnerability
+invulnerable
+invulnerableness
+invulnerably
+invultuation
+inwale
+inwall
+inwandering
+inward
+inwardly
+inwardness
+inwards
+inweave
+inwedged
+inweed
+inweight
+inwick
+inwind
+inwit
+inwith
+inwood
+inwork
+inworn
+inwound
+inwoven
+inwrap
+inwrapment
+inwreathe
+inwrit
+inwrought
+inyoite
+inyoke
+Io
+io
+Iodamoeba
+iodate
+iodation
+iodhydrate
+iodhydric
+iodhydrin
+iodic
+iodide
+iodiferous
+iodinate
+iodination
+iodine
+iodinium
+iodinophil
+iodinophilic
+iodinophilous
+iodism
+iodite
+iodization
+iodize
+iodizer
+iodo
+iodobehenate
+iodobenzene
+iodobromite
+iodocasein
+iodochloride
+iodochromate
+iodocresol
+iododerma
+iodoethane
+iodoform
+iodogallicin
+iodohydrate
+iodohydric
+iodohydrin
+iodol
+iodomercurate
+iodomercuriate
+iodomethane
+iodometric
+iodometrical
+iodometry
+iodonium
+iodopsin
+iodoso
+iodosobenzene
+iodospongin
+iodotannic
+iodotherapy
+iodothyrin
+iodous
+iodoxy
+iodoxybenzene
+iodyrite
+iolite
+ion
+Ione
+Ioni
+Ionian
+Ionic
+ionic
+Ionicism
+Ionicization
+Ionicize
+Ionidium
+Ionism
+Ionist
+ionium
+ionizable
+Ionization
+ionization
+Ionize
+ionize
+ionizer
+ionogen
+ionogenic
+ionone
+Ionornis
+ionosphere
+ionospheric
+Ionoxalis
+iontophoresis
+Ioskeha
+iota
+iotacism
+iotacismus
+iotacist
+iotization
+iotize
+Iowa
+Iowan
+Ipalnemohuani
+ipecac
+ipecacuanha
+ipecacuanhic
+Iphimedia
+Iphis
+ipid
+Ipidae
+ipil
+ipomea
+Ipomoea
+ipomoein
+ipseand
+ipsedixitish
+ipsedixitism
+ipsedixitist
+ipseity
+ipsilateral
+Ira
+iracund
+iracundity
+iracundulous
+irade
+Iran
+Irani
+Iranian
+Iranic
+Iranism
+Iranist
+Iranize
+Iraq
+Iraqi
+Iraqian
+irascent
+irascibility
+irascible
+irascibleness
+irascibly
+irate
+irately
+ire
+ireful
+irefully
+irefulness
+Irelander
+ireless
+Irena
+irenarch
+Irene
+irene
+irenic
+irenical
+irenically
+irenicism
+irenicist
+irenicon
+irenics
+irenicum
+Iresine
+Irfan
+Irgun
+Irgunist
+irian
+Iriartea
+Iriarteaceae
+Iricism
+Iricize
+irid
+Iridaceae
+iridaceous
+iridadenosis
+iridal
+iridalgia
+iridate
+iridauxesis
+iridectome
+iridectomize
+iridectomy
+iridectropium
+iridemia
+iridencleisis
+iridentropium
+irideous
+irideremia
+irides
+iridesce
+iridescence
+iridescency
+iridescent
+iridescently
+iridial
+iridian
+iridiate
+iridic
+iridical
+iridin
+iridine
+iridiocyte
+iridiophore
+iridioplatinum
+iridious
+iridite
+iridium
+iridization
+iridize
+iridoavulsion
+iridocapsulitis
+iridocele
+iridoceratitic
+iridochoroiditis
+iridocoloboma
+iridoconstrictor
+iridocyclitis
+iridocyte
+iridodesis
+iridodiagnosis
+iridodialysis
+iridodonesis
+iridokinesia
+iridomalacia
+iridomotor
+Iridomyrmex
+iridoncus
+iridoparalysis
+iridophore
+iridoplegia
+iridoptosis
+iridopupillary
+iridorhexis
+iridosclerotomy
+iridosmine
+iridosmium
+iridotasis
+iridotome
+iridotomy
+iris
+irisated
+irisation
+iriscope
+irised
+Irish
+Irisher
+Irishian
+Irishism
+Irishize
+Irishly
+Irishman
+Irishness
+Irishry
+Irishwoman
+Irishy
+irisin
+irislike
+irisroot
+iritic
+iritis
+irk
+irksome
+irksomely
+irksomeness
+Irma
+Iroha
+irok
+iroko
+iron
+ironback
+ironbark
+ironbound
+ironbush
+ironclad
+irone
+ironer
+ironfisted
+ironflower
+ironhanded
+ironhandedly
+ironhandedness
+ironhard
+ironhead
+ironheaded
+ironhearted
+ironheartedly
+ironheartedness
+ironical
+ironically
+ironicalness
+ironice
+ironish
+ironism
+ironist
+ironize
+ironless
+ironlike
+ironly
+ironmaker
+ironmaking
+ironman
+ironmaster
+ironmonger
+ironmongering
+ironmongery
+ironness
+ironshod
+ironshot
+ironside
+ironsided
+ironsides
+ironsmith
+ironstone
+ironware
+ironweed
+ironwood
+ironwork
+ironworked
+ironworker
+ironworking
+ironworks
+ironwort
+irony
+Iroquoian
+Iroquois
+Irpex
+irradiance
+irradiancy
+irradiant
+irradiate
+irradiated
+irradiatingly
+irradiation
+irradiative
+irradiator
+irradicable
+irradicate
+irrarefiable
+irrationability
+irrationable
+irrationably
+irrational
+irrationalism
+irrationalist
+irrationalistic
+irrationality
+irrationalize
+irrationally
+irrationalness
+irreality
+irrealizable
+irrebuttable
+irreceptive
+irreceptivity
+irreciprocal
+irreciprocity
+irreclaimability
+irreclaimable
+irreclaimableness
+irreclaimably
+irreclaimed
+irrecognition
+irrecognizability
+irrecognizable
+irrecognizably
+irrecognizant
+irrecollection
+irreconcilability
+irreconcilable
+irreconcilableness
+irreconcilably
+irreconcile
+irreconcilement
+irreconciliability
+irreconciliable
+irreconciliableness
+irreconciliably
+irreconciliation
+irrecordable
+irrecoverable
+irrecoverableness
+irrecoverably
+irrecusable
+irrecusably
+irredeemability
+irredeemable
+irredeemableness
+irredeemably
+irredeemed
+irredenta
+irredential
+Irredentism
+Irredentist
+irredressibility
+irredressible
+irredressibly
+irreducibility
+irreducible
+irreducibleness
+irreducibly
+irreductibility
+irreductible
+irreduction
+irreferable
+irreflection
+irreflective
+irreflectively
+irreflectiveness
+irreflexive
+irreformability
+irreformable
+irrefragability
+irrefragable
+irrefragableness
+irrefragably
+irrefrangibility
+irrefrangible
+irrefrangibleness
+irrefrangibly
+irrefusable
+irrefutability
+irrefutable
+irrefutableness
+irrefutably
+irregardless
+irregeneracy
+irregenerate
+irregeneration
+irregular
+irregularism
+irregularist
+irregularity
+irregularize
+irregularly
+irregularness
+irregulate
+irregulated
+irregulation
+irrelate
+irrelated
+irrelation
+irrelative
+irrelatively
+irrelativeness
+irrelevance
+irrelevancy
+irrelevant
+irrelevantly
+irreliability
+irrelievable
+irreligion
+irreligionism
+irreligionist
+irreligionize
+irreligiosity
+irreligious
+irreligiously
+irreligiousness
+irreluctant
+irremeable
+irremeably
+irremediable
+irremediableness
+irremediably
+irrememberable
+irremissibility
+irremissible
+irremissibleness
+irremissibly
+irremission
+irremissive
+irremovability
+irremovable
+irremovableness
+irremovably
+irremunerable
+irrenderable
+irrenewable
+irrenunciable
+irrepair
+irrepairable
+irreparability
+irreparable
+irreparableness
+irreparably
+irrepassable
+irrepealability
+irrepealable
+irrepealableness
+irrepealably
+irrepentance
+irrepentant
+irrepentantly
+irreplaceable
+irreplaceably
+irrepleviable
+irreplevisable
+irreportable
+irreprehensible
+irreprehensibleness
+irreprehensibly
+irrepresentable
+irrepresentableness
+irrepressibility
+irrepressible
+irrepressibleness
+irrepressibly
+irrepressive
+irreproachability
+irreproachable
+irreproachableness
+irreproachably
+irreproducible
+irreproductive
+irreprovable
+irreprovableness
+irreprovably
+irreptitious
+irrepublican
+irresilient
+irresistance
+irresistibility
+irresistible
+irresistibleness
+irresistibly
+irresoluble
+irresolubleness
+irresolute
+irresolutely
+irresoluteness
+irresolution
+irresolvability
+irresolvable
+irresolvableness
+irresolved
+irresolvedly
+irresonance
+irresonant
+irrespectability
+irrespectable
+irrespectful
+irrespective
+irrespectively
+irrespirable
+irrespondence
+irresponsibility
+irresponsible
+irresponsibleness
+irresponsibly
+irresponsive
+irresponsiveness
+irrestrainable
+irrestrainably
+irrestrictive
+irresultive
+irresuscitable
+irresuscitably
+irretention
+irretentive
+irretentiveness
+irreticence
+irreticent
+irretraceable
+irretraceably
+irretractable
+irretractile
+irretrievability
+irretrievable
+irretrievableness
+irretrievably
+irrevealable
+irrevealably
+irreverence
+irreverend
+irreverendly
+irreverent
+irreverential
+irreverentialism
+irreverentially
+irreverently
+irreversibility
+irreversible
+irreversibleness
+irreversibly
+irrevertible
+irreviewable
+irrevisable
+irrevocability
+irrevocable
+irrevocableness
+irrevocably
+irrevoluble
+irrigable
+irrigably
+irrigant
+irrigate
+irrigation
+irrigational
+irrigationist
+irrigative
+irrigator
+irrigatorial
+irrigatory
+irriguous
+irriguousness
+irrision
+irrisor
+Irrisoridae
+irrisory
+irritability
+irritable
+irritableness
+irritably
+irritament
+irritancy
+irritant
+irritate
+irritatedly
+irritating
+irritatingly
+irritation
+irritative
+irritativeness
+irritator
+irritatory
+Irritila
+irritomotile
+irritomotility
+irrorate
+irrotational
+irrotationally
+irrubrical
+irrupt
+irruptible
+irruption
+irruptive
+irruptively
+Irvin
+Irving
+Irvingesque
+Irvingiana
+Irvingism
+Irvingite
+Irwin
+is
+Isaac
+Isabel
+isabelina
+isabelita
+Isabella
+Isabelle
+Isabelline
+isabnormal
+isaconitine
+isacoustic
+isadelphous
+Isadora
+isagoge
+isagogic
+isagogical
+isagogically
+isagogics
+isagon
+Isaiah
+Isaian
+isallobar
+isallotherm
+isamine
+Isander
+isandrous
+isanemone
+isanomal
+isanomalous
+isanthous
+isapostolic
+Isaria
+isarioid
+isatate
+isatic
+isatide
+isatin
+isatinic
+Isatis
+isatogen
+isatogenic
+Isaurian
+Isawa
+isazoxy
+isba
+Iscariot
+Iscariotic
+Iscariotical
+Iscariotism
+ischemia
+ischemic
+ischiac
+ischiadic
+ischiadicus
+ischial
+ischialgia
+ischialgic
+ischiatic
+ischidrosis
+ischioanal
+ischiobulbar
+ischiocapsular
+ischiocaudal
+ischiocavernosus
+ischiocavernous
+ischiocele
+ischiocerite
+ischiococcygeal
+ischiofemoral
+ischiofibular
+ischioiliac
+ischioneuralgia
+ischioperineal
+ischiopodite
+ischiopubic
+ischiopubis
+ischiorectal
+ischiorrhogic
+ischiosacral
+ischiotibial
+ischiovaginal
+ischiovertebral
+ischium
+ischocholia
+ischuretic
+ischuria
+ischury
+Ischyodus
+Isegrim
+isenergic
+isentropic
+isepiptesial
+isepiptesis
+iserine
+iserite
+isethionate
+isethionic
+Iseum
+Isfahan
+Ishmael
+Ishmaelite
+Ishmaelitic
+Ishmaelitish
+Ishmaelitism
+ishpingo
+ishshakku
+Isiac
+Isiacal
+Isidae
+isidiiferous
+isidioid
+isidiophorous
+isidiose
+isidium
+isidoid
+Isidore
+Isidorian
+Isidoric
+Isinai
+isindazole
+isinglass
+Isis
+Islam
+Islamic
+Islamism
+Islamist
+Islamistic
+Islamite
+Islamitic
+Islamitish
+Islamization
+Islamize
+island
+islander
+islandhood
+islandic
+islandish
+islandless
+islandlike
+islandman
+islandress
+islandry
+islandy
+islay
+isle
+isleless
+islesman
+islet
+Isleta
+isleted
+isleward
+islot
+ism
+Ismaelism
+Ismaelite
+Ismaelitic
+Ismaelitical
+Ismaelitish
+Ismaili
+Ismailian
+Ismailite
+ismal
+ismatic
+ismatical
+ismaticalness
+ismdom
+ismy
+Isnardia
+iso
+isoabnormal
+isoagglutination
+isoagglutinative
+isoagglutinin
+isoagglutinogen
+isoalantolactone
+isoallyl
+isoamarine
+isoamide
+isoamyl
+isoamylamine
+isoamylene
+isoamylethyl
+isoamylidene
+isoantibody
+isoantigen
+isoapiole
+isoasparagine
+isoaurore
+isobar
+isobarbaloin
+isobarbituric
+isobare
+isobaric
+isobarism
+isobarometric
+isobase
+isobath
+isobathic
+isobathytherm
+isobathythermal
+isobathythermic
+isobenzofuran
+isobilateral
+isobilianic
+isobiogenetic
+isoborneol
+isobornyl
+isobront
+isobronton
+isobutane
+isobutyl
+isobutylene
+isobutyraldehyde
+isobutyrate
+isobutyric
+isobutyryl
+isocamphor
+isocamphoric
+isocaproic
+isocarbostyril
+Isocardia
+Isocardiidae
+isocarpic
+isocarpous
+isocellular
+isocephalic
+isocephalism
+isocephalous
+isocephaly
+isocercal
+isocercy
+isochasm
+isochasmic
+isocheim
+isocheimal
+isocheimenal
+isocheimic
+isocheimonal
+isochlor
+isochlorophyll
+isochlorophyllin
+isocholanic
+isocholesterin
+isocholesterol
+isochor
+isochoric
+isochromatic
+isochronal
+isochronally
+isochrone
+isochronic
+isochronical
+isochronism
+isochronize
+isochronon
+isochronous
+isochronously
+isochroous
+isocinchomeronic
+isocinchonine
+isocitric
+isoclasite
+isoclimatic
+isoclinal
+isocline
+isoclinic
+isocodeine
+isocola
+isocolic
+isocolon
+isocoria
+isocorybulbin
+isocorybulbine
+isocorydine
+isocoumarin
+isocracy
+isocrat
+isocratic
+isocreosol
+isocrotonic
+isocrymal
+isocryme
+isocrymic
+isocyanate
+isocyanic
+isocyanide
+isocyanine
+isocyano
+isocyanogen
+isocyanurate
+isocyanuric
+isocyclic
+isocymene
+isocytic
+isodactylism
+isodactylous
+isodiabatic
+isodialuric
+isodiametric
+isodiametrical
+isodiazo
+isodiazotate
+isodimorphic
+isodimorphism
+isodimorphous
+isodomic
+isodomous
+isodomum
+isodont
+isodontous
+isodrome
+isodulcite
+isodurene
+isodynamia
+isodynamic
+isodynamical
+isoelectric
+isoelectrically
+isoelectronic
+isoelemicin
+isoemodin
+isoenergetic
+isoerucic
+Isoetaceae
+Isoetales
+Isoetes
+isoeugenol
+isoflavone
+isoflor
+isogamete
+isogametic
+isogametism
+isogamic
+isogamous
+isogamy
+isogen
+isogenesis
+isogenetic
+isogenic
+isogenotype
+isogenotypic
+isogenous
+isogeny
+isogeotherm
+isogeothermal
+isogeothermic
+isogloss
+isoglossal
+isognathism
+isognathous
+isogon
+isogonal
+isogonality
+isogonally
+isogonic
+isogoniostat
+isogonism
+isograft
+isogram
+isograph
+isographic
+isographical
+isographically
+isography
+isogynous
+isohaline
+isohalsine
+isohel
+isohemopyrrole
+isoheptane
+isohesperidin
+isohexyl
+isohydric
+isohydrocyanic
+isohydrosorbic
+isohyet
+isohyetal
+isoimmune
+isoimmunity
+isoimmunization
+isoimmunize
+isoindazole
+isoindigotin
+isoindole
+isoionone
+isokeraunic
+isokeraunographic
+isokeraunophonic
+Isokontae
+isokontan
+isokurtic
+isolability
+isolable
+isolapachol
+isolate
+isolated
+isolatedly
+isolating
+isolation
+isolationism
+isolationist
+isolative
+Isolde
+isolecithal
+isoleucine
+isolichenin
+isolinolenic
+isologous
+isologue
+isology
+Isoloma
+isolysin
+isolysis
+isomagnetic
+isomaltose
+isomastigate
+isomelamine
+isomenthone
+isomer
+Isomera
+isomere
+isomeric
+isomerical
+isomerically
+isomeride
+isomerism
+isomerization
+isomerize
+isomeromorphism
+isomerous
+isomery
+isometric
+isometrical
+isometrically
+isometrograph
+isometropia
+isometry
+isomorph
+isomorphic
+isomorphism
+isomorphous
+Isomyaria
+isomyarian
+isoneph
+isonephelic
+isonergic
+isonicotinic
+isonitramine
+isonitrile
+isonitroso
+isonomic
+isonomous
+isonomy
+isonuclear
+isonym
+isonymic
+isonymy
+isooleic
+isoosmosis
+isopachous
+isopag
+isoparaffin
+isopectic
+isopelletierin
+isopelletierine
+isopentane
+isoperimeter
+isoperimetric
+isoperimetrical
+isoperimetry
+isopetalous
+isophanal
+isophane
+isophasal
+isophene
+isophenomenal
+isophoria
+isophorone
+isophthalic
+isophthalyl
+isophyllous
+isophylly
+isopicramic
+isopiestic
+isopiestically
+isopilocarpine
+isoplere
+isopleth
+Isopleura
+isopleural
+isopleuran
+isopleurous
+isopod
+Isopoda
+isopodan
+isopodiform
+isopodimorphous
+isopodous
+isopogonous
+isopolite
+isopolitical
+isopolity
+isopoly
+isoprene
+isopropenyl
+isopropyl
+isopropylacetic
+isopropylamine
+isopsephic
+isopsephism
+Isoptera
+isopterous
+isoptic
+isopulegone
+isopurpurin
+isopycnic
+isopyre
+isopyromucic
+isopyrrole
+isoquercitrin
+isoquinine
+isoquinoline
+isorcinol
+isorhamnose
+isorhodeose
+isorithm
+isorosindone
+isorrhythmic
+isorropic
+isosaccharic
+isosaccharin
+isoscele
+isosceles
+isoscope
+isoseismal
+isoseismic
+isoseismical
+isoseist
+isoserine
+isosmotic
+Isospondyli
+isospondylous
+isospore
+isosporic
+isosporous
+isospory
+isostasist
+isostasy
+isostatic
+isostatical
+isostatically
+isostemonous
+isostemony
+isostere
+isosteric
+isosterism
+isostrychnine
+isosuccinic
+isosulphide
+isosulphocyanate
+isosulphocyanic
+isosultam
+isotac
+isoteles
+isotely
+isotheral
+isothere
+isotherm
+isothermal
+isothermally
+isothermic
+isothermical
+isothermobath
+isothermobathic
+isothermous
+isotherombrose
+isothiocyanates
+isothiocyanic
+isothiocyano
+isothujone
+isotimal
+isotome
+isotomous
+isotonia
+isotonic
+isotonicity
+isotony
+isotope
+isotopic
+isotopism
+isotopy
+isotrehalose
+Isotria
+isotrimorphic
+isotrimorphism
+isotrimorphous
+isotron
+isotrope
+isotropic
+isotropism
+isotropous
+isotropy
+isotype
+isotypic
+isotypical
+isovalerate
+isovalerianate
+isovalerianic
+isovaleric
+isovalerone
+isovaline
+isovanillic
+isovoluminal
+isoxanthine
+isoxazine
+isoxazole
+isoxime
+isoxylene
+isoyohimbine
+isozooid
+ispaghul
+ispravnik
+Israel
+Israeli
+Israelite
+Israeliteship
+Israelitic
+Israelitish
+Israelitism
+Israelitize
+issanguila
+Issedoi
+Issedones
+issei
+issite
+issuable
+issuably
+issuance
+issuant
+issue
+issueless
+issuer
+issuing
+ist
+isthmi
+Isthmia
+isthmial
+isthmian
+isthmiate
+isthmic
+isthmoid
+isthmus
+istiophorid
+Istiophoridae
+Istiophorus
+istle
+istoke
+Istrian
+Istvaeones
+isuret
+isuretine
+Isuridae
+isuroid
+Isurus
+Iswara
+it
+Ita
+itabirite
+itacism
+itacist
+itacistic
+itacolumite
+itaconate
+itaconic
+Itala
+Itali
+Italian
+Italianate
+Italianately
+Italianation
+Italianesque
+Italianish
+Italianism
+Italianist
+Italianity
+Italianization
+Italianize
+Italianizer
+Italianly
+Italic
+Italical
+Italically
+Italican
+Italicanist
+Italici
+Italicism
+italicization
+italicize
+italics
+Italiote
+italite
+Italomania
+Italon
+Italophile
+itamalate
+itamalic
+itatartaric
+itatartrate
+Itaves
+itch
+itchiness
+itching
+itchingly
+itchless
+itchproof
+itchreed
+itchweed
+itchy
+itcze
+Itea
+Iteaceae
+Itelmes
+item
+iteming
+itemization
+itemize
+itemizer
+itemy
+Iten
+Itenean
+iter
+iterable
+iterance
+iterancy
+iterant
+iterate
+iteration
+iterative
+iteratively
+iterativeness
+Ithaca
+Ithacan
+Ithacensian
+ithagine
+Ithaginis
+ither
+Ithiel
+ithomiid
+Ithomiidae
+Ithomiinae
+ithyphallic
+Ithyphallus
+ithyphyllous
+itineracy
+itinerancy
+itinerant
+itinerantly
+itinerarian
+Itinerarium
+itinerary
+itinerate
+itineration
+itmo
+Ito
+Itoism
+Itoist
+Itoland
+Itonama
+Itonaman
+Itonia
+itonidid
+Itonididae
+itoubou
+its
+itself
+Ituraean
+iturite
+Itylus
+Itys
+Itza
+itzebu
+iva
+Ivan
+ivied
+ivin
+ivoried
+ivorine
+ivoriness
+ivorist
+ivory
+ivorylike
+ivorytype
+ivorywood
+ivy
+ivybells
+ivyberry
+ivyflower
+ivylike
+ivyweed
+ivywood
+ivywort
+iwa
+iwaiwa
+iwis
+Ixia
+Ixiaceae
+Ixiama
+Ixil
+Ixion
+Ixionian
+Ixodes
+ixodian
+ixodic
+ixodid
+Ixodidae
+Ixora
+iyo
+Izar
+izar
+izard
+Izcateco
+Izchak
+Izdubar
+izle
+izote
+iztle
+Izumi
+izzard
+Izzy
+J
+j
+Jaalin
+jab
+Jabarite
+jabbed
+jabber
+jabberer
+jabbering
+jabberingly
+jabberment
+Jabberwock
+jabberwockian
+Jabberwocky
+jabbing
+jabbingly
+jabble
+jabers
+jabia
+jabiru
+jaborandi
+jaborine
+jabot
+jaboticaba
+jabul
+jacal
+Jacaltec
+Jacalteca
+jacamar
+Jacamaralcyon
+jacameropine
+Jacamerops
+jacami
+jacamin
+Jacana
+jacana
+Jacanidae
+Jacaranda
+jacare
+jacate
+jacchus
+jacent
+jacinth
+jacinthe
+Jack
+jack
+jackal
+jackanapes
+jackanapish
+jackaroo
+jackass
+jackassery
+jackassification
+jackassism
+jackassness
+jackbird
+jackbox
+jackboy
+jackdaw
+jackeen
+jacker
+jacket
+jacketed
+jacketing
+jacketless
+jacketwise
+jackety
+jackfish
+jackhammer
+jackknife
+jackleg
+jackman
+jacko
+jackpudding
+jackpuddinghood
+jackrod
+jacksaw
+jackscrew
+jackshaft
+jackshay
+jacksnipe
+Jackson
+Jacksonia
+Jacksonian
+Jacksonite
+jackstay
+jackstone
+jackstraw
+jacktan
+jackweed
+jackwood
+Jacky
+Jackye
+Jacob
+jacobaea
+jacobaean
+Jacobean
+Jacobian
+Jacobic
+Jacobin
+Jacobinia
+Jacobinic
+Jacobinical
+Jacobinically
+Jacobinism
+Jacobinization
+Jacobinize
+Jacobite
+Jacobitely
+Jacobitiana
+Jacobitic
+Jacobitical
+Jacobitically
+Jacobitish
+Jacobitishly
+Jacobitism
+jacobsite
+Jacobson
+jacobus
+jacoby
+jaconet
+Jacqueminot
+Jacques
+jactance
+jactancy
+jactant
+jactation
+jactitate
+jactitation
+jacu
+jacuaru
+jaculate
+jaculation
+jaculative
+jaculator
+jaculatorial
+jaculatory
+jaculiferous
+Jacunda
+jacutinga
+jadder
+jade
+jaded
+jadedly
+jadedness
+jadeite
+jadery
+jadesheen
+jadeship
+jadestone
+jadish
+jadishly
+jadishness
+jady
+jaeger
+jag
+Jaga
+Jagannath
+Jagannatha
+jagat
+Jagatai
+Jagataic
+Jagath
+jager
+jagged
+jaggedly
+jaggedness
+jagger
+jaggery
+jaggy
+jagir
+jagirdar
+jagla
+jagless
+jagong
+jagrata
+jagua
+jaguar
+jaguarete
+Jahve
+Jahvist
+Jahvistic
+jail
+jailage
+jailbird
+jaildom
+jailer
+jaileress
+jailering
+jailership
+jailhouse
+jailish
+jailkeeper
+jaillike
+jailmate
+jailward
+jailyard
+Jaime
+Jain
+Jaina
+Jainism
+Jainist
+Jaipuri
+jajman
+Jake
+jake
+jakes
+jako
+Jakob
+Jakun
+Jalalaean
+jalap
+jalapa
+jalapin
+jalkar
+jalloped
+jalopy
+jalouse
+jalousie
+jalousied
+jalpaite
+Jam
+jam
+jama
+Jamaica
+Jamaican
+jaman
+jamb
+jambalaya
+jambeau
+jambo
+jambolan
+jambone
+jambool
+jamboree
+Jambos
+jambosa
+jambstone
+jamdani
+James
+Jamesian
+Jamesina
+jamesonite
+jami
+Jamie
+jamlike
+jammedness
+jammer
+jammy
+Jamnia
+jampan
+jampani
+jamrosade
+jamwood
+Jan
+janapa
+janapan
+Jane
+jane
+Janet
+jangada
+Janghey
+jangkar
+jangle
+jangler
+jangly
+Janice
+janiceps
+Janiculan
+Janiculum
+Janiform
+janissary
+janitor
+janitorial
+janitorship
+janitress
+janitrix
+Janizarian
+Janizary
+jank
+janker
+jann
+jannock
+Janos
+Jansenism
+Jansenist
+Jansenistic
+Jansenistical
+Jansenize
+Janthina
+Janthinidae
+jantu
+janua
+Januarius
+January
+Janus
+Januslike
+jaob
+Jap
+jap
+japaconine
+japaconitine
+Japan
+japan
+Japanee
+Japanese
+Japanesque
+Japanesquely
+Japanesquery
+Japanesy
+Japanicize
+Japanism
+Japanization
+Japanize
+japanned
+Japanner
+japanner
+japannery
+Japannish
+Japanolatry
+Japanologist
+Japanology
+Japanophile
+Japanophobe
+Japanophobia
+jape
+japer
+japery
+Japetus
+Japheth
+Japhetic
+Japhetide
+Japhetite
+japing
+japingly
+japish
+japishly
+japishness
+Japonic
+japonica
+Japonically
+Japonicize
+Japonism
+Japonize
+Japonizer
+Japygidae
+japygoid
+Japyx
+Jaqueline
+Jaquesian
+jaquima
+jar
+jara
+jaragua
+jararaca
+jararacussu
+jarbird
+jarble
+jarbot
+jardiniere
+Jared
+jarfly
+jarful
+jarg
+jargon
+jargonal
+jargoneer
+jargonelle
+jargoner
+jargonesque
+jargonic
+jargonish
+jargonist
+jargonistic
+jargonium
+jargonization
+jargonize
+jarkman
+Jarl
+jarl
+jarldom
+jarless
+jarlship
+Jarmo
+jarnut
+jarool
+jarosite
+jarra
+jarrah
+jarring
+jarringly
+jarringness
+jarry
+jarvey
+Jarvis
+jasey
+jaseyed
+Jasione
+Jasminaceae
+jasmine
+jasmined
+jasminewood
+Jasminum
+jasmone
+Jason
+jaspachate
+jaspagate
+Jasper
+jasper
+jasperated
+jaspered
+jasperize
+jasperoid
+jaspery
+jaspidean
+jaspideous
+jaspilite
+jaspis
+jaspoid
+jasponyx
+jaspopal
+jass
+jassid
+Jassidae
+jassoid
+Jat
+jatamansi
+Jateorhiza
+jateorhizine
+jatha
+jati
+Jatki
+Jatni
+jato
+Jatropha
+jatrophic
+jatrorrhizine
+Jatulian
+jaudie
+jauk
+jaun
+jaunce
+jaunder
+jaundice
+jaundiceroot
+jaunt
+jauntie
+jauntily
+jauntiness
+jauntingly
+jaunty
+jaup
+Java
+Javahai
+javali
+Javan
+Javanee
+Javanese
+javelin
+javelina
+javeline
+javelineer
+javer
+Javitero
+jaw
+jawab
+jawbation
+jawbone
+jawbreaker
+jawbreaking
+jawbreakingly
+jawed
+jawfall
+jawfallen
+jawfish
+jawfoot
+jawfooted
+jawless
+jawsmith
+jawy
+Jay
+jay
+Jayant
+Jayesh
+jayhawk
+jayhawker
+jaypie
+jaywalk
+jaywalker
+jazerant
+Jazyges
+jazz
+jazzer
+jazzily
+jazziness
+jazzy
+jealous
+jealously
+jealousness
+jealousy
+Jeames
+Jean
+jean
+Jean-Christophe
+Jean-Pierre
+Jeanette
+Jeanie
+Jeanne
+Jeannette
+Jeannie
+Jeanpaulia
+jeans
+Jeany
+Jebus
+Jebusi
+Jebusite
+Jebusitic
+Jebusitical
+Jebusitish
+jecoral
+jecorin
+jecorize
+jed
+jedcock
+jedding
+jeddock
+jeel
+jeep
+jeer
+jeerer
+jeering
+jeeringly
+jeerproof
+jeery
+jeewhillijers
+jeewhillikens
+Jef
+Jeff
+jeff
+jefferisite
+Jeffersonia
+Jeffersonian
+Jeffersonianism
+jeffersonite
+Jeffery
+Jeffie
+Jeffrey
+Jehovah
+Jehovic
+Jehovism
+Jehovist
+Jehovistic
+jehu
+jehup
+jejunal
+jejunator
+jejune
+jejunely
+jejuneness
+jejunitis
+jejunity
+jejunoduodenal
+jejunoileitis
+jejunostomy
+jejunotomy
+jejunum
+jelab
+jelerang
+jelick
+jell
+jellica
+jellico
+jellied
+jelliedness
+jellification
+jellify
+jellily
+jelloid
+jelly
+jellydom
+jellyfish
+jellyleaf
+jellylike
+Jelske
+jelutong
+Jem
+jemadar
+Jemez
+Jemima
+jemmily
+jemminess
+Jemmy
+jemmy
+Jenine
+jenkin
+jenna
+jennerization
+jennerize
+jennet
+jenneting
+Jennie
+jennier
+Jennifer
+Jenny
+jenny
+Jenson
+jentacular
+jeofail
+jeopard
+jeoparder
+jeopardize
+jeopardous
+jeopardously
+jeopardousness
+jeopardy
+jequirity
+Jerahmeel
+Jerahmeelites
+Jerald
+jerboa
+jereed
+jeremejevite
+jeremiad
+Jeremiah
+Jeremian
+Jeremianic
+Jeremias
+Jeremy
+jerez
+jerib
+jerk
+jerker
+jerkily
+jerkin
+jerkined
+jerkiness
+jerkingly
+jerkish
+jerksome
+jerkwater
+jerky
+jerl
+jerm
+jermonal
+Jeroboam
+Jerome
+Jeromian
+Jeronymite
+jerque
+jerquer
+Jerrie
+Jerry
+jerry
+jerryism
+Jersey
+jersey
+Jerseyan
+jerseyed
+Jerseyite
+Jerseyman
+jert
+Jerusalem
+jervia
+jervina
+jervine
+Jesper
+Jess
+jess
+jessakeed
+jessamine
+jessamy
+jessant
+Jesse
+Jessean
+jessed
+Jessica
+Jessie
+jessur
+jest
+jestbook
+jestee
+jester
+jestful
+jesting
+jestingly
+jestingstock
+jestmonger
+jestproof
+jestwise
+jestword
+Jesu
+Jesuate
+Jesuit
+Jesuited
+Jesuitess
+Jesuitic
+Jesuitical
+Jesuitically
+Jesuitish
+Jesuitism
+Jesuitist
+Jesuitize
+Jesuitocracy
+Jesuitry
+Jesus
+jet
+jetbead
+jete
+Jethro
+Jethronian
+jetsam
+jettage
+jetted
+jetter
+jettied
+jettiness
+jettingly
+jettison
+jetton
+jetty
+jettyhead
+jettywise
+jetware
+Jew
+jewbird
+jewbush
+Jewdom
+jewel
+jeweler
+jewelhouse
+jeweling
+jewelless
+jewellike
+jewelry
+jewelsmith
+jewelweed
+jewely
+Jewess
+jewfish
+Jewhood
+Jewish
+Jewishly
+Jewishness
+Jewism
+Jewless
+Jewlike
+Jewling
+Jewry
+Jewship
+Jewstone
+Jewy
+jezail
+Jezebel
+Jezebelian
+Jezebelish
+jezekite
+jeziah
+Jezreelite
+jharal
+jheel
+jhool
+jhow
+Jhuria
+Ji
+Jianyun
+jib
+jibbah
+jibber
+jibbings
+jibby
+jibe
+jibhead
+jibi
+jibman
+jiboa
+jibstay
+jicama
+Jicaque
+Jicaquean
+jicara
+Jicarilla
+jiff
+jiffle
+jiffy
+jig
+jigamaree
+jigger
+jiggerer
+jiggerman
+jiggers
+jigget
+jiggety
+jigginess
+jiggish
+jiggle
+jiggly
+jiggumbob
+jiggy
+jiglike
+jigman
+jihad
+jikungu
+Jill
+jillet
+jillflirt
+jilt
+jiltee
+jilter
+jiltish
+Jim
+jimbang
+jimberjaw
+jimberjawed
+jimjam
+Jimmy
+jimmy
+jimp
+jimply
+jimpness
+jimpricute
+jimsedge
+Jin
+jina
+jincamas
+Jincan
+Jinchao
+jing
+jingal
+Jingbai
+jingbang
+jingle
+jingled
+jinglejangle
+jingler
+jinglet
+jingling
+jinglingly
+jingly
+jingo
+jingodom
+jingoish
+jingoism
+jingoist
+jingoistic
+jinja
+jinjili
+jink
+jinker
+jinket
+jinkle
+jinks
+jinn
+jinnestan
+jinni
+jinniwink
+jinniyeh
+Jinny
+jinny
+jinriki
+jinrikiman
+jinrikisha
+jinshang
+jinx
+jipijapa
+jipper
+jiqui
+jirble
+jirga
+Jiri
+jirkinet
+Jisheng
+Jitendra
+jiti
+jitneur
+jitneuse
+jitney
+jitneyman
+jitro
+jitter
+jitterbug
+jitters
+jittery
+jiva
+Jivaran
+Jivaro
+Jivaroan
+jive
+jixie
+Jo
+jo
+Joachim
+Joachimite
+Joan
+Joanna
+Joanne
+Joannite
+joaquinite
+Job
+job
+jobade
+jobarbe
+jobation
+jobber
+jobbernowl
+jobbernowlism
+jobbery
+jobbet
+jobbing
+jobbish
+jobble
+jobholder
+jobless
+joblessness
+jobman
+jobmaster
+jobmistress
+jobmonger
+jobo
+jobsmith
+Jocasta
+Jocelin
+Joceline
+Jocelyn
+joch
+Jochen
+Jock
+jock
+jocker
+jockey
+jockeydom
+jockeyish
+jockeyism
+jockeylike
+jockeyship
+jocko
+jockteleg
+jocoque
+jocose
+jocosely
+jocoseness
+jocoseriosity
+jocoserious
+jocosity
+jocote
+jocu
+jocular
+jocularity
+jocularly
+jocularness
+joculator
+jocum
+jocuma
+jocund
+jocundity
+jocundly
+jocundness
+jodel
+jodelr
+jodhpurs
+Jodo
+Joe
+joe
+joebush
+Joel
+joewood
+Joey
+joey
+jog
+jogger
+joggle
+joggler
+jogglety
+jogglework
+joggly
+jogtrottism
+Johan
+Johann
+Johanna
+Johannean
+Johannes
+johannes
+Johannine
+Johannisberger
+Johannist
+Johannite
+johannite
+John
+Johnadreams
+Johnathan
+Johnian
+johnin
+Johnnie
+Johnny
+johnnycake
+johnnydom
+Johnsmas
+Johnsonese
+Johnsonian
+Johnsoniana
+Johnsonianism
+Johnsonianly
+Johnsonism
+johnstrupite
+join
+joinable
+joinant
+joinder
+joiner
+joinery
+joining
+joiningly
+joint
+jointage
+jointed
+jointedly
+jointedness
+jointer
+jointing
+jointist
+jointless
+jointly
+jointress
+jointure
+jointureless
+jointuress
+jointweed
+jointworm
+jointy
+joist
+joisting
+joistless
+jojoba
+joke
+jokeless
+jokelet
+jokeproof
+joker
+jokesmith
+jokesome
+jokesomeness
+jokester
+jokingly
+jokish
+jokist
+jokul
+joky
+joll
+jolleyman
+jollier
+jollification
+jollify
+jollily
+jolliness
+jollity
+jollop
+jolloped
+jolly
+jollytail
+Joloano
+jolt
+jolter
+jolterhead
+jolterheaded
+jolterheadedness
+jolthead
+joltiness
+jolting
+joltingly
+joltless
+joltproof
+jolty
+Jon
+Jonah
+Jonahesque
+Jonahism
+Jonas
+Jonathan
+Jonathanization
+Jones
+Jonesian
+Jong
+jonglery
+jongleur
+Joni
+jonque
+jonquil
+jonquille
+Jonsonian
+Jonval
+jonvalization
+jonvalize
+jookerie
+joola
+joom
+Joon
+Jophiel
+Jordan
+jordan
+Jordanian
+jordanite
+joree
+Jorge
+Jorist
+jorum
+Jos
+Jose
+josefite
+joseite
+Joseph
+Josepha
+Josephine
+Josephinism
+josephinite
+Josephism
+Josephite
+Josh
+josh
+josher
+joshi
+Joshua
+Josiah
+josie
+Josip
+joskin
+joss
+jossakeed
+josser
+jostle
+jostlement
+jostler
+jot
+jota
+jotation
+jotisi
+Jotnian
+jotter
+jotting
+jotty
+joubarb
+Joubert
+joug
+jough
+jouk
+joukerypawkery
+joule
+joulean
+joulemeter
+jounce
+journal
+journalese
+journalish
+journalism
+journalist
+journalistic
+journalistically
+journalization
+journalize
+journalizer
+journey
+journeycake
+journeyer
+journeying
+journeyman
+journeywoman
+journeywork
+journeyworker
+jours
+joust
+jouster
+Jova
+Jove
+Jovial
+jovial
+jovialist
+jovialistic
+joviality
+jovialize
+jovially
+jovialness
+jovialty
+Jovian
+Jovianly
+Jovicentric
+Jovicentrical
+Jovicentrically
+jovilabe
+Joviniamish
+Jovinian
+Jovinianist
+Jovite
+jow
+jowar
+jowari
+jowel
+jower
+jowery
+jowl
+jowler
+jowlish
+jowlop
+jowly
+jowpy
+jowser
+jowter
+joy
+joyance
+joyancy
+joyant
+Joyce
+joyful
+joyfully
+joyfulness
+joyhop
+joyleaf
+joyless
+joylessly
+joylessness
+joylet
+joyous
+joyously
+joyousness
+joyproof
+joysome
+joyweed
+Jozy
+Ju
+Juan
+Juang
+juba
+jubate
+jubbah
+jubbe
+jube
+juberous
+jubilance
+jubilancy
+jubilant
+jubilantly
+jubilarian
+jubilate
+jubilatio
+jubilation
+jubilatory
+jubilean
+jubilee
+jubilist
+jubilization
+jubilize
+jubilus
+juck
+juckies
+Jucuna
+jucundity
+jud
+Judaeomancy
+Judaeophile
+Judaeophilism
+Judaeophobe
+Judaeophobia
+Judah
+Judahite
+Judaic
+Judaica
+Judaical
+Judaically
+Judaism
+Judaist
+Judaistic
+Judaistically
+Judaization
+Judaize
+Judaizer
+Judas
+Judaslike
+judcock
+Jude
+Judean
+judex
+Judge
+judge
+judgeable
+judgelike
+judger
+judgeship
+judgingly
+judgmatic
+judgmatical
+judgmatically
+judgment
+Judica
+judicable
+judicate
+judication
+judicative
+judicator
+judicatorial
+judicatory
+judicature
+judices
+judiciable
+judicial
+judiciality
+judicialize
+judicially
+judicialness
+judiciarily
+judiciary
+judicious
+judiciously
+judiciousness
+Judith
+judo
+Judophobism
+Judy
+Juergen
+jufti
+jug
+Juga
+jugal
+jugale
+Jugatae
+jugate
+jugated
+jugation
+juger
+jugerum
+jugful
+jugger
+Juggernaut
+juggernaut
+Juggernautish
+juggins
+juggle
+jugglement
+juggler
+jugglery
+juggling
+jugglingly
+Juglandaceae
+juglandaceous
+Juglandales
+juglandin
+Juglans
+juglone
+jugular
+Jugulares
+jugulary
+jugulate
+jugulum
+jugum
+Jugurthine
+Juha
+juice
+juiceful
+juiceless
+juicily
+juiciness
+juicy
+jujitsu
+juju
+jujube
+jujuism
+jujuist
+juke
+jukebox
+Jule
+julep
+Jules
+Juletta
+Julia
+Julian
+Juliana
+Juliane
+Julianist
+Julianto
+julid
+Julidae
+julidan
+Julie
+Julien
+julienite
+julienne
+Juliet
+Julietta
+julio
+Julius
+juloid
+Juloidea
+juloidian
+julole
+julolidin
+julolidine
+julolin
+juloline
+Julus
+July
+Julyflower
+Jumada
+Jumana
+jumart
+jumba
+jumble
+jumblement
+jumbler
+jumblingly
+jumbly
+jumbo
+jumboesque
+jumboism
+jumbuck
+jumby
+jumelle
+jument
+jumentous
+jumfru
+jumillite
+jumma
+jump
+jumpable
+jumper
+jumperism
+jumpiness
+jumpingly
+jumpness
+jumprock
+jumpseed
+jumpsome
+jumpy
+Jun
+Juncaceae
+juncaceous
+Juncaginaceae
+juncaginaceous
+juncagineous
+junciform
+juncite
+Junco
+Juncoides
+juncous
+junction
+junctional
+junctive
+juncture
+Juncus
+June
+june
+Juneberry
+Junebud
+junectomy
+Juneflower
+Jungermannia
+Jungermanniaceae
+jungermanniaceous
+Jungermanniales
+jungle
+jungled
+jungleside
+junglewards
+junglewood
+jungli
+jungly
+juniata
+junior
+juniorate
+juniority
+juniorship
+juniper
+Juniperaceae
+Juniperus
+Junius
+junk
+junkboard
+Junker
+junker
+Junkerdom
+junkerdom
+junkerish
+Junkerism
+junkerism
+junket
+junketer
+junketing
+junking
+junkman
+Juno
+Junoesque
+Junonia
+Junonian
+junt
+junta
+junto
+jupati
+jupe
+Jupiter
+jupon
+Jur
+Jura
+jural
+jurally
+jurament
+juramentado
+juramental
+juramentally
+juramentum
+Jurane
+jurant
+jurara
+Jurassic
+jurat
+juration
+jurative
+jurator
+juratorial
+juratory
+jure
+jurel
+Jurevis
+Juri
+juridic
+juridical
+juridically
+juring
+jurisconsult
+jurisdiction
+jurisdictional
+jurisdictionalism
+jurisdictionally
+jurisdictive
+jurisprudence
+jurisprudent
+jurisprudential
+jurisprudentialist
+jurisprudentially
+jurist
+juristic
+juristical
+juristically
+juror
+jurupaite
+jury
+juryless
+juryman
+jurywoman
+jusquaboutisme
+jusquaboutist
+jussel
+Jussi
+Jussiaea
+Jussiaean
+Jussieuan
+jussion
+jussive
+jussory
+just
+justen
+justice
+justicehood
+justiceless
+justicelike
+justicer
+justiceship
+justiceweed
+Justicia
+justiciability
+justiciable
+justicial
+justiciar
+justiciarship
+justiciary
+justiciaryship
+justicies
+justifiability
+justifiable
+justifiableness
+justifiably
+justification
+justificative
+justificator
+justificatory
+justifier
+justify
+justifying
+justifyingly
+Justin
+Justina
+Justine
+Justinian
+Justinianian
+Justinianist
+justly
+justment
+justness
+justo
+Justus
+jut
+Jute
+jute
+Jutic
+Jutish
+jutka
+Jutlander
+Jutlandish
+jutting
+juttingly
+jutty
+Juturna
+Juvavian
+juvenal
+Juvenalian
+juvenate
+juvenescence
+juvenescent
+juvenile
+juvenilely
+juvenileness
+juvenilify
+juvenilism
+juvenility
+juvenilize
+Juventas
+juventude
+Juverna
+juvia
+juvite
+juxtalittoral
+juxtamarine
+juxtapose
+juxtaposit
+juxtaposition
+juxtapositional
+juxtapositive
+juxtapyloric
+juxtaspinal
+juxtaterrestrial
+juxtatropical
+Juyas
+Juza
+Jwahar
+Jynginae
+jyngine
+Jynx
+jynx
+K
+k
+ka
+Kababish
+Kabaka
+kabaragoya
+Kabard
+Kabardian
+kabaya
+Kabbeljaws
+kabel
+kaberu
+kabiet
+Kabirpanthi
+Kabistan
+Kabonga
+kabuki
+Kabuli
+Kabyle
+Kachari
+Kachin
+kachin
+Kadaga
+Kadarite
+kadaya
+Kadayan
+Kaddish
+kadein
+kadikane
+kadischi
+Kadmi
+kados
+Kadu
+kaempferol
+Kaf
+Kafa
+kaferita
+Kaffir
+kaffir
+kaffiyeh
+Kaffraria
+Kaffrarian
+Kafir
+kafir
+Kafiri
+kafirin
+kafiz
+Kafka
+Kafkaesque
+kafta
+kago
+kagu
+kaha
+kahar
+kahau
+kahikatea
+kahili
+kahu
+kahuna
+kai
+Kaibab
+Kaibartha
+kaid
+kaik
+kaikara
+kaikawaka
+kail
+kailyard
+kailyarder
+kailyardism
+Kaimo
+Kainah
+kainga
+kainite
+kainsi
+kainyn
+kairine
+kairoline
+kaiser
+kaiserdom
+kaiserism
+kaisership
+kaitaka
+Kaithi
+kaiwhiria
+kaiwi
+Kaj
+Kajar
+kajawah
+kajugaru
+kaka
+Kakan
+kakapo
+kakar
+kakarali
+kakariki
+Kakatoe
+Kakatoidae
+kakawahie
+kaki
+kakidrosis
+kakistocracy
+kakkak
+kakke
+kakortokite
+kala
+kaladana
+kalamalo
+kalamansanai
+Kalamian
+Kalanchoe
+Kalandariyah
+Kalang
+Kalapooian
+kalashnikov
+kalasie
+Kaldani
+kale
+kaleidophon
+kaleidophone
+kaleidoscope
+kaleidoscopic
+kaleidoscopical
+kaleidoscopically
+Kalekah
+kalema
+Kalendae
+kalends
+kalewife
+kaleyard
+kali
+kalian
+Kaliana
+kaliborite
+kalidium
+kaliform
+kaligenous
+Kalinga
+kalinite
+kaliophilite
+kalipaya
+Kalispel
+kalium
+kallah
+kallege
+kallilite
+Kallima
+kallitype
+Kalmarian
+Kalmia
+Kalmuck
+kalo
+kalogeros
+kalokagathia
+kalon
+kalong
+kalpis
+kalsomine
+kalsominer
+kalumpang
+kalumpit
+Kalwar
+kalymmaukion
+kalymmocyte
+kamachile
+kamacite
+kamahi
+kamala
+kamaloka
+kamansi
+kamao
+Kamares
+kamarezite
+kamarupa
+kamarupic
+kamas
+Kamasin
+Kamass
+kamassi
+Kamba
+kambal
+kamboh
+Kamchadal
+Kamchatkan
+kame
+kameeldoorn
+kameelthorn
+Kamel
+kamelaukion
+kamerad
+kamias
+kamichi
+kamik
+kamikaze
+Kamiya
+kammalan
+kammererite
+kamperite
+kampong
+kamptomorph
+kan
+kana
+kanae
+kanagi
+Kanaka
+kanap
+kanara
+Kanarese
+kanari
+kanat
+Kanauji
+Kanawari
+Kanawha
+kanchil
+kande
+Kandelia
+kandol
+kaneh
+kanephore
+kanephoros
+Kaneshite
+Kanesian
+kang
+kanga
+kangani
+kangaroo
+kangarooer
+Kangli
+Kanji
+Kankanai
+kankie
+kannume
+kanoon
+Kanred
+kans
+Kansa
+Kansan
+kantele
+kanteletar
+kanten
+Kanthan
+Kantian
+Kantianism
+Kantism
+Kantist
+Kanuri
+Kanwar
+kaoliang
+kaolin
+kaolinate
+kaolinic
+kaolinite
+kaolinization
+kaolinize
+kapa
+kapai
+kapeika
+kapok
+kapp
+kappa
+kappe
+kappland
+kapur
+kaput
+Karabagh
+karagan
+Karaism
+Karaite
+Karaitism
+karaka
+Karakatchan
+Karakul
+karakul
+Karamojo
+karamu
+karaoke
+Karatas
+karate
+Karaya
+karaya
+karbi
+karch
+kareao
+kareeta
+Karel
+karela
+Karelian
+Karen
+Karharbari
+Kari
+karite
+Karl
+Karling
+Karluk
+karma
+Karmathian
+karmic
+karmouth
+karo
+kaross
+karou
+karree
+karri
+Karroo
+karroo
+karrusel
+karsha
+Karshuni
+Karst
+karst
+karstenite
+karstic
+kartel
+Karthli
+kartometer
+kartos
+Kartvel
+Kartvelian
+karwar
+Karwinskia
+karyaster
+karyenchyma
+karyochrome
+karyochylema
+karyogamic
+karyogamy
+karyokinesis
+karyokinetic
+karyologic
+karyological
+karyologically
+karyology
+karyolymph
+Karyolysidae
+karyolysis
+Karyolysus
+karyolytic
+karyomere
+karyomerite
+karyomicrosome
+karyomitoic
+karyomitome
+karyomiton
+karyomitosis
+karyomitotic
+karyon
+karyoplasm
+karyoplasma
+karyoplasmatic
+karyoplasmic
+karyopyknosis
+karyorrhexis
+karyoschisis
+karyosome
+karyotin
+karyotype
+kasa
+kasbah
+kasbeke
+kascamiol
+Kasha
+Kashan
+kasher
+kashga
+kashi
+kashima
+Kashmiri
+Kashmirian
+Kashoubish
+kashruth
+Kashube
+Kashubian
+Kashyapa
+kasida
+Kasikumuk
+Kaska
+Kaskaskia
+kasm
+kasolite
+kassabah
+Kassak
+Kassite
+kassu
+kastura
+Kasubian
+kat
+Katabanian
+katabasis
+katabatic
+katabella
+katabolic
+katabolically
+katabolism
+katabolite
+katabolize
+katabothron
+katachromasis
+katacrotic
+katacrotism
+katagenesis
+katagenetic
+katakana
+katakinesis
+katakinetic
+katakinetomer
+katakinetomeric
+katakiribori
+katalase
+katalysis
+katalyst
+katalytic
+katalyze
+katamorphism
+kataphoresis
+kataphoretic
+kataphoric
+kataphrenia
+kataplasia
+kataplectic
+kataplexy
+katar
+katastate
+katastatic
+katathermometer
+katatonia
+katatonic
+katatype
+katchung
+katcina
+Kate
+kath
+Katha
+katha
+kathal
+Katharina
+Katharine
+katharometer
+katharsis
+kathartic
+kathemoglobin
+kathenotheism
+Kathleen
+kathodic
+Kathopanishad
+Kathryn
+Kathy
+Katie
+Katik
+Katinka
+katipo
+Katipunan
+Katipuneros
+katmon
+katogle
+Katrine
+Katrinka
+katsup
+Katsuwonidae
+katuka
+Katukina
+katun
+katurai
+Katy
+katydid
+Kauravas
+kauri
+kava
+kavaic
+kavass
+Kavi
+Kaw
+kawaka
+Kawchodinne
+kawika
+Kay
+kay
+kayak
+kayaker
+Kayan
+Kayasth
+Kayastha
+kayles
+kayo
+Kayvan
+Kazak
+kazi
+kazoo
+Kazuhiro
+kea
+keach
+keacorn
+Keatsian
+keawe
+keb
+kebab
+kebbie
+kebbuck
+kechel
+keck
+keckle
+keckling
+kecksy
+kecky
+ked
+Kedar
+Kedarite
+keddah
+kedge
+kedger
+kedgeree
+kedlock
+Kedushshah
+Kee
+keech
+keek
+keeker
+keel
+keelage
+keelbill
+keelblock
+keelboat
+keelboatman
+keeled
+keeler
+keelfat
+keelhale
+keelhaul
+keelie
+keeling
+keelivine
+keelless
+keelman
+keelrake
+keelson
+keen
+keena
+keened
+keener
+keenly
+keenness
+keep
+keepable
+keeper
+keeperess
+keepering
+keeperless
+keepership
+keeping
+keepsake
+keepsaky
+keepworthy
+keerogue
+Kees
+keeshond
+keest
+keet
+keeve
+Keewatin
+kef
+keffel
+kefir
+kefiric
+Kefti
+Keftian
+Keftiu
+keg
+kegler
+kehaya
+kehillah
+kehoeite
+Keid
+keilhauite
+keita
+Keith
+keitloa
+Kekchi
+kekotene
+kekuna
+kelchin
+keld
+Kele
+kele
+kelebe
+kelectome
+keleh
+kelek
+kelep
+Kelima
+kelk
+kell
+kella
+kellion
+kellupweed
+Kelly
+kelly
+keloid
+keloidal
+kelp
+kelper
+kelpfish
+kelpie
+kelpware
+kelpwort
+kelpy
+kelt
+kelter
+Keltoi
+kelty
+Kelvin
+kelvin
+kelyphite
+Kemal
+Kemalism
+Kemalist
+kemb
+kemp
+kemperyman
+kempite
+kemple
+kempster
+kempt
+kempy
+Ken
+ken
+kenaf
+Kenai
+kenareh
+kench
+kend
+kendir
+kendyr
+Kenelm
+Kenipsim
+kenlore
+kenmark
+Kenn
+Kennebec
+kennebecker
+kennebunker
+Kennedya
+kennel
+kennelly
+kennelman
+kenner
+Kenneth
+kenning
+kenningwort
+kenno
+keno
+kenogenesis
+kenogenetic
+kenogenetically
+kenogeny
+kenosis
+kenotic
+kenoticism
+kenoticist
+kenotism
+kenotist
+kenotoxin
+kenotron
+Kenseikai
+kensington
+Kensitite
+kenspac
+kenspeck
+kenspeckle
+Kent
+kent
+kentallenite
+Kentia
+Kenticism
+Kentish
+Kentishman
+kentledge
+Kenton
+kentrogon
+kentrolite
+Kentuckian
+Kentucky
+kenyte
+kep
+kepi
+Keplerian
+kept
+Ker
+keracele
+keralite
+kerana
+keraphyllocele
+keraphyllous
+kerasin
+kerasine
+kerat
+keratalgia
+keratectasia
+keratectomy
+Keraterpeton
+keratin
+keratinization
+keratinize
+keratinoid
+keratinose
+keratinous
+keratitis
+keratoangioma
+keratocele
+keratocentesis
+keratoconjunctivitis
+keratoconus
+keratocricoid
+keratode
+keratodermia
+keratogenic
+keratogenous
+keratoglobus
+keratoglossus
+keratohelcosis
+keratohyal
+keratoid
+Keratoidea
+keratoiritis
+Keratol
+keratoleukoma
+keratolysis
+keratolytic
+keratoma
+keratomalacia
+keratome
+keratometer
+keratometry
+keratomycosis
+keratoncus
+keratonosus
+keratonyxis
+keratophyre
+keratoplastic
+keratoplasty
+keratorrhexis
+keratoscope
+keratoscopy
+keratose
+keratosis
+keratotome
+keratotomy
+keratto
+keraulophon
+keraulophone
+Keraunia
+keraunion
+keraunograph
+keraunographic
+keraunography
+keraunophone
+keraunophonic
+keraunoscopia
+keraunoscopy
+kerbstone
+kerchief
+kerchiefed
+kerchoo
+kerchug
+kerchunk
+kerectomy
+kerel
+Keres
+Keresan
+Kerewa
+kerf
+kerflap
+kerflop
+kerflummox
+Kerite
+Kermanji
+Kermanshah
+kermes
+kermesic
+kermesite
+kermis
+kern
+kernel
+kerneled
+kernelless
+kernelly
+kerner
+kernetty
+kernish
+kernite
+kernos
+kerogen
+kerosene
+kerplunk
+Kerri
+Kerria
+kerrie
+kerrikerri
+kerril
+kerrite
+Kerry
+kerry
+kersantite
+kersey
+kerseymere
+kerslam
+kerslosh
+kersmash
+kerugma
+kerwham
+kerygma
+kerygmatic
+kerykeion
+kerystic
+kerystics
+Keryx
+kesslerman
+kestrel
+ket
+keta
+ketal
+ketapang
+ketazine
+ketch
+ketchcraft
+ketchup
+ketembilla
+keten
+ketene
+ketimide
+ketimine
+ketipate
+ketipic
+keto
+ketogen
+ketogenesis
+ketogenic
+ketoheptose
+ketohexose
+ketoketene
+ketol
+ketole
+ketolysis
+ketolytic
+ketone
+ketonemia
+ketonic
+ketonimid
+ketonimide
+ketonimin
+ketonimine
+ketonization
+ketonize
+ketonuria
+ketose
+ketoside
+ketosis
+ketosuccinic
+ketoxime
+kette
+ketting
+kettle
+kettlecase
+kettledrum
+kettledrummer
+kettleful
+kettlemaker
+kettlemaking
+kettler
+ketty
+Ketu
+ketuba
+ketupa
+ketyl
+keup
+Keuper
+keurboom
+kevalin
+Kevan
+kevel
+kevelhead
+Kevin
+kevutzah
+Kevyn
+Keweenawan
+keweenawite
+kewpie
+kex
+kexy
+key
+keyage
+keyboard
+keyed
+keyhole
+keyless
+keylet
+keylock
+Keynesian
+Keynesianism
+keynote
+keynoter
+keyseater
+keyserlick
+keysmith
+keystone
+keystoned
+Keystoner
+keyway
+Kha
+khaddar
+khadi
+khagiarite
+khahoon
+khaiki
+khair
+khaja
+khajur
+khakanship
+khaki
+khakied
+Khaldian
+khalifa
+Khalifat
+Khalkha
+khalsa
+Khami
+khamsin
+Khamti
+khan
+khanate
+khanda
+khandait
+khanjar
+khanjee
+khankah
+khansamah
+khanum
+khar
+kharaj
+Kharia
+Kharijite
+Kharoshthi
+kharouba
+kharroubah
+Khartoumer
+kharua
+Kharwar
+Khasa
+Khasi
+khass
+khat
+khatib
+khatri
+Khatti
+Khattish
+Khaya
+Khazar
+Khazarian
+khediva
+khedival
+khedivate
+khedive
+khediviah
+khedivial
+khediviate
+khepesh
+Kherwari
+Kherwarian
+khet
+Khevzur
+khidmatgar
+Khila
+khilat
+khir
+khirka
+Khitan
+Khivan
+Khlysti
+Khmer
+Khoja
+khoja
+khoka
+Khokani
+Khond
+Khorassan
+khot
+Khotan
+Khotana
+Khowar
+khu
+Khuai
+khubber
+khula
+khuskhus
+Khussak
+khutbah
+khutuktu
+Khuzi
+khvat
+Khwarazmian
+kiack
+kiaki
+kialee
+kiang
+Kiangan
+kiaugh
+kibber
+kibble
+kibbler
+kibblerman
+kibe
+kibei
+kibitka
+kibitz
+kibitzer
+kiblah
+kibosh
+kiby
+kick
+kickable
+Kickapoo
+kickback
+kickee
+kicker
+kicking
+kickish
+kickless
+kickoff
+kickout
+kickseys
+kickshaw
+kickup
+Kidder
+kidder
+Kidderminster
+kiddier
+kiddish
+kiddush
+kiddushin
+kiddy
+kidhood
+kidlet
+kidling
+kidnap
+kidnapee
+kidnaper
+kidney
+kidneyroot
+kidneywort
+Kids
+kidskin
+kidsman
+kiefekil
+Kieffer
+kiekie
+kiel
+kier
+Kieran
+kieselguhr
+kieserite
+kiestless
+kieye
+Kiho
+kikar
+Kikatsik
+kikawaeo
+kike
+Kiki
+kiki
+Kikki
+Kikongo
+kiku
+kikuel
+kikumon
+Kikuyu
+kil
+kiladja
+kilah
+kilampere
+kilan
+kilbrickenite
+kildee
+kilderkin
+kileh
+kilerg
+kiley
+Kilhamite
+kilhig
+kiliare
+kilim
+kill
+killable
+killadar
+Killarney
+killas
+killcalf
+killcrop
+killcu
+killdeer
+killeekillee
+killeen
+killer
+killick
+killifish
+killing
+killingly
+killingness
+killinite
+killogie
+killweed
+killwort
+killy
+Kilmarnock
+kiln
+kilneye
+kilnhole
+kilnman
+kilnrib
+kilo
+kiloampere
+kilobar
+kilocalorie
+kilocycle
+kilodyne
+kilogauss
+kilogram
+kilojoule
+kiloliter
+kilolumen
+kilometer
+kilometrage
+kilometric
+kilometrical
+kiloparsec
+kilostere
+kiloton
+kilovar
+kilovolt
+kilowatt
+kilp
+kilt
+kilter
+kiltie
+kilting
+Kiluba
+Kim
+kim
+kimbang
+kimberlin
+kimberlite
+Kimberly
+Kimbundu
+Kimeridgian
+kimigayo
+Kimmo
+kimnel
+kimono
+kimonoed
+kin
+kina
+kinaesthesia
+kinaesthesis
+kinah
+kinase
+kinbote
+Kinch
+kinch
+kinchin
+kinchinmort
+kincob
+kind
+kindergarten
+kindergartener
+kindergartening
+kindergartner
+Kinderhook
+kindheart
+kindhearted
+kindheartedly
+kindheartedness
+kindle
+kindler
+kindlesome
+kindlily
+kindliness
+kindling
+kindly
+kindness
+kindred
+kindredless
+kindredly
+kindredness
+kindredship
+kinematic
+kinematical
+kinematically
+kinematics
+kinematograph
+kinemometer
+kineplasty
+kinepox
+kinesalgia
+kinescope
+kinesiatric
+kinesiatrics
+kinesic
+kinesics
+kinesimeter
+kinesiologic
+kinesiological
+kinesiology
+kinesiometer
+kinesis
+kinesitherapy
+kinesodic
+kinesthesia
+kinesthesis
+kinesthetic
+kinetic
+kinetical
+kinetically
+kinetics
+kinetochore
+kinetogenesis
+kinetogenetic
+kinetogenetically
+kinetogenic
+kinetogram
+kinetograph
+kinetographer
+kinetographic
+kinetography
+kinetomer
+kinetomeric
+kinetonema
+kinetonucleus
+kinetophone
+kinetophonograph
+kinetoplast
+kinetoscope
+kinetoscopic
+King
+king
+kingbird
+kingbolt
+kingcob
+kingcraft
+kingcup
+kingdom
+kingdomed
+kingdomful
+kingdomless
+kingdomship
+kingfish
+kingfisher
+kinghead
+kinghood
+kinghunter
+kingless
+kinglessness
+kinglet
+kinglihood
+kinglike
+kinglily
+kingliness
+kingling
+kingly
+kingmaker
+kingmaking
+kingpiece
+kingpin
+kingrow
+kingship
+kingsman
+Kingu
+kingweed
+kingwood
+Kinipetu
+kink
+kinkable
+kinkaider
+kinkajou
+kinkcough
+kinkhab
+kinkhost
+kinkily
+kinkiness
+kinkle
+kinkled
+kinkly
+kinksbush
+kinky
+kinless
+kinnikinnick
+kino
+kinofluous
+kinology
+kinoplasm
+kinoplasmic
+Kinorhyncha
+kinospore
+Kinosternidae
+Kinosternon
+kinotannic
+kinsfolk
+kinship
+kinsman
+kinsmanly
+kinsmanship
+kinspeople
+kinswoman
+kintar
+Kintyre
+kioea
+Kioko
+kiosk
+kiotome
+Kiowa
+Kiowan
+Kioway
+kip
+kipage
+Kipchak
+kipe
+Kiplingese
+Kiplingism
+kippeen
+kipper
+kipperer
+kippy
+kipsey
+kipskin
+Kiranti
+Kirghiz
+Kirghizean
+kiri
+Kirillitsa
+kirimon
+Kirk
+kirk
+kirker
+kirkify
+kirking
+kirkinhead
+kirklike
+kirkman
+kirktown
+kirkward
+kirkyard
+Kirman
+kirmew
+kirn
+kirombo
+kirsch
+Kirsten
+Kirsty
+kirtle
+kirtled
+Kirundi
+kirve
+kirver
+kischen
+kish
+Kishambala
+kishen
+kishon
+kishy
+kiskatom
+Kislev
+kismet
+kismetic
+kisra
+kiss
+kissability
+kissable
+kissableness
+kissage
+kissar
+kisser
+kissing
+kissingly
+kissproof
+kisswise
+kissy
+kist
+kistful
+kiswa
+Kiswahili
+Kit
+kit
+kitab
+kitabis
+Kitalpha
+Kitamat
+Kitan
+kitar
+kitcat
+kitchen
+kitchendom
+kitchener
+kitchenette
+kitchenful
+kitchenless
+kitchenmaid
+kitchenman
+kitchenry
+kitchenward
+kitchenwards
+kitchenware
+kitchenwife
+kitcheny
+kite
+kiteflier
+kiteflying
+kith
+kithe
+kithless
+kitish
+Kitkahaxki
+Kitkehahki
+kitling
+Kitlope
+Kittatinny
+kittel
+kitten
+kittendom
+kittenhearted
+kittenhood
+kittenish
+kittenishly
+kittenishness
+kittenless
+kittenship
+kitter
+kittereen
+kitthoge
+kittiwake
+kittle
+kittlepins
+kittles
+kittlish
+kittly
+kittock
+kittul
+Kitty
+kitty
+kittysol
+Kitunahan
+kiva
+kiver
+kivikivi
+kivu
+Kiwai
+Kiwanian
+Kiwanis
+kiwi
+kiwikiwi
+kiyas
+kiyi
+Kizil
+Kizilbash
+Kjeldahl
+kjeldahlization
+kjeldahlize
+klafter
+klaftern
+klam
+Klamath
+Klan
+Klanism
+Klansman
+Klanswoman
+klaprotholite
+Klaskino
+Klaudia
+Klaus
+klavern
+Klaxon
+klaxon
+Klebsiella
+kleeneboc
+Kleinian
+Kleistian
+klendusic
+klendusity
+klendusive
+klepht
+klephtic
+klephtism
+kleptic
+kleptistic
+kleptomania
+kleptomaniac
+kleptomanist
+kleptophobia
+klicket
+Klikitat
+Kling
+Klingsor
+klip
+klipbok
+klipdachs
+klipdas
+klipfish
+klippe
+klippen
+klipspringer
+klister
+klockmannite
+klom
+Klondike
+Klondiker
+klootchman
+klop
+klops
+klosh
+Kluxer
+klystron
+kmet
+knab
+knabble
+knack
+knackebrod
+knacker
+knackery
+knacky
+knag
+knagged
+knaggy
+knap
+knapbottle
+knape
+knappan
+Knapper
+knapper
+knappish
+knappishly
+knapsack
+knapsacked
+knapsacking
+knapweed
+knar
+knark
+knarred
+knarry
+Knautia
+knave
+knavery
+knaveship
+knavess
+knavish
+knavishly
+knavishness
+knawel
+knead
+kneadability
+kneadable
+kneader
+kneading
+kneadingly
+knebelite
+knee
+kneebrush
+kneecap
+kneed
+kneehole
+kneel
+kneeler
+kneelet
+kneeling
+kneelingly
+kneepad
+kneepan
+kneepiece
+kneestone
+Kneiffia
+Kneippism
+knell
+knelt
+Knesset
+knet
+knew
+knez
+knezi
+kniaz
+kniazi
+knick
+knicker
+Knickerbocker
+knickerbockered
+knickerbockers
+knickered
+knickers
+knickknack
+knickknackatory
+knickknacked
+knickknackery
+knickknacket
+knickknackish
+knickknacky
+knickpoint
+knife
+knifeboard
+knifeful
+knifeless
+knifelike
+knifeman
+knifeproof
+knifer
+knifesmith
+knifeway
+knight
+knightage
+knightess
+knighthead
+knighthood
+Knightia
+knightless
+knightlihood
+knightlike
+knightliness
+knightling
+knightly
+knightship
+knightswort
+Kniphofia
+Knisteneaux
+knit
+knitback
+knitch
+knitted
+knitter
+knitting
+knittle
+knitwear
+knitweed
+knitwork
+knived
+knivey
+knob
+knobbed
+knobber
+knobbiness
+knobble
+knobbler
+knobbly
+knobby
+knobkerrie
+knoblike
+knobstick
+knobstone
+knobular
+knobweed
+knobwood
+knock
+knockabout
+knockdown
+knockemdown
+knocker
+knocking
+knockless
+knockoff
+knockout
+knockstone
+knockup
+knoll
+knoller
+knolly
+knop
+knopite
+knopped
+knopper
+knoppy
+knopweed
+knorhaan
+Knorria
+knosp
+knosped
+Knossian
+knot
+knotberry
+knotgrass
+knothole
+knothorn
+knotless
+knotlike
+knotroot
+knotted
+knotter
+knottily
+knottiness
+knotting
+knotty
+knotweed
+knotwork
+knotwort
+knout
+know
+knowability
+knowable
+knowableness
+knowe
+knower
+knowing
+knowingly
+knowingness
+knowledge
+knowledgeable
+knowledgeableness
+knowledgeably
+knowledged
+knowledgeless
+knowledgement
+knowledging
+known
+knowperts
+Knoxian
+Knoxville
+knoxvillite
+knub
+knubbly
+knubby
+knublet
+knuckle
+knucklebone
+knuckled
+knuckler
+knuckling
+knuckly
+knuclesome
+Knudsen
+knur
+knurl
+knurled
+knurling
+knurly
+Knut
+knut
+Knute
+knutty
+knyaz
+knyazi
+Ko
+ko
+koa
+koae
+koala
+koali
+Koasati
+kob
+koban
+kobellite
+kobi
+kobird
+kobold
+kobong
+kobu
+Kobus
+Koch
+Kochab
+Kochia
+kochliarion
+koda
+Kodagu
+Kodak
+kodak
+kodaker
+kodakist
+kodakry
+Kodashim
+kodro
+kodurite
+Koeberlinia
+Koeberliniaceae
+koeberliniaceous
+koechlinite
+Koeksotenok
+koel
+Koellia
+Koelreuteria
+koenenite
+Koeri
+koff
+koft
+koftgar
+koftgari
+koggelmannetje
+Kogia
+Kohathite
+Koheleth
+kohemp
+Kohen
+Kohistani
+Kohl
+kohl
+Kohlan
+kohlrabi
+kohua
+koi
+Koiari
+Koibal
+koil
+koila
+koilanaglyphic
+koilon
+koimesis
+Koine
+koine
+koinon
+koinonia
+Koipato
+Koitapu
+kojang
+Kojiki
+kokako
+kokam
+kokan
+kokerboom
+kokil
+kokio
+koklas
+koklass
+Koko
+koko
+kokoon
+Kokoona
+kokoromiko
+kokowai
+kokra
+koksaghyz
+koku
+kokum
+kokumin
+kokumingun
+Kol
+kola
+kolach
+Kolarian
+Koldaji
+kolea
+koleroga
+kolhoz
+Koli
+kolinski
+kolinsky
+Kolis
+kolkhos
+kolkhoz
+Kolkka
+kollast
+kollaster
+koller
+kollergang
+kolo
+kolobion
+kolobus
+kolokolo
+kolsun
+koltunna
+koltunnor
+Koluschan
+Kolush
+Komati
+komatik
+kombu
+Kome
+Komi
+kominuter
+kommetje
+kommos
+komondor
+kompeni
+Komsomol
+kon
+kona
+konak
+Konariot
+Konde
+Kongo
+Kongoese
+Kongolese
+kongoni
+kongsbergite
+kongu
+Konia
+Koniaga
+Koniga
+konimeter
+koninckite
+konini
+koniology
+koniscope
+konjak
+Konkani
+Konomihu
+Konrad
+konstantin
+Konstantinos
+kontakion
+Konyak
+kooka
+kookaburra
+kookeree
+kookery
+kookri
+koolah
+kooletah
+kooliman
+koolokamba
+Koolooly
+koombar
+koomkie
+Koorg
+kootcha
+Kootenay
+kop
+Kopagmiut
+kopeck
+koph
+kopi
+koppa
+koppen
+koppite
+Koprino
+kor
+Kora
+kora
+koradji
+Korah
+Korahite
+Korahitic
+korait
+korakan
+Koran
+Korana
+Koranic
+Koranist
+korari
+Kore
+kore
+Korean
+korec
+koreci
+Koreish
+Koreishite
+korero
+Koreshan
+Koreshanity
+kori
+korimako
+korin
+Kornephorus
+kornerupine
+kornskeppa
+kornskeppur
+korntonde
+korntonder
+korntunna
+korntunnur
+Koroa
+koromika
+koromiko
+korona
+korova
+korrel
+korrigum
+korumburra
+koruna
+Korwa
+Kory
+Koryak
+korymboi
+korymbos
+korzec
+kos
+Kosalan
+Koschei
+kosher
+Kosimo
+kosin
+kosmokrator
+Koso
+kosong
+kosotoxin
+Kossaean
+Kossean
+Kosteletzkya
+koswite
+Kota
+kotal
+Kotar
+koto
+Kotoko
+kotschubeite
+kottigite
+kotuku
+kotukutuku
+kotwal
+kotwalee
+kotyle
+kotylos
+kou
+koulan
+Koungmiut
+kouza
+kovil
+Kowagmiut
+kowhai
+kowtow
+koyan
+kozo
+Kpuesi
+Kra
+kra
+kraal
+kraft
+Krag
+kragerite
+krageroite
+krait
+kraken
+krakowiak
+kral
+Krama
+krama
+Krameria
+Krameriaceae
+krameriaceous
+kran
+krantzite
+Krapina
+kras
+krasis
+kratogen
+kratogenic
+Kraunhia
+kraurite
+kraurosis
+kraurotic
+krausen
+krausite
+kraut
+kreis
+Kreistag
+kreistle
+kreittonite
+krelos
+kremersite
+kremlin
+krems
+kreng
+krennerite
+Krepi
+kreplech
+kreutzer
+kriegspiel
+krieker
+Krigia
+krimmer
+krina
+Kriophoros
+Kris
+Krishna
+Krishnaism
+Krishnaist
+Krishnaite
+Krishnaitic
+Kristen
+Kristi
+Kristian
+Kristin
+Kristinaux
+krisuvigite
+kritarchy
+Krithia
+Kriton
+kritrima
+krobyloi
+krobylos
+krocket
+krohnkite
+krome
+kromeski
+kromogram
+kromskop
+krona
+krone
+kronen
+kroner
+Kronion
+kronor
+kronur
+Kroo
+kroon
+krosa
+krouchka
+kroushka
+Kru
+Krugerism
+Krugerite
+Kruman
+krummhorn
+kryokonite
+krypsis
+kryptic
+krypticism
+kryptocyanine
+kryptol
+kryptomere
+krypton
+Krzysztof
+Kshatriya
+Kshatriyahood
+Kua
+Kuan
+kuan
+Kuar
+Kuba
+kuba
+Kubachi
+Kubanka
+kubba
+Kubera
+kubuklion
+Kuchean
+kuchen
+kudize
+kudos
+Kudrun
+kudu
+kudzu
+Kuehneola
+kuei
+Kufic
+kuge
+kugel
+Kuhnia
+Kui
+kuichua
+Kuki
+kukoline
+kukri
+kuku
+kukui
+Kukulcan
+kukupa
+Kukuruku
+kula
+kulack
+Kulah
+kulah
+kulaite
+kulak
+kulakism
+Kulanapan
+kulang
+Kuldip
+Kuli
+kulimit
+kulkarni
+kullaite
+Kullani
+kulm
+kulmet
+Kulturkampf
+Kulturkreis
+Kuman
+kumbi
+kumhar
+kumiss
+kummel
+Kumni
+kumquat
+kumrah
+Kumyk
+kunai
+Kunbi
+Kundry
+Kuneste
+kung
+kunk
+kunkur
+Kunmiut
+kunzite
+Kuomintang
+kupfernickel
+kupfferite
+kuphar
+kupper
+Kuranko
+kurbash
+kurchicine
+kurchine
+Kurd
+Kurdish
+Kurdistan
+kurgan
+Kuri
+Kurilian
+Kurku
+kurmburra
+Kurmi
+Kuroshio
+kurrajong
+Kurt
+kurtosis
+Kuruba
+Kurukh
+kuruma
+kurumaya
+Kurumba
+kurung
+kurus
+kurvey
+kurveyor
+kusa
+kusam
+Kusan
+kusha
+Kushshu
+kusimansel
+kuskite
+kuskos
+kuskus
+Kuskwogmiut
+Kustenau
+kusti
+Kusum
+kusum
+kutcha
+Kutchin
+Kutenai
+kuttab
+kuttar
+kuttaur
+kuvasz
+Kuvera
+kvass
+kvint
+kvinter
+Kwakiutl
+kwamme
+kwan
+Kwannon
+Kwapa
+kwarta
+kwarterka
+kwazoku
+kyack
+kyah
+kyar
+kyat
+kyaung
+Kybele
+Kyklopes
+Kyklops
+kyl
+Kyle
+kyle
+kylite
+kylix
+Kylo
+kymation
+kymatology
+kymbalon
+kymogram
+kymograph
+kymographic
+kynurenic
+kynurine
+kyphoscoliosis
+kyphoscoliotic
+Kyphosidae
+kyphosis
+kyphotic
+Kyrie
+kyrine
+kyschtymite
+kyte
+Kyu
+Kyung
+Kyurin
+Kyurinish
+L
+l
+la
+laager
+laang
+lab
+Laban
+labara
+labarum
+labba
+labber
+labdacism
+labdacismus
+labdanum
+labefact
+labefactation
+labefaction
+labefy
+label
+labeler
+labella
+labellate
+labeller
+labelloid
+labellum
+labia
+labial
+labialism
+labialismus
+labiality
+labialization
+labialize
+labially
+Labiatae
+labiate
+labiated
+labidophorous
+Labidura
+Labiduridae
+labiella
+labile
+lability
+labilization
+labilize
+labioalveolar
+labiocervical
+labiodental
+labioglossal
+labioglossolaryngeal
+labioglossopharyngeal
+labiograph
+labioguttural
+labiolingual
+labiomancy
+labiomental
+labionasal
+labiopalatal
+labiopalatalize
+labiopalatine
+labiopharyngeal
+labioplasty
+labiose
+labiotenaculum
+labiovelar
+labioversion
+labis
+labium
+lablab
+labor
+laborability
+laborable
+laborage
+laborant
+laboratorial
+laboratorian
+laboratory
+labordom
+labored
+laboredly
+laboredness
+laborer
+laboress
+laborhood
+laboring
+laboringly
+laborious
+laboriously
+laboriousness
+laborism
+laborist
+laborite
+laborless
+laborous
+laborously
+laborousness
+laborsaving
+laborsome
+laborsomely
+laborsomeness
+Laboulbenia
+Laboulbeniaceae
+laboulbeniaceous
+Laboulbeniales
+labour
+labra
+Labrador
+Labradorean
+labradorite
+labradoritic
+labral
+labret
+labretifery
+Labridae
+labroid
+Labroidea
+labrosaurid
+labrosauroid
+Labrosaurus
+labrose
+labrum
+Labrus
+labrusca
+labrys
+Laburnum
+labyrinth
+labyrinthal
+labyrinthally
+labyrinthian
+labyrinthibranch
+labyrinthibranchiate
+Labyrinthibranchii
+labyrinthic
+labyrinthical
+labyrinthically
+Labyrinthici
+labyrinthiform
+labyrinthine
+labyrinthitis
+Labyrinthodon
+labyrinthodont
+Labyrinthodonta
+labyrinthodontian
+labyrinthodontid
+labyrinthodontoid
+Labyrinthula
+Labyrinthulidae
+lac
+lacca
+laccaic
+laccainic
+laccase
+laccol
+laccolith
+laccolithic
+laccolitic
+lace
+lacebark
+laced
+Lacedaemonian
+laceflower
+laceleaf
+laceless
+lacelike
+lacemaker
+lacemaking
+laceman
+lacepiece
+lacepod
+lacer
+lacerability
+lacerable
+lacerant
+lacerate
+lacerated
+lacerately
+laceration
+lacerative
+Lacerta
+Lacertae
+lacertian
+Lacertid
+Lacertidae
+lacertiform
+Lacertilia
+lacertilian
+lacertiloid
+lacertine
+lacertoid
+lacertose
+lacery
+lacet
+lacewing
+lacewoman
+lacewood
+lacework
+laceworker
+laceybark
+lache
+Lachenalia
+laches
+Lachesis
+Lachnanthes
+Lachnosterna
+lachryma
+lachrymae
+lachrymaeform
+lachrymal
+lachrymally
+lachrymalness
+lachrymary
+lachrymation
+lachrymator
+lachrymatory
+lachrymiform
+lachrymist
+lachrymogenic
+lachrymonasal
+lachrymosal
+lachrymose
+lachrymosely
+lachrymosity
+lachrymous
+lachsa
+lacily
+Lacinaria
+laciness
+lacing
+lacinia
+laciniate
+laciniated
+laciniation
+laciniform
+laciniola
+laciniolate
+laciniose
+lacinula
+lacinulate
+lacinulose
+lacis
+lack
+lackadaisical
+lackadaisicality
+lackadaisically
+lackadaisicalness
+lackadaisy
+lackaday
+lacker
+lackey
+lackeydom
+lackeyed
+lackeyism
+lackeyship
+lackland
+lackluster
+lacklusterness
+lacklustrous
+lacksense
+lackwit
+lackwittedly
+lackwittedness
+lacmoid
+lacmus
+Laconian
+Laconic
+laconic
+laconica
+laconically
+laconicalness
+laconicism
+laconicum
+laconism
+laconize
+laconizer
+Lacosomatidae
+lacquer
+lacquerer
+lacquering
+lacquerist
+lacroixite
+lacrosse
+lacrosser
+lacrym
+lactagogue
+lactalbumin
+lactam
+lactamide
+lactant
+lactarene
+lactarious
+lactarium
+Lactarius
+lactary
+lactase
+lactate
+lactation
+lactational
+lacteal
+lactean
+lactenin
+lacteous
+lactesce
+lactescence
+lactescency
+lactescent
+lactic
+lacticinia
+lactid
+lactide
+lactiferous
+lactiferousness
+lactific
+lactifical
+lactification
+lactiflorous
+lactifluous
+lactiform
+lactifuge
+lactify
+lactigenic
+lactigenous
+lactigerous
+lactim
+lactimide
+lactinate
+lactivorous
+lacto
+lactobacilli
+Lactobacillus
+lactobacillus
+lactobutyrometer
+lactocele
+lactochrome
+lactocitrate
+lactodensimeter
+lactoflavin
+lactoglobulin
+lactoid
+lactol
+lactometer
+lactone
+lactonic
+lactonization
+lactonize
+lactophosphate
+lactoproteid
+lactoprotein
+lactoscope
+lactose
+lactoside
+lactosuria
+lactothermometer
+lactotoxin
+lactovegetarian
+Lactuca
+lactucarium
+lactucerin
+lactucin
+lactucol
+lactucon
+lactyl
+lacuna
+lacunae
+lacunal
+lacunar
+lacunaria
+lacunary
+lacune
+lacunose
+lacunosity
+lacunule
+lacunulose
+lacuscular
+lacustral
+lacustrian
+lacustrine
+lacwork
+lacy
+lad
+Ladakhi
+ladakin
+ladanigerous
+ladanum
+ladder
+laddered
+laddering
+ladderlike
+ladderway
+ladderwise
+laddery
+laddess
+laddie
+laddikie
+laddish
+laddock
+lade
+lademan
+laden
+lader
+ladhood
+ladies
+ladify
+Ladik
+Ladin
+lading
+Ladino
+ladkin
+ladle
+ladleful
+ladler
+ladlewood
+ladrone
+ladronism
+ladronize
+lady
+ladybird
+ladybug
+ladyclock
+ladydom
+ladyfinger
+ladyfish
+ladyfly
+ladyfy
+ladyhood
+ladyish
+ladyism
+ladykin
+ladykind
+ladyless
+ladylike
+ladylikely
+ladylikeness
+ladyling
+ladylintywhite
+ladylove
+ladyly
+ladyship
+Ladytide
+Laelia
+laemodipod
+Laemodipoda
+laemodipodan
+laemodipodiform
+laemodipodous
+laemoparalysis
+laemostenosis
+laeotropic
+laeotropism
+Laestrygones
+laet
+laeti
+laetic
+Laevigrada
+laevoduction
+laevogyrate
+laevogyre
+laevogyrous
+laevolactic
+laevorotation
+laevorotatory
+laevotartaric
+laevoversion
+lafayette
+Lafite
+lag
+lagan
+lagarto
+lagen
+lagena
+Lagenaria
+lagend
+lageniform
+lager
+Lagerstroemia
+Lagetta
+lagetto
+laggar
+laggard
+laggardism
+laggardly
+laggardness
+lagged
+laggen
+lagger
+laggin
+lagging
+laglast
+lagna
+lagniappe
+lagomorph
+Lagomorpha
+lagomorphic
+lagomorphous
+Lagomyidae
+lagonite
+lagoon
+lagoonal
+lagoonside
+lagophthalmos
+lagopode
+lagopodous
+lagopous
+Lagopus
+Lagorchestes
+lagostoma
+Lagostomus
+Lagothrix
+Lagrangian
+Lagthing
+Lagting
+Laguncularia
+Lagunero
+Lagurus
+lagwort
+Lahnda
+Lahontan
+Lahuli
+Lai
+lai
+Laibach
+laic
+laical
+laicality
+laically
+laich
+laicism
+laicity
+laicization
+laicize
+laicizer
+laid
+laigh
+lain
+laine
+laiose
+lair
+lairage
+laird
+lairdess
+lairdie
+lairdly
+lairdocracy
+lairdship
+lairless
+lairman
+lairstone
+lairy
+laitance
+laity
+Lak
+lak
+lakarpite
+lakatoi
+lake
+lakeland
+lakelander
+lakeless
+lakelet
+lakelike
+lakemanship
+laker
+lakeside
+lakeward
+lakeweed
+lakie
+laking
+lakish
+lakishness
+lakism
+lakist
+Lakota
+Lakshmi
+laky
+lalang
+lall
+Lallan
+Lalland
+lallation
+lalling
+lalo
+laloneurosis
+lalopathy
+lalophobia
+laloplegia
+lam
+lama
+lamaic
+Lamaism
+Lamaist
+Lamaistic
+Lamaite
+Lamanism
+Lamanite
+Lamano
+lamantin
+lamany
+Lamarckia
+Lamarckian
+Lamarckianism
+Lamarckism
+lamasary
+lamasery
+lamastery
+lamb
+Lamba
+lamba
+Lambadi
+lambale
+lambaste
+lambda
+lambdacism
+lambdoid
+lambdoidal
+lambeau
+lambency
+lambent
+lambently
+lamber
+Lambert
+lambert
+lambhood
+lambie
+lambiness
+lambish
+lambkill
+lambkin
+Lamblia
+lambliasis
+lamblike
+lambling
+lambly
+lamboys
+lambrequin
+lambsdown
+lambskin
+lambsuccory
+lamby
+lame
+lamedh
+lameduck
+lamel
+lamella
+lamellar
+Lamellaria
+Lamellariidae
+lamellarly
+lamellary
+lamellate
+lamellated
+lamellately
+lamellation
+lamellibranch
+Lamellibranchia
+Lamellibranchiata
+lamellibranchiate
+lamellicorn
+lamellicornate
+Lamellicornes
+Lamellicornia
+lamellicornous
+lamelliferous
+lamelliform
+lamellirostral
+lamellirostrate
+Lamellirostres
+lamelloid
+lamellose
+lamellosity
+lamellule
+lamely
+lameness
+lament
+lamentable
+lamentableness
+lamentably
+lamentation
+lamentational
+lamentatory
+lamented
+lamentedly
+lamenter
+lamentful
+lamenting
+lamentingly
+lamentive
+lamentory
+lamester
+lamestery
+lameter
+lametta
+lamia
+Lamiaceae
+lamiaceous
+lamiger
+lamiid
+Lamiidae
+Lamiides
+Lamiinae
+lamin
+lamina
+laminability
+laminable
+laminae
+laminar
+Laminaria
+Laminariaceae
+laminariaceous
+Laminariales
+laminarian
+laminarin
+laminarioid
+laminarite
+laminary
+laminate
+laminated
+lamination
+laminboard
+laminectomy
+laminiferous
+laminiform
+laminiplantar
+laminiplantation
+laminitis
+laminose
+laminous
+lamish
+Lamista
+lamiter
+Lamium
+Lammas
+lammas
+Lammastide
+lammer
+lammergeier
+lammock
+lammy
+Lamna
+lamnectomy
+lamnid
+Lamnidae
+lamnoid
+lamp
+lampad
+lampadary
+lampadedromy
+lampadephore
+lampadephoria
+lampadite
+lampas
+lampatia
+lampblack
+lamper
+lampern
+lampers
+lampflower
+lampfly
+lampful
+lamphole
+lamping
+lampion
+lampist
+lampistry
+lampless
+lamplet
+lamplight
+lamplighted
+lamplighter
+lamplit
+lampmaker
+lampmaking
+lampman
+Lampong
+lampoon
+lampooner
+lampoonery
+lampoonist
+lamppost
+lamprey
+Lampridae
+lamprophony
+lamprophyre
+lamprophyric
+lamprotype
+Lampsilis
+Lampsilus
+lampstand
+lampwick
+lampyrid
+Lampyridae
+lampyrine
+Lampyris
+Lamus
+Lamut
+lamziekte
+lan
+Lana
+lanameter
+Lanao
+Lanarkia
+lanarkite
+lanas
+lanate
+lanated
+lanaz
+Lancaster
+Lancasterian
+Lancastrian
+Lance
+lance
+lanced
+lancegay
+lancelet
+lancelike
+lancely
+lanceman
+lanceolar
+lanceolate
+lanceolated
+lanceolately
+lanceolation
+lancepesade
+lancepod
+lanceproof
+lancer
+lances
+lancet
+lanceted
+lanceteer
+lancewood
+lancha
+lanciers
+lanciferous
+lanciform
+lancinate
+lancination
+land
+landamman
+landau
+landaulet
+landaulette
+landblink
+landbook
+landdrost
+landed
+lander
+landesite
+landfall
+landfast
+landflood
+landgafol
+landgravate
+landgrave
+landgraveship
+landgravess
+landgraviate
+landgravine
+landholder
+landholdership
+landholding
+landimere
+landing
+landlady
+landladydom
+landladyhood
+landladyish
+landladyship
+landless
+landlessness
+landlike
+landline
+landlock
+landlocked
+landlook
+landlooker
+landloper
+landlord
+landlordism
+landlordly
+landlordry
+landlordship
+landlouper
+landlouping
+landlubber
+landlubberish
+landlubberly
+landlubbing
+landman
+landmark
+Landmarker
+landmil
+landmonger
+landocracy
+landocrat
+Landolphia
+landolphia
+landowner
+landownership
+landowning
+landplane
+landraker
+landreeve
+landright
+landsale
+landscape
+landscapist
+landshard
+landship
+landsick
+landside
+landskip
+landslide
+landslip
+Landsmaal
+landsman
+landspout
+landspringy
+Landsting
+landstorm
+Landsturm
+Landuman
+landwaiter
+landward
+landwash
+landways
+Landwehr
+landwhin
+landwire
+landwrack
+lane
+lanete
+laneway
+laney
+langaha
+langarai
+langbanite
+langbeinite
+langca
+Langhian
+langi
+langite
+langlauf
+langlaufer
+langle
+Lango
+Langobard
+Langobardic
+langoon
+langooty
+langrage
+langsat
+Langsdorffia
+langsettle
+Langshan
+langspiel
+langsyne
+language
+languaged
+languageless
+langued
+Languedocian
+languescent
+languet
+languid
+languidly
+languidness
+languish
+languisher
+languishing
+languishingly
+languishment
+languor
+languorous
+languorously
+langur
+laniariform
+laniary
+laniate
+laniferous
+lanific
+laniflorous
+laniform
+lanigerous
+Laniidae
+laniiform
+Laniinae
+lanioid
+lanista
+Lanital
+Lanius
+lank
+lanket
+lankily
+lankiness
+lankish
+lankly
+lankness
+lanky
+lanner
+lanneret
+Lanny
+lanolin
+lanose
+lanosity
+lansat
+lansdowne
+lanseh
+lansfordite
+lansknecht
+lanson
+lansquenet
+lant
+lantaca
+Lantana
+lanterloo
+lantern
+lanternflower
+lanternist
+lanternleaf
+lanternman
+lanthana
+lanthanide
+lanthanite
+Lanthanotidae
+Lanthanotus
+lanthanum
+lanthopine
+lantum
+lanuginose
+lanuginous
+lanuginousness
+lanugo
+lanum
+Lanuvian
+lanx
+lanyard
+Lao
+Laodicean
+Laodiceanism
+Laotian
+lap
+lapacho
+lapachol
+lapactic
+Lapageria
+laparectomy
+laparocele
+laparocholecystotomy
+laparocolectomy
+laparocolostomy
+laparocolotomy
+laparocolpohysterotomy
+laparocolpotomy
+laparocystectomy
+laparocystotomy
+laparoelytrotomy
+laparoenterostomy
+laparoenterotomy
+laparogastroscopy
+laparogastrotomy
+laparohepatotomy
+laparohysterectomy
+laparohysteropexy
+laparohysterotomy
+laparoileotomy
+laparomyitis
+laparomyomectomy
+laparomyomotomy
+laparonephrectomy
+laparonephrotomy
+laparorrhaphy
+laparosalpingectomy
+laparosalpingotomy
+laparoscopy
+laparosplenectomy
+laparosplenotomy
+laparostict
+Laparosticti
+laparothoracoscopy
+laparotome
+laparotomist
+laparotomize
+laparotomy
+laparotrachelotomy
+lapboard
+lapcock
+Lapeirousia
+lapel
+lapeler
+lapelled
+lapful
+lapicide
+lapidarian
+lapidarist
+lapidary
+lapidate
+lapidation
+lapidator
+lapideon
+lapideous
+lapidescent
+lapidicolous
+lapidific
+lapidification
+lapidify
+lapidist
+lapidity
+lapidose
+lapilliform
+lapillo
+lapillus
+Lapith
+Lapithae
+Lapithaean
+Laplacian
+Lapland
+Laplander
+Laplandian
+Laplandic
+Laplandish
+lapon
+Laportea
+Lapp
+Lappa
+lappaceous
+lappage
+lapped
+lapper
+lappet
+lappeted
+Lappic
+lapping
+Lappish
+Lapponese
+Lapponian
+Lappula
+lapsability
+lapsable
+Lapsana
+lapsation
+lapse
+lapsed
+lapser
+lapsi
+lapsing
+lapsingly
+lapstone
+lapstreak
+lapstreaked
+lapstreaker
+Laputa
+Laputan
+laputically
+lapwing
+lapwork
+laquear
+laquearian
+laqueus
+Lar
+lar
+Laralia
+Laramide
+Laramie
+larboard
+larbolins
+larbowlines
+larcener
+larcenic
+larcenish
+larcenist
+larcenous
+larcenously
+larceny
+larch
+larchen
+lard
+lardacein
+lardaceous
+larder
+larderellite
+larderer
+larderful
+larderlike
+lardiform
+lardite
+Lardizabalaceae
+lardizabalaceous
+lardon
+lardworm
+lardy
+lareabell
+Larentiidae
+large
+largebrained
+largehanded
+largehearted
+largeheartedness
+largely
+largemouth
+largemouthed
+largen
+largeness
+largess
+larghetto
+largifical
+largish
+largition
+largitional
+largo
+Lari
+lari
+Laria
+lariat
+larick
+larid
+Laridae
+laridine
+larigo
+larigot
+lariid
+Lariidae
+larin
+Larinae
+larine
+larithmics
+Larix
+larixin
+lark
+larker
+larkiness
+larking
+larkingly
+larkish
+larkishness
+larklike
+larkling
+larksome
+larkspur
+larky
+larmier
+larmoyant
+Larnaudian
+larnax
+laroid
+larrigan
+larrikin
+larrikinalian
+larrikiness
+larrikinism
+larriman
+larrup
+Larry
+larry
+Lars
+larsenite
+Larunda
+Larus
+larva
+Larvacea
+larvae
+larval
+Larvalia
+larvarium
+larvate
+larve
+larvicidal
+larvicide
+larvicolous
+larviform
+larvigerous
+larvikite
+larviparous
+larviposit
+larviposition
+larvivorous
+larvule
+laryngal
+laryngalgia
+laryngeal
+laryngeally
+laryngean
+laryngeating
+laryngectomy
+laryngemphraxis
+laryngendoscope
+larynges
+laryngic
+laryngismal
+laryngismus
+laryngitic
+laryngitis
+laryngocele
+laryngocentesis
+laryngofission
+laryngofissure
+laryngograph
+laryngography
+laryngological
+laryngologist
+laryngology
+laryngometry
+laryngoparalysis
+laryngopathy
+laryngopharyngeal
+laryngopharyngitis
+laryngophony
+laryngophthisis
+laryngoplasty
+laryngoplegia
+laryngorrhagia
+laryngorrhea
+laryngoscleroma
+laryngoscope
+laryngoscopic
+laryngoscopical
+laryngoscopist
+laryngoscopy
+laryngospasm
+laryngostasis
+laryngostenosis
+laryngostomy
+laryngostroboscope
+laryngotome
+laryngotomy
+laryngotracheal
+laryngotracheitis
+laryngotracheoscopy
+laryngotracheotomy
+laryngotyphoid
+laryngovestibulitis
+larynx
+las
+lasa
+lasarwort
+lascar
+lascivious
+lasciviously
+lasciviousness
+laser
+Laserpitium
+laserwort
+lash
+lasher
+lashingly
+lashless
+lashlite
+Lasi
+lasianthous
+Lasiocampa
+lasiocampid
+Lasiocampidae
+Lasiocampoidea
+lasiocarpous
+Lasius
+lask
+lasket
+Laspeyresia
+laspring
+lasque
+lass
+lasset
+lassie
+lassiehood
+lassieish
+lassitude
+lasslorn
+lasso
+lassock
+lassoer
+last
+lastage
+laster
+lasting
+lastingly
+lastingness
+lastly
+lastness
+lastre
+lastspring
+lasty
+lat
+lata
+latah
+Latakia
+Latania
+Latax
+latch
+latcher
+latchet
+latching
+latchkey
+latchless
+latchman
+latchstring
+late
+latebra
+latebricole
+latecomer
+latecoming
+lated
+lateen
+lateener
+lately
+laten
+latence
+latency
+lateness
+latensification
+latent
+latentize
+latently
+latentness
+later
+latera
+laterad
+lateral
+lateralis
+laterality
+lateralization
+lateralize
+laterally
+Lateran
+latericumbent
+lateriflexion
+laterifloral
+lateriflorous
+laterifolious
+Laterigradae
+laterigrade
+laterinerved
+laterite
+lateritic
+lateritious
+lateriversion
+laterization
+lateroabdominal
+lateroanterior
+laterocaudal
+laterocervical
+laterodeviation
+laterodorsal
+lateroduction
+lateroflexion
+lateromarginal
+lateronuchal
+lateroposition
+lateroposterior
+lateropulsion
+laterostigmatal
+laterostigmatic
+laterotemporal
+laterotorsion
+lateroventral
+lateroversion
+latescence
+latescent
+latesome
+latest
+latewhile
+latex
+latexosis
+lath
+lathe
+lathee
+latheman
+lathen
+lather
+latherability
+latherable
+lathereeve
+latherer
+latherin
+latheron
+latherwort
+lathery
+lathesman
+lathhouse
+lathing
+Lathraea
+lathwork
+lathy
+lathyric
+lathyrism
+Lathyrus
+Latian
+latibulize
+latices
+laticiferous
+laticlave
+laticostate
+latidentate
+latifundian
+latifundium
+latigo
+Latimeria
+Latin
+Latinate
+Latiner
+Latinesque
+Latinian
+Latinic
+Latiniform
+Latinism
+latinism
+Latinist
+Latinistic
+Latinistical
+Latinitaster
+Latinity
+Latinization
+Latinize
+Latinizer
+Latinless
+Latinus
+lation
+latipennate
+latiplantar
+latirostral
+Latirostres
+latirostrous
+Latirus
+latisept
+latiseptal
+latiseptate
+latish
+latisternal
+latitancy
+latitant
+latitat
+latite
+latitude
+latitudinal
+latitudinally
+latitudinarian
+latitudinarianisn
+latitudinary
+latitudinous
+latomy
+Latona
+Latonian
+Latooka
+latrant
+latration
+latreutic
+latria
+Latrididae
+latrine
+Latris
+latro
+latrobe
+latrobite
+latrocinium
+Latrodectus
+latron
+latten
+lattener
+latter
+latterkin
+latterly
+lattermath
+lattermost
+latterness
+lattice
+latticed
+latticewise
+latticework
+latticing
+latticinio
+Latuka
+latus
+Latvian
+lauan
+laubanite
+laud
+laudability
+laudable
+laudableness
+laudably
+laudanidine
+laudanin
+laudanine
+laudanosine
+laudanum
+laudation
+laudative
+laudator
+laudatorily
+laudatory
+lauder
+Laudian
+Laudianism
+laudification
+Laudism
+Laudist
+laudist
+laugh
+laughable
+laughableness
+laughably
+laughee
+laugher
+laughful
+laughing
+laughingly
+laughingstock
+laughsome
+laughter
+laughterful
+laughterless
+laughworthy
+laughy
+lauia
+laumonite
+laumontite
+laun
+launce
+launch
+launcher
+launchful
+launchways
+laund
+launder
+launderability
+launderable
+launderer
+laundry
+laundrymaid
+laundryman
+laundryowner
+laundrywoman
+laur
+Laura
+laura
+Lauraceae
+lauraceous
+lauraldehyde
+laurate
+laurdalite
+laureate
+laureated
+laureateship
+laureation
+Laurel
+laurel
+laureled
+laurellike
+laurelship
+laurelwood
+Laurence
+Laurencia
+Laurent
+Laurentian
+Laurentide
+laureole
+Laurianne
+lauric
+Laurie
+laurin
+laurinoxylon
+laurionite
+laurite
+Laurocerasus
+laurone
+laurotetanine
+Laurus
+laurustine
+laurustinus
+laurvikite
+lauryl
+lautarite
+lautitious
+lava
+lavable
+lavabo
+lavacre
+lavage
+lavaliere
+lavalike
+Lavandula
+lavanga
+lavant
+lavaret
+Lavatera
+lavatic
+lavation
+lavational
+lavatorial
+lavatory
+lave
+laveer
+Lavehr
+lavement
+lavender
+lavenite
+laver
+Laverania
+laverock
+laverwort
+lavialite
+lavic
+Lavinia
+lavish
+lavisher
+lavishing
+lavishingly
+lavishly
+lavishment
+lavishness
+lavolta
+lavrovite
+law
+lawbook
+lawbreaker
+lawbreaking
+lawcraft
+lawful
+lawfully
+lawfulness
+lawgiver
+lawgiving
+lawing
+lawish
+lawk
+lawlants
+lawless
+lawlessly
+lawlessness
+lawlike
+lawmaker
+lawmaking
+lawman
+lawmonger
+lawn
+lawned
+lawner
+lawnlet
+lawnlike
+lawny
+lawproof
+Lawrence
+lawrencite
+Lawrie
+lawrightman
+Lawson
+Lawsoneve
+Lawsonia
+lawsonite
+lawsuit
+lawsuiting
+lawter
+Lawton
+lawyer
+lawyeress
+lawyerism
+lawyerlike
+lawyerling
+lawyerly
+lawyership
+lawyery
+lawzy
+lax
+laxate
+laxation
+laxative
+laxatively
+laxativeness
+laxiflorous
+laxifoliate
+laxifolious
+laxism
+laxist
+laxity
+laxly
+laxness
+lay
+layaway
+layback
+layboy
+layer
+layerage
+layered
+layery
+layette
+Layia
+laying
+layland
+layman
+laymanship
+layne
+layoff
+layout
+layover
+layship
+laystall
+laystow
+laywoman
+Laz
+lazar
+lazaret
+lazaretto
+Lazarist
+lazarlike
+lazarly
+lazarole
+Lazarus
+laze
+lazily
+laziness
+lazule
+lazuli
+lazuline
+lazulite
+lazulitic
+lazurite
+lazy
+lazybird
+lazybones
+lazyboots
+lazyhood
+lazyish
+lazylegs
+lazyship
+lazzarone
+lazzaroni
+Lea
+lea
+leach
+leacher
+leachman
+leachy
+Lead
+lead
+leadable
+leadableness
+leadage
+leadback
+leaded
+leaden
+leadenhearted
+leadenheartedness
+leadenly
+leadenness
+leadenpated
+leader
+leaderess
+leaderette
+leaderless
+leadership
+leadhillite
+leadin
+leadiness
+leading
+leadingly
+leadless
+leadman
+leadoff
+leadout
+leadproof
+Leads
+leadsman
+leadstone
+leadway
+leadwood
+leadwork
+leadwort
+leady
+leaf
+leafage
+leafboy
+leafcup
+leafdom
+leafed
+leafen
+leafer
+leafery
+leafgirl
+leafit
+leafless
+leaflessness
+leaflet
+leafleteer
+leaflike
+leafstalk
+leafwork
+leafy
+league
+leaguelong
+leaguer
+Leah
+leak
+leakage
+leakance
+leaker
+leakiness
+leakless
+leakproof
+leaky
+leal
+lealand
+leally
+lealness
+lealty
+leam
+leamer
+lean
+Leander
+leaner
+leaning
+leanish
+leanly
+leanness
+leant
+leap
+leapable
+leaper
+leapfrog
+leapfrogger
+leapfrogging
+leaping
+leapingly
+leapt
+Lear
+lear
+Learchus
+learn
+learnable
+learned
+learnedly
+learnedness
+learner
+learnership
+learning
+learnt
+Learoyd
+leasable
+lease
+leasehold
+leaseholder
+leaseholding
+leaseless
+leasemonger
+leaser
+leash
+leashless
+leasing
+leasow
+least
+leastways
+leastwise
+leat
+leath
+leather
+leatherback
+leatherbark
+leatherboard
+leatherbush
+leathercoat
+leathercraft
+leatherer
+Leatherette
+leatherfish
+leatherflower
+leatherhead
+leatherine
+leatheriness
+leathering
+leatherize
+leatherjacket
+leatherleaf
+leatherlike
+leathermaker
+leathermaking
+leathern
+leatherneck
+Leatheroid
+leatherroot
+leatherside
+Leatherstocking
+leatherware
+leatherwing
+leatherwood
+leatherwork
+leatherworker
+leatherworking
+leathery
+leathwake
+leatman
+leave
+leaved
+leaveless
+leavelooker
+leaven
+leavening
+leavenish
+leavenless
+leavenous
+leaver
+leaverwood
+leaves
+leaving
+leavy
+leawill
+leban
+Lebanese
+lebbek
+lebensraum
+Lebistes
+lebrancho
+lecama
+lecaniid
+Lecaniinae
+lecanine
+Lecanium
+lecanomancer
+lecanomancy
+lecanomantic
+Lecanora
+Lecanoraceae
+lecanoraceous
+lecanorine
+lecanoroid
+lecanoscopic
+lecanoscopy
+lech
+Lechea
+lecher
+lecherous
+lecherously
+lecherousness
+lechery
+lechriodont
+Lechriodonta
+lechuguilla
+lechwe
+Lecidea
+Lecideaceae
+lecideaceous
+lecideiform
+lecideine
+lecidioid
+lecithal
+lecithalbumin
+lecithality
+lecithin
+lecithinase
+lecithoblast
+lecithoprotein
+leck
+lecker
+lecontite
+lecotropal
+lectern
+lection
+lectionary
+lectisternium
+lector
+lectorate
+lectorial
+lectorship
+lectotype
+lectress
+lectrice
+lectual
+lecture
+lecturee
+lectureproof
+lecturer
+lectureship
+lecturess
+lecturette
+lecyth
+lecythid
+Lecythidaceae
+lecythidaceous
+Lecythis
+lecythoid
+lecythus
+led
+Leda
+lede
+leden
+lederite
+ledge
+ledged
+ledgeless
+ledger
+ledgerdom
+ledging
+ledgment
+ledgy
+Ledidae
+ledol
+Ledum
+Lee
+lee
+leeangle
+leeboard
+leech
+leecheater
+leecher
+leechery
+leeches
+leechkin
+leechlike
+leechwort
+leed
+leefang
+leeftail
+leek
+leekish
+leeky
+leep
+leepit
+leer
+leerily
+leeringly
+leerish
+leerness
+leeroway
+Leersia
+leery
+lees
+leet
+leetman
+leewan
+leeward
+leewardly
+leewardmost
+leewardness
+leeway
+leewill
+left
+leftish
+leftism
+leftist
+leftments
+leftmost
+leftness
+leftover
+leftward
+leftwardly
+leftwards
+leg
+legacy
+legal
+legalese
+legalism
+legalist
+legalistic
+legalistically
+legality
+legalization
+legalize
+legally
+legalness
+legantine
+legatary
+legate
+legatee
+legateship
+legatine
+legation
+legationary
+legative
+legato
+legator
+legatorial
+legend
+legenda
+legendarian
+legendary
+legendic
+legendist
+legendless
+Legendrian
+legendry
+leger
+legerdemain
+legerdemainist
+legerity
+leges
+legged
+legger
+legginess
+legging
+legginged
+leggy
+leghorn
+legibility
+legible
+legibleness
+legibly
+legific
+legion
+legionary
+legioned
+legioner
+legionnaire
+legionry
+legislate
+legislation
+legislational
+legislativ
+legislative
+legislatively
+legislator
+legislatorial
+legislatorially
+legislatorship
+legislatress
+legislature
+legist
+legit
+legitim
+legitimacy
+legitimate
+legitimately
+legitimateness
+legitimation
+legitimatist
+legitimatize
+legitimism
+legitimist
+legitimistic
+legitimity
+legitimization
+legitimize
+leglen
+legless
+leglessness
+leglet
+leglike
+legman
+legoa
+legpiece
+legpull
+legpuller
+legpulling
+legrope
+legua
+leguan
+Leguatia
+leguleian
+leguleious
+legume
+legumelin
+legumen
+legumin
+leguminiform
+Leguminosae
+leguminose
+leguminous
+Lehi
+lehr
+lehrbachite
+lehrman
+lehua
+lei
+Leibnitzian
+Leibnitzianism
+Leicester
+Leif
+Leigh
+leighton
+Leila
+leimtype
+leiocephalous
+leiocome
+leiodermatous
+leiodermia
+leiomyofibroma
+leiomyoma
+leiomyomatous
+leiomyosarcoma
+leiophyllous
+Leiophyllum
+Leiothrix
+Leiotrichan
+Leiotriches
+Leiotrichi
+Leiotrichidae
+Leiotrichinae
+leiotrichine
+leiotrichous
+leiotrichy
+leiotropic
+Leipoa
+Leishmania
+leishmaniasis
+Leisten
+leister
+leisterer
+leisurable
+leisurably
+leisure
+leisured
+leisureful
+leisureless
+leisureliness
+leisurely
+leisureness
+Leith
+leitmotiv
+Leitneria
+Leitneriaceae
+leitneriaceous
+Leitneriales
+lek
+lekach
+lekane
+lekha
+Lelia
+Lemaireocereus
+leman
+Lemanea
+Lemaneaceae
+lemel
+lemma
+lemmata
+lemming
+lemmitis
+lemmoblastic
+lemmocyte
+Lemmus
+Lemna
+Lemnaceae
+lemnaceous
+lemnad
+Lemnian
+lemniscate
+lemniscatic
+lemniscus
+lemography
+lemology
+lemon
+lemonade
+Lemonias
+Lemoniidae
+Lemoniinae
+lemonish
+lemonlike
+lemonweed
+lemonwood
+lemony
+Lemosi
+Lemovices
+lempira
+Lemuel
+lemur
+lemures
+Lemuria
+Lemurian
+lemurian
+lemurid
+Lemuridae
+lemuriform
+Lemurinae
+lemurine
+lemuroid
+Lemuroidea
+Len
+Lena
+lenad
+Lenaea
+Lenaean
+Lenaeum
+Lenaeus
+Lenape
+lenard
+Lenca
+Lencan
+lench
+lend
+lendable
+lendee
+lender
+Lendu
+lene
+length
+lengthen
+lengthener
+lengther
+lengthful
+lengthily
+lengthiness
+lengthsman
+lengthsome
+lengthsomeness
+lengthways
+lengthwise
+lengthy
+lenience
+leniency
+lenient
+leniently
+lenify
+Leninism
+Leninist
+Leninite
+lenis
+lenitic
+lenitive
+lenitively
+lenitiveness
+lenitude
+lenity
+lennilite
+Lennoaceae
+lennoaceous
+lennow
+Lenny
+leno
+Lenora
+lens
+lensed
+lensless
+lenslike
+Lent
+lent
+Lenten
+Lententide
+lenth
+lenthways
+Lentibulariaceae
+lentibulariaceous
+lenticel
+lenticellate
+lenticle
+lenticonus
+lenticula
+lenticular
+lenticulare
+lenticularis
+lenticularly
+lenticulate
+lenticulated
+lenticule
+lenticulostriate
+lenticulothalamic
+lentiform
+lentigerous
+lentiginous
+lentigo
+lentil
+Lentilla
+lentisc
+lentiscine
+lentisco
+lentiscus
+lentisk
+lentitude
+lentitudinous
+lento
+lentoid
+lentor
+lentous
+lenvoi
+lenvoy
+Lenzites
+Leo
+Leon
+Leonard
+Leonardesque
+Leonato
+leoncito
+Leonese
+leonhardite
+Leonid
+Leonine
+leonine
+leoninely
+leonines
+Leonis
+Leonist
+leonite
+Leonnoys
+Leonora
+Leonotis
+leontiasis
+Leontocebus
+leontocephalous
+Leontodon
+Leontopodium
+Leonurus
+leopard
+leoparde
+leopardess
+leopardine
+leopardite
+leopardwood
+Leopold
+Leopoldinia
+leopoldite
+Leora
+leotard
+lepa
+Lepadidae
+lepadoid
+Lepanto
+lepargylic
+Lepargyraea
+Lepas
+Lepcha
+leper
+leperdom
+lepered
+lepidene
+lepidine
+Lepidium
+lepidoblastic
+Lepidodendraceae
+lepidodendraceous
+lepidodendrid
+lepidodendroid
+Lepidodendron
+lepidoid
+Lepidoidei
+lepidolite
+lepidomelane
+Lepidophloios
+lepidophyllous
+Lepidophyllum
+lepidophyte
+lepidophytic
+lepidoporphyrin
+lepidopter
+Lepidoptera
+lepidopteral
+lepidopteran
+lepidopterid
+lepidopterist
+lepidopterological
+lepidopterologist
+lepidopterology
+lepidopteron
+lepidopterous
+Lepidosauria
+lepidosaurian
+Lepidosiren
+Lepidosirenidae
+lepidosirenoid
+lepidosis
+Lepidosperma
+Lepidospermae
+Lepidosphes
+Lepidostei
+lepidosteoid
+Lepidosteus
+Lepidostrobus
+lepidote
+Lepidotes
+lepidotic
+Lepidotus
+Lepidurus
+Lepilemur
+Lepiota
+Lepisma
+Lepismatidae
+Lepismidae
+lepismoid
+Lepisosteidae
+Lepisosteus
+lepocyte
+Lepomis
+leporid
+Leporidae
+leporide
+leporiform
+leporine
+Leporis
+Lepospondyli
+lepospondylous
+Leposternidae
+Leposternon
+lepothrix
+lepra
+Lepralia
+lepralian
+leprechaun
+lepric
+leproid
+leprologic
+leprologist
+leprology
+leproma
+lepromatous
+leprosarium
+leprose
+leprosery
+leprosied
+leprosis
+leprosity
+leprosy
+leprous
+leprously
+leprousness
+Leptamnium
+Leptandra
+leptandrin
+leptid
+Leptidae
+leptiform
+Leptilon
+leptinolite
+Leptinotarsa
+leptite
+Leptocardia
+leptocardian
+Leptocardii
+leptocentric
+leptocephalan
+leptocephali
+leptocephalia
+leptocephalic
+leptocephalid
+Leptocephalidae
+leptocephaloid
+leptocephalous
+Leptocephalus
+leptocephalus
+leptocephaly
+leptocercal
+leptochlorite
+leptochroa
+leptochrous
+leptoclase
+leptodactyl
+Leptodactylidae
+leptodactylous
+Leptodactylus
+leptodermatous
+leptodermous
+Leptodora
+Leptodoridae
+Leptogenesis
+leptokurtic
+Leptolepidae
+Leptolepis
+Leptolinae
+leptomatic
+leptome
+Leptomedusae
+leptomedusan
+leptomeningeal
+leptomeninges
+leptomeningitis
+leptomeninx
+leptometer
+leptomonad
+Leptomonas
+Lepton
+lepton
+leptonecrosis
+leptonema
+leptopellic
+Leptophis
+leptophyllous
+leptoprosope
+leptoprosopic
+leptoprosopous
+leptoprosopy
+Leptoptilus
+Leptorchis
+leptorrhin
+leptorrhine
+leptorrhinian
+leptorrhinism
+leptosome
+leptosperm
+Leptospermum
+Leptosphaeria
+Leptospira
+leptospirosis
+leptosporangiate
+Leptostraca
+leptostracan
+leptostracous
+Leptostromataceae
+Leptosyne
+leptotene
+Leptothrix
+Leptotrichia
+Leptotyphlopidae
+Leptotyphlops
+leptus
+leptynite
+Lepus
+Ler
+Lernaea
+Lernaeacea
+Lernaean
+Lernaeidae
+lernaeiform
+lernaeoid
+Lernaeoides
+lerot
+lerp
+lerret
+Lerwa
+Les
+Lesath
+Lesbia
+Lesbian
+Lesbianism
+lesche
+Lesgh
+lesion
+lesional
+lesiy
+Leskea
+Leskeaceae
+leskeaceous
+Lesleya
+Leslie
+Lespedeza
+Lesquerella
+less
+lessee
+lesseeship
+lessen
+lessener
+lesser
+lessive
+lessn
+lessness
+lesson
+lessor
+lest
+Lester
+lestiwarite
+lestobiosis
+lestobiotic
+Lestodon
+Lestosaurus
+lestrad
+Lestrigon
+Lestrigonian
+let
+letch
+letchy
+letdown
+lete
+lethal
+lethality
+lethalize
+lethally
+lethargic
+lethargical
+lethargically
+lethargicalness
+lethargize
+lethargus
+lethargy
+Lethe
+Lethean
+lethiferous
+Lethocerus
+lethologica
+Letitia
+Leto
+letoff
+Lett
+lettable
+letten
+letter
+lettered
+letterer
+letteret
+lettergram
+letterhead
+letterin
+lettering
+letterleaf
+letterless
+letterpress
+letterspace
+letterweight
+letterwood
+Lettic
+Lettice
+Lettish
+lettrin
+lettsomite
+lettuce
+Letty
+letup
+leu
+Leucadendron
+Leucadian
+leucaemia
+leucaemic
+Leucaena
+leucaethiop
+leucaethiopic
+leucaniline
+leucanthous
+leucaugite
+leucaurin
+leucemia
+leucemic
+Leucetta
+leuch
+leuchaemia
+leuchemia
+leuchtenbergite
+Leucichthys
+Leucifer
+Leuciferidae
+leucine
+Leucippus
+leucism
+leucite
+leucitic
+leucitis
+leucitite
+leucitohedron
+leucitoid
+Leuckartia
+Leuckartiidae
+leuco
+leucobasalt
+leucoblast
+leucoblastic
+Leucobryaceae
+Leucobryum
+leucocarpous
+leucochalcite
+leucocholic
+leucocholy
+leucochroic
+leucocidic
+leucocidin
+leucocism
+leucocrate
+leucocratic
+Leucocrinum
+leucocyan
+leucocytal
+leucocyte
+leucocythemia
+leucocythemic
+leucocytic
+leucocytoblast
+leucocytogenesis
+leucocytoid
+leucocytology
+leucocytolysin
+leucocytolysis
+leucocytolytic
+leucocytometer
+leucocytopenia
+leucocytopenic
+leucocytoplania
+leucocytopoiesis
+leucocytosis
+leucocytotherapy
+leucocytotic
+Leucocytozoon
+leucoderma
+leucodermatous
+leucodermic
+leucoencephalitis
+leucogenic
+leucoid
+leucoindigo
+leucoindigotin
+Leucojaceae
+Leucojum
+leucolytic
+leucoma
+leucomaine
+leucomatous
+leucomelanic
+leucomelanous
+leucon
+Leuconostoc
+leucopenia
+leucopenic
+leucophane
+leucophanite
+leucophoenicite
+leucophore
+leucophyllous
+leucophyre
+leucoplakia
+leucoplakial
+leucoplast
+leucoplastid
+leucopoiesis
+leucopoietic
+leucopyrite
+leucoquinizarin
+leucorrhea
+leucorrheal
+leucoryx
+leucosis
+Leucosolenia
+Leucosoleniidae
+leucospermous
+leucosphenite
+leucosphere
+leucospheric
+leucostasis
+Leucosticte
+leucosyenite
+leucotactic
+Leucothea
+Leucothoe
+leucotic
+leucotome
+leucotomy
+leucotoxic
+leucous
+leucoxene
+leucyl
+leud
+leuk
+leukemia
+leukemic
+leukocidic
+leukocidin
+leukosis
+leukotic
+leuma
+Leung
+lev
+Levana
+levance
+Levant
+levant
+Levanter
+levanter
+Levantine
+levator
+levee
+level
+leveler
+levelheaded
+levelheadedly
+levelheadedness
+leveling
+levelish
+levelism
+levelly
+levelman
+levelness
+lever
+leverage
+leverer
+leveret
+leverman
+levers
+leverwood
+Levi
+leviable
+leviathan
+levier
+levigable
+levigate
+levigation
+levigator
+levin
+levining
+levir
+levirate
+leviratical
+leviration
+Levis
+Levisticum
+levitant
+levitate
+levitation
+levitational
+levitative
+levitator
+Levite
+Levitical
+Leviticalism
+Leviticality
+Levitically
+Leviticalness
+Leviticism
+Leviticus
+Levitism
+levity
+levo
+levoduction
+levogyrate
+levogyre
+levogyrous
+levolactic
+levolimonene
+levorotation
+levorotatory
+levotartaric
+levoversion
+levulic
+levulin
+levulinic
+levulose
+levulosuria
+levy
+levyist
+levynite
+Lew
+lew
+Lewanna
+lewd
+lewdly
+lewdness
+Lewie
+Lewis
+lewis
+Lewisia
+Lewisian
+lewisite
+lewisson
+lewth
+Lex
+lexia
+lexical
+lexicalic
+lexicality
+lexicographer
+lexicographian
+lexicographic
+lexicographical
+lexicographically
+lexicographist
+lexicography
+lexicologic
+lexicological
+lexicologist
+lexicology
+lexicon
+lexiconist
+lexiconize
+lexigraphic
+lexigraphical
+lexigraphically
+lexigraphy
+lexiphanic
+lexiphanicism
+ley
+leyland
+leysing
+Lezghian
+lherzite
+lherzolite
+Lhota
+li
+liability
+liable
+liableness
+liaison
+liana
+liang
+liar
+liard
+Lias
+Liassic
+Liatris
+libament
+libaniferous
+libanophorous
+libanotophorous
+libant
+libate
+libation
+libationary
+libationer
+libatory
+libber
+libbet
+libbra
+Libby
+libel
+libelant
+libelee
+libeler
+libelist
+libellary
+libellate
+Libellula
+libellulid
+Libellulidae
+libelluloid
+libelous
+libelously
+Liber
+liber
+liberal
+Liberalia
+liberalism
+liberalist
+liberalistic
+liberality
+liberalization
+liberalize
+liberalizer
+liberally
+liberalness
+liberate
+liberation
+liberationism
+liberationist
+liberative
+liberator
+liberatory
+liberatress
+Liberia
+Liberian
+liberomotor
+libertarian
+libertarianism
+Libertas
+liberticidal
+liberticide
+libertinage
+libertine
+libertinism
+liberty
+libertyless
+libethenite
+libidibi
+libidinal
+libidinally
+libidinosity
+libidinous
+libidinously
+libidinousness
+libido
+Libitina
+libken
+Libocedrus
+Libra
+libra
+libral
+librarian
+librarianess
+librarianship
+librarious
+librarius
+library
+libraryless
+librate
+libration
+libratory
+libretti
+librettist
+libretto
+Librid
+libriform
+libroplast
+Libyan
+Libytheidae
+Libytheinae
+Licania
+licareol
+licca
+licensable
+license
+licensed
+licensee
+licenseless
+licenser
+licensor
+licensure
+licentiate
+licentiateship
+licentiation
+licentious
+licentiously
+licentiousness
+lich
+licham
+lichanos
+lichen
+lichenaceous
+lichened
+Lichenes
+licheniasis
+lichenic
+lichenicolous
+licheniform
+lichenin
+lichenism
+lichenist
+lichenivorous
+lichenization
+lichenize
+lichenlike
+lichenographer
+lichenographic
+lichenographical
+lichenographist
+lichenography
+lichenoid
+lichenologic
+lichenological
+lichenologist
+lichenology
+Lichenopora
+Lichenoporidae
+lichenose
+licheny
+lichi
+Lichnophora
+Lichnophoridae
+Licinian
+licit
+licitation
+licitly
+licitness
+lick
+licker
+lickerish
+lickerishly
+lickerishness
+licking
+lickpenny
+lickspit
+lickspittle
+lickspittling
+licorice
+licorn
+licorne
+lictor
+lictorian
+Licuala
+lid
+Lida
+lidded
+lidder
+Lide
+lidflower
+lidgate
+lidless
+lie
+liebenerite
+Liebfraumilch
+liebigite
+lied
+lief
+liege
+liegedom
+liegeful
+liegefully
+liegeless
+liegely
+liegeman
+lieger
+lien
+lienal
+lienculus
+lienee
+lienic
+lienitis
+lienocele
+lienogastric
+lienointestinal
+lienomalacia
+lienomedullary
+lienomyelogenous
+lienopancreatic
+lienor
+lienorenal
+lienotoxin
+lienteria
+lienteric
+lientery
+lieproof
+lieprooflier
+lieproofliest
+lier
+lierne
+lierre
+liesh
+liespfund
+lieu
+lieue
+lieutenancy
+lieutenant
+lieutenantry
+lieutenantship
+Lievaart
+lieve
+lievrite
+Lif
+life
+lifeblood
+lifeboat
+lifeboatman
+lifeday
+lifedrop
+lifeful
+lifefully
+lifefulness
+lifeguard
+lifehold
+lifeholder
+lifeless
+lifelessly
+lifelessness
+lifelet
+lifelike
+lifelikeness
+lifeline
+lifelong
+lifer
+liferent
+liferenter
+liferentrix
+liferoot
+lifesaver
+lifesaving
+lifesome
+lifesomely
+lifesomeness
+lifespring
+lifetime
+lifeward
+lifework
+lifey
+lifo
+lift
+liftable
+lifter
+lifting
+liftless
+liftman
+ligable
+ligament
+ligamental
+ligamentary
+ligamentous
+ligamentously
+ligamentum
+ligas
+ligate
+ligation
+ligator
+ligature
+ligeance
+ligger
+light
+lightable
+lightboat
+lightbrained
+lighten
+lightener
+lightening
+lighter
+lighterage
+lighterful
+lighterman
+lightface
+lightful
+lightfulness
+lighthead
+lightheaded
+lightheadedly
+lightheadedness
+lighthearted
+lightheartedly
+lightheartedness
+lighthouse
+lighthouseman
+lighting
+lightish
+lightkeeper
+lightless
+lightlessness
+lightly
+lightman
+lightmanship
+lightmouthed
+lightness
+lightning
+lightninglike
+lightningproof
+lightproof
+lightroom
+lightscot
+lightship
+lightsman
+lightsome
+lightsomely
+lightsomeness
+lighttight
+lightwards
+lightweight
+lightwood
+lightwort
+lignaloes
+lignatile
+ligne
+ligneous
+lignescent
+lignicole
+lignicoline
+lignicolous
+ligniferous
+lignification
+ligniform
+lignify
+lignin
+ligninsulphonate
+ligniperdous
+lignite
+lignitic
+lignitiferous
+lignitize
+lignivorous
+lignocellulose
+lignoceric
+lignography
+lignone
+lignose
+lignosity
+lignosulphite
+lignosulphonate
+lignum
+ligroine
+ligula
+ligular
+Ligularia
+ligulate
+ligulated
+ligule
+Liguliflorae
+liguliflorous
+liguliform
+ligulin
+liguloid
+Liguorian
+ligure
+Ligurian
+ligurite
+ligurition
+Ligusticum
+ligustrin
+Ligustrum
+Ligyda
+Ligydidae
+Lihyanite
+liin
+lija
+likability
+likable
+likableness
+like
+likelihead
+likelihood
+likeliness
+likely
+liken
+likeness
+liker
+likesome
+likeways
+likewise
+likin
+liking
+liknon
+Lila
+lilac
+lilaceous
+lilacin
+lilacky
+lilacthroat
+lilactide
+Lilaeopsis
+lile
+Liliaceae
+liliaceous
+Liliales
+Lilian
+lilied
+liliform
+Liliiflorae
+Lilith
+Lilium
+lill
+lillianite
+lillibullero
+Lilliput
+Lilliputian
+Lilliputianize
+lilt
+liltingly
+liltingness
+lily
+lilyfy
+lilyhanded
+lilylike
+lilywood
+lilywort
+lim
+Lima
+Limacea
+limacel
+limaceous
+Limacidae
+limaciform
+Limacina
+limacine
+limacinid
+Limacinidae
+limacoid
+limacon
+limaille
+liman
+limation
+Limawood
+Limax
+limb
+limbal
+limbat
+limbate
+limbation
+limbeck
+limbed
+limber
+limberham
+limberly
+limberness
+limbers
+limbic
+limbie
+limbiferous
+limbless
+limbmeal
+limbo
+limboinfantum
+limbous
+Limbu
+Limburger
+limburgite
+limbus
+limby
+lime
+limeade
+Limean
+limeberry
+limebush
+limehouse
+limekiln
+limeless
+limelight
+limelighter
+limelike
+limeman
+limen
+limequat
+limer
+Limerick
+limes
+limestone
+limetta
+limettin
+limewash
+limewater
+limewort
+limey
+Limicolae
+limicoline
+limicolous
+Limidae
+liminal
+liminary
+liminess
+liming
+limit
+limitable
+limitableness
+limital
+limitarian
+limitary
+limitate
+limitation
+limitative
+limitatively
+limited
+limitedly
+limitedness
+limiter
+limiting
+limitive
+limitless
+limitlessly
+limitlessness
+limitrophe
+limivorous
+limma
+limmer
+limmock
+limmu
+limn
+limnanth
+Limnanthaceae
+limnanthaceous
+Limnanthemum
+Limnanthes
+limner
+limnery
+limnetic
+Limnetis
+limniad
+limnimeter
+limnimetric
+limnite
+limnobiologic
+limnobiological
+limnobiologically
+limnobiology
+limnobios
+Limnobium
+Limnocnida
+limnograph
+limnologic
+limnological
+limnologically
+limnologist
+limnology
+limnometer
+limnophile
+limnophilid
+Limnophilidae
+limnophilous
+limnoplankton
+Limnorchis
+Limnoria
+Limnoriidae
+limnorioid
+Limodorum
+limoid
+limonene
+limoniad
+limonin
+limonite
+limonitic
+limonitization
+limonium
+Limosa
+limose
+Limosella
+Limosi
+limous
+limousine
+limp
+limper
+limpet
+limphault
+limpid
+limpidity
+limpidly
+limpidness
+limpily
+limpin
+limpiness
+limping
+limpingly
+limpingness
+limpish
+limpkin
+limply
+limpness
+limpsy
+limpwort
+limpy
+limsy
+limu
+limulid
+Limulidae
+limuloid
+Limuloidea
+Limulus
+limurite
+limy
+Lin
+lin
+Lina
+lina
+linable
+Linaceae
+linaceous
+linaga
+linage
+linaloa
+linalol
+linalool
+linamarin
+Linanthus
+Linaria
+linarite
+linch
+linchbolt
+linchet
+linchpin
+linchpinned
+lincloth
+Lincoln
+Lincolnian
+Lincolniana
+Lincolnlike
+linctus
+Linda
+lindackerite
+lindane
+linden
+Linder
+linder
+Lindera
+Lindleyan
+lindo
+lindoite
+Lindsay
+Lindsey
+line
+linea
+lineage
+lineaged
+lineal
+lineality
+lineally
+lineament
+lineamental
+lineamentation
+lineameter
+linear
+linearifolius
+linearity
+linearization
+linearize
+linearly
+lineate
+lineated
+lineation
+lineature
+linecut
+lined
+lineiform
+lineless
+linelet
+lineman
+linen
+Linene
+linenette
+linenize
+linenizer
+linenman
+lineocircular
+lineograph
+lineolate
+lineolated
+liner
+linesman
+Linet
+linewalker
+linework
+ling
+linga
+Lingayat
+lingberry
+lingbird
+linge
+lingel
+lingenberry
+linger
+lingerer
+lingerie
+lingo
+lingonberry
+Lingoum
+lingtow
+lingtowman
+lingua
+linguacious
+linguaciousness
+linguadental
+linguaeform
+lingual
+linguale
+linguality
+lingualize
+lingually
+linguanasal
+Linguata
+Linguatula
+Linguatulida
+Linguatulina
+linguatuline
+linguatuloid
+linguet
+linguidental
+linguiform
+linguipotence
+linguist
+linguister
+linguistic
+linguistical
+linguistically
+linguistician
+linguistics
+linguistry
+lingula
+lingulate
+lingulated
+Lingulella
+lingulid
+Lingulidae
+linguliferous
+linguliform
+linguloid
+linguodental
+linguodistal
+linguogingival
+linguopalatal
+linguopapillitis
+linguoversion
+lingwort
+lingy
+linha
+linhay
+linie
+liniment
+linin
+lininess
+lining
+linitis
+liniya
+linja
+linje
+link
+linkable
+linkage
+linkboy
+linked
+linkedness
+linker
+linking
+linkman
+links
+linksmith
+linkwork
+linky
+Linley
+linn
+Linnaea
+Linnaean
+Linnaeanism
+linnaeite
+Linne
+linnet
+lino
+linolate
+linoleic
+linolein
+linolenate
+linolenic
+linolenin
+linoleum
+linolic
+linolin
+linometer
+linon
+Linopteris
+Linos
+Linotype
+linotype
+linotyper
+linotypist
+linous
+linoxin
+linoxyn
+linpin
+Linsang
+linseed
+linsey
+linstock
+lint
+lintel
+linteled
+linteling
+linten
+linter
+lintern
+lintie
+lintless
+lintonite
+lintseed
+lintwhite
+linty
+Linum
+Linus
+linwood
+liny
+Linyphia
+Linyphiidae
+liodermia
+liomyofibroma
+liomyoma
+lion
+lioncel
+Lionel
+lionel
+lionesque
+lioness
+lionet
+lionheart
+lionhearted
+lionheartedness
+lionhood
+lionism
+lionizable
+lionization
+lionize
+lionizer
+lionlike
+lionly
+lionproof
+lionship
+Liothrix
+Liotrichi
+Liotrichidae
+liotrichine
+lip
+lipa
+lipacidemia
+lipaciduria
+Lipan
+Liparian
+liparian
+liparid
+Liparidae
+Liparididae
+Liparis
+liparite
+liparocele
+liparoid
+liparomphalus
+liparous
+lipase
+lipectomy
+lipemia
+Lipeurus
+lipide
+lipin
+lipless
+liplet
+liplike
+lipoblast
+lipoblastoma
+Lipobranchia
+lipocaic
+lipocardiac
+lipocele
+lipoceratous
+lipocere
+lipochondroma
+lipochrome
+lipochromogen
+lipoclasis
+lipoclastic
+lipocyte
+lipodystrophia
+lipodystrophy
+lipoferous
+lipofibroma
+lipogenesis
+lipogenetic
+lipogenic
+lipogenous
+lipogram
+lipogrammatic
+lipogrammatism
+lipogrammatist
+lipography
+lipohemia
+lipoid
+lipoidal
+lipoidemia
+lipoidic
+lipolysis
+lipolytic
+lipoma
+lipomata
+lipomatosis
+lipomatous
+lipometabolic
+lipometabolism
+lipomorph
+lipomyoma
+lipomyxoma
+lipopexia
+lipophagic
+lipophore
+lipopod
+Lipopoda
+lipoprotein
+liposarcoma
+liposis
+liposome
+lipostomy
+lipothymial
+lipothymic
+lipothymy
+lipotrophic
+lipotrophy
+lipotropic
+lipotropy
+lipotype
+Lipotyphla
+lipovaccine
+lipoxenous
+lipoxeny
+lipped
+lippen
+lipper
+lipperings
+Lippia
+lippiness
+lipping
+lippitude
+lippitudo
+lippy
+lipsanographer
+lipsanotheca
+lipstick
+lipuria
+lipwork
+liquable
+liquamen
+liquate
+liquation
+liquefacient
+liquefaction
+liquefactive
+liquefiable
+liquefier
+liquefy
+liquesce
+liquescence
+liquescency
+liquescent
+liqueur
+liquid
+liquidable
+Liquidambar
+liquidamber
+liquidate
+liquidation
+liquidator
+liquidatorship
+liquidity
+liquidize
+liquidizer
+liquidless
+liquidly
+liquidness
+liquidogenic
+liquidogenous
+liquidy
+liquiform
+liquor
+liquorer
+liquorish
+liquorishly
+liquorishness
+liquorist
+liquorless
+lira
+lirate
+liration
+lire
+lirella
+lirellate
+lirelliform
+lirelline
+lirellous
+Liriodendron
+liripipe
+liroconite
+lis
+Lisa
+Lisbon
+Lise
+lisere
+Lisette
+lish
+lisk
+Lisle
+lisle
+lisp
+lisper
+lispingly
+lispund
+liss
+Lissamphibia
+lissamphibian
+Lissencephala
+lissencephalic
+lissencephalous
+Lissoflagellata
+lissoflagellate
+lissom
+lissome
+lissomely
+lissomeness
+lissotrichan
+Lissotriches
+lissotrichous
+lissotrichy
+List
+list
+listable
+listed
+listedness
+listel
+listen
+listener
+listening
+lister
+Listera
+listerellosis
+Listeria
+Listerian
+Listerine
+Listerism
+Listerize
+listing
+listless
+listlessly
+listlessness
+listred
+listwork
+Lisuarte
+lit
+litaneutical
+litany
+litanywise
+litas
+litation
+litch
+litchi
+lite
+liter
+literacy
+literaily
+literal
+literalism
+literalist
+literalistic
+literality
+literalization
+literalize
+literalizer
+literally
+literalminded
+literalmindedness
+literalness
+literarian
+literariness
+literary
+literaryism
+literate
+literati
+literation
+literatist
+literato
+literator
+literature
+literatus
+literose
+literosity
+lith
+lithagogue
+lithangiuria
+lithanthrax
+litharge
+lithe
+lithectasy
+lithectomy
+lithely
+lithemia
+lithemic
+litheness
+lithesome
+lithesomeness
+lithi
+lithia
+lithiasis
+lithiastic
+lithiate
+lithic
+lithifaction
+lithification
+lithify
+lithite
+lithium
+litho
+lithobiid
+Lithobiidae
+lithobioid
+Lithobius
+Lithocarpus
+lithocenosis
+lithochemistry
+lithochromatic
+lithochromatics
+lithochromatographic
+lithochromatography
+lithochromography
+lithochromy
+lithoclase
+lithoclast
+lithoclastic
+lithoclasty
+lithoculture
+lithocyst
+lithocystotomy
+Lithodes
+lithodesma
+lithodialysis
+lithodid
+Lithodidae
+lithodomous
+Lithodomus
+lithofracteur
+lithofractor
+lithogenesis
+lithogenetic
+lithogenous
+lithogeny
+lithoglyph
+lithoglypher
+lithoglyphic
+lithoglyptic
+lithoglyptics
+lithograph
+lithographer
+lithographic
+lithographical
+lithographically
+lithographize
+lithography
+lithogravure
+lithoid
+lithoidite
+litholabe
+litholapaxy
+litholatrous
+litholatry
+lithologic
+lithological
+lithologically
+lithologist
+lithology
+litholysis
+litholyte
+litholytic
+lithomancy
+lithomarge
+lithometer
+lithonephria
+lithonephritis
+lithonephrotomy
+lithontriptic
+lithontriptist
+lithontriptor
+lithopedion
+lithopedium
+lithophagous
+lithophane
+lithophanic
+lithophany
+lithophilous
+lithophone
+lithophotography
+lithophotogravure
+lithophthisis
+lithophyl
+lithophyllous
+lithophysa
+lithophysal
+lithophyte
+lithophytic
+lithophytous
+lithopone
+lithoprint
+lithoscope
+lithosian
+lithosiid
+Lithosiidae
+Lithosiinae
+lithosis
+lithosol
+lithosperm
+lithospermon
+lithospermous
+Lithospermum
+lithosphere
+lithotint
+lithotome
+lithotomic
+lithotomical
+lithotomist
+lithotomize
+lithotomous
+lithotomy
+lithotony
+lithotresis
+lithotripsy
+lithotriptor
+lithotrite
+lithotritic
+lithotritist
+lithotrity
+lithotype
+lithotypic
+lithotypy
+lithous
+lithoxyl
+lithsman
+Lithuanian
+Lithuanic
+lithuresis
+lithuria
+lithy
+liticontestation
+litigable
+litigant
+litigate
+litigation
+litigationist
+litigator
+litigatory
+litigiosity
+litigious
+litigiously
+litigiousness
+Litiopa
+litiscontest
+litiscontestation
+litiscontestational
+litmus
+Litopterna
+Litorina
+Litorinidae
+litorinoid
+litotes
+litra
+Litsea
+litster
+litten
+litter
+litterateur
+litterer
+littermate
+littery
+little
+littleleaf
+littleneck
+littleness
+littlewale
+littling
+littlish
+littoral
+Littorella
+littress
+lituiform
+lituite
+Lituites
+Lituitidae
+Lituola
+lituoline
+lituoloid
+liturate
+liturgical
+liturgically
+liturgician
+liturgics
+liturgiological
+liturgiologist
+liturgiology
+liturgism
+liturgist
+liturgistic
+liturgistical
+liturgize
+liturgy
+litus
+lituus
+Litvak
+Lityerses
+litz
+Liukiu
+Liv
+livability
+livable
+livableness
+live
+liveborn
+lived
+livedo
+livelihood
+livelily
+liveliness
+livelong
+lively
+liven
+liveness
+liver
+liverance
+liverberry
+livered
+liverhearted
+liverheartedness
+liveried
+liverish
+liverishness
+liverleaf
+liverless
+Liverpudlian
+liverwort
+liverwurst
+livery
+liverydom
+liveryless
+liveryman
+livestock
+Livian
+livid
+lividity
+lividly
+lividness
+livier
+living
+livingless
+livingly
+livingness
+livingstoneite
+Livish
+Livistona
+Livonian
+livor
+livre
+liwan
+lixive
+lixivial
+lixiviate
+lixiviation
+lixiviator
+lixivious
+lixivium
+Liyuan
+Liz
+Liza
+lizard
+lizardtail
+Lizzie
+llama
+Llanberisslate
+Llandeilo
+Llandovery
+llano
+llautu
+Lleu
+Llew
+Lloyd
+Lludd
+llyn
+Lo
+lo
+Loa
+loa
+loach
+load
+loadage
+loaded
+loaden
+loader
+loading
+loadless
+loadpenny
+loadsome
+loadstone
+loaf
+loafer
+loaferdom
+loaferish
+loafing
+loafingly
+loaflet
+loaghtan
+loam
+loamily
+loaminess
+loaming
+loamless
+Loammi
+loamy
+loan
+loanable
+loaner
+loanin
+loanmonger
+loanword
+Loasa
+Loasaceae
+loasaceous
+loath
+loathe
+loather
+loathful
+loathfully
+loathfulness
+loathing
+loathingly
+loathliness
+loathly
+loathness
+loathsome
+loathsomely
+loathsomeness
+Loatuko
+loave
+lob
+Lobachevskian
+lobal
+Lobale
+lobar
+Lobaria
+Lobata
+Lobatae
+lobate
+lobated
+lobately
+lobation
+lobber
+lobbish
+lobby
+lobbyer
+lobbyism
+lobbyist
+lobbyman
+lobcock
+lobe
+lobectomy
+lobed
+lobefoot
+lobefooted
+lobeless
+lobelet
+Lobelia
+Lobeliaceae
+lobeliaceous
+lobelin
+lobeline
+lobellated
+lobfig
+lobiform
+lobigerous
+lobing
+lobiped
+loblolly
+lobo
+lobola
+lobopodium
+Lobosa
+lobose
+lobotomy
+lobscourse
+lobscouse
+lobscouser
+lobster
+lobstering
+lobsterish
+lobsterlike
+lobsterproof
+lobtail
+lobular
+Lobularia
+lobularly
+lobulate
+lobulated
+lobulation
+lobule
+lobulette
+lobulose
+lobulous
+lobworm
+loca
+locable
+local
+locale
+localism
+localist
+localistic
+locality
+localizable
+localization
+localize
+localizer
+locally
+localness
+locanda
+Locarnist
+Locarnite
+Locarnize
+Locarno
+locate
+location
+locational
+locative
+locator
+locellate
+locellus
+loch
+lochage
+lochan
+lochetic
+lochia
+lochial
+lochiocolpos
+lochiocyte
+lochiometra
+lochiometritis
+lochiopyra
+lochiorrhagia
+lochiorrhea
+lochioschesis
+Lochlin
+lochometritis
+lochoperitonitis
+lochopyra
+lochus
+lochy
+loci
+lociation
+lock
+lockable
+lockage
+Lockatong
+lockbox
+locked
+locker
+lockerman
+locket
+lockful
+lockhole
+Lockian
+Lockianism
+locking
+lockjaw
+lockless
+locklet
+lockmaker
+lockmaking
+lockman
+lockout
+lockpin
+Lockport
+lockram
+locksman
+locksmith
+locksmithery
+locksmithing
+lockspit
+lockup
+lockwork
+locky
+loco
+locodescriptive
+locofoco
+Locofocoism
+locoism
+locomobile
+locomobility
+locomote
+locomotility
+locomotion
+locomotive
+locomotively
+locomotiveman
+locomotiveness
+locomotivity
+locomotor
+locomotory
+locomutation
+locoweed
+Locrian
+Locrine
+loculament
+loculamentose
+loculamentous
+locular
+loculate
+loculated
+loculation
+locule
+loculicidal
+loculicidally
+loculose
+loculus
+locum
+locus
+locust
+locusta
+locustal
+locustberry
+locustelle
+locustid
+Locustidae
+locusting
+locustlike
+locution
+locutor
+locutorship
+locutory
+lod
+Loddigesia
+lode
+lodemanage
+lodesman
+lodestar
+lodestone
+lodestuff
+lodge
+lodgeable
+lodged
+lodgeful
+lodgeman
+lodgepole
+lodger
+lodgerdom
+lodging
+lodginghouse
+lodgings
+lodgment
+Lodha
+lodicule
+Lodoicea
+Lodowic
+Lodowick
+Lodur
+Loegria
+loess
+loessal
+loessial
+loessic
+loessland
+loessoid
+lof
+lofstelle
+loft
+lofter
+loftily
+loftiness
+lofting
+loftless
+loftman
+loftsman
+lofty
+log
+loganberry
+Logania
+Loganiaceae
+loganiaceous
+loganin
+logaoedic
+logarithm
+logarithmal
+logarithmetic
+logarithmetical
+logarithmetically
+logarithmic
+logarithmical
+logarithmically
+logarithmomancy
+logbook
+logcock
+loge
+logeion
+logeum
+loggat
+logged
+logger
+loggerhead
+loggerheaded
+loggia
+loggin
+logging
+loggish
+loghead
+logheaded
+logia
+logic
+logical
+logicalist
+logicality
+logicalization
+logicalize
+logically
+logicalness
+logicaster
+logician
+logicism
+logicist
+logicity
+logicize
+logicless
+logie
+login
+logion
+logistic
+logistical
+logistician
+logistics
+logium
+loglet
+loglike
+logman
+logocracy
+logodaedaly
+logogogue
+logogram
+logogrammatic
+logograph
+logographer
+logographic
+logographical
+logographically
+logography
+logogriph
+logogriphic
+logoi
+logolatry
+logology
+logomach
+logomacher
+logomachic
+logomachical
+logomachist
+logomachize
+logomachy
+logomancy
+logomania
+logomaniac
+logometer
+logometric
+logometrical
+logometrically
+logopedia
+logopedics
+logorrhea
+logos
+logothete
+logotype
+logotypy
+Logres
+Logria
+Logris
+logroll
+logroller
+logrolling
+logway
+logwise
+logwood
+logwork
+logy
+lohan
+Lohana
+Lohar
+lohoch
+loimic
+loimography
+loimology
+loin
+loincloth
+loined
+loir
+Lois
+Loiseleuria
+loiter
+loiterer
+loiteringly
+loiteringness
+loka
+lokao
+lokaose
+lokapala
+loke
+loket
+lokiec
+Lokindra
+Lokman
+Lola
+Loliginidae
+Loligo
+Lolium
+loll
+Lollard
+Lollardian
+Lollardism
+Lollardist
+Lollardize
+Lollardlike
+Lollardry
+Lollardy
+loller
+lollingite
+lollingly
+lollipop
+lollop
+lollopy
+lolly
+Lolo
+loma
+lomastome
+lomatine
+lomatinous
+Lomatium
+Lombard
+lombard
+Lombardeer
+Lombardesque
+Lombardian
+Lombardic
+lomboy
+Lombrosian
+loment
+lomentaceous
+Lomentaria
+lomentariaceous
+lomentum
+lomita
+lommock
+Lonchocarpus
+Lonchopteridae
+Londinensian
+Londoner
+Londonese
+Londonesque
+Londonian
+Londonish
+Londonism
+Londonization
+Londonize
+Londony
+Londres
+lone
+lonelihood
+lonelily
+loneliness
+lonely
+loneness
+lonesome
+lonesomely
+lonesomeness
+long
+longa
+longan
+longanimity
+longanimous
+Longaville
+longbeak
+longbeard
+longboat
+longbow
+longcloth
+longe
+longear
+longer
+longeval
+longevity
+longevous
+longfelt
+longfin
+longful
+longhair
+longhand
+longhead
+longheaded
+longheadedly
+longheadedness
+longhorn
+longicaudal
+longicaudate
+longicone
+longicorn
+Longicornia
+longilateral
+longilingual
+longiloquence
+longimanous
+longimetric
+longimetry
+longing
+longingly
+longingness
+Longinian
+longinquity
+longipennate
+longipennine
+longirostral
+longirostrate
+longirostrine
+Longirostrines
+longisection
+longish
+longitude
+longitudinal
+longitudinally
+longjaw
+longleaf
+longlegs
+longly
+longmouthed
+longness
+Longobard
+Longobardi
+Longobardian
+Longobardic
+longs
+longshanks
+longshore
+longshoreman
+longsome
+longsomely
+longsomeness
+longspun
+longspur
+longtail
+longue
+longulite
+longway
+longways
+longwise
+longwool
+longwork
+longwort
+Lonhyn
+Lonicera
+Lonk
+lonquhard
+lontar
+loo
+looby
+lood
+loof
+loofah
+loofie
+loofness
+look
+looker
+looking
+lookout
+lookum
+loom
+loomer
+loomery
+looming
+loon
+loonery
+looney
+loony
+loop
+looper
+loopful
+loophole
+looping
+loopist
+looplet
+looplike
+loopy
+loose
+loosely
+loosemouthed
+loosen
+loosener
+looseness
+looser
+loosestrife
+loosing
+loosish
+loot
+lootable
+looten
+looter
+lootie
+lootiewallah
+lootsman
+lop
+lope
+loper
+Lopezia
+lophiid
+Lophiidae
+lophine
+Lophiodon
+lophiodont
+Lophiodontidae
+lophiodontoid
+Lophiola
+Lophiomyidae
+Lophiomyinae
+Lophiomys
+lophiostomate
+lophiostomous
+lophobranch
+lophobranchiate
+Lophobranchii
+lophocalthrops
+lophocercal
+Lophocome
+Lophocomi
+Lophodermium
+lophodont
+Lophophora
+lophophoral
+lophophore
+Lophophorinae
+lophophorine
+Lophophorus
+lophophytosis
+Lophopoda
+Lophornis
+Lophortyx
+lophosteon
+lophotriaene
+lophotrichic
+lophotrichous
+Lophura
+lopolith
+loppard
+lopper
+loppet
+lopping
+loppy
+lopseed
+lopsided
+lopsidedly
+lopsidedness
+lopstick
+loquacious
+loquaciously
+loquaciousness
+loquacity
+loquat
+loquence
+loquent
+loquently
+Lora
+lora
+loral
+loran
+lorandite
+loranskite
+Loranthaceae
+loranthaceous
+Loranthus
+lorarius
+lorate
+lorcha
+Lord
+lord
+lording
+lordkin
+lordless
+lordlet
+lordlike
+lordlily
+lordliness
+lordling
+lordly
+lordolatry
+lordosis
+lordotic
+lordship
+lordwood
+lordy
+lore
+loreal
+lored
+loreless
+Loren
+Lorenzan
+lorenzenite
+Lorenzo
+Lorettine
+lorettoite
+lorgnette
+Lori
+lori
+loric
+lorica
+loricarian
+Loricariidae
+loricarioid
+Loricata
+loricate
+Loricati
+lorication
+loricoid
+Lorien
+lorikeet
+lorilet
+lorimer
+loriot
+loris
+Lorius
+lormery
+lorn
+lornness
+loro
+Lorraine
+Lorrainer
+Lorrainese
+lorriker
+lorry
+lors
+lorum
+lory
+losable
+losableness
+lose
+losel
+loselism
+losenger
+loser
+losh
+losing
+loss
+lossenite
+lossless
+lossproof
+lost
+lostling
+lostness
+Lot
+lot
+Lota
+lota
+lotase
+lote
+lotebush
+Lotharingian
+lotic
+lotiform
+lotion
+lotment
+Lotophagi
+lotophagous
+lotophagously
+lotrite
+lots
+Lotta
+Lotte
+lotter
+lottery
+Lottie
+lotto
+Lotuko
+lotus
+lotusin
+lotuslike
+Lou
+louch
+louchettes
+loud
+louden
+loudering
+loudish
+loudly
+loudmouthed
+loudness
+louey
+lough
+lougheen
+Louie
+Louiqa
+Louis
+Louisa
+Louise
+Louisiana
+Louisianian
+louisine
+louk
+Loukas
+loukoum
+loulu
+lounder
+lounderer
+lounge
+lounger
+lounging
+loungingly
+loungy
+Loup
+loup
+loupe
+lour
+lourdy
+louse
+louseberry
+lousewort
+lousily
+lousiness
+louster
+lousy
+lout
+louter
+louther
+loutish
+loutishly
+loutishness
+loutrophoros
+louty
+louvar
+louver
+louvered
+louvering
+louverwork
+Louvre
+lovability
+lovable
+lovableness
+lovably
+lovage
+love
+lovebird
+loveflower
+loveful
+lovelass
+loveless
+lovelessly
+lovelessness
+lovelihead
+lovelily
+loveliness
+loveling
+lovelock
+lovelorn
+lovelornness
+lovely
+loveman
+lovemate
+lovemonger
+loveproof
+lover
+loverdom
+lovered
+loverhood
+lovering
+loverless
+loverliness
+loverly
+lovership
+loverwise
+lovesick
+lovesickness
+lovesome
+lovesomely
+lovesomeness
+loveworth
+loveworthy
+loving
+lovingly
+lovingness
+low
+lowa
+lowan
+lowbell
+lowborn
+lowboy
+lowbred
+lowdah
+lowder
+loweite
+Lowell
+lower
+lowerable
+lowerclassman
+lowerer
+lowering
+loweringly
+loweringness
+lowermost
+lowery
+lowigite
+lowish
+lowishly
+lowishness
+lowland
+lowlander
+lowlily
+lowliness
+lowly
+lowmen
+lowmost
+lown
+lowness
+lownly
+lowth
+Lowville
+lowwood
+lowy
+lox
+loxia
+loxic
+Loxiinae
+loxoclase
+loxocosm
+loxodograph
+Loxodon
+loxodont
+Loxodonta
+loxodontous
+loxodrome
+loxodromic
+loxodromical
+loxodromically
+loxodromics
+loxodromism
+Loxolophodon
+loxolophodont
+Loxomma
+loxophthalmus
+Loxosoma
+Loxosomidae
+loxotic
+loxotomy
+loy
+loyal
+loyalism
+loyalist
+loyalize
+loyally
+loyalness
+loyalty
+Loyd
+Loyolism
+Loyolite
+lozenge
+lozenged
+lozenger
+lozengeways
+lozengewise
+lozengy
+Lu
+Luba
+lubber
+lubbercock
+Lubberland
+lubberlike
+lubberliness
+lubberly
+lube
+lubra
+lubric
+lubricant
+lubricate
+lubrication
+lubricational
+lubricative
+lubricator
+lubricatory
+lubricious
+lubricity
+lubricous
+lubrifaction
+lubrification
+lubrify
+lubritorian
+lubritorium
+Luc
+Lucan
+Lucania
+lucanid
+Lucanidae
+Lucanus
+lucarne
+Lucayan
+lucban
+Lucchese
+luce
+lucence
+lucency
+lucent
+Lucentio
+lucently
+Luceres
+lucern
+lucernal
+Lucernaria
+lucernarian
+Lucernariidae
+lucerne
+lucet
+Luchuan
+Lucia
+Lucian
+Luciana
+lucible
+lucid
+lucida
+lucidity
+lucidly
+lucidness
+lucifee
+Lucifer
+luciferase
+Luciferian
+Luciferidae
+luciferin
+luciferoid
+luciferous
+luciferously
+luciferousness
+lucific
+luciform
+lucifugal
+lucifugous
+lucigen
+Lucile
+Lucilia
+lucimeter
+Lucina
+Lucinacea
+Lucinda
+Lucinidae
+lucinoid
+Lucite
+Lucius
+lucivee
+luck
+lucken
+luckful
+luckie
+luckily
+luckiness
+luckless
+lucklessly
+lucklessness
+Lucknow
+lucky
+lucration
+lucrative
+lucratively
+lucrativeness
+lucre
+Lucrece
+Lucretia
+Lucretian
+Lucretius
+lucriferous
+lucriferousness
+lucrific
+lucrify
+Lucrine
+luctation
+luctiferous
+luctiferousness
+lucubrate
+lucubration
+lucubrator
+lucubratory
+lucule
+luculent
+luculently
+Lucullan
+lucullite
+Lucuma
+lucumia
+Lucumo
+lucumony
+Lucy
+lucy
+ludden
+Luddism
+Luddite
+Ludditism
+ludefisk
+Ludgate
+Ludgathian
+Ludgatian
+Ludian
+ludibrious
+ludibry
+ludicropathetic
+ludicroserious
+ludicrosity
+ludicrosplenetic
+ludicrous
+ludicrously
+ludicrousness
+ludification
+ludlamite
+Ludlovian
+Ludlow
+ludo
+Ludolphian
+Ludwig
+ludwigite
+lue
+Luella
+lues
+luetic
+luetically
+lufberry
+lufbery
+luff
+Luffa
+Lug
+lug
+Luganda
+luge
+luger
+luggage
+luggageless
+luggar
+lugged
+lugger
+luggie
+Luggnagg
+lugmark
+Lugnas
+lugsail
+lugsome
+lugubriosity
+lugubrious
+lugubriously
+lugubriousness
+lugworm
+luhinga
+Lui
+Luian
+Luigi
+luigino
+Luis
+Luiseno
+Luite
+lujaurite
+Lukas
+Luke
+luke
+lukely
+lukeness
+lukewarm
+lukewarmish
+lukewarmly
+lukewarmness
+lukewarmth
+Lula
+lulab
+lull
+lullaby
+luller
+Lullian
+lulliloo
+lullingly
+Lulu
+lulu
+Lum
+lum
+lumachel
+lumbaginous
+lumbago
+lumbang
+lumbar
+lumbarization
+lumbayao
+lumber
+lumberdar
+lumberdom
+lumberer
+lumbering
+lumberingly
+lumberingness
+lumberjack
+lumberless
+lumberly
+lumberman
+lumbersome
+lumberyard
+lumbocolostomy
+lumbocolotomy
+lumbocostal
+lumbodorsal
+lumbodynia
+lumbosacral
+lumbovertebral
+lumbrical
+lumbricalis
+Lumbricidae
+lumbriciform
+lumbricine
+lumbricoid
+lumbricosis
+Lumbricus
+lumbrous
+lumen
+luminaire
+Luminal
+luminal
+luminance
+luminant
+luminarious
+luminarism
+luminarist
+luminary
+luminate
+lumination
+luminative
+luminator
+lumine
+luminesce
+luminescence
+luminescent
+luminiferous
+luminificent
+luminism
+luminist
+luminologist
+luminometer
+luminosity
+luminous
+luminously
+luminousness
+lummox
+lummy
+lump
+lumper
+lumpet
+lumpfish
+lumpily
+lumpiness
+lumping
+lumpingly
+lumpish
+lumpishly
+lumpishness
+lumpkin
+lumpman
+lumpsucker
+lumpy
+luna
+lunacy
+lunambulism
+lunar
+lunare
+Lunaria
+lunarian
+lunarist
+lunarium
+lunary
+lunate
+lunatellus
+lunately
+lunatic
+lunatically
+lunation
+lunatize
+lunatum
+lunch
+luncheon
+luncheoner
+luncheonette
+luncheonless
+luncher
+lunchroom
+Lunda
+Lundinarium
+lundress
+lundyfoot
+lune
+Lunel
+lunes
+lunette
+lung
+lunge
+lunged
+lungeous
+lunger
+lungfish
+lungflower
+lungful
+lungi
+lungie
+lungis
+lungless
+lungmotor
+lungsick
+lungworm
+lungwort
+lungy
+lunicurrent
+luniform
+lunisolar
+lunistice
+lunistitial
+lunitidal
+Lunka
+lunkhead
+lunn
+lunoid
+lunt
+lunula
+lunular
+Lunularia
+lunulate
+lunulated
+lunule
+lunulet
+lunulite
+Lunulites
+Luo
+lupanarian
+lupanine
+lupe
+lupeol
+lupeose
+Lupercal
+Lupercalia
+Lupercalian
+Luperci
+lupetidine
+lupicide
+Lupid
+lupiform
+lupinaster
+lupine
+lupinin
+lupinine
+lupinosis
+lupinous
+Lupinus
+lupis
+lupoid
+lupous
+lupulic
+lupulin
+lupuline
+lupulinic
+lupulinous
+lupulinum
+lupulus
+lupus
+lupuserythematosus
+Lur
+lura
+lural
+lurch
+lurcher
+lurchingfully
+lurchingly
+lurchline
+lurdan
+lurdanism
+lure
+lureful
+lurement
+lurer
+luresome
+lurg
+lurgworm
+Luri
+lurid
+luridity
+luridly
+luridness
+luringly
+lurk
+lurker
+lurkingly
+lurkingness
+lurky
+lurrier
+lurry
+Lusatian
+Luscinia
+luscious
+lusciously
+lusciousness
+lush
+Lushai
+lushburg
+Lushei
+lusher
+lushly
+lushness
+lushy
+Lusiad
+Lusian
+Lusitania
+Lusitanian
+lusk
+lusky
+lusory
+lust
+luster
+lusterer
+lusterless
+lusterware
+lustful
+lustfully
+lustfulness
+lustihead
+lustily
+lustiness
+lustless
+lustra
+lustral
+lustrant
+lustrate
+lustration
+lustrative
+lustratory
+lustreless
+lustrical
+lustrification
+lustrify
+lustrine
+lustring
+lustrous
+lustrously
+lustrousness
+lustrum
+lusty
+lut
+lutaceous
+lutanist
+lutany
+Lutao
+lutation
+Lutayo
+lute
+luteal
+lutecia
+lutecium
+lutein
+luteinization
+luteinize
+lutelet
+lutemaker
+lutemaking
+luteo
+luteocobaltic
+luteofulvous
+luteofuscescent
+luteofuscous
+luteolin
+luteolous
+luteoma
+luteorufescent
+luteous
+luteovirescent
+luter
+lutescent
+lutestring
+Lutetia
+Lutetian
+lutetium
+luteway
+lutfisk
+Luther
+Lutheran
+Lutheranic
+Lutheranism
+Lutheranize
+Lutheranizer
+Lutherism
+Lutherist
+luthern
+luthier
+lutianid
+Lutianidae
+lutianoid
+Lutianus
+lutidine
+lutidinic
+luting
+lutist
+Lutjanidae
+Lutjanus
+lutose
+Lutra
+Lutraria
+Lutreola
+lutrin
+Lutrinae
+lutrine
+lutulence
+lutulent
+Luvaridae
+Luvian
+Luvish
+Luwian
+lux
+luxate
+luxation
+luxe
+Luxemburger
+Luxemburgian
+luxulianite
+luxuriance
+luxuriancy
+luxuriant
+luxuriantly
+luxuriantness
+luxuriate
+luxuriation
+luxurious
+luxuriously
+luxuriousness
+luxurist
+luxury
+luxus
+Luzula
+Lwo
+ly
+lyam
+lyard
+Lyas
+Lycaena
+lycaenid
+Lycaenidae
+lycanthrope
+lycanthropia
+lycanthropic
+lycanthropist
+lycanthropize
+lycanthropous
+lycanthropy
+lyceal
+lyceum
+Lychnic
+Lychnis
+lychnomancy
+lychnoscope
+lychnoscopic
+Lycian
+lycid
+Lycidae
+Lycium
+Lycodes
+Lycodidae
+lycodoid
+lycopene
+Lycoperdaceae
+lycoperdaceous
+Lycoperdales
+lycoperdoid
+Lycoperdon
+lycoperdon
+Lycopersicon
+lycopin
+lycopod
+lycopode
+Lycopodiaceae
+lycopodiaceous
+Lycopodiales
+Lycopodium
+Lycopsida
+Lycopsis
+Lycopus
+lycorine
+Lycosa
+lycosid
+Lycosidae
+lyctid
+Lyctidae
+Lyctus
+Lycus
+lyddite
+Lydia
+Lydian
+lydite
+lye
+Lyencephala
+lyencephalous
+lyery
+lygaeid
+Lygaeidae
+Lygeum
+Lygodium
+Lygosoma
+lying
+lyingly
+Lymantria
+lymantriid
+Lymantriidae
+lymhpangiophlebitis
+Lymnaea
+lymnaean
+lymnaeid
+Lymnaeidae
+lymph
+lymphad
+lymphadenectasia
+lymphadenectasis
+lymphadenia
+lymphadenitis
+lymphadenoid
+lymphadenoma
+lymphadenopathy
+lymphadenosis
+lymphaemia
+lymphagogue
+lymphangeitis
+lymphangial
+lymphangiectasis
+lymphangiectatic
+lymphangiectodes
+lymphangiitis
+lymphangioendothelioma
+lymphangiofibroma
+lymphangiology
+lymphangioma
+lymphangiomatous
+lymphangioplasty
+lymphangiosarcoma
+lymphangiotomy
+lymphangitic
+lymphangitis
+lymphatic
+lymphatical
+lymphation
+lymphatism
+lymphatitis
+lymphatolysin
+lymphatolysis
+lymphatolytic
+lymphectasia
+lymphedema
+lymphemia
+lymphenteritis
+lymphoblast
+lymphoblastic
+lymphoblastoma
+lymphoblastosis
+lymphocele
+lymphocyst
+lymphocystosis
+lymphocyte
+lymphocythemia
+lymphocytic
+lymphocytoma
+lymphocytomatosis
+lymphocytosis
+lymphocytotic
+lymphocytotoxin
+lymphodermia
+lymphoduct
+lymphogenic
+lymphogenous
+lymphoglandula
+lymphogranuloma
+lymphoid
+lymphoidectomy
+lymphology
+lymphoma
+lymphomatosis
+lymphomatous
+lymphomonocyte
+lymphomyxoma
+lymphopathy
+lymphopenia
+lymphopenial
+lymphopoiesis
+lymphopoietic
+lymphoprotease
+lymphorrhage
+lymphorrhagia
+lymphorrhagic
+lymphorrhea
+lymphosarcoma
+lymphosarcomatosis
+lymphosarcomatous
+lymphosporidiosis
+lymphostasis
+lymphotaxis
+lymphotome
+lymphotomy
+lymphotoxemia
+lymphotoxin
+lymphotrophic
+lymphotrophy
+lymphous
+lymphuria
+lymphy
+lyncean
+Lynceus
+lynch
+lynchable
+lyncher
+Lyncid
+lyncine
+Lyndon
+Lynette
+Lyngbyaceae
+Lyngbyeae
+Lynn
+Lynne
+Lynnette
+lynnhaven
+lynx
+Lyomeri
+lyomerous
+Lyon
+Lyonese
+Lyonetia
+lyonetiid
+Lyonetiidae
+Lyonnais
+lyonnaise
+Lyonnesse
+lyophile
+lyophilization
+lyophilize
+lyophobe
+Lyopoma
+Lyopomata
+lyopomatous
+lyotrope
+lypemania
+Lyperosia
+lypothymia
+lyra
+Lyraid
+lyrate
+lyrated
+lyrately
+lyraway
+lyre
+lyrebird
+lyreflower
+lyreman
+lyretail
+lyric
+lyrical
+lyrically
+lyricalness
+lyrichord
+lyricism
+lyricist
+lyricize
+Lyrid
+lyriform
+lyrism
+lyrist
+Lyrurus
+lys
+Lysander
+lysate
+lyse
+Lysenkoism
+lysidine
+lysigenic
+lysigenous
+lysigenously
+Lysiloma
+Lysimachia
+Lysimachus
+lysimeter
+lysin
+lysine
+lysis
+Lysistrata
+lysogen
+lysogenesis
+lysogenetic
+lysogenic
+lysozyme
+lyssa
+lyssic
+lyssophobia
+lyterian
+Lythraceae
+lythraceous
+Lythrum
+lytic
+lytta
+lyxose
+M
+m
+Ma
+ma
+maam
+maamselle
+Maarten
+Mab
+Maba
+Mabel
+Mabellona
+mabi
+Mabinogion
+mabolo
+Mac
+mac
+macaasim
+macabre
+macabresque
+Macaca
+macaco
+Macacus
+macadam
+Macadamia
+macadamite
+macadamization
+macadamize
+macadamizer
+Macaglia
+macan
+macana
+Macanese
+macao
+macaque
+Macaranga
+Macarani
+Macareus
+macarism
+macarize
+macaroni
+macaronic
+macaronical
+macaronically
+macaronicism
+macaronism
+macaroon
+Macartney
+Macassar
+Macassarese
+macaw
+Macbeth
+Maccabaeus
+Maccabean
+Maccabees
+maccaboy
+macco
+maccoboy
+Macduff
+mace
+macedoine
+Macedon
+Macedonian
+Macedonic
+macehead
+maceman
+macer
+macerate
+macerater
+maceration
+Macflecknoe
+machairodont
+Machairodontidae
+Machairodontinae
+Machairodus
+machan
+machar
+machete
+Machetes
+machi
+Machiavel
+Machiavellian
+Machiavellianism
+Machiavellianly
+Machiavellic
+Machiavellism
+machiavellist
+Machiavellistic
+machicolate
+machicolation
+machicoulis
+Machicui
+machila
+Machilidae
+Machilis
+machin
+machinability
+machinable
+machinal
+machinate
+machination
+machinator
+machine
+machineful
+machineless
+machinelike
+machinely
+machineman
+machinemonger
+machiner
+machinery
+machinification
+machinify
+machinism
+machinist
+machinization
+machinize
+machinoclast
+machinofacture
+machinotechnique
+machinule
+Machogo
+machopolyp
+machree
+macies
+Macigno
+macilence
+macilency
+macilent
+mack
+mackenboy
+mackerel
+mackereler
+mackereling
+Mackinaw
+mackins
+mackintosh
+mackintoshite
+mackle
+macklike
+macle
+Macleaya
+macled
+Maclura
+Maclurea
+maclurin
+Macmillanite
+maco
+Macon
+maconite
+Macracanthorhynchus
+macracanthrorhynchiasis
+macradenous
+macrame
+macrander
+macrandrous
+macrauchene
+Macrauchenia
+macraucheniid
+Macraucheniidae
+macraucheniiform
+macrauchenioid
+macrencephalic
+macrencephalous
+macro
+macroanalysis
+macroanalyst
+macroanalytical
+macrobacterium
+macrobian
+macrobiosis
+macrobiote
+macrobiotic
+macrobiotics
+Macrobiotus
+macroblast
+macrobrachia
+macrocarpous
+Macrocentrinae
+Macrocentrus
+macrocephalia
+macrocephalic
+macrocephalism
+macrocephalous
+macrocephalus
+macrocephaly
+macrochaeta
+macrocheilia
+Macrochelys
+macrochemical
+macrochemically
+macrochemistry
+Macrochira
+macrochiran
+Macrochires
+macrochiria
+Macrochiroptera
+macrochiropteran
+macrocladous
+macroclimate
+macroclimatic
+macrococcus
+macrocoly
+macroconidial
+macroconidium
+macroconjugant
+macrocornea
+macrocosm
+macrocosmic
+macrocosmical
+macrocosmology
+macrocosmos
+macrocrystalline
+macrocyst
+Macrocystis
+macrocyte
+macrocythemia
+macrocytic
+macrocytosis
+macrodactyl
+macrodactylia
+macrodactylic
+macrodactylism
+macrodactylous
+macrodactyly
+macrodiagonal
+macrodomatic
+macrodome
+macrodont
+macrodontia
+macrodontism
+macroelement
+macroergate
+macroevolution
+macrofarad
+macrogamete
+macrogametocyte
+macrogamy
+macrogastria
+macroglossate
+macroglossia
+macrognathic
+macrognathism
+macrognathous
+macrogonidium
+macrograph
+macrographic
+macrography
+macrolepidoptera
+macrolepidopterous
+macrology
+macromandibular
+macromania
+macromastia
+macromazia
+macromelia
+macromeral
+macromere
+macromeric
+macromerite
+macromeritic
+macromesentery
+macrometer
+macromethod
+macromolecule
+macromyelon
+macromyelonal
+macron
+macronuclear
+macronucleus
+macronutrient
+macropetalous
+macrophage
+macrophagocyte
+macrophagus
+Macrophoma
+macrophotograph
+macrophotography
+macrophyllous
+macrophysics
+macropia
+macropinacoid
+macropinacoidal
+macroplankton
+macroplasia
+macroplastia
+macropleural
+macropodia
+Macropodidae
+Macropodinae
+macropodine
+macropodous
+macroprism
+macroprosopia
+macropsia
+macropteran
+macropterous
+Macropus
+Macropygia
+macropyramid
+macroreaction
+Macrorhamphosidae
+Macrorhamphosus
+macrorhinia
+Macrorhinus
+macroscelia
+Macroscelides
+macroscian
+macroscopic
+macroscopical
+macroscopically
+macroseism
+macroseismic
+macroseismograph
+macrosepalous
+macroseptum
+macrosmatic
+macrosomatia
+macrosomatous
+macrosomia
+macrosplanchnic
+macrosporange
+macrosporangium
+macrospore
+macrosporic
+Macrosporium
+macrosporophore
+macrosporophyl
+macrosporophyll
+Macrostachya
+macrostomatous
+macrostomia
+macrostructural
+macrostructure
+macrostylospore
+macrostylous
+macrosymbiont
+macrothere
+Macrotheriidae
+macrotherioid
+Macrotherium
+macrotherm
+macrotia
+macrotin
+Macrotolagus
+macrotome
+macrotone
+macrotous
+macrourid
+Macrouridae
+Macrourus
+Macrozamia
+macrozoogonidium
+macrozoospore
+Macrura
+macrural
+macruran
+macruroid
+macrurous
+mactation
+Mactra
+Mactridae
+mactroid
+macuca
+macula
+macular
+maculate
+maculated
+maculation
+macule
+maculicole
+maculicolous
+maculiferous
+maculocerebral
+maculopapular
+maculose
+Macusi
+macuta
+mad
+Madagascan
+Madagascar
+Madagascarian
+Madagass
+madam
+madame
+madapollam
+madarosis
+madarotic
+madbrain
+madbrained
+madcap
+madden
+maddening
+maddeningly
+maddeningness
+madder
+madderish
+madderwort
+madding
+maddingly
+maddish
+maddle
+made
+Madecase
+madefaction
+madefy
+Madegassy
+Madeira
+Madeiran
+Madeline
+madeline
+Madelon
+madescent
+Madge
+madhouse
+madhuca
+Madhva
+Madi
+Madia
+madid
+madidans
+Madiga
+madisterium
+madling
+madly
+madman
+madnep
+madness
+mado
+Madoc
+Madonna
+Madonnahood
+Madonnaish
+Madonnalike
+madoqua
+Madotheca
+madrague
+Madras
+madrasah
+Madrasi
+madreperl
+Madrepora
+Madreporacea
+madreporacean
+Madreporaria
+madreporarian
+madrepore
+madreporian
+madreporic
+madreporiform
+madreporite
+madreporitic
+Madrid
+madrier
+madrigal
+madrigaler
+madrigaletto
+madrigalian
+madrigalist
+Madrilene
+Madrilenian
+madrona
+madship
+madstone
+Madurese
+maduro
+madweed
+madwoman
+madwort
+mae
+Maeandra
+Maeandrina
+maeandrine
+maeandriniform
+maeandrinoid
+maeandroid
+Maecenas
+Maecenasship
+maegbote
+Maelstrom
+Maemacterion
+maenad
+maenadic
+maenadism
+maenaite
+Maenalus
+Maenidae
+Maeonian
+Maeonides
+maestri
+maestro
+maffia
+maffick
+mafficker
+maffle
+mafflin
+mafic
+mafoo
+mafura
+mag
+Maga
+Magadhi
+magadis
+magadize
+Magahi
+Magalensia
+magani
+magas
+magazinable
+magazinage
+magazine
+magazinelet
+magaziner
+magazinette
+magazinish
+magazinism
+magazinist
+magaziny
+Magdalen
+Magdalene
+Magdalenian
+mage
+Magellan
+Magellanian
+Magellanic
+magenta
+magged
+Maggie
+maggle
+maggot
+maggotiness
+maggotpie
+maggoty
+Maggy
+Magh
+Maghi
+Maghrib
+Maghribi
+Magi
+magi
+Magian
+Magianism
+magic
+magical
+magicalize
+magically
+magicdom
+magician
+magicianship
+magicked
+magicking
+Magindanao
+magiric
+magirics
+magirist
+magiristic
+magirological
+magirologist
+magirology
+Magism
+magister
+magisterial
+magisteriality
+magisterially
+magisterialness
+magistery
+magistracy
+magistral
+magistrality
+magistrally
+magistrand
+magistrant
+magistrate
+magistrateship
+magistratic
+magistratical
+magistratically
+magistrative
+magistrature
+Maglemose
+Maglemosean
+Maglemosian
+magma
+magmatic
+magnanimity
+magnanimous
+magnanimously
+magnanimousness
+magnascope
+magnascopic
+magnate
+magnecrystallic
+magnelectric
+magneoptic
+magnes
+magnesia
+magnesial
+magnesian
+magnesic
+magnesioferrite
+magnesite
+magnesium
+magnet
+magneta
+magnetic
+magnetical
+magnetically
+magneticalness
+magnetician
+magnetics
+magnetiferous
+magnetification
+magnetify
+magnetimeter
+magnetism
+magnetist
+magnetite
+magnetitic
+magnetizability
+magnetizable
+magnetization
+magnetize
+magnetizer
+magneto
+magnetobell
+magnetochemical
+magnetochemistry
+magnetod
+magnetodynamo
+magnetoelectric
+magnetoelectrical
+magnetoelectricity
+magnetogenerator
+magnetogram
+magnetograph
+magnetographic
+magnetoid
+magnetomachine
+magnetometer
+magnetometric
+magnetometrical
+magnetometrically
+magnetometry
+magnetomotive
+magnetomotor
+magneton
+magnetooptic
+magnetooptical
+magnetooptics
+magnetophone
+magnetophonograph
+magnetoplumbite
+magnetoprinter
+magnetoscope
+magnetostriction
+magnetotelegraph
+magnetotelephone
+magnetotherapy
+magnetotransmitter
+magnetron
+magnicaudate
+magnicaudatous
+magnifiable
+magnific
+magnifical
+magnifically
+Magnificat
+magnification
+magnificative
+magnifice
+magnificence
+magnificent
+magnificently
+magnificentness
+magnifico
+magnifier
+magnify
+magniloquence
+magniloquent
+magniloquently
+magniloquy
+magnipotence
+magnipotent
+magnirostrate
+magnisonant
+magnitude
+magnitudinous
+magnochromite
+magnoferrite
+Magnolia
+magnolia
+Magnoliaceae
+magnoliaceous
+magnum
+Magnus
+Magog
+magot
+magpie
+magpied
+magpieish
+magsman
+maguari
+maguey
+Magyar
+Magyaran
+Magyarism
+Magyarization
+Magyarize
+Mah
+maha
+mahaleb
+mahalla
+mahant
+mahar
+maharaja
+maharajrana
+maharana
+maharanee
+maharani
+maharao
+Maharashtri
+maharawal
+maharawat
+mahatma
+mahatmaism
+Mahayana
+Mahayanism
+Mahayanist
+Mahayanistic
+Mahdi
+Mahdian
+Mahdiship
+Mahdism
+Mahdist
+Mahesh
+Mahi
+Mahican
+mahmal
+Mahmoud
+mahmudi
+mahoe
+mahoganize
+mahogany
+mahoitre
+maholi
+maholtine
+Mahomet
+Mahometry
+mahone
+Mahonia
+Mahori
+Mahound
+mahout
+Mahra
+Mahran
+Mahri
+mahseer
+mahua
+mahuang
+Maia
+Maiacca
+Maianthemum
+maid
+Maida
+maidan
+maiden
+maidenhair
+maidenhead
+maidenhood
+maidenish
+maidenism
+maidenlike
+maidenliness
+maidenly
+maidenship
+maidenweed
+maidhood
+Maidie
+maidish
+maidism
+maidkin
+maidlike
+maidling
+maidservant
+Maidu
+maidy
+maiefic
+maieutic
+maieutical
+maieutics
+maigre
+maiid
+Maiidae
+mail
+mailable
+mailbag
+mailbox
+mailclad
+mailed
+mailer
+mailguard
+mailie
+maillechort
+mailless
+mailman
+mailplane
+maim
+maimed
+maimedly
+maimedness
+maimer
+maimon
+Maimonidean
+Maimonist
+main
+Mainan
+Maine
+mainferre
+mainlander
+mainly
+mainmast
+mainmortable
+mainour
+mainpast
+mainpernable
+mainpernor
+mainpin
+mainport
+mainpost
+mainprise
+mains
+mainsail
+mainsheet
+mainspring
+mainstay
+Mainstreeter
+Mainstreetism
+maint
+maintain
+maintainable
+maintainableness
+maintainer
+maintainment
+maintainor
+maintenance
+Maintenon
+maintop
+maintopman
+maioid
+Maioidea
+maioidean
+Maioli
+Maiongkong
+Maipure
+mairatour
+maire
+maisonette
+Maithili
+maitlandite
+Maitreya
+Maius
+maize
+maizebird
+maizenic
+maizer
+Maja
+Majagga
+majagua
+Majesta
+majestic
+majestical
+majestically
+majesticalness
+majesticness
+majestious
+majesty
+majestyship
+Majlis
+majo
+majolica
+majolist
+majoon
+Major
+major
+majorate
+majoration
+Majorcan
+majorette
+Majorism
+Majorist
+Majoristic
+majority
+majorize
+majorship
+majuscular
+majuscule
+makable
+Makah
+Makaraka
+Makari
+Makassar
+make
+makebate
+makedom
+makefast
+maker
+makeress
+makership
+makeshift
+makeshiftiness
+makeshiftness
+makeshifty
+makeweight
+makhzan
+maki
+makimono
+making
+makluk
+mako
+Makonde
+makroskelic
+Maku
+Makua
+makuk
+mal
+mala
+malaanonang
+Malabar
+Malabarese
+malabathrum
+malacanthid
+Malacanthidae
+malacanthine
+Malacanthus
+Malacca
+Malaccan
+malaccident
+Malaceae
+malaceous
+malachite
+malacia
+Malaclemys
+Malaclypse
+Malacobdella
+Malacocotylea
+malacoderm
+Malacodermatidae
+malacodermatous
+Malacodermidae
+malacodermous
+malacoid
+malacolite
+malacological
+malacologist
+malacology
+malacon
+malacophilous
+malacophonous
+malacophyllous
+malacopod
+Malacopoda
+malacopodous
+malacopterygian
+Malacopterygii
+malacopterygious
+Malacoscolices
+Malacoscolicine
+Malacosoma
+Malacostraca
+malacostracan
+malacostracology
+malacostracous
+malactic
+maladaptation
+maladdress
+maladive
+maladjust
+maladjusted
+maladjustive
+maladjustment
+maladminister
+maladministration
+maladministrator
+maladroit
+maladroitly
+maladroitness
+maladventure
+malady
+Malaga
+Malagasy
+Malagigi
+malagma
+malaguena
+malahack
+malaise
+malakin
+malalignment
+malambo
+malandered
+malanders
+malandrous
+malanga
+malapaho
+malapert
+malapertly
+malapertness
+malapi
+malapplication
+malappointment
+malappropriate
+malappropriation
+malaprop
+malapropian
+malapropish
+malapropism
+malapropoism
+malapropos
+Malapterurus
+malar
+malaria
+malarial
+malariaproof
+malarin
+malarioid
+malariologist
+malariology
+malarious
+malarkey
+malaroma
+malarrangement
+malasapsap
+malassimilation
+malassociation
+malate
+malati
+malattress
+malax
+malaxable
+malaxage
+malaxate
+malaxation
+malaxator
+malaxerman
+Malaxis
+Malay
+Malayalam
+Malayalim
+Malayan
+Malayic
+Malayize
+Malayoid
+Malaysian
+malbehavior
+malbrouck
+malchite
+Malchus
+Malcolm
+malconceived
+malconduct
+malconformation
+malconstruction
+malcontent
+malcontented
+malcontentedly
+malcontentedness
+malcontentism
+malcontently
+malcontentment
+malconvenance
+malcreated
+malcultivation
+maldeveloped
+maldevelopment
+maldigestion
+maldirection
+maldistribution
+Maldivian
+maldonite
+malduck
+Male
+male
+malease
+maleate
+Malebolge
+Malebolgian
+Malebolgic
+Malebranchism
+Malecite
+maledicent
+maledict
+malediction
+maledictive
+maledictory
+maleducation
+malefaction
+malefactor
+malefactory
+malefactress
+malefical
+malefically
+maleficence
+maleficent
+maleficial
+maleficiate
+maleficiation
+maleic
+maleinoid
+malella
+Malemute
+maleness
+malengine
+maleo
+maleruption
+Malesherbia
+Malesherbiaceae
+malesherbiaceous
+malevolence
+malevolency
+malevolent
+malevolently
+malexecution
+malfeasance
+malfeasant
+malfed
+malformation
+malformed
+malfortune
+malfunction
+malgovernment
+malgrace
+malguzar
+malguzari
+malhonest
+malhygiene
+mali
+malic
+malice
+maliceful
+maliceproof
+malicho
+malicious
+maliciously
+maliciousness
+malicorium
+malidentification
+maliferous
+maliform
+malign
+malignance
+malignancy
+malignant
+malignantly
+malignation
+maligner
+malignify
+malignity
+malignly
+malignment
+malik
+malikadna
+malikala
+malikana
+Maliki
+Malikite
+maline
+malines
+malinfluence
+malinger
+malingerer
+malingery
+Malinois
+malinowskite
+malinstitution
+malinstruction
+malintent
+malism
+malison
+malist
+malistic
+malkin
+Malkite
+mall
+malladrite
+mallangong
+mallard
+mallardite
+malleability
+malleabilization
+malleable
+malleableize
+malleableized
+malleableness
+malleablize
+malleal
+mallear
+malleate
+malleation
+mallee
+Malleifera
+malleiferous
+malleiform
+mallein
+malleinization
+malleinize
+mallemaroking
+mallemuck
+malleoincudal
+malleolable
+malleolar
+malleolus
+mallet
+malleus
+Malling
+Mallophaga
+mallophagan
+mallophagous
+malloseismic
+Mallotus
+mallow
+mallowwort
+Malloy
+mallum
+mallus
+malm
+Malmaison
+malmignatte
+malmsey
+malmstone
+malmy
+malnourished
+malnourishment
+malnutrite
+malnutrition
+malo
+malobservance
+malobservation
+maloccluded
+malocclusion
+malodor
+malodorant
+malodorous
+malodorously
+malodorousness
+malojilla
+malonate
+malonic
+malonyl
+malonylurea
+Malope
+maloperation
+malorganization
+malorganized
+malouah
+malpais
+Malpighia
+Malpighiaceae
+malpighiaceous
+Malpighian
+malplaced
+malpoise
+malposed
+malposition
+malpractice
+malpractioner
+malpraxis
+malpresentation
+malproportion
+malproportioned
+malpropriety
+malpublication
+malreasoning
+malrotation
+malshapen
+malt
+maltable
+maltase
+malter
+Maltese
+maltha
+Malthe
+malthouse
+Malthusian
+Malthusianism
+Malthusiast
+maltiness
+malting
+maltman
+Malto
+maltobiose
+maltodextrin
+maltodextrine
+maltolte
+maltose
+maltreat
+maltreatment
+maltreator
+maltster
+malturned
+maltworm
+malty
+malunion
+Malurinae
+malurine
+Malurus
+Malus
+Malva
+Malvaceae
+malvaceous
+Malvales
+malvasia
+malvasian
+Malvastrum
+malversation
+malverse
+malvoisie
+malvolition
+Mam
+mamba
+mambo
+mameliere
+mamelonation
+mameluco
+Mameluke
+Mamercus
+Mamers
+Mamertine
+Mamie
+Mamilius
+mamlatdar
+mamma
+mammal
+mammalgia
+Mammalia
+mammalian
+mammaliferous
+mammality
+mammalogical
+mammalogist
+mammalogy
+mammary
+mammate
+Mammea
+mammectomy
+mammee
+mammer
+Mammifera
+mammiferous
+mammiform
+mammilla
+mammillaplasty
+mammillar
+Mammillaria
+mammillary
+mammillate
+mammillated
+mammillation
+mammilliform
+mammilloid
+mammitis
+mammock
+mammogen
+mammogenic
+mammogenically
+mammon
+mammondom
+mammoniacal
+mammonish
+mammonism
+mammonist
+mammonistic
+mammonite
+mammonitish
+mammonization
+mammonize
+mammonolatry
+Mammonteus
+mammoth
+mammothrept
+mammula
+mammular
+Mammut
+Mammutidae
+mammy
+mamo
+man
+mana
+Manabozho
+manacle
+Manacus
+manage
+manageability
+manageable
+manageableness
+manageably
+managee
+manageless
+management
+managemental
+manager
+managerdom
+manageress
+managerial
+managerially
+managership
+managery
+manaism
+manakin
+manal
+manas
+Manasquan
+manatee
+Manatidae
+manatine
+manatoid
+Manatus
+manavel
+manavelins
+Manavendra
+manbird
+manbot
+manche
+Manchester
+Manchesterdom
+Manchesterism
+Manchesterist
+Manchestrian
+manchet
+manchineel
+Manchu
+Manchurian
+mancinism
+mancipable
+mancipant
+mancipate
+mancipation
+mancipative
+mancipatory
+mancipee
+mancipium
+manciple
+mancipleship
+mancipular
+mancono
+Mancunian
+mancus
+mand
+Mandaean
+Mandaeism
+Mandaic
+Mandaite
+mandala
+Mandalay
+mandament
+mandamus
+Mandan
+mandant
+mandarah
+mandarin
+mandarinate
+mandarindom
+mandariness
+mandarinic
+mandarinism
+mandarinize
+mandarinship
+mandatary
+mandate
+mandatee
+mandation
+mandative
+mandator
+mandatorily
+mandatory
+mandatum
+Mande
+mandelate
+mandelic
+mandible
+mandibula
+mandibular
+mandibulary
+Mandibulata
+mandibulate
+mandibulated
+mandibuliform
+mandibulohyoid
+mandibulomaxillary
+mandibulopharyngeal
+mandibulosuspensorial
+mandil
+mandilion
+Mandingan
+Mandingo
+mandola
+mandolin
+mandolinist
+mandolute
+mandom
+mandora
+mandore
+mandra
+mandragora
+mandrake
+mandrel
+mandriarch
+mandrill
+mandrin
+mandruka
+mandua
+manducable
+manducate
+manducation
+manducatory
+mandyas
+mane
+maned
+manege
+manei
+maneless
+manent
+manerial
+manes
+manesheet
+maness
+Manetti
+Manettia
+maneuver
+maneuverability
+maneuverable
+maneuverer
+maneuvrability
+maneuvrable
+maney
+Manfred
+Manfreda
+manful
+manfully
+manfulness
+mang
+manga
+mangabeira
+mangabey
+mangal
+manganapatite
+manganate
+manganblende
+manganbrucite
+manganeisen
+manganese
+manganesian
+manganetic
+manganhedenbergite
+manganic
+manganiferous
+manganite
+manganium
+manganize
+Manganja
+manganocalcite
+manganocolumbite
+manganophyllite
+manganosiderite
+manganosite
+manganostibiite
+manganotantalite
+manganous
+manganpectolite
+Mangar
+Mangbattu
+mange
+mangeao
+mangel
+mangelin
+manger
+mangerite
+mangi
+Mangifera
+mangily
+manginess
+mangle
+mangleman
+mangler
+mangling
+manglingly
+mango
+mangona
+mangonel
+mangonism
+mangonization
+mangonize
+mangosteen
+mangrass
+mangrate
+mangrove
+Mangue
+mangue
+mangy
+Mangyan
+manhandle
+Manhattan
+Manhattanite
+Manhattanize
+manhead
+manhole
+manhood
+mani
+mania
+maniable
+maniac
+maniacal
+maniacally
+manic
+Manicaria
+manicate
+Manichaean
+Manichaeanism
+Manichaeanize
+Manichaeism
+Manichaeist
+Manichee
+manichord
+manicole
+manicure
+manicurist
+manid
+Manidae
+manienie
+manifest
+manifestable
+manifestant
+manifestation
+manifestational
+manifestationist
+manifestative
+manifestatively
+manifested
+manifestedness
+manifester
+manifestive
+manifestly
+manifestness
+manifesto
+manifold
+manifolder
+manifoldly
+manifoldness
+manifoldwise
+maniform
+manify
+Manihot
+manikin
+manikinism
+Manila
+manila
+manilla
+manille
+manioc
+maniple
+manipulable
+manipular
+manipulatable
+manipulate
+manipulation
+manipulative
+manipulatively
+manipulator
+manipulatory
+Manipuri
+Manis
+manism
+manist
+manistic
+manito
+Manitoban
+manitrunk
+maniu
+Manius
+Maniva
+manjak
+Manjeri
+mank
+mankeeper
+mankin
+mankind
+manless
+manlessly
+manlessness
+manlet
+manlihood
+manlike
+manlikely
+manlikeness
+manlily
+manliness
+manling
+manly
+Mann
+manna
+mannan
+mannequin
+manner
+mannerable
+mannered
+mannerhood
+mannering
+mannerism
+mannerist
+manneristic
+manneristical
+manneristically
+mannerize
+mannerless
+mannerlessness
+mannerliness
+mannerly
+manners
+mannersome
+manness
+Mannheimar
+mannide
+mannie
+manniferous
+mannify
+mannikinism
+manning
+mannish
+mannishly
+mannishness
+mannite
+mannitic
+mannitol
+mannitose
+mannoheptite
+mannoheptitol
+mannoheptose
+mannoketoheptose
+mannonic
+mannosan
+mannose
+Manny
+manny
+mano
+Manobo
+manoc
+manograph
+Manolis
+manometer
+manometric
+manometrical
+manometry
+manomin
+manor
+manorial
+manorialism
+manorialize
+manorship
+manoscope
+manostat
+manostatic
+manque
+manred
+manrent
+manroot
+manrope
+Mans
+mansard
+mansarded
+manscape
+manse
+manservant
+manship
+mansion
+mansional
+mansionary
+mansioned
+mansioneer
+mansionry
+manslaughter
+manslaughterer
+manslaughtering
+manslaughterous
+manslayer
+manslaying
+manso
+mansonry
+manstealer
+manstealing
+manstopper
+manstopping
+mansuete
+mansuetely
+mansuetude
+mant
+manta
+mantal
+manteau
+mantel
+mantelet
+manteline
+mantelletta
+mantellone
+mantelpiece
+mantelshelf
+manteltree
+manter
+mantes
+mantevil
+mantic
+manticism
+manticore
+mantid
+Mantidae
+mantilla
+Mantinean
+mantis
+Mantisia
+Mantispa
+mantispid
+Mantispidae
+mantissa
+mantistic
+mantle
+mantled
+mantlet
+mantling
+Manto
+manto
+Mantodea
+mantoid
+Mantoidea
+mantologist
+mantology
+mantra
+mantrap
+mantua
+mantuamaker
+mantuamaking
+Mantuan
+Mantzu
+manual
+manualii
+manualism
+manualist
+manualiter
+manually
+manuao
+manubrial
+manubriated
+manubrium
+manucaption
+manucaptor
+manucapture
+manucode
+Manucodia
+manucodiata
+manuduce
+manuduction
+manuductor
+manuductory
+Manuel
+manufactory
+manufacturable
+manufactural
+manufacture
+manufacturer
+manufacturess
+manuka
+manul
+manuma
+manumea
+manumisable
+manumission
+manumissive
+manumit
+manumitter
+manumotive
+manurable
+manurage
+manurance
+manure
+manureless
+manurer
+manurial
+manurially
+manus
+manuscript
+manuscriptal
+manuscription
+manuscriptural
+manusina
+manustupration
+manutagi
+Manvantara
+manward
+manwards
+manway
+manweed
+manwise
+Manx
+Manxman
+Manxwoman
+many
+manyberry
+Manyema
+manyfold
+manyness
+manyplies
+manyroot
+manyways
+manywhere
+manywise
+manzana
+manzanilla
+manzanillo
+manzanita
+Manzas
+manzil
+mao
+maomao
+Maori
+Maoridom
+Maoriland
+Maorilander
+map
+mapach
+mapau
+maphrian
+mapland
+maple
+maplebush
+mapo
+mappable
+mapper
+Mappila
+mappist
+mappy
+Mapuche
+mapwise
+maquahuitl
+maquette
+maqui
+Maquiritare
+maquis
+Mar
+mar
+Mara
+marabotin
+marabou
+Marabout
+marabuto
+maraca
+Maracaibo
+maracan
+maracock
+marae
+Maragato
+marajuana
+marakapas
+maral
+maranatha
+marang
+Maranha
+Maranham
+Maranhao
+Maranta
+Marantaceae
+marantaceous
+marantic
+marara
+mararie
+marasca
+maraschino
+marasmic
+Marasmius
+marasmoid
+marasmous
+marasmus
+Maratha
+Marathi
+marathon
+marathoner
+Marathonian
+Maratism
+Maratist
+Marattia
+Marattiaceae
+marattiaceous
+Marattiales
+maraud
+marauder
+maravedi
+Maravi
+marbelize
+marble
+marbled
+marblehead
+marbleheader
+marblehearted
+marbleization
+marbleize
+marbleizer
+marblelike
+marbleness
+marbler
+marbles
+marblewood
+marbling
+marblish
+marbly
+marbrinus
+Marc
+marc
+Marcan
+marcantant
+marcasite
+marcasitic
+marcasitical
+Marcel
+marcel
+marceline
+Marcella
+marcella
+marceller
+Marcellian
+Marcellianism
+marcello
+marcescence
+marcescent
+Marcgravia
+Marcgraviaceae
+marcgraviaceous
+March
+march
+Marchantia
+Marchantiaceae
+marchantiaceous
+Marchantiales
+marcher
+marchetto
+marchioness
+marchite
+marchland
+marchman
+Marchmont
+marchpane
+Marci
+Marcia
+marcid
+Marcionism
+Marcionist
+Marcionite
+Marcionitic
+Marcionitish
+Marcionitism
+Marcite
+Marco
+marco
+Marcobrunner
+Marcomanni
+Marconi
+marconi
+marconigram
+marconigraph
+marconigraphy
+marcor
+Marcos
+Marcosian
+marcottage
+mardy
+mare
+mareblob
+Mareca
+marechal
+Marehan
+Marek
+marekanite
+maremma
+maremmatic
+maremmese
+marengo
+marennin
+Mareotic
+Mareotid
+Marfik
+marfire
+margarate
+Margarelon
+Margaret
+margaric
+margarin
+margarine
+margarita
+margaritaceous
+margarite
+margaritiferous
+margaritomancy
+Margarodes
+margarodid
+Margarodinae
+margarodite
+Margaropus
+margarosanite
+margay
+marge
+margeline
+margent
+Margery
+Margie
+margin
+marginal
+marginalia
+marginality
+marginalize
+marginally
+marginate
+marginated
+margination
+margined
+Marginella
+Marginellidae
+marginelliform
+marginiform
+margining
+marginirostral
+marginoplasty
+margosa
+Margot
+margravate
+margrave
+margravely
+margravial
+margraviate
+margravine
+Marguerite
+marguerite
+marhala
+Marheshvan
+Mari
+Maria
+maria
+marialite
+Mariamman
+Marian
+Mariana
+Marianic
+Marianne
+Marianolatrist
+Marianolatry
+maricolous
+marid
+Marie
+mariengroschen
+marigenous
+marigold
+marigram
+marigraph
+marigraphic
+marijuana
+marikina
+Marilla
+Marilyn
+marimba
+marimonda
+marina
+marinade
+marinate
+marinated
+marine
+mariner
+marinheiro
+marinist
+marinorama
+Mario
+mariola
+Mariolater
+Mariolatrous
+Mariolatry
+Mariology
+Marion
+marionette
+Mariou
+Mariposan
+mariposite
+maris
+marish
+marishness
+Marist
+maritage
+marital
+maritality
+maritally
+mariticidal
+mariticide
+Maritime
+maritime
+maritorious
+mariupolite
+marjoram
+Marjorie
+Mark
+mark
+marka
+Markab
+markdown
+Markeb
+marked
+markedly
+markedness
+marker
+market
+marketability
+marketable
+marketableness
+marketably
+marketeer
+marketer
+marketing
+marketman
+marketstead
+marketwise
+markfieldite
+Markgenossenschaft
+markhor
+marking
+markka
+markless
+markman
+markmoot
+Marko
+markshot
+marksman
+marksmanly
+marksmanship
+markswoman
+markup
+Markus
+markweed
+markworthy
+marl
+Marla
+marlaceous
+marlberry
+marled
+Marlena
+marler
+marli
+marlin
+marline
+marlinespike
+marlite
+marlitic
+marllike
+marlock
+Marlovian
+Marlowesque
+Marlowish
+Marlowism
+marlpit
+marly
+marm
+marmalade
+marmalady
+Marmar
+marmarization
+marmarize
+marmarosis
+marmatite
+marmelos
+marmennill
+marmit
+marmite
+marmolite
+marmoraceous
+marmorate
+marmorated
+marmoration
+marmoreal
+marmoreally
+marmorean
+marmoric
+Marmosa
+marmose
+marmoset
+marmot
+Marmota
+Marnix
+maro
+marocain
+marok
+Maronian
+Maronist
+Maronite
+maroon
+marooner
+maroquin
+Marpessa
+marplot
+marplotry
+marque
+marquee
+Marquesan
+marquess
+marquetry
+marquis
+marquisal
+marquisate
+marquisdom
+marquise
+marquisette
+marquisina
+marquisotte
+marquisship
+marquito
+marranism
+marranize
+marrano
+marree
+Marrella
+marrer
+marriable
+marriage
+marriageability
+marriageable
+marriageableness
+marriageproof
+married
+marrier
+marron
+marrot
+marrow
+marrowbone
+marrowed
+marrowfat
+marrowish
+marrowless
+marrowlike
+marrowsky
+marrowskyer
+marrowy
+Marrubium
+Marrucinian
+marry
+marryer
+marrying
+marrymuffe
+Mars
+Marsala
+Marsdenia
+marseilles
+Marsh
+marsh
+Marsha
+marshal
+marshalate
+marshalcy
+marshaler
+marshaless
+Marshall
+marshalman
+marshalment
+Marshalsea
+marshalship
+marshberry
+marshbuck
+marshfire
+marshflower
+marshiness
+marshite
+marshland
+marshlander
+marshlike
+marshlocks
+marshman
+marshwort
+marshy
+Marsi
+Marsian
+Marsilea
+Marsileaceae
+marsileaceous
+Marsilia
+Marsiliaceae
+marsipobranch
+Marsipobranchia
+Marsipobranchiata
+marsipobranchiate
+Marsipobranchii
+marsoon
+Marspiter
+Marssonia
+Marssonina
+marsupial
+Marsupialia
+marsupialian
+marsupialization
+marsupialize
+marsupian
+Marsupiata
+marsupiate
+marsupium
+Mart
+mart
+martagon
+martel
+marteline
+martellate
+martellato
+marten
+martensite
+martensitic
+Martes
+martext
+Martha
+martial
+martialism
+Martialist
+martiality
+martialization
+martialize
+martially
+martialness
+Martian
+Martin
+martin
+martinet
+martineta
+martinetish
+martinetishness
+martinetism
+martinetship
+Martinez
+martingale
+martinico
+Martinism
+Martinist
+Martinmas
+martinoe
+martite
+Martius
+martlet
+Martu
+Marty
+Martyn
+Martynia
+Martyniaceae
+martyniaceous
+martyr
+martyrdom
+martyress
+martyrium
+martyrization
+martyrize
+martyrizer
+martyrlike
+martyrly
+martyrolatry
+martyrologic
+martyrological
+martyrologist
+martyrologistic
+martyrologium
+martyrology
+martyrship
+martyry
+maru
+marvel
+marvelment
+marvelous
+marvelously
+marvelousness
+marvelry
+marver
+Marvin
+Marwari
+Marxian
+Marxianism
+Marxism
+Marxist
+Mary
+mary
+marybud
+Maryland
+Marylander
+Marylandian
+Marymass
+marysole
+marzipan
+mas
+masa
+Masai
+Masanao
+Masanobu
+masaridid
+Masarididae
+Masaridinae
+Masaris
+mascagnine
+mascagnite
+mascally
+mascara
+mascaron
+mascled
+mascleless
+mascot
+mascotism
+mascotry
+Mascouten
+mascularity
+masculate
+masculation
+masculine
+masculinely
+masculineness
+masculinism
+masculinist
+masculinity
+masculinization
+masculinize
+masculist
+masculofeminine
+masculonucleus
+masculy
+masdeu
+Masdevallia
+mash
+masha
+mashal
+mashallah
+mashelton
+masher
+mashie
+mashing
+mashman
+Mashona
+Mashpee
+mashru
+mashy
+masjid
+mask
+masked
+Maskegon
+maskelynite
+masker
+maskette
+maskflower
+Maskins
+masklike
+Maskoi
+maskoid
+maslin
+masochism
+masochist
+masochistic
+Mason
+mason
+masoned
+masoner
+masonic
+Masonite
+masonite
+masonry
+masonwork
+masooka
+masoola
+Masora
+Masorete
+Masoreth
+Masoretic
+Maspiter
+masque
+masquer
+masquerade
+masquerader
+Mass
+mass
+massa
+massacre
+massacrer
+massage
+massager
+massageuse
+massagist
+Massalia
+Massalian
+massaranduba
+massasauga
+masse
+massebah
+massecuite
+massedly
+massedness
+Massekhoth
+massel
+masser
+masseter
+masseteric
+masseur
+masseuse
+massicot
+massier
+massiest
+massif
+Massilia
+Massilian
+massily
+massiness
+massive
+massively
+massiveness
+massivity
+masskanne
+massless
+masslike
+Massmonger
+massotherapy
+massoy
+massula
+massy
+mast
+mastaba
+mastadenitis
+mastadenoma
+mastage
+mastalgia
+mastatrophia
+mastatrophy
+mastauxe
+mastax
+mastectomy
+masted
+master
+masterable
+masterate
+masterdom
+masterer
+masterful
+masterfully
+masterfulness
+masterhood
+masterless
+masterlessness
+masterlike
+masterlily
+masterliness
+masterling
+masterly
+masterman
+mastermind
+masterous
+masterpiece
+masterproof
+mastership
+masterwork
+masterwort
+mastery
+mastful
+masthead
+masthelcosis
+mastic
+masticability
+masticable
+masticate
+mastication
+masticator
+masticatory
+mastiche
+masticic
+Masticura
+masticurous
+mastiff
+Mastigamoeba
+mastigate
+mastigium
+mastigobranchia
+mastigobranchial
+Mastigophora
+mastigophoran
+mastigophoric
+mastigophorous
+mastigopod
+Mastigopoda
+mastigopodous
+mastigote
+mastigure
+masting
+mastitis
+mastless
+mastlike
+mastman
+mastocarcinoma
+mastoccipital
+mastochondroma
+mastochondrosis
+mastodon
+mastodonsaurian
+Mastodonsaurus
+mastodont
+mastodontic
+Mastodontidae
+mastodontine
+mastodontoid
+mastodynia
+mastoid
+mastoidal
+mastoidale
+mastoideal
+mastoidean
+mastoidectomy
+mastoideocentesis
+mastoideosquamous
+mastoiditis
+mastoidohumeral
+mastoidohumeralis
+mastoidotomy
+mastological
+mastologist
+mastology
+mastomenia
+mastoncus
+mastooccipital
+mastoparietal
+mastopathy
+mastopexy
+mastoplastia
+mastorrhagia
+mastoscirrhus
+mastosquamose
+mastotomy
+mastotympanic
+masturbate
+masturbation
+masturbational
+masturbator
+masturbatory
+mastwood
+masty
+masu
+Masulipatam
+masurium
+Mat
+mat
+Matabele
+Matacan
+matachin
+matachina
+mataco
+matadero
+matador
+mataeological
+mataeologue
+mataeology
+Matagalpa
+Matagalpan
+matagory
+matagouri
+matai
+matajuelo
+matalan
+matamata
+matamoro
+matanza
+matapan
+matapi
+Matar
+matara
+Matatua
+Matawan
+matax
+matboard
+match
+matchable
+matchableness
+matchably
+matchboard
+matchboarding
+matchbook
+matchbox
+matchcloth
+matchcoat
+matcher
+matching
+matchless
+matchlessly
+matchlessness
+matchlock
+matchmaker
+matchmaking
+matchmark
+Matchotic
+matchsafe
+matchstick
+matchwood
+matchy
+mate
+mategriffon
+matehood
+mateless
+matelessness
+matelote
+mately
+mater
+materfamilias
+material
+materialism
+materialist
+materialistic
+materialistical
+materialistically
+materiality
+materialization
+materialize
+materializee
+materializer
+materially
+materialman
+materialness
+materiate
+materiation
+materiel
+maternal
+maternality
+maternalize
+maternally
+maternalness
+maternity
+maternology
+mateship
+matey
+matezite
+matfelon
+matgrass
+math
+mathematic
+mathematical
+mathematically
+mathematicals
+mathematician
+mathematicize
+mathematics
+mathematize
+mathemeg
+mathes
+mathesis
+mathetic
+Mathurin
+matico
+matildite
+matin
+matinal
+matinee
+mating
+matins
+matipo
+matka
+matless
+matlockite
+matlow
+matmaker
+matmaking
+matra
+matral
+Matralia
+matranee
+matrass
+matreed
+matriarch
+matriarchal
+matriarchalism
+matriarchate
+matriarchic
+matriarchist
+matriarchy
+matric
+matrical
+Matricaria
+matrices
+matricidal
+matricide
+matricula
+matriculable
+matriculant
+matricular
+matriculate
+matriculation
+matriculator
+matriculatory
+Matrigan
+matriheritage
+matriherital
+matrilineal
+matrilineally
+matrilinear
+matrilinearism
+matriliny
+matrilocal
+matrimonial
+matrimonially
+matrimonious
+matrimoniously
+matrimony
+matriotism
+matripotestal
+matris
+matrix
+matroclinic
+matroclinous
+matrocliny
+matron
+matronage
+matronal
+Matronalia
+matronhood
+matronism
+matronize
+matronlike
+matronliness
+matronly
+matronship
+matronymic
+matross
+Mats
+matsu
+matsuri
+Matt
+matta
+mattamore
+Mattapony
+mattaro
+mattboard
+matte
+matted
+mattedly
+mattedness
+matter
+matterate
+matterative
+matterful
+matterfulness
+matterless
+mattery
+Matteuccia
+Matthaean
+Matthew
+Matthias
+Matthieu
+Matthiola
+Matti
+matti
+matting
+mattock
+mattoid
+mattoir
+mattress
+mattulla
+Matty
+maturable
+maturate
+maturation
+maturative
+mature
+maturely
+maturement
+matureness
+maturer
+maturescence
+maturescent
+maturing
+maturish
+maturity
+matutinal
+matutinally
+matutinary
+matutine
+matutinely
+matweed
+maty
+matzo
+matzoon
+matzos
+matzoth
+mau
+maucherite
+Maud
+maud
+maudle
+maudlin
+maudlinism
+maudlinize
+maudlinly
+maudlinwort
+mauger
+maugh
+Maugis
+maul
+Maulawiyah
+mauler
+mauley
+mauling
+maulstick
+Maumee
+maumet
+maumetry
+Maun
+maun
+maund
+maunder
+maunderer
+maundful
+maundy
+maunge
+Maurandia
+Maureen
+Mauretanian
+Mauri
+Maurice
+Maurist
+Mauritia
+Mauritian
+Mauser
+mausolea
+mausoleal
+mausolean
+mausoleum
+mauther
+mauve
+mauveine
+mauvette
+mauvine
+maux
+maverick
+mavis
+Mavortian
+mavournin
+mavrodaphne
+maw
+mawbound
+mawk
+mawkish
+mawkishly
+mawkishness
+mawky
+mawp
+Max
+maxilla
+maxillar
+maxillary
+maxilliferous
+maxilliform
+maxilliped
+maxillipedary
+maxillodental
+maxillofacial
+maxillojugal
+maxillolabial
+maxillomandibular
+maxillopalatal
+maxillopalatine
+maxillopharyngeal
+maxillopremaxillary
+maxilloturbinal
+maxillozygomatic
+maxim
+maxima
+maximal
+Maximalism
+Maximalist
+maximally
+maximate
+maximation
+maximed
+maximist
+maximistic
+maximite
+maximization
+maximize
+maximizer
+Maximon
+maximum
+maximus
+maxixe
+maxwell
+May
+may
+Maya
+maya
+Mayaca
+Mayacaceae
+mayacaceous
+Mayan
+Mayance
+Mayathan
+maybe
+Maybird
+Maybloom
+maybush
+Maycock
+maycock
+Mayda
+mayday
+Mayer
+Mayey
+Mayeye
+Mayfair
+mayfish
+Mayflower
+Mayfowl
+mayhap
+mayhappen
+mayhem
+Maying
+Maylike
+maynt
+Mayo
+Mayologist
+mayonnaise
+mayor
+mayoral
+mayoralty
+mayoress
+mayorship
+Mayoruna
+Maypole
+Maypoling
+maypop
+maysin
+mayten
+Maytenus
+Maythorn
+Maytide
+Maytime
+mayweed
+Maywings
+Maywort
+maza
+mazalgia
+Mazama
+mazame
+Mazanderani
+mazapilite
+mazard
+mazarine
+Mazatec
+Mazateco
+Mazda
+Mazdaism
+Mazdaist
+Mazdakean
+Mazdakite
+Mazdean
+maze
+mazed
+mazedly
+mazedness
+mazeful
+mazement
+mazer
+Mazhabi
+mazic
+mazily
+maziness
+mazocacothesis
+mazodynia
+mazolysis
+mazolytic
+mazopathia
+mazopathic
+mazopexy
+Mazovian
+mazuca
+mazuma
+Mazur
+Mazurian
+mazurka
+mazut
+mazy
+mazzard
+Mazzinian
+Mazzinianism
+Mazzinist
+mbalolo
+Mbaya
+mbori
+Mbuba
+Mbunda
+Mcintosh
+Mckay
+Mdewakanton
+me
+meable
+meaching
+mead
+meader
+meadow
+meadowbur
+meadowed
+meadower
+meadowing
+meadowink
+meadowland
+meadowless
+meadowsweet
+meadowwort
+meadowy
+meadsman
+meager
+meagerly
+meagerness
+meagre
+meak
+meal
+mealable
+mealberry
+mealer
+mealies
+mealily
+mealiness
+mealless
+mealman
+mealmonger
+mealmouth
+mealmouthed
+mealproof
+mealtime
+mealy
+mealymouth
+mealymouthed
+mealymouthedly
+mealymouthedness
+mealywing
+mean
+meander
+meanderingly
+meandrine
+meandriniform
+meandrite
+meandrous
+meaned
+meaner
+meaning
+meaningful
+meaningfully
+meaningless
+meaninglessly
+meaninglessness
+meaningly
+meaningness
+meanish
+meanly
+meanness
+meant
+Meantes
+meantone
+meanwhile
+mease
+measle
+measled
+measledness
+measles
+measlesproof
+measly
+measondue
+measurability
+measurable
+measurableness
+measurably
+measuration
+measure
+measured
+measuredly
+measuredness
+measureless
+measurelessly
+measurelessness
+measurely
+measurement
+measurer
+measuring
+meat
+meatal
+meatbird
+meatcutter
+meated
+meathook
+meatily
+meatiness
+meatless
+meatman
+meatometer
+meatorrhaphy
+meatoscope
+meatoscopy
+meatotome
+meatotomy
+meatus
+meatworks
+meaty
+Mebsuta
+Mecaptera
+mecate
+Mecca
+Meccan
+Meccano
+Meccawee
+Mechael
+mechanal
+mechanality
+mechanalize
+mechanic
+mechanical
+mechanicalism
+mechanicalist
+mechanicality
+mechanicalization
+mechanicalize
+mechanically
+mechanicalness
+mechanician
+mechanicochemical
+mechanicocorpuscular
+mechanicointellectual
+mechanicotherapy
+mechanics
+mechanism
+mechanist
+mechanistic
+mechanistically
+mechanization
+mechanize
+mechanizer
+mechanolater
+mechanology
+mechanomorphic
+mechanomorphism
+mechanotherapeutic
+mechanotherapeutics
+mechanotherapist
+mechanotherapy
+Mechir
+Mechitaristican
+Mechlin
+mechoacan
+meckelectomy
+Meckelian
+Mecklenburgian
+mecodont
+Mecodonta
+mecometer
+mecometry
+mecon
+meconic
+meconidium
+meconin
+meconioid
+meconium
+meconology
+meconophagism
+meconophagist
+Mecoptera
+mecopteran
+mecopteron
+mecopterous
+medal
+medaled
+medalet
+medalist
+medalize
+medallary
+medallic
+medallically
+medallion
+medallionist
+meddle
+meddlecome
+meddlement
+meddler
+meddlesome
+meddlesomely
+meddlesomeness
+meddling
+meddlingly
+Mede
+Medellin
+Medeola
+Media
+media
+mediacid
+mediacy
+mediad
+mediaevalize
+mediaevally
+medial
+medialization
+medialize
+medialkaline
+medially
+Median
+median
+medianic
+medianimic
+medianimity
+medianism
+medianity
+medianly
+mediant
+mediastinal
+mediastine
+mediastinitis
+mediastinotomy
+mediastinum
+mediate
+mediately
+mediateness
+mediating
+mediatingly
+mediation
+mediative
+mediatization
+mediatize
+mediator
+mediatorial
+mediatorialism
+mediatorially
+mediatorship
+mediatory
+mediatress
+mediatrice
+mediatrix
+Medic
+medic
+medicable
+Medicago
+medical
+medically
+medicament
+medicamental
+medicamentally
+medicamentary
+medicamentation
+medicamentous
+medicaster
+medicate
+medication
+medicative
+medicator
+medicatory
+Medicean
+Medici
+medicinable
+medicinableness
+medicinal
+medicinally
+medicinalness
+medicine
+medicinelike
+medicinemonger
+mediciner
+medico
+medicobotanical
+medicochirurgic
+medicochirurgical
+medicodental
+medicolegal
+medicolegally
+medicomania
+medicomechanic
+medicomechanical
+medicomoral
+medicophysical
+medicopsychological
+medicopsychology
+medicostatistic
+medicosurgical
+medicotopographic
+medicozoologic
+mediety
+Medieval
+medieval
+medievalism
+medievalist
+medievalistic
+medievalize
+medievally
+medifixed
+mediglacial
+medimn
+medimno
+medimnos
+medimnus
+Medina
+Medinilla
+medino
+medio
+medioanterior
+mediocarpal
+medioccipital
+mediocre
+mediocrist
+mediocrity
+mediocubital
+mediodepressed
+mediodigital
+mediodorsal
+mediodorsally
+mediofrontal
+mediolateral
+mediopalatal
+mediopalatine
+mediopassive
+mediopectoral
+medioperforate
+mediopontine
+medioposterior
+mediosilicic
+mediostapedial
+mediotarsal
+medioventral
+medisance
+medisect
+medisection
+Medish
+Medism
+meditant
+meditate
+meditating
+meditatingly
+meditation
+meditationist
+meditatist
+meditative
+meditatively
+meditativeness
+meditator
+mediterranean
+Mediterraneanism
+Mediterraneanization
+Mediterraneanize
+mediterraneous
+medithorax
+Meditrinalia
+meditullium
+medium
+mediumism
+mediumistic
+mediumization
+mediumize
+mediumship
+medius
+Medize
+Medizer
+medjidie
+medlar
+medley
+Medoc
+medregal
+medrick
+medrinaque
+medulla
+medullar
+medullary
+medullate
+medullated
+medullation
+medullispinal
+medullitis
+medullization
+medullose
+Medusa
+Medusaean
+medusal
+medusalike
+medusan
+medusiferous
+medusiform
+medusoid
+meebos
+meece
+meed
+meedless
+Meehan
+meek
+meeken
+meekhearted
+meekheartedness
+meekling
+meekly
+meekness
+Meekoceras
+Meeks
+meered
+meerkat
+meerschaum
+meese
+meet
+meetable
+meeten
+meeter
+meeterly
+meethelp
+meethelper
+meeting
+meetinger
+meetinghouse
+meetly
+meetness
+Meg
+megabar
+megacephalia
+megacephalic
+megacephaly
+megacerine
+Megaceros
+megacerotine
+Megachile
+megachilid
+Megachilidae
+Megachiroptera
+megachiropteran
+megachiropterous
+megacolon
+megacosm
+megacoulomb
+megacycle
+megadont
+Megadrili
+megadynamics
+megadyne
+Megaera
+megaerg
+megafarad
+megafog
+megagamete
+megagametophyte
+megajoule
+megakaryocyte
+Megalactractus
+Megaladapis
+Megalaema
+Megalaemidae
+Megalania
+megaleme
+Megalensian
+megalerg
+Megalesia
+Megalesian
+megalesthete
+megalethoscope
+Megalichthyidae
+Megalichthys
+megalith
+megalithic
+Megalobatrachus
+megaloblast
+megaloblastic
+megalocardia
+megalocarpous
+megalocephalia
+megalocephalic
+megalocephalous
+megalocephaly
+Megaloceros
+megalochirous
+megalocornea
+megalocyte
+megalocytosis
+megalodactylia
+megalodactylism
+megalodactylous
+Megalodon
+megalodont
+megalodontia
+Megalodontidae
+megaloenteron
+megalogastria
+megaloglossia
+megalograph
+megalography
+megalohepatia
+megalokaryocyte
+megalomania
+megalomaniac
+megalomaniacal
+megalomelia
+Megalonychidae
+Megalonyx
+megalopa
+megalopenis
+megalophonic
+megalophonous
+megalophthalmus
+megalopia
+megalopic
+Megalopidae
+Megalopinae
+megalopine
+megaloplastocyte
+megalopolis
+megalopolitan
+megalopolitanism
+megalopore
+megalops
+megalopsia
+Megaloptera
+Megalopyge
+Megalopygidae
+Megalornis
+Megalornithidae
+megalosaur
+megalosaurian
+Megalosauridae
+megalosauroid
+Megalosaurus
+megaloscope
+megaloscopy
+megalosphere
+megalospheric
+megalosplenia
+megalosyndactyly
+megaloureter
+Megaluridae
+Megamastictora
+megamastictoral
+megamere
+megameter
+megampere
+Meganeura
+Meganthropus
+meganucleus
+megaparsec
+megaphone
+megaphonic
+megaphotographic
+megaphotography
+megaphyllous
+Megaphyton
+megapod
+megapode
+Megapodidae
+Megapodiidae
+Megapodius
+megaprosopous
+Megaptera
+Megapterinae
+megapterine
+Megarensian
+Megarhinus
+Megarhyssa
+Megarian
+Megarianism
+Megaric
+megaron
+megasclere
+megascleric
+megasclerous
+megasclerum
+megascope
+megascopic
+megascopical
+megascopically
+megaseism
+megaseismic
+megaseme
+Megasoma
+megasporange
+megasporangium
+megaspore
+megasporic
+megasporophyll
+megasynthetic
+megathere
+megatherian
+Megatheriidae
+megatherine
+megatherioid
+Megatherium
+megatherm
+megathermic
+megatheroid
+megaton
+megatype
+megatypy
+megavolt
+megawatt
+megaweber
+megazooid
+megazoospore
+megerg
+Meggy
+megilp
+megmho
+megohm
+megohmit
+megohmmeter
+megophthalmus
+megotalc
+Megrel
+Megrez
+megrim
+megrimish
+mehalla
+mehari
+meharist
+Mehelya
+mehmandar
+Mehrdad
+mehtar
+mehtarship
+Meibomia
+Meibomian
+meile
+mein
+meinie
+meio
+meiobar
+meionite
+meiophylly
+meiosis
+meiotaxy
+meiotic
+Meissa
+Meistersinger
+meith
+Meithei
+meizoseismal
+meizoseismic
+mejorana
+Mekbuda
+Mekhitarist
+mekometer
+mel
+mela
+melaconite
+melada
+meladiorite
+melagabbro
+melagra
+melagranite
+Melaleuca
+melalgia
+melam
+melamed
+melamine
+melampodium
+Melampsora
+Melampsoraceae
+Melampus
+melampyritol
+Melampyrum
+melanagogal
+melanagogue
+melancholia
+melancholiac
+melancholic
+melancholically
+melancholily
+melancholiness
+melancholious
+melancholiously
+melancholiousness
+melancholish
+melancholist
+melancholize
+melancholomaniac
+melancholy
+melancholyish
+Melanchthonian
+Melanconiaceae
+melanconiaceous
+Melanconiales
+Melanconium
+melanemia
+melanemic
+Melanesian
+melange
+melanger
+melangeur
+Melania
+melanian
+melanic
+melaniferous
+Melaniidae
+melanilin
+melaniline
+melanin
+Melanippe
+Melanippus
+melanism
+melanistic
+melanite
+melanitic
+melanize
+melano
+melanoblast
+melanocarcinoma
+melanocerite
+Melanochroi
+Melanochroid
+melanochroite
+melanochroous
+melanocomous
+melanocrate
+melanocratic
+melanocyte
+Melanodendron
+melanoderma
+melanodermia
+melanodermic
+Melanogaster
+melanogen
+Melanoi
+melanoid
+melanoidin
+melanoma
+melanopathia
+melanopathy
+melanophore
+melanoplakia
+Melanoplus
+melanorrhagia
+melanorrhea
+Melanorrhoea
+melanosarcoma
+melanosarcomatosis
+melanoscope
+melanose
+melanosed
+melanosis
+melanosity
+melanospermous
+melanotekite
+melanotic
+melanotrichous
+melanous
+melanterite
+Melanthaceae
+melanthaceous
+Melanthium
+melanure
+melanuresis
+melanuria
+melanuric
+melaphyre
+Melas
+melasma
+melasmic
+melassigenic
+Melastoma
+Melastomaceae
+melastomaceous
+melastomad
+melatope
+melaxuma
+Melburnian
+Melcarth
+melch
+Melchite
+Melchora
+meld
+melder
+meldometer
+meldrop
+mele
+Meleager
+Meleagridae
+Meleagrina
+Meleagrinae
+meleagrine
+Meleagris
+melebiose
+melee
+melena
+melene
+melenic
+Meles
+Meletian
+Meletski
+melezitase
+melezitose
+Melia
+Meliaceae
+meliaceous
+Meliadus
+Melian
+Melianthaceae
+melianthaceous
+Melianthus
+meliatin
+melibiose
+melic
+Melica
+Melicent
+melicera
+meliceric
+meliceris
+melicerous
+Melicerta
+Melicertidae
+melichrous
+melicitose
+Melicocca
+melicraton
+melilite
+melilitite
+melilot
+Melilotus
+Melinae
+Melinda
+meline
+Melinis
+melinite
+Meliola
+meliorability
+meliorable
+meliorant
+meliorate
+meliorater
+melioration
+meliorative
+meliorator
+meliorism
+meliorist
+melioristic
+meliority
+meliphagan
+Meliphagidae
+meliphagidan
+meliphagous
+meliphanite
+Melipona
+Meliponinae
+meliponine
+melisma
+melismatic
+melismatics
+Melissa
+melissyl
+melissylic
+Melitaea
+melitemia
+melithemia
+melitis
+melitose
+melitriose
+melittologist
+melittology
+melituria
+melituric
+mell
+mellaginous
+mellate
+mellay
+melleous
+meller
+Mellifera
+melliferous
+mellificate
+mellification
+mellifluence
+mellifluent
+mellifluently
+mellifluous
+mellifluously
+mellifluousness
+mellimide
+mellisonant
+mellisugent
+mellit
+mellitate
+mellite
+mellitic
+Mellivora
+Mellivorinae
+mellivorous
+mellon
+mellonides
+mellophone
+mellow
+mellowly
+mellowness
+mellowy
+mellsman
+Melocactus
+melocoton
+melodeon
+melodia
+melodial
+melodially
+melodic
+melodica
+melodically
+melodicon
+melodics
+melodiograph
+melodion
+melodious
+melodiously
+melodiousness
+melodism
+melodist
+melodize
+melodizer
+melodram
+melodrama
+melodramatic
+melodramatical
+melodramatically
+melodramaticism
+melodramatics
+melodramatist
+melodramatize
+melodrame
+melody
+melodyless
+meloe
+melogram
+Melogrammataceae
+melograph
+melographic
+meloid
+Meloidae
+melologue
+Melolontha
+Melolonthidae
+melolonthidan
+Melolonthides
+Melolonthinae
+melolonthine
+melomane
+melomania
+melomaniac
+melomanic
+melon
+meloncus
+Melonechinus
+melongena
+melongrower
+melonist
+melonite
+Melonites
+melonlike
+melonmonger
+melonry
+melophone
+melophonic
+melophonist
+melopiano
+meloplast
+meloplastic
+meloplasty
+melopoeia
+melopoeic
+melos
+melosa
+Melospiza
+Melothria
+melotragedy
+melotragic
+melotrope
+melt
+meltability
+meltable
+meltage
+melted
+meltedness
+melteigite
+melter
+melters
+melting
+meltingly
+meltingness
+melton
+Meltonian
+Melungeon
+Melursus
+mem
+member
+membered
+memberless
+membership
+membracid
+Membracidae
+membracine
+membral
+membrally
+membrana
+membranaceous
+membranaceously
+membranate
+membrane
+membraned
+membraneless
+membranelike
+membranelle
+membraneous
+membraniferous
+membraniform
+membranin
+Membranipora
+Membraniporidae
+membranocalcareous
+membranocartilaginous
+membranocoriaceous
+membranocorneous
+membranogenic
+membranoid
+membranology
+membranonervous
+membranosis
+membranous
+membranously
+membranula
+membranule
+membretto
+memento
+meminna
+Memnon
+Memnonian
+Memnonium
+memo
+memoir
+memoirism
+memoirist
+memorabilia
+memorability
+memorable
+memorableness
+memorably
+memoranda
+memorandist
+memorandize
+memorandum
+memorative
+memoria
+memorial
+memorialist
+memorialization
+memorialize
+memorializer
+memorially
+memoried
+memorious
+memorist
+memorizable
+memorization
+memorize
+memorizer
+memory
+memoryless
+Memphian
+Memphite
+men
+menaccanite
+menaccanitic
+menace
+menaceable
+menaceful
+menacement
+menacer
+menacing
+menacingly
+menacme
+menadione
+menage
+menagerie
+menagerist
+menald
+Menangkabau
+menarche
+Menaspis
+mend
+mendable
+mendacious
+mendaciously
+mendaciousness
+mendacity
+Mendaite
+Mende
+mendee
+Mendelian
+Mendelianism
+Mendelianist
+Mendelism
+Mendelist
+Mendelize
+Mendelssohnian
+Mendelssohnic
+mendelyeevite
+mender
+Mendi
+mendicancy
+mendicant
+mendicate
+mendication
+mendicity
+mending
+mendipite
+mendole
+mendozite
+mends
+meneghinite
+menfolk
+Menfra
+meng
+Mengwe
+menhaden
+menhir
+menial
+menialism
+meniality
+menially
+Menic
+menilite
+meningeal
+meninges
+meningic
+meningina
+meningism
+meningitic
+meningitis
+meningocele
+meningocephalitis
+meningocerebritis
+meningococcal
+meningococcemia
+meningococcic
+meningococcus
+meningocortical
+meningoencephalitis
+meningoencephalocele
+meningomalacia
+meningomyclitic
+meningomyelitis
+meningomyelocele
+meningomyelorrhaphy
+meningorachidian
+meningoradicular
+meningorhachidian
+meningorrhagia
+meningorrhea
+meningorrhoea
+meningosis
+meningospinal
+meningotyphoid
+meninting
+meninx
+meniscal
+meniscate
+menisciform
+meniscitis
+meniscoid
+meniscoidal
+Meniscotheriidae
+Meniscotherium
+meniscus
+menisperm
+Menispermaceae
+menispermaceous
+menispermine
+Menispermum
+Menkalinan
+Menkar
+Menkib
+menkind
+mennom
+Mennonist
+Mennonite
+Menobranchidae
+Menobranchus
+menognath
+menognathous
+menologium
+menology
+menometastasis
+Menominee
+menopausal
+menopause
+menopausic
+menophania
+menoplania
+Menopoma
+Menorah
+Menorhyncha
+menorhynchous
+menorrhagia
+menorrhagic
+menorrhagy
+menorrhea
+menorrheic
+menorrhoea
+menorrhoeic
+menoschesis
+menoschetic
+menosepsis
+menostasia
+menostasis
+menostatic
+menostaxis
+Menotyphla
+menotyphlic
+menoxenia
+mensa
+mensal
+mensalize
+mense
+menseful
+menseless
+menses
+Menshevik
+Menshevism
+Menshevist
+mensk
+menstrual
+menstruant
+menstruate
+menstruation
+menstruous
+menstruousness
+menstruum
+mensual
+mensurability
+mensurable
+mensurableness
+mensurably
+mensural
+mensuralist
+mensurate
+mensuration
+mensurational
+mensurative
+Ment
+mentagra
+mental
+mentalis
+mentalism
+mentalist
+mentalistic
+mentality
+mentalization
+mentalize
+mentally
+mentary
+mentation
+Mentha
+Menthaceae
+menthaceous
+menthadiene
+menthane
+menthene
+menthenol
+menthenone
+menthol
+mentholated
+menthone
+menthyl
+menticide
+menticultural
+menticulture
+mentiferous
+mentiform
+mentigerous
+mentimeter
+mentimutation
+mention
+mentionability
+mentionable
+mentionless
+mentoanterior
+mentobregmatic
+mentocondylial
+mentohyoid
+mentolabial
+mentomeckelian
+mentonniere
+mentoposterior
+mentor
+mentorial
+mentorism
+mentorship
+mentum
+Mentzelia
+menu
+Menura
+Menurae
+Menuridae
+meny
+Menyanthaceae
+Menyanthaceous
+Menyanthes
+menyie
+menzie
+Menziesia
+Meo
+Mephisto
+Mephistophelean
+Mephistopheleanly
+Mephistopheles
+Mephistophelic
+Mephistophelistic
+mephitic
+mephitical
+Mephitinae
+mephitine
+mephitis
+mephitism
+Mer
+Merak
+meralgia
+meraline
+Merat
+Meratia
+merbaby
+mercal
+mercantile
+mercantilely
+mercantilism
+mercantilist
+mercantilistic
+mercantility
+mercaptal
+mercaptan
+mercaptides
+mercaptids
+mercapto
+mercaptol
+mercaptole
+Mercator
+Mercatorial
+mercatorial
+Mercedarian
+Mercedes
+Mercedinus
+Mercedonius
+mercenarily
+mercenariness
+mercenary
+mercer
+merceress
+mercerization
+mercerize
+mercerizer
+mercership
+mercery
+merch
+merchandisable
+merchandise
+merchandiser
+merchant
+merchantable
+merchantableness
+merchanter
+merchanthood
+merchantish
+merchantlike
+merchantly
+merchantman
+merchantry
+merchantship
+merchet
+Mercian
+merciful
+mercifully
+mercifulness
+merciless
+mercilessly
+mercilessness
+merciment
+mercurate
+mercuration
+Mercurean
+mercurial
+Mercurialis
+mercurialism
+mercuriality
+mercurialization
+mercurialize
+mercurially
+mercurialness
+mercuriamines
+mercuriammonium
+Mercurian
+mercuriate
+mercuric
+mercuride
+mercurification
+mercurify
+Mercurius
+mercurization
+mercurize
+Mercurochrome
+mercurophen
+mercurous
+Mercury
+mercy
+mercyproof
+merdivorous
+mere
+Meredithian
+merel
+merely
+merenchyma
+merenchymatous
+meresman
+merestone
+meretricious
+meretriciously
+meretriciousness
+meretrix
+merfold
+merfolk
+merganser
+merge
+mergence
+merger
+mergh
+Merginae
+Mergulus
+Mergus
+meriah
+mericarp
+merice
+Merida
+meridian
+Meridion
+Meridionaceae
+Meridional
+meridional
+meridionality
+meridionally
+meril
+meringue
+meringued
+Merino
+Meriones
+meriquinoid
+meriquinoidal
+meriquinone
+meriquinonic
+meriquinonoid
+merism
+merismatic
+merismoid
+merist
+meristele
+meristelic
+meristem
+meristematic
+meristematically
+meristic
+meristically
+meristogenous
+merit
+meritable
+merited
+meritedly
+meriter
+meritful
+meritless
+meritmonger
+meritmongering
+meritmongery
+meritorious
+meritoriously
+meritoriousness
+merk
+merkhet
+merkin
+merl
+merle
+merlette
+merlin
+merlon
+Merlucciidae
+Merluccius
+mermaid
+mermaiden
+merman
+Mermis
+mermithaner
+mermithergate
+Mermithidae
+mermithization
+mermithized
+mermithogyne
+Mermnad
+Mermnadae
+mermother
+mero
+meroblastic
+meroblastically
+merocele
+merocelic
+merocerite
+meroceritic
+merocrystalline
+merocyte
+Merodach
+merogamy
+merogastrula
+merogenesis
+merogenetic
+merogenic
+merognathite
+merogonic
+merogony
+merohedral
+merohedric
+merohedrism
+meroistic
+Meroitic
+meromorphic
+Meromyaria
+meromyarian
+merop
+Merope
+Meropes
+meropia
+Meropidae
+meropidan
+meroplankton
+meroplanktonic
+meropodite
+meropoditic
+Merops
+merorganization
+merorganize
+meros
+merosomal
+Merosomata
+merosomatous
+merosome
+merosthenic
+Merostomata
+merostomatous
+merostome
+merostomous
+merosymmetrical
+merosymmetry
+merosystematic
+merotomize
+merotomy
+merotropism
+merotropy
+Merovingian
+meroxene
+Merozoa
+merozoite
+merpeople
+merribauks
+merribush
+Merril
+merriless
+merrily
+merriment
+merriness
+merrow
+merry
+merrymake
+merrymaker
+merrymaking
+merryman
+merrymeeting
+merrythought
+merrytrotter
+merrywing
+merse
+Mertensia
+Merton
+Merula
+meruline
+merulioid
+Merulius
+merveileux
+merwinite
+merwoman
+Merychippus
+merycism
+merycismus
+Merycoidodon
+Merycoidodontidae
+Merycopotamidae
+Merycopotamus
+Mes
+mesa
+mesabite
+mesaconate
+mesaconic
+mesad
+Mesadenia
+mesadenia
+mesail
+mesal
+mesalike
+mesally
+mesameboid
+mesange
+mesaortitis
+mesaraic
+mesaraical
+mesarch
+mesarteritic
+mesarteritis
+Mesartim
+mesaticephal
+mesaticephali
+mesaticephalic
+mesaticephalism
+mesaticephalous
+mesaticephaly
+mesatipellic
+mesatipelvic
+mesatiskelic
+mesaxonic
+mescal
+Mescalero
+mescaline
+mescalism
+mesdames
+mese
+mesectoderm
+mesem
+Mesembryanthemaceae
+Mesembryanthemum
+mesembryo
+mesembryonic
+mesencephalic
+mesencephalon
+mesenchyma
+mesenchymal
+mesenchymatal
+mesenchymatic
+mesenchymatous
+mesenchyme
+mesendoderm
+mesenna
+mesenterial
+mesenteric
+mesenterical
+mesenterically
+mesenteriform
+mesenteriolum
+mesenteritic
+mesenteritis
+mesenteron
+mesenteronic
+mesentery
+mesentoderm
+mesepimeral
+mesepimeron
+mesepisternal
+mesepisternum
+mesepithelial
+mesepithelium
+mesethmoid
+mesethmoidal
+mesh
+Meshech
+meshed
+meshrabiyeh
+meshwork
+meshy
+mesiad
+mesial
+mesially
+mesian
+mesic
+mesically
+mesilla
+mesiobuccal
+mesiocervical
+mesioclusion
+mesiodistal
+mesiodistally
+mesiogingival
+mesioincisal
+mesiolabial
+mesiolingual
+mesion
+mesioocclusal
+mesiopulpal
+mesioversion
+Mesitae
+Mesites
+Mesitidae
+mesitite
+mesityl
+mesitylene
+mesitylenic
+mesmerian
+mesmeric
+mesmerical
+mesmerically
+mesmerism
+mesmerist
+mesmerite
+mesmerizability
+mesmerizable
+mesmerization
+mesmerize
+mesmerizee
+mesmerizer
+mesmeromania
+mesmeromaniac
+mesnality
+mesnalty
+mesne
+meso
+mesoappendicitis
+mesoappendix
+mesoarial
+mesoarium
+mesobar
+mesobenthos
+mesoblast
+mesoblastema
+mesoblastemic
+mesoblastic
+mesobranchial
+mesobregmate
+mesocaecal
+mesocaecum
+mesocardia
+mesocardium
+mesocarp
+mesocentrous
+mesocephal
+mesocephalic
+mesocephalism
+mesocephalon
+mesocephalous
+mesocephaly
+mesochilium
+mesochondrium
+mesochroic
+mesocoele
+mesocoelian
+mesocoelic
+mesocolic
+mesocolon
+mesocoracoid
+mesocranial
+mesocratic
+mesocuneiform
+mesode
+mesoderm
+mesodermal
+mesodermic
+Mesodesma
+Mesodesmatidae
+Mesodesmidae
+Mesodevonian
+Mesodevonic
+mesodic
+mesodisilicic
+mesodont
+Mesoenatides
+mesofurca
+mesofurcal
+mesogaster
+mesogastral
+mesogastric
+mesogastrium
+mesogloea
+mesogloeal
+mesognathic
+mesognathion
+mesognathism
+mesognathous
+mesognathy
+mesogyrate
+mesohepar
+Mesohippus
+mesokurtic
+mesolabe
+mesole
+mesolecithal
+mesolimnion
+mesolite
+mesolithic
+mesologic
+mesological
+mesology
+mesomere
+mesomeric
+mesomerism
+mesometral
+mesometric
+mesometrium
+mesomorph
+mesomorphic
+mesomorphous
+mesomorphy
+Mesomyodi
+mesomyodian
+mesomyodous
+meson
+mesonasal
+Mesonemertini
+mesonephric
+mesonephridium
+mesonephritic
+mesonephros
+mesonic
+mesonotal
+mesonotum
+Mesonychidae
+Mesonyx
+mesoparapteral
+mesoparapteron
+mesopectus
+mesoperiodic
+mesopetalum
+mesophile
+mesophilic
+mesophilous
+mesophragm
+mesophragma
+mesophragmal
+mesophryon
+mesophyll
+mesophyllous
+mesophyllum
+mesophyte
+mesophytic
+mesophytism
+mesopic
+mesoplankton
+mesoplanktonic
+mesoplast
+mesoplastic
+mesoplastral
+mesoplastron
+mesopleural
+mesopleuron
+Mesoplodon
+mesoplodont
+mesopodial
+mesopodiale
+mesopodium
+mesopotamia
+Mesopotamian
+mesopotamic
+mesoprescutal
+mesoprescutum
+mesoprosopic
+mesopterygial
+mesopterygium
+mesopterygoid
+mesorchial
+mesorchium
+Mesore
+mesorectal
+mesorectum
+Mesoreodon
+mesorrhin
+mesorrhinal
+mesorrhinian
+mesorrhinism
+mesorrhinium
+mesorrhiny
+mesosalpinx
+mesosaur
+Mesosauria
+Mesosaurus
+mesoscapula
+mesoscapular
+mesoscutal
+mesoscutellar
+mesoscutellum
+mesoscutum
+mesoseismal
+mesoseme
+mesosiderite
+mesosigmoid
+mesoskelic
+mesosoma
+mesosomatic
+mesosome
+mesosperm
+mesospore
+mesosporic
+mesosporium
+mesostasis
+mesosternal
+mesosternebra
+mesosternebral
+mesosternum
+mesostethium
+Mesostoma
+Mesostomatidae
+mesostomid
+mesostyle
+mesostylous
+Mesosuchia
+mesosuchian
+Mesotaeniaceae
+Mesotaeniales
+mesotarsal
+mesotartaric
+Mesothelae
+mesothelial
+mesothelium
+mesotherm
+mesothermal
+mesothesis
+mesothet
+mesothetic
+mesothetical
+mesothoracic
+mesothoracotheca
+mesothorax
+mesothorium
+mesotonic
+mesotroch
+mesotrocha
+mesotrochal
+mesotrochous
+mesotron
+mesotropic
+mesotympanic
+mesotype
+mesovarian
+mesovarium
+mesoventral
+mesoventrally
+mesoxalate
+mesoxalic
+mesoxalyl
+Mesozoa
+mesozoan
+Mesozoic
+mespil
+Mespilus
+Mespot
+mesquite
+Mesropian
+mess
+message
+messagery
+Messalian
+messaline
+messan
+Messapian
+messe
+messelite
+messenger
+messengership
+messer
+messet
+Messiah
+Messiahship
+Messianic
+Messianically
+messianically
+Messianism
+Messianist
+Messianize
+Messias
+messieurs
+messily
+messin
+Messines
+Messinese
+messiness
+messing
+messman
+messmate
+messor
+messroom
+messrs
+messtin
+messuage
+messy
+mestee
+mester
+mestiza
+mestizo
+mestome
+Mesua
+Mesvinian
+mesymnion
+met
+meta
+metabasis
+metabasite
+metabatic
+metabiological
+metabiology
+metabiosis
+metabiotic
+metabiotically
+metabismuthic
+metabisulphite
+metabletic
+Metabola
+metabola
+metabole
+Metabolia
+metabolian
+metabolic
+metabolism
+metabolite
+metabolizable
+metabolize
+metabolon
+metabolous
+metaboly
+metaborate
+metaboric
+metabranchial
+metabrushite
+metabular
+metacarpal
+metacarpale
+metacarpophalangeal
+metacarpus
+metacenter
+metacentral
+metacentric
+metacentricity
+metachemic
+metachemistry
+Metachlamydeae
+metachlamydeous
+metachromasis
+metachromatic
+metachromatin
+metachromatinic
+metachromatism
+metachrome
+metachronism
+metachrosis
+metacinnabarite
+metacism
+metacismus
+metaclase
+metacneme
+metacoele
+metacoelia
+metaconal
+metacone
+metaconid
+metaconule
+metacoracoid
+metacrasis
+metacresol
+metacromial
+metacromion
+metacryst
+metacyclic
+metacymene
+metad
+metadiabase
+metadiazine
+metadiorite
+metadiscoidal
+metadromous
+metafluidal
+metaformaldehyde
+metafulminuric
+metagalactic
+metagalaxy
+metagaster
+metagastric
+metagastrula
+metage
+Metageitnion
+metagelatin
+metagenesis
+metagenetic
+metagenetically
+metagenic
+metageometer
+metageometrical
+metageometry
+metagnath
+metagnathism
+metagnathous
+metagnomy
+metagnostic
+metagnosticism
+metagram
+metagrammatism
+metagrammatize
+metagraphic
+metagraphy
+metahewettite
+metahydroxide
+metaigneous
+metainfective
+metakinesis
+metakinetic
+metal
+metalammonium
+metalanguage
+metalbumin
+metalcraft
+metaldehyde
+metalepsis
+metaleptic
+metaleptical
+metaleptically
+metaler
+metaline
+metalined
+metaling
+metalinguistic
+metalinguistics
+metalism
+metalist
+metalization
+metalize
+metallary
+metalleity
+metallic
+metallical
+metallically
+metallicity
+metallicize
+metallicly
+metallics
+metallide
+metallifacture
+metalliferous
+metallification
+metalliform
+metallify
+metallik
+metalline
+metallism
+metallization
+metallize
+metallochrome
+metallochromy
+metallogenetic
+metallogenic
+metallogeny
+metallograph
+metallographer
+metallographic
+metallographical
+metallographist
+metallography
+metalloid
+metalloidal
+metallometer
+metallophone
+metalloplastic
+metallorganic
+metallotherapeutic
+metallotherapy
+metallurgic
+metallurgical
+metallurgically
+metallurgist
+metallurgy
+metalmonger
+metalogic
+metalogical
+metaloph
+metalorganic
+metaloscope
+metaloscopy
+metaluminate
+metaluminic
+metalware
+metalwork
+metalworker
+metalworking
+metalworks
+metamathematical
+metamathematics
+metamer
+metameral
+metamere
+metameric
+metamerically
+metameride
+metamerism
+metamerization
+metamerized
+metamerous
+metamery
+metamorphic
+metamorphism
+metamorphize
+metamorphopsia
+metamorphopsy
+metamorphosable
+metamorphose
+metamorphoser
+metamorphoses
+metamorphosian
+metamorphosic
+metamorphosical
+metamorphosis
+metamorphostical
+metamorphotic
+metamorphous
+metamorphy
+Metamynodon
+metanalysis
+metanauplius
+Metanemertini
+metanephric
+metanephritic
+metanephron
+metanephros
+metanepionic
+metanilic
+metanitroaniline
+metanomen
+metanotal
+metanotum
+metantimonate
+metantimonic
+metantimonious
+metantimonite
+metantimonous
+metanym
+metaorganism
+metaparapteral
+metaparapteron
+metapectic
+metapectus
+metapepsis
+metapeptone
+metaperiodic
+metaphase
+metaphenomenal
+metaphenomenon
+metaphenylene
+metaphenylenediamin
+metaphenylenediamine
+metaphloem
+metaphonical
+metaphonize
+metaphony
+metaphor
+metaphoric
+metaphorical
+metaphorically
+metaphoricalness
+metaphorist
+metaphorize
+metaphosphate
+metaphosphoric
+metaphosphorous
+metaphragm
+metaphragmal
+metaphrase
+metaphrasis
+metaphrast
+metaphrastic
+metaphrastical
+metaphrastically
+metaphyseal
+metaphysic
+metaphysical
+metaphysically
+metaphysician
+metaphysicianism
+metaphysicist
+metaphysicize
+metaphysicous
+metaphysics
+metaphysis
+metaphyte
+metaphytic
+metaphyton
+metaplasia
+metaplasis
+metaplasm
+metaplasmic
+metaplast
+metaplastic
+metapleural
+metapleure
+metapleuron
+metaplumbate
+metaplumbic
+metapneumonic
+metapneustic
+metapodial
+metapodiale
+metapodium
+metapolitic
+metapolitical
+metapolitician
+metapolitics
+metapophyseal
+metapophysial
+metapophysis
+metapore
+metapostscutellar
+metapostscutellum
+metaprescutal
+metaprescutum
+metaprotein
+metapsychic
+metapsychical
+metapsychics
+metapsychism
+metapsychist
+metapsychological
+metapsychology
+metapsychosis
+metapterygial
+metapterygium
+metapterygoid
+metarabic
+metarhyolite
+metarossite
+metarsenic
+metarsenious
+metarsenite
+metasaccharinic
+metascutal
+metascutellar
+metascutellum
+metascutum
+metasedimentary
+metasilicate
+metasilicic
+metasoma
+metasomal
+metasomasis
+metasomatic
+metasomatism
+metasomatosis
+metasome
+metasperm
+Metaspermae
+metaspermic
+metaspermous
+metastability
+metastable
+metastannate
+metastannic
+metastasis
+metastasize
+metastatic
+metastatical
+metastatically
+metasternal
+metasternum
+metasthenic
+metastibnite
+metastigmate
+metastoma
+metastome
+metastrophe
+metastrophic
+metastyle
+metatantalic
+metatarsal
+metatarsale
+metatarse
+metatarsophalangeal
+metatarsus
+metatatic
+metatatically
+metataxic
+metate
+metathalamus
+metatheology
+Metatheria
+metatherian
+metatheses
+metathesis
+metathetic
+metathetical
+metathetically
+metathoracic
+metathorax
+metatitanate
+metatitanic
+metatoluic
+metatoluidine
+metatracheal
+metatrophic
+metatungstic
+metatype
+metatypic
+Metaurus
+metavanadate
+metavanadic
+metavauxite
+metavoltine
+metaxenia
+metaxite
+metaxylem
+metaxylene
+metayer
+Metazoa
+metazoal
+metazoan
+metazoea
+metazoic
+metazoon
+mete
+metel
+metempiric
+metempirical
+metempirically
+metempiricism
+metempiricist
+metempirics
+metempsychic
+metempsychosal
+metempsychose
+metempsychoses
+metempsychosical
+metempsychosis
+metempsychosize
+metemptosis
+metencephalic
+metencephalon
+metensarcosis
+metensomatosis
+metenteron
+metenteronic
+meteogram
+meteograph
+meteor
+meteorgraph
+meteoric
+meteorical
+meteorically
+meteorism
+meteorist
+meteoristic
+meteorital
+meteorite
+meteoritic
+meteoritics
+meteorization
+meteorize
+meteorlike
+meteorogram
+meteorograph
+meteorographic
+meteorography
+meteoroid
+meteoroidal
+meteorolite
+meteorolitic
+meteorologic
+meteorological
+meteorologically
+meteorologist
+meteorology
+meteorometer
+meteoroscope
+meteoroscopy
+meteorous
+metepencephalic
+metepencephalon
+metepimeral
+metepimeron
+metepisternal
+metepisternum
+meter
+meterage
+metergram
+meterless
+meterman
+metership
+metestick
+metewand
+meteyard
+methacrylate
+methacrylic
+methadone
+methanal
+methanate
+methane
+methanoic
+methanolysis
+methanometer
+metheglin
+methemoglobin
+methemoglobinemia
+methemoglobinuria
+methenamine
+methene
+methenyl
+mether
+methid
+methide
+methine
+methinks
+methiodide
+methionic
+methionine
+methobromide
+method
+methodaster
+methodeutic
+methodic
+methodical
+methodically
+methodicalness
+methodics
+methodism
+Methodist
+methodist
+Methodistic
+Methodistically
+Methodisty
+methodization
+Methodize
+methodize
+methodizer
+methodless
+methodological
+methodologically
+methodologist
+methodology
+Methody
+methought
+methoxide
+methoxychlor
+methoxyl
+methronic
+Methuselah
+methyl
+methylacetanilide
+methylal
+methylamine
+methylaniline
+methylanthracene
+methylate
+methylation
+methylator
+methylcholanthrene
+methylene
+methylenimine
+methylenitan
+methylethylacetic
+methylglycine
+methylglycocoll
+methylglyoxal
+methylic
+methylmalonic
+methylnaphthalene
+methylol
+methylolurea
+methylosis
+methylotic
+methylpentose
+methylpentoses
+methylpropane
+methylsulfanol
+metic
+meticulosity
+meticulous
+meticulously
+meticulousness
+metier
+Metin
+metis
+Metoac
+metochous
+metochy
+metoestrous
+metoestrum
+Metol
+metonym
+metonymic
+metonymical
+metonymically
+metonymous
+metonymously
+metonymy
+metope
+Metopias
+metopic
+metopion
+metopism
+Metopoceros
+metopomancy
+metopon
+metoposcopic
+metoposcopical
+metoposcopist
+metoposcopy
+metosteal
+metosteon
+metoxazine
+metoxenous
+metoxeny
+metra
+metralgia
+metranate
+metranemia
+metratonia
+Metrazol
+metrectasia
+metrectatic
+metrectomy
+metrectopia
+metrectopic
+metrectopy
+metreless
+metreship
+metreta
+metrete
+metretes
+metria
+metric
+metrical
+metrically
+metrician
+metricism
+metricist
+metricize
+metrics
+Metridium
+metrification
+metrifier
+metrify
+metriocephalic
+metrist
+metritis
+metrocampsis
+metrocarat
+metrocarcinoma
+metrocele
+metroclyst
+metrocolpocele
+metrocracy
+metrocratic
+metrocystosis
+metrodynia
+metrofibroma
+metrological
+metrologist
+metrologue
+metrology
+metrolymphangitis
+metromalacia
+metromalacoma
+metromalacosis
+metromania
+metromaniac
+metromaniacal
+metrometer
+metroneuria
+metronome
+metronomic
+metronomical
+metronomically
+metronymic
+metronymy
+metroparalysis
+metropathia
+metropathic
+metropathy
+metroperitonitis
+metrophlebitis
+metrophotography
+metropole
+metropolis
+metropolitan
+metropolitanate
+metropolitancy
+metropolitanism
+metropolitanize
+metropolitanship
+metropolite
+metropolitic
+metropolitical
+metropolitically
+metroptosia
+metroptosis
+metroradioscope
+metrorrhagia
+metrorrhagic
+metrorrhea
+metrorrhexis
+metrorthosis
+metrosalpingitis
+metrosalpinx
+metroscirrhus
+metroscope
+metroscopy
+Metrosideros
+metrostaxis
+metrostenosis
+metrosteresis
+metrostyle
+metrosynizesis
+metrotherapist
+metrotherapy
+metrotome
+metrotomy
+Metroxylon
+mettar
+mettle
+mettled
+mettlesome
+mettlesomely
+mettlesomeness
+metusia
+metze
+Meum
+meuse
+meute
+Mev
+mew
+meward
+mewer
+mewl
+mewler
+Mexica
+Mexican
+Mexicanize
+Mexitl
+Mexitli
+meyerhofferite
+mezcal
+Mezentian
+Mezentism
+Mezentius
+mezereon
+mezereum
+mezuzah
+mezzanine
+mezzo
+mezzograph
+mezzotint
+mezzotinter
+mezzotinto
+mho
+mhometer
+mi
+Miami
+miamia
+mian
+Miao
+Miaotse
+Miaotze
+miaow
+miaower
+Miaplacidus
+miargyrite
+miarolitic
+mias
+miaskite
+miasm
+miasma
+miasmal
+miasmata
+miasmatic
+miasmatical
+miasmatically
+miasmatize
+miasmatology
+miasmatous
+miasmic
+miasmology
+miasmous
+Miastor
+miaul
+miauler
+mib
+mica
+micaceous
+micacious
+micacite
+Micah
+micasization
+micasize
+micate
+mication
+Micawberish
+Micawberism
+mice
+micellar
+micelle
+Michabo
+Michabou
+Michael
+Michaelites
+Michaelmas
+Michaelmastide
+miche
+Micheal
+Michel
+Michelangelesque
+Michelangelism
+Michelia
+Michelle
+micher
+Michiel
+Michigamea
+Michigan
+michigan
+Michigander
+Michiganite
+miching
+Michoacan
+Michoacano
+micht
+Mick
+mick
+Mickey
+mickle
+Micky
+Micmac
+mico
+miconcave
+Miconia
+micramock
+Micrampelis
+micranatomy
+micrander
+micrandrous
+micraner
+micranthropos
+Micraster
+micrencephalia
+micrencephalic
+micrencephalous
+micrencephalus
+micrencephaly
+micrergate
+micresthete
+micrify
+micro
+microammeter
+microampere
+microanalysis
+microanalyst
+microanalytical
+microangstrom
+microapparatus
+microbal
+microbalance
+microbar
+microbarograph
+microbattery
+microbe
+microbeless
+microbeproof
+microbial
+microbian
+microbic
+microbicidal
+microbicide
+microbiologic
+microbiological
+microbiologically
+microbiologist
+microbiology
+microbion
+microbiosis
+microbiota
+microbiotic
+microbious
+microbism
+microbium
+microblast
+microblepharia
+microblepharism
+microblephary
+microbrachia
+microbrachius
+microburet
+microburette
+microburner
+microcaltrop
+microcardia
+microcardius
+microcarpous
+Microcebus
+microcellular
+microcentrosome
+microcentrum
+microcephal
+microcephalia
+microcephalic
+microcephalism
+microcephalous
+microcephalus
+microcephaly
+microceratous
+microchaeta
+microcharacter
+microcheilia
+microcheiria
+microchemic
+microchemical
+microchemically
+microchemistry
+microchiria
+Microchiroptera
+microchiropteran
+microchiropterous
+microchromosome
+microchronometer
+microcinema
+microcinematograph
+microcinematographic
+microcinematography
+Microcitrus
+microclastic
+microclimate
+microclimatic
+microclimatologic
+microclimatological
+microclimatology
+microcline
+microcnemia
+microcoat
+micrococcal
+Micrococceae
+Micrococcus
+microcoleoptera
+microcolon
+microcolorimeter
+microcolorimetric
+microcolorimetrically
+microcolorimetry
+microcolumnar
+microcombustion
+microconidial
+microconidium
+microconjugant
+Microconodon
+microconstituent
+microcopy
+microcoria
+microcosm
+microcosmal
+microcosmian
+microcosmic
+microcosmical
+microcosmography
+microcosmology
+microcosmos
+microcosmus
+microcoulomb
+microcranous
+microcrith
+microcryptocrystalline
+microcrystal
+microcrystalline
+microcrystallogeny
+microcrystallography
+microcrystalloscopy
+microcurie
+Microcyprini
+microcyst
+microcyte
+microcythemia
+microcytosis
+microdactylia
+microdactylism
+microdactylous
+microdentism
+microdentous
+microdetection
+microdetector
+microdetermination
+microdiactine
+microdissection
+microdistillation
+microdont
+microdontism
+microdontous
+microdose
+microdrawing
+Microdrili
+microdrive
+microelectrode
+microelectrolysis
+microelectroscope
+microelement
+microerg
+microestimation
+microeutaxitic
+microevolution
+microexamination
+microfarad
+microfauna
+microfelsite
+microfelsitic
+microfilaria
+microfilm
+microflora
+microfluidal
+microfoliation
+microfossil
+microfungus
+microfurnace
+Microgadus
+microgalvanometer
+microgamete
+microgametocyte
+microgametophyte
+microgamy
+Microgaster
+microgastria
+Microgastrinae
+microgastrine
+microgeological
+microgeologist
+microgeology
+microgilbert
+microglia
+microglossia
+micrognathia
+micrognathic
+micrognathous
+microgonidial
+microgonidium
+microgram
+microgramme
+microgranite
+microgranitic
+microgranitoid
+microgranular
+microgranulitic
+micrograph
+micrographer
+micrographic
+micrographical
+micrographically
+micrographist
+micrography
+micrograver
+microgravimetric
+microgroove
+microgyne
+microgyria
+microhenry
+microhepatia
+microhistochemical
+microhistology
+microhm
+microhmmeter
+Microhymenoptera
+microhymenopteron
+microinjection
+microjoule
+microlepidopter
+microlepidoptera
+microlepidopteran
+microlepidopterist
+microlepidopteron
+microlepidopterous
+microleukoblast
+microlevel
+microlite
+microliter
+microlith
+microlithic
+microlitic
+micrologic
+micrological
+micrologically
+micrologist
+micrologue
+micrology
+microlux
+micromania
+micromaniac
+micromanipulation
+micromanipulator
+micromanometer
+Micromastictora
+micromazia
+micromeasurement
+micromechanics
+micromelia
+micromelic
+micromelus
+micromembrane
+micromeral
+micromere
+Micromeria
+micromeric
+micromerism
+micromeritic
+micromeritics
+micromesentery
+micrometallographer
+micrometallography
+micrometallurgy
+micrometer
+micromethod
+micrometrical
+micrometrically
+micrometry
+micromicrofarad
+micromicron
+micromil
+micromillimeter
+micromineralogical
+micromineralogy
+micromorph
+micromotion
+micromotoscope
+micromyelia
+micromyeloblast
+micron
+Micronesian
+micronization
+micronize
+micronometer
+micronuclear
+micronucleus
+micronutrient
+microorganic
+microorganism
+microorganismal
+micropaleontology
+micropantograph
+microparasite
+microparasitic
+micropathological
+micropathologist
+micropathology
+micropegmatite
+micropegmatitic
+micropenis
+microperthite
+microperthitic
+micropetalous
+micropetrography
+micropetrologist
+micropetrology
+microphage
+microphagocyte
+microphagous
+microphagy
+microphakia
+microphallus
+microphone
+microphonic
+microphonics
+microphonograph
+microphot
+microphotograph
+microphotographic
+microphotography
+microphotometer
+microphotoscope
+microphthalmia
+microphthalmic
+microphthalmos
+microphthalmus
+microphyllous
+microphysical
+microphysics
+microphysiography
+microphytal
+microphyte
+microphytic
+microphytology
+micropia
+micropin
+micropipette
+microplakite
+microplankton
+microplastocyte
+microplastometer
+micropodal
+Micropodi
+micropodia
+Micropodidae
+Micropodiformes
+micropoecilitic
+micropoicilitic
+micropoikilitic
+micropolariscope
+micropolarization
+micropore
+microporosity
+microporous
+microporphyritic
+microprint
+microprojector
+micropsia
+micropsy
+micropterism
+micropterous
+Micropterus
+micropterygid
+Micropterygidae
+micropterygious
+Micropterygoidea
+Micropteryx
+Micropus
+micropylar
+micropyle
+micropyrometer
+microradiometer
+microreaction
+microrefractometer
+microrhabdus
+microrheometer
+microrheometric
+microrheometrical
+Microrhopias
+Microsauria
+microsaurian
+microsclere
+microsclerous
+microsclerum
+microscopal
+microscope
+microscopial
+microscopic
+microscopical
+microscopically
+microscopics
+Microscopid
+microscopist
+Microscopium
+microscopize
+microscopy
+microsecond
+microsection
+microseism
+microseismic
+microseismical
+microseismograph
+microseismology
+microseismometer
+microseismometrograph
+microseismometry
+microseme
+microseptum
+microsmatic
+microsmatism
+microsoma
+microsomatous
+microsome
+microsomia
+microsommite
+Microsorex
+microspecies
+microspectroscope
+microspectroscopic
+microspectroscopy
+Microspermae
+microspermous
+Microsphaera
+microsphaeric
+microsphere
+microspheric
+microspherulitic
+microsplanchnic
+microsplenia
+microsplenic
+microsporange
+microsporangium
+microspore
+microsporiasis
+microsporic
+Microsporidia
+microsporidian
+Microsporon
+microsporophore
+microsporophyll
+microsporosis
+microsporous
+Microsporum
+microstat
+microsthene
+Microsthenes
+microsthenic
+microstomatous
+microstome
+microstomia
+microstomous
+microstructural
+microstructure
+Microstylis
+microstylospore
+microstylous
+microsublimation
+microtasimeter
+microtechnic
+microtechnique
+microtelephone
+microtelephonic
+Microthelyphonida
+microtheos
+microtherm
+microthermic
+microthorax
+Microthyriaceae
+microtia
+Microtinae
+microtine
+microtitration
+microtome
+microtomic
+microtomical
+microtomist
+microtomy
+microtone
+Microtus
+microtypal
+microtype
+microtypical
+microvolt
+microvolume
+microvolumetric
+microwatt
+microwave
+microweber
+microzoa
+microzoal
+microzoan
+microzoaria
+microzoarian
+microzoary
+microzoic
+microzone
+microzooid
+microzoology
+microzoon
+microzoospore
+microzyma
+microzyme
+microzymian
+micrurgic
+micrurgical
+micrurgist
+micrurgy
+Micrurus
+miction
+micturate
+micturition
+mid
+midafternoon
+midautumn
+midaxillary
+midbrain
+midday
+midden
+middenstead
+middle
+middlebreaker
+middlebuster
+middleman
+middlemanism
+middlemanship
+middlemost
+middler
+middlesplitter
+middlewards
+middleway
+middleweight
+middlewoman
+middling
+middlingish
+middlingly
+middlingness
+middlings
+middorsal
+middy
+mide
+Mider
+midevening
+midewiwin
+midfacial
+midforenoon
+midfrontal
+midge
+midget
+midgety
+midgy
+midheaven
+Midianite
+Midianitish
+Mididae
+midiron
+midland
+Midlander
+Midlandize
+midlandward
+midlatitude
+midleg
+midlenting
+midmain
+midmandibular
+midmonth
+midmonthly
+midmorn
+midmorning
+midmost
+midnight
+midnightly
+midnoon
+midparent
+midparentage
+midparental
+midpit
+midrange
+midrash
+midrashic
+midrib
+midribbed
+midriff
+mids
+midseason
+midsentence
+midship
+midshipman
+midshipmanship
+midshipmite
+midships
+midspace
+midst
+midstory
+midstout
+midstream
+midstreet
+midstroke
+midstyled
+midsummer
+midsummerish
+midsummery
+midtap
+midvein
+midverse
+midward
+midwatch
+midway
+midweek
+midweekly
+Midwest
+Midwestern
+Midwesterner
+midwestward
+midwife
+midwifery
+midwinter
+midwinterly
+midwintry
+midwise
+midyear
+Miek
+mien
+miersite
+Miescherian
+miff
+miffiness
+miffy
+mig
+might
+mightily
+mightiness
+mightless
+mightnt
+mighty
+mightyhearted
+mightyship
+miglio
+migmatite
+migniardise
+mignon
+mignonette
+mignonne
+mignonness
+Migonitis
+migraine
+migrainoid
+migrainous
+migrant
+migrate
+migration
+migrational
+migrationist
+migrative
+migrator
+migratorial
+migratory
+Miguel
+miharaite
+mihrab
+mijakite
+mijl
+mikado
+mikadoate
+mikadoism
+Mikael
+Mikania
+Mikasuki
+Mike
+mike
+Mikey
+Miki
+mikie
+Mikir
+Mil
+mil
+mila
+milady
+milammeter
+Milan
+Milanese
+Milanion
+milarite
+milch
+milcher
+milchy
+mild
+milden
+milder
+mildew
+mildewer
+mildewy
+mildhearted
+mildheartedness
+mildish
+mildly
+mildness
+Mildred
+mile
+mileage
+Miledh
+milepost
+miler
+Miles
+Milesian
+milesima
+Milesius
+milestone
+mileway
+milfoil
+milha
+miliaceous
+miliarensis
+miliaria
+miliarium
+miliary
+Milicent
+milieu
+Miliola
+milioliform
+milioline
+miliolite
+miliolitic
+militancy
+militant
+militantly
+militantness
+militarily
+militariness
+militarism
+militarist
+militaristic
+militaristically
+militarization
+militarize
+military
+militaryism
+militaryment
+militaster
+militate
+militation
+militia
+militiaman
+militiate
+milium
+milk
+milkbush
+milken
+milker
+milkeress
+milkfish
+milkgrass
+milkhouse
+milkily
+milkiness
+milking
+milkless
+milklike
+milkmaid
+milkman
+milkness
+milkshed
+milkshop
+milksick
+milksop
+milksopism
+milksoppery
+milksopping
+milksoppish
+milksoppy
+milkstone
+milkweed
+milkwood
+milkwort
+milky
+mill
+Milla
+milla
+millable
+millage
+millboard
+millclapper
+millcourse
+milldam
+mille
+milled
+millefiori
+milleflorous
+millefoliate
+millenarian
+millenarianism
+millenarist
+millenary
+millennia
+millennial
+millennialism
+millennialist
+millennially
+millennian
+millenniarism
+millenniary
+millennium
+millepede
+Millepora
+millepore
+milleporiform
+milleporine
+milleporite
+milleporous
+millepunctate
+miller
+milleress
+millering
+Millerism
+Millerite
+millerite
+millerole
+millesimal
+millesimally
+millet
+Millettia
+millfeed
+millful
+millhouse
+milliad
+milliammeter
+milliamp
+milliampere
+milliamperemeter
+milliangstrom
+milliard
+milliardaire
+milliare
+milliarium
+milliary
+millibar
+millicron
+millicurie
+Millie
+millieme
+milliequivalent
+millifarad
+millifold
+milliform
+milligal
+milligrade
+milligram
+milligramage
+millihenry
+millilambert
+millile
+milliliter
+millilux
+millimeter
+millimicron
+millimolar
+millimole
+millincost
+milline
+milliner
+millinerial
+millinering
+millinery
+milling
+Millingtonia
+millinormal
+millinormality
+millioctave
+millioersted
+million
+millionaire
+millionairedom
+millionairess
+millionairish
+millionairism
+millionary
+millioned
+millioner
+millionfold
+millionism
+millionist
+millionize
+millionocracy
+millions
+millionth
+milliphot
+millipoise
+millisecond
+millistere
+Millite
+millithrum
+millivolt
+millivoltmeter
+millman
+millocracy
+millocrat
+millocratism
+millosevichite
+millowner
+millpond
+millpool
+millpost
+millrace
+millrynd
+millsite
+millstock
+millstone
+millstream
+milltail
+millward
+millwork
+millworker
+millwright
+millwrighting
+Milly
+Milner
+milner
+Milo
+milo
+milord
+milpa
+milreis
+milsey
+milsie
+milt
+milter
+miltlike
+Miltonia
+Miltonian
+Miltonic
+Miltonically
+Miltonism
+Miltonist
+Miltonize
+Miltos
+miltsick
+miltwaste
+milty
+Milvago
+Milvinae
+milvine
+milvinous
+Milvus
+milzbrand
+mim
+mima
+mimbar
+mimble
+Mimbreno
+Mime
+mime
+mimeo
+mimeograph
+mimeographic
+mimeographically
+mimeographist
+mimer
+mimesis
+mimester
+mimetene
+mimetesite
+mimetic
+mimetical
+mimetically
+mimetism
+mimetite
+Mimi
+mimiambi
+mimiambic
+mimiambics
+mimic
+mimical
+mimically
+mimicism
+mimicker
+mimicry
+Mimidae
+Miminae
+mimine
+miminypiminy
+mimly
+mimmation
+mimmest
+mimmock
+mimmocking
+mimmocky
+mimmood
+mimmoud
+mimmouthed
+mimmouthedness
+mimodrama
+mimographer
+mimography
+mimologist
+Mimosa
+Mimosaceae
+mimosaceous
+mimosis
+mimosite
+mimotype
+mimotypic
+mimp
+Mimpei
+mimsey
+Mimulus
+Mimus
+Mimusops
+min
+Mina
+mina
+minable
+minacious
+minaciously
+minaciousness
+minacity
+Minaean
+Minahassa
+Minahassan
+Minahassian
+minar
+minaret
+minareted
+minargent
+minasragrite
+minatorial
+minatorially
+minatorily
+minatory
+minaway
+mince
+mincemeat
+mincer
+minchery
+minchiate
+mincing
+mincingly
+mincingness
+Mincopi
+Mincopie
+mind
+minded
+Mindel
+Mindelian
+minder
+Mindererus
+mindful
+mindfully
+mindfulness
+minding
+mindless
+mindlessly
+mindlessness
+mindsight
+mine
+mineowner
+miner
+mineragraphic
+mineragraphy
+mineraiogic
+mineral
+mineralizable
+mineralization
+mineralize
+mineralizer
+mineralogical
+mineralogically
+mineralogist
+mineralogize
+mineralogy
+Minerva
+minerval
+Minervan
+Minervic
+minery
+mines
+minette
+mineworker
+Ming
+ming
+minge
+mingelen
+mingle
+mingleable
+mingledly
+minglement
+mingler
+minglingly
+Mingo
+Mingrelian
+minguetite
+mingwort
+mingy
+minhag
+minhah
+miniaceous
+miniate
+miniator
+miniature
+miniaturist
+minibus
+minicam
+minicamera
+Miniconjou
+minienize
+minification
+minify
+minikin
+minikinly
+minim
+minima
+minimacid
+minimal
+minimalism
+Minimalist
+minimalkaline
+minimally
+minimetric
+minimifidian
+minimifidianism
+minimism
+minimistic
+Minimite
+minimitude
+minimization
+minimize
+minimizer
+minimum
+minimus
+minimuscular
+mining
+minion
+minionette
+minionism
+minionly
+minionship
+minish
+minisher
+minishment
+minister
+ministeriable
+ministerial
+ministerialism
+ministerialist
+ministeriality
+ministerially
+ministerialness
+ministerium
+ministership
+ministrable
+ministrant
+ministration
+ministrative
+ministrator
+ministrer
+ministress
+ministry
+ministryship
+minitant
+Minitari
+minium
+miniver
+minivet
+mink
+minkery
+minkish
+Minkopi
+Minnehaha
+minnesinger
+minnesong
+Minnesotan
+Minnetaree
+Minnie
+minnie
+minniebush
+minning
+minnow
+minny
+mino
+Minoan
+minoize
+minometer
+minor
+minorage
+minorate
+minoration
+Minorca
+Minorcan
+Minoress
+minoress
+Minorist
+Minorite
+minority
+minorship
+Minos
+minot
+Minotaur
+Minseito
+minsitive
+minster
+minsteryard
+minstrel
+minstreless
+minstrelship
+minstrelsy
+mint
+mintage
+Mintaka
+mintbush
+minter
+mintmaker
+mintmaking
+mintman
+mintmaster
+minty
+minuend
+minuet
+minuetic
+minuetish
+minus
+minuscular
+minuscule
+minutary
+minutation
+minute
+minutely
+minuteman
+minuteness
+minuter
+minuthesis
+minutia
+minutiae
+minutial
+minutiose
+minutiously
+minutissimic
+minverite
+minx
+minxish
+minxishly
+minxishness
+minxship
+miny
+Minyadidae
+Minyae
+Minyan
+minyan
+Minyas
+miocardia
+Miocene
+Miocenic
+Miohippus
+miolithic
+mioplasmia
+miothermic
+miqra
+miquelet
+mir
+Mira
+Mirabel
+Mirabell
+mirabiliary
+Mirabilis
+mirabilite
+Mirac
+Mirach
+mirach
+miracidial
+miracidium
+miracle
+miraclemonger
+miraclemongering
+miraclist
+miraculist
+miraculize
+miraculosity
+miraculous
+miraculously
+miraculousness
+mirador
+mirage
+miragy
+Mirak
+Miramolin
+Mirana
+Miranda
+mirandous
+Miranha
+Miranhan
+mirate
+mirbane
+mird
+mirdaha
+mire
+mirepoix
+Mirfak
+Miriam
+Miriamne
+mirid
+Miridae
+mirific
+miriness
+mirish
+mirk
+mirkiness
+mirksome
+mirliton
+Miro
+miro
+Mirounga
+mirror
+mirrored
+mirrorize
+mirrorlike
+mirrorscope
+mirrory
+mirth
+mirthful
+mirthfully
+mirthfulness
+mirthless
+mirthlessly
+mirthlessness
+mirthsome
+mirthsomeness
+miry
+miryachit
+mirza
+misaccent
+misaccentuation
+misachievement
+misacknowledge
+misact
+misadapt
+misadaptation
+misadd
+misaddress
+misadjust
+misadmeasurement
+misadministration
+misadvantage
+misadventure
+misadventurer
+misadventurous
+misadventurously
+misadvertence
+misadvice
+misadvise
+misadvised
+misadvisedly
+misadvisedness
+misaffected
+misaffection
+misaffirm
+misagent
+misaim
+misalienate
+misalignment
+misallegation
+misallege
+misalliance
+misallotment
+misallowance
+misally
+misalphabetize
+misalter
+misanalyze
+misandry
+misanswer
+misanthrope
+misanthropia
+misanthropic
+misanthropical
+misanthropically
+misanthropism
+misanthropist
+misanthropize
+misanthropy
+misapparel
+misappear
+misappearance
+misappellation
+misapplication
+misapplier
+misapply
+misappoint
+misappointment
+misappraise
+misappraisement
+misappreciate
+misappreciation
+misappreciative
+misapprehend
+misapprehendingly
+misapprehensible
+misapprehension
+misapprehensive
+misapprehensively
+misapprehensiveness
+misappropriate
+misappropriately
+misappropriation
+misarchism
+misarchist
+misarrange
+misarrangement
+misarray
+misascribe
+misascription
+misasperse
+misassay
+misassent
+misassert
+misassign
+misassociate
+misassociation
+misatone
+misattend
+misattribute
+misattribution
+misaunter
+misauthorization
+misauthorize
+misaward
+misbandage
+misbaptize
+misbecome
+misbecoming
+misbecomingly
+misbecomingness
+misbefitting
+misbeget
+misbegin
+misbegotten
+misbehave
+misbehavior
+misbeholden
+misbelief
+misbelieve
+misbeliever
+misbelievingly
+misbelove
+misbeseem
+misbestow
+misbestowal
+misbetide
+misbias
+misbill
+misbind
+misbirth
+misbode
+misborn
+misbrand
+misbuild
+misbusy
+miscalculate
+miscalculation
+miscalculator
+miscall
+miscaller
+miscanonize
+miscarriage
+miscarriageable
+miscarry
+miscast
+miscasualty
+misceability
+miscegenate
+miscegenation
+miscegenationist
+miscegenator
+miscegenetic
+miscegine
+miscellanarian
+miscellanea
+miscellaneity
+miscellaneous
+miscellaneously
+miscellaneousness
+miscellanist
+miscellany
+mischallenge
+mischance
+mischanceful
+mischancy
+mischaracterization
+mischaracterize
+mischarge
+mischief
+mischiefful
+mischieve
+mischievous
+mischievously
+mischievousness
+mischio
+mischoice
+mischoose
+mischristen
+miscibility
+miscible
+miscipher
+misclaim
+misclaiming
+misclass
+misclassification
+misclassify
+miscognizant
+miscoin
+miscoinage
+miscollocation
+miscolor
+miscoloration
+miscommand
+miscommit
+miscommunicate
+miscompare
+miscomplacence
+miscomplain
+miscomplaint
+miscompose
+miscomprehend
+miscomprehension
+miscomputation
+miscompute
+misconceive
+misconceiver
+misconception
+misconclusion
+miscondition
+misconduct
+misconfer
+misconfidence
+misconfident
+misconfiguration
+misconjecture
+misconjugate
+misconjugation
+misconjunction
+misconsecrate
+misconsequence
+misconstitutional
+misconstruable
+misconstruct
+misconstruction
+misconstructive
+misconstrue
+misconstruer
+miscontinuance
+misconvenient
+misconvey
+miscook
+miscookery
+miscorrect
+miscorrection
+miscounsel
+miscount
+miscovet
+miscreancy
+miscreant
+miscreate
+miscreation
+miscreative
+miscreator
+miscredited
+miscredulity
+miscreed
+miscript
+miscrop
+miscue
+miscultivated
+misculture
+miscurvature
+miscut
+misdate
+misdateful
+misdaub
+misdeal
+misdealer
+misdecide
+misdecision
+misdeclaration
+misdeclare
+misdeed
+misdeem
+misdeemful
+misdefine
+misdeformed
+misdeliver
+misdelivery
+misdemean
+misdemeanant
+misdemeanist
+misdemeanor
+misdentition
+misderivation
+misderive
+misdescribe
+misdescriber
+misdescription
+misdescriptive
+misdesire
+misdetermine
+misdevise
+misdevoted
+misdevotion
+misdiet
+misdirect
+misdirection
+misdispose
+misdisposition
+misdistinguish
+misdistribute
+misdistribution
+misdivide
+misdivision
+misdo
+misdoer
+misdoing
+misdoubt
+misdower
+misdraw
+misdread
+misdrive
+mise
+misease
+misecclesiastic
+misedit
+miseducate
+miseducation
+miseducative
+miseffect
+misemphasis
+misemphasize
+misemploy
+misemployment
+misencourage
+misendeavor
+misenforce
+misengrave
+misenite
+misenjoy
+misenroll
+misentitle
+misenunciation
+Misenus
+miser
+miserabilism
+miserabilist
+miserabilistic
+miserability
+miserable
+miserableness
+miserably
+miserdom
+miserected
+Miserere
+miserhood
+misericord
+Misericordia
+miserism
+miserliness
+miserly
+misery
+misesteem
+misestimate
+misestimation
+misexample
+misexecute
+misexecution
+misexpectation
+misexpend
+misexpenditure
+misexplain
+misexplanation
+misexplication
+misexposition
+misexpound
+misexpress
+misexpression
+misexpressive
+misfaith
+misfare
+misfashion
+misfather
+misfault
+misfeasance
+misfeasor
+misfeature
+misfield
+misfigure
+misfile
+misfire
+misfit
+misfond
+misform
+misformation
+misfortunate
+misfortunately
+misfortune
+misfortuned
+misfortuner
+misframe
+misgauge
+misgesture
+misgive
+misgiving
+misgivingly
+misgo
+misgotten
+misgovern
+misgovernance
+misgovernment
+misgovernor
+misgracious
+misgraft
+misgrave
+misground
+misgrow
+misgrown
+misgrowth
+misguess
+misguggle
+misguidance
+misguide
+misguided
+misguidedly
+misguidedness
+misguider
+misguiding
+misguidingly
+mishandle
+mishap
+mishappen
+Mishikhwutmetunne
+mishmash
+mishmee
+Mishmi
+Mishnah
+Mishnaic
+Mishnic
+Mishnical
+Mishongnovi
+misidentification
+misidentify
+Misima
+misimagination
+misimagine
+misimpression
+misimprove
+misimprovement
+misimputation
+misimpute
+misincensed
+misincite
+misinclination
+misincline
+misinfer
+misinference
+misinflame
+misinform
+misinformant
+misinformation
+misinformer
+misingenuity
+misinspired
+misinstruct
+misinstruction
+misinstructive
+misintelligence
+misintelligible
+misintend
+misintention
+misinter
+misinterment
+misinterpret
+misinterpretable
+misinterpretation
+misinterpreter
+misintimation
+misjoin
+misjoinder
+misjudge
+misjudgement
+misjudger
+misjudgingly
+misjudgment
+miskeep
+misken
+miskenning
+miskill
+miskindle
+misknow
+misknowledge
+misky
+mislabel
+mislabor
+mislanguage
+mislay
+mislayer
+mislead
+misleadable
+misleader
+misleading
+misleadingly
+misleadingness
+mislear
+misleared
+mislearn
+misled
+mislest
+mislight
+mislike
+misliken
+mislikeness
+misliker
+mislikingly
+mislippen
+mislive
+mislocate
+mislocation
+mislodge
+mismade
+mismake
+mismanage
+mismanageable
+mismanagement
+mismanager
+mismarriage
+mismarry
+mismatch
+mismatchment
+mismate
+mismeasure
+mismeasurement
+mismenstruation
+misminded
+mismingle
+mismotion
+mismove
+misname
+misnarrate
+misnatured
+misnavigation
+Misniac
+misnomed
+misnomer
+misnumber
+misnurture
+misnutrition
+misobedience
+misobey
+misobservance
+misobserve
+misocapnic
+misocapnist
+misocatholic
+misoccupy
+misogallic
+misogamic
+misogamist
+misogamy
+misogyne
+misogynic
+misogynical
+misogynism
+misogynist
+misogynistic
+misogynistical
+misogynous
+misogyny
+misohellene
+misologist
+misology
+misomath
+misoneism
+misoneist
+misoneistic
+misopaterist
+misopedia
+misopedism
+misopedist
+misopinion
+misopolemical
+misorder
+misordination
+misorganization
+misorganize
+misoscopist
+misosophist
+misosophy
+misotheism
+misotheist
+misotheistic
+misotramontanism
+misotyranny
+misoxene
+misoxeny
+mispage
+mispagination
+mispaint
+misparse
+mispart
+mispassion
+mispatch
+mispay
+misperceive
+misperception
+misperform
+misperformance
+mispersuade
+misperuse
+misphrase
+mispick
+mispickel
+misplace
+misplacement
+misplant
+misplay
+misplead
+mispleading
+misplease
+mispoint
+mispoise
+mispolicy
+misposition
+mispossessed
+mispractice
+mispraise
+misprejudiced
+misprincipled
+misprint
+misprisal
+misprision
+misprize
+misprizer
+misproceeding
+misproduce
+misprofess
+misprofessor
+mispronounce
+mispronouncement
+mispronunciation
+misproportion
+misproposal
+mispropose
+misproud
+misprovide
+misprovidence
+misprovoke
+mispunctuate
+mispunctuation
+mispurchase
+mispursuit
+misput
+misqualify
+misquality
+misquotation
+misquote
+misquoter
+misraise
+misrate
+misread
+misreader
+misrealize
+misreason
+misreceive
+misrecital
+misrecite
+misreckon
+misrecognition
+misrecognize
+misrecollect
+misrefer
+misreference
+misreflect
+misreform
+misregulate
+misrehearsal
+misrehearse
+misrelate
+misrelation
+misreliance
+misremember
+misremembrance
+misrender
+misrepeat
+misreport
+misreporter
+misreposed
+misrepresent
+misrepresentation
+misrepresentative
+misrepresenter
+misreprint
+misrepute
+misresemblance
+misresolved
+misresult
+misreward
+misrhyme
+misrhymer
+misrule
+miss
+missable
+missal
+missay
+missayer
+misseem
+missel
+missemblance
+missentence
+misserve
+misservice
+misset
+misshape
+misshapen
+misshapenly
+misshapenness
+misshood
+missible
+missile
+missileproof
+missiness
+missing
+missingly
+mission
+missional
+missionarize
+missionary
+missionaryship
+missioner
+missionize
+missionizer
+missis
+Missisauga
+missish
+missishness
+Mississippi
+Mississippian
+missive
+missmark
+missment
+Missouri
+Missourian
+Missourianism
+missourite
+misspeak
+misspeech
+misspell
+misspelling
+misspend
+misspender
+misstate
+misstatement
+misstater
+misstay
+misstep
+missuade
+missuggestion
+missummation
+missuppose
+missy
+missyish
+missyllabication
+missyllabify
+mist
+mistakable
+mistakableness
+mistakably
+mistake
+mistakeful
+mistaken
+mistakenly
+mistakenness
+mistakeproof
+mistaker
+mistaking
+mistakingly
+mistassini
+mistaught
+mistbow
+misteach
+misteacher
+misted
+mistell
+mistempered
+mistend
+mistendency
+Mister
+mister
+misterm
+mistetch
+mistfall
+mistflower
+mistful
+misthink
+misthought
+misthread
+misthrift
+misthrive
+misthrow
+mistic
+mistide
+mistify
+mistigris
+mistily
+mistime
+mistiness
+mistitle
+mistle
+mistless
+mistletoe
+mistone
+mistonusk
+mistook
+mistouch
+mistradition
+mistrain
+mistral
+mistranscribe
+mistranscript
+mistranscription
+mistranslate
+mistranslation
+mistreat
+mistreatment
+mistress
+mistressdom
+mistresshood
+mistressless
+mistressly
+mistrial
+mistrist
+mistrust
+mistruster
+mistrustful
+mistrustfully
+mistrustfulness
+mistrusting
+mistrustingly
+mistrustless
+mistry
+mistryst
+misturn
+mistutor
+misty
+mistyish
+misunderstand
+misunderstandable
+misunderstander
+misunderstanding
+misunderstandingly
+misunderstood
+misunderstoodness
+misura
+misusage
+misuse
+misuseful
+misusement
+misuser
+misusurped
+misvaluation
+misvalue
+misventure
+misventurous
+misvouch
+miswed
+miswisdom
+miswish
+misword
+misworship
+misworshiper
+misworshipper
+miswrite
+misyoke
+miszealous
+Mitakshara
+Mitanni
+Mitannian
+Mitannish
+mitapsis
+Mitch
+mitchboard
+Mitchell
+Mitchella
+mite
+Mitella
+miteproof
+miter
+mitered
+miterer
+miterflower
+miterwort
+Mithra
+Mithraea
+Mithraeum
+Mithraic
+Mithraicism
+Mithraicist
+Mithraicize
+Mithraism
+Mithraist
+Mithraistic
+Mithraitic
+Mithraize
+Mithras
+Mithratic
+Mithriac
+mithridate
+Mithridatic
+mithridatic
+mithridatism
+mithridatize
+miticidal
+miticide
+mitigable
+mitigant
+mitigate
+mitigatedly
+mitigation
+mitigative
+mitigator
+mitigatory
+mitis
+mitochondria
+mitochondrial
+mitogenetic
+mitome
+mitosis
+mitosome
+mitotic
+mitotically
+Mitra
+mitra
+mitrailleuse
+mitral
+mitrate
+mitre
+mitrer
+Mitridae
+mitriform
+Mitsukurina
+Mitsukurinidae
+mitsumata
+mitt
+mittelhand
+Mittelmeer
+mitten
+mittened
+mittimus
+mitty
+Mitu
+Mitua
+mity
+miurus
+mix
+mixable
+mixableness
+mixblood
+Mixe
+mixed
+mixedly
+mixedness
+mixen
+mixer
+mixeress
+mixhill
+mixible
+mixite
+mixobarbaric
+mixochromosome
+Mixodectes
+Mixodectidae
+mixolydian
+mixoploid
+mixoploidy
+Mixosaurus
+mixotrophic
+Mixtec
+Mixtecan
+mixtiform
+mixtilineal
+mixtilion
+mixtion
+mixture
+mixy
+Mizar
+mizmaze
+Mizpah
+Mizraim
+mizzen
+mizzenmast
+mizzenmastman
+mizzentopman
+mizzle
+mizzler
+mizzly
+mizzonite
+mizzy
+mlechchha
+mneme
+mnemic
+Mnemiopsis
+mnemonic
+mnemonical
+mnemonicalist
+mnemonically
+mnemonicon
+mnemonics
+mnemonism
+mnemonist
+mnemonization
+mnemonize
+Mnemosyne
+mnemotechnic
+mnemotechnical
+mnemotechnics
+mnemotechnist
+mnemotechny
+mnesic
+mnestic
+Mnevis
+Mniaceae
+mniaceous
+mnioid
+Mniotiltidae
+Mnium
+Mo
+mo
+Moabite
+Moabitess
+Moabitic
+Moabitish
+moan
+moanful
+moanfully
+moanification
+moaning
+moaningly
+moanless
+Moaria
+Moarian
+moat
+Moattalite
+mob
+mobable
+mobbable
+mobber
+mobbish
+mobbishly
+mobbishness
+mobbism
+mobbist
+mobby
+mobcap
+mobed
+mobile
+Mobilian
+mobilianer
+mobiliary
+mobility
+mobilizable
+mobilization
+mobilize
+mobilometer
+moble
+moblike
+mobocracy
+mobocrat
+mobocratic
+mobocratical
+mobolatry
+mobproof
+mobship
+mobsman
+mobster
+Mobula
+Mobulidae
+moccasin
+Mocha
+mocha
+Mochica
+mochras
+mock
+mockable
+mockado
+mockbird
+mocker
+mockernut
+mockery
+mockful
+mockfully
+mockground
+mockingbird
+mockingstock
+mocmain
+Mocoa
+Mocoan
+mocomoco
+mocuck
+Mod
+modal
+modalism
+modalist
+modalistic
+modality
+modalize
+modally
+mode
+model
+modeler
+modeless
+modelessness
+modeling
+modelist
+modeller
+modelmaker
+modelmaking
+modena
+Modenese
+moderant
+moderantism
+moderantist
+moderate
+moderately
+moderateness
+moderation
+moderationist
+moderatism
+moderatist
+moderato
+moderator
+moderatorship
+moderatrix
+Modern
+modern
+moderner
+modernicide
+modernish
+modernism
+modernist
+modernistic
+modernity
+modernizable
+modernization
+modernize
+modernizer
+modernly
+modernness
+modest
+modestly
+modestness
+modesty
+modiation
+modicity
+modicum
+modifiability
+modifiable
+modifiableness
+modifiably
+modificability
+modificable
+modification
+modificationist
+modificative
+modificator
+modificatory
+modifier
+modify
+modillion
+modiolar
+Modiolus
+modiolus
+modish
+modishly
+modishness
+modist
+modiste
+modistry
+modius
+Modoc
+Modred
+modulability
+modulant
+modular
+modulate
+modulation
+modulative
+modulator
+modulatory
+module
+Modulidae
+modulo
+modulus
+modumite
+Moe
+Moed
+Moehringia
+moellon
+moerithere
+moeritherian
+Moeritheriidae
+Moeritherium
+mofette
+moff
+mofussil
+mofussilite
+mog
+mogador
+mogadore
+mogdad
+moggan
+moggy
+Moghan
+mogigraphia
+mogigraphic
+mogigraphy
+mogilalia
+mogilalism
+mogiphonia
+mogitocia
+mogo
+mogographia
+Mogollon
+Mograbi
+Mogrebbin
+moguey
+Mogul
+mogulship
+Moguntine
+moha
+mohabat
+mohair
+Mohammad
+Mohammedan
+Mohammedanism
+Mohammedanization
+Mohammedanize
+Mohammedism
+Mohammedist
+Mohammedization
+Mohammedize
+mohar
+Mohave
+Mohawk
+Mohawkian
+mohawkite
+Mohegan
+mohel
+Mohican
+Mohineyam
+mohnseed
+moho
+Mohock
+Mohockism
+mohr
+Mohrodendron
+mohur
+Moi
+moider
+moidore
+moieter
+moiety
+moil
+moiler
+moiles
+moiley
+moiling
+moilingly
+moilsome
+moineau
+Moingwena
+moio
+Moira
+moire
+moirette
+moise
+Moism
+moissanite
+moist
+moisten
+moistener
+moistful
+moistify
+moistish
+moistishness
+moistless
+moistly
+moistness
+moisture
+moistureless
+moistureproof
+moisty
+moit
+moity
+mojarra
+Mojo
+mojo
+mokaddam
+moke
+moki
+mokihana
+moko
+moksha
+mokum
+moky
+Mola
+mola
+molal
+Molala
+molality
+molar
+molariform
+molarimeter
+molarity
+molary
+Molasse
+molasses
+molassied
+molassy
+molave
+mold
+moldability
+moldable
+moldableness
+Moldavian
+moldavite
+moldboard
+molder
+moldery
+moldiness
+molding
+moldmade
+moldproof
+moldwarp
+moldy
+Mole
+mole
+molecast
+molecula
+molecular
+molecularist
+molecularity
+molecularly
+molecule
+molehead
+moleheap
+molehill
+molehillish
+molehilly
+moleism
+molelike
+molendinar
+molendinary
+molengraaffite
+moleproof
+moler
+moleskin
+molest
+molestation
+molester
+molestful
+molestfully
+Molge
+Molgula
+Molidae
+molimen
+moliminous
+molinary
+moline
+Molinia
+Molinism
+Molinist
+Molinistic
+molka
+Moll
+molland
+Mollberg
+molle
+mollescence
+mollescent
+molleton
+mollichop
+mollicrush
+mollie
+mollienisia
+mollient
+molliently
+mollifiable
+mollification
+mollifiedly
+mollifier
+mollify
+mollifying
+mollifyingly
+mollifyingness
+molligrant
+molligrubs
+mollipilose
+Mollisiaceae
+mollisiose
+mollities
+mollitious
+mollitude
+Molluginaceae
+Mollugo
+Mollusca
+molluscan
+molluscivorous
+molluscoid
+Molluscoida
+molluscoidal
+molluscoidan
+Molluscoidea
+molluscoidean
+molluscous
+molluscousness
+molluscum
+mollusk
+Molly
+molly
+mollycoddle
+mollycoddler
+mollycoddling
+mollycosset
+mollycot
+mollyhawk
+molman
+Moloch
+Molochize
+Molochship
+moloid
+moloker
+molompi
+molosse
+Molossian
+molossic
+Molossidae
+molossine
+molossoid
+molossus
+Molothrus
+molpe
+molrooken
+molt
+molten
+moltenly
+molter
+Molucca
+Moluccan
+Moluccella
+Moluche
+moly
+molybdate
+molybdena
+molybdenic
+molybdeniferous
+molybdenite
+molybdenous
+molybdenum
+molybdic
+molybdite
+molybdocardialgia
+molybdocolic
+molybdodyspepsia
+molybdomancy
+molybdomenite
+molybdonosus
+molybdoparesis
+molybdophyllite
+molybdosis
+molybdous
+molysite
+mombin
+momble
+Mombottu
+mome
+moment
+momenta
+momental
+momentally
+momentaneall
+momentaneity
+momentaneous
+momentaneously
+momentaneousness
+momentarily
+momentariness
+momentary
+momently
+momentous
+momentously
+momentousness
+momentum
+momiology
+momism
+momme
+mommet
+mommy
+momo
+Momordica
+Momotidae
+Momotinae
+Momotus
+Momus
+Mon
+mon
+mona
+Monacan
+monacanthid
+Monacanthidae
+monacanthine
+monacanthous
+Monacha
+monachal
+monachate
+Monachi
+monachism
+monachist
+monachization
+monachize
+monactin
+monactine
+monactinellid
+monactinellidan
+monad
+monadelph
+Monadelphia
+monadelphian
+monadelphous
+monadic
+monadical
+monadically
+monadiform
+monadigerous
+Monadina
+monadism
+monadistic
+monadnock
+monadology
+monaene
+monal
+monamniotic
+Monanday
+monander
+Monandria
+monandrian
+monandric
+monandrous
+monandry
+monanthous
+monapsal
+monarch
+monarchal
+monarchally
+monarchess
+monarchial
+monarchian
+monarchianism
+monarchianist
+monarchianistic
+monarchic
+monarchical
+monarchically
+monarchism
+monarchist
+monarchistic
+monarchize
+monarchizer
+monarchlike
+monarchomachic
+monarchomachist
+monarchy
+Monarda
+Monardella
+monarthritis
+monarticular
+monas
+Monasa
+Monascidiae
+monascidian
+monase
+monaster
+monasterial
+monasterially
+monastery
+monastic
+monastical
+monastically
+monasticism
+monasticize
+monatomic
+monatomicity
+monatomism
+monaulos
+monaural
+monaxial
+monaxile
+monaxon
+monaxonial
+monaxonic
+Monaxonida
+monazine
+monazite
+Monbuttu
+monchiquite
+Monday
+Mondayish
+Mondayishness
+Mondayland
+mone
+Monegasque
+Monel
+monel
+monembryary
+monembryonic
+monembryony
+monepic
+monepiscopacy
+monepiscopal
+moner
+Monera
+moneral
+moneran
+monergic
+monergism
+monergist
+monergistic
+moneric
+moneron
+Monerozoa
+monerozoan
+monerozoic
+monerula
+Moneses
+monesia
+monetarily
+monetary
+monetite
+monetization
+monetize
+money
+moneyage
+moneybag
+moneybags
+moneyed
+moneyer
+moneyflower
+moneygrub
+moneygrubber
+moneygrubbing
+moneylender
+moneylending
+moneyless
+moneymonger
+moneymongering
+moneysaving
+moneywise
+moneywort
+mong
+mongcorn
+monger
+mongering
+mongery
+Monghol
+Mongholian
+Mongibel
+mongler
+Mongo
+Mongol
+Mongolian
+Mongolianism
+Mongolic
+Mongolioid
+Mongolish
+Mongolism
+Mongolization
+Mongolize
+Mongoloid
+mongoose
+Mongoyo
+mongrel
+mongreldom
+mongrelish
+mongrelism
+mongrelity
+mongrelization
+mongrelize
+mongrelly
+mongrelness
+mongst
+monheimite
+monial
+Monias
+Monica
+moniker
+monilated
+monilethrix
+Monilia
+Moniliaceae
+moniliaceous
+Moniliales
+monilicorn
+moniliform
+moniliformly
+monilioid
+moniment
+Monimia
+Monimiaceae
+monimiaceous
+monimolite
+monimostylic
+monism
+monist
+monistic
+monistical
+monistically
+monition
+monitive
+monitor
+monitorial
+monitorially
+monitorish
+monitorship
+monitory
+monitress
+monitrix
+monk
+monkbird
+monkcraft
+monkdom
+monkery
+monkess
+monkey
+monkeyboard
+monkeyface
+monkeyfy
+monkeyhood
+monkeyish
+monkeyishly
+monkeyishness
+monkeylike
+monkeynut
+monkeypod
+monkeypot
+monkeyry
+monkeyshine
+monkeytail
+monkfish
+monkflower
+monkhood
+monkish
+monkishly
+monkishness
+monkism
+monklike
+monkliness
+monkly
+monkmonger
+monkship
+monkshood
+Monmouth
+monmouthite
+monny
+Mono
+mono
+monoacetate
+monoacetin
+monoacid
+monoacidic
+monoamide
+monoamine
+monoamino
+monoammonium
+monoazo
+monobacillary
+monobase
+monobasic
+monobasicity
+monoblastic
+monoblepsia
+monoblepsis
+monobloc
+monobranchiate
+monobromacetone
+monobromated
+monobromide
+monobrominated
+monobromination
+monobromized
+monobromoacetanilide
+monobromoacetone
+monobutyrin
+monocalcium
+monocarbide
+monocarbonate
+monocarbonic
+monocarboxylic
+monocardian
+monocarp
+monocarpal
+monocarpellary
+monocarpian
+monocarpic
+monocarpous
+monocellular
+monocentric
+monocentrid
+Monocentridae
+Monocentris
+monocentroid
+monocephalous
+monocercous
+monoceros
+monocerous
+monochasial
+monochasium
+Monochlamydeae
+monochlamydeous
+monochlor
+monochloracetic
+monochloranthracene
+monochlorbenzene
+monochloride
+monochlorinated
+monochlorination
+monochloro
+monochloroacetic
+monochlorobenzene
+monochloromethane
+monochoanitic
+monochord
+monochordist
+monochordize
+monochroic
+monochromasy
+monochromat
+monochromate
+monochromatic
+monochromatically
+monochromatism
+monochromator
+monochrome
+monochromic
+monochromical
+monochromically
+monochromist
+monochromous
+monochromy
+monochronic
+monochronous
+monociliated
+monocle
+monocled
+monocleid
+monoclinal
+monoclinally
+monocline
+monoclinian
+monoclinic
+monoclinism
+monoclinometric
+monoclinous
+Monoclonius
+Monocoelia
+monocoelian
+monocoelic
+Monocondyla
+monocondylar
+monocondylian
+monocondylic
+monocondylous
+monocormic
+monocot
+monocotyledon
+Monocotyledones
+monocotyledonous
+monocracy
+monocrat
+monocratic
+monocrotic
+monocrotism
+monocular
+monocularity
+monocularly
+monoculate
+monocule
+monoculist
+monoculous
+monocultural
+monoculture
+monoculus
+monocyanogen
+monocycle
+monocyclic
+Monocyclica
+monocystic
+Monocystidae
+Monocystidea
+Monocystis
+monocyte
+monocytic
+monocytopoiesis
+monodactyl
+monodactylate
+monodactyle
+monodactylism
+monodactylous
+monodactyly
+monodelph
+Monodelphia
+monodelphian
+monodelphic
+monodelphous
+monodermic
+monodic
+monodically
+monodimetric
+monodist
+monodize
+monodomous
+Monodon
+monodont
+Monodonta
+monodontal
+monodram
+monodrama
+monodramatic
+monodramatist
+monodromic
+monodromy
+monody
+monodynamic
+monodynamism
+Monoecia
+monoecian
+monoecious
+monoeciously
+monoeciousness
+monoecism
+monoeidic
+monoestrous
+monoethanolamine
+monoethylamine
+monofilament
+monofilm
+monoflagellate
+monoformin
+monogamian
+monogamic
+monogamist
+monogamistic
+monogamous
+monogamously
+monogamousness
+monogamy
+monoganglionic
+monogastric
+monogene
+Monogenea
+monogeneity
+monogeneous
+monogenesis
+monogenesist
+monogenesy
+monogenetic
+Monogenetica
+monogenic
+monogenism
+monogenist
+monogenistic
+monogenous
+monogeny
+monoglot
+monoglycerid
+monoglyceride
+monogoneutic
+monogonoporic
+monogonoporous
+monogony
+monogram
+monogrammatic
+monogrammatical
+monogrammed
+monogrammic
+monograph
+monographer
+monographic
+monographical
+monographically
+monographist
+monography
+monograptid
+Monograptidae
+Monograptus
+monogynic
+monogynious
+monogynist
+monogynoecial
+monogynous
+monogyny
+monohybrid
+monohydrate
+monohydrated
+monohydric
+monohydrogen
+monohydroxy
+monoicous
+monoid
+monoketone
+monolater
+monolatrist
+monolatrous
+monolatry
+monolayer
+monoline
+monolingual
+monolinguist
+monoliteral
+monolith
+monolithal
+monolithic
+monolobular
+monolocular
+monologian
+monologic
+monological
+monologist
+monologize
+monologue
+monologuist
+monology
+monomachist
+monomachy
+monomania
+monomaniac
+monomaniacal
+monomastigate
+monomeniscous
+monomer
+monomeric
+monomerous
+monometallic
+monometallism
+monometallist
+monometer
+monomethyl
+monomethylated
+monomethylic
+monometric
+monometrical
+monomial
+monomict
+monomineral
+monomineralic
+monomolecular
+monomolybdate
+Monomorium
+monomorphic
+monomorphism
+monomorphous
+Monomya
+Monomyaria
+monomyarian
+mononaphthalene
+mononch
+Mononchus
+mononeural
+Monongahela
+mononitrate
+mononitrated
+mononitration
+mononitride
+mononitrobenzene
+mononomial
+mononomian
+monont
+mononuclear
+mononucleated
+mononucleosis
+mononychous
+mononym
+mononymic
+mononymization
+mononymize
+mononymy
+monoousian
+monoousious
+monoparental
+monoparesis
+monoparesthesia
+monopathic
+monopathy
+monopectinate
+monopersonal
+monopersulfuric
+monopersulphuric
+Monopetalae
+monopetalous
+monophagism
+monophagous
+monophagy
+monophase
+monophasia
+monophasic
+monophobia
+monophone
+monophonic
+monophonous
+monophony
+monophotal
+monophote
+monophthalmic
+monophthalmus
+monophthong
+monophthongal
+monophthongization
+monophthongize
+monophyletic
+monophyleticism
+monophylite
+monophyllous
+monophyodont
+monophyodontism
+Monophysite
+Monophysitic
+Monophysitical
+Monophysitism
+monopitch
+monoplacula
+monoplacular
+monoplaculate
+monoplane
+monoplanist
+monoplasmatic
+monoplast
+monoplastic
+monoplegia
+monoplegic
+Monopneumoa
+monopneumonian
+monopneumonous
+monopode
+monopodial
+monopodially
+monopodic
+monopodium
+monopodous
+monopody
+monopolar
+monopolaric
+monopolarity
+monopole
+monopolism
+monopolist
+monopolistic
+monopolistically
+monopolitical
+monopolizable
+monopolization
+monopolize
+monopolizer
+monopolous
+monopoly
+monopolylogist
+monopolylogue
+monopotassium
+monoprionid
+monoprionidian
+monopsonistic
+monopsony
+monopsychism
+monopteral
+Monopteridae
+monopteroid
+monopteron
+monopteros
+monopterous
+monoptic
+monoptical
+monoptote
+monoptotic
+Monopylaea
+Monopylaria
+monopylean
+monopyrenous
+monorail
+monorailroad
+monorailway
+monorchid
+monorchidism
+monorchis
+monorchism
+monorganic
+Monorhina
+monorhinal
+monorhine
+monorhyme
+monorhymed
+monorhythmic
+monosaccharide
+monosaccharose
+monoschemic
+monoscope
+monose
+monosemic
+monosepalous
+monoservice
+monosilane
+monosilicate
+monosilicic
+monosiphonic
+monosiphonous
+monosodium
+monosomatic
+monosomatous
+monosome
+monosomic
+monosperm
+monospermal
+monospermic
+monospermous
+monospermy
+monospherical
+monospondylic
+monosporangium
+monospore
+monospored
+monosporiferous
+monosporous
+monostele
+monostelic
+monostelous
+monostely
+monostich
+monostichous
+Monostomata
+Monostomatidae
+monostomatous
+monostome
+Monostomidae
+monostomous
+Monostomum
+monostromatic
+monostrophe
+monostrophic
+monostrophics
+monostylous
+monosubstituted
+monosubstitution
+monosulfone
+monosulfonic
+monosulphide
+monosulphone
+monosulphonic
+monosyllabic
+monosyllabical
+monosyllabically
+monosyllabism
+monosyllabize
+monosyllable
+monosymmetric
+monosymmetrical
+monosymmetrically
+monosymmetry
+monosynthetic
+monotelephone
+monotelephonic
+monotellurite
+Monothalama
+monothalamian
+monothalamous
+monothecal
+monotheism
+monotheist
+monotheistic
+monotheistical
+monotheistically
+Monothelete
+Monotheletian
+Monotheletic
+Monotheletism
+monothelious
+Monothelism
+Monothelitic
+Monothelitism
+monothetic
+monotic
+monotint
+Monotocardia
+monotocardiac
+monotocardian
+monotocous
+monotomous
+monotone
+monotonic
+monotonical
+monotonically
+monotonist
+monotonize
+monotonous
+monotonously
+monotonousness
+monotony
+monotremal
+Monotremata
+monotremate
+monotrematous
+monotreme
+monotremous
+monotrichous
+monotriglyph
+monotriglyphic
+Monotrocha
+monotrochal
+monotrochian
+monotrochous
+Monotropa
+Monotropaceae
+monotropaceous
+monotrophic
+monotropic
+Monotropsis
+monotropy
+monotypal
+monotype
+monotypic
+monotypical
+monotypous
+monoureide
+monovalence
+monovalency
+monovalent
+monovariant
+monoverticillate
+monovoltine
+monovular
+monoxenous
+monoxide
+monoxime
+monoxyle
+monoxylic
+monoxylon
+monoxylous
+Monozoa
+monozoan
+monozoic
+monozygotic
+Monroeism
+Monroeist
+monrolite
+monseigneur
+monsieur
+monsieurship
+monsignor
+monsignorial
+Monsoni
+monsoon
+monsoonal
+monsoonish
+monsoonishly
+monster
+Monstera
+monsterhood
+monsterlike
+monstership
+monstrance
+monstrate
+monstration
+monstrator
+monstricide
+monstriferous
+monstrification
+monstrify
+monstrosity
+monstrous
+monstrously
+monstrousness
+Mont
+montage
+Montagnac
+Montagnais
+Montana
+montana
+Montanan
+montane
+montanic
+montanin
+Montanism
+Montanist
+Montanistic
+Montanistical
+montanite
+Montanize
+montant
+Montargis
+Montauk
+montbretia
+monte
+montebrasite
+monteith
+montem
+Montenegrin
+Montepulciano
+Monterey
+Montes
+Montesco
+Montesinos
+Montessorian
+Montessorianism
+Montezuma
+montgolfier
+month
+monthly
+monthon
+Montia
+monticellite
+monticle
+monticoline
+monticulate
+monticule
+Monticulipora
+Monticuliporidae
+monticuliporidean
+monticuliporoid
+monticulose
+monticulous
+monticulus
+montiform
+montigeneous
+montilla
+montjoy
+montmartrite
+Montmorency
+montmorilonite
+monton
+Montrachet
+montroydite
+Montu
+monture
+Monty
+Monumbo
+monument
+monumental
+monumentalism
+monumentality
+monumentalization
+monumentalize
+monumentally
+monumentary
+monumentless
+monumentlike
+monzodiorite
+monzogabbro
+monzonite
+monzonitic
+moo
+Mooachaht
+mooch
+moocha
+moocher
+moochulka
+mood
+mooder
+moodily
+moodiness
+moodish
+moodishly
+moodishness
+moodle
+moody
+mooing
+mool
+moolet
+moolings
+mools
+moolum
+moon
+moonack
+moonbeam
+moonbill
+moonblink
+mooncalf
+mooncreeper
+moondown
+moondrop
+mooned
+mooner
+moonery
+mooneye
+moonface
+moonfaced
+moonfall
+moonfish
+moonflower
+moonglade
+moonglow
+moonhead
+moonily
+mooniness
+mooning
+moonish
+moonite
+moonja
+moonjah
+moonless
+moonlet
+moonlight
+moonlighted
+moonlighter
+moonlighting
+moonlighty
+moonlike
+moonlikeness
+moonlit
+moonlitten
+moonman
+moonpath
+moonpenny
+moonproof
+moonraker
+moonraking
+moonrise
+moonsail
+moonscape
+moonseed
+moonset
+moonshade
+moonshine
+moonshiner
+moonshining
+moonshiny
+moonsick
+moonsickness
+moonstone
+moontide
+moonwalker
+moonwalking
+moonward
+moonwards
+moonway
+moonwort
+moony
+moop
+Moor
+moor
+moorage
+moorball
+moorband
+moorberry
+moorbird
+moorburn
+moorburner
+moorburning
+Moore
+moorflower
+moorfowl
+mooring
+Moorish
+moorish
+moorishly
+moorishness
+moorland
+moorlander
+Moorman
+moorman
+moorn
+moorpan
+moors
+Moorship
+moorsman
+moorstone
+moortetter
+moorup
+moorwort
+moory
+moosa
+moose
+mooseberry
+moosebird
+moosebush
+moosecall
+mooseflower
+moosehood
+moosemise
+moosetongue
+moosewob
+moosewood
+moosey
+moost
+moot
+mootable
+mooter
+mooth
+mooting
+mootman
+mootstead
+mootworthy
+mop
+Mopan
+mopane
+mopboard
+mope
+moper
+moph
+mophead
+mopheaded
+moping
+mopingly
+mopish
+mopishly
+mopishness
+mopla
+mopper
+moppet
+moppy
+mopstick
+mopsy
+mopus
+Moquelumnan
+moquette
+Moqui
+mor
+mora
+Moraceae
+moraceous
+Moraea
+morainal
+moraine
+morainic
+moral
+morale
+moralism
+moralist
+moralistic
+moralistically
+morality
+moralization
+moralize
+moralizer
+moralizingly
+moralless
+morally
+moralness
+morals
+Moran
+morass
+morassic
+morassweed
+morassy
+morat
+morate
+moration
+moratoria
+moratorium
+moratory
+Moravian
+Moravianism
+Moravianized
+Moravid
+moravite
+moray
+morbid
+morbidity
+morbidize
+morbidly
+morbidness
+morbiferal
+morbiferous
+morbific
+morbifical
+morbifically
+morbify
+morbility
+morbillary
+morbilli
+morbilliform
+morbillous
+morcellate
+morcellated
+morcellation
+Morchella
+Morcote
+mordacious
+mordaciously
+mordacity
+mordancy
+mordant
+mordantly
+Mordella
+mordellid
+Mordellidae
+mordelloid
+mordenite
+mordent
+mordicate
+mordication
+mordicative
+mordore
+Mordv
+Mordva
+Mordvin
+Mordvinian
+more
+moreen
+morefold
+moreish
+morel
+morella
+morello
+morencite
+moreness
+morenita
+morenosite
+Moreote
+moreover
+morepork
+mores
+Moresque
+morfrey
+morg
+morga
+Morgan
+morgan
+Morgana
+morganatic
+morganatical
+morganatically
+morganic
+morganite
+morganize
+morgay
+morgen
+morgengift
+morgenstern
+morglay
+morgue
+moribund
+moribundity
+moribundly
+moric
+moriche
+moriform
+morigerate
+morigeration
+morigerous
+morigerously
+morigerousness
+morillon
+morin
+Morinaceae
+Morinda
+morindin
+morindone
+morinel
+Moringa
+Moringaceae
+moringaceous
+moringad
+Moringua
+moringuid
+Moringuidae
+moringuoid
+morion
+Moriori
+Moriscan
+Morisco
+Morisonian
+Morisonianism
+morkin
+morlop
+mormaor
+mormaordom
+mormaorship
+mormo
+Mormon
+mormon
+Mormondom
+Mormoness
+Mormonism
+Mormonist
+Mormonite
+Mormonweed
+Mormoops
+mormyr
+mormyre
+mormyrian
+mormyrid
+Mormyridae
+mormyroid
+Mormyrus
+morn
+morne
+morned
+morning
+morningless
+morningly
+mornings
+morningtide
+morningward
+mornless
+mornlike
+morntime
+mornward
+Moro
+moro
+moroc
+Moroccan
+Morocco
+morocco
+morocota
+morological
+morologically
+morologist
+morology
+moromancy
+moron
+moroncy
+morong
+moronic
+Moronidae
+moronism
+moronity
+moronry
+Moropus
+morosaurian
+morosauroid
+Morosaurus
+morose
+morosely
+moroseness
+morosis
+morosity
+moroxite
+morph
+morphallaxis
+morphea
+Morphean
+morpheme
+morphemic
+morphemics
+morphetic
+Morpheus
+morphew
+morphia
+morphiate
+morphic
+morphically
+morphinate
+morphine
+morphinic
+morphinism
+morphinist
+morphinization
+morphinize
+morphinomania
+morphinomaniac
+morphiomania
+morphiomaniac
+Morpho
+morphogenesis
+morphogenetic
+morphogenic
+morphogeny
+morphographer
+morphographic
+morphographical
+morphographist
+morphography
+morpholine
+morphologic
+morphological
+morphologically
+morphologist
+morphology
+morphometrical
+morphometry
+morphon
+morphonomic
+morphonomy
+morphophonemic
+morphophonemically
+morphophonemics
+morphophyly
+morphoplasm
+morphoplasmic
+morphosis
+morphotic
+morphotropic
+morphotropism
+morphotropy
+morphous
+Morrenian
+Morrhua
+morrhuate
+morrhuine
+morricer
+Morris
+morris
+Morrisean
+morrow
+morrowing
+morrowless
+morrowmass
+morrowspeech
+morrowtide
+morsal
+Morse
+morse
+morsel
+morselization
+morselize
+morsing
+morsure
+mort
+mortacious
+mortal
+mortalism
+mortalist
+mortality
+mortalize
+mortally
+mortalness
+mortalwise
+mortar
+mortarboard
+mortarize
+mortarless
+mortarlike
+mortarware
+mortary
+mortbell
+mortcloth
+mortersheen
+mortgage
+mortgageable
+mortgagee
+mortgagor
+morth
+morthwyrtha
+mortician
+mortier
+mortiferous
+mortiferously
+mortiferousness
+mortific
+mortification
+mortified
+mortifiedly
+mortifiedness
+mortifier
+mortify
+mortifying
+mortifyingly
+Mortimer
+mortise
+mortiser
+mortling
+mortmain
+mortmainer
+Morton
+mortuarian
+mortuary
+mortuous
+morula
+morular
+morulation
+morule
+moruloid
+Morus
+morvin
+morwong
+Mosaic
+mosaic
+Mosaical
+mosaical
+mosaically
+mosaicism
+mosaicist
+Mosaicity
+Mosaism
+Mosaist
+mosaist
+mosandrite
+mosasaur
+Mosasauri
+Mosasauria
+mosasaurian
+mosasaurid
+Mosasauridae
+mosasauroid
+Mosasaurus
+Mosatenan
+moschate
+moschatel
+moschatelline
+Moschi
+Moschidae
+moschiferous
+Moschinae
+moschine
+Moschus
+Moscow
+Mose
+Moselle
+Moses
+mosesite
+Mosetena
+mosette
+mosey
+Mosgu
+moskeneer
+mosker
+Moslem
+Moslemah
+Moslemic
+Moslemin
+Moslemism
+Moslemite
+Moslemize
+moslings
+mosque
+mosquelet
+mosquish
+mosquital
+Mosquito
+mosquito
+mosquitobill
+mosquitocidal
+mosquitocide
+mosquitoey
+mosquitoish
+mosquitoproof
+moss
+mossback
+mossberry
+mossbunker
+mossed
+mosser
+mossery
+mossful
+mosshead
+Mossi
+mossiness
+mossless
+mosslike
+mosstrooper
+mosstroopery
+mosstrooping
+mosswort
+mossy
+mossyback
+most
+moste
+Mosting
+mostlike
+mostlings
+mostly
+mostness
+Mosul
+Mosur
+mot
+Motacilla
+motacillid
+Motacillidae
+Motacillinae
+motacilline
+motatorious
+motatory
+Motazilite
+mote
+moted
+motel
+moteless
+moter
+motet
+motettist
+motey
+moth
+mothed
+mother
+motherdom
+mothered
+motherer
+mothergate
+motherhood
+motheriness
+mothering
+motherkin
+motherland
+motherless
+motherlessness
+motherlike
+motherliness
+motherling
+motherly
+mothership
+mothersome
+motherward
+motherwise
+motherwort
+mothery
+mothless
+mothlike
+mothproof
+mothworm
+mothy
+motif
+motific
+motile
+motility
+motion
+motionable
+motional
+motionless
+motionlessly
+motionlessness
+motitation
+motivate
+motivation
+motivational
+motive
+motiveless
+motivelessly
+motivelessness
+motiveness
+motivity
+motley
+motleyness
+motmot
+motofacient
+motograph
+motographic
+motomagnetic
+motoneuron
+motophone
+motor
+motorable
+motorboat
+motorboatman
+motorbus
+motorcab
+motorcade
+motorcar
+motorcycle
+motorcyclist
+motordom
+motordrome
+motored
+motorial
+motoric
+motoring
+motorism
+motorist
+motorium
+motorization
+motorize
+motorless
+motorman
+motorneer
+motorphobe
+motorphobia
+motorphobiac
+motorway
+motory
+Motozintlec
+Motozintleca
+motricity
+Mott
+mott
+motte
+mottle
+mottled
+mottledness
+mottlement
+mottler
+mottling
+motto
+mottoed
+mottoless
+mottolike
+mottramite
+motyka
+mou
+moucharaby
+mouchardism
+mouche
+mouchrabieh
+moud
+moudie
+moudieman
+moudy
+mouflon
+Mougeotia
+Mougeotiaceae
+mouillation
+mouille
+mouillure
+moujik
+moul
+mould
+moulded
+moule
+moulin
+moulinage
+moulinet
+moulleen
+moulrush
+mouls
+moulter
+mouly
+mound
+moundiness
+moundlet
+moundwork
+moundy
+mount
+mountable
+mountably
+mountain
+mountained
+mountaineer
+mountainet
+mountainette
+mountainless
+mountainlike
+mountainous
+mountainously
+mountainousness
+mountainside
+mountaintop
+mountainward
+mountainwards
+mountainy
+mountant
+mountebank
+mountebankery
+mountebankish
+mountebankism
+mountebankly
+mounted
+mounter
+Mountie
+mounting
+mountingly
+mountlet
+mounture
+moup
+mourn
+mourner
+mourneress
+mournful
+mournfully
+mournfulness
+mourning
+mourningly
+mournival
+mournsome
+mouse
+mousebane
+mousebird
+mousefish
+mousehawk
+mousehole
+mousehound
+Mouseion
+mousekin
+mouselet
+mouselike
+mouseproof
+mouser
+mousery
+mouseship
+mousetail
+mousetrap
+mouseweb
+mousey
+mousily
+mousiness
+mousing
+mousingly
+mousle
+mousmee
+Mousoni
+mousquetaire
+mousse
+Mousterian
+moustoc
+mousy
+mout
+moutan
+mouth
+mouthable
+mouthbreeder
+mouthed
+mouther
+mouthful
+mouthily
+mouthiness
+mouthing
+mouthingly
+mouthishly
+mouthless
+mouthlike
+mouthpiece
+mouthroot
+mouthwash
+mouthwise
+mouthy
+mouton
+moutonnee
+mouzah
+mouzouna
+movability
+movable
+movableness
+movably
+movant
+move
+moveability
+moveableness
+moveably
+moveless
+movelessly
+movelessness
+movement
+mover
+movie
+moviedom
+movieize
+movieland
+moving
+movingly
+movingness
+mow
+mowable
+mowana
+mowburn
+mowburnt
+mowch
+mowcht
+mower
+mowha
+mowie
+mowing
+mowland
+mown
+mowra
+mowrah
+mowse
+mowstead
+mowt
+mowth
+moxa
+moxieberry
+Moxo
+moy
+moyen
+moyenless
+moyenne
+moyite
+moyle
+moyo
+Mozambican
+mozambique
+Mozarab
+Mozarabian
+Mozarabic
+Mozartean
+mozemize
+mozing
+mozzetta
+Mpangwe
+Mpondo
+mpret
+Mr
+Mrs
+Mru
+mu
+muang
+mubarat
+mucago
+mucaro
+mucedin
+mucedinaceous
+mucedine
+mucedinous
+much
+muchfold
+muchly
+muchness
+mucic
+mucid
+mucidness
+muciferous
+mucific
+muciform
+mucigen
+mucigenous
+mucilage
+mucilaginous
+mucilaginously
+mucilaginousness
+mucin
+mucinogen
+mucinoid
+mucinous
+muciparous
+mucivore
+mucivorous
+muck
+muckender
+Mucker
+mucker
+muckerish
+muckerism
+mucket
+muckiness
+muckite
+muckle
+muckluck
+muckman
+muckment
+muckmidden
+muckna
+muckrake
+muckraker
+mucksweat
+mucksy
+muckthrift
+muckweed
+muckworm
+mucky
+mucluc
+mucocele
+mucocellulose
+mucocellulosic
+mucocutaneous
+mucodermal
+mucofibrous
+mucoflocculent
+mucoid
+mucomembranous
+muconic
+mucoprotein
+mucopurulent
+mucopus
+mucor
+Mucoraceae
+mucoraceous
+Mucorales
+mucorine
+mucorioid
+mucormycosis
+mucorrhea
+mucosa
+mucosal
+mucosanguineous
+mucose
+mucoserous
+mucosity
+mucosocalcareous
+mucosogranular
+mucosopurulent
+mucososaccharine
+mucous
+mucousness
+mucro
+mucronate
+mucronately
+mucronation
+mucrones
+mucroniferous
+mucroniform
+mucronulate
+mucronulatous
+muculent
+Mucuna
+mucus
+mucusin
+mud
+mudar
+mudbank
+mudcap
+mudd
+mudde
+mudden
+muddify
+muddily
+muddiness
+mudding
+muddish
+muddle
+muddlebrained
+muddledom
+muddlehead
+muddleheaded
+muddleheadedness
+muddlement
+muddleproof
+muddler
+muddlesome
+muddlingly
+muddy
+muddybrained
+muddybreast
+muddyheaded
+mudee
+Mudejar
+mudfish
+mudflow
+mudguard
+mudhead
+mudhole
+mudhopper
+mudir
+mudiria
+mudland
+mudlark
+mudlarker
+mudless
+mudproof
+mudra
+mudsill
+mudskipper
+mudslinger
+mudslinging
+mudspate
+mudstain
+mudstone
+mudsucker
+mudtrack
+mudweed
+mudwort
+Muehlenbeckia
+muermo
+muezzin
+muff
+muffed
+muffet
+muffetee
+muffin
+muffineer
+muffish
+muffishness
+muffle
+muffled
+muffleman
+muffler
+mufflin
+muffy
+mufti
+mufty
+mug
+muga
+mugearite
+mugful
+mugg
+mugger
+mugget
+muggily
+mugginess
+muggins
+muggish
+muggles
+Muggletonian
+Muggletonianism
+muggy
+mughouse
+mugience
+mugiency
+mugient
+Mugil
+Mugilidae
+mugiliform
+mugiloid
+mugweed
+mugwort
+mugwump
+mugwumpery
+mugwumpian
+mugwumpism
+muhammadi
+Muharram
+Muhlenbergia
+muid
+Muilla
+muir
+muirburn
+muircock
+muirfowl
+muishond
+muist
+mujtahid
+Mukden
+mukluk
+Mukri
+muktar
+muktatma
+mukti
+mulaprakriti
+mulatta
+mulatto
+mulattoism
+mulattress
+mulberry
+mulch
+mulcher
+Mulciber
+Mulcibirian
+mulct
+mulctable
+mulctary
+mulctation
+mulctative
+mulctatory
+mulctuary
+mulder
+mule
+muleback
+mulefoot
+mulefooted
+muleman
+muleta
+muleteer
+muletress
+muletta
+mulewort
+muley
+mulga
+muliebral
+muliebria
+muliebrile
+muliebrity
+muliebrous
+mulier
+mulierine
+mulierose
+mulierosity
+mulish
+mulishly
+mulishness
+mulism
+mulita
+mulk
+mull
+mulla
+mullah
+mullar
+mullein
+mullenize
+muller
+Mullerian
+mullet
+mulletry
+mullets
+mulley
+mullid
+Mullidae
+mulligan
+mulligatawny
+mulligrubs
+mullion
+mullite
+mullock
+mullocker
+mullocky
+mulloid
+mulloway
+mulmul
+mulse
+mulsify
+mult
+multangular
+multangularly
+multangularness
+multangulous
+multangulum
+Multani
+multanimous
+multarticulate
+multeity
+multiangular
+multiareolate
+multiarticular
+multiarticulate
+multiarticulated
+multiaxial
+multiblade
+multibladed
+multibranched
+multibranchiate
+multibreak
+multicamerate
+multicapitate
+multicapsular
+multicarinate
+multicarinated
+multicellular
+multicentral
+multicentric
+multicharge
+multichord
+multichrome
+multiciliate
+multiciliated
+multicipital
+multicircuit
+multicoccous
+multicoil
+multicolor
+multicolored
+multicolorous
+multicomponent
+multiconductor
+multiconstant
+multicore
+multicorneal
+multicostate
+multicourse
+multicrystalline
+multicuspid
+multicuspidate
+multicycle
+multicylinder
+multicylindered
+multidentate
+multidenticulate
+multidenticulated
+multidigitate
+multidimensional
+multidirectional
+multidisperse
+multiengine
+multiengined
+multiexhaust
+multifaced
+multifaceted
+multifactorial
+multifamilial
+multifarious
+multifariously
+multifariousness
+multiferous
+multifetation
+multifibered
+multifid
+multifidly
+multifidous
+multifidus
+multifilament
+multifistular
+multiflagellate
+multiflagellated
+multiflash
+multiflorous
+multiflow
+multiflue
+multifocal
+multifoil
+multifoiled
+multifold
+multifoliate
+multifoliolate
+multiform
+multiformed
+multiformity
+multifurcate
+multiganglionic
+multigap
+multigranulate
+multigranulated
+Multigraph
+multigraph
+multigrapher
+multiguttulate
+multigyrate
+multihead
+multihearth
+multihued
+multijet
+multijugate
+multijugous
+multilaciniate
+multilamellar
+multilamellate
+multilamellous
+multilaminar
+multilaminate
+multilaminated
+multilateral
+multilaterally
+multilighted
+multilineal
+multilinear
+multilingual
+multilinguist
+multilirate
+multiliteral
+multilobar
+multilobate
+multilobe
+multilobed
+multilobular
+multilobulate
+multilobulated
+multilocation
+multilocular
+multiloculate
+multiloculated
+multiloquence
+multiloquent
+multiloquious
+multiloquous
+multiloquy
+multimacular
+multimammate
+multimarble
+multimascular
+multimedial
+multimetalic
+multimetallism
+multimetallist
+multimillion
+multimillionaire
+multimodal
+multimodality
+multimolecular
+multimotor
+multimotored
+multinational
+multinervate
+multinervose
+multinodal
+multinodate
+multinodous
+multinodular
+multinomial
+multinominal
+multinominous
+multinuclear
+multinucleate
+multinucleated
+multinucleolar
+multinucleolate
+multinucleolated
+multiovular
+multiovulate
+multipara
+multiparient
+multiparity
+multiparous
+multipartisan
+multipartite
+multiped
+multiperforate
+multiperforated
+multipersonal
+multiphase
+multiphaser
+multiphotography
+multipinnate
+multiplane
+multiple
+multiplepoinding
+multiplet
+multiplex
+multipliable
+multipliableness
+multiplicability
+multiplicable
+multiplicand
+multiplicate
+multiplication
+multiplicational
+multiplicative
+multiplicatively
+multiplicator
+multiplicity
+multiplier
+multiply
+multiplying
+multipointed
+multipolar
+multipole
+multiported
+multipotent
+multipresence
+multipresent
+multiradial
+multiradiate
+multiradiated
+multiradicate
+multiradicular
+multiramified
+multiramose
+multiramous
+multirate
+multireflex
+multirooted
+multirotation
+multirotatory
+multisaccate
+multisacculate
+multisacculated
+multiscience
+multiseated
+multisect
+multisector
+multisegmental
+multisegmentate
+multisegmented
+multisensual
+multiseptate
+multiserial
+multiserially
+multiseriate
+multishot
+multisiliquous
+multisonous
+multispeed
+multispermous
+multispicular
+multispiculate
+multispindle
+multispinous
+multispiral
+multispired
+multistage
+multistaminate
+multistoried
+multistory
+multistratified
+multistratous
+multistriate
+multisulcate
+multisulcated
+multisyllabic
+multisyllability
+multisyllable
+multitarian
+multitentaculate
+multitheism
+multithreaded
+multititular
+multitoed
+multitoned
+multitube
+Multituberculata
+multituberculate
+multituberculated
+multituberculism
+multituberculy
+multitubular
+multitude
+multitudinal
+multitudinary
+multitudinism
+multitudinist
+multitudinistic
+multitudinosity
+multitudinous
+multitudinously
+multitudinousness
+multiturn
+multivagant
+multivalence
+multivalency
+multivalent
+multivalve
+multivalved
+multivalvular
+multivane
+multivariant
+multivarious
+multiversant
+multiverse
+multivibrator
+multivincular
+multivious
+multivocal
+multivocalness
+multivoiced
+multivolent
+multivoltine
+multivolumed
+multivorous
+multocular
+multum
+multungulate
+multure
+multurer
+mum
+mumble
+mumblebee
+mumblement
+mumbler
+mumbling
+mumblingly
+mummer
+mummery
+mummichog
+mummick
+mummied
+mummification
+mummiform
+mummify
+mumming
+mummy
+mummydom
+mummyhood
+mummylike
+mumness
+mump
+mumper
+mumphead
+mumpish
+mumpishly
+mumpishness
+mumps
+mumpsimus
+mumruffin
+mun
+Munandi
+Muncerian
+munch
+Munchausenism
+Munchausenize
+muncheel
+muncher
+munchet
+mund
+Munda
+mundane
+mundanely
+mundaneness
+mundanism
+mundanity
+Mundari
+mundatory
+mundic
+mundificant
+mundification
+mundifier
+mundify
+mundil
+mundivagant
+mundle
+mung
+munga
+munge
+mungey
+mungo
+mungofa
+munguba
+mungy
+Munia
+Munich
+Munichism
+municipal
+municipalism
+municipalist
+municipality
+municipalization
+municipalize
+municipalizer
+municipally
+municipium
+munific
+munificence
+munificency
+munificent
+munificently
+munificentness
+muniment
+munition
+munitionary
+munitioneer
+munitioner
+munitions
+munity
+munj
+munjeet
+munjistin
+munnion
+Munnopsidae
+Munnopsis
+Munsee
+munshi
+munt
+Muntiacus
+muntin
+Muntingia
+muntjac
+Munychia
+Munychian
+Munychion
+Muong
+Muphrid
+Mura
+mura
+Muradiyah
+Muraena
+Muraenidae
+muraenoid
+murage
+mural
+muraled
+muralist
+murally
+Muran
+Muranese
+murasakite
+Murat
+Muratorian
+murchy
+murder
+murderer
+murderess
+murdering
+murderingly
+murderish
+murderment
+murderous
+murderously
+murderousness
+murdrum
+mure
+murenger
+murex
+murexan
+murexide
+murga
+murgavi
+murgeon
+muriate
+muriated
+muriatic
+muricate
+muricid
+Muricidae
+muriciform
+muricine
+muricoid
+muriculate
+murid
+Muridae
+muridism
+Muriel
+muriform
+muriformly
+Murillo
+Murinae
+murine
+murinus
+muriti
+murium
+murk
+murkily
+murkiness
+murkish
+murkly
+murkness
+murksome
+murky
+murlin
+murly
+Murmi
+murmur
+murmuration
+murmurator
+murmurer
+murmuring
+murmuringly
+murmurish
+murmurless
+murmurlessly
+murmurous
+murmurously
+muromontite
+Murph
+murphy
+murra
+murrain
+Murray
+Murraya
+murre
+murrelet
+murrey
+murrhine
+murrina
+murrnong
+murshid
+Murthy
+murumuru
+Murut
+muruxi
+murva
+murza
+Murzim
+Mus
+Musa
+Musaceae
+musaceous
+Musaeus
+musal
+Musales
+Musalmani
+musang
+musar
+Musca
+muscade
+muscadel
+muscadine
+Muscadinia
+muscardine
+Muscardinidae
+Muscardinus
+Muscari
+muscariform
+muscarine
+muscat
+muscatel
+muscatorium
+Musci
+Muscicapa
+Muscicapidae
+muscicapine
+muscicide
+muscicole
+muscicoline
+muscicolous
+muscid
+Muscidae
+musciform
+Muscinae
+muscle
+muscled
+muscleless
+musclelike
+muscling
+muscly
+Muscogee
+muscoid
+Muscoidea
+muscologic
+muscological
+muscologist
+muscology
+muscone
+muscose
+muscoseness
+muscosity
+muscot
+muscovadite
+muscovado
+Muscovi
+Muscovite
+muscovite
+Muscovitic
+muscovitization
+muscovitize
+muscovy
+muscular
+muscularity
+muscularize
+muscularly
+musculation
+musculature
+muscule
+musculin
+musculoarterial
+musculocellular
+musculocutaneous
+musculodermic
+musculoelastic
+musculofibrous
+musculointestinal
+musculoligamentous
+musculomembranous
+musculopallial
+musculophrenic
+musculospinal
+musculospiral
+musculotegumentary
+musculotendinous
+Muse
+muse
+mused
+museful
+musefully
+museist
+museless
+muselike
+museographist
+museography
+museologist
+museology
+muser
+musery
+musette
+museum
+museumize
+Musgu
+mush
+musha
+mushaa
+Mushabbihite
+mushed
+musher
+mushhead
+mushheaded
+mushheadedness
+mushily
+mushiness
+mushla
+mushmelon
+mushrebiyeh
+mushroom
+mushroomer
+mushroomic
+mushroomlike
+mushroomy
+mushru
+mushy
+music
+musical
+musicale
+musicality
+musicalization
+musicalize
+musically
+musicalness
+musicate
+musician
+musiciana
+musicianer
+musicianly
+musicianship
+musicker
+musicless
+musiclike
+musicmonger
+musico
+musicoartistic
+musicodramatic
+musicofanatic
+musicographer
+musicography
+musicological
+musicologist
+musicologue
+musicology
+musicomania
+musicomechanical
+musicophilosophical
+musicophobia
+musicophysical
+musicopoetic
+musicotherapy
+musicproof
+musie
+musily
+musimon
+musing
+musingly
+musk
+muskat
+muskeg
+muskeggy
+muskellunge
+musket
+musketade
+musketeer
+musketlike
+musketoon
+musketproof
+musketry
+muskflower
+Muskhogean
+muskie
+muskiness
+muskish
+musklike
+muskmelon
+Muskogee
+muskrat
+muskroot
+Muskwaki
+muskwood
+musky
+muslin
+muslined
+muslinet
+musnud
+Musophaga
+Musophagi
+Musophagidae
+musophagine
+musquash
+musquashroot
+musquashweed
+musquaspen
+musquaw
+musrol
+muss
+mussable
+mussably
+Mussaenda
+mussal
+mussalchee
+mussel
+musseled
+musseler
+mussily
+mussiness
+mussitate
+mussitation
+mussuk
+Mussulman
+Mussulmanic
+Mussulmanish
+Mussulmanism
+Mussulwoman
+mussurana
+mussy
+must
+mustache
+mustached
+mustachial
+mustachio
+mustachioed
+mustafina
+Mustahfiz
+mustang
+mustanger
+mustard
+mustarder
+mustee
+Mustela
+mustelid
+Mustelidae
+musteline
+mustelinous
+musteloid
+Mustelus
+muster
+musterable
+musterdevillers
+musterer
+mustermaster
+mustify
+mustily
+mustiness
+mustnt
+musty
+muta
+Mutabilia
+mutability
+mutable
+mutableness
+mutably
+mutafacient
+mutage
+mutagenic
+mutant
+mutarotate
+mutarotation
+mutase
+mutate
+mutation
+mutational
+mutationally
+mutationism
+mutationist
+mutative
+mutatory
+mutawalli
+Mutazala
+mutch
+mute
+mutedly
+mutely
+muteness
+Muter
+mutesarif
+mutescence
+mutessarifat
+muth
+muthmannite
+muthmassel
+mutic
+muticous
+mutilate
+mutilation
+mutilative
+mutilator
+mutilatory
+Mutilla
+mutillid
+Mutillidae
+mutilous
+mutineer
+mutinous
+mutinously
+mutinousness
+mutiny
+Mutisia
+Mutisiaceae
+mutism
+mutist
+mutistic
+mutive
+mutivity
+mutoscope
+mutoscopic
+mutsje
+mutsuddy
+mutt
+mutter
+mutterer
+muttering
+mutteringly
+mutton
+muttonbird
+muttonchop
+muttonfish
+muttonhead
+muttonheaded
+muttonhood
+muttonmonger
+muttonwood
+muttony
+mutual
+mutualism
+mutualist
+mutualistic
+mutuality
+mutualization
+mutualize
+mutually
+mutualness
+mutuary
+mutuatitious
+mutulary
+mutule
+mutuum
+mux
+Muysca
+muyusa
+muzhik
+Muzo
+muzz
+muzzily
+muzziness
+muzzle
+muzzler
+muzzlewood
+muzzy
+Mwa
+my
+Mya
+Myacea
+myal
+myalgia
+myalgic
+myalism
+myall
+Myaria
+myarian
+myasthenia
+myasthenic
+myatonia
+myatonic
+myatony
+myatrophy
+mycele
+mycelia
+mycelial
+mycelian
+mycelioid
+mycelium
+myceloid
+Mycenaean
+Mycetes
+mycetism
+mycetocyte
+mycetogenesis
+mycetogenetic
+mycetogenic
+mycetogenous
+mycetoid
+mycetological
+mycetology
+mycetoma
+mycetomatous
+Mycetophagidae
+mycetophagous
+mycetophilid
+Mycetophilidae
+mycetous
+Mycetozoa
+mycetozoan
+mycetozoon
+Mycobacteria
+Mycobacteriaceae
+Mycobacterium
+mycocecidium
+mycocyte
+mycoderm
+mycoderma
+mycodermatoid
+mycodermatous
+mycodermic
+mycodermitis
+mycodesmoid
+mycodomatium
+mycogastritis
+Mycogone
+mycohaemia
+mycohemia
+mycoid
+mycologic
+mycological
+mycologically
+mycologist
+mycologize
+mycology
+mycomycete
+Mycomycetes
+mycomycetous
+mycomyringitis
+mycophagist
+mycophagous
+mycophagy
+mycophyte
+Mycoplana
+mycoplasm
+mycoplasmic
+mycoprotein
+mycorhiza
+mycorhizal
+mycorrhizal
+mycose
+mycosin
+mycosis
+mycosozin
+Mycosphaerella
+Mycosphaerellaceae
+mycosterol
+mycosymbiosis
+mycotic
+mycotrophic
+Mycteria
+mycteric
+mycterism
+Myctodera
+myctophid
+Myctophidae
+Myctophum
+Mydaidae
+mydaleine
+mydatoxine
+Mydaus
+mydine
+mydriasine
+mydriasis
+mydriatic
+mydriatine
+myectomize
+myectomy
+myectopia
+myectopy
+myelalgia
+myelapoplexy
+myelasthenia
+myelatrophy
+myelauxe
+myelemia
+myelencephalic
+myelencephalon
+myelencephalous
+myelic
+myelin
+myelinate
+myelinated
+myelination
+myelinic
+myelinization
+myelinogenesis
+myelinogenetic
+myelinogeny
+myelitic
+myelitis
+myeloblast
+myeloblastic
+myelobrachium
+myelocele
+myelocerebellar
+myelocoele
+myelocyst
+myelocystic
+myelocystocele
+myelocyte
+myelocythaemia
+myelocythemia
+myelocytic
+myelocytosis
+myelodiastasis
+myeloencephalitis
+myeloganglitis
+myelogenesis
+myelogenetic
+myelogenous
+myelogonium
+myeloic
+myeloid
+myelolymphangioma
+myelolymphocyte
+myeloma
+myelomalacia
+myelomatoid
+myelomatosis
+myelomenia
+myelomeningitis
+myelomeningocele
+myelomere
+myelon
+myelonal
+myeloneuritis
+myelonic
+myeloparalysis
+myelopathic
+myelopathy
+myelopetal
+myelophthisis
+myeloplast
+myeloplastic
+myeloplax
+myeloplegia
+myelopoiesis
+myelopoietic
+myelorrhagia
+myelorrhaphy
+myelosarcoma
+myelosclerosis
+myelospasm
+myelospongium
+myelosyphilis
+myelosyphilosis
+myelosyringosis
+myelotherapy
+Myelozoa
+myelozoan
+myentasis
+myenteric
+myenteron
+myesthesia
+mygale
+mygalid
+mygaloid
+Myiarchus
+myiasis
+myiferous
+myiodesopsia
+myiosis
+myitis
+mykiss
+myliobatid
+Myliobatidae
+myliobatine
+myliobatoid
+Mylodon
+mylodont
+Mylodontidae
+mylohyoid
+mylohyoidean
+mylonite
+mylonitic
+Mymar
+mymarid
+Mymaridae
+myna
+Mynheer
+mynpacht
+mynpachtbrief
+myoalbumin
+myoalbumose
+myoatrophy
+myoblast
+myoblastic
+myocardiac
+myocardial
+myocardiogram
+myocardiograph
+myocarditic
+myocarditis
+myocardium
+myocele
+myocellulitis
+myoclonic
+myoclonus
+myocoele
+myocoelom
+myocolpitis
+myocomma
+myocyte
+myodegeneration
+Myodes
+myodiastasis
+myodynamia
+myodynamic
+myodynamics
+myodynamiometer
+myodynamometer
+myoedema
+myoelectric
+myoendocarditis
+myoepicardial
+myoepithelial
+myofibril
+myofibroma
+myogen
+myogenesis
+myogenetic
+myogenic
+myogenous
+myoglobin
+myoglobulin
+myogram
+myograph
+myographer
+myographic
+myographical
+myographist
+myography
+myohematin
+myoid
+myoidema
+myokinesis
+myolemma
+myolipoma
+myoliposis
+myologic
+myological
+myologist
+myology
+myolysis
+myoma
+myomalacia
+myomancy
+myomantic
+myomatous
+myomectomy
+myomelanosis
+myomere
+myometritis
+myometrium
+myomohysterectomy
+myomorph
+Myomorpha
+myomorphic
+myomotomy
+myoneme
+myoneural
+myoneuralgia
+myoneurasthenia
+myoneure
+myoneuroma
+myoneurosis
+myonosus
+myopachynsis
+myoparalysis
+myoparesis
+myopathia
+myopathic
+myopathy
+myope
+myoperitonitis
+myophan
+myophore
+myophorous
+myophysical
+myophysics
+myopia
+myopic
+myopical
+myopically
+myoplasm
+myoplastic
+myoplasty
+myopolar
+Myoporaceae
+myoporaceous
+myoporad
+Myoporum
+myoproteid
+myoprotein
+myoproteose
+myops
+myopy
+myorrhaphy
+myorrhexis
+myosalpingitis
+myosarcoma
+myosarcomatous
+myosclerosis
+myoscope
+myoseptum
+myosin
+myosinogen
+myosinose
+myosis
+myositic
+myositis
+myosote
+Myosotis
+myospasm
+myospasmia
+Myosurus
+myosuture
+myosynizesis
+myotacismus
+Myotalpa
+Myotalpinae
+myotasis
+myotenotomy
+myothermic
+myotic
+myotome
+myotomic
+myotomy
+myotonia
+myotonic
+myotonus
+myotony
+myotrophy
+myowun
+Myoxidae
+myoxine
+Myoxus
+Myra
+myrabalanus
+myrabolam
+myrcene
+Myrcia
+myrcia
+myriacanthous
+myriacoulomb
+myriad
+myriaded
+myriadfold
+myriadly
+myriadth
+myriagram
+myriagramme
+myrialiter
+myrialitre
+myriameter
+myriametre
+Myrianida
+myriapod
+Myriapoda
+myriapodan
+myriapodous
+myriarch
+myriarchy
+myriare
+Myrica
+myrica
+Myricaceae
+myricaceous
+Myricales
+myricetin
+myricin
+Myrick
+myricyl
+myricylic
+Myrientomata
+myringa
+myringectomy
+myringitis
+myringodectomy
+myringodermatitis
+myringomycosis
+myringoplasty
+myringotome
+myringotomy
+myriological
+myriologist
+myriologue
+myriophyllite
+myriophyllous
+Myriophyllum
+Myriopoda
+myriopodous
+myriorama
+myrioscope
+myriosporous
+myriotheism
+Myriotrichia
+Myriotrichiaceae
+myriotrichiaceous
+myristate
+myristic
+Myristica
+myristica
+Myristicaceae
+myristicaceous
+Myristicivora
+myristicivorous
+myristin
+myristone
+Myrmecia
+Myrmecobiinae
+myrmecobine
+Myrmecobius
+myrmecochorous
+myrmecochory
+myrmecoid
+myrmecoidy
+myrmecological
+myrmecologist
+myrmecology
+Myrmecophaga
+Myrmecophagidae
+myrmecophagine
+myrmecophagoid
+myrmecophagous
+myrmecophile
+myrmecophilism
+myrmecophilous
+myrmecophily
+myrmecophobic
+myrmecophyte
+myrmecophytic
+myrmekite
+Myrmeleon
+Myrmeleonidae
+Myrmeleontidae
+Myrmica
+myrmicid
+Myrmicidae
+myrmicine
+myrmicoid
+Myrmidon
+Myrmidonian
+myrmotherine
+myrobalan
+Myron
+myron
+myronate
+myronic
+myrosin
+myrosinase
+Myrothamnaceae
+myrothamnaceous
+Myrothamnus
+Myroxylon
+myrrh
+myrrhed
+myrrhic
+myrrhine
+Myrrhis
+myrrhol
+myrrhophore
+myrrhy
+Myrsinaceae
+myrsinaceous
+myrsinad
+Myrsiphyllum
+Myrtaceae
+myrtaceous
+myrtal
+Myrtales
+myrtiform
+Myrtilus
+myrtle
+myrtleberry
+myrtlelike
+myrtol
+Myrtus
+mysel
+myself
+mysell
+Mysian
+mysid
+Mysidacea
+Mysidae
+mysidean
+Mysis
+mysogynism
+mysoid
+mysophobia
+Mysore
+mysosophist
+mysost
+myst
+mystacial
+Mystacocete
+Mystacoceti
+mystagogic
+mystagogical
+mystagogically
+mystagogue
+mystagogy
+mystax
+mysterial
+mysteriarch
+mysteriosophic
+mysteriosophy
+mysterious
+mysteriously
+mysteriousness
+mysterize
+mystery
+mystes
+mystic
+mystical
+mysticality
+mystically
+mysticalness
+Mysticete
+mysticete
+Mysticeti
+mysticetous
+mysticism
+mysticity
+mysticize
+mysticly
+mystific
+mystifically
+mystification
+mystificator
+mystificatory
+mystifiedly
+mystifier
+mystify
+mystifyingly
+mytacism
+myth
+mythical
+mythicalism
+mythicality
+mythically
+mythicalness
+mythicism
+mythicist
+mythicize
+mythicizer
+mythification
+mythify
+mythism
+mythist
+mythize
+mythland
+mythmaker
+mythmaking
+mythoclast
+mythoclastic
+mythogenesis
+mythogonic
+mythogony
+mythographer
+mythographist
+mythography
+mythogreen
+mythoheroic
+mythohistoric
+mythologema
+mythologer
+mythological
+mythologically
+mythologist
+mythologize
+mythologizer
+mythologue
+mythology
+mythomania
+mythomaniac
+mythometer
+mythonomy
+mythopastoral
+mythopoeic
+mythopoeism
+mythopoeist
+mythopoem
+mythopoesis
+mythopoesy
+mythopoet
+mythopoetic
+mythopoetize
+mythopoetry
+mythos
+mythus
+Mytilacea
+mytilacean
+mytilaceous
+Mytiliaspis
+mytilid
+Mytilidae
+mytiliform
+mytiloid
+mytilotoxine
+Mytilus
+myxa
+myxadenitis
+myxadenoma
+myxaemia
+myxamoeba
+myxangitis
+myxasthenia
+myxedema
+myxedematoid
+myxedematous
+myxedemic
+myxemia
+Myxine
+Myxinidae
+myxinoid
+Myxinoidei
+myxo
+Myxobacteria
+Myxobacteriaceae
+myxobacteriaceous
+Myxobacteriales
+myxoblastoma
+myxochondroma
+myxochondrosarcoma
+Myxococcus
+myxocystoma
+myxocyte
+myxoenchondroma
+myxofibroma
+myxofibrosarcoma
+myxoflagellate
+myxogaster
+Myxogasteres
+Myxogastrales
+Myxogastres
+myxogastric
+myxogastrous
+myxoglioma
+myxoid
+myxoinoma
+myxolipoma
+myxoma
+myxomatosis
+myxomatous
+Myxomycetales
+myxomycete
+Myxomycetes
+myxomycetous
+myxomyoma
+myxoneuroma
+myxopapilloma
+Myxophyceae
+myxophycean
+Myxophyta
+myxopod
+Myxopoda
+myxopodan
+myxopodium
+myxopodous
+myxopoiesis
+myxorrhea
+myxosarcoma
+Myxospongiae
+myxospongian
+Myxospongida
+myxospore
+Myxosporidia
+myxosporidian
+Myxosporidiida
+Myxosporium
+myxosporous
+Myxothallophyta
+myxotheca
+Myzodendraceae
+myzodendraceous
+Myzodendron
+Myzomyia
+myzont
+Myzontes
+Myzostoma
+Myzostomata
+myzostomatous
+myzostome
+myzostomid
+Myzostomida
+Myzostomidae
+myzostomidan
+myzostomous
+N
+n
+na
+naa
+naam
+Naaman
+Naassenes
+nab
+nabak
+Nabal
+Nabalism
+Nabalite
+Nabalitic
+Nabaloi
+Nabalus
+Nabataean
+Nabatean
+Nabathaean
+Nabathean
+Nabathite
+nabber
+Nabby
+nabk
+nabla
+nable
+nabob
+nabobery
+nabobess
+nabobical
+nabobish
+nabobishly
+nabobism
+nabobry
+nabobship
+Nabothian
+nabs
+Nabu
+nacarat
+nacarine
+nace
+nacelle
+nach
+nachani
+Nachitoch
+Nachitoches
+Nachschlag
+Nacionalista
+nacket
+nacre
+nacred
+nacreous
+nacrine
+nacrite
+nacrous
+nacry
+nadder
+Nadeem
+nadir
+nadiral
+nadorite
+nae
+naebody
+naegate
+naegates
+nael
+Naemorhedinae
+naemorhedine
+Naemorhedus
+naether
+naething
+nag
+Naga
+naga
+nagaika
+nagana
+nagara
+Nagari
+nagatelite
+nagger
+naggin
+nagging
+naggingly
+naggingness
+naggish
+naggle
+naggly
+naggy
+naght
+nagkassar
+nagmaal
+nagman
+nagnag
+nagnail
+nagor
+nagsman
+nagster
+nagual
+nagualism
+nagualist
+nagyagite
+Nahanarvali
+Nahane
+Nahani
+Naharvali
+Nahor
+Nahua
+Nahuan
+Nahuatl
+Nahuatlac
+Nahuatlan
+Nahuatleca
+Nahuatlecan
+Nahum
+naiad
+Naiadaceae
+naiadaceous
+Naiadales
+Naiades
+naiant
+Naias
+naid
+naif
+naifly
+naig
+naigie
+naik
+nail
+nailbin
+nailbrush
+nailer
+naileress
+nailery
+nailhead
+nailing
+nailless
+naillike
+nailprint
+nailproof
+nailrod
+nailshop
+nailsick
+nailsmith
+nailwort
+naily
+Naim
+nain
+nainsel
+nainsook
+naio
+naipkin
+Nair
+nairy
+nais
+naish
+naissance
+naissant
+naither
+naive
+naively
+naiveness
+naivete
+naivety
+Naja
+nak
+nake
+naked
+nakedish
+nakedize
+nakedly
+nakedness
+nakedweed
+nakedwood
+naker
+nakhlite
+nakhod
+nakhoda
+Nakir
+nako
+Nakomgilisala
+nakong
+nakoo
+Nakula
+Nalita
+nallah
+nam
+Nama
+namability
+namable
+Namaqua
+namaqua
+Namaquan
+namaycush
+namaz
+namazlik
+Nambe
+namda
+name
+nameability
+nameable
+nameboard
+nameless
+namelessly
+namelessness
+nameling
+namely
+namer
+namesake
+naming
+nammad
+Nan
+nan
+Nana
+nana
+Nanaimo
+nanawood
+Nance
+Nancy
+nancy
+Nanda
+Nandi
+nandi
+Nandina
+nandine
+nandow
+nandu
+nane
+nanes
+nanga
+nanism
+nanization
+nankeen
+Nankin
+nankin
+Nanking
+Nankingese
+nannander
+nannandrium
+nannandrous
+Nannette
+nannoplankton
+Nanny
+nanny
+nannyberry
+nannybush
+nanocephalia
+nanocephalic
+nanocephalism
+nanocephalous
+nanocephalus
+nanocephaly
+nanoid
+nanomelia
+nanomelous
+nanomelus
+nanosoma
+nanosomia
+nanosomus
+nanpie
+nant
+Nanticoke
+nantle
+nantokite
+Nantz
+naological
+naology
+naometry
+Naomi
+Naos
+naos
+Naosaurus
+Naoto
+nap
+napa
+Napaea
+Napaean
+napal
+napalm
+nape
+napead
+napecrest
+napellus
+naperer
+napery
+naphtha
+naphthacene
+naphthalate
+naphthalene
+naphthaleneacetic
+naphthalenesulphonic
+naphthalenic
+naphthalenoid
+naphthalic
+naphthalidine
+naphthalin
+naphthaline
+naphthalization
+naphthalize
+naphthalol
+naphthamine
+naphthanthracene
+naphthene
+naphthenic
+naphthinduline
+naphthionate
+naphtho
+naphthoic
+naphthol
+naphtholate
+naphtholize
+naphtholsulphonate
+naphtholsulphonic
+naphthoquinone
+naphthoresorcinol
+naphthosalol
+naphthous
+naphthoxide
+naphthyl
+naphthylamine
+naphthylaminesulphonic
+naphthylene
+naphthylic
+naphtol
+Napierian
+napiform
+napkin
+napkining
+napless
+naplessness
+Napoleon
+napoleon
+Napoleonana
+Napoleonic
+Napoleonically
+Napoleonism
+Napoleonist
+Napoleonistic
+napoleonite
+Napoleonize
+napoo
+nappe
+napped
+napper
+nappiness
+napping
+nappishness
+nappy
+naprapath
+naprapathy
+napron
+napthionic
+napu
+nar
+Narcaciontes
+Narcaciontidae
+narceine
+narcism
+Narciss
+Narcissan
+narcissi
+Narcissine
+narcissism
+narcissist
+narcissistic
+Narcissus
+narcist
+narcistic
+narcoanalysis
+narcoanesthesia
+Narcobatidae
+Narcobatoidea
+Narcobatus
+narcohypnia
+narcohypnosis
+narcolepsy
+narcoleptic
+narcoma
+narcomania
+narcomaniac
+narcomaniacal
+narcomatous
+Narcomedusae
+narcomedusan
+narcose
+narcosis
+narcostimulant
+narcosynthesis
+narcotherapy
+narcotia
+narcotic
+narcotical
+narcotically
+narcoticalness
+narcoticism
+narcoticness
+narcotina
+narcotine
+narcotinic
+narcotism
+narcotist
+narcotization
+narcotize
+narcous
+nard
+nardine
+nardoo
+Nardus
+Naren
+Narendra
+nares
+Naresh
+narghile
+nargil
+narial
+naric
+narica
+naricorn
+nariform
+narine
+naringenin
+naringin
+nark
+narky
+narr
+narra
+Narraganset
+narras
+narratable
+narrate
+narrater
+narration
+narrational
+narrative
+narratively
+narrator
+narratory
+narratress
+narratrix
+narrawood
+narrow
+narrower
+narrowhearted
+narrowheartedness
+narrowingness
+narrowish
+narrowly
+narrowness
+narrowy
+narsarsukite
+narsinga
+narthecal
+Narthecium
+narthex
+narwhal
+narwhalian
+nary
+nasab
+nasal
+Nasalis
+nasalis
+nasalism
+nasality
+nasalization
+nasalize
+nasally
+nasalward
+nasalwards
+nasard
+Nascan
+Nascapi
+nascence
+nascency
+nascent
+nasch
+naseberry
+nasethmoid
+nash
+nashgab
+nashgob
+Nashim
+Nashira
+Nashua
+nasi
+nasial
+nasicorn
+Nasicornia
+nasicornous
+Nasiei
+nasiform
+nasilabial
+nasillate
+nasillation
+nasioalveolar
+nasiobregmatic
+nasioinial
+nasiomental
+nasion
+nasitis
+Naskhi
+nasoalveola
+nasoantral
+nasobasilar
+nasobronchial
+nasobuccal
+nasoccipital
+nasociliary
+nasoethmoidal
+nasofrontal
+nasolabial
+nasolachrymal
+nasological
+nasologist
+nasology
+nasomalar
+nasomaxillary
+nasonite
+nasoorbital
+nasopalatal
+nasopalatine
+nasopharyngeal
+nasopharyngitis
+nasopharynx
+nasoprognathic
+nasoprognathism
+nasorostral
+nasoscope
+nasoseptal
+nasosinuitis
+nasosinusitis
+nasosubnasal
+nasoturbinal
+nasrol
+Nassa
+Nassau
+Nassellaria
+nassellarian
+Nassidae
+nassology
+nast
+nastaliq
+nastic
+nastika
+nastily
+nastiness
+nasturtion
+nasturtium
+nasty
+Nasua
+nasus
+nasute
+nasuteness
+nasutiform
+nasutus
+nat
+natability
+nataka
+Natal
+natal
+Natalia
+Natalian
+Natalie
+natality
+nataloin
+natals
+natant
+natantly
+Nataraja
+natation
+natational
+natator
+natatorial
+natatorious
+natatorium
+natatory
+natch
+natchbone
+Natchez
+Natchezan
+Natchitoches
+natchnee
+Nate
+nates
+Nathan
+Nathanael
+Nathaniel
+nathe
+nather
+nathless
+Natica
+Naticidae
+naticiform
+naticine
+Natick
+naticoid
+natiform
+natimortality
+nation
+national
+nationalism
+nationalist
+nationalistic
+nationalistically
+nationality
+nationalization
+nationalize
+nationalizer
+nationally
+nationalness
+nationalty
+nationhood
+nationless
+nationwide
+native
+natively
+nativeness
+nativism
+nativist
+nativistic
+nativity
+natr
+Natraj
+Natricinae
+natricine
+natrium
+Natrix
+natrochalcite
+natrojarosite
+natrolite
+natron
+Natt
+natter
+nattered
+natteredness
+natterjack
+nattily
+nattiness
+nattle
+natty
+natuary
+natural
+naturalesque
+naturalism
+naturalist
+naturalistic
+naturalistically
+naturality
+naturalization
+naturalize
+naturalizer
+naturally
+naturalness
+nature
+naturecraft
+naturelike
+naturing
+naturism
+naturist
+naturistic
+naturistically
+naturize
+naturopath
+naturopathic
+naturopathist
+naturopathy
+naucrar
+naucrary
+naufragous
+nauger
+naught
+naughtily
+naughtiness
+naughty
+naujaite
+naumachia
+naumachy
+naumannite
+Naumburgia
+naumk
+naumkeag
+naumkeager
+naunt
+nauntle
+naupathia
+nauplial
+naupliiform
+nauplioid
+nauplius
+nauropometer
+nauscopy
+nausea
+nauseant
+nauseaproof
+nauseate
+nauseatingly
+nauseation
+nauseous
+nauseously
+nauseousness
+Nauset
+naut
+nautch
+nauther
+nautic
+nautical
+nauticality
+nautically
+nautics
+nautiform
+Nautilacea
+nautilacean
+nautilicone
+nautiliform
+nautilite
+nautiloid
+Nautiloidea
+nautiloidean
+nautilus
+Navaho
+Navajo
+naval
+navalese
+navalism
+navalist
+navalistic
+navalistically
+navally
+navar
+navarch
+navarchy
+Navarrese
+Navarrian
+nave
+navel
+naveled
+navellike
+navelwort
+navet
+navette
+navew
+navicella
+navicert
+navicula
+Naviculaceae
+naviculaeform
+navicular
+naviculare
+naviculoid
+naviform
+navigability
+navigable
+navigableness
+navigably
+navigant
+navigate
+navigation
+navigational
+navigator
+navigerous
+navipendular
+navipendulum
+navite
+navvy
+navy
+naw
+nawab
+nawabship
+nawt
+nay
+Nayar
+Nayarit
+Nayarita
+nayaur
+naysay
+naysayer
+nayward
+nayword
+Nazarate
+Nazarean
+Nazarene
+Nazarenism
+Nazarite
+Nazariteship
+Nazaritic
+Nazaritish
+Nazaritism
+naze
+Nazerini
+Nazi
+Nazify
+Naziism
+nazim
+nazir
+Nazirate
+Nazirite
+Naziritic
+Nazism
+ne
+nea
+Neal
+neal
+neallotype
+Neanderthal
+Neanderthaler
+Neanderthaloid
+neanic
+neanthropic
+neap
+neaped
+Neapolitan
+nearable
+nearabout
+nearabouts
+nearaivays
+nearaway
+nearby
+Nearctic
+Nearctica
+nearest
+nearish
+nearly
+nearmost
+nearness
+nearsighted
+nearsightedly
+nearsightedness
+nearthrosis
+neat
+neaten
+neath
+neatherd
+neatherdess
+neathmost
+neatify
+neatly
+neatness
+neb
+neback
+Nebaioth
+Nebalia
+Nebaliacea
+nebalian
+Nebaliidae
+nebalioid
+nebbed
+nebbuck
+nebbuk
+nebby
+nebel
+nebelist
+nebenkern
+Nebiim
+Nebraskan
+nebris
+nebula
+nebulae
+nebular
+nebularization
+nebularize
+nebulated
+nebulation
+nebule
+nebulescent
+nebuliferous
+nebulite
+nebulium
+nebulization
+nebulize
+nebulizer
+nebulose
+nebulosity
+nebulous
+nebulously
+nebulousness
+Necator
+necessar
+necessarian
+necessarianism
+necessarily
+necessariness
+necessary
+necessism
+necessist
+necessitarian
+necessitarianism
+necessitate
+necessitatedly
+necessitatingly
+necessitation
+necessitative
+necessitous
+necessitously
+necessitousness
+necessitude
+necessity
+neck
+neckar
+neckatee
+neckband
+neckcloth
+necked
+necker
+neckercher
+neckerchief
+neckful
+neckguard
+necking
+neckinger
+necklace
+necklaced
+necklaceweed
+neckless
+necklet
+necklike
+neckline
+neckmold
+neckpiece
+neckstock
+necktie
+necktieless
+neckward
+neckwear
+neckweed
+neckyoke
+necrectomy
+necremia
+necrobacillary
+necrobacillosis
+necrobiosis
+necrobiotic
+necrogenic
+necrogenous
+necrographer
+necrolatry
+necrologic
+necrological
+necrologically
+necrologist
+necrologue
+necrology
+necromancer
+necromancing
+necromancy
+necromantic
+necromantically
+necromorphous
+necronite
+necropathy
+Necrophaga
+necrophagan
+necrophagous
+necrophile
+necrophilia
+necrophilic
+necrophilism
+necrophilistic
+necrophilous
+necrophily
+necrophobia
+necrophobic
+Necrophorus
+necropoleis
+necropoles
+necropolis
+necropolitan
+necropsy
+necroscopic
+necroscopical
+necroscopy
+necrose
+necrosis
+necrotic
+necrotization
+necrotize
+necrotomic
+necrotomist
+necrotomy
+necrotype
+necrotypic
+Nectandra
+nectar
+nectareal
+nectarean
+nectared
+nectareous
+nectareously
+nectareousness
+nectarial
+nectarian
+nectaried
+nectariferous
+nectarine
+Nectarinia
+Nectariniidae
+nectarious
+nectarium
+nectarivorous
+nectarize
+nectarlike
+nectarous
+nectary
+nectiferous
+nectocalycine
+nectocalyx
+Nectonema
+nectophore
+nectopod
+Nectria
+nectriaceous
+Nectrioidaceae
+Necturidae
+Necturus
+Ned
+nedder
+neddy
+Nederlands
+nee
+neebor
+neebour
+need
+needer
+needfire
+needful
+needfully
+needfulness
+needgates
+needham
+needily
+neediness
+needing
+needle
+needlebill
+needlebook
+needlebush
+needlecase
+needled
+needlefish
+needleful
+needlelike
+needlemaker
+needlemaking
+needleman
+needlemonger
+needleproof
+needler
+needles
+needless
+needlessly
+needlessness
+needlestone
+needlewoman
+needlewood
+needlework
+needleworked
+needleworker
+needling
+needly
+needments
+needs
+needsome
+needy
+neeger
+neeld
+neele
+neelghan
+neem
+neencephalic
+neencephalon
+Neengatu
+neep
+neepour
+neer
+neese
+neet
+neetup
+neeze
+nef
+nefandous
+nefandousness
+nefarious
+nefariously
+nefariousness
+nefast
+neffy
+neftgil
+negate
+negatedness
+negation
+negationalist
+negationist
+negative
+negatively
+negativeness
+negativer
+negativism
+negativist
+negativistic
+negativity
+negator
+negatory
+negatron
+neger
+neginoth
+neglect
+neglectable
+neglectedly
+neglectedness
+neglecter
+neglectful
+neglectfully
+neglectfulness
+neglectingly
+neglection
+neglective
+neglectively
+neglector
+neglectproof
+negligee
+negligence
+negligency
+negligent
+negligently
+negligibility
+negligible
+negligibleness
+negligibly
+negotiability
+negotiable
+negotiant
+negotiate
+negotiation
+negotiator
+negotiatory
+negotiatress
+negotiatrix
+Negress
+negrillo
+negrine
+Negritian
+Negritic
+Negritize
+Negrito
+Negritoid
+Negro
+negro
+negrodom
+Negrofy
+negrohead
+negrohood
+Negroid
+Negroidal
+negroish
+Negroism
+Negroization
+Negroize
+negrolike
+Negroloid
+Negrophil
+Negrophile
+Negrophilism
+Negrophilist
+Negrophobe
+Negrophobia
+Negrophobiac
+Negrophobist
+Negrotic
+Negundo
+Negus
+negus
+Nehantic
+Nehemiah
+nehiloth
+nei
+neif
+neigh
+neighbor
+neighbored
+neighborer
+neighboress
+neighborhood
+neighboring
+neighborless
+neighborlike
+neighborliness
+neighborly
+neighborship
+neighborstained
+neighbourless
+neighbourlike
+neighbourship
+neigher
+Neil
+Neillia
+neiper
+Neisseria
+Neisserieae
+neist
+neither
+Nejd
+Nejdi
+Nekkar
+nekton
+nektonic
+Nelken
+Nell
+Nellie
+Nelly
+nelson
+nelsonite
+nelumbian
+Nelumbium
+Nelumbo
+Nelumbonaceae
+nema
+nemaline
+Nemalion
+Nemalionaceae
+Nemalionales
+nemalite
+Nemastomaceae
+Nematelmia
+nematelminth
+Nematelminthes
+nemathece
+nemathecial
+nemathecium
+Nemathelmia
+nemathelminth
+Nemathelminthes
+nematic
+nematoblast
+nematoblastic
+Nematocera
+nematoceran
+nematocerous
+nematocide
+nematocyst
+nematocystic
+Nematoda
+nematode
+nematodiasis
+nematogene
+nematogenic
+nematogenous
+nematognath
+Nematognathi
+nematognathous
+nematogone
+nematogonous
+nematoid
+Nematoidea
+nematoidean
+nematologist
+nematology
+Nematomorpha
+nematophyton
+Nematospora
+nematozooid
+Nembutal
+Nemean
+Nemertea
+nemertean
+Nemertina
+nemertine
+Nemertinea
+nemertinean
+Nemertini
+nemertoid
+nemeses
+Nemesia
+nemesic
+Nemesis
+Nemichthyidae
+Nemichthys
+Nemocera
+nemoceran
+nemocerous
+Nemopanthus
+Nemophila
+nemophilist
+nemophilous
+nemophily
+nemoral
+Nemorensian
+nemoricole
+Nengahiba
+nenta
+nenuphar
+neo
+neoacademic
+neoanthropic
+Neoarctic
+neoarsphenamine
+Neobalaena
+Neobeckia
+neoblastic
+neobotanist
+neobotany
+Neocene
+Neoceratodus
+neocerotic
+neoclassic
+neoclassicism
+neoclassicist
+Neocomian
+neocosmic
+neocracy
+neocriticism
+neocyanine
+neocyte
+neocytosis
+neodamode
+neodidymium
+neodymium
+Neofabraea
+neofetal
+neofetus
+Neofiber
+neoformation
+neoformative
+Neogaea
+Neogaean
+neogamous
+neogamy
+Neogene
+neogenesis
+neogenetic
+Neognathae
+neognathic
+neognathous
+neogrammarian
+neogrammatical
+neographic
+neohexane
+Neohipparion
+neoholmia
+neoholmium
+neoimpressionism
+neoimpressionist
+neolalia
+neolater
+neolatry
+neolith
+neolithic
+neologian
+neologianism
+neologic
+neological
+neologically
+neologism
+neologist
+neologistic
+neologistical
+neologization
+neologize
+neology
+neomedievalism
+neomenia
+neomenian
+Neomeniidae
+neomiracle
+neomodal
+neomorph
+Neomorpha
+neomorphic
+neomorphism
+Neomylodon
+neon
+neonatal
+neonate
+neonatus
+neonomian
+neonomianism
+neontology
+neonychium
+neopagan
+neopaganism
+neopaganize
+Neopaleozoic
+neopallial
+neopallium
+neoparaffin
+neophilism
+neophilological
+neophilologist
+neophobia
+neophobic
+neophrastic
+Neophron
+neophyte
+neophytic
+neophytish
+neophytism
+Neopieris
+neoplasia
+neoplasm
+neoplasma
+neoplasmata
+neoplastic
+neoplasticism
+neoplasty
+Neoplatonic
+Neoplatonician
+Neoplatonism
+Neoplatonist
+neoprene
+neorama
+neorealism
+Neornithes
+neornithic
+Neosalvarsan
+Neosorex
+Neosporidia
+neossin
+neossology
+neossoptile
+neostriatum
+neostyle
+neoteinia
+neoteinic
+neotenia
+neotenic
+neoteny
+neoteric
+neoterically
+neoterism
+neoterist
+neoteristic
+neoterize
+neothalamus
+Neotoma
+Neotragus
+Neotremata
+Neotropic
+Neotropical
+neotype
+neovitalism
+neovolcanic
+Neowashingtonia
+neoytterbium
+neoza
+Neozoic
+Nep
+nep
+Nepa
+Nepal
+Nepalese
+Nepali
+Nepenthaceae
+nepenthaceous
+nepenthe
+nepenthean
+Nepenthes
+nepenthes
+neper
+Neperian
+Nepeta
+nephalism
+nephalist
+Nephele
+nephele
+nepheligenous
+nepheline
+nephelinic
+nephelinite
+nephelinitic
+nephelinitoid
+nephelite
+Nephelium
+nephelognosy
+nepheloid
+nephelometer
+nephelometric
+nephelometrical
+nephelometrically
+nephelometry
+nephelorometer
+nepheloscope
+nephesh
+nephew
+nephewship
+Nephila
+Nephilinae
+Nephite
+nephogram
+nephograph
+nephological
+nephologist
+nephology
+nephoscope
+nephradenoma
+nephralgia
+nephralgic
+nephrapostasis
+nephratonia
+nephrauxe
+nephrectasia
+nephrectasis
+nephrectomize
+nephrectomy
+nephrelcosis
+nephremia
+nephremphraxis
+nephria
+nephric
+nephridia
+nephridial
+nephridiopore
+nephridium
+nephrism
+nephrite
+nephritic
+nephritical
+nephritis
+nephroabdominal
+nephrocardiac
+nephrocele
+nephrocoele
+nephrocolic
+nephrocolopexy
+nephrocoloptosis
+nephrocystitis
+nephrocystosis
+nephrocyte
+nephrodinic
+Nephrodium
+nephroerysipelas
+nephrogastric
+nephrogenetic
+nephrogenic
+nephrogenous
+nephrogonaduct
+nephrohydrosis
+nephrohypertrophy
+nephroid
+Nephrolepis
+nephrolith
+nephrolithic
+nephrolithotomy
+nephrologist
+nephrology
+nephrolysin
+nephrolysis
+nephrolytic
+nephromalacia
+nephromegaly
+nephromere
+nephron
+nephroncus
+nephroparalysis
+nephropathic
+nephropathy
+nephropexy
+nephrophthisis
+nephropore
+Nephrops
+Nephropsidae
+nephroptosia
+nephroptosis
+nephropyelitis
+nephropyeloplasty
+nephropyosis
+nephrorrhagia
+nephrorrhaphy
+nephros
+nephrosclerosis
+nephrosis
+nephrostoma
+nephrostome
+nephrostomial
+nephrostomous
+nephrostomy
+nephrotome
+nephrotomize
+nephrotomy
+nephrotoxic
+nephrotoxicity
+nephrotoxin
+nephrotuberculosis
+nephrotyphoid
+nephrotyphus
+nephrozymosis
+Nepidae
+nepionic
+nepman
+nepotal
+nepote
+nepotic
+nepotious
+nepotism
+nepotist
+nepotistical
+nepouite
+Neptune
+Neptunean
+Neptunian
+neptunism
+neptunist
+neptunium
+Nereid
+Nereidae
+nereidiform
+Nereidiformia
+Nereis
+nereite
+Nereocystis
+Neri
+Nerine
+nerine
+Nerita
+neritic
+Neritidae
+Neritina
+neritoid
+Nerium
+Neroic
+Neronian
+Neronic
+Neronize
+nerterology
+Nerthridae
+Nerthrus
+nerval
+nervate
+nervation
+nervature
+nerve
+nerveless
+nervelessly
+nervelessness
+nervelet
+nerveproof
+nerver
+nerveroot
+nervid
+nerviduct
+Nervii
+nervily
+nervimotion
+nervimotor
+nervimuscular
+nervine
+nerviness
+nerving
+nervish
+nervism
+nervomuscular
+nervosanguineous
+nervose
+nervosism
+nervosity
+nervous
+nervously
+nervousness
+nervular
+nervule
+nervulet
+nervulose
+nervuration
+nervure
+nervy
+nescience
+nescient
+nese
+nesh
+neshly
+neshness
+Nesiot
+nesiote
+Neskhi
+Neslia
+Nesogaea
+Nesogaean
+Nesokia
+Nesonetta
+Nesotragus
+Nespelim
+nesquehonite
+ness
+nesslerization
+Nesslerize
+nesslerize
+nest
+nestable
+nestage
+nester
+nestful
+nestiatria
+nestitherapy
+nestle
+nestler
+nestlike
+nestling
+Nestor
+Nestorian
+Nestorianism
+Nestorianize
+Nestorianizer
+nestorine
+nesty
+Net
+net
+netball
+netbraider
+netbush
+netcha
+Netchilik
+nete
+neter
+netful
+neth
+netheist
+nether
+Netherlander
+Netherlandian
+Netherlandic
+Netherlandish
+nethermore
+nethermost
+netherstock
+netherstone
+netherward
+netherwards
+Nethinim
+neti
+netleaf
+netlike
+netmaker
+netmaking
+netman
+netmonger
+netop
+netsman
+netsuke
+nettable
+Nettapus
+netted
+netter
+Nettie
+netting
+Nettion
+nettle
+nettlebed
+nettlebird
+nettlefire
+nettlefish
+nettlefoot
+nettlelike
+nettlemonger
+nettler
+nettlesome
+nettlewort
+nettling
+nettly
+Netty
+netty
+netwise
+network
+Neudeckian
+neugroschen
+neuma
+neumatic
+neumatize
+neume
+neumic
+neurad
+neuradynamia
+neural
+neurale
+neuralgia
+neuralgiac
+neuralgic
+neuralgiform
+neuralgy
+neuralist
+neurapophyseal
+neurapophysial
+neurapophysis
+neurarthropathy
+neurasthenia
+neurasthenic
+neurasthenical
+neurasthenically
+neurataxia
+neurataxy
+neuration
+neuratrophia
+neuratrophic
+neuratrophy
+neuraxial
+neuraxis
+neuraxon
+neuraxone
+neurectasia
+neurectasis
+neurectasy
+neurectome
+neurectomic
+neurectomy
+neurectopia
+neurectopy
+neurenteric
+neurepithelium
+neurergic
+neurexairesis
+neurhypnology
+neurhypnotist
+neuriatry
+neuric
+neurilema
+neurilematic
+neurilemma
+neurilemmal
+neurilemmatic
+neurilemmatous
+neurilemmitis
+neurility
+neurin
+neurine
+neurinoma
+neurism
+neurite
+neuritic
+neuritis
+neuroanatomical
+neuroanatomy
+neurobiotactic
+neurobiotaxis
+neuroblast
+neuroblastic
+neuroblastoma
+neurocanal
+neurocardiac
+neurocele
+neurocentral
+neurocentrum
+neurochemistry
+neurochitin
+neurochondrite
+neurochord
+neurochorioretinitis
+neurocirculatory
+neurocity
+neuroclonic
+neurocoele
+neurocoelian
+neurocyte
+neurocytoma
+neurodegenerative
+neurodendrite
+neurodendron
+neurodermatitis
+neurodermatosis
+neurodermitis
+neurodiagnosis
+neurodynamic
+neurodynia
+neuroepidermal
+neuroepithelial
+neuroepithelium
+neurofibril
+neurofibrilla
+neurofibrillae
+neurofibrillar
+neurofibroma
+neurofibromatosis
+neurofil
+neuroganglion
+neurogastralgia
+neurogastric
+neurogenesis
+neurogenetic
+neurogenic
+neurogenous
+neuroglandular
+neuroglia
+neurogliac
+neuroglial
+neurogliar
+neuroglic
+neuroglioma
+neurogliosis
+neurogram
+neurogrammic
+neurographic
+neurography
+neurohistology
+neurohumor
+neurohumoral
+neurohypnology
+neurohypnotic
+neurohypnotism
+neurohypophysis
+neuroid
+neurokeratin
+neurokyme
+neurological
+neurologist
+neurologize
+neurology
+neurolymph
+neurolysis
+neurolytic
+neuroma
+neuromalacia
+neuromalakia
+neuromast
+neuromastic
+neuromatosis
+neuromatous
+neuromere
+neuromerism
+neuromerous
+neuromimesis
+neuromimetic
+neuromotor
+neuromuscular
+neuromusculature
+neuromyelitis
+neuromyic
+neuron
+neuronal
+neurone
+neuronic
+neuronism
+neuronist
+neuronophagia
+neuronophagy
+neuronym
+neuronymy
+neuroparalysis
+neuroparalytic
+neuropath
+neuropathic
+neuropathical
+neuropathically
+neuropathist
+neuropathological
+neuropathologist
+neuropathology
+neuropathy
+Neurope
+neurophagy
+neurophil
+neurophile
+neurophilic
+neurophysiological
+neurophysiology
+neuropile
+neuroplasm
+neuroplasmic
+neuroplasty
+neuroplexus
+neuropodial
+neuropodium
+neuropodous
+neuropore
+neuropsychiatric
+neuropsychiatrist
+neuropsychiatry
+neuropsychic
+neuropsychological
+neuropsychologist
+neuropsychology
+neuropsychopathic
+neuropsychopathy
+neuropsychosis
+neuropter
+Neuroptera
+neuropteran
+Neuropteris
+neuropterist
+neuropteroid
+Neuropteroidea
+neuropterological
+neuropterology
+neuropteron
+neuropterous
+neuroretinitis
+neurorrhaphy
+Neurorthoptera
+neurorthopteran
+neurorthopterous
+neurosal
+neurosarcoma
+neurosclerosis
+neuroses
+neurosis
+neuroskeletal
+neuroskeleton
+neurosome
+neurospasm
+neurospongium
+neurosthenia
+neurosurgeon
+neurosurgery
+neurosurgical
+neurosuture
+neurosynapse
+neurosyphilis
+neurotendinous
+neurotension
+neurotherapeutics
+neurotherapist
+neurotherapy
+neurothlipsis
+neurotic
+neurotically
+neuroticism
+neuroticize
+neurotization
+neurotome
+neurotomical
+neurotomist
+neurotomize
+neurotomy
+neurotonic
+neurotoxia
+neurotoxic
+neurotoxin
+neurotripsy
+neurotrophic
+neurotrophy
+neurotropic
+neurotropism
+neurovaccination
+neurovaccine
+neurovascular
+neurovisceral
+neurula
+neurypnological
+neurypnologist
+neurypnology
+Neustrian
+neuter
+neuterdom
+neuterlike
+neuterly
+neuterness
+neutral
+neutralism
+neutralist
+neutrality
+neutralization
+neutralize
+neutralizer
+neutrally
+neutralness
+neutrino
+neutroceptive
+neutroceptor
+neutroclusion
+Neutrodyne
+neutrologistic
+neutron
+neutropassive
+neutrophile
+neutrophilia
+neutrophilic
+neutrophilous
+Nevada
+Nevadan
+nevadite
+neve
+nevel
+never
+neverland
+nevermore
+nevertheless
+Neville
+nevo
+nevoid
+Nevome
+nevoy
+nevus
+nevyanskite
+new
+Newar
+Newari
+newberyite
+newcal
+Newcastle
+newcome
+newcomer
+newel
+newelty
+newfangle
+newfangled
+newfangledism
+newfangledly
+newfangledness
+newfanglement
+Newfoundland
+Newfoundlander
+Newichawanoc
+newing
+newings
+newish
+newlandite
+newly
+newlywed
+Newmanism
+Newmanite
+Newmanize
+newmarket
+newness
+Newport
+news
+newsbill
+newsboard
+newsboat
+newsboy
+newscast
+newscaster
+newscasting
+newsful
+newsiness
+newsless
+newslessness
+newsletter
+newsman
+newsmonger
+newsmongering
+newsmongery
+newspaper
+newspaperdom
+newspaperese
+newspaperish
+newspaperized
+newspaperman
+newspaperwoman
+newspapery
+newsprint
+newsreader
+newsreel
+newsroom
+newssheet
+newsstand
+newsteller
+newsworthiness
+newsworthy
+newsy
+newt
+newtake
+newton
+Newtonian
+Newtonianism
+Newtonic
+Newtonist
+newtonite
+nexal
+next
+nextly
+nextness
+nexum
+nexus
+neyanda
+ngai
+ngaio
+ngapi
+Ngoko
+Nguyen
+Nhan
+Nheengatu
+ni
+niacin
+Niagara
+Niagaran
+Niall
+Niantic
+Nias
+Niasese
+niata
+nib
+nibbana
+nibbed
+nibber
+nibble
+nibbler
+nibblingly
+nibby
+niblick
+niblike
+nibong
+nibs
+nibsome
+Nicaean
+Nicaragua
+Nicaraguan
+Nicarao
+niccolic
+niccoliferous
+niccolite
+niccolous
+Nice
+nice
+niceish
+niceling
+nicely
+Nicene
+niceness
+Nicenian
+Nicenist
+nicesome
+nicetish
+nicety
+Nichael
+niche
+nichelino
+nicher
+Nicholas
+Nici
+Nick
+nick
+nickel
+nickelage
+nickelic
+nickeliferous
+nickeline
+nickeling
+nickelization
+nickelize
+nickellike
+nickelodeon
+nickelous
+nickeltype
+nicker
+nickerpecker
+nickey
+Nickie
+Nickieben
+nicking
+nickle
+nickname
+nicknameable
+nicknamee
+nicknameless
+nicknamer
+Nickneven
+nickstick
+nicky
+Nicobar
+Nicobarese
+Nicodemite
+Nicodemus
+Nicol
+Nicolaitan
+Nicolaitanism
+Nicolas
+nicolayite
+Nicolette
+Nicolo
+nicolo
+Nicomachean
+nicotia
+nicotian
+Nicotiana
+nicotianin
+nicotic
+nicotinamide
+nicotine
+nicotinean
+nicotined
+nicotineless
+nicotinian
+nicotinic
+nicotinism
+nicotinize
+nicotism
+nicotize
+nictate
+nictation
+nictitant
+nictitate
+nictitation
+nid
+nidal
+nidamental
+nidana
+nidation
+nidatory
+niddering
+niddick
+niddle
+nide
+nidge
+nidget
+nidgety
+nidi
+nidicolous
+nidificant
+nidificate
+nidification
+nidificational
+nidifugous
+nidify
+niding
+nidologist
+nidology
+nidor
+nidorosity
+nidorous
+nidorulent
+nidulant
+Nidularia
+Nidulariaceae
+nidulariaceous
+Nidulariales
+nidulate
+nidulation
+nidulus
+nidus
+niece
+nieceless
+nieceship
+niellated
+nielled
+niellist
+niello
+Niels
+niepa
+Nierembergia
+Niersteiner
+Nietzschean
+Nietzscheanism
+Nietzscheism
+nieve
+nieveta
+nievling
+nife
+nifesima
+niffer
+nific
+nifle
+nifling
+nifty
+nig
+Nigel
+Nigella
+Nigerian
+niggard
+niggardize
+niggardliness
+niggardling
+niggardly
+niggardness
+nigger
+niggerdom
+niggerfish
+niggergoose
+niggerhead
+niggerish
+niggerism
+niggerling
+niggertoe
+niggerweed
+niggery
+niggle
+niggler
+niggling
+nigglingly
+niggly
+nigh
+nighly
+nighness
+night
+nightcap
+nightcapped
+nightcaps
+nightchurr
+nightdress
+nighted
+nightfall
+nightfish
+nightflit
+nightfowl
+nightgown
+nighthawk
+nightie
+nightingale
+nightingalize
+nightjar
+nightless
+nightlessness
+nightlike
+nightlong
+nightly
+nightman
+nightmare
+nightmarish
+nightmarishly
+nightmary
+nights
+nightshade
+nightshine
+nightshirt
+nightstock
+nightstool
+nighttide
+nighttime
+nightwalker
+nightwalking
+nightward
+nightwards
+nightwear
+nightwork
+nightworker
+nignay
+nignye
+nigori
+nigranilin
+nigraniline
+nigre
+nigrescence
+nigrescent
+nigresceous
+nigrescite
+nigrification
+nigrified
+nigrify
+nigrine
+Nigritian
+nigrities
+nigritude
+nigritudinous
+nigrosine
+nigrous
+nigua
+Nihal
+nihilianism
+nihilianistic
+nihilification
+nihilify
+nihilism
+nihilist
+nihilistic
+nihilitic
+nihility
+nikau
+Nikeno
+nikethamide
+Nikko
+niklesite
+Nikolai
+nil
+Nile
+nilgai
+Nilometer
+Nilometric
+Niloscope
+Nilot
+Nilotic
+Nilous
+nilpotent
+Nils
+nim
+nimb
+nimbated
+nimbed
+nimbi
+nimbiferous
+nimbification
+nimble
+nimblebrained
+nimbleness
+nimbly
+nimbose
+nimbosity
+nimbus
+nimbused
+nimiety
+niminy
+nimious
+Nimkish
+nimmer
+Nimrod
+Nimrodian
+Nimrodic
+Nimrodical
+Nimrodize
+nimshi
+Nina
+nincom
+nincompoop
+nincompoopery
+nincompoophood
+nincompoopish
+nine
+ninebark
+ninefold
+nineholes
+ninepegs
+ninepence
+ninepenny
+ninepin
+ninepins
+ninescore
+nineted
+nineteen
+nineteenfold
+nineteenth
+nineteenthly
+ninetieth
+ninety
+ninetyfold
+ninetyish
+ninetyknot
+Ninevite
+Ninevitical
+Ninevitish
+Ning
+Ningpo
+Ninja
+ninny
+ninnyhammer
+ninnyish
+ninnyism
+ninnyship
+ninnywatch
+Ninon
+ninon
+Ninox
+ninth
+ninthly
+nintu
+ninut
+niobate
+Niobe
+Niobean
+niobic
+Niobid
+Niobite
+niobite
+niobium
+niobous
+niog
+niota
+Nip
+nip
+nipa
+nipcheese
+niphablepsia
+niphotyphlosis
+Nipissing
+Nipmuc
+nipper
+nipperkin
+nippers
+nippily
+nippiness
+nipping
+nippingly
+nippitate
+nipple
+nippleless
+nipplewort
+Nipponese
+Nipponism
+nipponium
+Nipponize
+nippy
+nipter
+Niquiran
+nirles
+nirmanakaya
+nirvana
+nirvanic
+Nisaean
+Nisan
+nisei
+Nishada
+nishiki
+nisnas
+nispero
+Nisqualli
+nisse
+nisus
+nit
+nitch
+nitchevo
+Nitella
+nitency
+nitently
+niter
+niterbush
+nitered
+nither
+nithing
+nitid
+nitidous
+nitidulid
+Nitidulidae
+nito
+niton
+nitramine
+nitramino
+nitranilic
+nitraniline
+nitrate
+nitratine
+nitration
+nitrator
+Nitrian
+nitriary
+nitric
+nitridation
+nitride
+nitriding
+nitridization
+nitridize
+nitrifaction
+nitriferous
+nitrifiable
+nitrification
+nitrifier
+nitrify
+nitrile
+Nitriot
+nitrite
+nitro
+nitroalizarin
+nitroamine
+nitroaniline
+Nitrobacter
+nitrobacteria
+Nitrobacteriaceae
+Nitrobacterieae
+nitrobarite
+nitrobenzene
+nitrobenzol
+nitrobenzole
+nitrocalcite
+nitrocellulose
+nitrocellulosic
+nitrochloroform
+nitrocotton
+nitroform
+nitrogelatin
+nitrogen
+nitrogenate
+nitrogenation
+nitrogenic
+nitrogenization
+nitrogenize
+nitrogenous
+nitroglycerin
+nitrohydrochloric
+nitrolamine
+nitrolic
+nitrolime
+nitromagnesite
+nitrometer
+nitrometric
+nitromuriate
+nitromuriatic
+nitronaphthalene
+nitroparaffin
+nitrophenol
+nitrophilous
+nitrophyte
+nitrophytic
+nitroprussiate
+nitroprussic
+nitroprusside
+nitrosamine
+nitrosate
+nitrosification
+nitrosify
+nitrosite
+nitrosobacteria
+nitrosochloride
+Nitrosococcus
+Nitrosomonas
+nitrososulphuric
+nitrostarch
+nitrosulphate
+nitrosulphonic
+nitrosulphuric
+nitrosyl
+nitrosylsulphuric
+nitrotoluene
+nitrous
+nitroxyl
+nitryl
+nitter
+nitty
+nitwit
+Nitzschia
+Nitzschiaceae
+Niuan
+Niue
+nival
+nivation
+nivellate
+nivellation
+nivellator
+nivellization
+nivenite
+niveous
+nivicolous
+nivosity
+nix
+nixie
+niyoga
+Nizam
+nizam
+nizamate
+nizamut
+nizy
+njave
+No
+no
+noa
+Noachian
+Noachic
+Noachical
+Noachite
+Noah
+Noahic
+Noam
+nob
+nobber
+nobbily
+nobble
+nobbler
+nobbut
+nobby
+nobiliary
+nobilify
+nobilitate
+nobilitation
+nobility
+noble
+noblehearted
+nobleheartedly
+nobleheartedness
+nobleman
+noblemanly
+nobleness
+noblesse
+noblewoman
+nobley
+nobly
+nobody
+nobodyness
+nobs
+nocake
+Nocardia
+nocardiosis
+nocent
+nocerite
+nociassociation
+nociceptive
+nociceptor
+nociperception
+nociperceptive
+nock
+nocket
+nocktat
+noctambulant
+noctambulation
+noctambule
+noctambulism
+noctambulist
+noctambulistic
+noctambulous
+Nocten
+noctidial
+noctidiurnal
+noctiferous
+noctiflorous
+Noctilio
+Noctilionidae
+Noctiluca
+noctiluca
+noctilucal
+noctilucan
+noctilucence
+noctilucent
+Noctilucidae
+noctilucin
+noctilucine
+noctilucous
+noctiluminous
+noctipotent
+noctivagant
+noctivagation
+noctivagous
+noctograph
+noctovision
+Noctuae
+noctuid
+Noctuidae
+noctuiform
+noctule
+nocturia
+nocturn
+nocturnal
+nocturnally
+nocturne
+nocuity
+nocuous
+nocuously
+nocuousness
+nod
+nodal
+nodality
+nodated
+nodder
+nodding
+noddingly
+noddle
+noddy
+node
+noded
+nodi
+nodiak
+nodical
+nodicorn
+nodiferous
+nodiflorous
+nodiform
+Nodosaria
+nodosarian
+nodosariform
+nodosarine
+nodose
+nodosity
+nodous
+nodular
+nodulate
+nodulated
+nodulation
+nodule
+noduled
+nodulize
+nodulose
+nodulous
+nodulus
+nodus
+noegenesis
+noegenetic
+Noel
+noel
+noematachograph
+noematachometer
+noematachometic
+Noemi
+Noetic
+noetic
+noetics
+nog
+nogada
+Nogai
+nogal
+noggen
+noggin
+nogging
+noghead
+nogheaded
+nohow
+Nohuntsik
+noibwood
+noil
+noilage
+noiler
+noily
+noint
+nointment
+noir
+noise
+noiseful
+noisefully
+noiseless
+noiselessly
+noiselessness
+noisemaker
+noisemaking
+noiseproof
+noisette
+noisily
+noisiness
+noisome
+noisomely
+noisomeness
+noisy
+nokta
+Nolascan
+nolition
+Noll
+noll
+nolle
+nolleity
+nollepros
+nolo
+noma
+nomad
+nomadian
+nomadic
+nomadical
+nomadically
+Nomadidae
+nomadism
+nomadization
+nomadize
+nomancy
+nomarch
+nomarchy
+Nomarthra
+nomarthral
+nombril
+nome
+Nomeidae
+nomenclate
+nomenclative
+nomenclator
+nomenclatorial
+nomenclatorship
+nomenclatory
+nomenclatural
+nomenclature
+nomenclaturist
+Nomeus
+nomial
+nomic
+nomina
+nominable
+nominal
+nominalism
+nominalist
+nominalistic
+nominality
+nominally
+nominate
+nominated
+nominately
+nomination
+nominatival
+nominative
+nominatively
+nominator
+nominatrix
+nominature
+nominee
+nomineeism
+nominy
+nomism
+nomisma
+nomismata
+nomistic
+nomocanon
+nomocracy
+nomogenist
+nomogenous
+nomogeny
+nomogram
+nomograph
+nomographer
+nomographic
+nomographical
+nomographically
+nomography
+nomological
+nomologist
+nomology
+nomopelmous
+nomophylax
+nomophyllous
+nomos
+nomotheism
+nomothete
+nomothetes
+nomothetic
+nomothetical
+non
+Nona
+nonabandonment
+nonabdication
+nonabiding
+nonability
+nonabjuration
+nonabjurer
+nonabolition
+nonabridgment
+nonabsentation
+nonabsolute
+nonabsolution
+nonabsorbable
+nonabsorbent
+nonabsorptive
+nonabstainer
+nonabstaining
+nonabstemious
+nonabstention
+nonabstract
+nonacademic
+nonacceding
+nonacceleration
+nonaccent
+nonacceptance
+nonacceptant
+nonacceptation
+nonaccess
+nonaccession
+nonaccessory
+nonaccidental
+nonaccompaniment
+nonaccompanying
+nonaccomplishment
+nonaccredited
+nonaccretion
+nonachievement
+nonacid
+nonacknowledgment
+nonacosane
+nonacoustic
+nonacquaintance
+nonacquiescence
+nonacquiescent
+nonacquisitive
+nonacquittal
+nonact
+nonactinic
+nonaction
+nonactionable
+nonactive
+nonactuality
+nonaculeate
+nonacute
+nonadditive
+nonadecane
+nonadherence
+nonadherent
+nonadhesion
+nonadhesive
+nonadjacent
+nonadjectival
+nonadjournment
+nonadjustable
+nonadjustive
+nonadjustment
+nonadministrative
+nonadmiring
+nonadmission
+nonadmitted
+nonadoption
+Nonadorantes
+nonadornment
+nonadult
+nonadvancement
+nonadvantageous
+nonadventitious
+nonadventurous
+nonadverbial
+nonadvertence
+nonadvertency
+nonadvocate
+nonaerating
+nonaerobiotic
+nonaesthetic
+nonaffection
+nonaffiliated
+nonaffirmation
+nonage
+nonagenarian
+nonagency
+nonagent
+nonagesimal
+nonagglutinative
+nonagglutinator
+nonaggression
+nonaggressive
+nonagon
+nonagrarian
+nonagreement
+nonagricultural
+nonahydrate
+nonaid
+nonair
+nonalarmist
+nonalcohol
+nonalcoholic
+nonalgebraic
+nonalienating
+nonalienation
+nonalignment
+nonalkaloidal
+nonallegation
+nonallegorical
+nonalliterated
+nonalliterative
+nonallotment
+nonalluvial
+nonalphabetic
+nonaltruistic
+nonaluminous
+nonamalgamable
+nonamendable
+nonamino
+nonamotion
+nonamphibious
+nonamputation
+nonanalogy
+nonanalytical
+nonanalyzable
+nonanalyzed
+nonanaphoric
+nonanaphthene
+nonanatomical
+nonancestral
+nonane
+nonanesthetized
+nonangelic
+nonangling
+nonanimal
+nonannexation
+nonannouncement
+nonannuitant
+nonannulment
+nonanoic
+nonanonymity
+nonanswer
+nonantagonistic
+nonanticipative
+nonantigenic
+nonapologetic
+nonapostatizing
+nonapostolic
+nonapparent
+nonappealable
+nonappearance
+nonappearer
+nonappearing
+nonappellate
+nonappendicular
+nonapplication
+nonapply
+nonappointment
+nonapportionable
+nonapposable
+nonappraisal
+nonappreciation
+nonapprehension
+nonappropriation
+nonapproval
+nonaqueous
+nonarbitrable
+nonarcing
+nonargentiferous
+nonaristocratic
+nonarithmetical
+nonarmament
+nonarmigerous
+nonaromatic
+nonarraignment
+nonarrival
+nonarsenical
+nonarterial
+nonartesian
+nonarticulated
+nonarticulation
+nonartistic
+nonary
+nonascendancy
+nonascertainable
+nonascertaining
+nonascetic
+nonascription
+nonaseptic
+nonaspersion
+nonasphalt
+nonaspirate
+nonaspiring
+nonassault
+nonassent
+nonassentation
+nonassented
+nonassenting
+nonassertion
+nonassertive
+nonassessable
+nonassessment
+nonassignable
+nonassignment
+nonassimilable
+nonassimilating
+nonassimilation
+nonassistance
+nonassistive
+nonassociable
+nonassortment
+nonassurance
+nonasthmatic
+nonastronomical
+nonathletic
+nonatmospheric
+nonatonement
+nonattached
+nonattachment
+nonattainment
+nonattendance
+nonattendant
+nonattention
+nonattestation
+nonattribution
+nonattributive
+nonaugmentative
+nonauricular
+nonauriferous
+nonauthentication
+nonauthoritative
+nonautomatic
+nonautomotive
+nonavoidance
+nonaxiomatic
+nonazotized
+nonbachelor
+nonbacterial
+nonbailable
+nonballoting
+nonbanishment
+nonbankable
+nonbarbarous
+nonbaronial
+nonbase
+nonbasement
+nonbasic
+nonbasing
+nonbathing
+nonbearded
+nonbearing
+nonbeing
+nonbeliever
+nonbelieving
+nonbelligerent
+nonbending
+nonbenevolent
+nonbetrayal
+nonbeverage
+nonbilabiate
+nonbilious
+nonbinomial
+nonbiological
+nonbitter
+nonbituminous
+nonblack
+nonblameless
+nonbleeding
+nonblended
+nonblockaded
+nonblocking
+nonblooded
+nonblooming
+nonbodily
+nonbookish
+nonborrower
+nonbotanical
+nonbourgeois
+nonbranded
+nonbreakable
+nonbreeder
+nonbreeding
+nonbroodiness
+nonbroody
+nonbrowsing
+nonbudding
+nonbulbous
+nonbulkhead
+nonbureaucratic
+nonburgage
+nonburgess
+nonburnable
+nonburning
+nonbursting
+nonbusiness
+nonbuying
+noncabinet
+noncaffeine
+noncaking
+Noncalcarea
+noncalcareous
+noncalcified
+noncallability
+noncallable
+noncancellable
+noncannibalistic
+noncanonical
+noncanonization
+noncanvassing
+noncapillarity
+noncapillary
+noncapital
+noncapitalist
+noncapitalistic
+noncapitulation
+noncapsizable
+noncapture
+noncarbonate
+noncareer
+noncarnivorous
+noncarrier
+noncartelized
+noncaste
+noncastigation
+noncataloguer
+noncatarrhal
+noncatechizable
+noncategorical
+noncathedral
+noncatholicity
+noncausality
+noncausation
+nonce
+noncelebration
+noncelestial
+noncellular
+noncellulosic
+noncensored
+noncensorious
+noncensus
+noncentral
+noncereal
+noncerebral
+nonceremonial
+noncertain
+noncertainty
+noncertified
+nonchafing
+nonchalance
+nonchalant
+nonchalantly
+nonchalantness
+nonchalky
+nonchallenger
+nonchampion
+nonchangeable
+nonchanging
+noncharacteristic
+nonchargeable
+nonchastisement
+nonchastity
+nonchemical
+nonchemist
+nonchivalrous
+nonchokable
+nonchokebore
+nonchronological
+nonchurch
+nonchurched
+nonchurchgoer
+nonciliate
+noncircuit
+noncircuital
+noncircular
+noncirculation
+noncitation
+noncitizen
+noncivilized
+nonclaim
+nonclaimable
+nonclassable
+nonclassical
+nonclassifiable
+nonclassification
+nonclastic
+nonclearance
+noncleistogamic
+nonclergyable
+nonclerical
+nonclimbable
+nonclinical
+nonclose
+nonclosure
+nonclotting
+noncoagulability
+noncoagulable
+noncoagulation
+noncoalescing
+noncock
+noncoercion
+noncoercive
+noncognate
+noncognition
+noncognitive
+noncognizable
+noncognizance
+noncoherent
+noncohesion
+noncohesive
+noncoinage
+noncoincidence
+noncoincident
+noncoincidental
+noncoking
+noncollaboration
+noncollaborative
+noncollapsible
+noncollectable
+noncollection
+noncollegiate
+noncollinear
+noncolloid
+noncollusion
+noncollusive
+noncolonial
+noncoloring
+noncom
+noncombat
+noncombatant
+noncombination
+noncombining
+noncombustible
+noncombustion
+noncome
+noncoming
+noncommemoration
+noncommencement
+noncommendable
+noncommensurable
+noncommercial
+noncommissioned
+noncommittal
+noncommittalism
+noncommittally
+noncommittalness
+noncommonable
+noncommorancy
+noncommunal
+noncommunicable
+noncommunicant
+noncommunicating
+noncommunication
+noncommunion
+noncommunist
+noncommunistic
+noncommutative
+noncompearance
+noncompensating
+noncompensation
+noncompetency
+noncompetent
+noncompeting
+noncompetitive
+noncompetitively
+noncomplaisance
+noncompletion
+noncompliance
+noncomplicity
+noncomplying
+noncomposite
+noncompoundable
+noncompounder
+noncomprehension
+noncompressible
+noncompression
+noncompulsion
+noncomputation
+noncon
+nonconcealment
+nonconceiving
+nonconcentration
+nonconception
+nonconcern
+nonconcession
+nonconciliating
+nonconcludency
+nonconcludent
+nonconcluding
+nonconclusion
+nonconcordant
+nonconcur
+nonconcurrence
+nonconcurrency
+nonconcurrent
+noncondensable
+noncondensation
+noncondensible
+noncondensing
+noncondimental
+nonconditioned
+noncondonation
+nonconducive
+nonconductibility
+nonconductible
+nonconducting
+nonconduction
+nonconductive
+nonconductor
+nonconfederate
+nonconferrable
+nonconfession
+nonconficient
+nonconfident
+nonconfidential
+nonconfinement
+nonconfirmation
+nonconfirmative
+nonconfiscable
+nonconfiscation
+nonconfitent
+nonconflicting
+nonconform
+nonconformable
+nonconformably
+nonconformance
+nonconformer
+nonconforming
+nonconformism
+nonconformist
+nonconformistical
+nonconformistically
+nonconformitant
+nonconformity
+nonconfutation
+noncongealing
+noncongenital
+noncongestion
+noncongratulatory
+noncongruent
+nonconjectural
+nonconjugal
+nonconjugate
+nonconjunction
+nonconnection
+nonconnective
+nonconnivance
+nonconnotative
+nonconnubial
+nonconscientious
+nonconscious
+nonconscription
+nonconsecration
+nonconsecutive
+nonconsent
+nonconsenting
+nonconsequence
+nonconsequent
+nonconservation
+nonconservative
+nonconserving
+nonconsideration
+nonconsignment
+nonconsistorial
+nonconsoling
+nonconsonant
+nonconsorting
+nonconspirator
+nonconspiring
+nonconstituent
+nonconstitutional
+nonconstraint
+nonconstruable
+nonconstruction
+nonconstructive
+nonconsular
+nonconsultative
+nonconsumable
+nonconsumption
+noncontact
+noncontagion
+noncontagionist
+noncontagious
+noncontagiousness
+noncontamination
+noncontemplative
+noncontending
+noncontent
+noncontention
+noncontentious
+noncontentiously
+nonconterminous
+noncontiguity
+noncontiguous
+noncontinental
+noncontingent
+noncontinuance
+noncontinuation
+noncontinuous
+noncontraband
+noncontraction
+noncontradiction
+noncontradictory
+noncontributing
+noncontribution
+noncontributor
+noncontributory
+noncontrivance
+noncontrolled
+noncontrolling
+noncontroversial
+nonconvective
+nonconvenable
+nonconventional
+nonconvergent
+nonconversable
+nonconversant
+nonconversational
+nonconversion
+nonconvertible
+nonconveyance
+nonconviction
+nonconvivial
+noncoplanar
+noncopying
+noncoring
+noncorporate
+noncorporeality
+noncorpuscular
+noncorrection
+noncorrective
+noncorrelation
+noncorrespondence
+noncorrespondent
+noncorresponding
+noncorroboration
+noncorroborative
+noncorrodible
+noncorroding
+noncorrosive
+noncorruption
+noncortical
+noncosmic
+noncosmopolitism
+noncostraight
+noncottager
+noncotyledonous
+noncounty
+noncranking
+noncreation
+noncreative
+noncredence
+noncredent
+noncredibility
+noncredible
+noncreditor
+noncreeping
+noncrenate
+noncretaceous
+noncriminal
+noncriminality
+noncrinoid
+noncritical
+noncrucial
+noncruciform
+noncrusading
+noncrushability
+noncrushable
+noncrustaceous
+noncrystalline
+noncrystallizable
+noncrystallized
+noncrystallizing
+nonculmination
+nonculpable
+noncultivated
+noncultivation
+nonculture
+noncumulative
+noncurantist
+noncurling
+noncurrency
+noncurrent
+noncursive
+noncurtailment
+noncuspidate
+noncustomary
+noncutting
+noncyclic
+noncyclical
+nonda
+nondamageable
+nondamnation
+nondancer
+nondangerous
+nondatival
+nondealer
+nondebtor
+nondecadence
+nondecadent
+nondecalcified
+nondecane
+nondecasyllabic
+nondecatoic
+nondecaying
+nondeceivable
+nondeception
+nondeceptive
+Nondeciduata
+nondeciduate
+nondeciduous
+nondecision
+nondeclarant
+nondeclaration
+nondeclarer
+nondecomposition
+nondecoration
+nondedication
+nondeduction
+nondefalcation
+nondefamatory
+nondefaulting
+nondefection
+nondefendant
+nondefense
+nondefensive
+nondeference
+nondeferential
+nondefiance
+nondefilement
+nondefining
+nondefinition
+nondefinitive
+nondeforestation
+nondegenerate
+nondegeneration
+nondegerming
+nondegradation
+nondegreased
+nondehiscent
+nondeist
+nondelegable
+nondelegate
+nondelegation
+nondeleterious
+nondeliberate
+nondeliberation
+nondelineation
+nondeliquescent
+nondelirious
+nondeliverance
+nondelivery
+nondemand
+nondemise
+nondemobilization
+nondemocratic
+nondemonstration
+nondendroid
+nondenial
+nondenominational
+nondenominationalism
+nondense
+nondenumerable
+nondenunciation
+nondepartmental
+nondeparture
+nondependence
+nondependent
+nondepletion
+nondeportation
+nondeported
+nondeposition
+nondepositor
+nondepravity
+nondepreciating
+nondepressed
+nondepression
+nondeprivable
+nonderivable
+nonderivative
+nonderogatory
+nondescript
+nondesecration
+nondesignate
+nondesigned
+nondesire
+nondesirous
+nondesisting
+nondespotic
+nondesquamative
+nondestructive
+nondesulphurized
+nondetachable
+nondetailed
+nondetention
+nondetermination
+nondeterminist
+nondeterrent
+nondetest
+nondetonating
+nondetrimental
+nondevelopable
+nondevelopment
+nondeviation
+nondevotional
+nondexterous
+nondiabetic
+nondiabolic
+nondiagnosis
+nondiagonal
+nondiagrammatic
+nondialectal
+nondialectical
+nondialyzing
+nondiametral
+nondiastatic
+nondiathermanous
+nondiazotizable
+nondichogamous
+nondichogamy
+nondichotomous
+nondictation
+nondictatorial
+nondictionary
+nondidactic
+nondieting
+nondifferentation
+nondifferentiable
+nondiffractive
+nondiffusing
+nondigestion
+nondilatable
+nondilution
+nondiocesan
+nondiphtheritic
+nondiphthongal
+nondiplomatic
+nondipterous
+nondirection
+nondirectional
+nondisagreement
+nondisappearing
+nondisarmament
+nondisbursed
+nondiscernment
+nondischarging
+nondisciplinary
+nondisclaim
+nondisclosure
+nondiscontinuance
+nondiscordant
+nondiscountable
+nondiscovery
+nondiscretionary
+nondiscrimination
+nondiscriminatory
+nondiscussion
+nondisestablishment
+nondisfigurement
+nondisfranchised
+nondisingenuous
+nondisintegration
+nondisinterested
+nondisjunct
+nondisjunction
+nondisjunctional
+nondisjunctive
+nondismemberment
+nondismissal
+nondisparaging
+nondisparate
+nondispensation
+nondispersal
+nondispersion
+nondisposal
+nondisqualifying
+nondissenting
+nondissolution
+nondistant
+nondistinctive
+nondistortion
+nondistribution
+nondistributive
+nondisturbance
+nondivergence
+nondivergent
+nondiversification
+nondivinity
+nondivisible
+nondivisiblity
+nondivision
+nondivisional
+nondivorce
+nondo
+nondoctrinal
+nondocumentary
+nondogmatic
+nondoing
+nondomestic
+nondomesticated
+nondominant
+nondonation
+nondramatic
+nondrinking
+nondropsical
+nondrying
+nonduality
+nondumping
+nonduplication
+nondutiable
+nondynastic
+nondyspeptic
+none
+nonearning
+noneastern
+noneatable
+nonecclesiastical
+nonechoic
+noneclectic
+noneclipsing
+nonecompense
+noneconomic
+nonedible
+noneditor
+noneditorial
+noneducable
+noneducation
+noneducational
+noneffective
+noneffervescent
+noneffete
+nonefficacious
+nonefficacy
+nonefficiency
+nonefficient
+noneffusion
+nonego
+nonegoistical
+nonejection
+nonelastic
+nonelasticity
+nonelect
+nonelection
+nonelective
+nonelector
+nonelectric
+nonelectrical
+nonelectrification
+nonelectrified
+nonelectrized
+nonelectrocution
+nonelectrolyte
+noneleemosynary
+nonelemental
+nonelementary
+nonelimination
+nonelopement
+nonemanating
+nonemancipation
+nonembarkation
+nonembellishment
+nonembezzlement
+nonembryonic
+nonemendation
+nonemergent
+nonemigration
+nonemission
+nonemotional
+nonemphatic
+nonemphatical
+nonempirical
+nonemploying
+nonemployment
+nonemulative
+nonenactment
+nonenclosure
+nonencroachment
+nonencyclopedic
+nonendemic
+nonendorsement
+nonenduring
+nonene
+nonenemy
+nonenergic
+nonenforceability
+nonenforceable
+nonenforcement
+nonengagement
+nonengineering
+nonenrolled
+nonent
+nonentailed
+nonenteric
+nonentertainment
+nonentitative
+nonentitive
+nonentitize
+nonentity
+nonentityism
+nonentomological
+nonentrant
+nonentres
+nonentry
+nonenumerated
+nonenunciation
+nonenvious
+nonenzymic
+nonephemeral
+nonepic
+nonepicurean
+nonepileptic
+nonepiscopal
+nonepiscopalian
+nonepithelial
+nonepochal
+nonequal
+nonequation
+nonequatorial
+nonequestrian
+nonequilateral
+nonequilibrium
+nonequivalent
+nonequivocating
+nonerasure
+nonerecting
+nonerection
+nonerotic
+nonerroneous
+nonerudite
+noneruption
+nones
+nonescape
+nonespionage
+nonespousal
+nonessential
+nonesthetic
+nonesuch
+nonet
+noneternal
+noneternity
+nonetheless
+nonethereal
+nonethical
+nonethnological
+nonethyl
+noneugenic
+noneuphonious
+nonevacuation
+nonevanescent
+nonevangelical
+nonevaporation
+nonevasion
+nonevasive
+noneviction
+nonevident
+nonevidential
+nonevil
+nonevolutionary
+nonevolutionist
+nonevolving
+nonexaction
+nonexaggeration
+nonexamination
+nonexcavation
+nonexcepted
+nonexcerptible
+nonexcessive
+nonexchangeability
+nonexchangeable
+nonexciting
+nonexclamatory
+nonexclusion
+nonexclusive
+nonexcommunicable
+nonexculpation
+nonexcusable
+nonexecution
+nonexecutive
+nonexemplary
+nonexemplificatior
+nonexempt
+nonexercise
+nonexertion
+nonexhibition
+nonexistence
+nonexistent
+nonexistential
+nonexisting
+nonexoneration
+nonexotic
+nonexpansion
+nonexpansive
+nonexpansively
+nonexpectation
+nonexpendable
+nonexperience
+nonexperienced
+nonexperimental
+nonexpert
+nonexpiation
+nonexpiry
+nonexploitation
+nonexplosive
+nonexportable
+nonexportation
+nonexposure
+nonexpulsion
+nonextant
+nonextempore
+nonextended
+nonextensile
+nonextension
+nonextensional
+nonextensive
+nonextenuatory
+nonexteriority
+nonextermination
+nonexternal
+nonexternality
+nonextinction
+nonextortion
+nonextracted
+nonextraction
+nonextraditable
+nonextradition
+nonextraneous
+nonextreme
+nonextrication
+nonextrinsic
+nonexuding
+nonexultation
+nonfabulous
+nonfacetious
+nonfacial
+nonfacility
+nonfacing
+nonfact
+nonfactious
+nonfactory
+nonfactual
+nonfacultative
+nonfaculty
+nonfaddist
+nonfading
+nonfailure
+nonfalse
+nonfamily
+nonfamous
+nonfanatical
+nonfanciful
+nonfarm
+nonfastidious
+nonfat
+nonfatal
+nonfatalistic
+nonfatty
+nonfavorite
+nonfeasance
+nonfeasor
+nonfeatured
+nonfebrile
+nonfederal
+nonfederated
+nonfeldspathic
+nonfelonious
+nonfelony
+nonfenestrated
+nonfermentability
+nonfermentable
+nonfermentation
+nonfermentative
+nonferrous
+nonfertile
+nonfertility
+nonfestive
+nonfeudal
+nonfibrous
+nonfiction
+nonfictional
+nonfiduciary
+nonfighter
+nonfigurative
+nonfilamentous
+nonfimbriate
+nonfinancial
+nonfinding
+nonfinishing
+nonfinite
+nonfireproof
+nonfiscal
+nonfisherman
+nonfissile
+nonfixation
+nonflaky
+nonflammable
+nonfloatation
+nonfloating
+nonfloriferous
+nonflowering
+nonflowing
+nonfluctuating
+nonfluid
+nonfluorescent
+nonflying
+nonfocal
+nonfood
+nonforeclosure
+nonforeign
+nonforeknowledge
+nonforest
+nonforested
+nonforfeitable
+nonforfeiting
+nonforfeiture
+nonform
+nonformal
+nonformation
+nonformulation
+nonfortification
+nonfortuitous
+nonfossiliferous
+nonfouling
+nonfrat
+nonfraternity
+nonfrauder
+nonfraudulent
+nonfreedom
+nonfreeman
+nonfreezable
+nonfreeze
+nonfreezing
+nonfricative
+nonfriction
+nonfrosted
+nonfruition
+nonfrustration
+nonfulfillment
+nonfunctional
+nonfundable
+nonfundamental
+nonfungible
+nonfuroid
+nonfusion
+nonfuturition
+nonfuturity
+nongalactic
+nongalvanized
+nonganglionic
+nongas
+nongaseous
+nongassy
+nongelatinizing
+nongelatinous
+nongenealogical
+nongenerative
+nongenetic
+nongentile
+nongeographical
+nongeological
+nongeometrical
+nongermination
+nongerundial
+nongildsman
+nongipsy
+nonglacial
+nonglandered
+nonglandular
+nonglare
+nonglucose
+nonglucosidal
+nonglucosidic
+nongod
+nongold
+nongolfer
+nongospel
+nongovernmental
+nongraduate
+nongraduated
+nongraduation
+nongrain
+nongranular
+nongraphitic
+nongrass
+nongratuitous
+nongravitation
+nongravity
+nongray
+nongreasy
+nongreen
+nongregarious
+nongremial
+nongrey
+nongrooming
+nonguarantee
+nonguard
+nonguttural
+nongymnast
+nongypsy
+nonhabitable
+nonhabitual
+nonhalation
+nonhallucination
+nonhandicap
+nonhardenable
+nonharmonic
+nonharmonious
+nonhazardous
+nonheading
+nonhearer
+nonheathen
+nonhedonistic
+nonhepatic
+nonhereditarily
+nonhereditary
+nonheritable
+nonheritor
+nonhero
+nonhieratic
+nonhistoric
+nonhistorical
+nonhomaloidal
+nonhomogeneity
+nonhomogeneous
+nonhomogenous
+nonhostile
+nonhouseholder
+nonhousekeeping
+nonhuman
+nonhumanist
+nonhumorous
+nonhumus
+nonhunting
+nonhydrogenous
+nonhydrolyzable
+nonhygrometric
+nonhygroscopic
+nonhypostatic
+nonic
+noniconoclastic
+nonideal
+nonidealist
+nonidentical
+nonidentity
+nonidiomatic
+nonidolatrous
+nonidyllic
+nonignitible
+nonignominious
+nonignorant
+nonillion
+nonillionth
+nonillumination
+nonillustration
+nonimaginary
+nonimbricating
+nonimitative
+nonimmateriality
+nonimmersion
+nonimmigrant
+nonimmigration
+nonimmune
+nonimmunity
+nonimmunized
+nonimpact
+nonimpairment
+nonimpartment
+nonimpatience
+nonimpeachment
+nonimperative
+nonimperial
+nonimplement
+nonimportation
+nonimporting
+nonimposition
+nonimpregnated
+nonimpressionist
+nonimprovement
+nonimputation
+nonincandescent
+nonincarnated
+nonincitement
+noninclination
+noninclusion
+noninclusive
+nonincrease
+nonincreasing
+nonincrusting
+nonindependent
+nonindictable
+nonindictment
+nonindividual
+nonindividualistic
+noninductive
+noninductively
+noninductivity
+nonindurated
+nonindustrial
+noninfallibilist
+noninfallible
+noninfantry
+noninfected
+noninfection
+noninfectious
+noninfinite
+noninfinitely
+noninflammability
+noninflammable
+noninflammatory
+noninflectional
+noninfluence
+noninformative
+noninfraction
+noninhabitant
+noninheritable
+noninherited
+noninitial
+noninjurious
+noninjury
+noninoculation
+noninquiring
+noninsect
+noninsertion
+noninstitution
+noninstruction
+noninstructional
+noninstructress
+noninstrumental
+noninsurance
+nonintegrable
+nonintegrity
+nonintellectual
+nonintelligence
+nonintelligent
+nonintent
+nonintention
+noninterchangeability
+noninterchangeable
+nonintercourse
+noninterference
+noninterferer
+noninterfering
+nonintermittent
+noninternational
+noninterpolation
+noninterposition
+noninterrupted
+nonintersecting
+nonintersector
+nonintervention
+noninterventionalist
+noninterventionist
+nonintoxicant
+nonintoxicating
+nonintrospective
+nonintrospectively
+nonintrusion
+nonintrusionism
+nonintrusionist
+nonintuitive
+noninverted
+noninvidious
+noninvincibility
+noniodized
+nonion
+nonionized
+nonionizing
+nonirate
+nonirradiated
+nonirrational
+nonirreparable
+nonirrevocable
+nonirrigable
+nonirrigated
+nonirrigating
+nonirrigation
+nonirritable
+nonirritant
+nonirritating
+nonisobaric
+nonisotropic
+nonissuable
+nonius
+nonjoinder
+nonjudicial
+nonjurable
+nonjurant
+nonjuress
+nonjuring
+nonjurist
+nonjuristic
+nonjuror
+nonjurorism
+nonjury
+nonjurying
+nonknowledge
+nonkosher
+nonlabeling
+nonlactescent
+nonlaminated
+nonlanguage
+nonlaying
+nonleaded
+nonleaking
+nonlegal
+nonlegato
+nonlegume
+nonlepidopterous
+nonleprous
+nonlevel
+nonlevulose
+nonliability
+nonliable
+nonliberation
+nonlicensed
+nonlicentiate
+nonlicet
+nonlicking
+nonlife
+nonlimitation
+nonlimiting
+nonlinear
+nonlipoidal
+nonliquefying
+nonliquid
+nonliquidating
+nonliquidation
+nonlister
+nonlisting
+nonliterary
+nonlitigious
+nonliturgical
+nonliving
+nonlixiviated
+nonlocal
+nonlocalized
+nonlogical
+nonlosable
+nonloser
+nonlover
+nonloving
+nonloxodromic
+nonluminescent
+nonluminosity
+nonluminous
+nonluster
+nonlustrous
+nonly
+nonmagnetic
+nonmagnetizable
+nonmaintenance
+nonmajority
+nonmalarious
+nonmalicious
+nonmalignant
+nonmalleable
+nonmammalian
+nonmandatory
+nonmanifest
+nonmanifestation
+nonmanila
+nonmannite
+nonmanual
+nonmanufacture
+nonmanufactured
+nonmanufacturing
+nonmarine
+nonmarital
+nonmaritime
+nonmarket
+nonmarriage
+nonmarriageable
+nonmarrying
+nonmartial
+nonmastery
+nonmaterial
+nonmaterialistic
+nonmateriality
+nonmaternal
+nonmathematical
+nonmathematician
+nonmatrimonial
+nonmatter
+nonmechanical
+nonmechanistic
+nonmedical
+nonmedicinal
+nonmedullated
+nonmelodious
+nonmember
+nonmembership
+nonmenial
+nonmental
+nonmercantile
+nonmetal
+nonmetallic
+nonmetalliferous
+nonmetallurgical
+nonmetamorphic
+nonmetaphysical
+nonmeteoric
+nonmeteorological
+nonmetric
+nonmetrical
+nonmetropolitan
+nonmicrobic
+nonmicroscopical
+nonmigratory
+nonmilitant
+nonmilitary
+nonmillionaire
+nonmimetic
+nonmineral
+nonmineralogical
+nonminimal
+nonministerial
+nonministration
+nonmiraculous
+nonmischievous
+nonmiscible
+nonmissionary
+nonmobile
+nonmodal
+nonmodern
+nonmolar
+nonmolecular
+nonmomentary
+nonmonarchical
+nonmonarchist
+nonmonastic
+nonmonist
+nonmonogamous
+nonmonotheistic
+nonmorainic
+nonmoral
+nonmorality
+nonmortal
+nonmotile
+nonmotoring
+nonmotorist
+nonmountainous
+nonmucilaginous
+nonmucous
+nonmulched
+nonmultiple
+nonmunicipal
+nonmuscular
+nonmusical
+nonmussable
+nonmutationally
+nonmutative
+nonmutual
+nonmystical
+nonmythical
+nonmythological
+nonnant
+nonnarcotic
+nonnasal
+nonnat
+nonnational
+nonnative
+nonnatural
+nonnaturalism
+nonnaturalistic
+nonnaturality
+nonnaturalness
+nonnautical
+nonnaval
+nonnavigable
+nonnavigation
+nonnebular
+nonnecessary
+nonnecessity
+nonnegligible
+nonnegotiable
+nonnegotiation
+nonnephritic
+nonnervous
+nonnescience
+nonnescient
+nonneutral
+nonneutrality
+nonnitrogenized
+nonnitrogenous
+nonnoble
+nonnomination
+nonnotification
+nonnotional
+nonnucleated
+nonnumeral
+nonnutrient
+nonnutritious
+nonnutritive
+nonobedience
+nonobedient
+nonobjection
+nonobjective
+nonobligatory
+nonobservable
+nonobservance
+nonobservant
+nonobservation
+nonobstetrical
+nonobstructive
+nonobvious
+nonoccidental
+nonocculting
+nonoccupant
+nonoccupation
+nonoccupational
+nonoccurrence
+nonodorous
+nonoecumenic
+nonoffender
+nonoffensive
+nonofficeholding
+nonofficial
+nonofficially
+nonofficinal
+nonoic
+nonoily
+nonolfactory
+nonomad
+nononerous
+nonopacity
+nonopening
+nonoperating
+nonoperative
+nonopposition
+nonoppressive
+nonoptical
+nonoptimistic
+nonoptional
+nonorchestral
+nonordination
+nonorganic
+nonorganization
+nonoriental
+nonoriginal
+nonornamental
+nonorthodox
+nonorthographical
+nonoscine
+nonostentation
+nonoutlawry
+nonoutrage
+nonoverhead
+nonoverlapping
+nonowner
+nonoxidating
+nonoxidizable
+nonoxidizing
+nonoxygenated
+nonoxygenous
+nonpacific
+nonpacification
+nonpacifist
+nonpagan
+nonpaid
+nonpainter
+nonpalatal
+nonpapal
+nonpapist
+nonpar
+nonparallel
+nonparalytic
+nonparasitic
+nonparasitism
+nonpareil
+nonparent
+nonparental
+nonpariello
+nonparishioner
+nonparliamentary
+nonparlor
+nonparochial
+nonparous
+nonpartial
+nonpartiality
+nonparticipant
+nonparticipating
+nonparticipation
+nonpartisan
+nonpartisanship
+nonpartner
+nonparty
+nonpassenger
+nonpasserine
+nonpastoral
+nonpatentable
+nonpatented
+nonpaternal
+nonpathogenic
+nonpause
+nonpaying
+nonpayment
+nonpeak
+nonpeaked
+nonpearlitic
+nonpecuniary
+nonpedestrian
+nonpedigree
+nonpelagic
+nonpeltast
+nonpenal
+nonpenalized
+nonpending
+nonpensionable
+nonpensioner
+nonperception
+nonperceptual
+nonperfection
+nonperforated
+nonperforating
+nonperformance
+nonperformer
+nonperforming
+nonperiodic
+nonperiodical
+nonperishable
+nonperishing
+nonperjury
+nonpermanent
+nonpermeability
+nonpermeable
+nonpermissible
+nonpermission
+nonperpendicular
+nonperpetual
+nonperpetuity
+nonpersecution
+nonperseverance
+nonpersistence
+nonpersistent
+nonperson
+nonpersonal
+nonpersonification
+nonpertinent
+nonperversive
+nonphagocytic
+nonpharmaceutical
+nonphenolic
+nonphenomenal
+nonphilanthropic
+nonphilological
+nonphilosophical
+nonphilosophy
+nonphonetic
+nonphosphatic
+nonphosphorized
+nonphotobiotic
+nonphysical
+nonphysiological
+nonpickable
+nonpigmented
+nonplacental
+nonplacet
+nonplanar
+nonplane
+nonplanetary
+nonplantowning
+nonplastic
+nonplate
+nonplausible
+nonpleading
+nonplus
+nonplusation
+nonplushed
+nonplutocratic
+nonpoet
+nonpoetic
+nonpoisonous
+nonpolar
+nonpolarizable
+nonpolarizing
+nonpolitical
+nonponderosity
+nonponderous
+nonpopery
+nonpopular
+nonpopularity
+nonporous
+nonporphyritic
+nonport
+nonportability
+nonportable
+nonportrayal
+nonpositive
+nonpossession
+nonposthumous
+nonpostponement
+nonpotential
+nonpower
+nonpractical
+nonpractice
+nonpraedial
+nonpreaching
+nonprecious
+nonprecipitation
+nonpredatory
+nonpredestination
+nonpredicative
+nonpredictable
+nonpreference
+nonpreferential
+nonpreformed
+nonpregnant
+nonprehensile
+nonprejudicial
+nonprelatical
+nonpremium
+nonpreparation
+nonprepayment
+nonprepositional
+nonpresbyter
+nonprescribed
+nonprescriptive
+nonpresence
+nonpresentation
+nonpreservation
+nonpresidential
+nonpress
+nonpressure
+nonprevalence
+nonprevalent
+nonpriestly
+nonprimitive
+nonprincipiate
+nonprincipled
+nonprobable
+nonprocreation
+nonprocurement
+nonproducer
+nonproducing
+nonproduction
+nonproductive
+nonproductively
+nonproductiveness
+nonprofane
+nonprofessed
+nonprofession
+nonprofessional
+nonprofessionalism
+nonprofessorial
+nonproficience
+nonproficiency
+nonproficient
+nonprofit
+nonprofiteering
+nonprognostication
+nonprogressive
+nonprohibitable
+nonprohibition
+nonprohibitive
+nonprojection
+nonprojective
+nonprojectively
+nonproletarian
+nonproliferous
+nonprolific
+nonprolongation
+nonpromiscuous
+nonpromissory
+nonpromotion
+nonpromulgation
+nonpronunciation
+nonpropagandistic
+nonpropagation
+nonprophetic
+nonpropitiation
+nonproportional
+nonproprietary
+nonproprietor
+nonprorogation
+nonproscriptive
+nonprosecution
+nonprospect
+nonprotection
+nonprotective
+nonproteid
+nonprotein
+nonprotestation
+nonprotractile
+nonprotractility
+nonproven
+nonprovided
+nonprovidential
+nonprovocation
+nonpsychic
+nonpsychological
+nonpublic
+nonpublication
+nonpublicity
+nonpueblo
+nonpulmonary
+nonpulsating
+nonpumpable
+nonpunctual
+nonpunctuation
+nonpuncturable
+nonpunishable
+nonpunishing
+nonpunishment
+nonpurchase
+nonpurchaser
+nonpurgative
+nonpurification
+nonpurposive
+nonpursuit
+nonpurulent
+nonpurveyance
+nonputrescent
+nonputrescible
+nonputting
+nonpyogenic
+nonpyritiferous
+nonqualification
+nonquality
+nonquota
+nonracial
+nonradiable
+nonradiating
+nonradical
+nonrailroader
+nonranging
+nonratability
+nonratable
+nonrated
+nonratifying
+nonrational
+nonrationalist
+nonrationalized
+nonrayed
+nonreaction
+nonreactive
+nonreactor
+nonreader
+nonreading
+nonrealistic
+nonreality
+nonrealization
+nonreasonable
+nonreasoner
+nonrebel
+nonrebellious
+nonreceipt
+nonreceiving
+nonrecent
+nonreception
+nonrecess
+nonrecipient
+nonreciprocal
+nonreciprocating
+nonreciprocity
+nonrecital
+nonreclamation
+nonrecluse
+nonrecognition
+nonrecognized
+nonrecoil
+nonrecollection
+nonrecommendation
+nonreconciliation
+nonrecourse
+nonrecoverable
+nonrecovery
+nonrectangular
+nonrectified
+nonrecuperation
+nonrecurrent
+nonrecurring
+nonredemption
+nonredressing
+nonreducing
+nonreference
+nonrefillable
+nonreflector
+nonreformation
+nonrefraction
+nonrefrigerant
+nonrefueling
+nonrefutation
+nonregardance
+nonregarding
+nonregenerating
+nonregenerative
+nonregent
+nonregimented
+nonregistered
+nonregistrability
+nonregistrable
+nonregistration
+nonregression
+nonregulation
+nonrehabilitation
+nonreigning
+nonreimbursement
+nonreinforcement
+nonreinstatement
+nonrejection
+nonrejoinder
+nonrelapsed
+nonrelation
+nonrelative
+nonrelaxation
+nonrelease
+nonreliance
+nonreligion
+nonreligious
+nonreligiousness
+nonrelinquishment
+nonremanie
+nonremedy
+nonremembrance
+nonremission
+nonremonstrance
+nonremuneration
+nonremunerative
+nonrendition
+nonrenewable
+nonrenewal
+nonrenouncing
+nonrenunciation
+nonrepair
+nonreparation
+nonrepayable
+nonrepealing
+nonrepeat
+nonrepeater
+nonrepentance
+nonrepetition
+nonreplacement
+nonreplicate
+nonreportable
+nonreprehensible
+nonrepresentation
+nonrepresentational
+nonrepresentationalism
+nonrepresentative
+nonrepression
+nonreprisal
+nonreproduction
+nonreproductive
+nonrepublican
+nonrepudiation
+nonrequirement
+nonrequisition
+nonrequital
+nonrescue
+nonresemblance
+nonreservation
+nonreserve
+nonresidence
+nonresidency
+nonresident
+nonresidental
+nonresidenter
+nonresidential
+nonresidentiary
+nonresidentor
+nonresidual
+nonresignation
+nonresinifiable
+nonresistance
+nonresistant
+nonresisting
+nonresistive
+nonresolvability
+nonresolvable
+nonresonant
+nonrespectable
+nonrespirable
+nonresponsibility
+nonrestitution
+nonrestraint
+nonrestricted
+nonrestriction
+nonrestrictive
+nonresumption
+nonresurrection
+nonresuscitation
+nonretaliation
+nonretention
+nonretentive
+nonreticence
+nonretinal
+nonretirement
+nonretiring
+nonretraceable
+nonretractation
+nonretractile
+nonretraction
+nonretrenchment
+nonretroactive
+nonreturn
+nonreturnable
+nonrevaluation
+nonrevealing
+nonrevelation
+nonrevenge
+nonrevenue
+nonreverse
+nonreversed
+nonreversible
+nonreversing
+nonreversion
+nonrevertible
+nonreviewable
+nonrevision
+nonrevival
+nonrevocation
+nonrevolting
+nonrevolutionary
+nonrevolving
+nonrhetorical
+nonrhymed
+nonrhyming
+nonrhythmic
+nonriding
+nonrigid
+nonrioter
+nonriparian
+nonritualistic
+nonrival
+nonromantic
+nonrotatable
+nonrotating
+nonrotative
+nonround
+nonroutine
+nonroyal
+nonroyalist
+nonrubber
+nonruminant
+Nonruminantia
+nonrun
+nonrupture
+nonrural
+nonrustable
+nonsabbatic
+nonsaccharine
+nonsacerdotal
+nonsacramental
+nonsacred
+nonsacrifice
+nonsacrificial
+nonsailor
+nonsalable
+nonsalaried
+nonsale
+nonsaline
+nonsalutary
+nonsalutation
+nonsalvation
+nonsanctification
+nonsanction
+nonsanctity
+nonsane
+nonsanguine
+nonsanity
+nonsaponifiable
+nonsatisfaction
+nonsaturated
+nonsaturation
+nonsaving
+nonsawing
+nonscalding
+nonscaling
+nonscandalous
+nonschematized
+nonschismatic
+nonscholastic
+nonscience
+nonscientific
+nonscientist
+nonscoring
+nonscraping
+nonscriptural
+nonscripturalist
+nonscrutiny
+nonseasonal
+nonsecession
+nonseclusion
+nonsecrecy
+nonsecret
+nonsecretarial
+nonsecretion
+nonsecretive
+nonsecretory
+nonsectarian
+nonsectional
+nonsectorial
+nonsecular
+nonsecurity
+nonsedentary
+nonseditious
+nonsegmented
+nonsegregation
+nonseizure
+nonselected
+nonselection
+nonselective
+nonself
+nonselfregarding
+nonselling
+nonsenatorial
+nonsense
+nonsensible
+nonsensical
+nonsensicality
+nonsensically
+nonsensicalness
+nonsensification
+nonsensify
+nonsensitive
+nonsensitiveness
+nonsensitized
+nonsensorial
+nonsensuous
+nonsentence
+nonsentient
+nonseparation
+nonseptate
+nonseptic
+nonsequacious
+nonsequaciousness
+nonsequestration
+nonserial
+nonserif
+nonserious
+nonserous
+nonserviential
+nonservile
+nonsetter
+nonsetting
+nonsettlement
+nonsexual
+nonsexually
+nonshaft
+nonsharing
+nonshatter
+nonshedder
+nonshipper
+nonshipping
+nonshredding
+nonshrinkable
+nonshrinking
+nonsiccative
+nonsidereal
+nonsignatory
+nonsignature
+nonsignificance
+nonsignificant
+nonsignification
+nonsignificative
+nonsilicated
+nonsiliceous
+nonsilver
+nonsimplification
+nonsine
+nonsinging
+nonsingular
+nonsinkable
+nonsinusoidal
+nonsiphonage
+nonsister
+nonsitter
+nonsitting
+nonskeptical
+nonskid
+nonskidding
+nonskipping
+nonslaveholding
+nonslip
+nonslippery
+nonslipping
+nonsludging
+nonsmoker
+nonsmoking
+nonsmutting
+nonsocial
+nonsocialist
+nonsocialistic
+nonsociety
+nonsociological
+nonsolar
+nonsoldier
+nonsolicitation
+nonsolid
+nonsolidified
+nonsolution
+nonsolvency
+nonsolvent
+nonsonant
+nonsovereign
+nonspalling
+nonsparing
+nonsparking
+nonspeaker
+nonspeaking
+nonspecial
+nonspecialist
+nonspecialized
+nonspecie
+nonspecific
+nonspecification
+nonspecificity
+nonspecified
+nonspectacular
+nonspectral
+nonspeculation
+nonspeculative
+nonspherical
+nonspill
+nonspillable
+nonspinning
+nonspinose
+nonspiny
+nonspiral
+nonspirit
+nonspiritual
+nonspirituous
+nonspontaneous
+nonspored
+nonsporeformer
+nonsporeforming
+nonsporting
+nonspottable
+nonsprouting
+nonstainable
+nonstaining
+nonstampable
+nonstandard
+nonstandardized
+nonstanzaic
+nonstaple
+nonstarch
+nonstarter
+nonstarting
+nonstatement
+nonstatic
+nonstationary
+nonstatistical
+nonstatutory
+nonstellar
+nonsticky
+nonstimulant
+nonstipulation
+nonstock
+nonstooping
+nonstop
+nonstrategic
+nonstress
+nonstretchable
+nonstretchy
+nonstriated
+nonstriker
+nonstriking
+nonstriped
+nonstructural
+nonstudent
+nonstudious
+nonstylized
+nonsubject
+nonsubjective
+nonsubmission
+nonsubmissive
+nonsubordination
+nonsubscriber
+nonsubscribing
+nonsubscription
+nonsubsiding
+nonsubsidy
+nonsubsistence
+nonsubstantial
+nonsubstantialism
+nonsubstantialist
+nonsubstantiality
+nonsubstantiation
+nonsubstantive
+nonsubstitution
+nonsubtraction
+nonsuccess
+nonsuccessful
+nonsuccession
+nonsuccessive
+nonsuccour
+nonsuction
+nonsuctorial
+nonsufferance
+nonsuffrage
+nonsugar
+nonsuggestion
+nonsuit
+nonsulphurous
+nonsummons
+nonsupplication
+nonsupport
+nonsupporter
+nonsupporting
+nonsuppositional
+nonsuppressed
+nonsuppression
+nonsuppurative
+nonsurface
+nonsurgical
+nonsurrender
+nonsurvival
+nonsurvivor
+nonsuspect
+nonsustaining
+nonsustenance
+nonswearer
+nonswearing
+nonsweating
+nonswimmer
+nonswimming
+nonsyllabic
+nonsyllabicness
+nonsyllogistic
+nonsyllogizing
+nonsymbiotic
+nonsymbiotically
+nonsymbolic
+nonsymmetrical
+nonsympathetic
+nonsympathizer
+nonsympathy
+nonsymphonic
+nonsymptomatic
+nonsynchronous
+nonsyndicate
+nonsynodic
+nonsynonymous
+nonsyntactic
+nonsyntactical
+nonsynthesized
+nonsyntonic
+nonsystematic
+nontabular
+nontactical
+nontan
+nontangential
+nontannic
+nontannin
+nontariff
+nontarnishable
+nontarnishing
+nontautomeric
+nontautomerizable
+nontax
+nontaxability
+nontaxable
+nontaxonomic
+nonteachable
+nonteacher
+nonteaching
+nontechnical
+nontechnological
+nonteetotaler
+nontelegraphic
+nonteleological
+nontelephonic
+nontemporal
+nontemporizing
+nontenant
+nontenure
+nontenurial
+nonterm
+nonterminating
+nonterrestrial
+nonterritorial
+nonterritoriality
+nontestamentary
+nontextual
+nontheatrical
+nontheistic
+nonthematic
+nontheological
+nontheosophical
+nontherapeutic
+nonthinker
+nonthinking
+nonthoracic
+nonthoroughfare
+nonthreaded
+nontidal
+nontillable
+nontimbered
+nontitaniferous
+nontitular
+nontolerated
+nontopographical
+nontourist
+nontoxic
+nontraction
+nontrade
+nontrader
+nontrading
+nontraditional
+nontragic
+nontrailing
+nontransferability
+nontransferable
+nontransgression
+nontransient
+nontransitional
+nontranslocation
+nontransmission
+nontransparency
+nontransparent
+nontransportation
+nontransposing
+nontransposition
+nontraveler
+nontraveling
+nontreasonable
+nontreated
+nontreatment
+nontreaty
+nontrespass
+nontrial
+nontribal
+nontribesman
+nontributary
+nontrier
+nontrigonometrical
+nontronite
+nontropical
+nontrunked
+nontruth
+nontuberculous
+nontuned
+nonturbinated
+nontutorial
+nontyphoidal
+nontypical
+nontypicalness
+nontypographical
+nontyrannical
+nonubiquitous
+nonulcerous
+nonultrafilterable
+nonumbilical
+nonumbilicate
+nonumbrellaed
+nonunanimous
+nonuncial
+nonundergraduate
+nonunderstandable
+nonunderstanding
+nonunderstandingly
+nonunderstood
+nonundulatory
+nonuniform
+nonuniformist
+nonuniformitarian
+nonuniformity
+nonuniformly
+nonunion
+nonunionism
+nonunionist
+nonunique
+nonunison
+nonunited
+nonuniversal
+nonuniversity
+nonupholstered
+nonuple
+nonuplet
+nonupright
+nonurban
+nonurgent
+nonusage
+nonuse
+nonuser
+nonusing
+nonusurping
+nonuterine
+nonutile
+nonutilitarian
+nonutility
+nonutilized
+nonutterance
+nonvacant
+nonvaccination
+nonvacuous
+nonvaginal
+nonvalent
+nonvalidity
+nonvaluation
+nonvalve
+nonvanishing
+nonvariable
+nonvariant
+nonvariation
+nonvascular
+nonvassal
+nonvegetative
+nonvenereal
+nonvenomous
+nonvenous
+nonventilation
+nonverbal
+nonverdict
+nonverminous
+nonvernacular
+nonvertebral
+nonvertical
+nonvertically
+nonvesicular
+nonvesting
+nonvesture
+nonveteran
+nonveterinary
+nonviable
+nonvibratile
+nonvibration
+nonvibrator
+nonvibratory
+nonvicarious
+nonvictory
+nonvillager
+nonvillainous
+nonvindication
+nonvinous
+nonvintage
+nonviolation
+nonviolence
+nonvirginal
+nonvirile
+nonvirtue
+nonvirtuous
+nonvirulent
+nonviruliferous
+nonvisaed
+nonvisceral
+nonviscid
+nonviscous
+nonvisional
+nonvisitation
+nonvisiting
+nonvisual
+nonvisualized
+nonvital
+nonvitreous
+nonvitrified
+nonviviparous
+nonvocal
+nonvocalic
+nonvocational
+nonvolant
+nonvolatile
+nonvolatilized
+nonvolcanic
+nonvolition
+nonvoluntary
+nonvortical
+nonvortically
+nonvoter
+nonvoting
+nonvulcanizable
+nonvulvar
+nonwalking
+nonwar
+nonwasting
+nonwatertight
+nonweakness
+nonwestern
+nonwetted
+nonwhite
+nonwinged
+nonwoody
+nonworker
+nonworking
+nonworship
+nonwrinkleable
+nonya
+nonyielding
+nonyl
+nonylene
+nonylenic
+nonylic
+nonzealous
+nonzero
+nonzodiacal
+nonzonal
+nonzonate
+nonzoological
+noodle
+noodledom
+noodleism
+nook
+nooked
+nookery
+nooking
+nooklet
+nooklike
+nooky
+noological
+noologist
+noology
+noometry
+noon
+noonday
+noonflower
+nooning
+noonlight
+noonlit
+noonstead
+noontide
+noontime
+noonwards
+noop
+nooscopic
+noose
+nooser
+Nootka
+nopal
+Nopalea
+nopalry
+nope
+nopinene
+nor
+Nora
+Norah
+norard
+norate
+noration
+norbergite
+Norbert
+Norbertine
+norcamphane
+nordcaper
+nordenskioldine
+Nordic
+Nordicism
+Nordicist
+Nordicity
+Nordicization
+Nordicize
+nordmarkite
+noreast
+noreaster
+norelin
+Norfolk
+Norfolkian
+norgine
+nori
+noria
+Noric
+norie
+norimon
+norite
+norland
+norlander
+norlandism
+norleucine
+Norm
+norm
+Norma
+norma
+normal
+normalcy
+normalism
+normalist
+normality
+normalization
+normalize
+normalizer
+normally
+normalness
+Norman
+Normanesque
+Normanish
+Normanism
+Normanist
+Normanization
+Normanize
+Normanizer
+Normanly
+Normannic
+normated
+normative
+normatively
+normativeness
+normless
+normoblast
+normoblastic
+normocyte
+normocytic
+normotensive
+Norn
+Norna
+nornicotine
+nornorwest
+noropianic
+norpinic
+Norridgewock
+Norroway
+Norroy
+Norse
+norsel
+Norseland
+norseler
+Norseman
+Norsk
+north
+northbound
+northeast
+northeaster
+northeasterly
+northeastern
+northeasternmost
+northeastward
+northeastwardly
+northeastwards
+norther
+northerliness
+northerly
+northern
+northerner
+northernize
+northernly
+northernmost
+northernness
+northest
+northfieldite
+northing
+northland
+northlander
+northlight
+Northman
+northmost
+northness
+Northumber
+Northumbrian
+northupite
+northward
+northwardly
+northwards
+northwest
+northwester
+northwesterly
+northwestern
+northwestward
+northwestwardly
+northwestwards
+Norumbega
+norward
+norwards
+Norway
+Norwegian
+norwest
+norwester
+norwestward
+Nosairi
+Nosairian
+nosarian
+nose
+nosean
+noseanite
+noseband
+nosebanded
+nosebleed
+nosebone
+noseburn
+nosed
+nosegay
+nosegaylike
+noseherb
+nosehole
+noseless
+noselessly
+noselessness
+noselike
+noselite
+Nosema
+Nosematidae
+nosepiece
+nosepinch
+noser
+nosesmart
+nosethirl
+nosetiology
+nosewards
+nosewheel
+nosewise
+nosey
+nosine
+nosing
+nosism
+nosocomial
+nosocomium
+nosogenesis
+nosogenetic
+nosogenic
+nosogeny
+nosogeography
+nosographer
+nosographic
+nosographical
+nosographically
+nosography
+nosohaemia
+nosohemia
+nosological
+nosologically
+nosologist
+nosology
+nosomania
+nosomycosis
+nosonomy
+nosophobia
+nosophyte
+nosopoetic
+nosopoietic
+nosotaxy
+nosotrophy
+nostalgia
+nostalgic
+nostalgically
+nostalgy
+nostic
+Nostoc
+Nostocaceae
+nostocaceous
+nostochine
+nostologic
+nostology
+nostomania
+Nostradamus
+nostrificate
+nostrification
+nostril
+nostriled
+nostrility
+nostrilsome
+nostrum
+nostrummonger
+nostrummongership
+nostrummongery
+Nosu
+nosy
+not
+notabilia
+notability
+notable
+notableness
+notably
+notacanthid
+Notacanthidae
+notacanthoid
+notacanthous
+Notacanthus
+notaeal
+notaeum
+notal
+notalgia
+notalgic
+Notalia
+notan
+notandum
+notanencephalia
+notarial
+notarially
+notariate
+notarikon
+notarize
+notary
+notaryship
+notate
+notation
+notational
+notative
+notator
+notch
+notchboard
+notched
+notchel
+notcher
+notchful
+notching
+notchweed
+notchwing
+notchy
+note
+notebook
+notecase
+noted
+notedly
+notedness
+notehead
+noteholder
+notekin
+Notelaea
+noteless
+notelessly
+notelessness
+notelet
+notencephalocele
+notencephalus
+noter
+notewise
+noteworthily
+noteworthiness
+noteworthy
+notharctid
+Notharctidae
+Notharctus
+nother
+nothing
+nothingarian
+nothingarianism
+nothingism
+nothingist
+nothingize
+nothingless
+nothingly
+nothingness
+nothingology
+Nothofagus
+Notholaena
+nothosaur
+Nothosauri
+nothosaurian
+Nothosauridae
+Nothosaurus
+nothous
+notice
+noticeability
+noticeable
+noticeably
+noticer
+Notidani
+notidanian
+notidanid
+Notidanidae
+notidanidan
+notidanoid
+Notidanus
+notifiable
+notification
+notified
+notifier
+notify
+notifyee
+notion
+notionable
+notional
+notionalist
+notionality
+notionally
+notionalness
+notionary
+notionate
+notioned
+notionist
+notionless
+Notiosorex
+notitia
+Notkerian
+notocentrous
+notocentrum
+notochord
+notochordal
+notodontian
+notodontid
+Notodontidae
+notodontoid
+Notogaea
+Notogaeal
+Notogaean
+Notogaeic
+notommatid
+Notommatidae
+Notonecta
+notonectal
+notonectid
+Notonectidae
+notopodial
+notopodium
+notopterid
+Notopteridae
+notopteroid
+Notopterus
+notorhizal
+Notorhynchus
+notoriety
+notorious
+notoriously
+notoriousness
+Notornis
+Notoryctes
+Notostraca
+Nototherium
+Nototrema
+nototribe
+notour
+notourly
+Notropis
+notself
+Nottoway
+notum
+Notungulata
+notungulate
+Notus
+notwithstanding
+Nou
+nougat
+nougatine
+nought
+noumeaite
+noumeite
+noumenal
+noumenalism
+noumenalist
+noumenality
+noumenalize
+noumenally
+noumenism
+noumenon
+noun
+nounal
+nounally
+nounize
+nounless
+noup
+nourice
+nourish
+nourishable
+nourisher
+nourishing
+nourishingly
+nourishment
+nouriture
+nous
+nouther
+nova
+novaculite
+novalia
+Novanglian
+Novanglican
+novantique
+novarsenobenzene
+novate
+Novatian
+Novatianism
+Novatianist
+novation
+novative
+novator
+novatory
+novatrix
+novcic
+novel
+novelcraft
+noveldom
+novelese
+novelesque
+novelet
+novelette
+noveletter
+novelettish
+novelettist
+noveletty
+novelish
+novelism
+novelist
+novelistic
+novelistically
+novelization
+novelize
+novella
+novelless
+novellike
+novelly
+novelmongering
+novelness
+novelry
+novelty
+novelwright
+novem
+novemarticulate
+November
+Novemberish
+novemcostate
+novemdigitate
+novemfid
+novemlobate
+novemnervate
+novemperfoliate
+novena
+novenary
+novendial
+novene
+novennial
+novercal
+Novial
+novice
+novicehood
+novicelike
+noviceship
+noviciate
+novilunar
+novitial
+novitiate
+novitiateship
+novitiation
+novity
+Novo
+Novocain
+novodamus
+Novorolsky
+now
+nowaday
+nowadays
+nowanights
+noway
+noways
+nowed
+nowel
+nowhat
+nowhen
+nowhence
+nowhere
+nowhereness
+nowheres
+nowhit
+nowhither
+nowise
+nowness
+Nowroze
+nowt
+nowy
+noxa
+noxal
+noxally
+noxious
+noxiously
+noxiousness
+noy
+noyade
+noyau
+Nozi
+nozzle
+nozzler
+nth
+nu
+nuance
+nub
+Nuba
+nubbin
+nubble
+nubbling
+nubbly
+nubby
+nubecula
+nubia
+Nubian
+nubiferous
+nubiform
+nubigenous
+nubilate
+nubilation
+nubile
+nubility
+nubilous
+Nubilum
+nucal
+nucament
+nucamentaceous
+nucellar
+nucellus
+nucha
+nuchal
+nuchalgia
+nuciculture
+nuciferous
+nuciform
+nucin
+nucivorous
+nucleal
+nuclear
+nucleary
+nuclease
+nucleate
+nucleation
+nucleator
+nuclei
+nucleiferous
+nucleiform
+nuclein
+nucleinase
+nucleoalbumin
+nucleoalbuminuria
+nucleofugal
+nucleohistone
+nucleohyaloplasm
+nucleohyaloplasma
+nucleoid
+nucleoidioplasma
+nucleolar
+nucleolated
+nucleole
+nucleoli
+nucleolinus
+nucleolocentrosome
+nucleoloid
+nucleolus
+nucleolysis
+nucleomicrosome
+nucleon
+nucleone
+nucleonics
+nucleopetal
+nucleoplasm
+nucleoplasmatic
+nucleoplasmic
+nucleoprotein
+nucleoside
+nucleotide
+nucleus
+nuclide
+nuclidic
+Nucula
+Nuculacea
+nuculanium
+nucule
+nuculid
+Nuculidae
+nuculiform
+nuculoid
+Nuda
+nudate
+nudation
+Nudd
+nuddle
+nude
+nudely
+nudeness
+Nudens
+nudge
+nudger
+nudibranch
+Nudibranchia
+nudibranchian
+nudibranchiate
+nudicaudate
+nudicaul
+nudifier
+nudiflorous
+nudiped
+nudish
+nudism
+nudist
+nuditarian
+nudity
+nugacious
+nugaciousness
+nugacity
+nugator
+nugatoriness
+nugatory
+nuggar
+nugget
+nuggety
+nugify
+nugilogue
+Nugumiut
+nuisance
+nuisancer
+nuke
+Nukuhivan
+nul
+null
+nullable
+nullah
+nullibicity
+nullibility
+nullibiquitous
+nullibist
+nullification
+nullificationist
+nullificator
+nullifidian
+nullifier
+nullify
+nullipara
+nulliparity
+nulliparous
+nullipennate
+Nullipennes
+nulliplex
+nullipore
+nulliporous
+nullism
+nullisome
+nullisomic
+nullity
+nulliverse
+nullo
+Numa
+Numantine
+numb
+number
+numberable
+numberer
+numberful
+numberless
+numberous
+numbersome
+numbfish
+numbing
+numbingly
+numble
+numbles
+numbly
+numbness
+numda
+numdah
+numen
+Numenius
+numerable
+numerableness
+numerably
+numeral
+numerant
+numerary
+numerate
+numeration
+numerative
+numerator
+numerical
+numerically
+numericalness
+numerist
+numero
+numerology
+numerose
+numerosity
+numerous
+numerously
+numerousness
+Numida
+Numidae
+Numidian
+Numididae
+Numidinae
+numinism
+numinous
+numinously
+numismatic
+numismatical
+numismatically
+numismatician
+numismatics
+numismatist
+numismatography
+numismatologist
+numismatology
+nummary
+nummi
+nummiform
+nummular
+Nummularia
+nummulary
+nummulated
+nummulation
+nummuline
+Nummulinidae
+nummulite
+Nummulites
+nummulitic
+Nummulitidae
+nummulitoid
+nummuloidal
+nummus
+numskull
+numskulled
+numskulledness
+numskullery
+numskullism
+numud
+nun
+nunatak
+nunbird
+nunch
+nuncheon
+nunciate
+nunciative
+nunciatory
+nunciature
+nuncio
+nuncioship
+nuncle
+nuncupate
+nuncupation
+nuncupative
+nuncupatively
+nundinal
+nundination
+nundine
+nunhood
+Nunki
+nunky
+nunlet
+nunlike
+nunnari
+nunnated
+nunnation
+nunnery
+nunni
+nunnify
+nunnish
+nunnishness
+nunship
+Nupe
+Nuphar
+nuptial
+nuptiality
+nuptialize
+nuptially
+nuptials
+nuque
+nuraghe
+nurhag
+nurly
+nursable
+nurse
+nursedom
+nursegirl
+nursehound
+nursekeeper
+nursekin
+nurselet
+nurselike
+nursemaid
+nurser
+nursery
+nurserydom
+nurseryful
+nurserymaid
+nurseryman
+nursetender
+nursing
+nursingly
+nursle
+nursling
+nursy
+nurturable
+nurtural
+nurture
+nurtureless
+nurturer
+nurtureship
+Nusairis
+Nusakan
+nusfiah
+nut
+nutant
+nutarian
+nutate
+nutation
+nutational
+nutbreaker
+nutcake
+nutcrack
+nutcracker
+nutcrackers
+nutcrackery
+nutgall
+nuthatch
+nuthook
+nutjobber
+nutlet
+nutlike
+nutmeg
+nutmegged
+nutmeggy
+nutpecker
+nutpick
+nutramin
+nutria
+nutrice
+nutricial
+nutricism
+nutrient
+nutrify
+nutriment
+nutrimental
+nutritial
+nutrition
+nutritional
+nutritionally
+nutritionist
+nutritious
+nutritiously
+nutritiousness
+nutritive
+nutritively
+nutritiveness
+nutritory
+nutseed
+nutshell
+Nuttallia
+nuttalliasis
+nuttalliosis
+nutted
+nutter
+nuttery
+nuttily
+nuttiness
+nutting
+nuttish
+nuttishness
+nutty
+nuzzer
+nuzzerana
+nuzzle
+Nyamwezi
+Nyanja
+nyanza
+Nyaya
+nychthemer
+nychthemeral
+nychthemeron
+Nyctaginaceae
+nyctaginaceous
+Nyctaginia
+nyctalope
+nyctalopia
+nyctalopic
+nyctalopy
+Nyctanthes
+Nyctea
+Nyctereutes
+nycteribiid
+Nycteribiidae
+Nycteridae
+nycterine
+Nycteris
+Nycticorax
+Nyctimene
+nyctinastic
+nyctinasty
+nyctipelagic
+Nyctipithecinae
+nyctipithecine
+Nyctipithecus
+nyctitropic
+nyctitropism
+nyctophobia
+nycturia
+Nydia
+nye
+nylast
+nylon
+nymil
+nymph
+nympha
+nymphae
+Nymphaea
+Nymphaeaceae
+nymphaeaceous
+nymphaeum
+nymphal
+nymphalid
+Nymphalidae
+Nymphalinae
+nymphaline
+nympheal
+nymphean
+nymphet
+nymphic
+nymphical
+nymphid
+nymphine
+Nymphipara
+nymphiparous
+nymphish
+nymphitis
+nymphlike
+nymphlin
+nymphly
+Nymphoides
+nympholepsia
+nympholepsy
+nympholept
+nympholeptic
+nymphomania
+nymphomaniac
+nymphomaniacal
+Nymphonacea
+nymphosis
+nymphotomy
+nymphwise
+Nyoro
+Nyroca
+Nyssa
+Nyssaceae
+nystagmic
+nystagmus
+nyxis
+O
+o
+oadal
+oaf
+oafdom
+oafish
+oafishly
+oafishness
+oak
+oakberry
+Oakboy
+oaken
+oakenshaw
+Oakesia
+oaklet
+oaklike
+oakling
+oaktongue
+oakum
+oakweb
+oakwood
+oaky
+oam
+Oannes
+oar
+oarage
+oarcock
+oared
+oarfish
+oarhole
+oarial
+oarialgia
+oaric
+oariocele
+oariopathic
+oariopathy
+oariotomy
+oaritic
+oaritis
+oarium
+oarless
+oarlike
+oarlock
+oarlop
+oarman
+oarsman
+oarsmanship
+oarswoman
+oarweed
+oary
+oasal
+oasean
+oases
+oasis
+oasitic
+oast
+oasthouse
+oat
+oatbin
+oatcake
+oatear
+oaten
+oatenmeal
+oatfowl
+oath
+oathay
+oathed
+oathful
+oathlet
+oathworthy
+oatland
+oatlike
+oatmeal
+oatseed
+oaty
+Obadiah
+obambulate
+obambulation
+obambulatory
+oban
+Obbenite
+obbligato
+obclavate
+obclude
+obcompressed
+obconical
+obcordate
+obcordiform
+obcuneate
+obdeltoid
+obdiplostemonous
+obdiplostemony
+obdormition
+obduction
+obduracy
+obdurate
+obdurately
+obdurateness
+obduration
+obe
+obeah
+obeahism
+obeche
+obedience
+obediency
+obedient
+obediential
+obedientially
+obedientialness
+obedientiar
+obedientiary
+obediently
+obeisance
+obeisant
+obeisantly
+obeism
+obelia
+obeliac
+obelial
+obelion
+obeliscal
+obeliscar
+obelisk
+obeliskoid
+obelism
+obelize
+obelus
+Oberon
+obese
+obesely
+obeseness
+obesity
+obex
+obey
+obeyable
+obeyer
+obeyingly
+obfuscable
+obfuscate
+obfuscation
+obfuscator
+obfuscity
+obfuscous
+obi
+Obidicut
+obispo
+obit
+obitual
+obituarian
+obituarily
+obituarist
+obituarize
+obituary
+object
+objectable
+objectation
+objectative
+objectee
+objecthood
+objectification
+objectify
+objection
+objectionability
+objectionable
+objectionableness
+objectionably
+objectional
+objectioner
+objectionist
+objectival
+objectivate
+objectivation
+objective
+objectively
+objectiveness
+objectivism
+objectivist
+objectivistic
+objectivity
+objectivize
+objectization
+objectize
+objectless
+objectlessly
+objectlessness
+objector
+objicient
+objuration
+objure
+objurgate
+objurgation
+objurgative
+objurgatively
+objurgator
+objurgatorily
+objurgatory
+objurgatrix
+oblanceolate
+oblate
+oblately
+oblateness
+oblation
+oblational
+oblationary
+oblatory
+oblectate
+oblectation
+obley
+obligable
+obligancy
+obligant
+obligate
+obligation
+obligational
+obligative
+obligativeness
+obligator
+obligatorily
+obligatoriness
+obligatory
+obligatum
+oblige
+obliged
+obligedly
+obligedness
+obligee
+obligement
+obliger
+obliging
+obligingly
+obligingness
+obligistic
+obligor
+obliquangular
+obliquate
+obliquation
+oblique
+obliquely
+obliqueness
+obliquitous
+obliquity
+obliquus
+obliterable
+obliterate
+obliteration
+obliterative
+obliterator
+oblivescence
+oblivial
+obliviality
+oblivion
+oblivionate
+oblivionist
+oblivionize
+oblivious
+obliviously
+obliviousness
+obliviscence
+obliviscible
+oblocutor
+oblong
+oblongatal
+oblongated
+oblongish
+oblongitude
+oblongitudinal
+oblongly
+oblongness
+obloquial
+obloquious
+obloquy
+obmutescence
+obmutescent
+obnebulate
+obnounce
+obnoxiety
+obnoxious
+obnoxiously
+obnoxiousness
+obnubilate
+obnubilation
+obnunciation
+oboe
+oboist
+obol
+Obolaria
+obolary
+obole
+obolet
+obolus
+obomegoid
+Obongo
+oboval
+obovate
+obovoid
+obpyramidal
+obpyriform
+Obrazil
+obreption
+obreptitious
+obreptitiously
+obrogate
+obrogation
+obrotund
+obscene
+obscenely
+obsceneness
+obscenity
+obscurancy
+obscurant
+obscurantic
+obscurantism
+obscurantist
+obscuration
+obscurative
+obscure
+obscuredly
+obscurely
+obscurement
+obscureness
+obscurer
+obscurism
+obscurist
+obscurity
+obsecrate
+obsecration
+obsecrationary
+obsecratory
+obsede
+obsequence
+obsequent
+obsequial
+obsequience
+obsequiosity
+obsequious
+obsequiously
+obsequiousness
+obsequity
+obsequium
+obsequy
+observability
+observable
+observableness
+observably
+observance
+observancy
+observandum
+observant
+Observantine
+Observantist
+observantly
+observantness
+observation
+observational
+observationalism
+observationally
+observative
+observatorial
+observatory
+observe
+observedly
+observer
+observership
+observing
+observingly
+obsess
+obsessingly
+obsession
+obsessional
+obsessionist
+obsessive
+obsessor
+obsidian
+obsidianite
+obsidional
+obsidionary
+obsidious
+obsignate
+obsignation
+obsignatory
+obsolesce
+obsolescence
+obsolescent
+obsolescently
+obsolete
+obsoletely
+obsoleteness
+obsoletion
+obsoletism
+obstacle
+obstetric
+obstetrical
+obstetrically
+obstetricate
+obstetrication
+obstetrician
+obstetrics
+obstetricy
+obstetrist
+obstetrix
+obstinacious
+obstinacy
+obstinance
+obstinate
+obstinately
+obstinateness
+obstination
+obstinative
+obstipation
+obstreperate
+obstreperosity
+obstreperous
+obstreperously
+obstreperousness
+obstriction
+obstringe
+obstruct
+obstructant
+obstructedly
+obstructer
+obstructingly
+obstruction
+obstructionism
+obstructionist
+obstructive
+obstructively
+obstructiveness
+obstructivism
+obstructivity
+obstructor
+obstruent
+obstupefy
+obtain
+obtainable
+obtainal
+obtainance
+obtainer
+obtainment
+obtect
+obtected
+obtemper
+obtemperate
+obtenebrate
+obtenebration
+obtention
+obtest
+obtestation
+obtriangular
+obtrude
+obtruder
+obtruncate
+obtruncation
+obtruncator
+obtrusion
+obtrusionist
+obtrusive
+obtrusively
+obtrusiveness
+obtund
+obtundent
+obtunder
+obtundity
+obturate
+obturation
+obturator
+obturatory
+obturbinate
+obtusangular
+obtuse
+obtusely
+obtuseness
+obtusifid
+obtusifolious
+obtusilingual
+obtusilobous
+obtusion
+obtusipennate
+obtusirostrate
+obtusish
+obtusity
+obumbrant
+obumbrate
+obumbration
+obvallate
+obvelation
+obvention
+obverse
+obversely
+obversion
+obvert
+obvertend
+obviable
+obviate
+obviation
+obviative
+obviator
+obvious
+obviously
+obviousness
+obvolute
+obvoluted
+obvolution
+obvolutive
+obvolve
+obvolvent
+ocarina
+Occamism
+Occamist
+Occamistic
+Occamite
+occamy
+occasion
+occasionable
+occasional
+occasionalism
+occasionalist
+occasionalistic
+occasionality
+occasionally
+occasionalness
+occasionary
+occasioner
+occasionless
+occasive
+occident
+occidental
+Occidentalism
+Occidentalist
+occidentality
+Occidentalization
+Occidentalize
+occidentally
+occiduous
+occipital
+occipitalis
+occipitally
+occipitoanterior
+occipitoatlantal
+occipitoatloid
+occipitoaxial
+occipitoaxoid
+occipitobasilar
+occipitobregmatic
+occipitocalcarine
+occipitocervical
+occipitofacial
+occipitofrontal
+occipitofrontalis
+occipitohyoid
+occipitoiliac
+occipitomastoid
+occipitomental
+occipitonasal
+occipitonuchal
+occipitootic
+occipitoparietal
+occipitoposterior
+occipitoscapular
+occipitosphenoid
+occipitosphenoidal
+occipitotemporal
+occipitothalamic
+occiput
+occitone
+occlude
+occludent
+occlusal
+occluse
+occlusion
+occlusive
+occlusiveness
+occlusocervical
+occlusocervically
+occlusogingival
+occlusometer
+occlusor
+occult
+occultate
+occultation
+occulter
+occulting
+occultism
+occultist
+occultly
+occultness
+occupable
+occupance
+occupancy
+occupant
+occupation
+occupational
+occupationalist
+occupationally
+occupationless
+occupative
+occupiable
+occupier
+occupy
+occur
+occurrence
+occurrent
+occursive
+ocean
+oceaned
+oceanet
+oceanful
+Oceanian
+oceanic
+Oceanican
+oceanity
+oceanographer
+oceanographic
+oceanographical
+oceanographically
+oceanographist
+oceanography
+oceanology
+oceanophyte
+oceanside
+oceanward
+oceanwards
+oceanways
+oceanwise
+ocellar
+ocellary
+ocellate
+ocellated
+ocellation
+ocelli
+ocellicyst
+ocellicystic
+ocelliferous
+ocelliform
+ocelligerous
+ocellus
+oceloid
+ocelot
+och
+ochava
+ochavo
+ocher
+ocherish
+ocherous
+ochery
+ochidore
+ochlesis
+ochlesitic
+ochletic
+ochlocracy
+ochlocrat
+ochlocratic
+ochlocratical
+ochlocratically
+ochlophobia
+ochlophobist
+Ochna
+Ochnaceae
+ochnaceous
+ochone
+Ochotona
+Ochotonidae
+Ochozoma
+ochraceous
+Ochrana
+ochrea
+ochreate
+ochreous
+ochro
+ochrocarpous
+ochroid
+ochroleucous
+ochrolite
+Ochroma
+ochronosis
+ochronosus
+ochronotic
+ochrous
+ocht
+Ocimum
+ock
+oclock
+Ocneria
+ocote
+Ocotea
+ocotillo
+ocque
+ocracy
+ocrea
+ocreaceous
+Ocreatae
+ocreate
+ocreated
+octachloride
+octachord
+octachordal
+octachronous
+Octacnemus
+octacolic
+octactinal
+octactine
+Octactiniae
+octactinian
+octad
+octadecahydrate
+octadecane
+octadecanoic
+octadecyl
+octadic
+octadrachm
+octaemeron
+octaeteric
+octaeterid
+octagon
+octagonal
+octagonally
+octahedral
+octahedric
+octahedrical
+octahedrite
+octahedroid
+octahedron
+octahedrous
+octahydrate
+octahydrated
+octakishexahedron
+octamerism
+octamerous
+octameter
+octan
+octanaphthene
+Octandria
+octandrian
+octandrious
+octane
+octangle
+octangular
+octangularness
+Octans
+octant
+octantal
+octapla
+octaploid
+octaploidic
+octaploidy
+octapodic
+octapody
+octarch
+octarchy
+octarius
+octarticulate
+octary
+octasemic
+octastich
+octastichon
+octastrophic
+octastyle
+octastylos
+octateuch
+octaval
+octavalent
+octavarium
+octave
+Octavia
+Octavian
+octavic
+octavina
+Octavius
+octavo
+octenary
+octene
+octennial
+octennially
+octet
+octic
+octillion
+octillionth
+octine
+octingentenary
+octoad
+octoalloy
+octoate
+octobass
+October
+octobrachiate
+Octobrist
+octocentenary
+octocentennial
+octochord
+Octocoralla
+octocorallan
+Octocorallia
+octocoralline
+octocotyloid
+octodactyl
+octodactyle
+octodactylous
+octodecimal
+octodecimo
+octodentate
+octodianome
+Octodon
+octodont
+Octodontidae
+Octodontinae
+octoechos
+octofid
+octofoil
+octofoiled
+octogamy
+octogenarian
+octogenarianism
+octogenary
+octogild
+octoglot
+Octogynia
+octogynian
+octogynious
+octogynous
+octoic
+octoid
+octolateral
+octolocular
+octomeral
+octomerous
+octometer
+octonal
+octonare
+octonarian
+octonarius
+octonary
+octonematous
+octonion
+octonocular
+octoon
+octopartite
+octopean
+octoped
+octopede
+octopetalous
+octophthalmous
+octophyllous
+octopi
+octopine
+octoploid
+octoploidic
+octoploidy
+octopod
+Octopoda
+octopodan
+octopodes
+octopodous
+octopolar
+octopus
+octoradial
+octoradiate
+octoradiated
+octoreme
+octoroon
+octose
+octosepalous
+octospermous
+octospore
+octosporous
+octostichous
+octosyllabic
+octosyllable
+octovalent
+octoyl
+octroi
+octroy
+octuor
+octuple
+octuplet
+octuplex
+octuplicate
+octuplication
+octuply
+octyl
+octylene
+octyne
+ocuby
+ocular
+ocularist
+ocularly
+oculary
+oculate
+oculated
+oculauditory
+oculiferous
+oculiform
+oculigerous
+Oculina
+oculinid
+Oculinidae
+oculinoid
+oculist
+oculistic
+oculocephalic
+oculofacial
+oculofrontal
+oculomotor
+oculomotory
+oculonasal
+oculopalpebral
+oculopupillary
+oculospinal
+oculozygomatic
+oculus
+ocydrome
+ocydromine
+Ocydromus
+Ocypete
+Ocypoda
+ocypodan
+Ocypode
+ocypodian
+Ocypodidae
+ocypodoid
+Ocyroe
+Ocyroidae
+Od
+od
+oda
+Odacidae
+odacoid
+odal
+odalborn
+odalisk
+odalisque
+odaller
+odalman
+odalwoman
+Odax
+odd
+oddish
+oddity
+oddlegs
+oddly
+oddman
+oddment
+oddments
+oddness
+Odds
+odds
+Oddsbud
+oddsman
+ode
+odel
+odelet
+Odelsthing
+Odelsting
+odeon
+odeum
+odic
+odically
+Odin
+Odinian
+Odinic
+Odinism
+Odinist
+odinite
+Odinitic
+odiometer
+odious
+odiously
+odiousness
+odist
+odium
+odiumproof
+Odobenidae
+Odobenus
+Odocoileus
+odograph
+odology
+odometer
+odometrical
+odometry
+Odonata
+odontagra
+odontalgia
+odontalgic
+Odontaspidae
+Odontaspididae
+Odontaspis
+odontatrophia
+odontatrophy
+odontexesis
+odontiasis
+odontic
+odontist
+odontitis
+odontoblast
+odontoblastic
+odontocele
+Odontocete
+odontocete
+Odontoceti
+odontocetous
+odontochirurgic
+odontoclasis
+odontoclast
+odontodynia
+odontogen
+odontogenesis
+odontogenic
+odontogeny
+Odontoglossae
+odontoglossal
+odontoglossate
+Odontoglossum
+Odontognathae
+odontognathic
+odontognathous
+odontograph
+odontographic
+odontography
+odontohyperesthesia
+odontoid
+Odontolcae
+odontolcate
+odontolcous
+odontolite
+odontolith
+odontological
+odontologist
+odontology
+odontoloxia
+odontoma
+odontomous
+odontonecrosis
+odontoneuralgia
+odontonosology
+odontopathy
+odontophoral
+odontophore
+Odontophoridae
+Odontophorinae
+odontophorine
+odontophorous
+Odontophorus
+odontoplast
+odontoplerosis
+Odontopteris
+Odontopteryx
+odontorhynchous
+Odontormae
+Odontornithes
+odontornithic
+odontorrhagia
+odontorthosis
+odontoschism
+odontoscope
+odontosis
+odontostomatous
+odontostomous
+Odontosyllis
+odontotechny
+odontotherapia
+odontotherapy
+odontotomy
+Odontotormae
+odontotripsis
+odontotrypy
+odoom
+odophone
+odor
+odorant
+odorate
+odorator
+odored
+odorful
+odoriferant
+odoriferosity
+odoriferous
+odoriferously
+odoriferousness
+odorific
+odorimeter
+odorimetry
+odoriphore
+odorivector
+odorize
+odorless
+odorometer
+odorosity
+odorous
+odorously
+odorousness
+odorproof
+Odostemon
+Ods
+odso
+odum
+odyl
+odylic
+odylism
+odylist
+odylization
+odylize
+Odynerus
+Odyssean
+Odyssey
+Odz
+Odzookers
+Odzooks
+oe
+Oecanthus
+oecist
+oecodomic
+oecodomical
+oecoparasite
+oecoparasitism
+oecophobia
+oecumenian
+oecumenic
+oecumenical
+oecumenicalism
+oecumenicity
+oecus
+oedemerid
+Oedemeridae
+oedicnemine
+Oedicnemus
+Oedipal
+Oedipean
+Oedipus
+Oedogoniaceae
+oedogoniaceous
+Oedogoniales
+Oedogonium
+oenanthaldehyde
+oenanthate
+Oenanthe
+oenanthic
+oenanthol
+oenanthole
+oenanthyl
+oenanthylate
+oenanthylic
+oenin
+Oenocarpus
+oenochoe
+oenocyte
+oenocytic
+oenolin
+oenological
+oenologist
+oenology
+oenomancy
+Oenomaus
+oenomel
+oenometer
+oenophilist
+oenophobist
+oenopoetic
+Oenothera
+Oenotheraceae
+oenotheraceous
+Oenotrian
+oer
+oersted
+oes
+oesophageal
+oesophagi
+oesophagismus
+oesophagostomiasis
+Oesophagostomum
+oesophagus
+oestradiol
+Oestrelata
+oestrian
+oestriasis
+oestrid
+Oestridae
+oestrin
+oestriol
+oestroid
+oestrous
+oestrual
+oestruate
+oestruation
+oestrum
+oestrus
+of
+Ofer
+off
+offal
+offaling
+offbeat
+offcast
+offcome
+offcut
+offend
+offendable
+offendant
+offended
+offendedly
+offendedness
+offender
+offendible
+offendress
+offense
+offenseful
+offenseless
+offenselessly
+offenseproof
+offensible
+offensive
+offensively
+offensiveness
+offer
+offerable
+offeree
+offerer
+offering
+offeror
+offertorial
+offertory
+offgoing
+offgrade
+offhand
+offhanded
+offhandedly
+offhandedness
+office
+officeholder
+officeless
+officer
+officerage
+officeress
+officerhood
+officerial
+officerism
+officerless
+officership
+official
+officialdom
+officialese
+officialism
+officiality
+officialization
+officialize
+officially
+officialty
+officiant
+officiary
+officiate
+officiation
+officiator
+officinal
+officinally
+officious
+officiously
+officiousness
+offing
+offish
+offishly
+offishness
+offlet
+offlook
+offprint
+offsaddle
+offscape
+offscour
+offscourer
+offscouring
+offscum
+offset
+offshoot
+offshore
+offsider
+offspring
+offtake
+offtype
+offuscate
+offuscation
+offward
+offwards
+oflete
+Ofo
+oft
+often
+oftenness
+oftens
+oftentime
+oftentimes
+ofter
+oftest
+oftly
+oftness
+ofttime
+ofttimes
+oftwhiles
+Og
+ogaire
+Ogallala
+ogam
+ogamic
+Ogboni
+Ogcocephalidae
+Ogcocephalus
+ogdoad
+ogdoas
+ogee
+ogeed
+ogganition
+ogham
+oghamic
+Oghuz
+ogival
+ogive
+ogived
+Oglala
+ogle
+ogler
+ogmic
+Ogor
+Ogpu
+ogre
+ogreish
+ogreishly
+ogreism
+ogress
+ogrish
+ogrism
+ogtiern
+ogum
+Ogygia
+Ogygian
+oh
+ohelo
+ohia
+Ohio
+Ohioan
+ohm
+ohmage
+ohmic
+ohmmeter
+oho
+ohoy
+oidioid
+oidiomycosis
+oidiomycotic
+Oidium
+oii
+oikology
+oikoplast
+oil
+oilberry
+oilbird
+oilcan
+oilcloth
+oilcoat
+oilcup
+oildom
+oiled
+oiler
+oilery
+oilfish
+oilhole
+oilily
+oiliness
+oilless
+oillessness
+oillet
+oillike
+oilman
+oilmonger
+oilmongery
+oilometer
+oilpaper
+oilproof
+oilproofing
+oilseed
+oilskin
+oilskinned
+oilstock
+oilstone
+oilstove
+oiltight
+oiltightness
+oilway
+oily
+oilyish
+oime
+oinochoe
+oinology
+oinomancy
+oinomania
+oinomel
+oint
+ointment
+Oireachtas
+oisin
+oisivity
+oitava
+oiticica
+Ojibwa
+Ojibway
+Ok
+oka
+okapi
+Okapia
+okee
+okenite
+oket
+oki
+okia
+Okie
+Okinagan
+Oklafalaya
+Oklahannali
+Oklahoma
+Oklahoman
+okoniosis
+okonite
+okra
+okrug
+okshoofd
+okthabah
+Okuari
+okupukupu
+Olacaceae
+olacaceous
+Olaf
+olam
+olamic
+Olax
+Olcha
+Olchi
+Old
+old
+olden
+Oldenburg
+older
+oldermost
+oldfangled
+oldfangledness
+Oldfieldia
+Oldhamia
+oldhamite
+oldhearted
+oldish
+oldland
+oldness
+oldster
+oldwife
+Ole
+Olea
+Oleaceae
+oleaceous
+Oleacina
+Oleacinidae
+oleaginous
+oleaginousness
+oleana
+oleander
+oleandrin
+Olearia
+olease
+oleaster
+oleate
+olecranal
+olecranarthritis
+olecranial
+olecranian
+olecranoid
+olecranon
+olefiant
+olefin
+olefine
+olefinic
+Oleg
+oleic
+oleiferous
+olein
+olena
+olenellidian
+Olenellus
+olenid
+Olenidae
+olenidian
+olent
+Olenus
+oleo
+oleocalcareous
+oleocellosis
+oleocyst
+oleoduct
+oleograph
+oleographer
+oleographic
+oleography
+oleomargaric
+oleomargarine
+oleometer
+oleoptene
+oleorefractometer
+oleoresin
+oleoresinous
+oleosaccharum
+oleose
+oleosity
+oleostearate
+oleostearin
+oleothorax
+oleous
+Oleraceae
+oleraceous
+olericultural
+olericulturally
+olericulture
+Oleron
+Olethreutes
+olethreutid
+Olethreutidae
+olfact
+olfactible
+olfaction
+olfactive
+olfactology
+olfactometer
+olfactometric
+olfactometry
+olfactor
+olfactorily
+olfactory
+olfacty
+Olga
+oliban
+olibanum
+olid
+oligacanthous
+oligaemia
+oligandrous
+oliganthous
+oligarch
+oligarchal
+oligarchic
+oligarchical
+oligarchically
+oligarchism
+oligarchist
+oligarchize
+oligarchy
+oligemia
+oligidria
+oligist
+oligistic
+oligistical
+oligocarpous
+Oligocene
+Oligochaeta
+oligochaete
+oligochaetous
+oligochete
+oligocholia
+oligochrome
+oligochromemia
+oligochronometer
+oligochylia
+oligoclase
+oligoclasite
+oligocystic
+oligocythemia
+oligocythemic
+oligodactylia
+oligodendroglia
+oligodendroglioma
+oligodipsia
+oligodontous
+oligodynamic
+oligogalactia
+oligohemia
+oligohydramnios
+oligolactia
+oligomenorrhea
+oligomerous
+oligomery
+oligometochia
+oligometochic
+Oligomyodae
+oligomyodian
+oligomyoid
+Oligonephria
+oligonephric
+oligonephrous
+oligonite
+oligopepsia
+oligopetalous
+oligophagous
+oligophosphaturia
+oligophrenia
+oligophrenic
+oligophyllous
+oligoplasmia
+oligopnea
+oligopolistic
+oligopoly
+oligoprothesy
+oligoprothetic
+oligopsonistic
+oligopsony
+oligopsychia
+oligopyrene
+oligorhizous
+oligosepalous
+oligosialia
+oligosideric
+oligosiderite
+oligosite
+oligospermia
+oligospermous
+oligostemonous
+oligosyllabic
+oligosyllable
+oligosynthetic
+oligotokous
+oligotrichia
+oligotrophic
+oligotrophy
+oligotropic
+oliguresis
+oliguretic
+oliguria
+Olinia
+Oliniaceae
+oliniaceous
+olio
+oliphant
+oliprance
+olitory
+Oliva
+oliva
+olivaceous
+olivary
+Olive
+olive
+Olivean
+olived
+Olivella
+oliveness
+olivenite
+Oliver
+Oliverian
+oliverman
+oliversmith
+olivescent
+olivet
+Olivetan
+Olivette
+olivewood
+Olivia
+Olividae
+Olivier
+oliviferous
+oliviform
+olivil
+olivile
+olivilin
+olivine
+olivinefels
+olivinic
+olivinite
+olivinitic
+olla
+ollamh
+ollapod
+ollenite
+Ollie
+ollock
+olm
+Olneya
+Olof
+ological
+ologist
+ologistic
+ology
+olomao
+olona
+Olonets
+Olonetsian
+Olonetsish
+Olor
+oloroso
+olpe
+Olpidiaster
+Olpidium
+Olson
+oltonde
+oltunna
+olycook
+olykoek
+Olympia
+Olympiad
+Olympiadic
+Olympian
+Olympianism
+Olympianize
+Olympianly
+Olympianwise
+Olympic
+Olympicly
+Olympicness
+Olympieion
+Olympionic
+Olympus
+Olynthiac
+Olynthian
+Olynthus
+om
+omadhaun
+omagra
+Omagua
+Omaha
+omalgia
+Oman
+Omani
+omao
+Omar
+omarthritis
+omasitis
+omasum
+omber
+ombrette
+ombrifuge
+ombrograph
+ombrological
+ombrology
+ombrometer
+ombrophile
+ombrophilic
+ombrophilous
+ombrophily
+ombrophobe
+ombrophobous
+ombrophoby
+ombrophyte
+ombudsman
+ombudsmanship
+omega
+omegoid
+omelet
+omelette
+omen
+omened
+omenology
+omental
+omentectomy
+omentitis
+omentocele
+omentofixation
+omentopexy
+omentoplasty
+omentorrhaphy
+omentosplenopexy
+omentotomy
+omentulum
+omentum
+omer
+omicron
+omina
+ominous
+ominously
+ominousness
+omissible
+omission
+omissive
+omissively
+omit
+omitis
+omittable
+omitter
+omlah
+Ommastrephes
+Ommastrephidae
+ommateal
+ommateum
+ommatidial
+ommatidium
+ommatophore
+ommatophorous
+Ommiad
+Ommiades
+omneity
+omniactive
+omniactuality
+omniana
+omniarch
+omnibenevolence
+omnibenevolent
+omnibus
+omnibusman
+omnicausality
+omnicompetence
+omnicompetent
+omnicorporeal
+omnicredulity
+omnicredulous
+omnidenominational
+omnierudite
+omniessence
+omnifacial
+omnifarious
+omnifariously
+omnifariousness
+omniferous
+omnific
+omnificent
+omnifidel
+omniform
+omniformal
+omniformity
+omnify
+omnigenous
+omnigerent
+omnigraph
+omnihuman
+omnihumanity
+omnilegent
+omnilingual
+omniloquent
+omnilucent
+omnimental
+omnimeter
+omnimode
+omnimodous
+omninescience
+omninescient
+omniparent
+omniparient
+omniparity
+omniparous
+omnipatient
+omnipercipience
+omnipercipiency
+omnipercipient
+omniperfect
+omnipotence
+omnipotency
+omnipotent
+omnipotentiality
+omnipotently
+omnipregnant
+omnipresence
+omnipresent
+omnipresently
+omniprevalence
+omniprevalent
+omniproduction
+omniprudent
+omnirange
+omniregency
+omnirepresentative
+omnirepresentativeness
+omnirevealing
+omniscience
+omnisciency
+omniscient
+omnisciently
+omniscope
+omniscribent
+omniscriptive
+omnisentience
+omnisentient
+omnisignificance
+omnisignificant
+omnispective
+omnist
+omnisufficiency
+omnisufficient
+omnitemporal
+omnitenent
+omnitolerant
+omnitonal
+omnitonality
+omnitonic
+omnitude
+omnium
+omnivagant
+omnivalence
+omnivalent
+omnivalous
+omnivarious
+omnividence
+omnivident
+omnivision
+omnivolent
+Omnivora
+omnivoracious
+omnivoracity
+omnivorant
+omnivore
+omnivorous
+omnivorously
+omnivorousness
+omodynia
+omohyoid
+omoideum
+omophagia
+omophagist
+omophagous
+omophagy
+omophorion
+omoplate
+omoplatoscopy
+omostegite
+omosternal
+omosternum
+omphacine
+omphacite
+omphalectomy
+omphalic
+omphalism
+omphalitis
+omphalocele
+omphalode
+omphalodium
+omphalogenous
+omphaloid
+omphaloma
+omphalomesaraic
+omphalomesenteric
+omphaloncus
+omphalopagus
+omphalophlebitis
+omphalopsychic
+omphalopsychite
+omphalorrhagia
+omphalorrhea
+omphalorrhexis
+omphalos
+omphalosite
+omphaloskepsis
+omphalospinous
+omphalotomy
+omphalotripsy
+omphalus
+on
+Ona
+ona
+onager
+Onagra
+onagra
+Onagraceae
+onagraceous
+Onan
+onanism
+onanist
+onanistic
+onca
+once
+oncetta
+Onchidiidae
+Onchidium
+Onchocerca
+onchocerciasis
+onchocercosis
+oncia
+Oncidium
+oncin
+oncograph
+oncography
+oncologic
+oncological
+oncology
+oncome
+oncometer
+oncometric
+oncometry
+oncoming
+Oncorhynchus
+oncosimeter
+oncosis
+oncosphere
+oncost
+oncostman
+oncotomy
+ondagram
+ondagraph
+ondameter
+ondascope
+ondatra
+ondine
+ondogram
+ondograph
+ondometer
+ondoscope
+ondy
+one
+oneanother
+oneberry
+onefold
+onefoldness
+onegite
+onehearted
+onehow
+Oneida
+oneiric
+oneirocrit
+oneirocritic
+oneirocritical
+oneirocritically
+oneirocriticism
+oneirocritics
+oneirodynia
+oneirologist
+oneirology
+oneiromancer
+oneiromancy
+oneiroscopic
+oneiroscopist
+oneiroscopy
+oneirotic
+oneism
+onement
+oneness
+oner
+onerary
+onerative
+onerosity
+onerous
+onerously
+onerousness
+onery
+oneself
+onesigned
+onetime
+onewhere
+oneyer
+onfall
+onflemed
+onflow
+onflowing
+ongaro
+ongoing
+onhanger
+onicolo
+oniomania
+oniomaniac
+onion
+onionet
+onionized
+onionlike
+onionpeel
+onionskin
+oniony
+onirotic
+Oniscidae
+onisciform
+oniscoid
+Oniscoidea
+oniscoidean
+Oniscus
+onium
+onkilonite
+onkos
+onlay
+onlepy
+onliest
+onliness
+onlook
+onlooker
+onlooking
+only
+onmarch
+Onmun
+Onobrychis
+onocentaur
+Onoclea
+onofrite
+Onohippidium
+onolatry
+onomancy
+onomantia
+onomastic
+onomasticon
+onomatologist
+onomatology
+onomatomania
+onomatope
+onomatoplasm
+onomatopoeia
+onomatopoeial
+onomatopoeian
+onomatopoeic
+onomatopoeical
+onomatopoeically
+onomatopoesis
+onomatopoesy
+onomatopoetic
+onomatopoetically
+onomatopy
+onomatous
+onomomancy
+Onondaga
+Onondagan
+Ononis
+Onopordon
+Onosmodium
+onrush
+onrushing
+ons
+onset
+onsetter
+onshore
+onside
+onsight
+onslaught
+onstand
+onstanding
+onstead
+onsweep
+onsweeping
+ontal
+Ontarian
+Ontaric
+onto
+ontocycle
+ontocyclic
+ontogenal
+ontogenesis
+ontogenetic
+ontogenetical
+ontogenetically
+ontogenic
+ontogenically
+ontogenist
+ontogeny
+ontography
+ontologic
+ontological
+ontologically
+ontologism
+ontologist
+ontologistic
+ontologize
+ontology
+ontosophy
+onus
+onwaiting
+onward
+onwardly
+onwardness
+onwards
+onycha
+onychatrophia
+onychauxis
+onychia
+onychin
+onychitis
+onychium
+onychogryposis
+onychoid
+onycholysis
+onychomalacia
+onychomancy
+onychomycosis
+onychonosus
+onychopathic
+onychopathology
+onychopathy
+onychophagist
+onychophagy
+Onychophora
+onychophoran
+onychophorous
+onychophyma
+onychoptosis
+onychorrhexis
+onychoschizia
+onychosis
+onychotrophy
+onym
+onymal
+onymancy
+onymatic
+onymity
+onymize
+onymous
+onymy
+onyx
+onyxis
+onyxitis
+onza
+ooangium
+ooblast
+ooblastic
+oocyesis
+oocyst
+Oocystaceae
+oocystaceous
+oocystic
+Oocystis
+oocyte
+oodles
+ooecial
+ooecium
+oofbird
+ooftish
+oofy
+oogamete
+oogamous
+oogamy
+oogenesis
+oogenetic
+oogeny
+ooglea
+oogone
+oogonial
+oogoniophore
+oogonium
+oograph
+ooid
+ooidal
+ookinesis
+ookinete
+ookinetic
+oolak
+oolemma
+oolite
+oolitic
+oolly
+oologic
+oological
+oologically
+oologist
+oologize
+oology
+oolong
+oomancy
+oomantia
+oometer
+oometric
+oometry
+oomycete
+Oomycetes
+oomycetous
+oons
+oont
+oopak
+oophoralgia
+oophorauxe
+oophore
+oophorectomy
+oophoreocele
+oophorhysterectomy
+oophoric
+oophoridium
+oophoritis
+oophoroepilepsy
+oophoroma
+oophoromalacia
+oophoromania
+oophoron
+oophoropexy
+oophororrhaphy
+oophorosalpingectomy
+oophorostomy
+oophorotomy
+oophyte
+oophytic
+ooplasm
+ooplasmic
+ooplast
+oopod
+oopodal
+ooporphyrin
+oorali
+oord
+ooscope
+ooscopy
+oosperm
+oosphere
+oosporange
+oosporangium
+oospore
+Oosporeae
+oosporic
+oosporiferous
+oosporous
+oostegite
+oostegitic
+ootheca
+oothecal
+ootid
+ootocoid
+Ootocoidea
+ootocoidean
+ootocous
+ootype
+ooze
+oozily
+ooziness
+oozooid
+oozy
+opacate
+opacification
+opacifier
+opacify
+opacite
+opacity
+opacous
+opacousness
+opah
+opal
+opaled
+opalesce
+opalescence
+opalescent
+opalesque
+Opalina
+opaline
+opalinid
+Opalinidae
+opalinine
+opalish
+opalize
+opaloid
+opaque
+opaquely
+opaqueness
+Opata
+opdalite
+ope
+Opegrapha
+opeidoscope
+opelet
+open
+openable
+openband
+openbeak
+openbill
+opencast
+opener
+openhanded
+openhandedly
+openhandedness
+openhead
+openhearted
+openheartedly
+openheartedness
+opening
+openly
+openmouthed
+openmouthedly
+openmouthedness
+openness
+openside
+openwork
+opera
+operability
+operabily
+operable
+operae
+operagoer
+operalogue
+operameter
+operance
+operancy
+operand
+operant
+operatable
+operate
+operatee
+operatic
+operatical
+operatically
+operating
+operation
+operational
+operationalism
+operationalist
+operationism
+operationist
+operative
+operatively
+operativeness
+operativity
+operatize
+operator
+operatory
+operatrix
+opercle
+opercled
+opercula
+opercular
+Operculata
+operculate
+operculated
+operculiferous
+operculiform
+operculigenous
+operculigerous
+operculum
+operetta
+operette
+operettist
+operose
+operosely
+operoseness
+operosity
+Ophelia
+ophelimity
+Ophian
+ophiasis
+ophic
+ophicalcite
+Ophicephalidae
+ophicephaloid
+Ophicephalus
+Ophichthyidae
+ophichthyoid
+ophicleide
+ophicleidean
+ophicleidist
+Ophidia
+ophidian
+Ophidiidae
+Ophidiobatrachia
+ophidioid
+Ophidion
+ophidiophobia
+ophidious
+ophidologist
+ophidology
+Ophiobatrachia
+Ophiobolus
+Ophioglossaceae
+ophioglossaceous
+Ophioglossales
+Ophioglossum
+ophiography
+ophioid
+ophiolater
+ophiolatrous
+ophiolatry
+ophiolite
+ophiolitic
+ophiologic
+ophiological
+ophiologist
+ophiology
+ophiomancy
+ophiomorph
+Ophiomorpha
+ophiomorphic
+ophiomorphous
+Ophion
+ophionid
+Ophioninae
+ophionine
+ophiophagous
+ophiophilism
+ophiophilist
+ophiophobe
+ophiophobia
+ophiophoby
+ophiopluteus
+Ophiosaurus
+ophiostaphyle
+ophiouride
+Ophis
+Ophisaurus
+Ophism
+Ophite
+ophite
+Ophitic
+ophitic
+Ophitism
+Ophiuchid
+Ophiuchus
+ophiuran
+ophiurid
+Ophiurida
+ophiuroid
+Ophiuroidea
+ophiuroidean
+ophryon
+Ophrys
+ophthalaiater
+ophthalmagra
+ophthalmalgia
+ophthalmalgic
+ophthalmatrophia
+ophthalmectomy
+ophthalmencephalon
+ophthalmetrical
+ophthalmia
+ophthalmiac
+ophthalmiatrics
+ophthalmic
+ophthalmious
+ophthalmist
+ophthalmite
+ophthalmitic
+ophthalmitis
+ophthalmoblennorrhea
+ophthalmocarcinoma
+ophthalmocele
+ophthalmocopia
+ophthalmodiagnosis
+ophthalmodiastimeter
+ophthalmodynamometer
+ophthalmodynia
+ophthalmography
+ophthalmoleucoscope
+ophthalmolith
+ophthalmologic
+ophthalmological
+ophthalmologist
+ophthalmology
+ophthalmomalacia
+ophthalmometer
+ophthalmometric
+ophthalmometry
+ophthalmomycosis
+ophthalmomyositis
+ophthalmomyotomy
+ophthalmoneuritis
+ophthalmopathy
+ophthalmophlebotomy
+ophthalmophore
+ophthalmophorous
+ophthalmophthisis
+ophthalmoplasty
+ophthalmoplegia
+ophthalmoplegic
+ophthalmopod
+ophthalmoptosis
+ophthalmorrhagia
+ophthalmorrhea
+ophthalmorrhexis
+Ophthalmosaurus
+ophthalmoscope
+ophthalmoscopic
+ophthalmoscopical
+ophthalmoscopist
+ophthalmoscopy
+ophthalmostasis
+ophthalmostat
+ophthalmostatometer
+ophthalmothermometer
+ophthalmotomy
+ophthalmotonometer
+ophthalmotonometry
+ophthalmotrope
+ophthalmotropometer
+ophthalmy
+opianic
+opianyl
+opiate
+opiateproof
+opiatic
+Opiconsivia
+opificer
+opiism
+Opilia
+Opiliaceae
+opiliaceous
+Opiliones
+Opilionina
+opilionine
+Opilonea
+Opimian
+opinability
+opinable
+opinably
+opinant
+opination
+opinative
+opinatively
+opinator
+opine
+opiner
+opiniaster
+opiniastre
+opiniastrety
+opiniastrous
+opiniater
+opiniative
+opiniatively
+opiniativeness
+opiniatreness
+opiniatrety
+opinion
+opinionable
+opinionaire
+opinional
+opinionate
+opinionated
+opinionatedly
+opinionatedness
+opinionately
+opinionative
+opinionatively
+opinionativeness
+opinioned
+opinionedness
+opinionist
+opiomania
+opiomaniac
+opiophagism
+opiophagy
+opiparous
+opisometer
+opisthenar
+opisthion
+opisthobranch
+Opisthobranchia
+opisthobranchiate
+Opisthocoelia
+opisthocoelian
+opisthocoelous
+opisthocome
+Opisthocomi
+Opisthocomidae
+opisthocomine
+opisthocomous
+opisthodetic
+opisthodome
+opisthodomos
+opisthodomus
+opisthodont
+opisthogastric
+Opisthoglossa
+opisthoglossal
+opisthoglossate
+opisthoglyph
+Opisthoglypha
+opisthoglyphic
+opisthoglyphous
+Opisthognathidae
+opisthognathism
+opisthognathous
+opisthograph
+opisthographal
+opisthographic
+opisthographical
+opisthography
+opisthogyrate
+opisthogyrous
+Opisthoparia
+opisthoparian
+opisthophagic
+opisthoporeia
+opisthorchiasis
+Opisthorchis
+opisthosomal
+Opisthothelae
+opisthotic
+opisthotonic
+opisthotonoid
+opisthotonos
+opisthotonus
+opium
+opiumism
+opobalsam
+opodeldoc
+opodidymus
+opodymus
+opopanax
+Oporto
+opossum
+opotherapy
+Oppian
+oppidan
+oppilate
+oppilation
+oppilative
+opponency
+opponent
+opportune
+opportuneless
+opportunely
+opportuneness
+opportunism
+opportunist
+opportunistic
+opportunistically
+opportunity
+opposability
+opposable
+oppose
+opposed
+opposeless
+opposer
+opposing
+opposingly
+opposit
+opposite
+oppositely
+oppositeness
+oppositiflorous
+oppositifolious
+opposition
+oppositional
+oppositionary
+oppositionism
+oppositionist
+oppositionless
+oppositious
+oppositipetalous
+oppositipinnate
+oppositipolar
+oppositisepalous
+oppositive
+oppositively
+oppositiveness
+opposure
+oppress
+oppressed
+oppressible
+oppression
+oppressionist
+oppressive
+oppressively
+oppressiveness
+oppressor
+opprobriate
+opprobrious
+opprobriously
+opprobriousness
+opprobrium
+opprobry
+oppugn
+oppugnacy
+oppugnance
+oppugnancy
+oppugnant
+oppugnate
+oppugnation
+oppugner
+opsigamy
+opsimath
+opsimathy
+opsiometer
+opsisform
+opsistype
+opsonic
+opsoniferous
+opsonification
+opsonify
+opsonin
+opsonist
+opsonium
+opsonization
+opsonize
+opsonogen
+opsonoid
+opsonology
+opsonometry
+opsonophilia
+opsonophilic
+opsonophoric
+opsonotherapy
+opsy
+opt
+optable
+optableness
+optably
+optant
+optate
+optation
+optative
+optatively
+opthalmophorium
+opthalmoplegy
+opthalmothermometer
+optic
+optical
+optically
+optician
+opticist
+opticity
+opticochemical
+opticociliary
+opticon
+opticopapillary
+opticopupillary
+optics
+optigraph
+optimacy
+optimal
+optimate
+optimates
+optime
+optimism
+optimist
+optimistic
+optimistical
+optimistically
+optimity
+optimization
+optimize
+optimum
+option
+optional
+optionality
+optionalize
+optionally
+optionary
+optionee
+optionor
+optive
+optoblast
+optogram
+optography
+optological
+optologist
+optology
+optomeninx
+optometer
+optometrical
+optometrist
+optometry
+optophone
+optotechnics
+optotype
+Opulaster
+opulence
+opulency
+opulent
+opulently
+opulus
+Opuntia
+Opuntiaceae
+Opuntiales
+opuntioid
+opus
+opuscular
+opuscule
+opusculum
+oquassa
+or
+ora
+orabassu
+orach
+oracle
+oracular
+oracularity
+oracularly
+oracularness
+oraculate
+oraculous
+oraculously
+oraculousness
+oraculum
+orad
+orage
+oragious
+Orakzai
+oral
+oraler
+oralism
+oralist
+orality
+oralization
+oralize
+orally
+oralogist
+oralogy
+Orang
+orang
+orange
+orangeade
+orangebird
+Orangeism
+Orangeist
+orangeleaf
+Orangeman
+orangeman
+oranger
+orangeroot
+orangery
+orangewoman
+orangewood
+orangey
+orangism
+orangist
+orangite
+orangize
+orangutan
+orant
+Oraon
+orarian
+orarion
+orarium
+orary
+orate
+oration
+orational
+orationer
+orator
+oratorial
+oratorially
+Oratorian
+oratorian
+Oratorianism
+Oratorianize
+oratoric
+oratorical
+oratorically
+oratorio
+oratorize
+oratorlike
+oratorship
+oratory
+oratress
+oratrix
+orb
+orbed
+orbic
+orbical
+Orbicella
+orbicle
+orbicular
+orbicularis
+orbicularity
+orbicularly
+orbicularness
+orbiculate
+orbiculated
+orbiculately
+orbiculation
+orbiculatocordate
+orbiculatoelliptical
+Orbiculoidea
+orbific
+Orbilian
+Orbilius
+orbit
+orbital
+orbitale
+orbitar
+orbitary
+orbite
+orbitelar
+Orbitelariae
+orbitelarian
+orbitele
+orbitelous
+orbitofrontal
+Orbitoides
+Orbitolina
+orbitolite
+Orbitolites
+orbitomalar
+orbitomaxillary
+orbitonasal
+orbitopalpebral
+orbitosphenoid
+orbitosphenoidal
+orbitostat
+orbitotomy
+orbitozygomatic
+orbless
+orblet
+Orbulina
+orby
+orc
+Orca
+Orcadian
+orcanet
+orcein
+orchamus
+orchard
+orcharding
+orchardist
+orchardman
+orchat
+orchel
+orchella
+orchesis
+orchesography
+orchester
+Orchestia
+orchestian
+orchestic
+orchestiid
+Orchestiidae
+orchestra
+orchestral
+orchestraless
+orchestrally
+orchestrate
+orchestrater
+orchestration
+orchestrator
+orchestre
+orchestric
+orchestrina
+orchestrion
+orchialgia
+orchic
+orchichorea
+orchid
+Orchidaceae
+orchidacean
+orchidaceous
+Orchidales
+orchidalgia
+orchidectomy
+orchideous
+orchideously
+orchidist
+orchiditis
+orchidocele
+orchidocelioplasty
+orchidologist
+orchidology
+orchidomania
+orchidopexy
+orchidoplasty
+orchidoptosis
+orchidorrhaphy
+orchidotherapy
+orchidotomy
+orchiectomy
+orchiencephaloma
+orchiepididymitis
+orchil
+orchilla
+orchilytic
+orchiocatabasis
+orchiocele
+orchiodynia
+orchiomyeloma
+orchioncus
+orchioneuralgia
+orchiopexy
+orchioplasty
+orchiorrhaphy
+orchioscheocele
+orchioscirrhus
+orchiotomy
+Orchis
+orchitic
+orchitis
+orchotomy
+orcin
+orcinol
+Orcinus
+ordain
+ordainable
+ordainer
+ordainment
+ordanchite
+ordeal
+order
+orderable
+ordered
+orderedness
+orderer
+orderless
+orderliness
+orderly
+ordinable
+ordinal
+ordinally
+ordinance
+ordinand
+ordinant
+ordinar
+ordinarily
+ordinariness
+ordinarius
+ordinary
+ordinaryship
+ordinate
+ordinately
+ordination
+ordinative
+ordinatomaculate
+ordinator
+ordinee
+ordines
+ordnance
+ordonnance
+ordonnant
+ordosite
+Ordovian
+Ordovices
+Ordovician
+ordu
+ordure
+ordurous
+ore
+oread
+Oreamnos
+Oreas
+orecchion
+orectic
+orective
+oreillet
+orellin
+oreman
+orenda
+orendite
+Oreocarya
+Oreodon
+oreodont
+Oreodontidae
+oreodontine
+oreodontoid
+Oreodoxa
+Oreophasinae
+oreophasine
+Oreophasis
+Oreortyx
+oreotragine
+Oreotragus
+Oreotrochilus
+Orestean
+Oresteia
+oreweed
+orewood
+orexis
+orf
+orfgild
+organ
+organal
+organbird
+organdy
+organella
+organelle
+organer
+organette
+organic
+organical
+organically
+organicalness
+organicism
+organicismal
+organicist
+organicistic
+organicity
+organific
+organing
+organism
+organismal
+organismic
+organist
+organistic
+organistrum
+organistship
+organity
+organizability
+organizable
+organization
+organizational
+organizationally
+organizationist
+organizatory
+organize
+organized
+organizer
+organless
+organoantimony
+organoarsenic
+organobismuth
+organoboron
+organochordium
+organogel
+organogen
+organogenesis
+organogenetic
+organogenic
+organogenist
+organogeny
+organogold
+organographic
+organographical
+organographist
+organography
+organoid
+organoiron
+organolead
+organoleptic
+organolithium
+organologic
+organological
+organologist
+organology
+organomagnesium
+organomercury
+organometallic
+organon
+organonomic
+organonomy
+organonym
+organonymal
+organonymic
+organonymy
+organopathy
+organophil
+organophile
+organophilic
+organophone
+organophonic
+organophyly
+organoplastic
+organoscopy
+organosilicon
+organosilver
+organosodium
+organosol
+organotherapy
+organotin
+organotrophic
+organotropic
+organotropically
+organotropism
+organotropy
+organozinc
+organry
+organule
+organum
+organzine
+orgasm
+orgasmic
+orgastic
+orgeat
+orgia
+orgiac
+orgiacs
+orgiasm
+orgiast
+orgiastic
+orgiastical
+orgic
+orgue
+orguinette
+orgulous
+orgulously
+orgy
+orgyia
+Orias
+Oribatidae
+oribi
+orichalceous
+orichalch
+orichalcum
+oriconic
+oricycle
+oriel
+oriency
+orient
+Oriental
+oriental
+Orientalia
+orientalism
+orientalist
+orientality
+orientalization
+orientalize
+orientally
+Orientalogy
+orientate
+orientation
+orientative
+orientator
+orientite
+orientization
+orientize
+oriently
+orientness
+orifacial
+orifice
+orificial
+oriflamb
+oriflamme
+oriform
+origan
+origanized
+Origanum
+Origenian
+Origenic
+Origenical
+Origenism
+Origenist
+Origenistic
+Origenize
+origin
+originable
+original
+originalist
+originality
+originally
+originalness
+originant
+originarily
+originary
+originate
+origination
+originative
+originatively
+originator
+originatress
+originist
+orignal
+orihon
+orihyperbola
+orillion
+orillon
+orinasal
+orinasality
+oriole
+Oriolidae
+Oriolus
+Orion
+Oriskanian
+orismologic
+orismological
+orismology
+orison
+orisphere
+oristic
+Oriya
+Orkhon
+Orkneyan
+Orlando
+orle
+orlean
+Orleanism
+Orleanist
+Orleanistic
+Orleans
+orlet
+orleways
+orlewise
+orlo
+orlop
+Ormazd
+ormer
+ormolu
+Ormond
+orna
+ornament
+ornamental
+ornamentalism
+ornamentalist
+ornamentality
+ornamentalize
+ornamentally
+ornamentary
+ornamentation
+ornamenter
+ornamentist
+ornate
+ornately
+ornateness
+ornation
+ornature
+orneriness
+ornery
+ornis
+orniscopic
+orniscopist
+orniscopy
+ornithic
+ornithichnite
+ornithine
+Ornithischia
+ornithischian
+ornithivorous
+ornithobiographical
+ornithobiography
+ornithocephalic
+Ornithocephalidae
+ornithocephalous
+Ornithocephalus
+ornithocoprolite
+ornithocopros
+ornithodelph
+Ornithodelphia
+ornithodelphian
+ornithodelphic
+ornithodelphous
+Ornithodoros
+Ornithogaea
+Ornithogaean
+Ornithogalum
+ornithogeographic
+ornithogeographical
+ornithography
+ornithoid
+Ornitholestes
+ornitholite
+ornitholitic
+ornithologic
+ornithological
+ornithologically
+ornithologist
+ornithology
+ornithomancy
+ornithomantia
+ornithomantic
+ornithomantist
+Ornithomimidae
+Ornithomimus
+ornithomorph
+ornithomorphic
+ornithomyzous
+ornithon
+Ornithopappi
+ornithophile
+ornithophilist
+ornithophilite
+ornithophilous
+ornithophily
+ornithopod
+Ornithopoda
+ornithopter
+Ornithoptera
+Ornithopteris
+Ornithorhynchidae
+ornithorhynchous
+Ornithorhynchus
+ornithosaur
+Ornithosauria
+ornithosaurian
+Ornithoscelida
+ornithoscelidan
+ornithoscopic
+ornithoscopist
+ornithoscopy
+ornithosis
+ornithotomical
+ornithotomist
+ornithotomy
+ornithotrophy
+Ornithurae
+ornithuric
+ornithurous
+ornoite
+oroanal
+Orobanchaceae
+orobanchaceous
+Orobanche
+orobancheous
+orobathymetric
+Orobatoidea
+Orochon
+orocratic
+orodiagnosis
+orogen
+orogenesis
+orogenesy
+orogenetic
+orogenic
+orogeny
+orograph
+orographic
+orographical
+orographically
+orography
+oroheliograph
+Orohippus
+orohydrographic
+orohydrographical
+orohydrography
+oroide
+orolingual
+orological
+orologist
+orology
+orometer
+orometric
+orometry
+Oromo
+oronasal
+oronoco
+Orontium
+oropharyngeal
+oropharynx
+orotherapy
+Orotinan
+orotund
+orotundity
+orphan
+orphancy
+orphandom
+orphange
+orphanhood
+orphanism
+orphanize
+orphanry
+orphanship
+orpharion
+Orphean
+Orpheist
+orpheon
+orpheonist
+orpheum
+Orpheus
+Orphic
+Orphical
+Orphically
+Orphicism
+Orphism
+Orphize
+orphrey
+orphreyed
+orpiment
+orpine
+Orpington
+orrery
+orrhoid
+orrhology
+orrhotherapy
+orris
+orrisroot
+orseille
+orseilline
+orsel
+orselle
+orseller
+orsellic
+orsellinate
+orsellinic
+Orson
+ort
+ortalid
+Ortalidae
+ortalidian
+Ortalis
+ortet
+Orthagoriscus
+orthal
+orthantimonic
+Ortheris
+orthian
+orthic
+orthicon
+orthid
+Orthidae
+Orthis
+orthite
+orthitic
+ortho
+orthoarsenite
+orthoaxis
+orthobenzoquinone
+orthobiosis
+orthoborate
+orthobrachycephalic
+orthocarbonic
+orthocarpous
+Orthocarpus
+orthocenter
+orthocentric
+orthocephalic
+orthocephalous
+orthocephaly
+orthoceracone
+Orthoceran
+Orthoceras
+Orthoceratidae
+orthoceratite
+orthoceratitic
+orthoceratoid
+orthochlorite
+orthochromatic
+orthochromatize
+orthoclase
+orthoclasite
+orthoclastic
+orthocoumaric
+orthocresol
+orthocymene
+orthodiaene
+orthodiagonal
+orthodiagram
+orthodiagraph
+orthodiagraphic
+orthodiagraphy
+orthodiazin
+orthodiazine
+orthodolichocephalic
+orthodomatic
+orthodome
+orthodontia
+orthodontic
+orthodontics
+orthodontist
+orthodox
+orthodoxal
+orthodoxality
+orthodoxally
+orthodoxian
+orthodoxical
+orthodoxically
+orthodoxism
+orthodoxist
+orthodoxly
+orthodoxness
+orthodoxy
+orthodromic
+orthodromics
+orthodromy
+orthoepic
+orthoepical
+orthoepically
+orthoepist
+orthoepistic
+orthoepy
+orthoformic
+orthogamous
+orthogamy
+orthogenesis
+orthogenetic
+orthogenic
+orthognathic
+orthognathism
+orthognathous
+orthognathus
+orthognathy
+orthogneiss
+orthogonal
+orthogonality
+orthogonally
+orthogonial
+orthograde
+orthogranite
+orthograph
+orthographer
+orthographic
+orthographical
+orthographically
+orthographist
+orthographize
+orthography
+orthohydrogen
+orthologer
+orthologian
+orthological
+orthology
+orthometopic
+orthometric
+orthometry
+Orthonectida
+orthonitroaniline
+orthopath
+orthopathic
+orthopathically
+orthopathy
+orthopedia
+orthopedic
+orthopedical
+orthopedically
+orthopedics
+orthopedist
+orthopedy
+orthophenylene
+orthophonic
+orthophony
+orthophoria
+orthophoric
+orthophosphate
+orthophosphoric
+orthophyre
+orthophyric
+orthopinacoid
+orthopinacoidal
+orthoplastic
+orthoplasy
+orthoplumbate
+orthopnea
+orthopneic
+orthopod
+Orthopoda
+orthopraxis
+orthopraxy
+orthoprism
+orthopsychiatric
+orthopsychiatrical
+orthopsychiatrist
+orthopsychiatry
+orthopter
+Orthoptera
+orthopteral
+orthopteran
+orthopterist
+orthopteroid
+Orthopteroidea
+orthopterological
+orthopterologist
+orthopterology
+orthopteron
+orthopterous
+orthoptic
+orthopyramid
+orthopyroxene
+orthoquinone
+orthorhombic
+Orthorrhapha
+orthorrhaphous
+orthorrhaphy
+orthoscope
+orthoscopic
+orthose
+orthosemidin
+orthosemidine
+orthosilicate
+orthosilicic
+orthosis
+orthosite
+orthosomatic
+orthospermous
+orthostatic
+orthostichous
+orthostichy
+orthostyle
+orthosubstituted
+orthosymmetric
+orthosymmetrical
+orthosymmetrically
+orthosymmetry
+orthotactic
+orthotectic
+orthotic
+orthotolidin
+orthotolidine
+orthotoluic
+orthotoluidin
+orthotoluidine
+orthotomic
+orthotomous
+orthotone
+orthotonesis
+orthotonic
+orthotonus
+orthotropal
+orthotropic
+orthotropism
+orthotropous
+orthotropy
+orthotype
+orthotypous
+orthovanadate
+orthovanadic
+orthoveratraldehyde
+orthoveratric
+orthoxazin
+orthoxazine
+orthoxylene
+orthron
+ortiga
+ortive
+Ortol
+ortolan
+Ortrud
+ortstein
+ortygan
+Ortygian
+Ortyginae
+ortygine
+Ortyx
+Orunchun
+orvietan
+orvietite
+Orvieto
+Orville
+ory
+Orycteropodidae
+Orycteropus
+oryctics
+oryctognostic
+oryctognostical
+oryctognostically
+oryctognosy
+Oryctolagus
+oryssid
+Oryssidae
+Oryssus
+Oryx
+Oryza
+oryzenin
+oryzivorous
+Oryzomys
+Oryzopsis
+Oryzorictes
+Oryzorictinae
+Os
+os
+Osage
+osamin
+osamine
+osazone
+Osc
+Oscan
+Oscar
+Oscarella
+Oscarellidae
+oscella
+oscheal
+oscheitis
+oscheocarcinoma
+oscheocele
+oscheolith
+oscheoma
+oscheoncus
+oscheoplasty
+Oschophoria
+oscillance
+oscillancy
+oscillant
+Oscillaria
+Oscillariaceae
+oscillariaceous
+oscillate
+oscillating
+oscillation
+oscillative
+oscillatively
+oscillator
+Oscillatoria
+Oscillatoriaceae
+oscillatoriaceous
+oscillatorian
+oscillatory
+oscillogram
+oscillograph
+oscillographic
+oscillography
+oscillometer
+oscillometric
+oscillometry
+oscilloscope
+oscin
+oscine
+Oscines
+oscinian
+Oscinidae
+oscinine
+Oscinis
+oscitance
+oscitancy
+oscitant
+oscitantly
+oscitate
+oscitation
+oscnode
+osculable
+osculant
+oscular
+oscularity
+osculate
+osculation
+osculatory
+osculatrix
+oscule
+osculiferous
+osculum
+oscurrantist
+ose
+osela
+oshac
+Osiandrian
+oside
+osier
+osiered
+osierlike
+osiery
+Osirian
+Osiride
+Osiridean
+Osirification
+Osirify
+Osiris
+Osirism
+Oskar
+Osmanie
+Osmanli
+Osmanthus
+osmate
+osmatic
+osmatism
+osmazomatic
+osmazomatous
+osmazome
+Osmeridae
+Osmerus
+osmesis
+osmeterium
+osmetic
+osmic
+osmidrosis
+osmin
+osmina
+osmious
+osmiridium
+osmium
+osmodysphoria
+osmogene
+osmograph
+osmolagnia
+osmology
+osmometer
+osmometric
+osmometry
+Osmond
+osmondite
+osmophore
+osmoregulation
+Osmorhiza
+osmoscope
+osmose
+osmosis
+osmotactic
+osmotaxis
+osmotherapy
+osmotic
+osmotically
+osmous
+osmund
+Osmunda
+Osmundaceae
+osmundaceous
+osmundine
+Osnaburg
+Osnappar
+osoberry
+osone
+osophy
+osotriazine
+osotriazole
+osphradial
+osphradium
+osphresiolagnia
+osphresiologic
+osphresiologist
+osphresiology
+osphresiometer
+osphresiometry
+osphresiophilia
+osphresis
+osphretic
+Osphromenidae
+osphyalgia
+osphyalgic
+osphyarthritis
+osphyitis
+osphyocele
+osphyomelitis
+osprey
+ossal
+ossarium
+ossature
+osse
+ossein
+osselet
+ossements
+osseoalbuminoid
+osseoaponeurotic
+osseocartilaginous
+osseofibrous
+osseomucoid
+osseous
+osseously
+Osset
+Ossetian
+Ossetic
+Ossetine
+Ossetish
+Ossian
+Ossianesque
+Ossianic
+Ossianism
+Ossianize
+ossicle
+ossicular
+ossiculate
+ossicule
+ossiculectomy
+ossiculotomy
+ossiculum
+ossiferous
+ossific
+ossification
+ossified
+ossifier
+ossifluence
+ossifluent
+ossiform
+ossifrage
+ossifrangent
+ossify
+ossivorous
+ossuarium
+ossuary
+ossypite
+ostalgia
+Ostara
+ostariophysan
+Ostariophyseae
+Ostariophysi
+ostariophysial
+ostariophysous
+ostarthritis
+osteal
+ostealgia
+osteanabrosis
+osteanagenesis
+ostearthritis
+ostearthrotomy
+ostectomy
+osteectomy
+osteectopia
+osteectopy
+Osteichthyes
+ostein
+osteitic
+osteitis
+ostemia
+ostempyesis
+ostensibility
+ostensible
+ostensibly
+ostension
+ostensive
+ostensively
+ostensorium
+ostensory
+ostent
+ostentate
+ostentation
+ostentatious
+ostentatiously
+ostentatiousness
+ostentive
+ostentous
+osteoaneurysm
+osteoarthritis
+osteoarthropathy
+osteoarthrotomy
+osteoblast
+osteoblastic
+osteoblastoma
+osteocachetic
+osteocarcinoma
+osteocartilaginous
+osteocele
+osteocephaloma
+osteochondritis
+osteochondrofibroma
+osteochondroma
+osteochondromatous
+osteochondropathy
+osteochondrophyte
+osteochondrosarcoma
+osteochondrous
+osteoclasia
+osteoclasis
+osteoclast
+osteoclastic
+osteoclasty
+osteocolla
+osteocomma
+osteocranium
+osteocystoma
+osteodentin
+osteodentinal
+osteodentine
+osteoderm
+osteodermal
+osteodermatous
+osteodermia
+osteodermis
+osteodiastasis
+osteodynia
+osteodystrophy
+osteoencephaloma
+osteoenchondroma
+osteoepiphysis
+osteofibroma
+osteofibrous
+osteogangrene
+osteogen
+osteogenesis
+osteogenetic
+osteogenic
+osteogenist
+osteogenous
+osteogeny
+osteoglossid
+Osteoglossidae
+osteoglossoid
+Osteoglossum
+osteographer
+osteography
+osteohalisteresis
+osteoid
+Osteolepidae
+Osteolepis
+osteolite
+osteologer
+osteologic
+osteological
+osteologically
+osteologist
+osteology
+osteolysis
+osteolytic
+osteoma
+osteomalacia
+osteomalacial
+osteomalacic
+osteomancy
+osteomanty
+osteomatoid
+osteomere
+osteometric
+osteometrical
+osteometry
+osteomyelitis
+osteoncus
+osteonecrosis
+osteoneuralgia
+osteopaedion
+osteopath
+osteopathic
+osteopathically
+osteopathist
+osteopathy
+osteopedion
+osteoperiosteal
+osteoperiostitis
+osteopetrosis
+osteophage
+osteophagia
+osteophlebitis
+osteophone
+osteophony
+osteophore
+osteophyma
+osteophyte
+osteophytic
+osteoplaque
+osteoplast
+osteoplastic
+osteoplasty
+osteoporosis
+osteoporotic
+osteorrhaphy
+osteosarcoma
+osteosarcomatous
+osteosclerosis
+osteoscope
+osteosis
+osteosteatoma
+osteostixis
+osteostomatous
+osteostomous
+osteostracan
+Osteostraci
+osteosuture
+osteosynovitis
+osteosynthesis
+osteothrombosis
+osteotome
+osteotomist
+osteotomy
+osteotribe
+osteotrite
+osteotrophic
+osteotrophy
+Ostertagia
+ostial
+ostiary
+ostiate
+Ostic
+ostiolar
+ostiolate
+ostiole
+ostitis
+ostium
+ostleress
+Ostmannic
+ostmark
+Ostmen
+ostosis
+Ostracea
+ostracean
+ostraceous
+Ostraciidae
+ostracine
+ostracioid
+Ostracion
+ostracism
+ostracizable
+ostracization
+ostracize
+ostracizer
+ostracod
+Ostracoda
+ostracode
+ostracoderm
+Ostracodermi
+ostracodous
+ostracoid
+Ostracoidea
+ostracon
+ostracophore
+Ostracophori
+ostracophorous
+ostracum
+Ostraeacea
+ostraite
+Ostrea
+ostreaceous
+ostreger
+ostreicultural
+ostreiculture
+ostreiculturist
+Ostreidae
+ostreiform
+ostreodynamometer
+ostreoid
+ostreophage
+ostreophagist
+ostreophagous
+ostrich
+ostrichlike
+Ostrogoth
+Ostrogothian
+Ostrogothic
+Ostrya
+Ostyak
+Oswald
+Oswegan
+otacoustic
+otacousticon
+Otaheitan
+otalgia
+otalgic
+otalgy
+Otaria
+otarian
+Otariidae
+Otariinae
+otariine
+otarine
+otarioid
+otary
+otate
+otectomy
+otelcosis
+Otello
+Othake
+othelcosis
+Othello
+othematoma
+othemorrhea
+otheoscope
+other
+otherdom
+otherest
+othergates
+otherguess
+otherhow
+otherism
+otherist
+otherness
+othersome
+othertime
+otherwards
+otherwhence
+otherwhere
+otherwhereness
+otherwheres
+otherwhile
+otherwhiles
+otherwhither
+otherwise
+otherwiseness
+otherworld
+otherworldliness
+otherworldly
+otherworldness
+Othin
+Othinism
+othmany
+Othonna
+othygroma
+otiant
+otiatric
+otiatrics
+otiatry
+otic
+oticodinia
+Otidae
+Otides
+Otididae
+otidiform
+otidine
+Otidiphaps
+otidium
+otiorhynchid
+Otiorhynchidae
+Otiorhynchinae
+otiose
+otiosely
+otioseness
+otiosity
+Otis
+otitic
+otitis
+otkon
+Oto
+otoantritis
+otoblennorrhea
+otocariasis
+otocephalic
+otocephaly
+otocerebritis
+otocleisis
+otoconial
+otoconite
+otoconium
+otocrane
+otocranial
+otocranic
+otocranium
+Otocyon
+otocyst
+otocystic
+otodynia
+otodynic
+otoencephalitis
+otogenic
+otogenous
+otographical
+otography
+Otogyps
+otohemineurasthenia
+otolaryngologic
+otolaryngologist
+otolaryngology
+otolite
+otolith
+Otolithidae
+Otolithus
+otolitic
+otological
+otologist
+otology
+Otomaco
+otomassage
+Otomi
+Otomian
+Otomitlan
+otomucormycosis
+otomyces
+otomycosis
+otonecrectomy
+otoneuralgia
+otoneurasthenia
+otopathic
+otopathy
+otopharyngeal
+otophone
+otopiesis
+otoplastic
+otoplasty
+otopolypus
+otopyorrhea
+otopyosis
+otorhinolaryngologic
+otorhinolaryngologist
+otorhinolaryngology
+otorrhagia
+otorrhea
+otorrhoea
+otosalpinx
+otosclerosis
+otoscope
+otoscopic
+otoscopy
+otosis
+otosphenal
+otosteal
+otosteon
+ototomy
+Otozoum
+ottajanite
+ottar
+ottavarima
+Ottawa
+otter
+otterer
+otterhound
+ottinger
+ottingkar
+Otto
+otto
+Ottoman
+Ottomanean
+Ottomanic
+Ottomanism
+Ottomanization
+Ottomanize
+Ottomanlike
+Ottomite
+ottrelife
+Ottweilian
+Otuquian
+oturia
+Otus
+Otyak
+ouabain
+ouabaio
+ouabe
+ouachitite
+ouakari
+ouananiche
+oubliette
+ouch
+Oudemian
+oudenarde
+Oudenodon
+oudenodont
+ouenite
+ouf
+ough
+ought
+oughtness
+oughtnt
+Ouija
+ouistiti
+oukia
+oulap
+ounce
+ounds
+ouphe
+ouphish
+our
+Ouranos
+ourie
+ouroub
+Ourouparia
+ours
+ourself
+ourselves
+oust
+ouster
+out
+outact
+outadmiral
+Outagami
+outage
+outambush
+outarde
+outargue
+outask
+outawe
+outbabble
+outback
+outbacker
+outbake
+outbalance
+outban
+outbanter
+outbar
+outbargain
+outbark
+outbawl
+outbeam
+outbear
+outbearing
+outbeg
+outbeggar
+outbelch
+outbellow
+outbent
+outbetter
+outbid
+outbidder
+outbirth
+outblacken
+outblaze
+outbleat
+outbleed
+outbless
+outbloom
+outblossom
+outblot
+outblow
+outblowing
+outblown
+outbluff
+outblunder
+outblush
+outbluster
+outboard
+outboast
+outbolting
+outbond
+outbook
+outborn
+outborough
+outbound
+outboundaries
+outbounds
+outbow
+outbowed
+outbowl
+outbox
+outbrag
+outbranch
+outbranching
+outbrave
+outbray
+outbrazen
+outbreak
+outbreaker
+outbreaking
+outbreath
+outbreathe
+outbreather
+outbred
+outbreed
+outbreeding
+outbribe
+outbridge
+outbring
+outbrother
+outbud
+outbuild
+outbuilding
+outbulge
+outbulk
+outbully
+outburn
+outburst
+outbustle
+outbuy
+outbuzz
+outby
+outcant
+outcaper
+outcarol
+outcarry
+outcase
+outcast
+outcaste
+outcasting
+outcastness
+outcavil
+outchamber
+outcharm
+outchase
+outchatter
+outcheat
+outchide
+outcity
+outclamor
+outclass
+outclerk
+outclimb
+outcome
+outcomer
+outcoming
+outcompass
+outcomplete
+outcompliment
+outcorner
+outcountry
+outcourt
+outcrawl
+outcricket
+outcrier
+outcrop
+outcropper
+outcross
+outcrossing
+outcrow
+outcrowd
+outcry
+outcull
+outcure
+outcurse
+outcurve
+outcut
+outdaciousness
+outdance
+outdare
+outdate
+outdated
+outdazzle
+outdevil
+outdispatch
+outdistance
+outdistrict
+outdo
+outdodge
+outdoer
+outdoor
+outdoorness
+outdoors
+outdoorsman
+outdraft
+outdragon
+outdraw
+outdream
+outdress
+outdrink
+outdrive
+outdure
+outdwell
+outdweller
+outdwelling
+outeat
+outecho
+outed
+outedge
+outen
+outer
+outerly
+outermost
+outerness
+outerwear
+outeye
+outeyed
+outfable
+outface
+outfall
+outfame
+outfangthief
+outfast
+outfawn
+outfeast
+outfeat
+outfeeding
+outfence
+outferret
+outfiction
+outfield
+outfielder
+outfieldsman
+outfight
+outfighter
+outfighting
+outfigure
+outfish
+outfit
+outfitter
+outflame
+outflank
+outflanker
+outflanking
+outflare
+outflash
+outflatter
+outfling
+outfloat
+outflourish
+outflow
+outflue
+outflung
+outflunky
+outflush
+outflux
+outfly
+outfold
+outfool
+outfoot
+outform
+outfort
+outfreeman
+outfront
+outfroth
+outfrown
+outgabble
+outgain
+outgallop
+outgamble
+outgame
+outgang
+outgarment
+outgarth
+outgas
+outgate
+outgauge
+outgaze
+outgeneral
+outgive
+outgiving
+outglad
+outglare
+outgleam
+outglitter
+outgloom
+outglow
+outgnaw
+outgo
+outgoer
+outgoing
+outgoingness
+outgone
+outgreen
+outgrin
+outground
+outgrow
+outgrowing
+outgrowth
+outguard
+outguess
+outgun
+outgush
+outhammer
+outhasten
+outhaul
+outhauler
+outhear
+outheart
+outhector
+outheel
+outher
+outhire
+outhiss
+outhit
+outhold
+outhorror
+outhouse
+outhousing
+outhowl
+outhue
+outhumor
+outhunt
+outhurl
+outhut
+outhymn
+outhyperbolize
+outimage
+outing
+outinvent
+outish
+outissue
+outjazz
+outjest
+outjet
+outjetting
+outjinx
+outjockey
+outjourney
+outjuggle
+outjump
+outjut
+outkeeper
+outkick
+outkill
+outking
+outkiss
+outkitchen
+outknave
+outknee
+outlabor
+outlaid
+outlance
+outland
+outlander
+outlandish
+outlandishlike
+outlandishly
+outlandishness
+outlash
+outlast
+outlaugh
+outlaunch
+outlaw
+outlawry
+outlay
+outlean
+outleap
+outlearn
+outlegend
+outlength
+outlengthen
+outler
+outlet
+outlie
+outlier
+outlighten
+outlimb
+outlimn
+outline
+outlinear
+outlined
+outlineless
+outliner
+outlinger
+outlip
+outlipped
+outlive
+outliver
+outlodging
+outlook
+outlooker
+outlord
+outlove
+outlung
+outluster
+outly
+outlying
+outmagic
+outmalaprop
+outman
+outmaneuver
+outmantle
+outmarch
+outmarriage
+outmarry
+outmaster
+outmatch
+outmate
+outmeasure
+outmerchant
+outmiracle
+outmode
+outmoded
+outmost
+outmount
+outmouth
+outmove
+outname
+outness
+outnight
+outnoise
+outnook
+outnumber
+outoffice
+outoven
+outpace
+outpage
+outpaint
+outparagon
+outparamour
+outparish
+outpart
+outpass
+outpassion
+outpath
+outpatient
+outpay
+outpayment
+outpeal
+outpeep
+outpeer
+outpension
+outpensioner
+outpeople
+outperform
+outpick
+outpicket
+outpipe
+outpitch
+outpity
+outplace
+outplan
+outplay
+outplayed
+outplease
+outplod
+outplot
+outpocketing
+outpoint
+outpoise
+outpoison
+outpoll
+outpomp
+outpop
+outpopulate
+outporch
+outport
+outporter
+outportion
+outpost
+outpouching
+outpour
+outpourer
+outpouring
+outpractice
+outpraise
+outpray
+outpreach
+outpreen
+outprice
+outprodigy
+outproduce
+outpromise
+outpry
+outpull
+outpupil
+outpurl
+outpurse
+outpush
+output
+outputter
+outquaff
+outquarters
+outqueen
+outquestion
+outquibble
+outquote
+outrace
+outrage
+outrageous
+outrageously
+outrageousness
+outrageproof
+outrager
+outraging
+outrail
+outrance
+outrange
+outrank
+outrant
+outrap
+outrate
+outraught
+outrave
+outray
+outre
+outreach
+outread
+outreason
+outreckon
+outredden
+outrede
+outreign
+outrelief
+outremer
+outreness
+outrhyme
+outrick
+outride
+outrider
+outriding
+outrig
+outrigger
+outriggered
+outriggerless
+outrigging
+outright
+outrightly
+outrightness
+outring
+outrival
+outroar
+outrogue
+outroll
+outromance
+outrooper
+outroot
+outrove
+outrow
+outroyal
+outrun
+outrunner
+outrush
+outsail
+outsaint
+outsally
+outsatisfy
+outsavor
+outsay
+outscent
+outscold
+outscore
+outscorn
+outscour
+outscouring
+outscream
+outsea
+outseam
+outsearch
+outsee
+outseek
+outsell
+outsentry
+outsert
+outservant
+outset
+outsetting
+outsettlement
+outsettler
+outshadow
+outshake
+outshame
+outshape
+outsharp
+outsharpen
+outsheathe
+outshift
+outshine
+outshiner
+outshoot
+outshot
+outshoulder
+outshout
+outshove
+outshow
+outshower
+outshriek
+outshrill
+outshut
+outside
+outsided
+outsidedness
+outsideness
+outsider
+outsift
+outsigh
+outsight
+outsin
+outsing
+outsit
+outsize
+outsized
+outskill
+outskip
+outskirmish
+outskirmisher
+outskirt
+outskirter
+outslander
+outslang
+outsleep
+outslide
+outslink
+outsmart
+outsmell
+outsmile
+outsnatch
+outsnore
+outsoar
+outsole
+outsoler
+outsonnet
+outsophisticate
+outsound
+outspan
+outsparkle
+outspeak
+outspeaker
+outspeech
+outspeed
+outspell
+outspend
+outspent
+outspill
+outspin
+outspirit
+outspit
+outsplendor
+outspoken
+outspokenly
+outspokenness
+outsport
+outspout
+outspread
+outspring
+outsprint
+outspue
+outspurn
+outspurt
+outstagger
+outstair
+outstand
+outstander
+outstanding
+outstandingly
+outstandingness
+outstare
+outstart
+outstarter
+outstartle
+outstate
+outstation
+outstatistic
+outstature
+outstay
+outsteal
+outsteam
+outstep
+outsting
+outstink
+outstood
+outstorm
+outstrain
+outstream
+outstreet
+outstretch
+outstretcher
+outstride
+outstrike
+outstrip
+outstrive
+outstroke
+outstrut
+outstudent
+outstudy
+outstunt
+outsubtle
+outsuck
+outsucken
+outsuffer
+outsuitor
+outsulk
+outsum
+outsuperstition
+outswagger
+outswarm
+outswear
+outsweep
+outsweeping
+outsweeten
+outswell
+outswift
+outswim
+outswindle
+outswing
+outswirl
+outtaken
+outtalent
+outtalk
+outtask
+outtaste
+outtear
+outtease
+outtell
+outthieve
+outthink
+outthreaten
+outthrob
+outthrough
+outthrow
+outthrust
+outthruster
+outthunder
+outthwack
+outtinkle
+outtire
+outtoil
+outtongue
+outtop
+outtower
+outtrade
+outtrail
+outtravel
+outtrick
+outtrot
+outtrump
+outturn
+outturned
+outtyrannize
+outusure
+outvalue
+outvanish
+outvaunt
+outvelvet
+outvenom
+outvictor
+outvie
+outvier
+outvigil
+outvillage
+outvillain
+outvociferate
+outvoice
+outvote
+outvoter
+outvoyage
+outwait
+outwake
+outwale
+outwalk
+outwall
+outwallop
+outwander
+outwar
+outwarble
+outward
+outwardly
+outwardmost
+outwardness
+outwards
+outwash
+outwaste
+outwatch
+outwater
+outwave
+outwealth
+outweapon
+outwear
+outweary
+outweave
+outweed
+outweep
+outweigh
+outweight
+outwell
+outwent
+outwhirl
+outwick
+outwile
+outwill
+outwind
+outwindow
+outwing
+outwish
+outwit
+outwith
+outwittal
+outwitter
+outwoe
+outwoman
+outwood
+outword
+outwore
+outwork
+outworker
+outworld
+outworn
+outworth
+outwrangle
+outwrench
+outwrest
+outwrestle
+outwriggle
+outwring
+outwrite
+outwrought
+outyard
+outyell
+outyelp
+outyield
+outzany
+ouzel
+Ova
+ova
+Ovaherero
+oval
+ovalbumin
+ovalescent
+ovaliform
+ovalish
+ovalization
+ovalize
+ovally
+ovalness
+ovaloid
+ovalwise
+Ovambo
+Ovampo
+Ovangangela
+ovant
+ovarial
+ovarian
+ovarin
+ovarioabdominal
+ovariocele
+ovariocentesis
+ovariocyesis
+ovariodysneuria
+ovariohysterectomy
+ovariole
+ovariolumbar
+ovariorrhexis
+ovariosalpingectomy
+ovariosteresis
+ovariostomy
+ovariotomist
+ovariotomize
+ovariotomy
+ovariotubal
+ovarious
+ovaritis
+ovarium
+ovary
+ovate
+ovateconical
+ovated
+ovately
+ovation
+ovational
+ovationary
+ovatoacuminate
+ovatoconical
+ovatocordate
+ovatocylindraceous
+ovatodeltoid
+ovatoellipsoidal
+ovatoglobose
+ovatolanceolate
+ovatooblong
+ovatoorbicular
+ovatopyriform
+ovatoquadrangular
+ovatorotundate
+ovatoserrate
+ovatotriangular
+oven
+ovenbird
+ovenful
+ovenlike
+ovenly
+ovenman
+ovenpeel
+ovenstone
+ovenware
+ovenwise
+over
+overability
+overable
+overabound
+overabsorb
+overabstain
+overabstemious
+overabstemiousness
+overabundance
+overabundant
+overabundantly
+overabuse
+overaccentuate
+overaccumulate
+overaccumulation
+overaccuracy
+overaccurate
+overaccurately
+overact
+overaction
+overactive
+overactiveness
+overactivity
+overacute
+overaddiction
+overadvance
+overadvice
+overaffect
+overaffirmation
+overafflict
+overaffliction
+overage
+overageness
+overaggravate
+overaggravation
+overagitate
+overagonize
+overall
+overalled
+overalls
+overambitioned
+overambitious
+overambling
+overanalyze
+overangelic
+overannotate
+overanswer
+overanxiety
+overanxious
+overanxiously
+overappareled
+overappraisal
+overappraise
+overapprehended
+overapprehension
+overapprehensive
+overapt
+overarch
+overargue
+overarm
+overartificial
+overartificiality
+overassail
+overassert
+overassertion
+overassertive
+overassertively
+overassertiveness
+overassess
+overassessment
+overassumption
+overattached
+overattachment
+overattention
+overattentive
+overattentively
+overawe
+overawful
+overawn
+overawning
+overbake
+overbalance
+overballast
+overbalm
+overbanded
+overbandy
+overbank
+overbanked
+overbark
+overbarren
+overbarrenness
+overbase
+overbaseness
+overbashful
+overbashfully
+overbashfulness
+overbattle
+overbear
+overbearance
+overbearer
+overbearing
+overbearingly
+overbearingness
+overbeat
+overbeating
+overbeetling
+overbelief
+overbend
+overbepatched
+overberg
+overbet
+overbias
+overbid
+overbig
+overbigness
+overbillow
+overbit
+overbite
+overbitten
+overbitter
+overbitterly
+overbitterness
+overblack
+overblame
+overblaze
+overbleach
+overblessed
+overblessedness
+overblind
+overblindly
+overblithe
+overbloom
+overblouse
+overblow
+overblowing
+overblown
+overboard
+overboast
+overboastful
+overbodice
+overboding
+overbody
+overboil
+overbold
+overboldly
+overboldness
+overbook
+overbookish
+overbooming
+overborne
+overborrow
+overbought
+overbound
+overbounteous
+overbounteously
+overbounteousness
+overbow
+overbowed
+overbowl
+overbrace
+overbragging
+overbrained
+overbranch
+overbrave
+overbravely
+overbravery
+overbray
+overbreak
+overbreathe
+overbred
+overbreed
+overbribe
+overbridge
+overbright
+overbrightly
+overbrightness
+overbrilliancy
+overbrilliant
+overbrilliantly
+overbrim
+overbrimmingly
+overbroaden
+overbroil
+overbrood
+overbrow
+overbrown
+overbrowse
+overbrush
+overbrutal
+overbrutality
+overbrutalize
+overbrutally
+overbubbling
+overbuild
+overbuilt
+overbulk
+overbulky
+overbumptious
+overburden
+overburdeningly
+overburdensome
+overburn
+overburned
+overburningly
+overburnt
+overburst
+overburthen
+overbusily
+overbusiness
+overbusy
+overbuy
+overby
+overcall
+overcanny
+overcanopy
+overcap
+overcapable
+overcapably
+overcapacity
+overcape
+overcapitalization
+overcapitalize
+overcaptious
+overcaptiously
+overcaptiousness
+overcard
+overcare
+overcareful
+overcarefully
+overcareless
+overcarelessly
+overcarelessness
+overcaring
+overcarking
+overcarry
+overcast
+overcasting
+overcasual
+overcasually
+overcatch
+overcaution
+overcautious
+overcautiously
+overcautiousness
+overcentralization
+overcentralize
+overcertification
+overcertify
+overchafe
+overchannel
+overchant
+overcharge
+overchargement
+overcharger
+overcharitable
+overcharitably
+overcharity
+overchase
+overcheap
+overcheaply
+overcheapness
+overcheck
+overcherish
+overchidden
+overchief
+overchildish
+overchildishness
+overchill
+overchlorinate
+overchoke
+overchrome
+overchurch
+overcirculate
+overcircumspect
+overcircumspection
+overcivil
+overcivility
+overcivilization
+overcivilize
+overclaim
+overclamor
+overclasp
+overclean
+overcleanly
+overcleanness
+overcleave
+overclever
+overcleverness
+overclimb
+overcloak
+overclog
+overclose
+overclosely
+overcloseness
+overclothe
+overclothes
+overcloud
+overcloy
+overcluster
+overcoached
+overcoat
+overcoated
+overcoating
+overcoil
+overcold
+overcoldly
+overcollar
+overcolor
+overcomable
+overcome
+overcomer
+overcomingly
+overcommand
+overcommend
+overcommon
+overcommonly
+overcommonness
+overcompensate
+overcompensation
+overcompensatory
+overcompetition
+overcompetitive
+overcomplacency
+overcomplacent
+overcomplacently
+overcomplete
+overcomplex
+overcomplexity
+overcompliant
+overcompound
+overconcentrate
+overconcentration
+overconcern
+overconcerned
+overcondensation
+overcondense
+overconfidence
+overconfident
+overconfidently
+overconfute
+overconquer
+overconscientious
+overconscious
+overconsciously
+overconsciousness
+overconservatism
+overconservative
+overconservatively
+overconsiderate
+overconsiderately
+overconsideration
+overconsume
+overconsumption
+overcontented
+overcontentedly
+overcontentment
+overcontract
+overcontraction
+overcontribute
+overcontribution
+overcook
+overcool
+overcoolly
+overcopious
+overcopiously
+overcopiousness
+overcorned
+overcorrect
+overcorrection
+overcorrupt
+overcorruption
+overcorruptly
+overcostly
+overcount
+overcourteous
+overcourtesy
+overcover
+overcovetous
+overcovetousness
+overcow
+overcoy
+overcoyness
+overcram
+overcredit
+overcredulity
+overcredulous
+overcredulously
+overcreed
+overcreep
+overcritical
+overcritically
+overcriticalness
+overcriticism
+overcriticize
+overcrop
+overcross
+overcrow
+overcrowd
+overcrowded
+overcrowdedly
+overcrowdedness
+overcrown
+overcrust
+overcry
+overcull
+overcultivate
+overcultivation
+overculture
+overcultured
+overcumber
+overcunning
+overcunningly
+overcunningness
+overcup
+overcured
+overcurious
+overcuriously
+overcuriousness
+overcurl
+overcurrency
+overcurrent
+overcurtain
+overcustom
+overcut
+overcutter
+overcutting
+overdaintily
+overdaintiness
+overdainty
+overdamn
+overdance
+overdangle
+overdare
+overdaringly
+overdarken
+overdash
+overdazed
+overdazzle
+overdeal
+overdear
+overdearly
+overdearness
+overdeck
+overdecorate
+overdecoration
+overdecorative
+overdeeming
+overdeep
+overdeepen
+overdeeply
+overdeliberate
+overdeliberation
+overdelicacy
+overdelicate
+overdelicately
+overdelicious
+overdeliciously
+overdelighted
+overdelightedly
+overdemand
+overdemocracy
+overdepress
+overdepressive
+overdescant
+overdesire
+overdesirous
+overdesirousness
+overdestructive
+overdestructively
+overdestructiveness
+overdetermination
+overdetermined
+overdevelop
+overdevelopment
+overdevoted
+overdevotedly
+overdevotion
+overdiffuse
+overdiffusely
+overdiffuseness
+overdigest
+overdignified
+overdignifiedly
+overdignifiedness
+overdignify
+overdignity
+overdiligence
+overdiligent
+overdiligently
+overdilute
+overdilution
+overdischarge
+overdiscipline
+overdiscount
+overdiscourage
+overdiscouragement
+overdistance
+overdistant
+overdistantly
+overdistantness
+overdistempered
+overdistention
+overdiverse
+overdiversely
+overdiversification
+overdiversify
+overdiversity
+overdo
+overdoctrinize
+overdoer
+overdogmatic
+overdogmatically
+overdogmatism
+overdome
+overdominate
+overdone
+overdoor
+overdosage
+overdose
+overdoubt
+overdoze
+overdraft
+overdrain
+overdrainage
+overdramatic
+overdramatically
+overdrape
+overdrapery
+overdraw
+overdrawer
+overdream
+overdrench
+overdress
+overdrifted
+overdrink
+overdrip
+overdrive
+overdriven
+overdroop
+overdrowsed
+overdry
+overdubbed
+overdue
+overdunged
+overdure
+overdust
+overdye
+overeager
+overeagerly
+overeagerness
+overearnest
+overearnestly
+overearnestness
+overeasily
+overeasiness
+overeasy
+overeat
+overeaten
+overedge
+overedit
+overeducate
+overeducated
+overeducation
+overeducative
+overeffort
+overegg
+overelaborate
+overelaborately
+overelaboration
+overelate
+overelegance
+overelegancy
+overelegant
+overelegantly
+overelliptical
+overembellish
+overembellishment
+overembroider
+overemotional
+overemotionality
+overemotionalize
+overemphasis
+overemphasize
+overemphatic
+overemphatically
+overemphaticness
+overempired
+overemptiness
+overempty
+overenter
+overenthusiasm
+overenthusiastic
+overentreat
+overentry
+overequal
+overestimate
+overestimation
+overexcelling
+overexcitability
+overexcitable
+overexcitably
+overexcite
+overexcitement
+overexercise
+overexert
+overexerted
+overexertedly
+overexertedness
+overexertion
+overexpand
+overexpansion
+overexpansive
+overexpect
+overexpectant
+overexpectantly
+overexpenditure
+overexpert
+overexplain
+overexplanation
+overexpose
+overexposure
+overexpress
+overexquisite
+overexquisitely
+overextend
+overextension
+overextensive
+overextreme
+overexuberant
+overeye
+overeyebrowed
+overface
+overfacile
+overfacilely
+overfacility
+overfactious
+overfactiousness
+overfag
+overfagged
+overfaint
+overfaith
+overfaithful
+overfaithfully
+overfall
+overfamed
+overfamiliar
+overfamiliarity
+overfamiliarly
+overfamous
+overfanciful
+overfancy
+overfar
+overfast
+overfastidious
+overfastidiously
+overfastidiousness
+overfasting
+overfat
+overfatigue
+overfatten
+overfavor
+overfavorable
+overfavorably
+overfear
+overfearful
+overfearfully
+overfearfulness
+overfeast
+overfeatured
+overfed
+overfee
+overfeed
+overfeel
+overfellowlike
+overfellowly
+overfelon
+overfeminine
+overfeminize
+overfertile
+overfertility
+overfestoon
+overfew
+overfierce
+overfierceness
+overfile
+overfill
+overfilm
+overfine
+overfinished
+overfish
+overfit
+overfix
+overflatten
+overfleece
+overfleshed
+overflexion
+overfling
+overfloat
+overflog
+overflood
+overflorid
+overfloridness
+overflourish
+overflow
+overflowable
+overflower
+overflowing
+overflowingly
+overflowingness
+overflown
+overfluency
+overfluent
+overfluently
+overflush
+overflutter
+overfly
+overfold
+overfond
+overfondle
+overfondly
+overfondness
+overfoolish
+overfoolishly
+overfoolishness
+overfoot
+overforce
+overforged
+overformed
+overforward
+overforwardly
+overforwardness
+overfought
+overfoul
+overfoully
+overfrail
+overfrailty
+overfranchised
+overfrank
+overfrankly
+overfrankness
+overfraught
+overfree
+overfreedom
+overfreely
+overfreight
+overfrequency
+overfrequent
+overfrequently
+overfret
+overfrieze
+overfrighted
+overfrighten
+overfroth
+overfrown
+overfrozen
+overfruited
+overfruitful
+overfull
+overfullness
+overfunctioning
+overfurnish
+overgaiter
+overgalled
+overgamble
+overgang
+overgarment
+overgarrison
+overgaze
+overgeneral
+overgeneralize
+overgenerally
+overgenerosity
+overgenerous
+overgenerously
+overgenial
+overgeniality
+overgentle
+overgently
+overget
+overgifted
+overgild
+overgilted
+overgird
+overgirded
+overgirdle
+overglad
+overgladly
+overglance
+overglass
+overglaze
+overglide
+overglint
+overgloom
+overgloominess
+overgloomy
+overglorious
+overgloss
+overglut
+overgo
+overgoad
+overgod
+overgodliness
+overgodly
+overgood
+overgorge
+overgovern
+overgovernment
+overgown
+overgrace
+overgracious
+overgrade
+overgrain
+overgrainer
+overgrasping
+overgrateful
+overgratefully
+overgratification
+overgratify
+overgratitude
+overgraze
+overgreasiness
+overgreasy
+overgreat
+overgreatly
+overgreatness
+overgreed
+overgreedily
+overgreediness
+overgreedy
+overgrieve
+overgrievous
+overgrind
+overgross
+overgrossly
+overgrossness
+overground
+overgrow
+overgrown
+overgrowth
+overguilty
+overgun
+overhair
+overhalf
+overhand
+overhanded
+overhandicap
+overhandle
+overhang
+overhappy
+overharass
+overhard
+overharden
+overhardness
+overhardy
+overharsh
+overharshly
+overharshness
+overhaste
+overhasten
+overhastily
+overhastiness
+overhasty
+overhate
+overhatted
+overhaughty
+overhaul
+overhauler
+overhead
+overheadiness
+overheadman
+overheady
+overheap
+overhear
+overhearer
+overheartily
+overhearty
+overheat
+overheatedly
+overheave
+overheaviness
+overheavy
+overheight
+overheighten
+overheinous
+overheld
+overhelp
+overhelpful
+overhigh
+overhighly
+overhill
+overhit
+overholiness
+overhollow
+overholy
+overhomeliness
+overhomely
+overhonest
+overhonestly
+overhonesty
+overhonor
+overhorse
+overhot
+overhotly
+overhour
+overhouse
+overhover
+overhuge
+overhuman
+overhumanity
+overhumanize
+overhung
+overhunt
+overhurl
+overhurriedly
+overhurry
+overhusk
+overhysterical
+overidealism
+overidealistic
+overidle
+overidly
+overillustrate
+overillustration
+overimaginative
+overimaginativeness
+overimitate
+overimitation
+overimitative
+overimitatively
+overimport
+overimportation
+overimpress
+overimpressible
+overinclinable
+overinclination
+overinclined
+overincrust
+overincurious
+overindividualism
+overindividualistic
+overindulge
+overindulgence
+overindulgent
+overindulgently
+overindustrialization
+overindustrialize
+overinflate
+overinflation
+overinflative
+overinfluence
+overinfluential
+overinform
+overink
+overinsist
+overinsistence
+overinsistent
+overinsistently
+overinsolence
+overinsolent
+overinsolently
+overinstruct
+overinstruction
+overinsurance
+overinsure
+overintellectual
+overintellectuality
+overintense
+overintensely
+overintensification
+overintensity
+overinterest
+overinterested
+overinterestedness
+overinventoried
+overinvest
+overinvestment
+overiodize
+overirrigate
+overirrigation
+overissue
+overitching
+overjacket
+overjade
+overjaded
+overjawed
+overjealous
+overjealously
+overjealousness
+overjob
+overjocular
+overjoy
+overjoyful
+overjoyfully
+overjoyous
+overjudge
+overjudging
+overjudgment
+overjudicious
+overjump
+overjust
+overjutting
+overkeen
+overkeenness
+overkeep
+overkick
+overkind
+overkindly
+overkindness
+overking
+overknavery
+overknee
+overknow
+overknowing
+overlabor
+overlace
+overlactation
+overlade
+overlaid
+overlain
+overland
+Overlander
+overlander
+overlanguaged
+overlap
+overlard
+overlarge
+overlargely
+overlargeness
+overlascivious
+overlast
+overlate
+overlaudation
+overlaudatory
+overlaugh
+overlaunch
+overlave
+overlavish
+overlavishly
+overlax
+overlaxative
+overlaxly
+overlaxness
+overlay
+overlayer
+overlead
+overleaf
+overlean
+overleap
+overlearn
+overlearned
+overlearnedly
+overlearnedness
+overleather
+overleave
+overleaven
+overleer
+overleg
+overlegislation
+overleisured
+overlength
+overlettered
+overlewd
+overlewdly
+overlewdness
+overliberal
+overliberality
+overliberally
+overlicentious
+overlick
+overlie
+overlier
+overlift
+overlight
+overlighted
+overlightheaded
+overlightly
+overlightsome
+overliking
+overline
+overling
+overlinger
+overlinked
+overlip
+overlipping
+overlisted
+overlisten
+overliterary
+overlittle
+overlive
+overliveliness
+overlively
+overliver
+overload
+overloath
+overlock
+overlocker
+overlofty
+overlogical
+overlogically
+overlong
+overlook
+overlooker
+overloose
+overlord
+overlordship
+overloud
+overloup
+overlove
+overlover
+overlow
+overlowness
+overloyal
+overloyally
+overloyalty
+overlubricatio
+overluscious
+overlush
+overlustiness
+overlusty
+overluxuriance
+overluxuriant
+overluxurious
+overly
+overlying
+overmagnify
+overmagnitude
+overmajority
+overmalapert
+overman
+overmantel
+overmantle
+overmany
+overmarch
+overmark
+overmarking
+overmarl
+overmask
+overmast
+overmaster
+overmasterful
+overmasterfully
+overmasterfulness
+overmastering
+overmasteringly
+overmatch
+overmatter
+overmature
+overmaturity
+overmean
+overmeanly
+overmeanness
+overmeasure
+overmeddle
+overmeek
+overmeekly
+overmeekness
+overmellow
+overmellowness
+overmelodied
+overmelt
+overmerciful
+overmercifulness
+overmerit
+overmerrily
+overmerry
+overmettled
+overmickle
+overmighty
+overmild
+overmill
+overminute
+overminutely
+overminuteness
+overmix
+overmoccasin
+overmodest
+overmodestly
+overmodesty
+overmodulation
+overmoist
+overmoisten
+overmoisture
+overmortgage
+overmoss
+overmost
+overmotor
+overmount
+overmounts
+overmourn
+overmournful
+overmournfully
+overmuch
+overmuchness
+overmultiplication
+overmultiply
+overmultitude
+overname
+overnarrow
+overnarrowly
+overnationalization
+overnear
+overneat
+overneatness
+overneglect
+overnegligence
+overnegligent
+overnervous
+overnervously
+overnervousness
+overnet
+overnew
+overnice
+overnicely
+overniceness
+overnicety
+overnigh
+overnight
+overnimble
+overnipping
+overnoise
+overnotable
+overnourish
+overnoveled
+overnumber
+overnumerous
+overnumerousness
+overnurse
+overobedience
+overobedient
+overobediently
+overobese
+overobjectify
+overoblige
+overobsequious
+overobsequiously
+overobsequiousness
+overoffend
+overoffensive
+overofficered
+overofficious
+overorder
+overornamented
+overpained
+overpainful
+overpainfully
+overpainfulness
+overpaint
+overpamper
+overpart
+overparted
+overpartial
+overpartiality
+overpartially
+overparticular
+overparticularly
+overpass
+overpassionate
+overpassionately
+overpassionateness
+overpast
+overpatient
+overpatriotic
+overpay
+overpayment
+overpeer
+overpending
+overpensive
+overpensiveness
+overpeople
+overpepper
+overperemptory
+overpersuade
+overpersuasion
+overpert
+overpessimism
+overpessimistic
+overpet
+overphysic
+overpick
+overpicture
+overpinching
+overpitch
+overpitched
+overpiteous
+overplace
+overplaced
+overplacement
+overplain
+overplant
+overplausible
+overplay
+overplease
+overplenitude
+overplenteous
+overplenteously
+overplentiful
+overplenty
+overplot
+overplow
+overplumb
+overplume
+overplump
+overplumpness
+overplus
+overply
+overpointed
+overpoise
+overpole
+overpolemical
+overpolish
+overpolitic
+overponderous
+overpopular
+overpopularity
+overpopularly
+overpopulate
+overpopulation
+overpopulous
+overpopulousness
+overpositive
+overpossess
+overpot
+overpotent
+overpotential
+overpour
+overpower
+overpowerful
+overpowering
+overpoweringly
+overpoweringness
+overpraise
+overpray
+overpreach
+overprecise
+overpreciseness
+overpreface
+overpregnant
+overpreoccupation
+overpreoccupy
+overpress
+overpressure
+overpresumption
+overpresumptuous
+overprice
+overprick
+overprint
+overprize
+overprizer
+overprocrastination
+overproduce
+overproduction
+overproductive
+overproficient
+overprolific
+overprolix
+overprominence
+overprominent
+overprominently
+overpromise
+overprompt
+overpromptly
+overpromptness
+overprone
+overproneness
+overpronounced
+overproof
+overproportion
+overproportionate
+overproportionated
+overproportionately
+overproportioned
+overprosperity
+overprosperous
+overprotect
+overprotract
+overprotraction
+overproud
+overproudly
+overprove
+overprovender
+overprovide
+overprovident
+overprovidently
+overprovision
+overprovocation
+overprovoke
+overprune
+overpublic
+overpublicity
+overpuff
+overpuissant
+overpunish
+overpunishment
+overpurchase
+overquantity
+overquarter
+overquell
+overquick
+overquickly
+overquiet
+overquietly
+overquietness
+overrace
+overrack
+overrake
+overrange
+overrank
+overrankness
+overrapture
+overrapturize
+overrash
+overrashly
+overrashness
+overrate
+overrational
+overrationalize
+overravish
+overreach
+overreacher
+overreaching
+overreachingly
+overreachingness
+overread
+overreader
+overreadily
+overreadiness
+overready
+overrealism
+overrealistic
+overreckon
+overrecord
+overrefine
+overrefined
+overrefinement
+overreflection
+overreflective
+overregister
+overregistration
+overregular
+overregularity
+overregularly
+overregulate
+overregulation
+overrelax
+overreliance
+overreliant
+overreligion
+overreligious
+overremiss
+overremissly
+overremissness
+overrennet
+overrent
+overreplete
+overrepletion
+overrepresent
+overrepresentation
+overrepresentative
+overreserved
+overresolute
+overresolutely
+overrestore
+overrestrain
+overretention
+overreward
+overrich
+overriches
+overrichness
+override
+overrife
+overrigged
+overright
+overrighteous
+overrighteously
+overrighteousness
+overrigid
+overrigidity
+overrigidly
+overrigorous
+overrigorously
+overrim
+overriot
+overripe
+overripely
+overripen
+overripeness
+overrise
+overroast
+overroll
+overroof
+overrooted
+overrough
+overroughly
+overroughness
+overroyal
+overrude
+overrudely
+overrudeness
+overruff
+overrule
+overruler
+overruling
+overrulingly
+overrun
+overrunner
+overrunning
+overrunningly
+overrush
+overrusset
+overrust
+oversad
+oversadly
+oversadness
+oversaid
+oversail
+oversale
+oversaliva
+oversalt
+oversalty
+oversand
+oversanded
+oversanguine
+oversanguinely
+oversapless
+oversated
+oversatisfy
+oversaturate
+oversaturation
+oversauce
+oversauciness
+oversaucy
+oversave
+overscare
+overscatter
+overscented
+oversceptical
+overscepticism
+overscore
+overscour
+overscratch
+overscrawl
+overscream
+overscribble
+overscrub
+overscruple
+overscrupulosity
+overscrupulous
+overscrupulously
+overscrupulousness
+overscurf
+overscutched
+oversea
+overseal
+overseam
+overseamer
+oversearch
+overseas
+overseason
+overseasoned
+overseated
+oversecure
+oversecurely
+oversecurity
+oversee
+overseed
+overseen
+overseer
+overseerism
+overseership
+overseethe
+oversell
+oversend
+oversensible
+oversensibly
+oversensitive
+oversensitively
+oversensitiveness
+oversententious
+oversentimental
+oversentimentalism
+oversentimentalize
+oversentimentally
+overserious
+overseriously
+overseriousness
+overservice
+overservile
+overservility
+overset
+oversetter
+oversettle
+oversettled
+oversevere
+overseverely
+overseverity
+oversew
+overshade
+overshadow
+overshadower
+overshadowing
+overshadowingly
+overshadowment
+overshake
+oversharp
+oversharpness
+overshave
+oversheet
+overshelving
+overshepherd
+overshine
+overshirt
+overshoe
+overshoot
+overshort
+overshorten
+overshortly
+overshot
+overshoulder
+overshowered
+overshrink
+overshroud
+oversick
+overside
+oversight
+oversilence
+oversilent
+oversilver
+oversimple
+oversimplicity
+oversimplification
+oversimplify
+oversimply
+oversize
+oversized
+overskim
+overskip
+overskipper
+overskirt
+overslack
+overslander
+overslaugh
+overslavish
+overslavishly
+oversleep
+oversleeve
+overslide
+overslight
+overslip
+overslope
+overslow
+overslowly
+overslowness
+overslur
+oversmall
+oversman
+oversmite
+oversmitten
+oversmoke
+oversmooth
+oversmoothly
+oversmoothness
+oversnow
+oversoak
+oversoar
+oversock
+oversoft
+oversoftly
+oversoftness
+oversold
+oversolemn
+oversolemnity
+oversolemnly
+oversolicitous
+oversolicitously
+oversolicitousness
+oversoon
+oversoothing
+oversophisticated
+oversophistication
+oversorrow
+oversorrowed
+oversot
+oversoul
+oversound
+oversour
+oversourly
+oversourness
+oversow
+overspacious
+overspaciousness
+overspan
+overspangled
+oversparing
+oversparingly
+oversparingness
+oversparred
+overspatter
+overspeak
+overspecialization
+overspecialize
+overspeculate
+overspeculation
+overspeculative
+overspeech
+overspeed
+overspeedily
+overspeedy
+overspend
+overspill
+overspin
+oversplash
+overspread
+overspring
+oversprinkle
+oversprung
+overspun
+oversqueak
+oversqueamish
+oversqueamishness
+overstaff
+overstaid
+overstain
+overstale
+overstalled
+overstand
+overstaring
+overstate
+overstately
+overstatement
+overstay
+overstayal
+oversteadfast
+oversteadfastness
+oversteady
+overstep
+overstiff
+overstiffness
+overstifle
+overstimulate
+overstimulation
+overstimulative
+overstir
+overstitch
+overstock
+overstoop
+overstoping
+overstore
+overstory
+overstout
+overstoutly
+overstowage
+overstowed
+overstrain
+overstrait
+overstraiten
+overstraitly
+overstraitness
+overstream
+overstrength
+overstress
+overstretch
+overstrew
+overstrict
+overstrictly
+overstrictness
+overstride
+overstrident
+overstridently
+overstrike
+overstring
+overstriving
+overstrong
+overstrongly
+overstrung
+overstud
+overstudied
+overstudious
+overstudiously
+overstudiousness
+overstudy
+overstuff
+oversublime
+oversubscribe
+oversubscriber
+oversubscription
+oversubtile
+oversubtle
+oversubtlety
+oversubtly
+oversufficiency
+oversufficient
+oversufficiently
+oversuperstitious
+oversupply
+oversure
+oversurety
+oversurge
+oversurviving
+oversusceptibility
+oversusceptible
+oversuspicious
+oversuspiciously
+overswarm
+overswarth
+oversway
+oversweated
+oversweep
+oversweet
+oversweeten
+oversweetly
+oversweetness
+overswell
+overswift
+overswim
+overswimmer
+overswing
+overswinging
+overswirling
+oversystematic
+oversystematically
+oversystematize
+overt
+overtakable
+overtake
+overtaker
+overtalk
+overtalkative
+overtalkativeness
+overtalker
+overtame
+overtamely
+overtameness
+overtapped
+overtare
+overtariff
+overtarry
+overtart
+overtask
+overtax
+overtaxation
+overteach
+overtechnical
+overtechnicality
+overtedious
+overtediously
+overteem
+overtell
+overtempt
+overtenacious
+overtender
+overtenderly
+overtenderness
+overtense
+overtensely
+overtenseness
+overtension
+overterrible
+overtest
+overthick
+overthin
+overthink
+overthought
+overthoughtful
+overthriftily
+overthriftiness
+overthrifty
+overthrong
+overthrow
+overthrowable
+overthrowal
+overthrower
+overthrust
+overthwart
+overthwartly
+overthwartness
+overthwartways
+overthwartwise
+overtide
+overtight
+overtightly
+overtill
+overtimbered
+overtime
+overtimer
+overtimorous
+overtimorously
+overtimorousness
+overtinseled
+overtint
+overtip
+overtipple
+overtire
+overtiredness
+overtitle
+overtly
+overtness
+overtoe
+overtoil
+overtoise
+overtone
+overtongued
+overtop
+overtopple
+overtorture
+overtower
+overtrace
+overtrack
+overtrade
+overtrader
+overtrailed
+overtrain
+overtrample
+overtravel
+overtread
+overtreatment
+overtrick
+overtrim
+overtrouble
+overtrue
+overtrump
+overtrust
+overtrustful
+overtruthful
+overtruthfully
+overtumble
+overture
+overturn
+overturnable
+overturner
+overtutor
+overtwine
+overtwist
+overtype
+overuberous
+overunionized
+overunsuitable
+overurbanization
+overurge
+overuse
+overusual
+overusually
+overvaliant
+overvaluable
+overvaluation
+overvalue
+overvariety
+overvault
+overvehemence
+overvehement
+overveil
+overventilate
+overventilation
+overventuresome
+overventurous
+overview
+overvoltage
+overvote
+overwade
+overwages
+overwake
+overwalk
+overwander
+overward
+overwash
+overwasted
+overwatch
+overwatcher
+overwater
+overwave
+overway
+overwealth
+overwealthy
+overweaponed
+overwear
+overweary
+overweather
+overweave
+overweb
+overween
+overweener
+overweening
+overweeningly
+overweeningness
+overweep
+overweigh
+overweight
+overweightage
+overwell
+overwelt
+overwet
+overwetness
+overwheel
+overwhelm
+overwhelmer
+overwhelming
+overwhelmingly
+overwhelmingness
+overwhipped
+overwhirl
+overwhisper
+overwide
+overwild
+overwilily
+overwilling
+overwillingly
+overwily
+overwin
+overwind
+overwing
+overwinter
+overwiped
+overwisdom
+overwise
+overwisely
+overwithered
+overwoman
+overwomanize
+overwomanly
+overwood
+overwooded
+overwoody
+overword
+overwork
+overworld
+overworn
+overworry
+overworship
+overwound
+overwove
+overwoven
+overwrap
+overwrest
+overwrested
+overwrestle
+overwrite
+overwroth
+overwrought
+overyear
+overyoung
+overyouthful
+overzeal
+overzealous
+overzealously
+overzealousness
+ovest
+ovey
+Ovibos
+Ovibovinae
+ovibovine
+ovicapsular
+ovicapsule
+ovicell
+ovicellular
+ovicidal
+ovicide
+ovicular
+oviculated
+oviculum
+ovicyst
+ovicystic
+Ovidae
+Ovidian
+oviducal
+oviduct
+oviductal
+oviferous
+ovification
+oviform
+ovigenesis
+ovigenetic
+ovigenic
+ovigenous
+ovigerm
+ovigerous
+ovile
+Ovillus
+Ovinae
+ovine
+ovinia
+ovipara
+oviparal
+oviparity
+oviparous
+oviparously
+oviparousness
+oviposit
+oviposition
+ovipositor
+Ovis
+ovisac
+oviscapt
+ovism
+ovispermary
+ovispermiduct
+ovist
+ovistic
+ovivorous
+ovocyte
+ovoelliptic
+ovoflavin
+ovogenesis
+ovogenetic
+ovogenous
+ovogonium
+ovoid
+ovoidal
+ovolemma
+ovolo
+ovological
+ovologist
+ovology
+ovolytic
+ovomucoid
+ovoplasm
+ovoplasmic
+ovopyriform
+ovorhomboid
+ovorhomboidal
+ovotesticular
+ovotestis
+ovovitellin
+Ovovivipara
+ovoviviparism
+ovoviviparity
+ovoviviparous
+ovoviviparously
+ovoviviparousness
+Ovula
+ovular
+ovularian
+ovulary
+ovulate
+ovulation
+ovule
+ovuliferous
+ovuligerous
+ovulist
+ovum
+ow
+owd
+owe
+owelty
+Owen
+Owenia
+Owenian
+Owenism
+Owenist
+Owenite
+Owenize
+ower
+owerance
+owerby
+owercome
+owergang
+owerloup
+owertaen
+owerword
+owght
+owing
+owk
+owl
+owldom
+owler
+owlery
+owlet
+Owlglass
+owlhead
+owling
+owlish
+owlishly
+owlishness
+owlism
+owllight
+owllike
+Owlspiegle
+owly
+own
+owner
+ownerless
+ownership
+ownhood
+ownness
+ownself
+ownwayish
+owregane
+owrehip
+owrelay
+owse
+owsen
+owser
+owtchah
+owyheeite
+ox
+oxacid
+oxadiazole
+oxalacetic
+oxalaldehyde
+oxalamid
+oxalamide
+oxalan
+oxalate
+oxaldehyde
+oxalemia
+oxalic
+Oxalidaceae
+oxalidaceous
+Oxalis
+oxalite
+oxalodiacetic
+oxalonitril
+oxalonitrile
+oxaluramid
+oxaluramide
+oxalurate
+oxaluria
+oxaluric
+oxalyl
+oxalylurea
+oxamate
+oxamethane
+oxamic
+oxamid
+oxamide
+oxamidine
+oxammite
+oxan
+oxanate
+oxane
+oxanic
+oxanilate
+oxanilic
+oxanilide
+oxazine
+oxazole
+oxbane
+oxberry
+oxbird
+oxbiter
+oxblood
+oxbow
+oxboy
+oxbrake
+oxcart
+oxcheek
+oxdiacetic
+oxdiazole
+oxea
+oxeate
+oxen
+oxeote
+oxer
+oxetone
+oxeye
+oxfly
+Oxford
+Oxfordian
+Oxfordism
+Oxfordist
+oxgang
+oxgoad
+oxharrow
+oxhead
+oxheal
+oxheart
+oxhide
+oxhoft
+oxhorn
+oxhouse
+oxhuvud
+oxidability
+oxidable
+oxidant
+oxidase
+oxidate
+oxidation
+oxidational
+oxidative
+oxidator
+oxide
+oxidic
+oxidimetric
+oxidimetry
+oxidizability
+oxidizable
+oxidization
+oxidize
+oxidizement
+oxidizer
+oxidizing
+oxidoreductase
+oxidoreduction
+oxidulated
+oximate
+oximation
+oxime
+oxland
+oxlike
+oxlip
+oxman
+oxmanship
+oxoindoline
+Oxonian
+oxonic
+oxonium
+Oxonolatry
+oxozone
+oxozonide
+oxpecker
+oxphony
+oxreim
+oxshoe
+oxskin
+oxtail
+oxter
+oxtongue
+oxwort
+oxy
+oxyacanthine
+oxyacanthous
+oxyacetylene
+oxyacid
+Oxyaena
+Oxyaenidae
+oxyaldehyde
+oxyamine
+oxyanthracene
+oxyanthraquinone
+oxyaphia
+oxyaster
+oxybaphon
+Oxybaphus
+oxybenzaldehyde
+oxybenzene
+oxybenzoic
+oxybenzyl
+oxyberberine
+oxyblepsia
+oxybromide
+oxybutyria
+oxybutyric
+oxycalcium
+oxycalorimeter
+oxycamphor
+oxycaproic
+oxycarbonate
+oxycellulose
+oxycephalic
+oxycephalism
+oxycephalous
+oxycephaly
+oxychlorate
+oxychloric
+oxychloride
+oxycholesterol
+oxychromatic
+oxychromatin
+oxychromatinic
+oxycinnamic
+oxycobaltammine
+Oxycoccus
+oxycopaivic
+oxycoumarin
+oxycrate
+oxycyanide
+oxydactyl
+Oxydendrum
+oxydiact
+oxyesthesia
+oxyether
+oxyethyl
+oxyfatty
+oxyfluoride
+oxygas
+oxygen
+oxygenant
+oxygenate
+oxygenation
+oxygenator
+oxygenerator
+oxygenic
+oxygenicity
+oxygenium
+oxygenizable
+oxygenize
+oxygenizement
+oxygenizer
+oxygenous
+oxygeusia
+oxygnathous
+oxyhalide
+oxyhaloid
+oxyhematin
+oxyhemocyanin
+oxyhemoglobin
+oxyhexactine
+oxyhexaster
+oxyhydrate
+oxyhydric
+oxyhydrogen
+oxyiodide
+oxyketone
+oxyl
+Oxylabracidae
+Oxylabrax
+oxyluciferin
+oxyluminescence
+oxyluminescent
+oxymandelic
+oxymel
+oxymethylene
+oxymoron
+oxymuriate
+oxymuriatic
+oxynaphthoic
+oxynaphtoquinone
+oxynarcotine
+oxyneurin
+oxyneurine
+oxynitrate
+oxyntic
+oxyophitic
+oxyopia
+Oxyopidae
+oxyosphresia
+oxypetalous
+oxyphenol
+oxyphenyl
+oxyphile
+oxyphilic
+oxyphilous
+oxyphonia
+oxyphosphate
+oxyphthalic
+oxyphyllous
+oxyphyte
+oxypicric
+Oxypolis
+oxyproline
+oxypropionic
+oxypurine
+oxypycnos
+oxyquinaseptol
+oxyquinoline
+oxyquinone
+oxyrhine
+oxyrhinous
+oxyrhynch
+oxyrhynchous
+oxyrhynchus
+Oxyrrhyncha
+oxyrrhynchid
+oxysalicylic
+oxysalt
+oxystearic
+Oxystomata
+oxystomatous
+oxystome
+oxysulphate
+oxysulphide
+oxyterpene
+oxytocia
+oxytocic
+oxytocin
+oxytocous
+oxytoluene
+oxytoluic
+oxytone
+oxytonesis
+oxytonical
+oxytonize
+Oxytricha
+Oxytropis
+oxytylotate
+oxytylote
+oxyuriasis
+oxyuricide
+Oxyuridae
+oxyurous
+oxywelding
+Oyana
+oyapock
+oyer
+oyster
+oysterage
+oysterbird
+oystered
+oysterer
+oysterfish
+oystergreen
+oysterhood
+oysterhouse
+oystering
+oysterish
+oysterishness
+oysterlike
+oysterling
+oysterman
+oysterous
+oysterroot
+oysterseed
+oystershell
+oysterwife
+oysterwoman
+Ozan
+Ozark
+ozarkite
+ozena
+Ozias
+ozobrome
+ozocerite
+ozokerit
+ozokerite
+ozonate
+ozonation
+ozonator
+ozone
+ozoned
+ozonic
+ozonide
+ozoniferous
+ozonification
+ozonify
+Ozonium
+ozonization
+ozonize
+ozonizer
+ozonometer
+ozonometry
+ozonoscope
+ozonoscopic
+ozonous
+ozophen
+ozophene
+ozostomia
+ozotype
+P
+p
+pa
+paal
+paar
+paauw
+Paba
+pabble
+Pablo
+pablo
+pabouch
+pabular
+pabulary
+pabulation
+pabulatory
+pabulous
+pabulum
+pac
+paca
+pacable
+Pacaguara
+pacate
+pacation
+pacative
+pacay
+pacaya
+Paccanarist
+Pacchionian
+Pace
+pace
+paceboard
+paced
+pacemaker
+pacemaking
+pacer
+pachak
+pachisi
+pachnolite
+pachometer
+Pachomian
+Pachons
+Pacht
+pachyacria
+pachyaemia
+pachyblepharon
+pachycarpous
+pachycephal
+pachycephalia
+pachycephalic
+pachycephalous
+pachycephaly
+pachychilia
+pachycholia
+pachychymia
+pachycladous
+pachydactyl
+pachydactylous
+pachydactyly
+pachyderm
+pachyderma
+pachydermal
+Pachydermata
+pachydermatocele
+pachydermatoid
+pachydermatosis
+pachydermatous
+pachydermatously
+pachydermia
+pachydermial
+pachydermic
+pachydermoid
+pachydermous
+pachyemia
+pachyglossal
+pachyglossate
+pachyglossia
+pachyglossous
+pachyhaemia
+pachyhaemic
+pachyhaemous
+pachyhematous
+pachyhemia
+pachyhymenia
+pachyhymenic
+Pachylophus
+pachylosis
+Pachyma
+pachymenia
+pachymenic
+pachymeningitic
+pachymeningitis
+pachymeninx
+pachymeter
+pachynathous
+pachynema
+pachynsis
+pachyntic
+pachyodont
+pachyotia
+pachyotous
+pachyperitonitis
+pachyphyllous
+pachypleuritic
+pachypod
+pachypodous
+pachypterous
+Pachyrhizus
+pachyrhynchous
+pachysalpingitis
+Pachysandra
+pachysaurian
+pachysomia
+pachysomous
+pachystichous
+Pachystima
+pachytene
+pachytrichous
+Pachytylus
+pachyvaginitis
+pacifiable
+pacific
+pacifical
+pacifically
+pacificate
+pacification
+pacificator
+pacificatory
+pacificism
+pacificist
+pacificity
+pacifier
+pacifism
+pacifist
+pacifistic
+pacifistically
+pacify
+pacifyingly
+Pacinian
+pack
+packable
+package
+packbuilder
+packcloth
+packer
+packery
+packet
+packhouse
+packless
+packly
+packmaker
+packmaking
+packman
+packmanship
+packness
+packsack
+packsaddle
+packstaff
+packthread
+packwall
+packwaller
+packware
+packway
+paco
+Pacolet
+pacouryuva
+pact
+paction
+pactional
+pactionally
+Pactolian
+Pactolus
+pad
+padcloth
+Padda
+padder
+padding
+paddle
+paddlecock
+paddled
+paddlefish
+paddlelike
+paddler
+paddlewood
+paddling
+paddock
+paddockride
+paddockstone
+paddockstool
+Paddy
+paddy
+paddybird
+Paddyism
+paddymelon
+Paddywack
+paddywatch
+Paddywhack
+paddywhack
+padella
+padfoot
+padge
+Padina
+padishah
+padle
+padlike
+padlock
+padmasana
+padmelon
+padnag
+padpiece
+Padraic
+Padraig
+padre
+padroadist
+padroado
+padronism
+padstone
+padtree
+Paduan
+Paduanism
+paduasoy
+Padus
+paean
+paeanism
+paeanize
+paedarchy
+paedatrophia
+paedatrophy
+paediatry
+paedogenesis
+paedogenetic
+paedometer
+paedometrical
+paedomorphic
+paedomorphism
+paedonymic
+paedonymy
+paedopsychologist
+paedotribe
+paedotrophic
+paedotrophist
+paedotrophy
+paegel
+paegle
+Paelignian
+paenula
+paeon
+Paeonia
+Paeoniaceae
+Paeonian
+paeonic
+paetrick
+paga
+pagan
+Paganalia
+Paganalian
+pagandom
+paganic
+paganical
+paganically
+paganish
+paganishly
+paganism
+paganist
+paganistic
+paganity
+paganization
+paganize
+paganizer
+paganly
+paganry
+pagatpat
+Page
+page
+pageant
+pageanted
+pageanteer
+pageantic
+pageantry
+pagedom
+pageful
+pagehood
+pageless
+pagelike
+pager
+pageship
+pagina
+paginal
+paginary
+paginate
+pagination
+pagiopod
+Pagiopoda
+pagoda
+pagodalike
+pagodite
+pagoscope
+pagrus
+Paguma
+pagurian
+pagurid
+Paguridae
+Paguridea
+pagurine
+Pagurinea
+paguroid
+Paguroidea
+Pagurus
+pagus
+pah
+paha
+Pahareen
+Pahari
+Paharia
+pahi
+Pahlavi
+pahlavi
+pahmi
+paho
+pahoehoe
+Pahouin
+pahutan
+Paiconeca
+paideutic
+paideutics
+paidological
+paidologist
+paidology
+paidonosology
+paigle
+paik
+pail
+pailful
+paillasse
+paillette
+pailletted
+pailou
+paimaneh
+pain
+pained
+painful
+painfully
+painfulness
+paining
+painingly
+painkiller
+painless
+painlessly
+painlessness
+painproof
+painstaker
+painstaking
+painstakingly
+painstakingness
+painsworthy
+paint
+paintability
+paintable
+paintableness
+paintably
+paintbox
+paintbrush
+painted
+paintedness
+painter
+painterish
+painterlike
+painterly
+paintership
+paintiness
+painting
+paintingness
+paintless
+paintpot
+paintproof
+paintress
+paintrix
+paintroot
+painty
+paip
+pair
+paired
+pairedness
+pairer
+pairment
+pairwise
+pais
+paisa
+paisanite
+Paisley
+Paiute
+paiwari
+pajahuello
+pajama
+pajamaed
+pajock
+Pajonism
+Pakawa
+Pakawan
+pakchoi
+pakeha
+Pakhpuluk
+Pakhtun
+Pakistani
+paktong
+pal
+Pala
+palace
+palaced
+palacelike
+palaceous
+palaceward
+palacewards
+paladin
+palaeanthropic
+Palaearctic
+Palaeechini
+palaeechinoid
+Palaeechinoidea
+palaeechinoidean
+palaeentomology
+palaeethnologic
+palaeethnological
+palaeethnologist
+palaeethnology
+Palaeeudyptes
+Palaeic
+palaeichthyan
+Palaeichthyes
+palaeichthyic
+Palaemon
+palaemonid
+Palaemonidae
+palaemonoid
+palaeoalchemical
+palaeoanthropic
+palaeoanthropography
+palaeoanthropology
+Palaeoanthropus
+palaeoatavism
+palaeoatavistic
+palaeobiogeography
+palaeobiologist
+palaeobiology
+palaeobotanic
+palaeobotanical
+palaeobotanically
+palaeobotanist
+palaeobotany
+Palaeocarida
+palaeoceanography
+Palaeocene
+palaeochorology
+palaeoclimatic
+palaeoclimatology
+Palaeoconcha
+palaeocosmic
+palaeocosmology
+Palaeocrinoidea
+palaeocrystal
+palaeocrystallic
+palaeocrystalline
+palaeocrystic
+palaeocyclic
+palaeodendrologic
+palaeodendrological
+palaeodendrologically
+palaeodendrologist
+palaeodendrology
+Palaeodictyoptera
+palaeodictyopteran
+palaeodictyopteron
+palaeodictyopterous
+palaeoencephalon
+palaeoeremology
+palaeoethnic
+palaeoethnologic
+palaeoethnological
+palaeoethnologist
+palaeoethnology
+palaeofauna
+Palaeogaea
+Palaeogaean
+palaeogene
+palaeogenesis
+palaeogenetic
+palaeogeographic
+palaeogeography
+palaeoglaciology
+palaeoglyph
+Palaeognathae
+palaeognathic
+palaeognathous
+palaeograph
+palaeographer
+palaeographic
+palaeographical
+palaeographically
+palaeographist
+palaeography
+palaeoherpetologist
+palaeoherpetology
+palaeohistology
+palaeohydrography
+palaeolatry
+palaeolimnology
+palaeolith
+palaeolithic
+palaeolithical
+palaeolithist
+palaeolithoid
+palaeolithy
+palaeological
+palaeologist
+palaeology
+Palaeomastodon
+palaeometallic
+palaeometeorological
+palaeometeorology
+Palaeonemertea
+palaeonemertean
+palaeonemertine
+Palaeonemertinea
+Palaeonemertini
+palaeoniscid
+Palaeoniscidae
+palaeoniscoid
+Palaeoniscum
+Palaeoniscus
+palaeontographic
+palaeontographical
+palaeontography
+palaeopathology
+palaeopedology
+palaeophile
+palaeophilist
+Palaeophis
+palaeophysiography
+palaeophysiology
+palaeophytic
+palaeophytological
+palaeophytologist
+palaeophytology
+palaeoplain
+palaeopotamology
+palaeopsychic
+palaeopsychological
+palaeopsychology
+palaeoptychology
+Palaeornis
+Palaeornithinae
+palaeornithine
+palaeornithological
+palaeornithology
+palaeosaur
+Palaeosaurus
+palaeosophy
+Palaeospondylus
+Palaeostraca
+palaeostracan
+palaeostriatal
+palaeostriatum
+palaeostylic
+palaeostyly
+palaeotechnic
+palaeothalamus
+Palaeothentes
+Palaeothentidae
+palaeothere
+palaeotherian
+Palaeotheriidae
+palaeotheriodont
+palaeotherioid
+Palaeotherium
+palaeotheroid
+Palaeotropical
+palaeotype
+palaeotypic
+palaeotypical
+palaeotypically
+palaeotypographical
+palaeotypographist
+palaeotypography
+palaeovolcanic
+Palaeozoic
+palaeozoological
+palaeozoologist
+palaeozoology
+palaestra
+palaestral
+palaestrian
+palaestric
+palaestrics
+palaetiological
+palaetiologist
+palaetiology
+palafitte
+palagonite
+palagonitic
+Palaic
+Palaihnihan
+palaiotype
+palaite
+palama
+palamate
+palame
+Palamedea
+palamedean
+Palamedeidae
+Palamite
+Palamitism
+palampore
+palander
+palanka
+palankeen
+palanquin
+palapalai
+Palapteryx
+Palaquium
+palar
+palas
+palatability
+palatable
+palatableness
+palatably
+palatal
+palatalism
+palatality
+palatalization
+palatalize
+palate
+palated
+palateful
+palatefulness
+palateless
+palatelike
+palatial
+palatially
+palatialness
+palatian
+palatic
+palatinal
+palatinate
+palatine
+palatineship
+Palatinian
+palatinite
+palation
+palatist
+palatitis
+palative
+palatization
+palatize
+palatoalveolar
+palatodental
+palatoglossal
+palatoglossus
+palatognathous
+palatogram
+palatograph
+palatography
+palatomaxillary
+palatometer
+palatonasal
+palatopharyngeal
+palatopharyngeus
+palatoplasty
+palatoplegia
+palatopterygoid
+palatoquadrate
+palatorrhaphy
+palatoschisis
+Palatua
+Palau
+Palaung
+palaver
+palaverer
+palaverist
+palaverment
+palaverous
+palay
+palazzi
+palberry
+palch
+pale
+palea
+paleaceous
+paleanthropic
+Palearctic
+paleate
+palebelly
+palebuck
+palechinoid
+paled
+paledness
+paleencephalon
+paleentomology
+paleethnographer
+paleethnologic
+paleethnological
+paleethnologist
+paleethnology
+paleface
+palehearted
+paleichthyologic
+paleichthyologist
+paleichthyology
+paleiform
+palely
+Paleman
+paleness
+Palenque
+paleoalchemical
+paleoandesite
+paleoanthropic
+paleoanthropography
+paleoanthropological
+paleoanthropologist
+paleoanthropology
+Paleoanthropus
+paleoatavism
+paleoatavistic
+paleobiogeography
+paleobiologist
+paleobiology
+paleobotanic
+paleobotanical
+paleobotanically
+paleobotanist
+paleobotany
+paleoceanography
+Paleocene
+paleochorology
+paleoclimatic
+paleoclimatologist
+paleoclimatology
+Paleoconcha
+paleocosmic
+paleocosmology
+paleocrystal
+paleocrystallic
+paleocrystalline
+paleocrystic
+paleocyclic
+paleodendrologic
+paleodendrological
+paleodendrologically
+paleodendrologist
+paleodendrology
+paleoecologist
+paleoecology
+paleoencephalon
+paleoeremology
+paleoethnic
+paleoethnography
+paleoethnologic
+paleoethnological
+paleoethnologist
+paleoethnology
+paleofauna
+Paleogene
+paleogenesis
+paleogenetic
+paleogeographic
+paleogeography
+paleoglaciology
+paleoglyph
+paleograph
+paleographer
+paleographic
+paleographical
+paleographically
+paleographist
+paleography
+paleoherpetologist
+paleoherpetology
+paleohistology
+paleohydrography
+paleoichthyology
+paleokinetic
+paleola
+paleolate
+paleolatry
+paleolimnology
+paleolith
+paleolithic
+paleolithical
+paleolithist
+paleolithoid
+paleolithy
+paleological
+paleologist
+paleology
+paleomammalogy
+paleometallic
+paleometeorological
+paleometeorology
+paleontographic
+paleontographical
+paleontography
+paleontologic
+paleontological
+paleontologically
+paleontologist
+paleontology
+paleopathology
+paleopedology
+paleophysiography
+paleophysiology
+paleophytic
+paleophytological
+paleophytologist
+paleophytology
+paleopicrite
+paleoplain
+paleopotamoloy
+paleopsychic
+paleopsychological
+paleopsychology
+paleornithological
+paleornithology
+paleostriatal
+paleostriatum
+paleostylic
+paleostyly
+paleotechnic
+paleothalamus
+paleothermal
+paleothermic
+Paleotropical
+paleovolcanic
+paleoytterbium
+Paleozoic
+paleozoological
+paleozoologist
+paleozoology
+paler
+Palermitan
+Palermo
+Pales
+Palesman
+Palestinian
+palestra
+palestral
+palestrian
+palestric
+palet
+paletiology
+paletot
+palette
+paletz
+palewise
+palfrey
+palfreyed
+palgat
+Pali
+pali
+Palicourea
+palification
+paliform
+paligorskite
+palikar
+palikarism
+palikinesia
+palila
+palilalia
+Palilia
+Palilicium
+palillogia
+palilogetic
+palilogy
+palimbacchic
+palimbacchius
+palimpsest
+palimpsestic
+palinal
+palindrome
+palindromic
+palindromical
+palindromically
+palindromist
+paling
+palingenesia
+palingenesian
+palingenesis
+palingenesist
+palingenesy
+palingenetic
+palingenetically
+palingenic
+palingenist
+palingeny
+palinode
+palinodial
+palinodic
+palinodist
+palinody
+palinurid
+Palinuridae
+palinuroid
+Palinurus
+paliphrasia
+palirrhea
+palisade
+palisading
+palisado
+palisander
+palisfy
+palish
+palistrophia
+Paliurus
+palkee
+pall
+palla
+palladammine
+Palladia
+palladia
+Palladian
+Palladianism
+palladic
+palladiferous
+palladinize
+palladion
+palladious
+Palladium
+palladium
+palladiumize
+palladize
+palladodiammine
+palladosammine
+palladous
+pallae
+pallah
+pallall
+pallanesthesia
+Pallas
+pallasite
+pallbearer
+palled
+pallescence
+pallescent
+pallesthesia
+pallet
+palleting
+palletize
+pallette
+pallholder
+palli
+pallial
+palliard
+palliasse
+Palliata
+palliata
+palliate
+palliation
+palliative
+palliatively
+palliator
+palliatory
+pallid
+pallidiflorous
+pallidipalpate
+palliditarsate
+pallidity
+pallidiventrate
+pallidly
+pallidness
+palliness
+Palliobranchiata
+palliobranchiate
+palliocardiac
+pallioessexite
+pallion
+palliopedal
+palliostratus
+pallium
+Palliyan
+pallograph
+pallographic
+pallometric
+pallone
+pallor
+Pallu
+Palluites
+pallwise
+pally
+palm
+palma
+Palmaceae
+palmaceous
+palmad
+Palmae
+palmanesthesia
+palmar
+palmarian
+palmary
+palmate
+palmated
+palmately
+palmatifid
+palmatiform
+palmatilobate
+palmatilobed
+palmation
+palmatiparted
+palmatipartite
+palmatisect
+palmatisected
+palmature
+palmcrist
+palmed
+Palmella
+Palmellaceae
+palmellaceous
+palmelloid
+palmer
+palmerite
+palmery
+palmesthesia
+palmette
+palmetto
+palmetum
+palmful
+palmicolous
+palmiferous
+palmification
+palmiform
+palmigrade
+palmilobate
+palmilobated
+palmilobed
+palminervate
+palminerved
+palmiped
+Palmipedes
+palmipes
+palmist
+palmister
+palmistry
+palmitate
+palmite
+palmitic
+palmitin
+palmitinic
+palmito
+palmitoleic
+palmitone
+palmiveined
+palmivorous
+palmlike
+palmo
+palmodic
+palmoscopy
+palmospasmus
+palmula
+palmus
+palmwise
+palmwood
+palmy
+palmyra
+Palmyrene
+Palmyrenian
+palolo
+palombino
+palometa
+palomino
+palosapis
+palouser
+paloverde
+palp
+palpability
+palpable
+palpableness
+palpably
+palpacle
+palpal
+palpate
+palpation
+palpatory
+palpebra
+palpebral
+palpebrate
+palpebration
+palpebritis
+palped
+palpi
+palpicorn
+Palpicornia
+palpifer
+palpiferous
+palpiform
+palpiger
+palpigerous
+palpitant
+palpitate
+palpitatingly
+palpitation
+palpless
+palpocil
+palpon
+palpulus
+palpus
+palsgrave
+palsgravine
+palsied
+palsification
+palstave
+palster
+palsy
+palsylike
+palsywort
+palt
+Palta
+palter
+palterer
+palterly
+paltrily
+paltriness
+paltry
+paludal
+paludament
+paludamentum
+paludial
+paludian
+paludic
+Paludicella
+Paludicolae
+paludicole
+paludicoline
+paludicolous
+paludiferous
+Paludina
+paludinal
+paludine
+paludinous
+paludism
+paludose
+paludous
+paludrin
+paludrine
+palule
+palulus
+Palus
+palus
+palustral
+palustrian
+palustrine
+paly
+palynology
+Pam
+pam
+pambanmanche
+Pamela
+pament
+pameroon
+Pamir
+Pamiri
+Pamirian
+Pamlico
+pamment
+Pampanga
+Pampangan
+Pampango
+pampas
+pampean
+pamper
+pampered
+pamperedly
+pamperedness
+pamperer
+pamperize
+pampero
+pamphagous
+pampharmacon
+Pamphiliidae
+Pamphilius
+pamphlet
+pamphletage
+pamphletary
+pamphleteer
+pamphleter
+pamphletful
+pamphletic
+pamphletical
+pamphletize
+pamphletwise
+pamphysical
+pamphysicism
+pampilion
+pampiniform
+pampinocele
+pamplegia
+pampootee
+pampootie
+pampre
+pamprodactyl
+pamprodactylism
+pamprodactylous
+pampsychism
+pampsychist
+Pamunkey
+Pan
+pan
+panace
+Panacea
+panacea
+panacean
+panaceist
+panache
+panached
+panachure
+panada
+panade
+Panagia
+panagiarion
+Panak
+Panaka
+panama
+Panamaian
+Panaman
+Panamanian
+Panamano
+Panamic
+Panamint
+Panamist
+panapospory
+panarchic
+panarchy
+panaris
+panaritium
+panarteritis
+panarthritis
+panary
+panatela
+Panathenaea
+Panathenaean
+Panathenaic
+panatrophy
+panautomorphic
+panax
+Panayan
+Panayano
+panbabylonian
+panbabylonism
+Panboeotian
+pancake
+pancarditis
+panchama
+panchayat
+pancheon
+panchion
+panchromatic
+panchromatism
+panchromatization
+panchromatize
+panchway
+panclastic
+panconciliatory
+pancosmic
+pancosmism
+pancosmist
+pancratian
+pancratiast
+pancratiastic
+pancratic
+pancratical
+pancratically
+pancration
+pancratism
+pancratist
+pancratium
+pancreas
+pancreatalgia
+pancreatectomize
+pancreatectomy
+pancreatemphraxis
+pancreathelcosis
+pancreatic
+pancreaticoduodenal
+pancreaticoduodenostomy
+pancreaticogastrostomy
+pancreaticosplenic
+pancreatin
+pancreatism
+pancreatitic
+pancreatitis
+pancreatization
+pancreatize
+pancreatoduodenectomy
+pancreatoenterostomy
+pancreatogenic
+pancreatogenous
+pancreatoid
+pancreatolipase
+pancreatolith
+pancreatomy
+pancreatoncus
+pancreatopathy
+pancreatorrhagia
+pancreatotomy
+pancreectomy
+pancreozymin
+pancyclopedic
+pand
+panda
+pandal
+pandan
+Pandanaceae
+pandanaceous
+Pandanales
+Pandanus
+pandaram
+Pandarctos
+pandaric
+Pandarus
+pandation
+Pandean
+pandect
+Pandectist
+pandemia
+pandemian
+pandemic
+pandemicity
+pandemoniac
+Pandemoniacal
+Pandemonian
+pandemonic
+pandemonism
+Pandemonium
+pandemonium
+Pandemos
+pandemy
+pandenominational
+pander
+panderage
+panderer
+panderess
+panderism
+panderize
+panderly
+Panderma
+pandermite
+panderous
+pandership
+pandestruction
+pandiabolism
+pandiculation
+Pandion
+Pandionidae
+pandita
+pandle
+pandlewhew
+Pandora
+pandora
+Pandorea
+Pandoridae
+Pandorina
+Pandosto
+pandour
+pandowdy
+pandrop
+pandura
+pandurate
+pandurated
+panduriform
+pandy
+pane
+panecclesiastical
+paned
+panegoism
+panegoist
+panegyric
+panegyrical
+panegyrically
+panegyricize
+panegyricon
+panegyricum
+panegyris
+panegyrist
+panegyrize
+panegyrizer
+panegyry
+paneity
+panel
+panela
+panelation
+paneler
+paneless
+paneling
+panelist
+panellation
+panelling
+panelwise
+panelwork
+panentheism
+panesthesia
+panesthetic
+paneulogism
+panfil
+panfish
+panful
+pang
+Pangaea
+pangamic
+pangamous
+pangamously
+pangamy
+pangane
+Pangasinan
+pangen
+pangene
+pangenesis
+pangenetic
+pangenetically
+pangenic
+pangful
+pangi
+Pangium
+pangless
+panglessly
+panglima
+Pangloss
+Panglossian
+Panglossic
+pangolin
+pangrammatist
+Pangwe
+panhandle
+panhandler
+panharmonic
+panharmonicon
+panhead
+panheaded
+Panhellenic
+Panhellenios
+Panhellenism
+Panhellenist
+Panhellenium
+panhidrosis
+panhuman
+panhygrous
+panhyperemia
+panhysterectomy
+Pani
+panic
+panical
+panically
+panicful
+panichthyophagous
+panicked
+panicky
+panicle
+panicled
+paniclike
+panicmonger
+panicmongering
+paniconograph
+paniconographic
+paniconography
+Panicularia
+paniculate
+paniculated
+paniculately
+paniculitis
+Panicum
+panidiomorphic
+panidrosis
+panification
+panimmunity
+Paninean
+Panionia
+Panionian
+Panionic
+Paniquita
+Paniquitan
+panisc
+panisca
+paniscus
+panisic
+panivorous
+Panjabi
+panjandrum
+pank
+pankin
+pankration
+panleucopenia
+panlogical
+panlogism
+panlogistical
+panman
+panmelodicon
+panmelodion
+panmerism
+panmeristic
+panmixia
+panmixy
+panmnesia
+panmug
+panmyelophthisis
+Panna
+pannade
+pannage
+pannam
+pannationalism
+panne
+pannel
+panner
+pannery
+panneuritic
+panneuritis
+pannicle
+pannicular
+pannier
+panniered
+pannierman
+pannikin
+panning
+Pannonian
+Pannonic
+pannose
+pannosely
+pannum
+pannus
+pannuscorium
+Panoan
+panocha
+panoche
+panococo
+panoistic
+panomphaic
+panomphean
+panomphic
+panophobia
+panophthalmia
+panophthalmitis
+panoplied
+panoplist
+panoply
+panoptic
+panoptical
+panopticon
+panoram
+panorama
+panoramic
+panoramical
+panoramically
+panoramist
+panornithic
+Panorpa
+Panorpatae
+panorpian
+panorpid
+Panorpidae
+Panos
+panosteitis
+panostitis
+panotitis
+panotype
+panouchi
+panpathy
+panpharmacon
+panphenomenalism
+panphobia
+Panpipe
+panplegia
+panpneumatism
+panpolism
+panpsychic
+panpsychism
+panpsychist
+panpsychistic
+panscientist
+pansciolism
+pansciolist
+pansclerosis
+pansclerotic
+panse
+pansexism
+pansexual
+pansexualism
+pansexualist
+pansexuality
+pansexualize
+panshard
+panside
+pansideman
+pansied
+pansinuitis
+pansinusitis
+pansmith
+pansophic
+pansophical
+pansophically
+pansophism
+pansophist
+pansophy
+panspermatism
+panspermatist
+panspermia
+panspermic
+panspermism
+panspermist
+panspermy
+pansphygmograph
+panstereorama
+pansy
+pansylike
+pant
+pantachromatic
+pantacosm
+pantagamy
+pantagogue
+pantagraph
+pantagraphic
+pantagraphical
+Pantagruel
+Pantagruelian
+Pantagruelic
+Pantagruelically
+Pantagrueline
+pantagruelion
+Pantagruelism
+Pantagruelist
+Pantagruelistic
+Pantagruelistical
+Pantagruelize
+pantaleon
+pantaletless
+pantalets
+pantaletted
+pantalgia
+pantalon
+Pantalone
+pantaloon
+pantalooned
+pantaloonery
+pantaloons
+pantameter
+pantamorph
+pantamorphia
+pantamorphic
+pantanemone
+pantanencephalia
+pantanencephalic
+pantaphobia
+pantarbe
+pantarchy
+pantas
+pantascope
+pantascopic
+Pantastomatida
+Pantastomina
+pantatrophia
+pantatrophy
+pantatype
+pantechnic
+pantechnicon
+pantelegraph
+pantelegraphy
+panteleologism
+pantelephone
+pantelephonic
+Pantelis
+pantellerite
+panter
+panterer
+Pantheian
+pantheic
+pantheism
+pantheist
+pantheistic
+pantheistical
+pantheistically
+panthelematism
+panthelism
+pantheologist
+pantheology
+pantheon
+pantheonic
+pantheonization
+pantheonize
+panther
+pantheress
+pantherine
+pantherish
+pantherlike
+pantherwood
+pantheum
+pantie
+panties
+pantile
+pantiled
+pantiling
+panting
+pantingly
+pantisocracy
+pantisocrat
+pantisocratic
+pantisocratical
+pantisocratist
+pantle
+pantler
+panto
+pantochrome
+pantochromic
+pantochromism
+pantochronometer
+Pantocrator
+pantod
+Pantodon
+Pantodontidae
+pantoffle
+pantofle
+pantoganglitis
+pantogelastic
+pantoglossical
+pantoglot
+pantoglottism
+pantograph
+pantographer
+pantographic
+pantographical
+pantographically
+pantography
+pantoiatrical
+pantologic
+pantological
+pantologist
+pantology
+pantomancer
+pantometer
+pantometric
+pantometrical
+pantometry
+pantomime
+pantomimic
+pantomimical
+pantomimically
+pantomimicry
+pantomimish
+pantomimist
+pantomimus
+pantomnesia
+pantomnesic
+pantomorph
+pantomorphia
+pantomorphic
+panton
+pantoon
+pantopelagian
+pantophagic
+pantophagist
+pantophagous
+pantophagy
+pantophile
+pantophobia
+pantophobic
+pantophobous
+pantoplethora
+pantopod
+Pantopoda
+pantopragmatic
+pantopterous
+pantoscope
+pantoscopic
+pantosophy
+Pantostomata
+pantostomate
+pantostomatous
+pantostome
+pantotactic
+pantothenate
+pantothenic
+Pantotheria
+pantotherian
+pantotype
+pantoum
+pantropic
+pantropical
+pantry
+pantryman
+pantrywoman
+pants
+pantun
+panty
+pantywaist
+panung
+panurgic
+panurgy
+panyar
+Panzer
+panzoism
+panzootia
+panzootic
+panzooty
+Paola
+paolo
+paon
+pap
+papa
+papability
+papable
+papabot
+papacy
+papagallo
+Papago
+papain
+papal
+papalism
+papalist
+papalistic
+papalization
+papalize
+papalizer
+papally
+papalty
+papane
+papaphobia
+papaphobist
+papaprelatical
+papaprelatist
+paparchical
+paparchy
+papaship
+Papaver
+Papaveraceae
+papaveraceous
+Papaverales
+papaverine
+papaverous
+papaw
+papaya
+Papayaceae
+papayaceous
+papayotin
+papboat
+pape
+papelonne
+paper
+paperback
+paperbark
+paperboard
+papered
+paperer
+paperful
+paperiness
+papering
+paperlike
+papermaker
+papermaking
+papermouth
+papern
+papershell
+paperweight
+papery
+papess
+papeterie
+papey
+Paphian
+Paphiopedilum
+Papiamento
+papicolar
+papicolist
+Papilio
+Papilionaceae
+papilionaceous
+Papiliones
+papilionid
+Papilionidae
+Papilionides
+Papilioninae
+papilionine
+papilionoid
+Papilionoidea
+papilla
+papillae
+papillar
+papillary
+papillate
+papillated
+papillectomy
+papilledema
+papilliferous
+papilliform
+papillitis
+papilloadenocystoma
+papillocarcinoma
+papilloedema
+papilloma
+papillomatosis
+papillomatous
+papillon
+papilloretinitis
+papillosarcoma
+papillose
+papillosity
+papillote
+papillous
+papillulate
+papillule
+Papinachois
+Papio
+papion
+papish
+papisher
+papism
+Papist
+papist
+papistic
+papistical
+papistically
+papistlike
+papistly
+papistry
+papize
+papless
+papmeat
+papolater
+papolatrous
+papolatry
+papoose
+papooseroot
+Pappea
+pappescent
+pappi
+pappiferous
+pappiform
+pappose
+pappox
+pappus
+pappy
+papreg
+paprica
+paprika
+Papuan
+papula
+papular
+papulate
+papulated
+papulation
+papule
+papuliferous
+papuloerythematous
+papulopustular
+papulopustule
+papulose
+papulosquamous
+papulous
+papulovesicular
+papyr
+papyraceous
+papyral
+papyrean
+papyri
+papyrian
+papyrin
+papyrine
+papyritious
+papyrocracy
+papyrograph
+papyrographer
+papyrographic
+papyrography
+papyrological
+papyrologist
+papyrology
+papyrophobia
+papyroplastics
+papyrotamia
+papyrotint
+papyrotype
+papyrus
+Paque
+paquet
+par
+para
+paraaminobenzoic
+parabanate
+parabanic
+parabaptism
+parabaptization
+parabasal
+parabasic
+parabasis
+parabema
+parabematic
+parabenzoquinone
+parabiosis
+parabiotic
+parablast
+parablastic
+parable
+parablepsia
+parablepsis
+parablepsy
+parableptic
+parabola
+parabolanus
+parabolic
+parabolical
+parabolicalism
+parabolically
+parabolicness
+paraboliform
+parabolist
+parabolization
+parabolize
+parabolizer
+paraboloid
+paraboloidal
+parabomb
+parabotulism
+parabranchia
+parabranchial
+parabranchiate
+parabulia
+parabulic
+paracanthosis
+paracarmine
+paracasein
+paracaseinate
+Paracelsian
+Paracelsianism
+Paracelsic
+Paracelsist
+Paracelsistic
+Paracelsus
+paracentesis
+paracentral
+paracentric
+paracentrical
+paracephalus
+paracerebellar
+paracetaldehyde
+parachaplain
+paracholia
+parachor
+parachordal
+parachrea
+parachroia
+parachroma
+parachromatism
+parachromatophorous
+parachromatopsia
+parachromatosis
+parachrome
+parachromoparous
+parachromophoric
+parachromophorous
+parachronism
+parachronistic
+parachrose
+parachute
+parachutic
+parachutism
+parachutist
+paraclete
+paracmasis
+paracme
+paracoele
+paracoelian
+paracolitis
+paracolon
+paracolpitis
+paracolpium
+paracondyloid
+paracone
+paraconic
+paraconid
+paraconscious
+paracorolla
+paracotoin
+paracoumaric
+paracresol
+Paracress
+paracusia
+paracusic
+paracyanogen
+paracyesis
+paracymene
+paracystic
+paracystitis
+paracystium
+parade
+paradeful
+paradeless
+paradelike
+paradenitis
+paradental
+paradentitis
+paradentium
+parader
+paraderm
+paradiastole
+paradiazine
+paradichlorbenzene
+paradichlorbenzol
+paradichlorobenzene
+paradichlorobenzol
+paradidymal
+paradidymis
+paradigm
+paradigmatic
+paradigmatical
+paradigmatically
+paradigmatize
+parading
+paradingly
+paradiplomatic
+paradisaic
+paradisaically
+paradisal
+paradise
+Paradisea
+paradisean
+Paradiseidae
+Paradiseinae
+Paradisia
+paradisiac
+paradisiacal
+paradisiacally
+paradisial
+paradisian
+paradisic
+paradisical
+parado
+paradoctor
+parados
+paradoses
+paradox
+paradoxal
+paradoxer
+paradoxial
+paradoxic
+paradoxical
+paradoxicalism
+paradoxicality
+paradoxically
+paradoxicalness
+paradoxician
+Paradoxides
+paradoxidian
+paradoxism
+paradoxist
+paradoxographer
+paradoxographical
+paradoxology
+paradoxure
+Paradoxurinae
+paradoxurine
+Paradoxurus
+paradoxy
+paradromic
+paraenesis
+paraenesize
+paraenetic
+paraenetical
+paraengineer
+paraffin
+paraffine
+paraffiner
+paraffinic
+paraffinize
+paraffinoid
+paraffiny
+paraffle
+parafle
+parafloccular
+paraflocculus
+paraform
+paraformaldehyde
+parafunction
+paragammacism
+paraganglion
+paragaster
+paragastral
+paragastric
+paragastrula
+paragastrular
+parage
+paragenesia
+paragenesis
+paragenetic
+paragenic
+paragerontic
+parageusia
+parageusic
+parageusis
+paragglutination
+paraglenal
+paraglobin
+paraglobulin
+paraglossa
+paraglossal
+paraglossate
+paraglossia
+paraglycogen
+paragnath
+paragnathism
+paragnathous
+paragnathus
+paragneiss
+paragnosia
+paragoge
+paragogic
+paragogical
+paragogically
+paragogize
+paragon
+paragonimiasis
+Paragonimus
+paragonite
+paragonitic
+paragonless
+paragram
+paragrammatist
+paragraph
+paragrapher
+paragraphia
+paragraphic
+paragraphical
+paragraphically
+paragraphism
+paragraphist
+paragraphistical
+paragraphize
+Paraguay
+Paraguayan
+parah
+paraheliotropic
+paraheliotropism
+parahematin
+parahemoglobin
+parahepatic
+Parahippus
+parahopeite
+parahormone
+parahydrogen
+paraiba
+Paraiyan
+parakeet
+parakeratosis
+parakilya
+parakinesia
+parakinetic
+paralactate
+paralalia
+paralambdacism
+paralambdacismus
+paralaurionite
+paraldehyde
+parale
+paralectotype
+paraleipsis
+paralepsis
+paralexia
+paralexic
+paralgesia
+paralgesic
+paralinin
+paralipomena
+Paralipomenon
+paralipsis
+paralitical
+parallactic
+parallactical
+parallactically
+parallax
+parallel
+parallelable
+parallelepiped
+parallelepipedal
+parallelepipedic
+parallelepipedon
+parallelepipedonal
+paralleler
+parallelinervate
+parallelinerved
+parallelinervous
+parallelism
+parallelist
+parallelistic
+parallelith
+parallelization
+parallelize
+parallelizer
+parallelless
+parallelly
+parallelodrome
+parallelodromous
+parallelogram
+parallelogrammatic
+parallelogrammatical
+parallelogrammic
+parallelogrammical
+parallelograph
+parallelometer
+parallelopiped
+parallelopipedon
+parallelotropic
+parallelotropism
+parallelwise
+parallepipedous
+paralogia
+paralogical
+paralogician
+paralogism
+paralogist
+paralogistic
+paralogize
+paralogy
+paraluminite
+paralyses
+paralysis
+paralytic
+paralytical
+paralytically
+paralyzant
+paralyzation
+paralyze
+paralyzedly
+paralyzer
+paralyzingly
+param
+paramagnet
+paramagnetic
+paramagnetism
+paramandelic
+paramarine
+paramastigate
+paramastitis
+paramastoid
+paramatta
+Paramecidae
+Paramecium
+paramedian
+paramelaconite
+paramenia
+parament
+paramere
+parameric
+parameron
+paramese
+paramesial
+parameter
+parametric
+parametrical
+parametritic
+parametritis
+parametrium
+paramide
+paramilitary
+paramimia
+paramine
+paramiographer
+paramitome
+paramnesia
+paramo
+Paramoecium
+paramorph
+paramorphia
+paramorphic
+paramorphine
+paramorphism
+paramorphosis
+paramorphous
+paramount
+paramountcy
+paramountly
+paramountness
+paramountship
+paramour
+paramuthetic
+paramyelin
+paramylum
+paramyoclonus
+paramyosinogen
+paramyotone
+paramyotonia
+paranasal
+paranatellon
+parandrus
+paranema
+paranematic
+paranephric
+paranephritic
+paranephritis
+paranephros
+paranepionic
+paranete
+parang
+paranitraniline
+paranitrosophenol
+paranoia
+paranoiac
+paranoid
+paranoidal
+paranoidism
+paranomia
+paranormal
+paranosic
+paranthelion
+paranthracene
+Paranthropus
+paranuclear
+paranucleate
+paranucleic
+paranuclein
+paranucleinic
+paranucleus
+paranymph
+paranymphal
+parao
+paraoperation
+Parapaguridae
+paraparesis
+paraparetic
+parapathia
+parapathy
+parapegm
+parapegma
+paraperiodic
+parapet
+parapetalous
+parapeted
+parapetless
+paraph
+paraphasia
+paraphasic
+paraphemia
+paraphenetidine
+paraphenylene
+paraphenylenediamine
+parapherna
+paraphernal
+paraphernalia
+paraphernalian
+paraphia
+paraphilia
+paraphimosis
+paraphonia
+paraphonic
+paraphototropism
+paraphrasable
+paraphrase
+paraphraser
+paraphrasia
+paraphrasian
+paraphrasis
+paraphrasist
+paraphrast
+paraphraster
+paraphrastic
+paraphrastical
+paraphrastically
+paraphrenia
+paraphrenic
+paraphrenitis
+paraphyllium
+paraphysate
+paraphysical
+paraphysiferous
+paraphysis
+paraplasis
+paraplasm
+paraplasmic
+paraplastic
+paraplastin
+paraplectic
+paraplegia
+paraplegic
+paraplegy
+parapleuritis
+parapleurum
+parapod
+parapodial
+parapodium
+parapophysial
+parapophysis
+parapraxia
+parapraxis
+paraproctitis
+paraproctium
+paraprostatitis
+Parapsida
+parapsidal
+parapsidan
+parapsis
+parapsychical
+parapsychism
+parapsychological
+parapsychology
+parapsychosis
+parapteral
+parapteron
+parapterum
+paraquadrate
+paraquinone
+Pararctalia
+Pararctalian
+pararectal
+pararek
+parareka
+pararhotacism
+pararosaniline
+pararosolic
+pararthria
+parasaboteur
+parasalpingitis
+parasang
+parascene
+parascenium
+parasceve
+paraschematic
+parasecretion
+paraselene
+paraselenic
+parasemidin
+parasemidine
+parasexuality
+parashah
+parasigmatism
+parasigmatismus
+Parasita
+parasital
+parasitary
+parasite
+parasitelike
+parasitemia
+parasitic
+Parasitica
+parasitical
+parasitically
+parasiticalness
+parasiticidal
+parasiticide
+Parasitidae
+parasitism
+parasitize
+parasitogenic
+parasitoid
+parasitoidism
+parasitological
+parasitologist
+parasitology
+parasitophobia
+parasitosis
+parasitotrope
+parasitotropic
+parasitotropism
+parasitotropy
+paraskenion
+parasol
+parasoled
+parasolette
+paraspecific
+parasphenoid
+parasphenoidal
+paraspotter
+paraspy
+parastas
+parastatic
+parastemon
+parastemonal
+parasternal
+parasternum
+parastichy
+parastyle
+parasubphonate
+parasubstituted
+Parasuchia
+parasuchian
+parasympathetic
+parasympathomimetic
+parasynapsis
+parasynaptic
+parasynaptist
+parasyndesis
+parasynesis
+parasynetic
+parasynovitis
+parasynthesis
+parasynthetic
+parasyntheton
+parasyphilis
+parasyphilitic
+parasyphilosis
+parasystole
+paratactic
+paratactical
+paratactically
+paratartaric
+parataxis
+parate
+paraterminal
+Paratheria
+paratherian
+parathesis
+parathetic
+parathion
+parathormone
+parathymic
+parathyroid
+parathyroidal
+parathyroidectomize
+parathyroidectomy
+parathyroprival
+parathyroprivia
+parathyroprivic
+paratitla
+paratitles
+paratoloid
+paratoluic
+paratoluidine
+paratomial
+paratomium
+paratonic
+paratonically
+paratorium
+paratory
+paratracheal
+paratragedia
+paratragoedia
+paratransversan
+paratrichosis
+paratrimma
+paratriptic
+paratroop
+paratrooper
+paratrophic
+paratrophy
+paratuberculin
+paratuberculosis
+paratuberculous
+paratungstate
+paratungstic
+paratype
+paratyphlitis
+paratyphoid
+paratypic
+paratypical
+paratypically
+paravaginitis
+paravail
+paravane
+paravauxite
+paravent
+paravertebral
+paravesical
+paraxial
+paraxially
+paraxon
+paraxonic
+paraxylene
+Parazoa
+parazoan
+parazonium
+parbake
+Parbate
+parboil
+parbuckle
+parcel
+parceling
+parcellary
+parcellate
+parcellation
+parcelling
+parcellization
+parcellize
+parcelment
+parcelwise
+parcenary
+parcener
+parcenership
+parch
+parchable
+parchedly
+parchedness
+parcheesi
+parchemin
+parcher
+parchesi
+parching
+parchingly
+parchisi
+parchment
+parchmenter
+parchmentize
+parchmentlike
+parchmenty
+parchy
+parcidentate
+parciloquy
+parclose
+parcook
+pard
+pardalote
+Pardanthus
+pardao
+parded
+pardesi
+pardine
+pardner
+pardnomastic
+pardo
+pardon
+pardonable
+pardonableness
+pardonably
+pardonee
+pardoner
+pardoning
+pardonless
+pardonmonger
+pare
+paregoric
+Pareiasauri
+Pareiasauria
+pareiasaurian
+Pareiasaurus
+Pareioplitae
+parel
+parelectronomic
+parelectronomy
+parella
+paren
+parencephalic
+parencephalon
+parenchym
+parenchyma
+parenchymal
+parenchymatic
+parenchymatitis
+parenchymatous
+parenchymatously
+parenchyme
+parenchymous
+parent
+parentage
+parental
+Parentalia
+parentalism
+parentality
+parentally
+parentdom
+parentela
+parentelic
+parenteral
+parenterally
+parentheses
+parenthesis
+parenthesize
+parenthetic
+parenthetical
+parentheticality
+parenthetically
+parentheticalness
+parenthood
+parenticide
+parentless
+parentlike
+parentship
+Pareoean
+parepididymal
+parepididymis
+parepigastric
+parer
+parerethesis
+parergal
+parergic
+parergon
+paresis
+paresthesia
+paresthesis
+paresthetic
+parethmoid
+paretic
+paretically
+pareunia
+parfait
+parfilage
+parfleche
+parfocal
+pargana
+pargasite
+parge
+pargeboard
+parget
+pargeter
+pargeting
+pargo
+parhelia
+parheliacal
+parhelic
+parhelion
+parhomologous
+parhomology
+parhypate
+pari
+pariah
+pariahdom
+pariahism
+pariahship
+parial
+Parian
+parian
+Pariasauria
+Pariasaurus
+Paridae
+paridigitate
+paridrosis
+paries
+parietal
+Parietales
+Parietaria
+parietary
+parietes
+parietofrontal
+parietojugal
+parietomastoid
+parietoquadrate
+parietosphenoid
+parietosphenoidal
+parietosplanchnic
+parietosquamosal
+parietotemporal
+parietovaginal
+parietovisceral
+parify
+parigenin
+pariglin
+Parilia
+Parilicium
+parilla
+parillin
+parimutuel
+Parinarium
+parine
+paring
+paripinnate
+Paris
+parish
+parished
+parishen
+parishional
+parishionally
+parishionate
+parishioner
+parishionership
+Parisian
+Parisianism
+Parisianization
+Parisianize
+Parisianly
+Parisii
+parisis
+parisology
+parison
+parisonic
+paristhmic
+paristhmion
+parisyllabic
+parisyllabical
+Pariti
+Paritium
+parity
+parivincular
+park
+parka
+parkee
+parker
+parkin
+parking
+Parkinsonia
+Parkinsonism
+parkish
+parklike
+parkward
+parkway
+parky
+parlamento
+parlance
+parlando
+Parlatoria
+parlatory
+parlay
+parle
+parley
+parleyer
+parliament
+parliamental
+parliamentarian
+parliamentarianism
+parliamentarily
+parliamentariness
+parliamentarism
+parliamentarization
+parliamentarize
+parliamentary
+parliamenteer
+parliamenteering
+parliamenter
+parling
+parlish
+parlor
+parlorish
+parlormaid
+parlous
+parlously
+parlousness
+parly
+Parma
+parma
+parmacety
+parmak
+Parmelia
+Parmeliaceae
+parmeliaceous
+parmelioid
+Parmentiera
+Parmesan
+Parmese
+parnas
+Parnassia
+Parnassiaceae
+parnassiaceous
+Parnassian
+Parnassianism
+Parnassiinae
+Parnassism
+Parnassus
+parnel
+Parnellism
+Parnellite
+parnorpine
+paroarion
+paroarium
+paroccipital
+paroch
+parochial
+parochialic
+parochialism
+parochialist
+parochiality
+parochialization
+parochialize
+parochially
+parochialness
+parochin
+parochine
+parochiner
+parode
+parodiable
+parodial
+parodic
+parodical
+parodinia
+parodist
+parodistic
+parodistically
+parodize
+parodontitis
+parodos
+parody
+parodyproof
+paroecious
+paroeciously
+paroeciousness
+paroecism
+paroecy
+paroemia
+paroemiac
+paroemiographer
+paroemiography
+paroemiologist
+paroemiology
+paroicous
+parol
+parolable
+parole
+parolee
+parolfactory
+paroli
+parolist
+paromoeon
+paromologetic
+paromologia
+paromology
+paromphalocele
+paromphalocelic
+paronomasia
+paronomasial
+paronomasian
+paronomasiastic
+paronomastical
+paronomastically
+paronychia
+paronychial
+paronychium
+paronym
+paronymic
+paronymization
+paronymize
+paronymous
+paronymy
+paroophoric
+paroophoritis
+paroophoron
+paropsis
+paroptesis
+paroptic
+parorchid
+parorchis
+parorexia
+Parosela
+parosmia
+parosmic
+parosteal
+parosteitis
+parosteosis
+parostosis
+parostotic
+Parotia
+parotic
+parotid
+parotidean
+parotidectomy
+parotiditis
+parotis
+parotitic
+parotitis
+parotoid
+parous
+parousia
+parousiamania
+parovarian
+parovariotomy
+parovarium
+paroxazine
+paroxysm
+paroxysmal
+paroxysmalist
+paroxysmally
+paroxysmic
+paroxysmist
+paroxytone
+paroxytonic
+paroxytonize
+parpal
+parquet
+parquetage
+parquetry
+parr
+Parra
+parrel
+parrhesia
+parrhesiastic
+parriable
+parricidal
+parricidally
+parricide
+parricided
+parricidial
+parricidism
+Parridae
+parrier
+parrock
+parrot
+parroter
+parrothood
+parrotism
+parrotize
+parrotlet
+parrotlike
+parrotry
+parrotwise
+parroty
+parry
+parsable
+parse
+parsec
+Parsee
+Parseeism
+parser
+parsettensite
+Parsi
+Parsic
+Parsiism
+parsimonious
+parsimoniously
+parsimoniousness
+parsimony
+Parsism
+parsley
+parsleylike
+parsleywort
+parsnip
+parson
+parsonage
+parsonarchy
+parsondom
+parsoned
+parsonese
+parsoness
+parsonet
+parsonhood
+parsonic
+parsonical
+parsonically
+parsoning
+parsonish
+parsonity
+parsonize
+parsonlike
+parsonly
+parsonolatry
+parsonology
+parsonry
+parsonship
+Parsonsia
+parsonsite
+parsony
+Part
+part
+partakable
+partake
+partaker
+partan
+partanfull
+partanhanded
+parted
+partedness
+parter
+parterre
+parterred
+partheniad
+Partheniae
+parthenian
+parthenic
+Parthenium
+parthenocarpelly
+parthenocarpic
+parthenocarpical
+parthenocarpically
+parthenocarpous
+parthenocarpy
+Parthenocissus
+parthenogenesis
+parthenogenetic
+parthenogenetically
+parthenogenic
+parthenogenitive
+parthenogenous
+parthenogeny
+parthenogonidium
+Parthenolatry
+parthenology
+Parthenon
+Parthenopaeus
+parthenoparous
+Parthenope
+Parthenopean
+Parthenos
+parthenosperm
+parthenospore
+Parthian
+partial
+partialism
+partialist
+partialistic
+partiality
+partialize
+partially
+partialness
+partiary
+partible
+particate
+participability
+participable
+participance
+participancy
+participant
+participantly
+participate
+participatingly
+participation
+participative
+participatively
+participator
+participatory
+participatress
+participial
+participiality
+participialize
+participially
+participle
+particle
+particled
+particular
+particularism
+particularist
+particularistic
+particularistically
+particularity
+particularization
+particularize
+particularly
+particularness
+particulate
+partigen
+partile
+partimembered
+partimen
+partinium
+partisan
+partisanism
+partisanize
+partisanship
+partite
+partition
+partitional
+partitionary
+partitioned
+partitioner
+partitioning
+partitionist
+partitionment
+partitive
+partitively
+partitura
+partiversal
+partivity
+partless
+partlet
+partly
+partner
+partnerless
+partnership
+parto
+partook
+partridge
+partridgeberry
+partridgelike
+partridgewood
+partridging
+partschinite
+parture
+parturiate
+parturience
+parturiency
+parturient
+parturifacient
+parturition
+parturitive
+party
+partyism
+partyist
+partykin
+partyless
+partymonger
+partyship
+Parukutu
+parulis
+parumbilical
+parure
+paruria
+Parus
+parvanimity
+parvenu
+parvenudom
+parvenuism
+parvicellular
+parviflorous
+parvifoliate
+parvifolious
+parvipotent
+parvirostrate
+parvis
+parviscient
+parvitude
+parvolin
+parvoline
+parvule
+paryphodrome
+pasan
+pasang
+Pascal
+Pasch
+Pascha
+paschal
+paschalist
+Paschaltide
+paschite
+pascoite
+pascuage
+pascual
+pascuous
+pasgarde
+pash
+pasha
+pashadom
+pashalik
+pashaship
+pashm
+pashmina
+Pashto
+pasi
+pasigraphic
+pasigraphical
+pasigraphy
+pasilaly
+Pasitelean
+pasmo
+Paspalum
+pasqueflower
+pasquil
+pasquilant
+pasquiler
+pasquilic
+Pasquin
+pasquin
+pasquinade
+pasquinader
+Pasquinian
+Pasquino
+pass
+passable
+passableness
+passably
+passade
+passado
+passage
+passageable
+passageway
+Passagian
+passalid
+Passalidae
+Passalus
+Passamaquoddy
+passant
+passback
+passbook
+Passe
+passe
+passee
+passegarde
+passement
+passementerie
+passen
+passenger
+Passer
+passer
+Passeres
+passeriform
+Passeriformes
+Passerina
+passerine
+passewa
+passibility
+passible
+passibleness
+Passiflora
+Passifloraceae
+passifloraceous
+Passiflorales
+passimeter
+passing
+passingly
+passingness
+passion
+passional
+passionary
+passionate
+passionately
+passionateness
+passionative
+passioned
+passionflower
+passionful
+passionfully
+passionfulness
+Passionist
+passionist
+passionless
+passionlessly
+passionlessness
+passionlike
+passionometer
+passionproof
+Passiontide
+passionwise
+passionwort
+passir
+passival
+passivate
+passivation
+passive
+passively
+passiveness
+passivism
+passivist
+passivity
+passkey
+passless
+passman
+passo
+passometer
+passout
+passover
+passoverish
+passpenny
+passport
+passportless
+passulate
+passulation
+passus
+passway
+passwoman
+password
+passworts
+passymeasure
+past
+paste
+pasteboard
+pasteboardy
+pasted
+pastedness
+pastedown
+pastel
+pastelist
+paster
+pasterer
+pastern
+pasterned
+pasteur
+Pasteurella
+Pasteurelleae
+pasteurellosis
+Pasteurian
+pasteurism
+pasteurization
+pasteurize
+pasteurizer
+pastiche
+pasticheur
+pastil
+pastile
+pastille
+pastime
+pastimer
+Pastinaca
+pastiness
+pasting
+pastness
+pastophor
+pastophorion
+pastophorium
+pastophorus
+pastor
+pastorage
+pastoral
+pastorale
+pastoralism
+pastoralist
+pastorality
+pastoralize
+pastorally
+pastoralness
+pastorate
+pastoress
+pastorhood
+pastorium
+pastorize
+pastorless
+pastorlike
+pastorling
+pastorly
+pastorship
+pastose
+pastosity
+pastrami
+pastry
+pastryman
+pasturability
+pasturable
+pasturage
+pastural
+pasture
+pastureless
+pasturer
+pasturewise
+pasty
+pasul
+Pat
+pat
+pata
+pataca
+patacao
+pataco
+patagial
+patagiate
+patagium
+Patagon
+patagon
+Patagones
+Patagonian
+pataka
+patamar
+patao
+patapat
+pataque
+Pataria
+Patarin
+Patarine
+Patarinism
+patas
+patashte
+Patavian
+patavinity
+patball
+patballer
+patch
+patchable
+patcher
+patchery
+patchily
+patchiness
+patchleaf
+patchless
+patchouli
+patchwise
+patchword
+patchwork
+patchworky
+patchy
+pate
+patefaction
+patefy
+patel
+patella
+patellar
+patellaroid
+patellate
+Patellidae
+patellidan
+patelliform
+patelline
+patellofemoral
+patelloid
+patellula
+patellulate
+paten
+patency
+patener
+patent
+patentability
+patentable
+patentably
+patentee
+patently
+patentor
+pater
+patera
+patercove
+paterfamiliar
+paterfamiliarly
+paterfamilias
+pateriform
+paterissa
+paternal
+paternalism
+paternalist
+paternalistic
+paternalistically
+paternality
+paternalize
+paternally
+paternity
+paternoster
+paternosterer
+patesi
+patesiate
+path
+Pathan
+pathbreaker
+pathed
+pathema
+pathematic
+pathematically
+pathematology
+pathetic
+pathetical
+pathetically
+patheticalness
+patheticate
+patheticly
+patheticness
+pathetism
+pathetist
+pathetize
+pathfarer
+pathfinder
+pathfinding
+pathic
+pathicism
+pathless
+pathlessness
+pathlet
+pathoanatomical
+pathoanatomy
+pathobiological
+pathobiologist
+pathobiology
+pathochemistry
+pathodontia
+pathogen
+pathogene
+pathogenesis
+pathogenesy
+pathogenetic
+pathogenic
+pathogenicity
+pathogenous
+pathogeny
+pathogerm
+pathogermic
+pathognomic
+pathognomical
+pathognomonic
+pathognomonical
+pathognomy
+pathognostic
+pathographical
+pathography
+pathologic
+pathological
+pathologically
+pathologicoanatomic
+pathologicoanatomical
+pathologicoclinical
+pathologicohistological
+pathologicopsychological
+pathologist
+pathology
+patholysis
+patholytic
+pathomania
+pathometabolism
+pathomimesis
+pathomimicry
+pathoneurosis
+pathonomia
+pathonomy
+pathophobia
+pathophoresis
+pathophoric
+pathophorous
+pathoplastic
+pathoplastically
+pathopoeia
+pathopoiesis
+pathopoietic
+pathopsychology
+pathopsychosis
+pathoradiography
+pathos
+pathosocial
+Pathrusim
+pathway
+pathwayed
+pathy
+patible
+patibulary
+patibulate
+patience
+patiency
+patient
+patientless
+patiently
+patientness
+patina
+patinate
+patination
+patine
+patined
+patinize
+patinous
+patio
+patisserie
+patly
+Patmian
+Patmos
+patness
+patnidar
+pato
+patois
+patola
+patonce
+patria
+patrial
+patriarch
+patriarchal
+patriarchalism
+patriarchally
+patriarchate
+patriarchdom
+patriarched
+patriarchess
+patriarchic
+patriarchical
+patriarchically
+patriarchism
+patriarchist
+patriarchship
+patriarchy
+Patrice
+patrice
+Patricia
+Patrician
+patrician
+patricianhood
+patricianism
+patricianly
+patricianship
+patriciate
+patricidal
+patricide
+Patricio
+Patrick
+patrico
+patrilineal
+patrilineally
+patrilinear
+patriliny
+patrilocal
+patrimonial
+patrimonially
+patrimony
+patrin
+Patriofelis
+patriolatry
+patriot
+patrioteer
+patriotess
+patriotic
+patriotical
+patriotically
+patriotics
+patriotism
+patriotly
+patriotship
+Patripassian
+Patripassianism
+Patripassianist
+Patripassianly
+patrist
+patristic
+patristical
+patristically
+patristicalness
+patristicism
+patristics
+patrix
+patrizate
+patrization
+patrocinium
+patroclinic
+patroclinous
+patrocliny
+patrogenesis
+patrol
+patroller
+patrollotism
+patrolman
+patrologic
+patrological
+patrologist
+patrology
+patron
+patronage
+patronal
+patronate
+patrondom
+patroness
+patronessship
+patronite
+patronizable
+patronization
+patronize
+patronizer
+patronizing
+patronizingly
+patronless
+patronly
+patronomatology
+patronship
+patronym
+patronymic
+patronymically
+patronymy
+patroon
+patroonry
+patroonship
+patruity
+Patsy
+patta
+pattable
+patte
+pattee
+patten
+pattened
+pattener
+patter
+patterer
+patterist
+pattern
+patternable
+patterned
+patterner
+patterning
+patternize
+patternless
+patternlike
+patternmaker
+patternmaking
+patternwise
+patterny
+pattu
+Patty
+patty
+pattypan
+patu
+patulent
+patulous
+patulously
+patulousness
+Patuxent
+patwari
+Patwin
+paty
+pau
+pauciarticulate
+pauciarticulated
+paucidentate
+pauciflorous
+paucifoliate
+paucifolious
+paucify
+paucijugate
+paucilocular
+pauciloquent
+pauciloquently
+pauciloquy
+paucinervate
+paucipinnate
+pauciplicate
+pauciradiate
+pauciradiated
+paucispiral
+paucispirated
+paucity
+paughty
+paukpan
+Paul
+Paula
+paular
+pauldron
+Pauliad
+Paulian
+Paulianist
+Pauliccian
+Paulicianism
+paulie
+paulin
+Paulina
+Pauline
+Paulinia
+Paulinian
+Paulinism
+Paulinist
+Paulinistic
+Paulinistically
+Paulinity
+Paulinize
+Paulinus
+Paulism
+Paulist
+Paulista
+Paulite
+paulopast
+paulopost
+paulospore
+Paulownia
+Paulus
+Paumari
+paunch
+paunched
+paunchful
+paunchily
+paunchiness
+paunchy
+paup
+pauper
+pauperage
+pauperate
+pauperdom
+pauperess
+pauperism
+pauperitic
+pauperization
+pauperize
+pauperizer
+Paurometabola
+paurometabolic
+paurometabolism
+paurometabolous
+paurometaboly
+pauropod
+Pauropoda
+pauropodous
+pausably
+pausal
+pausation
+pause
+pauseful
+pausefully
+pauseless
+pauselessly
+pausement
+pauser
+pausingly
+paussid
+Paussidae
+paut
+pauxi
+pavage
+pavan
+pavane
+pave
+pavement
+pavemental
+paver
+pavestone
+Pavetta
+Pavia
+pavid
+pavidity
+pavier
+pavilion
+paving
+pavior
+Paviotso
+paviour
+pavis
+pavisade
+pavisado
+paviser
+pavisor
+Pavo
+pavonated
+pavonazzetto
+pavonazzo
+Pavoncella
+Pavonia
+pavonian
+pavonine
+pavonize
+pavy
+paw
+pawdite
+pawer
+pawing
+pawk
+pawkery
+pawkily
+pawkiness
+pawkrie
+pawky
+pawl
+pawn
+pawnable
+pawnage
+pawnbroker
+pawnbrokerage
+pawnbrokeress
+pawnbrokering
+pawnbrokery
+pawnbroking
+Pawnee
+pawnee
+pawner
+pawnie
+pawnor
+pawnshop
+pawpaw
+Pawtucket
+pax
+paxilla
+paxillar
+paxillary
+paxillate
+paxilliferous
+paxilliform
+Paxillosa
+paxillose
+paxillus
+paxiuba
+paxwax
+pay
+payability
+payable
+payableness
+payably
+Payagua
+Payaguan
+payday
+payed
+payee
+payeny
+payer
+paying
+paymaster
+paymastership
+payment
+paymistress
+Payni
+paynim
+paynimhood
+paynimry
+Paynize
+payoff
+payong
+payor
+payroll
+paysagist
+Pazend
+pea
+peaberry
+peace
+peaceable
+peaceableness
+peaceably
+peacebreaker
+peacebreaking
+peaceful
+peacefully
+peacefulness
+peaceless
+peacelessness
+peacelike
+peacemaker
+peacemaking
+peaceman
+peacemonger
+peacemongering
+peacetime
+peach
+peachberry
+peachblossom
+peachblow
+peachen
+peacher
+peachery
+peachick
+peachify
+peachiness
+peachlet
+peachlike
+peachwood
+peachwort
+peachy
+peacoat
+peacock
+peacockery
+peacockish
+peacockishly
+peacockishness
+peacockism
+peacocklike
+peacockly
+peacockwise
+peacocky
+peacod
+peafowl
+peag
+peage
+peahen
+peai
+peaiism
+peak
+peaked
+peakedly
+peakedness
+peaker
+peakily
+peakiness
+peaking
+peakish
+peakishly
+peakishness
+peakless
+peaklike
+peakward
+peaky
+peakyish
+peal
+pealike
+pean
+peanut
+pear
+pearceite
+pearl
+pearlberry
+pearled
+pearler
+pearlet
+pearlfish
+pearlfruit
+pearlike
+pearlin
+pearliness
+pearling
+pearlish
+pearlite
+pearlitic
+pearlsides
+pearlstone
+pearlweed
+pearlwort
+pearly
+pearmain
+pearmonger
+peart
+pearten
+peartly
+peartness
+pearwood
+peasant
+peasantess
+peasanthood
+peasantism
+peasantize
+peasantlike
+peasantly
+peasantry
+peasantship
+peasecod
+peaselike
+peasen
+peashooter
+peason
+peastake
+peastaking
+peastick
+peasticking
+peastone
+peasy
+peat
+peatery
+peathouse
+peatman
+peatship
+peatstack
+peatwood
+peaty
+peavey
+peavy
+Peba
+peba
+Peban
+pebble
+pebbled
+pebblehearted
+pebblestone
+pebbleware
+pebbly
+pebrine
+pebrinous
+pecan
+peccability
+peccable
+peccadillo
+peccancy
+peccant
+peccantly
+peccantness
+peccary
+peccation
+peccavi
+pech
+pecht
+pecite
+peck
+pecked
+pecker
+peckerwood
+pecket
+peckful
+peckhamite
+peckiness
+peckish
+peckishly
+peckishness
+peckle
+peckled
+peckly
+Pecksniffian
+Pecksniffianism
+Pecksniffism
+pecky
+Pecopteris
+pecopteroid
+Pecora
+Pecos
+pectase
+pectate
+pecten
+pectic
+pectin
+Pectinacea
+pectinacean
+pectinaceous
+pectinal
+pectinase
+pectinate
+pectinated
+pectinately
+pectination
+pectinatodenticulate
+pectinatofimbricate
+pectinatopinnate
+pectineal
+pectineus
+pectinibranch
+Pectinibranchia
+pectinibranchian
+Pectinibranchiata
+pectinibranchiate
+pectinic
+pectinid
+Pectinidae
+pectiniferous
+pectiniform
+pectinirostrate
+pectinite
+pectinogen
+pectinoid
+pectinose
+pectinous
+pectizable
+pectization
+pectize
+pectocellulose
+pectolite
+pectora
+pectoral
+pectoralgia
+pectoralis
+pectoralist
+pectorally
+pectoriloquial
+pectoriloquism
+pectoriloquous
+pectoriloquy
+pectosase
+pectose
+pectosic
+pectosinase
+pectous
+pectunculate
+Pectunculus
+pectus
+peculate
+peculation
+peculator
+peculiar
+peculiarism
+peculiarity
+peculiarize
+peculiarly
+peculiarness
+peculiarsome
+peculium
+pecuniarily
+pecuniary
+pecuniosity
+pecunious
+ped
+peda
+pedage
+pedagog
+pedagogal
+pedagogic
+pedagogical
+pedagogically
+pedagogics
+pedagogism
+pedagogist
+pedagogue
+pedagoguery
+pedagoguish
+pedagoguism
+pedagogy
+pedal
+pedaler
+pedalfer
+pedalferic
+Pedaliaceae
+pedaliaceous
+pedalian
+pedalier
+Pedalion
+pedalism
+pedalist
+pedaliter
+pedality
+Pedalium
+pedanalysis
+pedant
+pedantesque
+pedantess
+pedanthood
+pedantic
+pedantical
+pedantically
+pedanticalness
+pedanticism
+pedanticly
+pedanticness
+pedantism
+pedantize
+pedantocracy
+pedantocrat
+pedantocratic
+pedantry
+pedary
+Pedata
+pedate
+pedated
+pedately
+pedatifid
+pedatiform
+pedatilobate
+pedatilobed
+pedatinerved
+pedatipartite
+pedatisect
+pedatisected
+pedatrophia
+pedder
+peddle
+peddler
+peddleress
+peddlerism
+peddlery
+peddling
+peddlingly
+pedee
+pedelion
+pederast
+pederastic
+pederastically
+pederasty
+pedes
+pedesis
+pedestal
+pedestrial
+pedestrially
+pedestrian
+pedestrianate
+pedestrianism
+pedestrianize
+pedetentous
+Pedetes
+Pedetidae
+Pedetinae
+pediadontia
+pediadontic
+pediadontist
+pedialgia
+Pediastrum
+pediatric
+pediatrician
+pediatrics
+pediatrist
+pediatry
+pedicab
+pedicel
+pediceled
+pedicellar
+pedicellaria
+pedicellate
+pedicellated
+pedicellation
+pedicelled
+pedicelliform
+Pedicellina
+pedicellus
+pedicle
+pedicular
+Pedicularia
+Pedicularis
+pediculate
+pediculated
+Pediculati
+pedicule
+Pediculi
+pediculicidal
+pediculicide
+pediculid
+Pediculidae
+Pediculina
+pediculine
+pediculofrontal
+pediculoid
+pediculoparietal
+pediculophobia
+pediculosis
+pediculous
+Pediculus
+pedicure
+pedicurism
+pedicurist
+pediferous
+pediform
+pedigerous
+pedigraic
+pedigree
+pedigreeless
+pediluvium
+Pedimana
+pedimanous
+pediment
+pedimental
+pedimented
+pedimentum
+Pedioecetes
+pedion
+pedionomite
+Pedionomus
+pedipalp
+pedipalpal
+pedipalpate
+Pedipalpi
+Pedipalpida
+pedipalpous
+pedipalpus
+pedipulate
+pedipulation
+pedipulator
+pedlar
+pedlary
+pedobaptism
+pedobaptist
+pedocal
+pedocalcic
+pedodontia
+pedodontic
+pedodontist
+pedodontology
+pedograph
+pedological
+pedologist
+pedologistical
+pedologistically
+pedology
+pedometer
+pedometric
+pedometrical
+pedometrically
+pedometrician
+pedometrist
+pedomorphic
+pedomorphism
+pedomotive
+pedomotor
+pedophilia
+pedophilic
+pedotribe
+pedotrophic
+pedotrophist
+pedotrophy
+pedrail
+pedregal
+pedrero
+Pedro
+pedro
+pedule
+pedum
+peduncle
+peduncled
+peduncular
+Pedunculata
+pedunculate
+pedunculated
+pedunculation
+pedunculus
+pee
+peed
+peek
+peekaboo
+peel
+peelable
+peele
+peeled
+peeledness
+peeler
+peelhouse
+peeling
+Peelism
+Peelite
+peelman
+peen
+peenge
+peeoy
+peep
+peeper
+peepeye
+peephole
+peepy
+peer
+peerage
+peerdom
+peeress
+peerhood
+peerie
+peeringly
+peerless
+peerlessly
+peerlessness
+peerling
+peerly
+peership
+peery
+peesash
+peesoreh
+peesweep
+peetweet
+peeve
+peeved
+peevedly
+peevedness
+peever
+peevish
+peevishly
+peevishness
+peewee
+Peg
+peg
+pega
+pegall
+peganite
+Peganum
+Pegasean
+Pegasian
+Pegasid
+pegasid
+Pegasidae
+pegasoid
+Pegasus
+pegboard
+pegbox
+pegged
+pegger
+pegging
+peggle
+Peggy
+peggy
+pegless
+peglet
+peglike
+pegman
+pegmatite
+pegmatitic
+pegmatization
+pegmatize
+pegmatoid
+pegmatophyre
+pegology
+pegomancy
+Peguan
+pegwood
+Pehlevi
+peho
+Pehuenche
+peignoir
+peine
+peirameter
+peirastic
+peirastically
+peisage
+peise
+peiser
+Peitho
+peixere
+pejorate
+pejoration
+pejorationist
+pejorative
+pejoratively
+pejorism
+pejorist
+pejority
+pekan
+Pekin
+pekin
+Peking
+Pekingese
+pekoe
+peladic
+pelage
+pelagial
+Pelagian
+pelagian
+Pelagianism
+Pelagianize
+Pelagianizer
+pelagic
+Pelagothuria
+pelamyd
+pelanos
+Pelargi
+pelargic
+Pelargikon
+pelargomorph
+Pelargomorphae
+pelargomorphic
+pelargonate
+pelargonic
+pelargonidin
+pelargonin
+pelargonium
+Pelasgi
+Pelasgian
+Pelasgic
+Pelasgikon
+Pelasgoi
+Pele
+pelean
+pelecan
+Pelecani
+Pelecanidae
+Pelecaniformes
+Pelecanoides
+Pelecanoidinae
+Pelecanus
+pelecypod
+Pelecypoda
+pelecypodous
+pelelith
+pelerine
+Peleus
+Pelew
+pelf
+Pelias
+pelican
+pelicanry
+pelick
+pelicometer
+Pelides
+Pelidnota
+pelike
+peliom
+pelioma
+peliosis
+pelisse
+pelite
+pelitic
+pell
+Pellaea
+pellage
+pellagra
+pellagragenic
+pellagrin
+pellagrose
+pellagrous
+pellar
+pellard
+pellas
+pellate
+pellation
+peller
+pellet
+pelleted
+pelletierine
+pelletlike
+pellety
+Pellian
+pellicle
+pellicula
+pellicular
+pellicularia
+pelliculate
+pellicule
+pellile
+pellitory
+pellmell
+pellock
+pellotine
+pellucent
+pellucid
+pellucidity
+pellucidly
+pellucidness
+Pelmanism
+Pelmanist
+Pelmanize
+pelmatic
+pelmatogram
+Pelmatozoa
+pelmatozoan
+pelmatozoic
+pelmet
+Pelobates
+pelobatid
+Pelobatidae
+pelobatoid
+Pelodytes
+pelodytid
+Pelodytidae
+pelodytoid
+Pelomedusa
+pelomedusid
+Pelomedusidae
+pelomedusoid
+Pelomyxa
+pelon
+Pelopaeus
+Pelopid
+Pelopidae
+Peloponnesian
+Pelops
+peloria
+pelorian
+peloriate
+peloric
+pelorism
+pelorization
+pelorize
+pelorus
+pelota
+pelotherapy
+peloton
+pelt
+pelta
+Peltandra
+peltast
+peltate
+peltated
+peltately
+peltatifid
+peltation
+peltatodigitate
+pelter
+pelterer
+peltiferous
+peltifolious
+peltiform
+Peltigera
+Peltigeraceae
+peltigerine
+peltigerous
+peltinerved
+pelting
+peltingly
+peltless
+peltmonger
+Peltogaster
+peltry
+pelu
+peludo
+Pelusios
+pelveoperitonitis
+pelves
+Pelvetia
+pelvic
+pelviform
+pelvigraph
+pelvigraphy
+pelvimeter
+pelvimetry
+pelviolithotomy
+pelvioperitonitis
+pelvioplasty
+pelvioradiography
+pelvioscopy
+pelviotomy
+pelviperitonitis
+pelvirectal
+pelvis
+pelvisacral
+pelvisternal
+pelvisternum
+pelycogram
+pelycography
+pelycology
+pelycometer
+pelycometry
+pelycosaur
+Pelycosauria
+pelycosaurian
+pembina
+Pembroke
+pemican
+pemmican
+pemmicanization
+pemmicanize
+pemphigoid
+pemphigous
+pemphigus
+pen
+penacute
+Penaea
+Penaeaceae
+penaeaceous
+penal
+penalist
+penality
+penalizable
+penalization
+penalize
+penally
+penalty
+penance
+penanceless
+penang
+penannular
+penates
+penbard
+pencatite
+pence
+pencel
+penceless
+penchant
+penchute
+pencil
+penciled
+penciler
+penciliform
+penciling
+pencilled
+penciller
+pencillike
+pencilling
+pencilry
+pencilwood
+pencraft
+pend
+penda
+pendant
+pendanted
+pendanting
+pendantlike
+pendecagon
+pendeloque
+pendency
+pendent
+pendentive
+pendently
+pendicle
+pendicler
+pending
+pendle
+pendom
+pendragon
+pendragonish
+pendragonship
+pendulant
+pendular
+pendulate
+pendulation
+pendule
+penduline
+pendulosity
+pendulous
+pendulously
+pendulousness
+pendulum
+pendulumlike
+Penelope
+Penelopean
+Penelophon
+Penelopinae
+penelopine
+peneplain
+peneplanation
+peneplane
+peneseismic
+penetrability
+penetrable
+penetrableness
+penetrably
+penetral
+penetralia
+penetralian
+penetrance
+penetrancy
+penetrant
+penetrate
+penetrating
+penetratingly
+penetratingness
+penetration
+penetrative
+penetratively
+penetrativeness
+penetrativity
+penetrator
+penetrology
+penetrometer
+penfieldite
+penfold
+penful
+penghulu
+pengo
+penguin
+penguinery
+penhead
+penholder
+penial
+penicillate
+penicillated
+penicillately
+penicillation
+penicilliform
+penicillin
+Penicillium
+penide
+penile
+peninsula
+peninsular
+peninsularism
+peninsularity
+peninsulate
+penintime
+peninvariant
+penis
+penistone
+penitence
+penitencer
+penitent
+Penitentes
+penitential
+penitentially
+penitentiary
+penitentiaryship
+penitently
+penk
+penkeeper
+penknife
+penlike
+penmaker
+penmaking
+penman
+penmanship
+penmaster
+penna
+pennaceous
+Pennacook
+pennae
+pennage
+Pennales
+pennant
+Pennaria
+Pennariidae
+Pennatae
+pennate
+pennated
+pennatifid
+pennatilobate
+pennatipartite
+pennatisect
+pennatisected
+Pennatula
+Pennatulacea
+pennatulacean
+pennatulaceous
+pennatularian
+pennatulid
+Pennatulidae
+pennatuloid
+penneech
+penneeck
+penner
+pennet
+penni
+pennia
+pennied
+penniferous
+penniform
+pennigerous
+penniless
+pennilessly
+pennilessness
+pennill
+penninervate
+penninerved
+penning
+penninite
+pennipotent
+Pennisetum
+penniveined
+pennon
+pennoned
+pennopluma
+pennoplume
+pennorth
+Pennsylvania
+Pennsylvanian
+Penny
+penny
+pennybird
+pennycress
+pennyearth
+pennyflower
+pennyhole
+pennyleaf
+pennyrot
+pennyroyal
+pennysiller
+pennystone
+pennyweight
+pennywinkle
+pennywort
+pennyworth
+Penobscot
+penologic
+penological
+penologist
+penology
+penorcon
+penrack
+penroseite
+Pensacola
+penscript
+penseful
+pensefulness
+penship
+pensile
+pensileness
+pensility
+pension
+pensionable
+pensionably
+pensionary
+pensioner
+pensionership
+pensionless
+pensive
+pensived
+pensively
+pensiveness
+penster
+penstick
+penstock
+pensum
+pensy
+pent
+penta
+pentabasic
+pentabromide
+pentacapsular
+pentacarbon
+pentacarbonyl
+pentacarpellary
+pentace
+pentacetate
+pentachenium
+pentachloride
+pentachord
+pentachromic
+pentacid
+pentacle
+pentacoccous
+pentacontane
+pentacosane
+Pentacrinidae
+pentacrinite
+pentacrinoid
+Pentacrinus
+pentacron
+pentacrostic
+pentactinal
+pentactine
+pentacular
+pentacyanic
+pentacyclic
+pentad
+pentadactyl
+Pentadactyla
+pentadactylate
+pentadactyle
+pentadactylism
+pentadactyloid
+pentadecagon
+pentadecahydrate
+pentadecahydrated
+pentadecane
+pentadecatoic
+pentadecoic
+pentadecyl
+pentadecylic
+pentadelphous
+pentadicity
+pentadiene
+pentadodecahedron
+pentadrachm
+pentadrachma
+pentaerythrite
+pentaerythritol
+pentafid
+pentafluoride
+pentagamist
+pentaglossal
+pentaglot
+pentaglottical
+pentagon
+pentagonal
+pentagonally
+pentagonohedron
+pentagonoid
+pentagram
+pentagrammatic
+pentagyn
+Pentagynia
+pentagynian
+pentagynous
+pentahalide
+pentahedral
+pentahedrical
+pentahedroid
+pentahedron
+pentahedrous
+pentahexahedral
+pentahexahedron
+pentahydrate
+pentahydrated
+pentahydric
+pentahydroxy
+pentail
+pentaiodide
+pentalobate
+pentalogue
+pentalogy
+pentalpha
+Pentamera
+pentameral
+pentameran
+pentamerid
+Pentameridae
+pentamerism
+pentameroid
+pentamerous
+Pentamerus
+pentameter
+pentamethylene
+pentamethylenediamine
+pentametrist
+pentametrize
+pentander
+Pentandria
+pentandrian
+pentandrous
+pentane
+pentanedione
+pentangle
+pentangular
+pentanitrate
+pentanoic
+pentanolide
+pentanone
+pentapetalous
+Pentaphylacaceae
+pentaphylacaceous
+Pentaphylax
+pentaphyllous
+pentaploid
+pentaploidic
+pentaploidy
+pentapody
+pentapolis
+pentapolitan
+pentapterous
+pentaptote
+pentaptych
+pentaquine
+pentarch
+pentarchical
+pentarchy
+pentasepalous
+pentasilicate
+pentaspermous
+pentaspheric
+pentaspherical
+pentastich
+pentastichous
+pentastichy
+pentastome
+Pentastomida
+pentastomoid
+pentastomous
+Pentastomum
+pentastyle
+pentastylos
+pentasulphide
+pentasyllabic
+pentasyllabism
+pentasyllable
+Pentateuch
+Pentateuchal
+pentateuchal
+pentathionate
+pentathionic
+pentathlete
+pentathlon
+pentathlos
+pentatomic
+pentatomid
+Pentatomidae
+Pentatomoidea
+pentatone
+pentatonic
+pentatriacontane
+pentavalence
+pentavalency
+pentavalent
+penteconter
+pentecontoglossal
+Pentecost
+Pentecostal
+pentecostal
+pentecostalism
+pentecostalist
+pentecostarion
+pentecoster
+pentecostys
+Pentelic
+Pentelican
+pentene
+penteteric
+penthemimer
+penthemimeral
+penthemimeris
+Penthestes
+penthiophen
+penthiophene
+Penthoraceae
+Penthorum
+penthouse
+penthouselike
+penthrit
+penthrite
+pentimento
+pentine
+pentiodide
+pentit
+pentite
+pentitol
+pentlandite
+pentobarbital
+pentode
+pentoic
+pentol
+pentosan
+pentosane
+pentose
+pentoside
+pentosuria
+pentoxide
+pentremital
+pentremite
+Pentremites
+Pentremitidae
+pentrit
+pentrite
+pentrough
+Pentstemon
+pentstock
+penttail
+pentyl
+pentylene
+pentylic
+pentylidene
+pentyne
+Pentzia
+penuchi
+penult
+penultima
+penultimate
+penultimatum
+penumbra
+penumbrae
+penumbral
+penumbrous
+penurious
+penuriously
+penuriousness
+penury
+Penutian
+penwiper
+penwoman
+penwomanship
+penworker
+penwright
+peon
+peonage
+peonism
+peony
+people
+peopledom
+peoplehood
+peopleize
+peopleless
+peopler
+peoplet
+peoplish
+Peoria
+Peorian
+peotomy
+pep
+peperine
+peperino
+Peperomia
+pepful
+Pephredo
+pepinella
+pepino
+peplos
+peplosed
+peplum
+peplus
+pepo
+peponida
+peponium
+pepper
+pepperbox
+peppercorn
+peppercornish
+peppercorny
+pepperer
+peppergrass
+pepperidge
+pepperily
+pepperiness
+pepperish
+pepperishly
+peppermint
+pepperoni
+pepperproof
+pepperroot
+pepperweed
+pepperwood
+pepperwort
+peppery
+peppily
+peppin
+peppiness
+peppy
+pepsin
+pepsinate
+pepsinhydrochloric
+pepsiniferous
+pepsinogen
+pepsinogenic
+pepsinogenous
+pepsis
+peptic
+peptical
+pepticity
+peptidase
+peptide
+peptizable
+peptization
+peptize
+peptizer
+peptogaster
+peptogenic
+peptogenous
+peptogeny
+peptohydrochloric
+peptolysis
+peptolytic
+peptonaemia
+peptonate
+peptone
+peptonemia
+peptonic
+peptonization
+peptonize
+peptonizer
+peptonoid
+peptonuria
+peptotoxine
+Pepysian
+Pequot
+Per
+per
+Peracarida
+peracephalus
+peracetate
+peracetic
+peracid
+peracidite
+peract
+peracute
+peradventure
+peragrate
+peragration
+Perakim
+peramble
+perambulant
+perambulate
+perambulation
+perambulator
+perambulatory
+Perameles
+Peramelidae
+perameline
+perameloid
+Peramium
+Peratae
+Perates
+perbend
+perborate
+perborax
+perbromide
+Perca
+percale
+percaline
+percarbide
+percarbonate
+percarbonic
+perceivability
+perceivable
+perceivableness
+perceivably
+perceivance
+perceivancy
+perceive
+perceivedly
+perceivedness
+perceiver
+perceiving
+perceivingness
+percent
+percentable
+percentably
+percentage
+percentaged
+percental
+percentile
+percentual
+percept
+perceptibility
+perceptible
+perceptibleness
+perceptibly
+perception
+perceptional
+perceptionalism
+perceptionism
+perceptive
+perceptively
+perceptiveness
+perceptivity
+perceptual
+perceptually
+Percesoces
+percesocine
+Perceval
+perch
+percha
+perchable
+perchance
+percher
+Percheron
+perchlorate
+perchlorethane
+perchlorethylene
+perchloric
+perchloride
+perchlorinate
+perchlorination
+perchloroethane
+perchloroethylene
+perchromate
+perchromic
+percid
+Percidae
+perciform
+Perciformes
+percipience
+percipiency
+percipient
+Percival
+perclose
+percnosome
+percoct
+percoid
+Percoidea
+percoidean
+percolable
+percolate
+percolation
+percolative
+percolator
+percomorph
+Percomorphi
+percomorphous
+percompound
+percontation
+percontatorial
+percribrate
+percribration
+percrystallization
+perculsion
+perculsive
+percur
+percurration
+percurrent
+percursory
+percuss
+percussion
+percussional
+percussioner
+percussionist
+percussionize
+percussive
+percussively
+percussiveness
+percussor
+percutaneous
+percutaneously
+percutient
+Percy
+percylite
+Perdicinae
+perdicine
+perdition
+perditionable
+Perdix
+perdricide
+perdu
+perduellion
+perdurability
+perdurable
+perdurableness
+perdurably
+perdurance
+perdurant
+perdure
+perduring
+perduringly
+Perean
+peregrin
+peregrina
+peregrinate
+peregrination
+peregrinator
+peregrinatory
+peregrine
+peregrinity
+peregrinoid
+pereion
+pereiopod
+pereira
+pereirine
+peremptorily
+peremptoriness
+peremptory
+perendinant
+perendinate
+perendination
+perendure
+perennate
+perennation
+perennial
+perenniality
+perennialize
+perennially
+perennibranch
+Perennibranchiata
+perennibranchiate
+perequitate
+peres
+Pereskia
+perezone
+perfect
+perfectation
+perfected
+perfectedly
+perfecter
+perfecti
+perfectibilian
+perfectibilism
+perfectibilist
+perfectibilitarian
+perfectibility
+perfectible
+perfecting
+perfection
+perfectionate
+perfectionation
+perfectionator
+perfectioner
+perfectionism
+perfectionist
+perfectionistic
+perfectionize
+perfectionizement
+perfectionizer
+perfectionment
+perfectism
+perfectist
+perfective
+perfectively
+perfectiveness
+perfectivity
+perfectivize
+perfectly
+perfectness
+perfecto
+perfector
+perfectuation
+perfervent
+perfervid
+perfervidity
+perfervidly
+perfervidness
+perfervor
+perfervour
+perfidious
+perfidiously
+perfidiousness
+perfidy
+perfilograph
+perflate
+perflation
+perfluent
+perfoliate
+perfoliation
+perforable
+perforant
+Perforata
+perforate
+perforated
+perforation
+perforationproof
+perforative
+perforator
+perforatorium
+perforatory
+perforce
+perforcedly
+perform
+performable
+performance
+performant
+performative
+performer
+perfrication
+perfumatory
+perfume
+perfumed
+perfumeless
+perfumer
+perfumeress
+perfumery
+perfumy
+perfunctionary
+perfunctorily
+perfunctoriness
+perfunctorious
+perfunctoriously
+perfunctorize
+perfunctory
+perfuncturate
+perfusate
+perfuse
+perfusion
+perfusive
+Pergamene
+pergameneous
+Pergamenian
+pergamentaceous
+Pergamic
+pergamyn
+pergola
+perhalide
+perhalogen
+perhaps
+perhazard
+perhorresce
+perhydroanthracene
+perhydrogenate
+perhydrogenation
+perhydrogenize
+peri
+periacinal
+periacinous
+periactus
+periadenitis
+periamygdalitis
+perianal
+periangiocholitis
+periangioma
+periangitis
+perianth
+perianthial
+perianthium
+periaortic
+periaortitis
+periapical
+periappendicitis
+periappendicular
+periapt
+Periarctic
+periareum
+periarterial
+periarteritis
+periarthric
+periarthritis
+periarticular
+periaster
+periastral
+periastron
+periastrum
+periatrial
+periauricular
+periaxial
+periaxillary
+periaxonal
+periblast
+periblastic
+periblastula
+periblem
+peribolos
+peribolus
+peribranchial
+peribronchial
+peribronchiolar
+peribronchiolitis
+peribronchitis
+peribulbar
+peribursal
+pericaecal
+pericaecitis
+pericanalicular
+pericapsular
+pericardia
+pericardiac
+pericardiacophrenic
+pericardial
+pericardicentesis
+pericardiectomy
+pericardiocentesis
+pericardiolysis
+pericardiomediastinitis
+pericardiophrenic
+pericardiopleural
+pericardiorrhaphy
+pericardiosymphysis
+pericardiotomy
+pericarditic
+pericarditis
+pericardium
+pericardotomy
+pericarp
+pericarpial
+pericarpic
+pericarpium
+pericarpoidal
+pericecal
+pericecitis
+pericellular
+pericemental
+pericementitis
+pericementoclasia
+pericementum
+pericenter
+pericentral
+pericentric
+pericephalic
+pericerebral
+perichaete
+perichaetial
+perichaetium
+perichete
+pericholangitis
+pericholecystitis
+perichondral
+perichondrial
+perichondritis
+perichondrium
+perichord
+perichordal
+perichoresis
+perichorioidal
+perichoroidal
+perichylous
+pericladium
+periclase
+periclasia
+periclasite
+periclaustral
+Periclean
+Pericles
+periclinal
+periclinally
+pericline
+periclinium
+periclitate
+periclitation
+pericolitis
+pericolpitis
+periconchal
+periconchitis
+pericopal
+pericope
+pericopic
+pericorneal
+pericowperitis
+pericoxitis
+pericranial
+pericranitis
+pericranium
+pericristate
+Pericu
+periculant
+pericycle
+pericycloid
+pericyclone
+pericyclonic
+pericystic
+pericystitis
+pericystium
+pericytial
+peridendritic
+peridental
+peridentium
+peridentoclasia
+periderm
+peridermal
+peridermic
+Peridermium
+peridesm
+peridesmic
+peridesmitis
+peridesmium
+peridial
+peridiastole
+peridiastolic
+perididymis
+perididymitis
+peridiiform
+Peridineae
+Peridiniaceae
+peridiniaceous
+peridinial
+Peridiniales
+peridinian
+peridinid
+Peridinidae
+Peridinieae
+Peridiniidae
+Peridinium
+peridiole
+peridiolum
+peridium
+peridot
+peridotic
+peridotite
+peridotitic
+periductal
+periegesis
+periegetic
+perielesis
+periencephalitis
+perienteric
+perienteritis
+perienteron
+periependymal
+periesophageal
+periesophagitis
+perifistular
+perifoliary
+perifollicular
+perifolliculitis
+perigangliitis
+periganglionic
+perigastric
+perigastritis
+perigastrula
+perigastrular
+perigastrulation
+perigeal
+perigee
+perigemmal
+perigenesis
+perigenital
+perigeum
+periglandular
+perigloea
+periglottic
+periglottis
+perignathic
+perigon
+perigonadial
+perigonal
+perigone
+perigonial
+perigonium
+perigraph
+perigraphic
+perigynial
+perigynium
+perigynous
+perigyny
+perihelial
+perihelian
+perihelion
+perihelium
+perihepatic
+perihepatitis
+perihermenial
+perihernial
+perihysteric
+perijejunitis
+perijove
+perikaryon
+perikronion
+peril
+perilabyrinth
+perilabyrinthitis
+perilaryngeal
+perilaryngitis
+perilenticular
+periligamentous
+Perilla
+perilless
+perilobar
+perilous
+perilously
+perilousness
+perilsome
+perilymph
+perilymphangial
+perilymphangitis
+perilymphatic
+perimartium
+perimastitis
+perimedullary
+perimeningitis
+perimeter
+perimeterless
+perimetral
+perimetric
+perimetrical
+perimetrically
+perimetritic
+perimetritis
+perimetrium
+perimetry
+perimorph
+perimorphic
+perimorphism
+perimorphous
+perimyelitis
+perimysial
+perimysium
+perine
+perineal
+perineocele
+perineoplastic
+perineoplasty
+perineorrhaphy
+perineoscrotal
+perineostomy
+perineosynthesis
+perineotomy
+perineovaginal
+perineovulvar
+perinephral
+perinephrial
+perinephric
+perinephritic
+perinephritis
+perinephrium
+perineptunium
+perineum
+perineural
+perineurial
+perineuritis
+perineurium
+perinium
+perinuclear
+periocular
+period
+periodate
+periodic
+periodical
+periodicalism
+periodicalist
+periodicalize
+periodically
+periodicalness
+periodicity
+periodide
+periodize
+periodogram
+periodograph
+periodology
+periodontal
+periodontia
+periodontic
+periodontist
+periodontitis
+periodontium
+periodontoclasia
+periodontologist
+periodontology
+periodontum
+periodoscope
+perioeci
+perioecians
+perioecic
+perioecid
+perioecus
+perioesophageal
+perioikoi
+periomphalic
+perionychia
+perionychium
+perionyx
+perionyxis
+perioophoritis
+periophthalmic
+periophthalmitis
+periople
+perioplic
+perioptic
+perioptometry
+perioral
+periorbit
+periorbita
+periorbital
+periorchitis
+periost
+periostea
+periosteal
+periosteitis
+periosteoalveolar
+periosteoma
+periosteomedullitis
+periosteomyelitis
+periosteophyte
+periosteorrhaphy
+periosteotome
+periosteotomy
+periosteous
+periosteum
+periostitic
+periostitis
+periostoma
+periostosis
+periostotomy
+periostracal
+periostracum
+periotic
+periovular
+peripachymeningitis
+peripancreatic
+peripancreatitis
+peripapillary
+Peripatetic
+peripatetic
+peripatetical
+peripatetically
+peripateticate
+Peripateticism
+Peripatidae
+Peripatidea
+peripatize
+peripatoid
+Peripatopsidae
+Peripatopsis
+Peripatus
+peripenial
+peripericarditis
+peripetalous
+peripetasma
+peripeteia
+peripetia
+peripety
+periphacitis
+peripharyngeal
+peripherad
+peripheral
+peripherally
+peripherial
+peripheric
+peripherical
+peripherically
+peripherocentral
+peripheroceptor
+peripheromittor
+peripheroneural
+peripherophose
+periphery
+periphlebitic
+periphlebitis
+periphractic
+periphrase
+periphrases
+periphrasis
+periphrastic
+periphrastical
+periphrastically
+periphraxy
+periphyllum
+periphyse
+periphysis
+Periplaneta
+periplasm
+periplast
+periplastic
+periplegmatic
+peripleural
+peripleuritis
+Periploca
+periplus
+peripneumonia
+peripneumonic
+peripneumony
+peripneustic
+peripolar
+peripolygonal
+periportal
+periproct
+periproctal
+periproctitis
+periproctous
+periprostatic
+periprostatitis
+peripteral
+peripterous
+periptery
+peripylephlebitis
+peripyloric
+perique
+perirectal
+perirectitis
+perirenal
+perisalpingitis
+perisarc
+perisarcal
+perisarcous
+perisaturnium
+periscian
+periscians
+periscii
+perisclerotic
+periscopal
+periscope
+periscopic
+periscopical
+periscopism
+perish
+perishability
+perishable
+perishableness
+perishably
+perished
+perishing
+perishingly
+perishless
+perishment
+perisigmoiditis
+perisinuitis
+perisinuous
+perisinusitis
+perisoma
+perisomal
+perisomatic
+perisome
+perisomial
+perisperm
+perispermal
+perispermatitis
+perispermic
+perisphere
+perispheric
+perispherical
+perisphinctean
+Perisphinctes
+Perisphinctidae
+perisphinctoid
+perisplanchnic
+perisplanchnitis
+perisplenetic
+perisplenic
+perisplenitis
+perispome
+perispomenon
+perispondylic
+perispondylitis
+perispore
+Perisporiaceae
+perisporiaceous
+Perisporiales
+perissad
+perissodactyl
+Perissodactyla
+perissodactylate
+perissodactyle
+perissodactylic
+perissodactylism
+perissodactylous
+perissologic
+perissological
+perissology
+perissosyllabic
+peristalith
+peristalsis
+peristaltic
+peristaltically
+peristaphyline
+peristaphylitis
+peristele
+peristerite
+peristeromorph
+Peristeromorphae
+peristeromorphic
+peristeromorphous
+peristeronic
+peristerophily
+peristeropod
+peristeropodan
+peristeropode
+Peristeropodes
+peristeropodous
+peristethium
+peristole
+peristoma
+peristomal
+peristomatic
+peristome
+peristomial
+peristomium
+peristrephic
+peristrephical
+peristrumitis
+peristrumous
+peristylar
+peristyle
+peristylium
+peristylos
+peristylum
+perisynovial
+perisystole
+perisystolic
+perit
+perite
+peritectic
+peritendineum
+peritenon
+perithece
+perithecial
+perithecium
+perithelial
+perithelioma
+perithelium
+perithoracic
+perithyreoiditis
+perithyroiditis
+peritomize
+peritomous
+peritomy
+peritoneal
+peritonealgia
+peritoneally
+peritoneocentesis
+peritoneoclysis
+peritoneomuscular
+peritoneopathy
+peritoneopericardial
+peritoneopexy
+peritoneoplasty
+peritoneoscope
+peritoneoscopy
+peritoneotomy
+peritoneum
+peritonism
+peritonital
+peritonitic
+peritonitis
+peritonsillar
+peritonsillitis
+peritracheal
+peritrema
+peritrematous
+peritreme
+peritrich
+Peritricha
+peritrichan
+peritrichic
+peritrichous
+peritrichously
+peritroch
+peritrochal
+peritrochanteric
+peritrochium
+peritrochoid
+peritropal
+peritrophic
+peritropous
+perityphlic
+perityphlitic
+perityphlitis
+periumbilical
+periungual
+periuranium
+periureteric
+periureteritis
+periurethral
+periurethritis
+periuterine
+periuvular
+perivaginal
+perivaginitis
+perivascular
+perivasculitis
+perivenous
+perivertebral
+perivesical
+perivisceral
+perivisceritis
+perivitellin
+perivitelline
+periwig
+periwigpated
+periwinkle
+periwinkled
+periwinkler
+perizonium
+perjink
+perjinkety
+perjinkities
+perjinkly
+perjure
+perjured
+perjuredly
+perjuredness
+perjurer
+perjuress
+perjurious
+perjuriously
+perjuriousness
+perjurous
+perjury
+perjurymonger
+perjurymongering
+perk
+perkily
+Perkin
+perkin
+perkiness
+perking
+perkingly
+perkish
+perknite
+perky
+Perla
+perlaceous
+Perlaria
+perle
+perlection
+perlid
+Perlidae
+perligenous
+perlingual
+perlingually
+perlite
+perlitic
+perloir
+perlustrate
+perlustration
+perlustrator
+perm
+permafrost
+Permalloy
+permalloy
+permanence
+permanency
+permanent
+permanently
+permanentness
+permanganate
+permanganic
+permansive
+permeability
+permeable
+permeableness
+permeably
+permeameter
+permeance
+permeant
+permeate
+permeation
+permeative
+permeator
+Permiak
+Permian
+permillage
+permirific
+permissibility
+permissible
+permissibleness
+permissibly
+permission
+permissioned
+permissive
+permissively
+permissiveness
+permissory
+permit
+permittable
+permitted
+permittedly
+permittee
+permitter
+permittivity
+permixture
+Permocarboniferous
+permonosulphuric
+permoralize
+permutability
+permutable
+permutableness
+permutably
+permutate
+permutation
+permutational
+permutationist
+permutator
+permutatorial
+permutatory
+permute
+permuter
+pern
+pernancy
+pernasal
+pernavigate
+Pernettia
+pernicious
+perniciously
+perniciousness
+pernicketiness
+pernickety
+pernine
+Pernis
+pernitrate
+pernitric
+pernoctation
+pernor
+pernyi
+peroba
+perobrachius
+perocephalus
+perochirus
+perodactylus
+Perodipus
+Perognathinae
+Perognathus
+Peromedusae
+Peromela
+peromelous
+peromelus
+Peromyscus
+peronate
+peroneal
+peroneocalcaneal
+peroneotarsal
+peroneotibial
+peronial
+peronium
+Peronospora
+Peronosporaceae
+peronosporaceous
+Peronosporales
+peropod
+Peropoda
+peropodous
+peropus
+peroral
+perorally
+perorate
+peroration
+perorational
+perorative
+perorator
+peroratorical
+peroratorically
+peroratory
+perosis
+perosmate
+perosmic
+perosomus
+perotic
+perovskite
+peroxidase
+peroxidate
+peroxidation
+peroxide
+peroxidic
+peroxidize
+peroxidizement
+peroxy
+peroxyl
+perozonid
+perozonide
+perpend
+perpendicular
+perpendicularity
+perpendicularly
+perpera
+perperfect
+perpetrable
+perpetrate
+perpetration
+perpetrator
+perpetratress
+perpetratrix
+perpetuable
+perpetual
+perpetualism
+perpetualist
+perpetuality
+perpetually
+perpetualness
+perpetuana
+perpetuance
+perpetuant
+perpetuate
+perpetuation
+perpetuator
+perpetuity
+perplantar
+perplex
+perplexable
+perplexed
+perplexedly
+perplexedness
+perplexer
+perplexing
+perplexingly
+perplexity
+perplexment
+perplication
+perquadrat
+perquest
+perquisite
+perquisition
+perquisitor
+perradial
+perradially
+perradiate
+perradius
+perridiculous
+perrier
+Perrinist
+perron
+perruche
+perrukery
+perruthenate
+perruthenic
+Perry
+perry
+perryman
+Persae
+persalt
+perscent
+perscribe
+perscrutate
+perscrutation
+perscrutator
+perse
+Persea
+persecute
+persecutee
+persecuting
+persecutingly
+persecution
+persecutional
+persecutive
+persecutiveness
+persecutor
+persecutory
+persecutress
+persecutrix
+Perseid
+perseite
+perseitol
+perseity
+persentiscency
+Persephassa
+Persepolitan
+perseverance
+perseverant
+perseverate
+perseveration
+persevere
+persevering
+perseveringly
+Persian
+Persianist
+Persianization
+Persianize
+Persic
+Persicaria
+persicary
+Persicize
+persico
+persicot
+persienne
+persiennes
+persiflage
+persiflate
+persilicic
+persimmon
+Persis
+persis
+Persism
+persist
+persistence
+persistency
+persistent
+persistently
+persister
+persisting
+persistingly
+persistive
+persistively
+persistiveness
+persnickety
+person
+persona
+personable
+personableness
+personably
+personage
+personal
+personalia
+personalism
+personalist
+personalistic
+personality
+personalization
+personalize
+personally
+personalness
+personalty
+personate
+personately
+personating
+personation
+personative
+personator
+personed
+personeity
+personifiable
+personifiant
+personification
+personificative
+personificator
+personifier
+personify
+personization
+personize
+personnel
+personship
+perspection
+perspective
+perspectived
+perspectiveless
+perspectively
+perspectivity
+perspectograph
+perspectometer
+perspicacious
+perspicaciously
+perspicaciousness
+perspicacity
+perspicuity
+perspicuous
+perspicuously
+perspicuousness
+perspirability
+perspirable
+perspirant
+perspirate
+perspiration
+perspirative
+perspiratory
+perspire
+perspiringly
+perspiry
+perstringe
+perstringement
+persuadability
+persuadable
+persuadableness
+persuadably
+persuade
+persuaded
+persuadedly
+persuadedness
+persuader
+persuadingly
+persuasibility
+persuasible
+persuasibleness
+persuasibly
+persuasion
+persuasive
+persuasively
+persuasiveness
+persuasory
+persulphate
+persulphide
+persulphocyanate
+persulphocyanic
+persulphuric
+persymmetric
+persymmetrical
+pert
+pertain
+pertaining
+pertainment
+perten
+perthiocyanate
+perthiocyanic
+perthiotophyre
+perthite
+perthitic
+perthitically
+perthosite
+pertinacious
+pertinaciously
+pertinaciousness
+pertinacity
+pertinence
+pertinency
+pertinent
+pertinently
+pertinentness
+pertish
+pertly
+pertness
+perturb
+perturbability
+perturbable
+perturbance
+perturbancy
+perturbant
+perturbate
+perturbation
+perturbational
+perturbatious
+perturbative
+perturbator
+perturbatory
+perturbatress
+perturbatrix
+perturbed
+perturbedly
+perturbedness
+perturber
+perturbing
+perturbingly
+perturbment
+Pertusaria
+Pertusariaceae
+pertuse
+pertused
+pertusion
+pertussal
+pertussis
+perty
+Peru
+Perugian
+Peruginesque
+peruke
+perukeless
+perukier
+perukiership
+perula
+Perularia
+perulate
+perule
+Perun
+perusable
+perusal
+peruse
+peruser
+Peruvian
+Peruvianize
+pervade
+pervadence
+pervader
+pervading
+pervadingly
+pervadingness
+pervagate
+pervagation
+pervalvar
+pervasion
+pervasive
+pervasively
+pervasiveness
+perverse
+perversely
+perverseness
+perversion
+perversity
+perversive
+pervert
+perverted
+pervertedly
+pervertedness
+perverter
+pervertibility
+pervertible
+pervertibly
+pervertive
+perviability
+perviable
+pervicacious
+pervicaciously
+pervicaciousness
+pervicacity
+pervigilium
+pervious
+perviously
+perviousness
+pervulgate
+pervulgation
+perwitsky
+pes
+pesa
+Pesach
+pesade
+pesage
+Pesah
+peseta
+peshkar
+peshkash
+peshwa
+peshwaship
+peskily
+peskiness
+pesky
+peso
+pess
+pessary
+pessimal
+pessimism
+pessimist
+pessimistic
+pessimistically
+pessimize
+pessimum
+pessomancy
+pessoner
+pessular
+pessulus
+pest
+Pestalozzian
+Pestalozzianism
+peste
+pester
+pesterer
+pesteringly
+pesterment
+pesterous
+pestersome
+pestful
+pesthole
+pesthouse
+pesticidal
+pesticide
+pestiduct
+pestiferous
+pestiferously
+pestiferousness
+pestifugous
+pestify
+pestilence
+pestilenceweed
+pestilencewort
+pestilent
+pestilential
+pestilentially
+pestilentialness
+pestilently
+pestle
+pestological
+pestologist
+pestology
+pestproof
+pet
+petal
+petalage
+petaled
+Petalia
+petaliferous
+petaliform
+Petaliidae
+petaline
+petalism
+petalite
+petalled
+petalless
+petallike
+petalocerous
+petalodic
+petalodont
+petalodontid
+Petalodontidae
+petalodontoid
+Petalodus
+petalody
+petaloid
+petaloidal
+petaloideous
+petalomania
+petalon
+Petalostemon
+petalous
+petalwise
+petaly
+petard
+petardeer
+petardier
+petary
+Petasites
+petasos
+petasus
+petaurine
+petaurist
+Petaurista
+Petauristidae
+Petauroides
+Petaurus
+petchary
+petcock
+Pete
+pete
+peteca
+petechiae
+petechial
+petechiate
+peteman
+Peter
+peter
+Peterkin
+Peterloo
+peterman
+peternet
+petersham
+peterwort
+petful
+petiolar
+petiolary
+Petiolata
+petiolate
+petiolated
+petiole
+petioled
+Petioliventres
+petiolular
+petiolulate
+petiolule
+petiolus
+petit
+petite
+petiteness
+petitgrain
+petition
+petitionable
+petitional
+petitionarily
+petitionary
+petitionee
+petitioner
+petitionist
+petitionproof
+petitor
+petitory
+Petiveria
+Petiveriaceae
+petkin
+petling
+peto
+Petr
+Petrarchal
+Petrarchan
+Petrarchesque
+Petrarchian
+Petrarchianism
+Petrarchism
+Petrarchist
+Petrarchistic
+Petrarchistical
+Petrarchize
+petrary
+petre
+Petrea
+petrean
+petreity
+petrel
+petrescence
+petrescent
+Petricola
+Petricolidae
+petricolous
+petrie
+petrifaction
+petrifactive
+petrifiable
+petrific
+petrificant
+petrificate
+petrification
+petrified
+petrifier
+petrify
+Petrine
+Petrinism
+Petrinist
+Petrinize
+petrissage
+Petrobium
+Petrobrusian
+petrochemical
+petrochemistry
+Petrogale
+petrogenesis
+petrogenic
+petrogeny
+petroglyph
+petroglyphic
+petroglyphy
+petrograph
+petrographer
+petrographic
+petrographical
+petrographically
+petrography
+petrohyoid
+petrol
+petrolage
+petrolatum
+petrolean
+petrolene
+petroleous
+petroleum
+petrolic
+petroliferous
+petrolific
+petrolist
+petrolithic
+petrolization
+petrolize
+petrologic
+petrological
+petrologically
+petromastoid
+Petromyzon
+Petromyzonidae
+petromyzont
+Petromyzontes
+Petromyzontidae
+petromyzontoid
+petronel
+petronella
+petropharyngeal
+petrophilous
+petrosa
+petrosal
+Petroselinum
+petrosilex
+petrosiliceous
+petrosilicious
+petrosphenoid
+petrosphenoidal
+petrosphere
+petrosquamosal
+petrosquamous
+petrostearin
+petrostearine
+petrosum
+petrotympanic
+petrous
+petroxolin
+pettable
+petted
+pettedly
+pettedness
+petter
+pettichaps
+petticoat
+petticoated
+petticoaterie
+petticoatery
+petticoatism
+petticoatless
+petticoaty
+pettifog
+pettifogger
+pettifoggery
+pettifogging
+pettifogulize
+pettifogulizer
+pettily
+pettiness
+pettingly
+pettish
+pettitoes
+pettle
+petty
+pettyfog
+petulance
+petulancy
+petulant
+petulantly
+petune
+Petunia
+petuntse
+petwood
+petzite
+Peucedanum
+Peucetii
+peucites
+peuhl
+Peul
+Peumus
+Peutingerian
+pew
+pewage
+pewdom
+pewee
+pewfellow
+pewful
+pewholder
+pewing
+pewit
+pewless
+pewmate
+pewter
+pewterer
+pewterwort
+pewtery
+pewy
+Peyerian
+peyote
+peyotl
+peyton
+peytrel
+pezantic
+Peziza
+Pezizaceae
+pezizaceous
+pezizaeform
+Pezizales
+peziziform
+pezizoid
+pezograph
+Pezophaps
+Pfaffian
+pfeffernuss
+Pfeifferella
+pfennig
+pfui
+pfund
+Phaca
+Phacelia
+phacelite
+phacella
+Phacidiaceae
+Phacidiales
+phacitis
+phacoanaphylaxis
+phacocele
+phacochere
+phacocherine
+phacochoere
+phacochoerid
+phacochoerine
+phacochoeroid
+Phacochoerus
+phacocyst
+phacocystectomy
+phacocystitis
+phacoglaucoma
+phacoid
+phacoidal
+phacoidoscope
+phacolite
+phacolith
+phacolysis
+phacomalacia
+phacometer
+phacopid
+Phacopidae
+Phacops
+phacosclerosis
+phacoscope
+phacotherapy
+Phaeacian
+Phaedo
+phaeism
+phaenantherous
+phaenanthery
+phaenogam
+Phaenogamia
+phaenogamian
+phaenogamic
+phaenogamous
+phaenogenesis
+phaenogenetic
+phaenological
+phaenology
+phaenomenal
+phaenomenism
+phaenomenon
+phaenozygous
+phaeochrous
+Phaeodaria
+phaeodarian
+phaeophore
+Phaeophyceae
+phaeophycean
+phaeophyceous
+phaeophyll
+Phaeophyta
+phaeophytin
+phaeoplast
+Phaeosporales
+phaeospore
+Phaeosporeae
+phaeosporous
+Phaet
+Phaethon
+Phaethonic
+Phaethontes
+Phaethontic
+Phaethontidae
+Phaethusa
+phaeton
+phage
+phagedena
+phagedenic
+phagedenical
+phagedenous
+Phagineae
+phagocytable
+phagocytal
+phagocyte
+phagocyter
+phagocytic
+phagocytism
+phagocytize
+phagocytoblast
+phagocytolysis
+phagocytolytic
+phagocytose
+phagocytosis
+phagodynamometer
+phagolysis
+phagolytic
+phagomania
+phainolion
+Phainopepla
+Phajus
+Phalacrocoracidae
+phalacrocoracine
+Phalacrocorax
+phalacrosis
+Phalaecean
+Phalaecian
+Phalaenae
+Phalaenidae
+phalaenopsid
+Phalaenopsis
+phalangal
+phalange
+phalangeal
+phalangean
+phalanger
+Phalangeridae
+Phalangerinae
+phalangerine
+phalanges
+phalangette
+phalangian
+phalangic
+phalangid
+Phalangida
+phalangidan
+Phalangidea
+phalangidean
+Phalangides
+phalangiform
+Phalangigrada
+phalangigrade
+phalangigrady
+phalangiid
+Phalangiidae
+phalangist
+Phalangista
+Phalangistidae
+phalangistine
+phalangite
+phalangitic
+phalangitis
+Phalangium
+phalangologist
+phalangology
+phalansterial
+phalansterian
+phalansterianism
+phalansteric
+phalansterism
+phalansterist
+phalanstery
+phalanx
+phalanxed
+phalarica
+Phalaris
+Phalarism
+phalarope
+Phalaropodidae
+phalera
+phalerate
+phalerated
+Phaleucian
+Phallaceae
+phallaceous
+Phallales
+phallalgia
+phallaneurysm
+phallephoric
+phallic
+phallical
+phallicism
+phallicist
+phallin
+phallism
+phallist
+phallitis
+phallocrypsis
+phallodynia
+phalloid
+phalloncus
+phalloplasty
+phallorrhagia
+phallus
+Phanar
+Phanariot
+Phanariote
+phanatron
+phaneric
+phanerite
+Phanerocarpae
+Phanerocarpous
+Phanerocephala
+phanerocephalous
+phanerocodonic
+phanerocryst
+phanerocrystalline
+phanerogam
+Phanerogamia
+phanerogamian
+phanerogamic
+phanerogamous
+phanerogamy
+phanerogenetic
+phanerogenic
+Phaneroglossa
+phaneroglossal
+phaneroglossate
+phaneromania
+phaneromere
+phaneromerous
+phaneroscope
+phanerosis
+phanerozoic
+phanerozonate
+Phanerozonia
+phanic
+phano
+phansigar
+phantascope
+phantasia
+Phantasiast
+Phantasiastic
+phantasist
+phantasize
+phantasm
+phantasma
+phantasmagoria
+phantasmagorial
+phantasmagorially
+phantasmagorian
+phantasmagoric
+phantasmagorical
+phantasmagorist
+phantasmagory
+phantasmal
+phantasmalian
+phantasmality
+phantasmally
+phantasmascope
+phantasmata
+Phantasmatic
+phantasmatic
+phantasmatical
+phantasmatically
+phantasmatography
+phantasmic
+phantasmical
+phantasmically
+Phantasmist
+phantasmogenesis
+phantasmogenetic
+phantasmograph
+phantasmological
+phantasmology
+phantast
+phantasy
+phantom
+phantomatic
+phantomic
+phantomical
+phantomically
+Phantomist
+phantomize
+phantomizer
+phantomland
+phantomlike
+phantomnation
+phantomry
+phantomship
+phantomy
+phantoplex
+phantoscope
+Pharaoh
+Pharaonic
+Pharaonical
+Pharbitis
+phare
+Phareodus
+Pharian
+Pharisaean
+Pharisaic
+pharisaical
+pharisaically
+pharisaicalness
+Pharisaism
+Pharisaist
+Pharisean
+Pharisee
+pharisee
+Phariseeism
+pharmacal
+pharmaceutic
+pharmaceutical
+pharmaceutically
+pharmaceutics
+pharmaceutist
+pharmacic
+pharmacist
+pharmacite
+pharmacodiagnosis
+pharmacodynamic
+pharmacodynamical
+pharmacodynamics
+pharmacoendocrinology
+pharmacognosia
+pharmacognosis
+pharmacognosist
+pharmacognostical
+pharmacognostically
+pharmacognostics
+pharmacognosy
+pharmacography
+pharmacolite
+pharmacologia
+pharmacologic
+pharmacological
+pharmacologically
+pharmacologist
+pharmacology
+pharmacomania
+pharmacomaniac
+pharmacomaniacal
+pharmacometer
+pharmacopedia
+pharmacopedic
+pharmacopedics
+pharmacopeia
+pharmacopeial
+pharmacopeian
+pharmacophobia
+pharmacopoeia
+pharmacopoeial
+pharmacopoeian
+pharmacopoeist
+pharmacopolist
+pharmacoposia
+pharmacopsychology
+pharmacosiderite
+pharmacotherapy
+pharmacy
+pharmakos
+pharmic
+pharmuthi
+pharology
+Pharomacrus
+pharos
+Pharsalian
+pharyngal
+pharyngalgia
+pharyngalgic
+pharyngeal
+pharyngectomy
+pharyngemphraxis
+pharynges
+pharyngic
+pharyngismus
+pharyngitic
+pharyngitis
+pharyngoamygdalitis
+pharyngobranch
+pharyngobranchial
+pharyngobranchiate
+Pharyngobranchii
+pharyngocele
+pharyngoceratosis
+pharyngodynia
+pharyngoepiglottic
+pharyngoepiglottidean
+pharyngoesophageal
+pharyngoglossal
+pharyngoglossus
+pharyngognath
+Pharyngognathi
+pharyngognathous
+pharyngographic
+pharyngography
+pharyngokeratosis
+pharyngolaryngeal
+pharyngolaryngitis
+pharyngolith
+pharyngological
+pharyngology
+pharyngomaxillary
+pharyngomycosis
+pharyngonasal
+pharyngopalatine
+pharyngopalatinus
+pharyngoparalysis
+pharyngopathy
+pharyngoplasty
+pharyngoplegia
+pharyngoplegic
+pharyngoplegy
+pharyngopleural
+Pharyngopneusta
+pharyngopneustal
+pharyngorhinitis
+pharyngorhinoscopy
+pharyngoscleroma
+pharyngoscope
+pharyngoscopy
+pharyngospasm
+pharyngotherapy
+pharyngotomy
+pharyngotonsillitis
+pharyngotyphoid
+pharyngoxerosis
+pharynogotome
+pharynx
+Phascaceae
+phascaceous
+Phascogale
+Phascolarctinae
+Phascolarctos
+phascolome
+Phascolomyidae
+Phascolomys
+Phascolonus
+Phascum
+phase
+phaseal
+phaseless
+phaselin
+phasemeter
+phasemy
+Phaseolaceae
+phaseolin
+phaseolous
+phaseolunatin
+Phaseolus
+phaseometer
+phases
+Phasianella
+Phasianellidae
+phasianic
+phasianid
+Phasianidae
+Phasianinae
+phasianine
+phasianoid
+Phasianus
+phasic
+Phasiron
+phasis
+phasm
+phasma
+phasmatid
+Phasmatida
+Phasmatidae
+Phasmatodea
+phasmatoid
+Phasmatoidea
+phasmatrope
+phasmid
+Phasmida
+Phasmidae
+phasmoid
+phasogeneous
+phasotropy
+pheal
+pheasant
+pheasantry
+pheasantwood
+Phebe
+Phecda
+Phegopteris
+Pheidole
+phellandrene
+phellem
+Phellodendron
+phelloderm
+phellodermal
+phellogen
+phellogenetic
+phellogenic
+phellonic
+phelloplastic
+phelloplastics
+phelonion
+phemic
+Phemie
+phenacaine
+phenacetin
+phenaceturic
+phenacite
+Phenacodontidae
+Phenacodus
+phenacyl
+phenakism
+phenakistoscope
+Phenalgin
+phenanthrene
+phenanthridine
+phenanthridone
+phenanthrol
+phenanthroline
+phenarsine
+phenate
+phenazine
+phenazone
+phene
+phenegol
+phenene
+phenethyl
+phenetidine
+phenetole
+phengite
+phengitical
+phenic
+phenicate
+phenicious
+phenicopter
+phenin
+phenmiazine
+phenobarbital
+phenocoll
+phenocopy
+phenocryst
+phenocrystalline
+phenogenesis
+phenogenetic
+phenol
+phenolate
+phenolic
+phenolization
+phenolize
+phenological
+phenologically
+phenologist
+phenology
+phenoloid
+phenolphthalein
+phenolsulphonate
+phenolsulphonephthalein
+phenolsulphonic
+phenomena
+phenomenal
+phenomenalism
+phenomenalist
+phenomenalistic
+phenomenalistically
+phenomenality
+phenomenalization
+phenomenalize
+phenomenally
+phenomenic
+phenomenical
+phenomenism
+phenomenist
+phenomenistic
+phenomenize
+phenomenological
+phenomenologically
+phenomenology
+phenomenon
+phenoplast
+phenoplastic
+phenoquinone
+phenosafranine
+phenosal
+phenospermic
+phenospermy
+phenothiazine
+phenotype
+phenotypic
+phenotypical
+phenotypically
+phenoxazine
+phenoxid
+phenoxide
+phenozygous
+Pheny
+phenyl
+phenylacetaldehyde
+phenylacetamide
+phenylacetic
+phenylalanine
+phenylamide
+phenylamine
+phenylate
+phenylation
+phenylboric
+phenylcarbamic
+phenylcarbimide
+phenylene
+phenylenediamine
+phenylethylene
+phenylglycine
+phenylglycolic
+phenylglyoxylic
+phenylhydrazine
+phenylhydrazone
+phenylic
+phenylmethane
+pheon
+pheophyl
+pheophyll
+pheophytin
+Pherecratean
+Pherecratian
+Pherecratic
+Pherephatta
+pheretrer
+Pherkad
+Pherophatta
+Phersephatta
+Phersephoneia
+phew
+phi
+phial
+phiale
+phialful
+phialide
+phialine
+phiallike
+phialophore
+phialospore
+Phidiac
+Phidian
+Phigalian
+Phil
+Philadelphian
+Philadelphianism
+philadelphite
+Philadelphus
+philadelphy
+philalethist
+philamot
+Philander
+philander
+philanderer
+philanthid
+Philanthidae
+philanthrope
+philanthropian
+philanthropic
+philanthropical
+philanthropically
+philanthropinism
+philanthropinist
+Philanthropinum
+philanthropism
+philanthropist
+philanthropistic
+philanthropize
+philanthropy
+Philanthus
+philantomba
+philarchaist
+philaristocracy
+philatelic
+philatelical
+philatelically
+philatelism
+philatelist
+philatelistic
+philately
+Philathea
+philathletic
+philematology
+Philepitta
+Philepittidae
+Philesia
+Philetaerus
+philharmonic
+philhellene
+philhellenic
+philhellenism
+philhellenist
+philhippic
+philhymnic
+philiater
+Philip
+Philippa
+Philippan
+Philippe
+Philippian
+Philippic
+philippicize
+Philippine
+Philippines
+Philippism
+Philippist
+Philippistic
+Philippizate
+philippize
+philippizer
+philippus
+Philistia
+Philistian
+Philistine
+Philistinely
+Philistinian
+Philistinic
+Philistinish
+Philistinism
+Philistinize
+Phill
+philliloo
+Phillip
+phillipsine
+phillipsite
+Phillis
+Phillyrea
+phillyrin
+philobiblian
+philobiblic
+philobiblical
+philobiblist
+philobotanic
+philobotanist
+philobrutish
+philocalic
+philocalist
+philocaly
+philocathartic
+philocatholic
+philocomal
+Philoctetes
+philocubist
+philocynic
+philocynical
+philocynicism
+philocyny
+philodemic
+Philodendron
+philodespot
+philodestructiveness
+Philodina
+Philodinidae
+philodox
+philodoxer
+philodoxical
+philodramatic
+philodramatist
+philofelist
+philofelon
+philogarlic
+philogastric
+philogeant
+philogenitive
+philogenitiveness
+philograph
+philographic
+philogynaecic
+philogynist
+philogynous
+philogyny
+Philohela
+philohellenian
+philokleptic
+philoleucosis
+philologaster
+philologastry
+philologer
+philologian
+philologic
+philological
+philologically
+philologist
+philologistic
+philologize
+philologue
+philology
+Philomachus
+philomath
+philomathematic
+philomathematical
+philomathic
+philomathical
+philomathy
+philomel
+Philomela
+philomelanist
+philomuse
+philomusical
+philomystic
+philonatural
+philoneism
+Philonian
+Philonic
+Philonism
+Philonist
+philonium
+philonoist
+philopagan
+philopater
+philopatrian
+philopena
+philophilosophos
+philopig
+philoplutonic
+philopoet
+philopogon
+philopolemic
+philopolemical
+philopornist
+philoprogeneity
+philoprogenitive
+philoprogenitiveness
+philopterid
+Philopteridae
+philopublican
+philoradical
+philorchidaceous
+philornithic
+philorthodox
+philosoph
+philosophaster
+philosophastering
+philosophastry
+philosophedom
+philosopheme
+philosopher
+philosopheress
+philosophership
+philosophic
+philosophical
+philosophically
+philosophicalness
+philosophicide
+philosophicohistorical
+philosophicojuristic
+philosophicolegal
+philosophicoreligious
+philosophicotheological
+philosophism
+philosophist
+philosophister
+philosophistic
+philosophistical
+philosophization
+philosophize
+philosophizer
+philosophling
+philosophobia
+philosophocracy
+philosophuncule
+philosophunculist
+philosophy
+philotadpole
+philotechnic
+philotechnical
+philotechnist
+philothaumaturgic
+philotheism
+philotheist
+philotheistic
+philotheosophical
+philotherian
+philotherianism
+Philotria
+Philoxenian
+philoxygenous
+philozoic
+philozoist
+philozoonist
+philter
+philterer
+philterproof
+philtra
+philtrum
+Philydraceae
+philydraceous
+Philyra
+phimosed
+phimosis
+phimotic
+Phineas
+Phiomia
+Phiroze
+phit
+phiz
+phizes
+phizog
+phlebalgia
+phlebangioma
+phlebarteriectasia
+phlebarteriodialysis
+phlebectasia
+phlebectasis
+phlebectasy
+phlebectomy
+phlebectopia
+phlebectopy
+phlebemphraxis
+phlebenteric
+phlebenterism
+phlebitic
+phlebitis
+Phlebodium
+phlebogram
+phlebograph
+phlebographical
+phlebography
+phleboid
+phleboidal
+phlebolite
+phlebolith
+phlebolithiasis
+phlebolithic
+phlebolitic
+phlebological
+phlebology
+phlebometritis
+phlebopexy
+phleboplasty
+phleborrhage
+phleborrhagia
+phleborrhaphy
+phleborrhexis
+phlebosclerosis
+phlebosclerotic
+phlebostasia
+phlebostasis
+phlebostenosis
+phlebostrepsis
+phlebothrombosis
+phlebotome
+phlebotomic
+phlebotomical
+phlebotomically
+phlebotomist
+phlebotomization
+phlebotomize
+Phlebotomus
+phlebotomus
+phlebotomy
+Phlegethon
+Phlegethontal
+Phlegethontic
+phlegm
+phlegma
+phlegmagogue
+phlegmasia
+phlegmatic
+phlegmatical
+phlegmatically
+phlegmaticalness
+phlegmaticly
+phlegmaticness
+phlegmatism
+phlegmatist
+phlegmatous
+phlegmless
+phlegmon
+phlegmonic
+phlegmonoid
+phlegmonous
+phlegmy
+Phleum
+phlobaphene
+phlobatannin
+phloem
+phloeophagous
+phloeoterma
+phlogisma
+phlogistian
+phlogistic
+phlogistical
+phlogisticate
+phlogistication
+phlogiston
+phlogistonism
+phlogistonist
+phlogogenetic
+phlogogenic
+phlogogenous
+phlogopite
+phlogosed
+Phlomis
+phloretic
+phloroglucic
+phloroglucin
+phlorone
+phloxin
+pho
+phobiac
+phobic
+phobism
+phobist
+phobophobia
+Phobos
+phoby
+phoca
+phocacean
+phocaceous
+Phocaean
+Phocaena
+Phocaenina
+phocaenine
+phocal
+Phocean
+phocenate
+phocenic
+phocenin
+Phocian
+phocid
+Phocidae
+phociform
+Phocinae
+phocine
+phocodont
+Phocodontia
+phocodontic
+Phocoena
+phocoid
+phocomelia
+phocomelous
+phocomelus
+Phoebe
+phoebe
+Phoebean
+Phoenicaceae
+phoenicaceous
+Phoenicales
+phoenicean
+Phoenician
+Phoenicianism
+Phoenicid
+phoenicite
+Phoenicize
+phoenicochroite
+Phoenicopteridae
+Phoenicopteriformes
+phoenicopteroid
+Phoenicopteroideae
+phoenicopterous
+Phoenicopterus
+Phoeniculidae
+Phoeniculus
+phoenicurous
+phoenigm
+Phoenix
+phoenix
+phoenixity
+phoenixlike
+phoh
+pholad
+Pholadacea
+pholadian
+pholadid
+Pholadidae
+Pholadinea
+pholadoid
+Pholas
+pholcid
+Pholcidae
+pholcoid
+Pholcus
+pholido
+pholidolite
+pholidosis
+Pholidota
+pholidote
+Pholiota
+Phoma
+Phomopsis
+phon
+phonal
+phonasthenia
+phonate
+phonation
+phonatory
+phonautogram
+phonautograph
+phonautographic
+phonautographically
+phone
+phoneidoscope
+phoneidoscopic
+Phonelescope
+phoneme
+phonemic
+phonemics
+phonendoscope
+phonesis
+phonestheme
+phonetic
+phonetical
+phonetically
+phonetician
+phoneticism
+phoneticist
+phoneticization
+phoneticize
+phoneticogrammatical
+phoneticohieroglyphic
+phonetics
+phonetism
+phonetist
+phonetization
+phonetize
+phoniatrics
+phoniatry
+phonic
+phonics
+phonikon
+phonism
+phono
+phonocamptic
+phonocinematograph
+phonodeik
+phonodynamograph
+phonoglyph
+phonogram
+phonogramic
+phonogramically
+phonogrammatic
+phonogrammatical
+phonogrammic
+phonogrammically
+phonograph
+phonographer
+phonographic
+phonographical
+phonographically
+phonographist
+phonography
+phonolite
+phonolitic
+phonologer
+phonologic
+phonological
+phonologically
+phonologist
+phonology
+phonometer
+phonometric
+phonometry
+phonomimic
+phonomotor
+phonopathy
+phonophile
+phonophobia
+phonophone
+phonophore
+phonophoric
+phonophorous
+phonophote
+phonophotography
+phonophotoscope
+phonophotoscopic
+phonoplex
+phonoscope
+phonotelemeter
+phonotype
+phonotyper
+phonotypic
+phonotypical
+phonotypically
+phonotypist
+phonotypy
+phony
+phoo
+Phora
+Phoradendron
+phoranthium
+phoresis
+phoresy
+phoria
+phorid
+Phoridae
+phorminx
+Phormium
+phorology
+phorometer
+phorometric
+phorometry
+phorone
+phoronic
+phoronid
+Phoronida
+Phoronidea
+Phoronis
+phoronomia
+phoronomic
+phoronomically
+phoronomics
+phoronomy
+Phororhacidae
+Phororhacos
+phoroscope
+phorozooid
+phos
+phose
+phosgene
+phosgenic
+phosgenite
+phosis
+phosphagen
+phospham
+phosphamic
+phosphamide
+phosphamidic
+phosphammonium
+phosphatase
+phosphate
+phosphated
+phosphatemia
+phosphatese
+phosphatic
+phosphatide
+phosphation
+phosphatization
+phosphatize
+phosphaturia
+phosphaturic
+phosphene
+phosphenyl
+phosphide
+phosphinate
+phosphine
+phosphinic
+phosphite
+phospho
+phosphoaminolipide
+phosphocarnic
+phosphocreatine
+phosphoferrite
+phosphoglycerate
+phosphoglyceric
+phosphoglycoprotein
+phospholipide
+phospholipin
+phosphomolybdate
+phosphomolybdic
+phosphonate
+phosphonic
+phosphonium
+phosphophyllite
+phosphoprotein
+phosphor
+phosphorate
+phosphore
+phosphoreal
+phosphorent
+phosphoreous
+phosphoresce
+phosphorescence
+phosphorescent
+phosphorescently
+phosphoreted
+phosphorhidrosis
+phosphori
+phosphoric
+phosphorical
+phosphoriferous
+phosphorism
+phosphorite
+phosphoritic
+phosphorize
+phosphorogen
+phosphorogenic
+phosphorograph
+phosphorographic
+phosphorography
+phosphoroscope
+phosphorous
+phosphoruria
+phosphorus
+phosphoryl
+phosphorylase
+phosphorylation
+phosphosilicate
+phosphotartaric
+phosphotungstate
+phosphotungstic
+phosphowolframic
+phosphuranylite
+phosphuret
+phosphuria
+phosphyl
+phossy
+phot
+photaesthesia
+photaesthesis
+photaesthetic
+photal
+photalgia
+photechy
+photelectrograph
+photeolic
+photerythrous
+photesthesis
+photic
+photics
+Photinia
+Photinian
+Photinianism
+photism
+photistic
+photo
+photoactinic
+photoactivate
+photoactivation
+photoactive
+photoactivity
+photoaesthetic
+photoalbum
+photoalgraphy
+photoanamorphosis
+photoaquatint
+Photobacterium
+photobathic
+photobiotic
+photobromide
+photocampsis
+photocatalysis
+photocatalyst
+photocatalytic
+photocatalyzer
+photocell
+photocellulose
+photoceptor
+photoceramic
+photoceramics
+photoceramist
+photochemic
+photochemical
+photochemically
+photochemigraphy
+photochemist
+photochemistry
+photochloride
+photochlorination
+photochromascope
+photochromatic
+photochrome
+photochromic
+photochromography
+photochromolithograph
+photochromoscope
+photochromotype
+photochromotypy
+photochromy
+photochronograph
+photochronographic
+photochronographical
+photochronographically
+photochronography
+photocollograph
+photocollographic
+photocollography
+photocollotype
+photocombustion
+photocompose
+photocomposition
+photoconductivity
+photocopier
+photocopy
+photocrayon
+photocurrent
+photodecomposition
+photodensitometer
+photodermatic
+photodermatism
+photodisintegration
+photodissociation
+photodrama
+photodramatic
+photodramatics
+photodramatist
+photodramaturgic
+photodramaturgy
+photodrome
+photodromy
+photodynamic
+photodynamical
+photodynamically
+photodynamics
+photodysphoria
+photoelastic
+photoelasticity
+photoelectric
+photoelectrical
+photoelectrically
+photoelectricity
+photoelectron
+photoelectrotype
+photoemission
+photoemissive
+photoengrave
+photoengraver
+photoengraving
+photoepinastic
+photoepinastically
+photoepinasty
+photoesthesis
+photoesthetic
+photoetch
+photoetcher
+photoetching
+photofilm
+photofinish
+photofinisher
+photofinishing
+photofloodlamp
+photogalvanograph
+photogalvanographic
+photogalvanography
+photogastroscope
+photogelatin
+photogen
+photogene
+photogenetic
+photogenic
+photogenically
+photogenous
+photoglyph
+photoglyphic
+photoglyphography
+photoglyphy
+photoglyptic
+photoglyptography
+photogram
+photogrammeter
+photogrammetric
+photogrammetrical
+photogrammetry
+photograph
+photographable
+photographee
+photographer
+photographeress
+photographess
+photographic
+photographical
+photographically
+photographist
+photographize
+photographometer
+photography
+photogravure
+photogravurist
+photogyric
+photohalide
+photoheliograph
+photoheliographic
+photoheliography
+photoheliometer
+photohyponastic
+photohyponastically
+photohyponasty
+photoimpression
+photoinactivation
+photoinduction
+photoinhibition
+photointaglio
+photoionization
+photoisomeric
+photoisomerization
+photokinesis
+photokinetic
+photolith
+photolitho
+photolithograph
+photolithographer
+photolithographic
+photolithography
+photologic
+photological
+photologist
+photology
+photoluminescence
+photoluminescent
+photolysis
+photolyte
+photolytic
+photoma
+photomacrograph
+photomagnetic
+photomagnetism
+photomap
+photomapper
+photomechanical
+photomechanically
+photometeor
+photometer
+photometric
+photometrical
+photometrically
+photometrician
+photometrist
+photometrograph
+photometry
+photomezzotype
+photomicrogram
+photomicrograph
+photomicrographer
+photomicrographic
+photomicrography
+photomicroscope
+photomicroscopic
+photomicroscopy
+photomontage
+photomorphosis
+photomural
+photon
+photonastic
+photonasty
+photonegative
+photonephograph
+photonephoscope
+photoneutron
+photonosus
+photooxidation
+photooxidative
+photopathic
+photopathy
+photoperceptive
+photoperimeter
+photoperiod
+photoperiodic
+photoperiodism
+photophane
+photophile
+photophilic
+photophilous
+photophily
+photophobe
+photophobia
+photophobic
+photophobous
+photophone
+photophonic
+photophony
+photophore
+photophoresis
+photophosphorescent
+photophygous
+photophysical
+photophysicist
+photopia
+photopic
+photopile
+photopitometer
+photoplay
+photoplayer
+photoplaywright
+photopography
+photopolarigraph
+photopolymerization
+photopositive
+photoprint
+photoprinter
+photoprinting
+photoprocess
+photoptometer
+photoradio
+photoradiogram
+photoreception
+photoreceptive
+photoreceptor
+photoregression
+photorelief
+photoresistance
+photosalt
+photosantonic
+photoscope
+photoscopic
+photoscopy
+photosculptural
+photosculpture
+photosensitive
+photosensitiveness
+photosensitivity
+photosensitization
+photosensitize
+photosensitizer
+photosensory
+photospectroheliograph
+photospectroscope
+photospectroscopic
+photospectroscopical
+photospectroscopy
+photosphere
+photospheric
+photostability
+photostable
+Photostat
+photostat
+photostationary
+photostereograph
+photosurveying
+photosyntax
+photosynthate
+photosynthesis
+photosynthesize
+photosynthetic
+photosynthetically
+photosynthometer
+phototachometer
+phototachometric
+phototachometrical
+phototachometry
+phototactic
+phototactically
+phototactism
+phototaxis
+phototaxy
+phototechnic
+phototelegraph
+phototelegraphic
+phototelegraphically
+phototelegraphy
+phototelephone
+phototelephony
+phototelescope
+phototelescopic
+phototheodolite
+phototherapeutic
+phototherapeutics
+phototherapic
+phototherapist
+phototherapy
+photothermic
+phototonic
+phototonus
+phototopographic
+phototopographical
+phototopography
+phototrichromatic
+phototrope
+phototrophic
+phototrophy
+phototropic
+phototropically
+phototropism
+phototropy
+phototube
+phototype
+phototypic
+phototypically
+phototypist
+phototypographic
+phototypography
+phototypy
+photovisual
+photovitrotype
+photovoltaic
+photoxylography
+photozinco
+photozincograph
+photozincographic
+photozincography
+photozincotype
+photozincotypy
+photuria
+Phractamphibia
+phragma
+Phragmidium
+Phragmites
+phragmocone
+phragmoconic
+Phragmocyttares
+phragmocyttarous
+phragmoid
+phragmosis
+phrasable
+phrasal
+phrasally
+phrase
+phraseable
+phraseless
+phrasemaker
+phrasemaking
+phraseman
+phrasemonger
+phrasemongering
+phrasemongery
+phraseogram
+phraseograph
+phraseographic
+phraseography
+phraseological
+phraseologically
+phraseologist
+phraseology
+phraser
+phrasify
+phrasiness
+phrasing
+phrasy
+phrator
+phratral
+phratria
+phratriac
+phratrial
+phratry
+phreatic
+phreatophyte
+phrenesia
+phrenesiac
+phrenesis
+phrenetic
+phrenetically
+phreneticness
+phrenic
+phrenicectomy
+phrenicocolic
+phrenicocostal
+phrenicogastric
+phrenicoglottic
+phrenicohepatic
+phrenicolienal
+phrenicopericardiac
+phrenicosplenic
+phrenicotomy
+phrenics
+phrenitic
+phrenitis
+phrenocardia
+phrenocardiac
+phrenocolic
+phrenocostal
+phrenodynia
+phrenogastric
+phrenoglottic
+phrenogram
+phrenograph
+phrenography
+phrenohepatic
+phrenologer
+phrenologic
+phrenological
+phrenologically
+phrenologist
+phrenologize
+phrenology
+phrenomagnetism
+phrenomesmerism
+phrenopathia
+phrenopathic
+phrenopathy
+phrenopericardiac
+phrenoplegia
+phrenoplegy
+phrenosin
+phrenosinic
+phrenospasm
+phrenosplenic
+phronesis
+Phronima
+Phronimidae
+phrontisterion
+phrontisterium
+phrontistery
+Phryganea
+phryganeid
+Phryganeidae
+phryganeoid
+Phrygian
+Phrygianize
+phrygium
+Phryma
+Phrymaceae
+phrymaceous
+phrynid
+Phrynidae
+phrynin
+phrynoid
+Phrynosoma
+phthalacene
+phthalan
+phthalanilic
+phthalate
+phthalazin
+phthalazine
+phthalein
+phthaleinometer
+phthalic
+phthalid
+phthalide
+phthalimide
+phthalin
+phthalocyanine
+phthalyl
+phthanite
+Phthartolatrae
+phthinoid
+phthiocol
+phthiriasis
+Phthirius
+phthirophagous
+phthisic
+phthisical
+phthisicky
+phthisiogenesis
+phthisiogenetic
+phthisiogenic
+phthisiologist
+phthisiology
+phthisiophobia
+phthisiotherapeutic
+phthisiotherapy
+phthisipneumonia
+phthisipneumony
+phthisis
+phthongal
+phthongometer
+phthor
+phthoric
+phu
+phugoid
+phulkari
+phulwa
+phulwara
+phut
+Phyciodes
+phycite
+Phycitidae
+phycitol
+phycochromaceae
+phycochromaceous
+phycochrome
+Phycochromophyceae
+phycochromophyceous
+phycocyanin
+phycocyanogen
+Phycodromidae
+phycoerythrin
+phycography
+phycological
+phycologist
+phycology
+Phycomyces
+phycomycete
+Phycomycetes
+phycomycetous
+phycophaein
+phycoxanthin
+phycoxanthine
+phygogalactic
+phyla
+phylacobiosis
+phylacobiotic
+phylacteric
+phylacterical
+phylacteried
+phylacterize
+phylactery
+phylactic
+phylactocarp
+phylactocarpal
+Phylactolaema
+Phylactolaemata
+phylactolaematous
+Phylactolema
+Phylactolemata
+phylarch
+phylarchic
+phylarchical
+phylarchy
+phyle
+phylephebic
+phylesis
+phyletic
+phyletically
+phyletism
+phylic
+Phyllachora
+Phyllactinia
+phyllade
+Phyllanthus
+phyllary
+Phyllaurea
+phylliform
+phyllin
+phylline
+Phyllis
+phyllite
+phyllitic
+Phyllitis
+Phyllium
+phyllobranchia
+phyllobranchial
+phyllobranchiate
+Phyllocactus
+phyllocarid
+Phyllocarida
+phyllocaridan
+Phylloceras
+phyllocerate
+Phylloceratidae
+phylloclad
+phylloclade
+phyllocladioid
+phyllocladium
+phyllocladous
+phyllocyanic
+phyllocyanin
+phyllocyst
+phyllocystic
+phyllode
+phyllodial
+phyllodination
+phyllodineous
+phyllodiniation
+phyllodinous
+phyllodium
+Phyllodoce
+phyllody
+phylloerythrin
+phyllogenetic
+phyllogenous
+phylloid
+phylloidal
+phylloideous
+phyllomancy
+phyllomania
+phyllome
+phyllomic
+phyllomorph
+phyllomorphic
+phyllomorphosis
+phyllomorphy
+Phyllophaga
+phyllophagous
+phyllophore
+phyllophorous
+phyllophyllin
+phyllophyte
+phyllopod
+Phyllopoda
+phyllopodan
+phyllopode
+phyllopodiform
+phyllopodium
+phyllopodous
+phylloporphyrin
+Phyllopteryx
+phylloptosis
+phyllopyrrole
+phyllorhine
+phyllorhinine
+phylloscopine
+Phylloscopus
+phyllosiphonic
+phyllosoma
+Phyllosomata
+phyllosome
+Phyllospondyli
+phyllospondylous
+Phyllostachys
+Phyllosticta
+Phyllostoma
+Phyllostomatidae
+Phyllostomatinae
+phyllostomatoid
+phyllostomatous
+phyllostome
+Phyllostomidae
+Phyllostominae
+phyllostomine
+phyllostomous
+Phyllostomus
+phyllotactic
+phyllotactical
+phyllotaxis
+phyllotaxy
+phyllous
+phylloxanthin
+Phylloxera
+phylloxeran
+phylloxeric
+Phylloxeridae
+phyllozooid
+phylogenetic
+phylogenetical
+phylogenetically
+phylogenic
+phylogenist
+phylogeny
+phylogerontic
+phylogerontism
+phylography
+phylology
+phylon
+phyloneanic
+phylonepionic
+phylum
+phyma
+phymata
+phymatic
+phymatid
+Phymatidae
+Phymatodes
+phymatoid
+phymatorhysin
+phymatosis
+Phymosia
+Physa
+physagogue
+Physalia
+physalian
+Physaliidae
+Physalis
+physalite
+Physalospora
+Physapoda
+Physaria
+Physcia
+Physciaceae
+physcioid
+Physcomitrium
+Physeter
+Physeteridae
+Physeterinae
+physeterine
+physeteroid
+Physeteroidea
+physharmonica
+physianthropy
+physiatric
+physiatrical
+physiatrics
+physic
+physical
+physicalism
+physicalist
+physicalistic
+physicalistically
+physicality
+physically
+physicalness
+physician
+physicianary
+physiciancy
+physicianed
+physicianer
+physicianess
+physicianless
+physicianly
+physicianship
+physicism
+physicist
+physicked
+physicker
+physicking
+physicky
+physicoastronomical
+physicobiological
+physicochemic
+physicochemical
+physicochemically
+physicochemist
+physicochemistry
+physicogeographical
+physicologic
+physicological
+physicomathematical
+physicomathematics
+physicomechanical
+physicomedical
+physicomental
+physicomorph
+physicomorphic
+physicomorphism
+physicooptics
+physicophilosophical
+physicophilosophy
+physicophysiological
+physicopsychical
+physicosocial
+physicotheological
+physicotheologist
+physicotheology
+physicotherapeutic
+physicotherapeutics
+physicotherapy
+physics
+Physidae
+physiform
+physiochemical
+physiochemically
+physiocracy
+physiocrat
+physiocratic
+physiocratism
+physiocratist
+physiogenesis
+physiogenetic
+physiogenic
+physiogeny
+physiognomic
+physiognomical
+physiognomically
+physiognomics
+physiognomist
+physiognomize
+physiognomonic
+physiognomonical
+physiognomy
+physiogony
+physiographer
+physiographic
+physiographical
+physiographically
+physiography
+physiolater
+physiolatrous
+physiolatry
+physiologer
+physiologian
+physiological
+physiologically
+physiologicoanatomic
+physiologist
+physiologize
+physiologue
+physiologus
+physiology
+physiopathological
+physiophilist
+physiophilosopher
+physiophilosophical
+physiophilosophy
+physiopsychic
+physiopsychical
+physiopsychological
+physiopsychology
+physiosociological
+physiosophic
+physiosophy
+physiotherapeutic
+physiotherapeutical
+physiotherapeutics
+physiotherapist
+physiotherapy
+physiotype
+physiotypy
+physique
+physiqued
+physitheism
+physitheistic
+physitism
+physiurgic
+physiurgy
+physocarpous
+Physocarpus
+physocele
+physoclist
+Physoclisti
+physoclistic
+physoclistous
+Physoderma
+physogastric
+physogastrism
+physogastry
+physometra
+Physonectae
+physonectous
+Physophorae
+physophoran
+physophore
+physophorous
+physopod
+Physopoda
+physopodan
+Physostegia
+Physostigma
+physostigmine
+physostomatous
+physostome
+Physostomi
+physostomous
+phytalbumose
+phytase
+Phytelephas
+Phyteus
+phytic
+phytiferous
+phytiform
+phytin
+phytivorous
+phytobacteriology
+phytobezoar
+phytobiological
+phytobiology
+phytochemical
+phytochemistry
+phytochlorin
+phytocidal
+phytodynamics
+phytoecological
+phytoecologist
+phytoecology
+Phytoflagellata
+phytogamy
+phytogenesis
+phytogenetic
+phytogenetical
+phytogenetically
+phytogenic
+phytogenous
+phytogeny
+phytogeographer
+phytogeographic
+phytogeographical
+phytogeographically
+phytogeography
+phytoglobulin
+phytograph
+phytographer
+phytographic
+phytographical
+phytographist
+phytography
+phytohormone
+phytoid
+phytol
+Phytolacca
+Phytolaccaceae
+phytolaccaceous
+phytolatrous
+phytolatry
+phytolithological
+phytolithologist
+phytolithology
+phytologic
+phytological
+phytologically
+phytologist
+phytology
+phytoma
+Phytomastigina
+Phytomastigoda
+phytome
+phytomer
+phytometer
+phytometric
+phytometry
+phytomonad
+Phytomonadida
+Phytomonadina
+Phytomonas
+phytomorphic
+phytomorphology
+phytomorphosis
+phyton
+phytonic
+phytonomy
+phytooecology
+phytopaleontologic
+phytopaleontological
+phytopaleontologist
+phytopaleontology
+phytoparasite
+phytopathogen
+phytopathogenic
+phytopathologic
+phytopathological
+phytopathologist
+phytopathology
+Phytophaga
+phytophagan
+phytophagic
+Phytophagineae
+phytophagous
+phytophagy
+phytopharmacologic
+phytopharmacology
+phytophenological
+phytophenology
+phytophil
+phytophilous
+Phytophthora
+phytophylogenetic
+phytophylogenic
+phytophylogeny
+phytophysiological
+phytophysiology
+phytoplankton
+phytopsyche
+phytoptid
+Phytoptidae
+phytoptose
+phytoptosis
+Phytoptus
+phytorhodin
+phytosaur
+Phytosauria
+phytosaurian
+phytoserologic
+phytoserological
+phytoserologically
+phytoserology
+phytosis
+phytosociologic
+phytosociological
+phytosociologically
+phytosociologist
+phytosociology
+phytosterin
+phytosterol
+phytostrote
+phytosynthesis
+phytotaxonomy
+phytotechny
+phytoteratologic
+phytoteratological
+phytoteratologist
+phytoteratology
+Phytotoma
+Phytotomidae
+phytotomist
+phytotomy
+phytotopographical
+phytotopography
+phytotoxic
+phytotoxin
+phytovitellin
+Phytozoa
+phytozoan
+Phytozoaria
+phytozoon
+phytyl
+pi
+Pia
+pia
+piaba
+piacaba
+piacle
+piacular
+piacularity
+piacularly
+piacularness
+piaculum
+piaffe
+piaffer
+pial
+pialyn
+pian
+pianette
+pianic
+pianino
+pianism
+pianissimo
+pianist
+pianiste
+pianistic
+pianistically
+Piankashaw
+piannet
+piano
+pianoforte
+pianofortist
+pianograph
+Pianokoto
+Pianola
+pianola
+pianolist
+pianologue
+piarhemia
+piarhemic
+Piarist
+Piaroa
+Piaroan
+Piaropus
+Piarroan
+piassava
+Piast
+piaster
+piastre
+piation
+piazine
+piazza
+piazzaed
+piazzaless
+piazzalike
+piazzian
+pibcorn
+piblokto
+pibroch
+pic
+Pica
+pica
+picador
+picadura
+Picae
+pical
+picamar
+picara
+Picard
+picarel
+picaresque
+Picariae
+picarian
+Picarii
+picaro
+picaroon
+picary
+picayune
+picayunish
+picayunishly
+picayunishness
+piccadill
+piccadilly
+piccalilli
+piccolo
+piccoloist
+pice
+Picea
+Picene
+picene
+Picenian
+piceoferruginous
+piceotestaceous
+piceous
+piceworth
+pichi
+pichiciago
+pichuric
+pichurim
+Pici
+Picidae
+piciform
+Piciformes
+Picinae
+picine
+pick
+pickaback
+pickable
+pickableness
+pickage
+pickaninny
+pickaroon
+pickaway
+pickax
+picked
+pickedly
+pickedness
+pickee
+pickeer
+picker
+pickerel
+pickerelweed
+pickering
+pickeringite
+pickery
+picket
+picketboat
+picketeer
+picketer
+pickfork
+pickietar
+pickings
+pickle
+picklelike
+pickleman
+pickler
+pickleweed
+pickleworm
+picklock
+pickman
+pickmaw
+picknick
+picknicker
+pickover
+pickpocket
+pickpocketism
+pickpocketry
+pickpole
+pickpurse
+pickshaft
+picksman
+picksmith
+picksome
+picksomeness
+pickthank
+pickthankly
+pickthankness
+pickthatch
+picktooth
+pickup
+pickwick
+Pickwickian
+Pickwickianism
+Pickwickianly
+pickwork
+picky
+picnic
+picnicker
+picnickery
+Picnickian
+picnickish
+picnicky
+pico
+picofarad
+picoid
+picoline
+picolinic
+picot
+picotah
+picotee
+picotite
+picqueter
+picra
+picramic
+Picramnia
+picrasmin
+picrate
+picrated
+picric
+Picris
+picrite
+picrocarmine
+Picrodendraceae
+Picrodendron
+picroerythrin
+picrol
+picrolite
+picromerite
+picropodophyllin
+picrorhiza
+picrorhizin
+picrotin
+picrotoxic
+picrotoxin
+picrotoxinin
+picryl
+Pict
+pict
+pictarnie
+Pictavi
+Pictish
+Pictland
+pictogram
+pictograph
+pictographic
+pictographically
+pictography
+Pictones
+pictoradiogram
+pictorial
+pictorialism
+pictorialist
+pictorialization
+pictorialize
+pictorially
+pictorialness
+pictoric
+pictorical
+pictorically
+picturability
+picturable
+picturableness
+picturably
+pictural
+picture
+picturecraft
+pictured
+picturedom
+picturedrome
+pictureful
+pictureless
+picturelike
+picturely
+picturemaker
+picturemaking
+picturer
+picturesque
+picturesquely
+picturesqueness
+picturesquish
+picturization
+picturize
+pictury
+picucule
+picuda
+picudilla
+picudo
+picul
+piculet
+piculule
+Picumninae
+Picumnus
+Picunche
+Picuris
+Picus
+pidan
+piddle
+piddler
+piddling
+piddock
+pidgin
+pidjajap
+pie
+piebald
+piebaldism
+piebaldly
+piebaldness
+piece
+pieceable
+pieceless
+piecemaker
+piecemeal
+piecemealwise
+piecen
+piecener
+piecer
+piecette
+piecewise
+piecework
+pieceworker
+piecing
+piecrust
+pied
+piedfort
+piedly
+piedmont
+piedmontal
+Piedmontese
+piedmontite
+piedness
+Piegan
+piehouse
+pieless
+pielet
+pielum
+piemag
+pieman
+piemarker
+pien
+pienanny
+piend
+piepan
+pieplant
+piepoudre
+piepowder
+pieprint
+pier
+pierage
+Piercarlo
+Pierce
+pierce
+pierceable
+pierced
+piercel
+pierceless
+piercent
+piercer
+piercing
+piercingly
+piercingness
+pierdrop
+Pierette
+pierhead
+Pierian
+pierid
+Pieridae
+Pierides
+Pieridinae
+pieridine
+Pierinae
+pierine
+Pieris
+pierless
+pierlike
+Pierre
+Pierrot
+pierrot
+pierrotic
+pieshop
+Piet
+piet
+pietas
+Piete
+Pieter
+pietic
+pietism
+Pietist
+pietist
+pietistic
+pietistical
+pietistically
+pietose
+piety
+piewife
+piewipe
+piewoman
+piezo
+piezochemical
+piezochemistry
+piezocrystallization
+piezoelectric
+piezoelectrically
+piezoelectricity
+piezometer
+piezometric
+piezometrical
+piezometry
+piff
+piffle
+piffler
+pifine
+pig
+pigbelly
+pigdan
+pigdom
+pigeon
+pigeonable
+pigeonberry
+pigeoneer
+pigeoner
+pigeonfoot
+pigeongram
+pigeonhearted
+pigeonhole
+pigeonholer
+pigeonman
+pigeonry
+pigeontail
+pigeonweed
+pigeonwing
+pigeonwood
+pigface
+pigfish
+pigflower
+pigfoot
+pigful
+piggery
+piggin
+pigging
+piggish
+piggishly
+piggishness
+piggle
+piggy
+pighead
+pigheaded
+pigheadedly
+pigheadedness
+pigherd
+pightle
+pigless
+piglet
+pigling
+piglinghood
+pigly
+pigmaker
+pigmaking
+pigman
+pigment
+pigmental
+pigmentally
+pigmentary
+pigmentation
+pigmentize
+pigmentolysis
+pigmentophage
+pigmentose
+Pigmy
+pignolia
+pignon
+pignorate
+pignoration
+pignoratitious
+pignorative
+pignus
+pignut
+pigpen
+pigritude
+pigroot
+pigsconce
+pigskin
+pigsney
+pigstick
+pigsticker
+pigsty
+pigtail
+pigwash
+pigweed
+pigwidgeon
+pigyard
+piitis
+pik
+pika
+pike
+piked
+pikel
+pikelet
+pikeman
+pikemonger
+piker
+pikestaff
+piketail
+pikey
+piki
+piking
+pikle
+piky
+pilage
+pilandite
+pilapil
+Pilar
+pilar
+pilary
+pilaster
+pilastered
+pilastering
+pilastrade
+pilastraded
+pilastric
+Pilate
+Pilatian
+pilau
+pilaued
+pilch
+pilchard
+pilcher
+pilcorn
+pilcrow
+pile
+Pilea
+pileata
+pileate
+pileated
+piled
+pileiform
+pileolated
+pileolus
+pileorhiza
+pileorhize
+pileous
+piler
+piles
+pileus
+pileweed
+pilework
+pileworm
+pilewort
+pilfer
+pilferage
+pilferer
+pilfering
+pilferingly
+pilferment
+pilgarlic
+pilgarlicky
+pilger
+pilgrim
+pilgrimage
+pilgrimager
+pilgrimatic
+pilgrimatical
+pilgrimdom
+pilgrimer
+pilgrimess
+pilgrimism
+pilgrimize
+pilgrimlike
+pilgrimwise
+pili
+pilidium
+pilifer
+piliferous
+piliform
+piligan
+piliganine
+piligerous
+pilikai
+pililloo
+pilimiction
+pilin
+piline
+piling
+pilipilula
+pilkins
+pill
+pillage
+pillageable
+pillagee
+pillager
+pillar
+pillared
+pillaret
+pillaring
+pillarist
+pillarize
+pillarlet
+pillarlike
+pillarwise
+pillary
+pillas
+pillbox
+pilled
+pilledness
+pillet
+pilleus
+pillion
+pilliver
+pilliwinks
+pillmaker
+pillmaking
+pillmonger
+pillorization
+pillorize
+pillory
+pillow
+pillowcase
+pillowing
+pillowless
+pillowmade
+pillowwork
+pillowy
+pillworm
+pillwort
+pilm
+pilmy
+Pilobolus
+pilocarpidine
+pilocarpine
+Pilocarpus
+Pilocereus
+pilocystic
+piloerection
+pilomotor
+pilon
+pilonidal
+pilori
+pilose
+pilosebaceous
+pilosine
+pilosis
+pilosism
+pilosity
+Pilot
+pilot
+pilotage
+pilotaxitic
+pilotee
+pilothouse
+piloting
+pilotism
+pilotless
+pilotman
+pilotry
+pilotship
+pilotweed
+pilous
+Pilpai
+Pilpay
+pilpul
+pilpulist
+pilpulistic
+piltock
+pilula
+pilular
+Pilularia
+pilule
+pilulist
+pilulous
+pilum
+Pilumnus
+pilus
+pilwillet
+pily
+Pim
+Pima
+Piman
+pimaric
+pimelate
+Pimelea
+pimelic
+pimelite
+pimelitis
+Pimenta
+pimento
+pimenton
+pimgenet
+pimienta
+pimiento
+pimlico
+pimola
+pimp
+pimperlimpimp
+pimpernel
+pimpery
+Pimpinella
+pimping
+pimpish
+Pimpla
+pimple
+pimpleback
+pimpled
+pimpleproof
+Pimplinae
+pimpliness
+pimplo
+pimploe
+pimplous
+pimply
+pimpship
+pin
+pina
+Pinaceae
+pinaceous
+pinaces
+pinachrome
+pinacle
+Pinacoceras
+Pinacoceratidae
+pinacocytal
+pinacocyte
+pinacoid
+pinacoidal
+pinacol
+pinacolate
+pinacolic
+pinacolin
+pinacone
+pinacoteca
+pinaculum
+Pinacyanol
+pinafore
+pinakiolite
+pinakoidal
+pinakotheke
+Pinal
+Pinaleno
+Pinales
+pinang
+pinaster
+pinatype
+pinaverdol
+pinax
+pinball
+pinbefore
+pinbone
+pinbush
+pincase
+pincement
+pincer
+pincerlike
+pincers
+pincerweed
+pinch
+pinchable
+pinchback
+pinchbeck
+pinchbelly
+pinchcock
+pinchcommons
+pinchcrust
+pinche
+pinched
+pinchedly
+pinchedness
+pinchem
+pincher
+pinchfist
+pinchfisted
+pinchgut
+pinching
+pinchingly
+pinchpenny
+Pincian
+Pinckneya
+pincoffin
+pincpinc
+Pinctada
+pincushion
+pincushiony
+pind
+pinda
+Pindari
+Pindaric
+pindarical
+pindarically
+Pindarism
+Pindarist
+Pindarize
+Pindarus
+pinder
+pindling
+pindy
+pine
+pineal
+pinealism
+pinealoma
+pineapple
+pined
+pinedrops
+pineland
+pinene
+piner
+pinery
+pinesap
+pinetum
+pineweed
+pinewoods
+piney
+pinfall
+pinfeather
+pinfeathered
+pinfeatherer
+pinfeathery
+pinfish
+pinfold
+Ping
+ping
+pingle
+pingler
+pingue
+pinguecula
+pinguedinous
+pinguefaction
+pinguefy
+pinguescence
+pinguescent
+Pinguicula
+pinguicula
+Pinguiculaceae
+pinguiculaceous
+pinguid
+pinguidity
+pinguiferous
+pinguin
+pinguinitescent
+pinguite
+pinguitude
+pinguitudinous
+pinhead
+pinheaded
+pinheadedness
+pinhold
+pinhole
+pinhook
+pinic
+pinicoline
+pinicolous
+piniferous
+piniform
+pining
+piningly
+pinion
+pinioned
+pinionless
+pinionlike
+pinipicrin
+pinitannic
+pinite
+pinitol
+pinivorous
+pinjane
+pinjra
+pink
+pinkberry
+pinked
+pinkeen
+pinken
+pinker
+Pinkerton
+Pinkertonism
+pinkeye
+pinkfish
+pinkie
+pinkify
+pinkily
+pinkiness
+pinking
+pinkish
+pinkishness
+pinkly
+pinkness
+pinkroot
+pinksome
+Pinkster
+pinkweed
+pinkwood
+pinkwort
+pinky
+pinless
+pinlock
+pinmaker
+Pinna
+pinna
+pinnace
+pinnacle
+pinnaclet
+pinnae
+pinnaglobin
+pinnal
+pinnate
+pinnated
+pinnatedly
+pinnately
+pinnatifid
+pinnatifidly
+pinnatilobate
+pinnatilobed
+pinnation
+pinnatipartite
+pinnatiped
+pinnatisect
+pinnatisected
+pinnatodentate
+pinnatopectinate
+pinnatulate
+pinned
+pinnel
+pinner
+pinnet
+Pinnidae
+pinniferous
+pinniform
+pinnigerous
+Pinnigrada
+pinnigrade
+pinninervate
+pinninerved
+pinning
+pinningly
+pinniped
+Pinnipedia
+pinnipedian
+pinnisect
+pinnisected
+pinnitarsal
+pinnitentaculate
+pinniwinkis
+pinnock
+pinnoite
+pinnotere
+pinnothere
+Pinnotheres
+pinnotherian
+Pinnotheridae
+pinnula
+pinnular
+pinnulate
+pinnulated
+pinnule
+pinnulet
+pinny
+pino
+pinochle
+pinocytosis
+pinole
+pinoleum
+pinolia
+pinolin
+pinon
+pinonic
+pinpillow
+pinpoint
+pinprick
+pinproof
+pinrail
+pinrowed
+pinscher
+pinsons
+pint
+pinta
+pintadera
+pintado
+pintadoite
+pintail
+pintano
+pinte
+pintle
+pinto
+pintura
+pinulus
+Pinus
+pinweed
+pinwing
+pinwork
+pinworm
+piny
+pinyl
+pinyon
+pioneer
+pioneerdom
+pioneership
+pionnotes
+pioscope
+pioted
+piotine
+Piotr
+piotty
+pioury
+pious
+piously
+piousness
+Pioxe
+pip
+pipa
+pipage
+pipal
+pipe
+pipeage
+pipecoline
+pipecolinic
+piped
+pipefish
+pipeful
+pipelayer
+pipeless
+pipelike
+pipeline
+pipeman
+pipemouth
+Piper
+piper
+Piperaceae
+piperaceous
+Piperales
+piperate
+piperazin
+piperazine
+piperic
+piperide
+piperideine
+piperidge
+piperidide
+piperidine
+piperine
+piperitious
+piperitone
+piperly
+piperno
+piperoid
+piperonal
+piperonyl
+pipery
+piperylene
+pipestapple
+pipestem
+pipestone
+pipet
+pipette
+pipewalker
+pipewood
+pipework
+pipewort
+pipi
+Pipidae
+Pipil
+Pipile
+Pipilo
+piping
+pipingly
+pipingness
+pipiri
+pipistrel
+pipistrelle
+Pipistrellus
+pipit
+pipkin
+pipkinet
+pipless
+pipped
+pipper
+pippin
+pippiner
+pippinface
+pippy
+Pipra
+Pipridae
+Piprinae
+piprine
+piproid
+pipsissewa
+Piptadenia
+Piptomeris
+pipunculid
+Pipunculidae
+pipy
+piquable
+piquance
+piquancy
+piquant
+piquantly
+piquantness
+pique
+piquet
+piquia
+piqure
+pir
+piracy
+piragua
+Piranga
+piranha
+pirate
+piratelike
+piratery
+piratess
+piratical
+piratically
+piratism
+piratize
+piraty
+Pirene
+Piricularia
+pirijiri
+piripiri
+piririgua
+pirl
+pirn
+pirner
+pirnie
+pirny
+Piro
+pirogue
+pirol
+piroplasm
+Piroplasma
+piroplasmosis
+pirouette
+pirouetter
+pirouettist
+pirr
+pirraura
+pirrmaw
+pirssonite
+Pisaca
+pisaca
+pisachee
+Pisan
+pisang
+pisanite
+Pisauridae
+pisay
+piscary
+Piscataqua
+Piscataway
+piscation
+piscatology
+piscator
+piscatorial
+piscatorialist
+piscatorially
+piscatorian
+piscatorious
+piscatory
+Pisces
+piscian
+piscicapture
+piscicapturist
+piscicolous
+piscicultural
+pisciculturally
+pisciculture
+pisciculturist
+Piscid
+Piscidia
+piscifauna
+pisciferous
+pisciform
+piscina
+piscinal
+piscine
+piscinity
+Piscis
+piscivorous
+pisco
+pise
+pish
+pishaug
+pishogue
+Pishquow
+pishu
+Pisidium
+pisiform
+Pisistratean
+Pisistratidae
+pisk
+pisky
+pismire
+pismirism
+piso
+pisolite
+pisolitic
+Pisonia
+piss
+pissabed
+pissant
+pist
+pistache
+pistachio
+Pistacia
+pistacite
+pistareen
+Pistia
+pistic
+pistil
+pistillaceous
+pistillar
+pistillary
+pistillate
+pistillid
+pistilliferous
+pistilliform
+pistilligerous
+pistilline
+pistillode
+pistillody
+pistilloid
+pistilogy
+pistle
+Pistoiese
+pistol
+pistole
+pistoleer
+pistolet
+pistolgram
+pistolgraph
+pistollike
+pistolography
+pistology
+pistolproof
+pistolwise
+piston
+pistonhead
+pistonlike
+pistrix
+Pisum
+pit
+pita
+Pitahauerat
+Pitahauirata
+pitahaya
+pitanga
+pitangua
+pitapat
+pitapatation
+pitarah
+pitau
+Pitawas
+pitaya
+pitayita
+Pitcairnia
+pitch
+pitchable
+pitchblende
+pitcher
+pitchered
+pitcherful
+pitcherlike
+pitcherman
+pitchfork
+pitchhole
+pitchi
+pitchiness
+pitching
+pitchlike
+pitchman
+pitchometer
+pitchout
+pitchpike
+pitchpole
+pitchpoll
+pitchstone
+pitchwork
+pitchy
+piteous
+piteously
+piteousness
+pitfall
+pith
+pithecan
+pithecanthrope
+pithecanthropic
+pithecanthropid
+Pithecanthropidae
+pithecanthropoid
+Pithecanthropus
+Pithecia
+pithecian
+Pitheciinae
+pitheciine
+pithecism
+pithecoid
+Pithecolobium
+pithecological
+pithecometric
+pithecomorphic
+pithecomorphism
+pithful
+pithily
+pithiness
+pithless
+pithlessly
+Pithoegia
+Pithoigia
+pithole
+pithos
+pithsome
+pithwork
+pithy
+pitiability
+pitiable
+pitiableness
+pitiably
+pitiedly
+pitiedness
+pitier
+pitiful
+pitifully
+pitifulness
+pitikins
+pitiless
+pitilessly
+pitilessness
+pitless
+pitlike
+pitmaker
+pitmaking
+pitman
+pitmark
+pitmirk
+pitometer
+pitpan
+pitpit
+pitside
+Pitta
+pittacal
+pittance
+pittancer
+pitted
+pitter
+pitticite
+Pittidae
+pittine
+pitting
+Pittism
+Pittite
+pittite
+pittoid
+Pittosporaceae
+pittosporaceous
+pittospore
+Pittosporum
+Pittsburgher
+pituital
+pituitary
+pituite
+pituitous
+pituitousness
+Pituitrin
+pituri
+pitwood
+pitwork
+pitwright
+pity
+pitying
+pityingly
+Pitylus
+pityocampa
+pityproof
+pityriasic
+pityriasis
+Pityrogramma
+pityroid
+piuri
+piuricapsular
+pivalic
+pivot
+pivotal
+pivotally
+pivoter
+pix
+pixie
+pixilated
+pixilation
+pixy
+pize
+pizza
+pizzeria
+pizzicato
+pizzle
+placability
+placable
+placableness
+placably
+Placaean
+placard
+placardeer
+placarder
+placate
+placater
+placation
+placative
+placatively
+placatory
+placcate
+place
+placeable
+Placean
+placebo
+placeful
+placeless
+placelessly
+placemaker
+placemaking
+placeman
+placemanship
+placement
+placemonger
+placemongering
+placenta
+placental
+Placentalia
+placentalian
+placentary
+placentate
+placentation
+placentiferous
+placentiform
+placentigerous
+placentitis
+placentoid
+placentoma
+placer
+placet
+placewoman
+placid
+placidity
+placidly
+placidness
+placitum
+plack
+placket
+plackless
+placochromatic
+placode
+placoderm
+placodermal
+placodermatous
+Placodermi
+placodermoid
+placodont
+Placodontia
+Placodus
+placoganoid
+placoganoidean
+Placoganoidei
+placoid
+placoidal
+placoidean
+Placoidei
+Placoides
+Placophora
+placophoran
+placoplast
+placula
+placuntitis
+placuntoma
+Placus
+pladaroma
+pladarosis
+plaga
+plagal
+plagate
+plage
+Plagianthus
+plagiaplite
+plagiarical
+plagiarism
+plagiarist
+plagiaristic
+plagiaristically
+plagiarization
+plagiarize
+plagiarizer
+plagiary
+plagihedral
+plagiocephalic
+plagiocephalism
+plagiocephaly
+Plagiochila
+plagioclase
+plagioclasite
+plagioclastic
+plagioclinal
+plagiodont
+plagiograph
+plagioliparite
+plagionite
+plagiopatagium
+plagiophyre
+Plagiostomata
+plagiostomatous
+plagiostome
+Plagiostomi
+plagiostomous
+plagiotropic
+plagiotropically
+plagiotropism
+plagiotropous
+plagium
+plagose
+plagosity
+plague
+plagued
+plagueful
+plagueless
+plagueproof
+plaguer
+plaguesome
+plaguesomeness
+plaguily
+plaguy
+plaice
+plaid
+plaided
+plaidie
+plaiding
+plaidman
+plaidy
+plain
+plainback
+plainbacks
+plainer
+plainful
+plainhearted
+plainish
+plainly
+plainness
+plainscraft
+plainsfolk
+plainsman
+plainsoled
+plainstones
+plainswoman
+plaint
+plaintail
+plaintiff
+plaintiffship
+plaintile
+plaintive
+plaintively
+plaintiveness
+plaintless
+plainward
+plaister
+plait
+plaited
+plaiter
+plaiting
+plaitless
+plaitwork
+plak
+plakat
+plan
+planable
+planaea
+planar
+Planaria
+planarian
+Planarida
+planaridan
+planariform
+planarioid
+planarity
+planate
+planation
+planch
+plancheite
+plancher
+planchet
+planchette
+planching
+planchment
+plancier
+Planckian
+plandok
+plane
+planeness
+planer
+Planera
+planet
+planeta
+planetable
+planetabler
+planetal
+planetaria
+planetarian
+planetarily
+planetarium
+planetary
+planeted
+planetesimal
+planeticose
+planeting
+planetist
+planetkin
+planetless
+planetlike
+planetogeny
+planetography
+planetoid
+planetoidal
+planetologic
+planetologist
+planetology
+planetule
+planform
+planful
+planfully
+planfulness
+plang
+plangency
+plangent
+plangently
+plangor
+plangorous
+planicaudate
+planicipital
+planidorsate
+planifolious
+planiform
+planigraph
+planilla
+planimetric
+planimetrical
+planimetry
+planineter
+planipennate
+Planipennia
+planipennine
+planipetalous
+planiphyllous
+planirostral
+planirostrate
+planiscope
+planiscopic
+planish
+planisher
+planispheral
+planisphere
+planispheric
+planispherical
+planispiral
+planity
+plank
+plankage
+plankbuilt
+planker
+planking
+plankless
+planklike
+planksheer
+plankter
+planktologist
+planktology
+plankton
+planktonic
+planktont
+plankways
+plankwise
+planky
+planless
+planlessly
+planlessness
+planner
+planoblast
+planoblastic
+Planococcus
+planoconical
+planocylindric
+planoferrite
+planogamete
+planograph
+planographic
+planographist
+planography
+planohorizontal
+planolindrical
+planometer
+planometry
+planomiller
+planoorbicular
+Planorbidae
+planorbiform
+planorbine
+Planorbis
+planorboid
+planorotund
+Planosarcina
+planosol
+planosome
+planospiral
+planospore
+planosubulate
+plant
+planta
+plantable
+plantad
+Plantae
+plantage
+Plantaginaceae
+plantaginaceous
+Plantaginales
+plantagineous
+Plantago
+plantain
+plantal
+plantar
+plantaris
+plantarium
+plantation
+plantationlike
+plantdom
+planter
+planterdom
+planterly
+plantership
+Plantigrada
+plantigrade
+plantigrady
+planting
+plantivorous
+plantless
+plantlet
+plantlike
+plantling
+plantocracy
+plantsman
+plantula
+plantular
+plantule
+planula
+planulan
+planular
+planulate
+planuliform
+planuloid
+Planuloidea
+planuria
+planury
+planxty
+plap
+plappert
+plaque
+plaquette
+plash
+plasher
+plashet
+plashingly
+plashment
+plashy
+plasm
+plasma
+plasmagene
+plasmapheresis
+plasmase
+plasmatic
+plasmatical
+plasmation
+plasmatoparous
+plasmatorrhexis
+plasmic
+plasmocyte
+plasmocytoma
+plasmode
+plasmodesm
+plasmodesma
+plasmodesmal
+plasmodesmic
+plasmodesmus
+plasmodia
+plasmodial
+plasmodiate
+plasmodic
+plasmodiocarp
+plasmodiocarpous
+Plasmodiophora
+Plasmodiophoraceae
+Plasmodiophorales
+plasmodium
+plasmogen
+plasmolysis
+plasmolytic
+plasmolytically
+plasmolyzability
+plasmolyzable
+plasmolyze
+plasmoma
+Plasmon
+Plasmopara
+plasmophagous
+plasmophagy
+plasmoptysis
+plasmosoma
+plasmosome
+plasmotomy
+plasome
+plass
+plasson
+plastein
+plaster
+plasterbill
+plasterboard
+plasterer
+plasteriness
+plastering
+plasterlike
+plasterwise
+plasterwork
+plastery
+Plastic
+plastic
+plastically
+plasticimeter
+Plasticine
+plasticine
+plasticism
+plasticity
+plasticization
+plasticize
+plasticizer
+plasticly
+plastics
+plastid
+plastidium
+plastidome
+Plastidozoa
+plastidular
+plastidule
+plastify
+plastin
+plastinoid
+plastisol
+plastochondria
+plastochron
+plastochrone
+plastodynamia
+plastodynamic
+plastogamic
+plastogamy
+plastogene
+plastomere
+plastometer
+plastosome
+plastotype
+plastral
+plastron
+plastrum
+plat
+Plataean
+Platalea
+Plataleidae
+plataleiform
+Plataleinae
+plataleine
+platan
+Platanaceae
+platanaceous
+platane
+platanist
+Platanista
+Platanistidae
+platano
+Platanus
+platband
+platch
+plate
+platea
+plateasm
+plateau
+plateaux
+plated
+plateful
+plateholder
+plateiasmus
+platelayer
+plateless
+platelet
+platelike
+platemaker
+platemaking
+plateman
+platen
+plater
+platerer
+plateresque
+platery
+plateway
+platework
+plateworker
+platform
+platformally
+platformed
+platformer
+platformish
+platformism
+platformist
+platformistic
+platformless
+platformy
+platic
+platicly
+platilla
+platina
+platinamine
+platinammine
+platinate
+Platine
+plating
+platinic
+platinichloric
+platinichloride
+platiniferous
+platiniridium
+platinite
+platinization
+platinize
+platinochloric
+platinochloride
+platinocyanic
+platinocyanide
+platinoid
+platinotype
+platinous
+platinum
+platinumsmith
+platitude
+platitudinal
+platitudinarian
+platitudinarianism
+platitudinism
+platitudinist
+platitudinization
+platitudinize
+platitudinizer
+platitudinous
+platitudinously
+platitudinousness
+Platoda
+platode
+Platodes
+platoid
+Platonesque
+platonesque
+Platonian
+Platonic
+Platonical
+Platonically
+Platonicalness
+Platonician
+Platonicism
+Platonism
+Platonist
+Platonistic
+Platonization
+Platonize
+Platonizer
+platoon
+platopic
+platosamine
+platosammine
+Platt
+Plattdeutsch
+platted
+platten
+platter
+platterface
+platterful
+platting
+plattnerite
+platty
+platurous
+platy
+platybasic
+platybrachycephalic
+platybrachycephalous
+platybregmatic
+platycarpous
+Platycarpus
+Platycarya
+platycelian
+platycelous
+platycephalic
+Platycephalidae
+platycephalism
+platycephaloid
+platycephalous
+Platycephalus
+platycephaly
+Platycercinae
+platycercine
+Platycercus
+Platycerium
+platycheiria
+platycnemia
+platycnemic
+Platycodon
+platycoria
+platycrania
+platycranial
+Platyctenea
+platycyrtean
+platydactyl
+platydactyle
+platydactylous
+platydolichocephalic
+platydolichocephalous
+platyfish
+platyglossal
+platyglossate
+platyglossia
+Platyhelmia
+platyhelminth
+Platyhelminthes
+platyhelminthic
+platyhieric
+platykurtic
+platylobate
+platymeria
+platymeric
+platymery
+platymesaticephalic
+platymesocephalic
+platymeter
+platymyoid
+platynite
+platynotal
+platyodont
+platyope
+platyopia
+platyopic
+platypellic
+platypetalous
+platyphyllous
+platypod
+Platypoda
+platypodia
+platypodous
+Platyptera
+platypus
+platypygous
+Platyrhina
+Platyrhini
+platyrhynchous
+platyrrhin
+Platyrrhina
+platyrrhine
+Platyrrhini
+platyrrhinian
+platyrrhinic
+platyrrhinism
+platyrrhiny
+platysma
+platysmamyoides
+platysomid
+Platysomidae
+Platysomus
+platystaphyline
+Platystemon
+platystencephalia
+platystencephalic
+platystencephalism
+platystencephaly
+platysternal
+Platysternidae
+Platystomidae
+platystomous
+platytrope
+platytropy
+plaud
+plaudation
+plaudit
+plaudite
+plauditor
+plauditory
+plauenite
+plausibility
+plausible
+plausibleness
+plausibly
+plausive
+plaustral
+Plautine
+Plautus
+play
+playa
+playability
+playable
+playback
+playbill
+playbook
+playbox
+playboy
+playboyism
+playbroker
+playcraft
+playcraftsman
+playday
+playdown
+player
+playerdom
+playeress
+playfellow
+playfellowship
+playfield
+playfolk
+playful
+playfully
+playfulness
+playgoer
+playgoing
+playground
+playhouse
+playingly
+playless
+playlet
+playlike
+playmaker
+playmaking
+playman
+playmare
+playmate
+playmonger
+playmongering
+playock
+playpen
+playreader
+playroom
+playscript
+playsome
+playsomely
+playsomeness
+playstead
+plaything
+playtime
+playward
+playwoman
+playwork
+playwright
+playwrightess
+playwrighting
+playwrightry
+playwriter
+playwriting
+plaza
+plazolite
+plea
+pleach
+pleached
+pleacher
+plead
+pleadable
+pleadableness
+pleader
+pleading
+pleadingly
+pleadingness
+pleaproof
+pleasable
+pleasableness
+pleasance
+pleasant
+pleasantable
+pleasantish
+pleasantly
+pleasantness
+pleasantry
+pleasantsome
+please
+pleasedly
+pleasedness
+pleaseman
+pleaser
+pleaship
+pleasing
+pleasingly
+pleasingness
+pleasurability
+pleasurable
+pleasurableness
+pleasurably
+pleasure
+pleasureful
+pleasurehood
+pleasureless
+pleasurelessly
+pleasureman
+pleasurement
+pleasuremonger
+pleasureproof
+pleasurer
+pleasuring
+pleasurist
+pleasurous
+pleat
+pleater
+pleatless
+pleb
+plebe
+plebeian
+plebeiance
+plebeianize
+plebeianly
+plebeianness
+plebeity
+plebianism
+plebicolar
+plebicolist
+plebificate
+plebification
+plebify
+plebiscitarian
+plebiscitarism
+plebiscitary
+plebiscite
+plebiscitic
+plebiscitum
+plebs
+pleck
+Plecoptera
+plecopteran
+plecopterid
+plecopterous
+Plecotinae
+plecotine
+Plecotus
+plectognath
+Plectognathi
+plectognathic
+plectognathous
+plectopter
+plectopteran
+plectopterous
+plectospondyl
+Plectospondyli
+plectospondylous
+plectre
+plectridial
+plectridium
+plectron
+plectrum
+pled
+pledge
+pledgeable
+pledgee
+pledgeless
+pledgeor
+pledger
+pledgeshop
+pledget
+pledgor
+Plegadis
+plegaphonia
+plegometer
+Pleiades
+pleiobar
+pleiochromia
+pleiochromic
+pleiomastia
+pleiomazia
+pleiomerous
+pleiomery
+pleion
+Pleione
+pleionian
+pleiophyllous
+pleiophylly
+pleiotaxis
+pleiotropic
+pleiotropically
+pleiotropism
+Pleistocene
+Pleistocenic
+pleistoseist
+plemochoe
+plemyrameter
+plenarily
+plenariness
+plenarium
+plenarty
+plenary
+plenicorn
+pleniloquence
+plenilunal
+plenilunar
+plenilunary
+plenilune
+plenipo
+plenipotence
+plenipotent
+plenipotential
+plenipotentiality
+plenipotentiarily
+plenipotentiarize
+Plenipotentiary
+plenipotentiary
+plenipotentiaryship
+plenish
+plenishing
+plenishment
+plenism
+plenist
+plenitide
+plenitude
+plenitudinous
+plenshing
+plenteous
+plenteously
+plenteousness
+plentiful
+plentifully
+plentifulness
+plentify
+plenty
+plenum
+pleny
+pleochroic
+pleochroism
+pleochroitic
+pleochromatic
+pleochromatism
+pleochroous
+pleocrystalline
+pleodont
+pleomastia
+pleomastic
+pleomazia
+pleometrosis
+pleometrotic
+pleomorph
+pleomorphic
+pleomorphism
+pleomorphist
+pleomorphous
+pleomorphy
+pleon
+pleonal
+pleonasm
+pleonast
+pleonaste
+pleonastic
+pleonastical
+pleonastically
+pleonectic
+pleonexia
+pleonic
+pleophyletic
+pleopod
+pleopodite
+Pleospora
+Pleosporaceae
+plerergate
+plerocercoid
+pleroma
+pleromatic
+plerome
+pleromorph
+plerophoric
+plerophory
+plerosis
+plerotic
+Plesianthropus
+plesiobiosis
+plesiobiotic
+plesiomorphic
+plesiomorphism
+plesiomorphous
+plesiosaur
+Plesiosauri
+Plesiosauria
+plesiosaurian
+plesiosauroid
+Plesiosaurus
+plesiotype
+plessigraph
+plessimeter
+plessimetric
+plessimetry
+plessor
+Plethodon
+plethodontid
+Plethodontidae
+plethora
+plethoretic
+plethoretical
+plethoric
+plethorical
+plethorically
+plethorous
+plethory
+plethysmograph
+plethysmographic
+plethysmographically
+plethysmography
+pleura
+Pleuracanthea
+Pleuracanthidae
+Pleuracanthini
+pleuracanthoid
+Pleuracanthus
+pleural
+pleuralgia
+pleuralgic
+pleurapophysial
+pleurapophysis
+pleurectomy
+pleurenchyma
+pleurenchymatous
+pleuric
+pleuriseptate
+pleurisy
+pleurite
+pleuritic
+pleuritical
+pleuritically
+pleuritis
+Pleurobrachia
+Pleurobrachiidae
+pleurobranch
+pleurobranchia
+pleurobranchial
+pleurobranchiate
+pleurobronchitis
+Pleurocapsa
+Pleurocapsaceae
+pleurocapsaceous
+pleurocarp
+Pleurocarpi
+pleurocarpous
+pleurocele
+pleurocentesis
+pleurocentral
+pleurocentrum
+Pleurocera
+pleurocerebral
+Pleuroceridae
+pleuroceroid
+Pleurococcaceae
+pleurococcaceous
+Pleurococcus
+Pleurodelidae
+Pleurodira
+pleurodiran
+pleurodire
+pleurodirous
+pleurodiscous
+pleurodont
+pleurodynia
+pleurodynic
+pleurogenic
+pleurogenous
+pleurohepatitis
+pleuroid
+pleurolith
+pleurolysis
+pleuron
+Pleuronectes
+pleuronectid
+Pleuronectidae
+pleuronectoid
+Pleuronema
+pleuropedal
+pleuropericardial
+pleuropericarditis
+pleuroperitonaeal
+pleuroperitoneal
+pleuroperitoneum
+pleuropneumonia
+pleuropneumonic
+pleuropodium
+pleuropterygian
+Pleuropterygii
+pleuropulmonary
+pleurorrhea
+Pleurosaurus
+Pleurosigma
+pleurospasm
+pleurosteal
+Pleurosteon
+pleurostict
+Pleurosticti
+Pleurostigma
+pleurothotonic
+pleurothotonus
+Pleurotoma
+Pleurotomaria
+Pleurotomariidae
+pleurotomarioid
+Pleurotomidae
+pleurotomine
+pleurotomoid
+pleurotomy
+pleurotonic
+pleurotonus
+Pleurotremata
+pleurotribal
+pleurotribe
+pleurotropous
+Pleurotus
+pleurotyphoid
+pleurovisceral
+pleurum
+pleuston
+pleustonic
+plew
+plex
+plexal
+plexicose
+plexiform
+pleximeter
+pleximetric
+pleximetry
+plexodont
+plexometer
+plexor
+plexure
+plexus
+pliability
+pliable
+pliableness
+pliably
+pliancy
+pliant
+pliantly
+pliantness
+plica
+plicable
+plical
+plicate
+plicated
+plicately
+plicateness
+plicater
+plicatile
+plication
+plicative
+plicatocontorted
+plicatocristate
+plicatolacunose
+plicatolobate
+plicatopapillose
+plicator
+plicatoundulate
+plicatulate
+plicature
+pliciferous
+pliciform
+plier
+pliers
+plight
+plighted
+plighter
+plim
+plimsoll
+Plinian
+plinth
+plinther
+plinthiform
+plinthless
+plinthlike
+Pliny
+Plinyism
+Pliocene
+Pliohippus
+Pliopithecus
+pliosaur
+pliosaurian
+Pliosauridae
+Pliosaurus
+pliothermic
+Pliotron
+pliskie
+plisky
+ploat
+ploce
+Ploceidae
+ploceiform
+Ploceinae
+Ploceus
+plock
+plod
+plodder
+plodderly
+plodding
+ploddingly
+ploddingness
+plodge
+Ploima
+ploimate
+plomb
+plook
+plop
+ploration
+ploratory
+plosion
+plosive
+plot
+plote
+plotful
+Plotinian
+Plotinic
+Plotinical
+Plotinism
+Plotinist
+Plotinize
+plotless
+plotlessness
+plotproof
+plottage
+plotted
+plotter
+plottery
+plotting
+plottingly
+plotty
+plough
+ploughmanship
+ploughtail
+plouk
+plouked
+plouky
+plounce
+plousiocracy
+plout
+Plouteneion
+plouter
+plover
+ploverlike
+plovery
+plow
+plowable
+plowbote
+plowboy
+plower
+plowfish
+plowfoot
+plowgang
+plowgate
+plowgraith
+plowhead
+plowing
+plowjogger
+plowland
+plowlight
+plowline
+plowmaker
+plowman
+plowmanship
+plowmell
+plowpoint
+Plowrightia
+plowshare
+plowshoe
+plowstaff
+plowstilt
+plowtail
+plowwise
+plowwoman
+plowwright
+ploy
+ployment
+Pluchea
+pluck
+pluckage
+plucked
+pluckedness
+plucker
+Pluckerian
+pluckily
+pluckiness
+pluckless
+plucklessness
+plucky
+plud
+pluff
+pluffer
+pluffy
+plug
+plugboard
+plugdrawer
+pluggable
+plugged
+plugger
+plugging
+pluggingly
+pluggy
+plughole
+plugless
+pluglike
+plugman
+plugtray
+plugtree
+plum
+pluma
+plumaceous
+plumach
+plumade
+plumage
+plumaged
+plumagery
+plumasite
+plumate
+Plumatella
+plumatellid
+Plumatellidae
+plumatelloid
+plumb
+plumbable
+plumbage
+Plumbaginaceae
+plumbaginaceous
+plumbagine
+plumbaginous
+plumbago
+plumbate
+plumbean
+plumbeous
+plumber
+plumbership
+plumbery
+plumbet
+plumbic
+plumbiferous
+plumbing
+plumbism
+plumbisolvent
+plumbite
+plumbless
+plumbness
+plumbog
+plumbojarosite
+plumboniobate
+plumbosolvency
+plumbosolvent
+plumbous
+plumbum
+plumcot
+plumdamas
+plumdamis
+plume
+plumed
+plumeless
+plumelet
+plumelike
+plumemaker
+plumemaking
+plumeopicean
+plumeous
+plumer
+plumery
+plumet
+plumette
+plumicorn
+plumier
+Plumiera
+plumieride
+plumification
+plumiform
+plumiformly
+plumify
+plumigerous
+pluminess
+plumiped
+plumipede
+plumist
+plumless
+plumlet
+plumlike
+plummer
+plummet
+plummeted
+plummetless
+plummy
+plumose
+plumosely
+plumoseness
+plumosity
+plumous
+plump
+plumpen
+plumper
+plumping
+plumpish
+plumply
+plumpness
+plumps
+plumpy
+plumula
+plumulaceous
+plumular
+Plumularia
+plumularian
+Plumulariidae
+plumulate
+plumule
+plumuliform
+plumulose
+plumy
+plunder
+plunderable
+plunderage
+plunderbund
+plunderer
+plunderess
+plundering
+plunderingly
+plunderless
+plunderous
+plunderproof
+plunge
+plunger
+plunging
+plungingly
+plunk
+plunther
+plup
+plupatriotic
+pluperfect
+pluperfectly
+pluperfectness
+plural
+pluralism
+pluralist
+pluralistic
+pluralistically
+plurality
+pluralization
+pluralize
+pluralizer
+plurally
+plurative
+plurennial
+pluriaxial
+pluricarinate
+pluricarpellary
+pluricellular
+pluricentral
+pluricipital
+pluricuspid
+pluricuspidate
+pluridentate
+pluries
+plurifacial
+plurifetation
+plurification
+pluriflagellate
+pluriflorous
+plurifoliate
+plurifoliolate
+plurify
+pluriglandular
+pluriguttulate
+plurilateral
+plurilingual
+plurilingualism
+plurilingualist
+plurilocular
+plurimammate
+plurinominal
+plurinucleate
+pluripara
+pluriparity
+pluriparous
+pluripartite
+pluripetalous
+pluripotence
+pluripotent
+pluripresence
+pluriseptate
+pluriserial
+pluriseriate
+pluriseriated
+plurisetose
+plurispiral
+plurisporous
+plurisyllabic
+plurisyllable
+plurivalent
+plurivalve
+plurivorous
+plurivory
+plus
+plush
+plushed
+plushette
+plushily
+plushiness
+plushlike
+plushy
+Plusia
+Plusiinae
+plusquamperfect
+plussage
+Plutarchian
+Plutarchic
+Plutarchical
+Plutarchically
+plutarchy
+pluteal
+plutean
+pluteiform
+Plutella
+pluteus
+Pluto
+plutocracy
+plutocrat
+plutocratic
+plutocratical
+plutocratically
+plutolatry
+plutological
+plutologist
+plutology
+plutomania
+Plutonian
+plutonian
+plutonic
+Plutonion
+plutonism
+plutonist
+plutonite
+Plutonium
+plutonium
+plutonometamorphism
+plutonomic
+plutonomist
+plutonomy
+pluvial
+pluvialiform
+pluvialine
+Pluvialis
+pluvian
+pluvine
+pluviograph
+pluviographic
+pluviographical
+pluviography
+pluviometer
+pluviometric
+pluviometrical
+pluviometrically
+pluviometry
+pluvioscope
+pluviose
+pluviosity
+pluvious
+ply
+plyer
+plying
+plyingly
+Plymouth
+Plymouthism
+Plymouthist
+Plymouthite
+Plynlymmon
+plywood
+pneodynamics
+pneograph
+pneomanometer
+pneometer
+pneometry
+pneophore
+pneoscope
+pneuma
+pneumarthrosis
+pneumathaemia
+pneumatic
+pneumatical
+pneumatically
+pneumaticity
+pneumatics
+pneumatism
+pneumatist
+pneumatize
+pneumatized
+pneumatocardia
+pneumatocele
+pneumatochemical
+pneumatochemistry
+pneumatocyst
+pneumatocystic
+pneumatode
+pneumatogenic
+pneumatogenous
+pneumatogram
+pneumatograph
+pneumatographer
+pneumatographic
+pneumatography
+pneumatolitic
+pneumatologic
+pneumatological
+pneumatologist
+pneumatology
+pneumatolysis
+pneumatolytic
+Pneumatomachian
+Pneumatomachist
+Pneumatomachy
+pneumatometer
+pneumatometry
+pneumatomorphic
+pneumatonomy
+pneumatophany
+pneumatophilosophy
+pneumatophobia
+pneumatophonic
+pneumatophony
+pneumatophore
+pneumatophorous
+pneumatorrhachis
+pneumatoscope
+pneumatosic
+pneumatosis
+pneumatotactic
+pneumatotherapeutics
+pneumatotherapy
+Pneumatria
+pneumaturia
+pneumectomy
+pneumobacillus
+Pneumobranchia
+Pneumobranchiata
+pneumocele
+pneumocentesis
+pneumochirurgia
+pneumococcal
+pneumococcemia
+pneumococcic
+pneumococcous
+pneumococcus
+pneumoconiosis
+pneumoderma
+pneumodynamic
+pneumodynamics
+pneumoencephalitis
+pneumoenteritis
+pneumogastric
+pneumogram
+pneumograph
+pneumographic
+pneumography
+pneumohemothorax
+pneumohydropericardium
+pneumohydrothorax
+pneumolith
+pneumolithiasis
+pneumological
+pneumology
+pneumolysis
+pneumomalacia
+pneumomassage
+Pneumometer
+pneumomycosis
+pneumonalgia
+pneumonectasia
+pneumonectomy
+pneumonedema
+pneumonia
+pneumonic
+pneumonitic
+pneumonitis
+pneumonocace
+pneumonocarcinoma
+pneumonocele
+pneumonocentesis
+pneumonocirrhosis
+pneumonoconiosis
+pneumonodynia
+pneumonoenteritis
+pneumonoerysipelas
+pneumonographic
+pneumonography
+pneumonokoniosis
+pneumonolith
+pneumonolithiasis
+pneumonolysis
+pneumonomelanosis
+pneumonometer
+pneumonomycosis
+pneumonoparesis
+pneumonopathy
+pneumonopexy
+pneumonophorous
+pneumonophthisis
+pneumonopleuritis
+pneumonorrhagia
+pneumonorrhaphy
+pneumonosis
+pneumonotherapy
+pneumonotomy
+pneumony
+pneumopericardium
+pneumoperitoneum
+pneumoperitonitis
+pneumopexy
+pneumopleuritis
+pneumopyothorax
+pneumorrachis
+pneumorrhachis
+pneumorrhagia
+pneumotactic
+pneumotherapeutics
+pneumotherapy
+pneumothorax
+pneumotomy
+pneumotoxin
+pneumotropic
+pneumotropism
+pneumotyphoid
+pneumotyphus
+pneumoventriculography
+Po
+po
+Poa
+Poaceae
+poaceous
+poach
+poachable
+poacher
+poachiness
+poachy
+Poales
+poalike
+pob
+pobby
+Poblacht
+poblacion
+pobs
+pochade
+pochard
+pochay
+poche
+pochette
+pocilliform
+pock
+pocket
+pocketable
+pocketableness
+pocketbook
+pocketed
+pocketer
+pocketful
+pocketing
+pocketknife
+pocketless
+pocketlike
+pockety
+pockhouse
+pockily
+pockiness
+pockmanteau
+pockmantie
+pockmark
+pockweed
+pockwood
+pocky
+poco
+pococurante
+pococuranteism
+pococurantic
+pococurantish
+pococurantism
+pococurantist
+pocosin
+poculary
+poculation
+poculent
+poculiform
+pod
+podagra
+podagral
+podagric
+podagrical
+podagrous
+podal
+podalgia
+podalic
+Podaliriidae
+Podalirius
+Podarge
+Podargidae
+Podarginae
+podargine
+podargue
+Podargus
+podarthral
+podarthritis
+podarthrum
+podatus
+Podaxonia
+podaxonial
+podded
+podder
+poddidge
+poddish
+poddle
+poddy
+podelcoma
+podeon
+podesta
+podesterate
+podetiiform
+podetium
+podex
+podge
+podger
+podgily
+podginess
+podgy
+podial
+podiatrist
+podiatry
+podical
+Podiceps
+podices
+Podicipedidae
+podilegous
+podite
+poditic
+poditti
+podium
+podler
+podley
+podlike
+podobranch
+podobranchia
+podobranchial
+podobranchiate
+podocarp
+Podocarpaceae
+Podocarpineae
+podocarpous
+Podocarpus
+podocephalous
+pododerm
+pododynia
+podogyn
+podogyne
+podogynium
+Podolian
+podolite
+podology
+podomancy
+podomere
+podometer
+podometry
+Podophrya
+Podophryidae
+Podophthalma
+Podophthalmata
+podophthalmate
+podophthalmatous
+Podophthalmia
+podophthalmian
+podophthalmic
+podophthalmite
+podophthalmitic
+podophthalmous
+Podophyllaceae
+podophyllic
+podophyllin
+podophyllotoxin
+podophyllous
+Podophyllum
+podophyllum
+podoscaph
+podoscapher
+podoscopy
+Podosomata
+podosomatous
+podosperm
+Podosphaera
+Podostemaceae
+podostemaceous
+podostemad
+Podostemon
+Podostemonaceae
+podostemonaceous
+Podostomata
+podostomatous
+podotheca
+podothecal
+Podozamites
+Podsnap
+Podsnappery
+podsol
+podsolic
+podsolization
+podsolize
+Podunk
+Podura
+poduran
+podurid
+Poduridae
+podware
+podzol
+podzolic
+podzolization
+podzolize
+poe
+Poecile
+Poeciliidae
+poecilitic
+Poecilocyttares
+poecilocyttarous
+poecilogonous
+poecilogony
+poecilomere
+poecilonym
+poecilonymic
+poecilonymy
+poecilopod
+Poecilopoda
+poecilopodous
+poem
+poematic
+poemet
+poemlet
+Poephaga
+poephagous
+Poephagus
+poesie
+poesiless
+poesis
+poesy
+poet
+poetaster
+poetastering
+poetasterism
+poetastery
+poetastress
+poetastric
+poetastrical
+poetastry
+poetcraft
+poetdom
+poetesque
+poetess
+poethood
+poetic
+poetical
+poeticality
+poetically
+poeticalness
+poeticism
+poeticize
+poeticness
+poetics
+poeticule
+poetito
+poetization
+poetize
+poetizer
+poetless
+poetlike
+poetling
+poetly
+poetomachia
+poetress
+poetry
+poetryless
+poetship
+poetwise
+pogamoggan
+pogge
+poggy
+Pogo
+Pogonatum
+Pogonia
+pogoniasis
+pogoniate
+pogonion
+pogonip
+pogoniris
+pogonite
+pogonological
+pogonologist
+pogonology
+pogonotomy
+pogonotrophy
+pogrom
+pogromist
+pogromize
+pogy
+poh
+poha
+pohickory
+pohna
+pohutukawa
+poi
+Poiana
+Poictesme
+poietic
+poignance
+poignancy
+poignant
+poignantly
+poignet
+poikilitic
+poikiloblast
+poikiloblastic
+poikilocyte
+poikilocythemia
+poikilocytosis
+poikilotherm
+poikilothermic
+poikilothermism
+poil
+poilu
+poimenic
+poimenics
+Poinciana
+poind
+poindable
+poinder
+poinding
+Poinsettia
+point
+pointable
+pointage
+pointed
+pointedly
+pointedness
+pointel
+pointer
+pointful
+pointfully
+pointfulness
+pointillism
+pointillist
+pointing
+pointingly
+pointless
+pointlessly
+pointlessness
+pointlet
+pointleted
+pointmaker
+pointman
+pointment
+pointrel
+pointsman
+pointswoman
+pointways
+pointwise
+pointy
+poisable
+poise
+poised
+poiser
+poison
+poisonable
+poisonful
+poisonfully
+poisoning
+poisonless
+poisonlessness
+poisonmaker
+poisonous
+poisonously
+poisonousness
+poisonproof
+poisonweed
+poisonwood
+poitrail
+poitrel
+poivrade
+pokable
+Pokan
+Pokanoket
+poke
+pokeberry
+poked
+pokeful
+pokeloken
+pokeout
+poker
+pokerish
+pokerishly
+pokerishness
+pokeroot
+pokeweed
+pokey
+pokily
+pokiness
+poking
+Pokom
+Pokomam
+Pokomo
+pokomoo
+Pokonchi
+pokunt
+poky
+pol
+Polab
+Polabian
+Polabish
+polacca
+Polack
+polack
+polacre
+Polander
+Polanisia
+polar
+polaric
+Polarid
+polarigraphic
+polarimeter
+polarimetric
+polarimetry
+Polaris
+polariscope
+polariscopic
+polariscopically
+polariscopist
+polariscopy
+polaristic
+polaristrobometer
+polarity
+polarizability
+polarizable
+polarization
+polarize
+polarizer
+polarly
+polarogram
+polarograph
+polarographic
+polarographically
+polarography
+Polaroid
+polarward
+polaxis
+poldavis
+poldavy
+polder
+polderboy
+polderman
+Pole
+pole
+polearm
+poleax
+poleaxe
+poleaxer
+poleburn
+polecat
+polehead
+poleless
+poleman
+polemarch
+polemic
+polemical
+polemically
+polemician
+polemicist
+polemics
+polemist
+polemize
+Polemoniaceae
+polemoniaceous
+Polemoniales
+Polemonium
+polemoscope
+polenta
+poler
+polesetter
+Polesian
+polesman
+polestar
+poleward
+polewards
+poley
+poliad
+poliadic
+Polian
+polianite
+Polianthes
+police
+policed
+policedom
+policeless
+policeman
+policemanish
+policemanism
+policemanlike
+policemanship
+policewoman
+Polichinelle
+policial
+policize
+policizer
+policlinic
+policy
+policyholder
+poliencephalitis
+poliencephalomyelitis
+poligar
+poligarship
+poligraphical
+Polinices
+polio
+polioencephalitis
+polioencephalomyelitis
+poliomyelitis
+poliomyelopathy
+polioneuromere
+poliorcetic
+poliorcetics
+poliosis
+polis
+Polish
+polish
+polishable
+polished
+polishedly
+polishedness
+polisher
+polishment
+polisman
+polissoir
+Polistes
+politarch
+politarchic
+Politbureau
+Politburo
+polite
+politeful
+politely
+politeness
+politesse
+politic
+political
+politicalism
+politicalize
+politically
+politicaster
+politician
+politicious
+politicist
+politicize
+politicizer
+politicly
+politico
+politicomania
+politicophobia
+politics
+politied
+Politique
+politist
+politize
+polity
+politzerization
+politzerize
+polk
+polka
+Poll
+poll
+pollable
+pollack
+polladz
+pollage
+pollakiuria
+pollam
+pollan
+pollarchy
+pollard
+pollbook
+polled
+pollen
+pollened
+polleniferous
+pollenigerous
+pollenite
+pollenivorous
+pollenless
+pollenlike
+pollenproof
+pollent
+poller
+polleten
+pollex
+pollical
+pollicar
+pollicate
+pollicitation
+pollinar
+pollinarium
+pollinate
+pollination
+pollinator
+pollinctor
+pollincture
+polling
+pollinia
+pollinic
+pollinical
+polliniferous
+pollinigerous
+pollinium
+pollinivorous
+pollinization
+pollinize
+pollinizer
+pollinodial
+pollinodium
+pollinoid
+pollinose
+pollinosis
+polliwig
+polliwog
+pollock
+polloi
+pollster
+pollucite
+pollutant
+pollute
+polluted
+pollutedly
+pollutedness
+polluter
+polluting
+pollutingly
+pollution
+Pollux
+pollux
+Polly
+Pollyanna
+Pollyannish
+pollywog
+polo
+poloconic
+polocyte
+poloist
+polonaise
+Polonese
+Polonia
+Polonial
+Polonian
+Polonism
+polonium
+Polonius
+Polonization
+Polonize
+polony
+polos
+polska
+polt
+poltergeist
+poltfoot
+poltfooted
+poltina
+poltinnik
+poltophagic
+poltophagist
+poltophagy
+poltroon
+poltroonery
+poltroonish
+poltroonishly
+poltroonism
+poluphloisboic
+poluphloisboiotatotic
+poluphloisboiotic
+polverine
+poly
+polyacanthus
+polyacid
+polyacoustic
+polyacoustics
+polyact
+polyactinal
+polyactine
+Polyactinia
+polyad
+polyadelph
+Polyadelphia
+polyadelphian
+polyadelphous
+polyadenia
+polyadenitis
+polyadenoma
+polyadenous
+polyadic
+polyaffectioned
+polyalcohol
+polyamide
+polyamylose
+Polyandria
+polyandria
+polyandrian
+polyandrianism
+polyandric
+polyandrious
+polyandrism
+polyandrist
+polyandrium
+polyandrous
+polyandry
+Polyangium
+polyangular
+polyantha
+polyanthous
+polyanthus
+polyanthy
+polyarch
+polyarchal
+polyarchical
+polyarchist
+polyarchy
+polyarteritis
+polyarthric
+polyarthritic
+polyarthritis
+polyarthrous
+polyarticular
+polyatomic
+polyatomicity
+polyautographic
+polyautography
+polyaxial
+polyaxon
+polyaxone
+polyaxonic
+polybasic
+polybasicity
+polybasite
+polyblast
+Polyborinae
+polyborine
+Polyborus
+polybranch
+Polybranchia
+polybranchian
+Polybranchiata
+polybranchiate
+polybromid
+polybromide
+polybunous
+polybuny
+polybuttoned
+polycarboxylic
+Polycarp
+polycarpellary
+polycarpic
+Polycarpon
+polycarpous
+polycarpy
+polycellular
+polycentral
+polycentric
+polycephalic
+polycephalous
+polycephaly
+Polychaeta
+polychaete
+polychaetous
+polychasial
+polychasium
+polychloride
+polychoerany
+polychord
+polychotomous
+polychotomy
+polychrest
+polychrestic
+polychrestical
+polychresty
+polychroic
+polychroism
+polychromasia
+polychromate
+polychromatic
+polychromatism
+polychromatist
+polychromatize
+polychromatophil
+polychromatophile
+polychromatophilia
+polychromatophilic
+polychrome
+polychromia
+polychromic
+polychromism
+polychromize
+polychromous
+polychromy
+polychronious
+polyciliate
+polycitral
+polyclad
+Polycladida
+polycladine
+polycladose
+polycladous
+polyclady
+Polycletan
+polyclinic
+polyclona
+polycoccous
+Polycodium
+polyconic
+polycormic
+polycotyl
+polycotyledon
+polycotyledonary
+polycotyledonous
+polycotyledony
+polycotylous
+polycotyly
+polycracy
+polycrase
+polycratic
+polycrotic
+polycrotism
+polycrystalline
+polyctenid
+Polyctenidae
+polycttarian
+polycyanide
+polycyclic
+polycycly
+polycyesis
+polycystic
+polycythemia
+polycythemic
+Polycyttaria
+polydactyl
+polydactyle
+polydactylism
+polydactylous
+Polydactylus
+polydactyly
+polydaemoniac
+polydaemonism
+polydaemonist
+polydaemonistic
+polydemic
+polydenominational
+polydental
+polydermous
+polydermy
+polydigital
+polydimensional
+polydipsia
+polydisperse
+polydomous
+polydymite
+polydynamic
+polyeidic
+polyeidism
+polyembryonate
+polyembryonic
+polyembryony
+polyemia
+polyemic
+polyenzymatic
+polyergic
+Polyergus
+polyester
+polyesthesia
+polyesthetic
+polyethnic
+polyethylene
+polyfenestral
+polyflorous
+polyfoil
+polyfold
+Polygala
+Polygalaceae
+polygalaceous
+polygalic
+polygam
+Polygamia
+polygamian
+polygamic
+polygamical
+polygamically
+polygamist
+polygamistic
+polygamize
+polygamodioecious
+polygamous
+polygamously
+polygamy
+polyganglionic
+polygastric
+polygene
+polygenesic
+polygenesis
+polygenesist
+polygenetic
+polygenetically
+polygenic
+polygenism
+polygenist
+polygenistic
+polygenous
+polygeny
+polyglandular
+polyglobulia
+polyglobulism
+polyglossary
+polyglot
+polyglotry
+polyglottal
+polyglottally
+polyglotted
+polyglotter
+polyglottery
+polyglottic
+polyglottically
+polyglottism
+polyglottist
+polyglottonic
+polyglottous
+polyglotwise
+polyglycerol
+polygon
+Polygonaceae
+polygonaceous
+polygonal
+Polygonales
+polygonally
+Polygonatum
+Polygonella
+polygoneutic
+polygoneutism
+Polygonia
+polygonic
+polygonically
+polygonoid
+polygonous
+Polygonum
+polygony
+Polygordius
+polygram
+polygrammatic
+polygraph
+polygrapher
+polygraphic
+polygraphy
+polygroove
+polygrooved
+polygyn
+polygynaiky
+Polygynia
+polygynian
+polygynic
+polygynious
+polygynist
+polygynoecial
+polygynous
+polygyny
+polygyral
+polygyria
+polyhaemia
+polyhaemic
+polyhalide
+polyhalite
+polyhalogen
+polyharmonic
+polyharmony
+polyhedral
+polyhedric
+polyhedrical
+polyhedroid
+polyhedron
+polyhedrosis
+polyhedrous
+polyhemia
+polyhidrosis
+polyhistor
+polyhistorian
+polyhistoric
+polyhistory
+polyhybrid
+polyhydric
+polyhydroxy
+polyideic
+polyideism
+polyidrosis
+polyiodide
+polykaryocyte
+polylaminated
+polylemma
+polylepidous
+polylinguist
+polylith
+polylithic
+polylobular
+polylogy
+polyloquent
+polymagnet
+polymastia
+polymastic
+Polymastiga
+polymastigate
+Polymastigida
+Polymastigina
+polymastigous
+polymastism
+Polymastodon
+polymastodont
+polymasty
+polymath
+polymathic
+polymathist
+polymathy
+polymazia
+polymelia
+polymelian
+polymely
+polymer
+polymere
+polymeria
+polymeric
+polymeride
+polymerism
+polymerization
+polymerize
+polymerous
+polymetallism
+polymetameric
+polymeter
+polymethylene
+polymetochia
+polymetochic
+polymicrian
+polymicrobial
+polymicrobic
+polymicroscope
+polymignite
+Polymixia
+polymixiid
+Polymixiidae
+Polymnestor
+Polymnia
+polymnite
+polymolecular
+polymolybdate
+polymorph
+Polymorpha
+polymorphean
+polymorphic
+polymorphism
+polymorphistic
+polymorphonuclear
+polymorphonucleate
+polymorphosis
+polymorphous
+polymorphy
+Polymyaria
+polymyarian
+Polymyarii
+Polymyodi
+polymyodian
+polymyodous
+polymyoid
+polymyositis
+polymythic
+polymythy
+polynaphthene
+polynemid
+Polynemidae
+polynemoid
+Polynemus
+Polynesian
+polynesic
+polyneural
+polyneuric
+polyneuritic
+polyneuritis
+polyneuropathy
+polynodal
+Polynoe
+polynoid
+Polynoidae
+polynome
+polynomial
+polynomialism
+polynomialist
+polynomic
+polynucleal
+polynuclear
+polynucleate
+polynucleated
+polynucleolar
+polynucleosis
+Polyodon
+polyodont
+polyodontal
+polyodontia
+Polyodontidae
+polyodontoid
+polyoecious
+polyoeciously
+polyoeciousness
+polyoecism
+polyoecy
+polyoicous
+polyommatous
+polyonomous
+polyonomy
+polyonychia
+polyonym
+polyonymal
+polyonymic
+polyonymist
+polyonymous
+polyonymy
+polyophthalmic
+polyopia
+polyopic
+polyopsia
+polyopsy
+polyorama
+polyorchidism
+polyorchism
+polyorganic
+polyose
+polyoxide
+polyoxymethylene
+polyp
+polypage
+polypaged
+polypapilloma
+polyparasitic
+polyparasitism
+polyparesis
+polyparia
+polyparian
+polyparium
+polyparous
+polypary
+polypean
+polyped
+Polypedates
+polypeptide
+polypetal
+Polypetalae
+polypetalous
+Polyphaga
+polyphage
+polyphagia
+polyphagian
+polyphagic
+polyphagist
+polyphagous
+polyphagy
+polyphalangism
+polypharmacal
+polypharmacist
+polypharmacon
+polypharmacy
+polypharmic
+polyphasal
+polyphase
+polyphaser
+Polypheme
+polyphemian
+polyphemic
+polyphemous
+polyphenol
+polyphloesboean
+polyphloisboioism
+polyphloisboism
+polyphobia
+polyphobic
+polyphone
+polyphoned
+polyphonia
+polyphonic
+polyphonical
+polyphonism
+polyphonist
+polyphonium
+polyphonous
+polyphony
+polyphore
+polyphosphoric
+polyphotal
+polyphote
+polyphylesis
+polyphyletic
+polyphyletically
+polyphylety
+polyphylline
+polyphyllous
+polyphylly
+polyphylogeny
+polyphyly
+polyphyodont
+Polypi
+polypi
+polypian
+polypide
+polypidom
+Polypifera
+polypiferous
+polypigerous
+polypinnate
+polypite
+Polyplacophora
+polyplacophoran
+polyplacophore
+polyplacophorous
+polyplastic
+Polyplectron
+polyplegia
+polyplegic
+polyploid
+polyploidic
+polyploidy
+polypnoea
+polypnoeic
+polypod
+Polypoda
+polypodia
+Polypodiaceae
+polypodiaceous
+Polypodium
+polypodous
+polypody
+polypoid
+polypoidal
+Polypomorpha
+polypomorphic
+Polyporaceae
+polyporaceous
+polypore
+polyporite
+polyporoid
+polyporous
+Polyporus
+polypose
+polyposis
+polypotome
+polypous
+polypragmacy
+polypragmatic
+polypragmatical
+polypragmatically
+polypragmatism
+polypragmatist
+polypragmaty
+polypragmist
+polypragmon
+polypragmonic
+polypragmonist
+polyprene
+polyprism
+polyprismatic
+polyprothetic
+polyprotodont
+Polyprotodontia
+polypseudonymous
+polypsychic
+polypsychical
+polypsychism
+polypterid
+Polypteridae
+polypteroid
+Polypterus
+polyptote
+polyptoton
+polyptych
+polypus
+polyrhizal
+polyrhizous
+polyrhythmic
+polyrhythmical
+polysaccharide
+polysaccharose
+Polysaccum
+polysalicylide
+polysarcia
+polysarcous
+polyschematic
+polyschematist
+polyscope
+polyscopic
+polysemant
+polysemantic
+polysemeia
+polysemia
+polysemous
+polysemy
+polysensuous
+polysensuousness
+polysepalous
+polyseptate
+polyserositis
+polysided
+polysidedness
+polysilicate
+polysilicic
+Polysiphonia
+polysiphonic
+polysiphonous
+polysomatic
+polysomatous
+polysomaty
+polysomia
+polysomic
+polysomitic
+polysomous
+polysomy
+polyspast
+polyspaston
+polyspermal
+polyspermatous
+polyspermia
+polyspermic
+polyspermous
+polyspermy
+polyspondylic
+polyspondylous
+polyspondyly
+Polyspora
+polysporangium
+polyspore
+polyspored
+polysporic
+polysporous
+polystachyous
+polystaurion
+polystele
+polystelic
+polystemonous
+polystichoid
+polystichous
+Polystichum
+Polystictus
+Polystomata
+Polystomatidae
+polystomatous
+polystome
+Polystomea
+Polystomella
+Polystomidae
+polystomium
+polystylar
+polystyle
+polystylous
+polystyrene
+polysulphide
+polysulphuration
+polysulphurization
+polysyllabic
+polysyllabical
+polysyllabically
+polysyllabicism
+polysyllabicity
+polysyllabism
+polysyllable
+polysyllogism
+polysyllogistic
+polysymmetrical
+polysymmetrically
+polysymmetry
+polysyndetic
+polysyndetically
+polysyndeton
+polysynthesis
+polysynthesism
+polysynthetic
+polysynthetical
+polysynthetically
+polysyntheticism
+polysynthetism
+polysynthetize
+polytechnic
+polytechnical
+polytechnics
+polytechnist
+polyterpene
+Polythalamia
+polythalamian
+polythalamic
+polythalamous
+polythecial
+polytheism
+polytheist
+polytheistic
+polytheistical
+polytheistically
+polytheize
+polythelia
+polythelism
+polythely
+polythene
+polythionic
+polytitanic
+polytocous
+polytokous
+polytoky
+polytomous
+polytomy
+polytonal
+polytonalism
+polytonality
+polytone
+polytonic
+polytony
+polytope
+polytopic
+polytopical
+Polytrichaceae
+polytrichaceous
+polytrichia
+polytrichous
+Polytrichum
+polytrochal
+polytrochous
+polytrope
+polytrophic
+polytropic
+polytungstate
+polytungstic
+polytype
+polytypic
+polytypical
+polytypy
+polyuresis
+polyuria
+polyuric
+polyvalence
+polyvalent
+polyvinyl
+polyvinylidene
+polyvirulent
+polyvoltine
+Polyzoa
+polyzoal
+polyzoan
+polyzoarial
+polyzoarium
+polyzoary
+polyzoic
+polyzoism
+polyzonal
+polyzooid
+polyzoon
+polzenite
+pom
+pomace
+Pomaceae
+pomacentrid
+Pomacentridae
+pomacentroid
+Pomacentrus
+pomaceous
+pomade
+Pomaderris
+Pomak
+pomander
+pomane
+pomarine
+pomarium
+pomate
+pomato
+pomatomid
+Pomatomidae
+Pomatomus
+pomatorhine
+pomatum
+pombe
+pombo
+pome
+pomegranate
+pomelo
+Pomeranian
+pomeridian
+pomerium
+pomewater
+pomey
+pomfret
+pomiculture
+pomiculturist
+pomiferous
+pomiform
+pomivorous
+Pommard
+pomme
+pommee
+pommel
+pommeled
+pommeler
+pommet
+pommey
+pommy
+Pomo
+pomological
+pomologically
+pomologist
+pomology
+Pomona
+pomonal
+pomonic
+pomp
+pompa
+Pompadour
+pompadour
+pompal
+pompano
+Pompeian
+Pompeii
+pompelmous
+Pompey
+pompey
+pompholix
+pompholygous
+pompholyx
+pomphus
+pompier
+pompilid
+Pompilidae
+pompiloid
+Pompilus
+pompion
+pompist
+pompless
+pompoleon
+pompon
+pomposity
+pompous
+pompously
+pompousness
+pompster
+Pomptine
+pomster
+pon
+Ponca
+ponce
+ponceau
+poncelet
+poncho
+ponchoed
+Poncirus
+pond
+pondage
+pondbush
+ponder
+ponderability
+ponderable
+ponderableness
+ponderal
+ponderance
+ponderancy
+ponderant
+ponderary
+ponderate
+ponderation
+ponderative
+ponderer
+pondering
+ponderingly
+ponderling
+ponderment
+ponderomotive
+ponderosapine
+ponderosity
+ponderous
+ponderously
+ponderousness
+pondfish
+pondful
+pondgrass
+pondlet
+pondman
+Pondo
+pondok
+pondokkie
+Pondomisi
+pondside
+pondus
+pondweed
+pondwort
+pondy
+pone
+ponent
+Ponera
+Poneramoeba
+ponerid
+Poneridae
+Ponerinae
+ponerine
+poneroid
+ponerology
+poney
+pong
+ponga
+pongee
+Pongidae
+Pongo
+poniard
+ponica
+ponier
+ponja
+pont
+Pontac
+Pontacq
+pontage
+pontal
+Pontederia
+Pontederiaceae
+pontederiaceous
+pontee
+pontes
+pontianak
+Pontic
+pontic
+ponticello
+ponticular
+ponticulus
+pontifex
+pontiff
+pontific
+pontifical
+pontificalia
+pontificalibus
+pontificality
+pontifically
+pontificate
+pontification
+pontifices
+pontificial
+pontificially
+pontificious
+pontify
+pontil
+pontile
+pontin
+Pontine
+pontine
+pontist
+pontlevis
+ponto
+Pontocaspian
+pontocerebellar
+ponton
+pontonier
+pontoon
+pontooneer
+pontooner
+pontooning
+Pontus
+pontvolant
+pony
+ponzite
+pooa
+pooch
+pooder
+poodle
+poodledom
+poodleish
+poodleship
+poof
+poogye
+pooh
+poohpoohist
+pook
+pooka
+pookaun
+pookoo
+pool
+pooler
+pooli
+poolroom
+poolroot
+poolside
+poolwort
+pooly
+poon
+poonac
+poonga
+poonghie
+poop
+pooped
+poophyte
+poophytic
+poor
+poorhouse
+poorish
+poorliness
+poorling
+poorly
+poorlyish
+poormaster
+poorness
+poorweed
+poorwill
+poot
+Pop
+pop
+popadam
+popal
+popcorn
+popdock
+pope
+Popean
+popedom
+popeholy
+popehood
+popeism
+popeler
+popeless
+popelike
+popeline
+popely
+popery
+popeship
+popess
+popeye
+popeyed
+popglove
+popgun
+popgunner
+popgunnery
+Popian
+popify
+popinac
+popinjay
+Popish
+popish
+popishly
+popishness
+popjoy
+poplar
+poplared
+Poplilia
+poplin
+poplinette
+popliteal
+popliteus
+poplolly
+Popocracy
+Popocrat
+Popolari
+Popoloco
+popomastic
+popover
+Popovets
+poppa
+poppability
+poppable
+poppean
+poppel
+popper
+poppet
+poppethead
+poppied
+poppin
+popple
+popply
+poppy
+poppycock
+poppycockish
+poppyfish
+poppyhead
+poppylike
+poppywort
+popshop
+populace
+popular
+popularism
+Popularist
+popularity
+popularization
+popularize
+popularizer
+popularly
+popularness
+populate
+population
+populational
+populationist
+populationistic
+populationless
+populator
+populicide
+populin
+Populism
+Populist
+Populistic
+populous
+populously
+populousness
+Populus
+popweed
+poral
+porbeagle
+porcate
+porcated
+porcelain
+porcelainization
+porcelainize
+porcelainlike
+porcelainous
+porcelaneous
+porcelanic
+porcelanite
+porcelanous
+Porcellana
+porcellanian
+porcellanid
+Porcellanidae
+porcellanize
+porch
+porched
+porching
+porchless
+porchlike
+porcine
+Porcula
+porcupine
+porcupinish
+pore
+pored
+porelike
+Porella
+porencephalia
+porencephalic
+porencephalitis
+porencephalon
+porencephalous
+porencephalus
+porencephaly
+porer
+porge
+porger
+porgy
+Poria
+poricidal
+Porifera
+poriferal
+poriferan
+poriferous
+poriform
+porimania
+poriness
+poring
+poringly
+poriomanic
+porism
+porismatic
+porismatical
+porismatically
+poristic
+poristical
+porite
+Porites
+Poritidae
+poritoid
+pork
+porkburger
+porker
+porkery
+porket
+porkfish
+porkish
+porkless
+porkling
+porkman
+Porkopolis
+porkpie
+porkwood
+porky
+pornerastic
+pornocracy
+pornocrat
+pornograph
+pornographer
+pornographic
+pornographically
+pornographist
+pornography
+pornological
+Porocephalus
+porodine
+porodite
+porogam
+porogamic
+porogamous
+porogamy
+porokaiwhiria
+porokeratosis
+Porokoto
+poroma
+porometer
+porophyllous
+poroplastic
+poroporo
+pororoca
+poros
+poroscope
+poroscopic
+poroscopy
+porose
+poroseness
+porosimeter
+porosis
+porosity
+porotic
+porotype
+porous
+porously
+porousness
+porpentine
+porphine
+Porphyra
+Porphyraceae
+porphyraceous
+porphyratin
+Porphyrean
+porphyria
+Porphyrian
+porphyrian
+Porphyrianist
+porphyrin
+porphyrine
+porphyrinuria
+Porphyrio
+porphyrion
+porphyrite
+porphyritic
+porphyroblast
+porphyroblastic
+porphyrogene
+porphyrogenite
+porphyrogenitic
+porphyrogenitism
+porphyrogeniture
+porphyrogenitus
+porphyroid
+porphyrophore
+porphyrous
+porphyry
+Porpita
+porpitoid
+porpoise
+porpoiselike
+porporate
+porr
+porraceous
+porrect
+porrection
+porrectus
+porret
+porridge
+porridgelike
+porridgy
+porriginous
+porrigo
+Porrima
+porringer
+porriwiggle
+porry
+port
+porta
+portability
+portable
+portableness
+portably
+portage
+portague
+portahepatis
+portail
+portal
+portaled
+portalled
+portalless
+portamento
+portance
+portass
+portatile
+portative
+portcrayon
+portcullis
+porteacid
+ported
+porteligature
+portend
+portendance
+portendment
+Porteno
+portension
+portent
+portention
+portentosity
+portentous
+portentously
+portentousness
+porteous
+porter
+porterage
+Porteranthus
+porteress
+porterhouse
+porterlike
+porterly
+portership
+portfire
+portfolio
+portglaive
+portglave
+portgrave
+Porthetria
+Portheus
+porthole
+porthook
+porthors
+porthouse
+Portia
+portia
+portico
+porticoed
+portiere
+portiered
+portifory
+portify
+portio
+portiomollis
+portion
+portionable
+portional
+portionally
+portioner
+portionist
+portionize
+portionless
+portitor
+Portlandian
+portlast
+portless
+portlet
+portligature
+portlily
+portliness
+portly
+portman
+portmanmote
+portmanteau
+portmanteaux
+portmantle
+portmantologism
+portment
+portmoot
+porto
+portoise
+portolan
+portolano
+Portor
+portrait
+portraitist
+portraitlike
+portraiture
+portray
+portrayable
+portrayal
+portrayer
+portrayist
+portrayment
+portreeve
+portreeveship
+portress
+portside
+portsider
+portsman
+portuary
+portugais
+Portugal
+Portugalism
+Portugee
+Portuguese
+Portulaca
+Portulacaceae
+portulacaceous
+Portulacaria
+portulan
+Portunalia
+portunian
+Portunidae
+Portunus
+portway
+porty
+porule
+porulose
+porulous
+porus
+porwigle
+pory
+Porzana
+posadaship
+posca
+pose
+Poseidon
+Poseidonian
+posement
+poser
+poseur
+posey
+posh
+posing
+posingly
+posit
+position
+positional
+positioned
+positioner
+positionless
+positival
+positive
+positively
+positiveness
+positivism
+positivist
+positivistic
+positivistically
+positivity
+positivize
+positor
+positron
+positum
+positure
+Posnanian
+posnet
+posole
+posologic
+posological
+posologist
+posology
+pospolite
+poss
+posse
+posseman
+possess
+possessable
+possessed
+possessedly
+possessedness
+possessing
+possessingly
+possessingness
+possession
+possessional
+possessionalism
+possessionalist
+possessionary
+possessionate
+possessioned
+possessioner
+possessionist
+possessionless
+possessionlessness
+possessival
+possessive
+possessively
+possessiveness
+possessor
+possessoress
+possessorial
+possessoriness
+possessorship
+possessory
+posset
+possibilism
+possibilist
+possibilitate
+possibility
+possible
+possibleness
+possibly
+possum
+possumwood
+post
+postabdomen
+postabdominal
+postable
+postabortal
+postacetabular
+postadjunct
+postage
+postal
+postallantoic
+postally
+postalveolar
+postament
+postamniotic
+postanal
+postanesthetic
+postantennal
+postaortic
+postapoplectic
+postappendicular
+postarterial
+postarthritic
+postarticular
+postarytenoid
+postaspirate
+postaspirated
+postasthmatic
+postatrial
+postauditory
+postauricular
+postaxiad
+postaxial
+postaxially
+postaxillary
+postbag
+postbaptismal
+postbox
+postboy
+postbrachial
+postbrachium
+postbranchial
+postbreakfast
+postbronchial
+postbuccal
+postbulbar
+postbursal
+postcaecal
+postcalcaneal
+postcalcarine
+postcanonical
+postcardiac
+postcardinal
+postcarnate
+postcarotid
+postcart
+postcartilaginous
+postcatarrhal
+postcava
+postcaval
+postcecal
+postcenal
+postcentral
+postcentrum
+postcephalic
+postcerebellar
+postcerebral
+postcesarean
+postcibal
+postclassic
+postclassical
+postclassicism
+postclavicle
+postclavicula
+postclavicular
+postclimax
+postclitellian
+postclival
+postcolon
+postcolonial
+postcolumellar
+postcomitial
+postcommissural
+postcommissure
+postcommunicant
+Postcommunion
+postconceptive
+postcondylar
+postconfinement
+postconnubial
+postconsonantal
+postcontact
+postcontract
+postconvalescent
+postconvulsive
+postcordial
+postcornu
+postcosmic
+postcostal
+postcoxal
+postcritical
+postcrural
+postcubital
+postdate
+postdental
+postdepressive
+postdetermined
+postdevelopmental
+postdiagnostic
+postdiaphragmatic
+postdiastolic
+postdicrotic
+postdigestive
+postdigital
+postdiluvial
+postdiluvian
+postdiphtheric
+postdiphtheritic
+postdisapproved
+postdisseizin
+postdisseizor
+postdoctoral
+postdoctorate
+postdural
+postdysenteric
+posted
+posteen
+postelection
+postelementary
+postembryonal
+postembryonic
+postemporal
+postencephalitic
+postencephalon
+postenteral
+postentry
+postepileptic
+poster
+posterette
+posteriad
+posterial
+posterior
+posterioric
+posteriorically
+posterioristic
+posterioristically
+posteriority
+posteriorly
+posteriormost
+posteriors
+posteriorums
+posterish
+posterishness
+posterist
+posterity
+posterize
+postern
+posteroclusion
+posterodorsad
+posterodorsal
+posterodorsally
+posteroexternal
+posteroinferior
+posterointernal
+posterolateral
+posteromedial
+posteromedian
+posteromesial
+posteroparietal
+posterosuperior
+posterotemporal
+posteroterminal
+posteroventral
+posteruptive
+postesophageal
+posteternity
+postethmoid
+postexilian
+postexilic
+postexist
+postexistence
+postexistency
+postexistent
+postface
+postfact
+postfebrile
+postfemoral
+postfetal
+postfix
+postfixal
+postfixation
+postfixed
+postfixial
+postflection
+postflexion
+postform
+postfoveal
+postfrontal
+postfurca
+postfurcal
+postganglionic
+postgangrenal
+postgastric
+postgeminum
+postgenial
+postgeniture
+postglacial
+postglenoid
+postglenoidal
+postgonorrheic
+postgracile
+postgraduate
+postgrippal
+posthabit
+posthaste
+posthemiplegic
+posthemorrhagic
+posthepatic
+posthetomist
+posthetomy
+posthexaplaric
+posthippocampal
+posthitis
+postholder
+posthole
+posthouse
+posthumeral
+posthumous
+posthumously
+posthumousness
+posthumus
+posthyoid
+posthypnotic
+posthypnotically
+posthypophyseal
+posthypophysis
+posthysterical
+postic
+postical
+postically
+posticous
+posticteric
+posticum
+postil
+postilion
+postilioned
+postillate
+postillation
+postillator
+postimpressionism
+postimpressionist
+postimpressionistic
+postinfective
+postinfluenzal
+posting
+postingly
+postintestinal
+postique
+postischial
+postjacent
+postjugular
+postlabial
+postlachrymal
+postlaryngeal
+postlegitimation
+postlenticular
+postless
+postlike
+postliminary
+postliminiary
+postliminious
+postliminium
+postliminous
+postliminy
+postloitic
+postloral
+postlude
+postludium
+postluetic
+postmalarial
+postmamillary
+postmammary
+postman
+postmandibular
+postmaniacal
+postmarital
+postmark
+postmarriage
+postmaster
+postmasterlike
+postmastership
+postmastoid
+postmaturity
+postmaxillary
+postmaximal
+postmeatal
+postmedia
+postmedial
+postmedian
+postmediastinal
+postmediastinum
+postmedullary
+postmeiotic
+postmeningeal
+postmenstrual
+postmental
+postmeridian
+postmeridional
+postmesenteric
+postmillenarian
+postmillenarianism
+postmillennial
+postmillennialism
+postmillennialist
+postmillennian
+postmineral
+postmistress
+postmortal
+postmortuary
+postmundane
+postmuscular
+postmutative
+postmycotic
+postmyxedematous
+postnarial
+postnaris
+postnasal
+postnatal
+postnate
+postnati
+postnecrotic
+postnephritic
+postneural
+postneuralgic
+postneuritic
+postneurotic
+postnodular
+postnominal
+postnotum
+postnuptial
+postnuptially
+postobituary
+postocular
+postolivary
+postomental
+postoperative
+postoptic
+postoral
+postorbital
+postordination
+postorgastic
+postosseous
+postotic
+postpagan
+postpaid
+postpalatal
+postpalatine
+postpalpebral
+postpaludal
+postparalytic
+postparietal
+postparotid
+postparotitic
+postparoxysmal
+postparturient
+postpatellar
+postpathological
+postpericardial
+postpharyngeal
+postphlogistic
+postphragma
+postphrenic
+postphthisic
+postpituitary
+postplace
+postplegic
+postpneumonic
+postponable
+postpone
+postponement
+postponence
+postponer
+postpontile
+postpose
+postposited
+postposition
+postpositional
+postpositive
+postpositively
+postprandial
+postprandially
+postpredicament
+postprophesy
+postprostate
+postpubertal
+postpubescent
+postpubic
+postpubis
+postpuerperal
+postpulmonary
+postpupillary
+postpycnotic
+postpyloric
+postpyramidal
+postpyretic
+postrachitic
+postramus
+postrectal
+postreduction
+postremogeniture
+postremote
+postrenal
+postresurrection
+postresurrectional
+postretinal
+postrheumatic
+postrhinal
+postrider
+postrorse
+postrostral
+postrubeolar
+postsaccular
+postsacral
+postscalenus
+postscapula
+postscapular
+postscapularis
+postscarlatinal
+postscenium
+postscorbutic
+postscribe
+postscript
+postscriptum
+postscutellar
+postscutellum
+postseason
+postsigmoid
+postsign
+postspasmodic
+postsphenoid
+postsphenoidal
+postsphygmic
+postspinous
+postsplenial
+postsplenic
+poststernal
+poststertorous
+postsuppurative
+postsurgical
+postsynaptic
+postsynsacral
+postsyphilitic
+postsystolic
+posttabetic
+posttarsal
+posttetanic
+postthalamic
+postthoracic
+postthyroidal
+posttibial
+posttonic
+posttoxic
+posttracheal
+posttrapezoid
+posttraumatic
+posttreaty
+posttubercular
+posttussive
+posttympanic
+posttyphoid
+postulancy
+postulant
+postulantship
+postulata
+postulate
+postulation
+postulational
+postulator
+postulatory
+postulatum
+postulnar
+postumbilical
+postumbonal
+postural
+posture
+posturer
+postureteric
+posturist
+posturize
+postuterine
+postvaccinal
+postvaricellar
+postvarioloid
+postvelar
+postvenereal
+postvenous
+postverbal
+Postverta
+postvertebral
+postvesical
+postvide
+postvocalic
+postwar
+postward
+postwise
+postwoman
+postxyphoid
+postyard
+postzygapophysial
+postzygapophysis
+posy
+pot
+potability
+potable
+potableness
+potagerie
+potagery
+potamic
+Potamobiidae
+Potamochoerus
+Potamogale
+Potamogalidae
+Potamogeton
+Potamogetonaceae
+potamogetonaceous
+potamological
+potamologist
+potamology
+potamometer
+Potamonidae
+potamophilous
+potamoplankton
+potash
+potashery
+potass
+potassa
+potassamide
+potassic
+potassiferous
+potassium
+potate
+potation
+potative
+potato
+potator
+potatory
+Potawatami
+Potawatomi
+potbank
+potbellied
+potbelly
+potboil
+potboiler
+potboy
+potboydom
+potch
+potcher
+potcherman
+potcrook
+potdar
+pote
+potecary
+poteen
+potence
+potency
+potent
+potentacy
+potentate
+potential
+potentiality
+potentialization
+potentialize
+potentially
+potentialness
+potentiate
+potentiation
+Potentilla
+potentiometer
+potentiometric
+potentize
+potently
+potentness
+poter
+Poterium
+potestal
+potestas
+potestate
+potestative
+poteye
+potful
+potgirl
+potgun
+pothanger
+pothead
+pothecary
+potheen
+pother
+potherb
+potherment
+pothery
+pothole
+pothook
+pothookery
+Pothos
+pothouse
+pothousey
+pothunt
+pothunter
+pothunting
+poticary
+potichomania
+potichomanist
+potifer
+Potiguara
+potion
+potlatch
+potleg
+potlicker
+potlid
+potlike
+potluck
+potmaker
+potmaking
+potman
+potomania
+potomato
+potometer
+potong
+potoo
+Potoroinae
+potoroo
+Potorous
+potpie
+potpourri
+potrack
+potsherd
+potshoot
+potshooter
+potstick
+potstone
+pott
+pottage
+pottagy
+pottah
+potted
+potter
+potterer
+potteress
+potteringly
+pottery
+Pottiaceae
+potting
+pottinger
+pottle
+pottled
+potto
+potty
+potwaller
+potwalling
+potware
+potwhisky
+potwork
+potwort
+pouce
+poucer
+poucey
+pouch
+pouched
+pouchful
+pouchless
+pouchlike
+pouchy
+poudrette
+pouf
+poulaine
+poulard
+poulardize
+poulp
+poulpe
+poult
+poulter
+poulterer
+poulteress
+poultice
+poulticewise
+poultry
+poultrydom
+poultryist
+poultryless
+poultrylike
+poultryman
+poultryproof
+pounamu
+pounce
+pounced
+pouncer
+pouncet
+pouncing
+pouncingly
+pound
+poundage
+poundal
+poundcake
+pounder
+pounding
+poundkeeper
+poundless
+poundlike
+poundman
+poundmaster
+poundmeal
+poundstone
+poundworth
+pour
+pourer
+pourie
+pouring
+pouringly
+pourparler
+pourparley
+pourpiece
+pourpoint
+pourpointer
+pouser
+poussette
+pout
+pouter
+poutful
+pouting
+poutingly
+pouty
+poverish
+poverishment
+poverty
+povertyweed
+Povindah
+pow
+powder
+powderable
+powdered
+powderer
+powderiness
+powdering
+powderization
+powderize
+powderizer
+powderlike
+powderman
+powdery
+powdike
+powdry
+powellite
+power
+powerboat
+powered
+powerful
+powerfully
+powerfulness
+powerhouse
+powerless
+powerlessly
+powerlessness
+powermonger
+Powhatan
+powitch
+powldoody
+pownie
+powsoddy
+powsowdy
+powwow
+powwower
+powwowism
+pox
+poxy
+poy
+poyou
+pozzolanic
+pozzuolana
+pozzuolanic
+praam
+prabble
+prabhu
+practic
+practicability
+practicable
+practicableness
+practicably
+practical
+practicalism
+practicalist
+practicality
+practicalization
+practicalize
+practicalizer
+practically
+practicalness
+practicant
+practice
+practiced
+practicedness
+practicer
+practician
+practicianism
+practicum
+practitional
+practitioner
+practitionery
+prad
+Pradeep
+pradhana
+praeabdomen
+praeacetabular
+praeanal
+praecava
+praecipe
+praecipuum
+praecoces
+praecocial
+praecognitum
+praecoracoid
+praecordia
+praecordial
+praecordium
+praecornu
+praecox
+praecuneus
+praedial
+praedialist
+praediality
+praeesophageal
+praefect
+praefectorial
+praefectus
+praefervid
+praefloration
+praefoliation
+praehallux
+praelabrum
+praelection
+praelector
+praelectorship
+praelectress
+praeludium
+praemaxilla
+praemolar
+praemunire
+praenarial
+Praenestine
+Praenestinian
+praeneural
+praenomen
+praenomina
+praenominal
+praeoperculum
+praepositor
+praepostor
+praepostorial
+praepubis
+praepuce
+praescutum
+Praesepe
+praesertim
+Praesian
+praesidium
+praesphenoid
+praesternal
+praesternum
+praestomium
+praesystolic
+praetaxation
+praetexta
+praetor
+praetorial
+Praetorian
+praetorian
+praetorianism
+praetorium
+praetorship
+praezygapophysis
+pragmatic
+pragmatica
+pragmatical
+pragmaticality
+pragmatically
+pragmaticalness
+pragmaticism
+pragmatics
+pragmatism
+pragmatist
+pragmatistic
+pragmatize
+pragmatizer
+prairie
+prairiecraft
+prairied
+prairiedom
+prairielike
+prairieweed
+prairillon
+praisable
+praisableness
+praisably
+praise
+praiseful
+praisefully
+praisefulness
+praiseless
+praiseproof
+praiser
+praiseworthy
+praising
+praisingly
+praisworthily
+praisworthiness
+Prajapati
+prajna
+Prakash
+Prakrit
+prakriti
+Prakritic
+Prakritize
+praline
+pralltriller
+pram
+Pramnian
+prana
+prance
+pranceful
+prancer
+prancing
+prancingly
+prancy
+prandial
+prandially
+prank
+pranked
+pranker
+prankful
+prankfulness
+pranking
+prankingly
+prankish
+prankishly
+prankishness
+prankle
+pranksome
+pranksomeness
+prankster
+pranky
+prase
+praseocobaltic
+praseodidymium
+praseodymia
+praseodymium
+praseolite
+prasine
+prasinous
+prasoid
+prasophagous
+prasophagy
+prastha
+prat
+pratal
+Pratap
+Pratapwant
+prate
+prateful
+pratement
+pratensian
+Prater
+prater
+pratey
+pratfall
+pratiloma
+Pratincola
+pratincole
+pratincoline
+pratincolous
+prating
+pratingly
+pratique
+pratiyasamutpada
+Pratt
+prattfall
+prattle
+prattlement
+prattler
+prattling
+prattlingly
+prattly
+prau
+Pravin
+pravity
+prawn
+prawner
+prawny
+Praxean
+Praxeanist
+praxinoscope
+praxiology
+praxis
+Praxitelean
+pray
+praya
+prayer
+prayerful
+prayerfully
+prayerfulness
+prayerless
+prayerlessly
+prayerlessness
+prayermaker
+prayermaking
+prayerwise
+prayful
+praying
+prayingly
+prayingwise
+preabdomen
+preabsorb
+preabsorbent
+preabstract
+preabundance
+preabundant
+preabundantly
+preaccept
+preacceptance
+preaccess
+preaccessible
+preaccidental
+preaccidentally
+preaccommodate
+preaccommodating
+preaccommodatingly
+preaccommodation
+preaccomplish
+preaccomplishment
+preaccord
+preaccordance
+preaccount
+preaccounting
+preaccredit
+preaccumulate
+preaccumulation
+preaccusation
+preaccuse
+preaccustom
+preaccustomed
+preacetabular
+preach
+preachable
+preacher
+preacherdom
+preacheress
+preacherize
+preacherless
+preacherling
+preachership
+preachieved
+preachification
+preachify
+preachily
+preachiness
+preaching
+preachingly
+preachman
+preachment
+preachy
+preacid
+preacidity
+preacidly
+preacidness
+preacknowledge
+preacknowledgment
+preacquaint
+preacquaintance
+preacquire
+preacquired
+preacquit
+preacquittal
+preact
+preaction
+preactive
+preactively
+preactivity
+preacute
+preacutely
+preacuteness
+preadamic
+preadamite
+preadamitic
+preadamitical
+preadamitism
+preadapt
+preadaptable
+preadaptation
+preaddition
+preadditional
+preaddress
+preadequacy
+preadequate
+preadequately
+preadhere
+preadherence
+preadherent
+preadjectival
+preadjective
+preadjourn
+preadjournment
+preadjunct
+preadjust
+preadjustable
+preadjustment
+preadministration
+preadministrative
+preadministrator
+preadmire
+preadmirer
+preadmission
+preadmit
+preadmonish
+preadmonition
+preadolescent
+preadopt
+preadoption
+preadoration
+preadore
+preadorn
+preadornment
+preadult
+preadulthood
+preadvance
+preadvancement
+preadventure
+preadvertency
+preadvertent
+preadvertise
+preadvertisement
+preadvice
+preadvisable
+preadvise
+preadviser
+preadvisory
+preadvocacy
+preadvocate
+preaestival
+preaffect
+preaffection
+preaffidavit
+preaffiliate
+preaffiliation
+preaffirm
+preaffirmation
+preaffirmative
+preafflict
+preaffliction
+preafternoon
+preaged
+preaggravate
+preaggravation
+preaggression
+preaggressive
+preagitate
+preagitation
+preagonal
+preagony
+preagree
+preagreement
+preagricultural
+preagriculture
+prealarm
+prealcohol
+prealcoholic
+prealgebra
+prealgebraic
+prealkalic
+preallable
+preallably
+preallegation
+preallege
+prealliance
+preallied
+preallot
+preallotment
+preallow
+preallowable
+preallowably
+preallowance
+preallude
+preallusion
+preally
+prealphabet
+prealphabetical
+prealtar
+prealteration
+prealveolar
+preamalgamation
+preambassadorial
+preambition
+preambitious
+preamble
+preambled
+preambling
+preambular
+preambulary
+preambulate
+preambulation
+preambulatory
+preanal
+preanaphoral
+preanesthetic
+preanimism
+preannex
+preannounce
+preannouncement
+preannouncer
+preantepenult
+preantepenultimate
+preanterior
+preanticipate
+preantiquity
+preantiseptic
+preaortic
+preappearance
+preapperception
+preapplication
+preappoint
+preappointment
+preapprehension
+preapprise
+preapprobation
+preapproval
+preapprove
+preaptitude
+prearm
+prearrange
+prearrangement
+prearrest
+prearrestment
+prearticulate
+preartistic
+preascertain
+preascertainment
+preascitic
+preaseptic
+preassigned
+preassume
+preassurance
+preassure
+preataxic
+preattachment
+preattune
+preaudience
+preauditory
+preaver
+preavowal
+preaxiad
+preaxial
+preaxially
+prebachelor
+prebacillary
+prebake
+prebalance
+preballot
+preballoting
+prebankruptcy
+prebaptismal
+prebaptize
+prebarbaric
+prebarbarous
+prebargain
+prebasal
+prebasilar
+prebeleve
+prebelief
+prebeliever
+prebelieving
+prebellum
+prebeloved
+prebend
+prebendal
+prebendary
+prebendaryship
+prebendate
+prebenediction
+prebeneficiary
+prebenefit
+prebeset
+prebestow
+prebestowal
+prebetray
+prebetrayal
+prebetrothal
+prebid
+prebidding
+prebill
+prebless
+preblessing
+preblockade
+preblooming
+preboast
+preboding
+preboil
+preborn
+preborrowing
+preboyhood
+prebrachial
+prebrachium
+prebreathe
+prebridal
+prebroadcasting
+prebromidic
+prebronchial
+prebronze
+prebrute
+prebuccal
+prebudget
+prebudgetary
+prebullying
+preburlesque
+preburn
+precalculable
+precalculate
+precalculation
+precampaign
+precancel
+precancellation
+precancerous
+precandidacy
+precandidature
+precanning
+precanonical
+precant
+precantation
+precanvass
+precapillary
+precapitalist
+precapitalistic
+precaptivity
+precapture
+precarcinomatous
+precardiac
+precaria
+precarious
+precariously
+precariousness
+precarium
+precarnival
+precartilage
+precartilaginous
+precary
+precast
+precation
+precative
+precatively
+precatory
+precaudal
+precausation
+precaution
+precautional
+precautionary
+precautious
+precautiously
+precautiousness
+precava
+precaval
+precedable
+precede
+precedence
+precedency
+precedent
+precedentable
+precedentary
+precedented
+precedential
+precedentless
+precedently
+preceder
+preceding
+precelebrant
+precelebrate
+precelebration
+precensure
+precensus
+precent
+precentor
+precentorial
+precentorship
+precentory
+precentral
+precentress
+precentrix
+precentrum
+precept
+preception
+preceptist
+preceptive
+preceptively
+preceptor
+preceptoral
+preceptorate
+preceptorial
+preceptorially
+preceptorship
+preceptory
+preceptress
+preceptual
+preceptually
+preceramic
+precerebellar
+precerebral
+precerebroid
+preceremonial
+preceremony
+precertification
+precertify
+preces
+precess
+precession
+precessional
+prechallenge
+prechampioned
+prechampionship
+precharge
+prechart
+precheck
+prechemical
+precherish
+prechildhood
+prechill
+prechloric
+prechloroform
+prechoice
+prechoose
+prechordal
+prechoroid
+preciation
+precinct
+precinction
+precinctive
+preciosity
+precious
+preciously
+preciousness
+precipe
+precipice
+precipiced
+precipitability
+precipitable
+precipitance
+precipitancy
+precipitant
+precipitantly
+precipitantness
+precipitate
+precipitated
+precipitatedly
+precipitately
+precipitation
+precipitative
+precipitator
+precipitin
+precipitinogen
+precipitinogenic
+precipitous
+precipitously
+precipitousness
+precirculate
+precirculation
+precis
+precise
+precisely
+preciseness
+precisian
+precisianism
+precisianist
+precision
+precisional
+precisioner
+precisionism
+precisionist
+precisionize
+precisive
+precitation
+precite
+precited
+precivilization
+preclaim
+preclaimant
+preclaimer
+preclassic
+preclassical
+preclassification
+preclassified
+preclassify
+preclean
+precleaner
+precleaning
+preclerical
+preclimax
+preclinical
+preclival
+precloacal
+preclose
+preclosure
+preclothe
+precludable
+preclude
+preclusion
+preclusive
+preclusively
+precoagulation
+precoccygeal
+precocial
+precocious
+precociously
+precociousness
+precocity
+precogitate
+precogitation
+precognition
+precognitive
+precognizable
+precognizant
+precognize
+precognosce
+precoil
+precoiler
+precoincidence
+precoincident
+precoincidently
+precollapsable
+precollapse
+precollect
+precollectable
+precollection
+precollector
+precollege
+precollegiate
+precollude
+precollusion
+precollusive
+precolor
+precolorable
+precoloration
+precoloring
+precombat
+precombatant
+precombination
+precombine
+precombustion
+precommand
+precommend
+precomment
+precommercial
+precommissural
+precommissure
+precommit
+precommune
+precommunicate
+precommunication
+precommunion
+precompare
+precomparison
+precompass
+precompel
+precompensate
+precompensation
+precompilation
+precompile
+precompiler
+precompleteness
+precompletion
+precompliance
+precompliant
+precomplicate
+precomplication
+precompose
+precomposition
+precompound
+precompounding
+precompoundly
+precomprehend
+precomprehension
+precomprehensive
+precompress
+precompulsion
+precomradeship
+preconceal
+preconcealment
+preconcede
+preconceivable
+preconceive
+preconceived
+preconcentrate
+preconcentrated
+preconcentratedly
+preconcentration
+preconcept
+preconception
+preconceptional
+preconceptual
+preconcern
+preconcernment
+preconcert
+preconcerted
+preconcertedly
+preconcertedness
+preconcertion
+preconcertive
+preconcession
+preconcessive
+preconclude
+preconclusion
+preconcur
+preconcurrence
+preconcurrent
+preconcurrently
+precondemn
+precondemnation
+precondensation
+precondense
+precondition
+preconditioned
+preconduct
+preconduction
+preconductor
+precondylar
+precondyloid
+preconfer
+preconference
+preconfess
+preconfession
+preconfide
+preconfiguration
+preconfigure
+preconfine
+preconfinedly
+preconfinemnt
+preconfirm
+preconfirmation
+preconflict
+preconform
+preconformity
+preconfound
+preconfuse
+preconfusedly
+preconfusion
+precongenial
+precongested
+precongestion
+precongestive
+precongratulate
+precongratulation
+precongressional
+preconizance
+preconization
+preconize
+preconizer
+preconjecture
+preconnection
+preconnective
+preconnubial
+preconquer
+preconquest
+preconquestal
+preconquestual
+preconscious
+preconsciously
+preconsciousness
+preconsecrate
+preconsecration
+preconsent
+preconsider
+preconsideration
+preconsign
+preconsolation
+preconsole
+preconsolidate
+preconsolidated
+preconsolidation
+preconsonantal
+preconspiracy
+preconspirator
+preconspire
+preconstituent
+preconstitute
+preconstruct
+preconstruction
+preconsult
+preconsultation
+preconsultor
+preconsume
+preconsumer
+preconsumption
+precontact
+precontain
+precontained
+precontemn
+precontemplate
+precontemplation
+precontemporaneous
+precontemporary
+precontend
+precontent
+precontention
+precontently
+precontentment
+precontest
+precontinental
+precontract
+precontractive
+precontractual
+precontribute
+precontribution
+precontributive
+precontrivance
+precontrive
+precontrol
+precontrolled
+precontroversial
+precontroversy
+preconvention
+preconversation
+preconversational
+preconversion
+preconvert
+preconvey
+preconveyal
+preconveyance
+preconvict
+preconviction
+preconvince
+precook
+precooker
+precool
+precooler
+precooling
+precopy
+precoracoid
+precordia
+precordial
+precordiality
+precordially
+precordium
+precorneal
+precornu
+precoronation
+precorrect
+precorrection
+precorrectly
+precorrectness
+precorrespond
+precorrespondence
+precorrespondent
+precorridor
+precorrupt
+precorruption
+precorruptive
+precorruptly
+precoruptness
+precosmic
+precosmical
+precostal
+precounsel
+precounsellor
+precourse
+precover
+precovering
+precox
+precreate
+precreation
+precreative
+precredit
+precreditor
+precreed
+precritical
+precriticism
+precriticize
+precrucial
+precrural
+precrystalline
+precultivate
+precultivation
+precultural
+preculturally
+preculture
+precuneal
+precuneate
+precuneus
+precure
+precurrent
+precurricular
+precurriculum
+precursal
+precurse
+precursive
+precursor
+precursory
+precurtain
+precut
+precyclone
+precyclonic
+precynical
+precyst
+precystic
+predable
+predacean
+predaceous
+predaceousness
+predacity
+predamage
+predamn
+predamnation
+predark
+predarkness
+predata
+predate
+predation
+predatism
+predative
+predator
+predatorily
+predatoriness
+predatory
+predawn
+preday
+predaylight
+predaytime
+predazzite
+predealer
+predealing
+predeath
+predeathly
+predebate
+predebater
+predebit
+predebtor
+predecay
+predecease
+predeceaser
+predeceive
+predeceiver
+predeception
+predecession
+predecessor
+predecessorship
+predecide
+predecision
+predecisive
+predeclaration
+predeclare
+predeclination
+predecline
+predecree
+prededicate
+prededuct
+prededuction
+predefault
+predefeat
+predefect
+predefective
+predefence
+predefend
+predefense
+predefiance
+predeficiency
+predeficient
+predefine
+predefinite
+predefinition
+predefray
+predefrayal
+predefy
+predegeneracy
+predegenerate
+predegree
+predeication
+predelay
+predelegate
+predelegation
+predeliberate
+predeliberately
+predeliberation
+predelineate
+predelineation
+predelinquency
+predelinquent
+predelinquently
+predeliver
+predelivery
+predella
+predelude
+predelusion
+predemand
+predemocracy
+predemocratic
+predemonstrate
+predemonstration
+predemonstrative
+predenial
+predental
+predentary
+Predentata
+predentate
+predeny
+predepart
+predepartmental
+predeparture
+predependable
+predependence
+predependent
+predeplete
+predepletion
+predeposit
+predepository
+predepreciate
+predepreciation
+predepression
+predeprivation
+predeprive
+prederivation
+prederive
+predescend
+predescent
+predescribe
+predescription
+predesert
+predeserter
+predesertion
+predeserve
+predeserving
+predesign
+predesignate
+predesignation
+predesignatory
+predesirous
+predesolate
+predesolation
+predespair
+predesperate
+predespicable
+predespise
+predespond
+predespondency
+predespondent
+predestinable
+predestinarian
+predestinarianism
+predestinate
+predestinately
+predestination
+predestinational
+predestinationism
+predestinationist
+predestinative
+predestinator
+predestine
+predestiny
+predestitute
+predestitution
+predestroy
+predestruction
+predetach
+predetachment
+predetail
+predetain
+predetainer
+predetect
+predetention
+predeterminability
+predeterminable
+predeterminant
+predeterminate
+predeterminately
+predetermination
+predeterminative
+predetermine
+predeterminer
+predeterminism
+predeterministic
+predetest
+predetestation
+predetrimental
+predevelop
+predevelopment
+predevise
+predevote
+predevotion
+predevour
+prediagnosis
+prediagnostic
+predial
+prediastolic
+prediatory
+predicability
+predicable
+predicableness
+predicably
+predicament
+predicamental
+predicamentally
+predicant
+predicate
+predication
+predicational
+predicative
+predicatively
+predicator
+predicatory
+predicrotic
+predict
+predictability
+predictable
+predictably
+predictate
+predictation
+prediction
+predictional
+predictive
+predictively
+predictiveness
+predictor
+predictory
+prediet
+predietary
+predifferent
+predifficulty
+predigest
+predigestion
+predikant
+predilect
+predilected
+predilection
+prediligent
+prediligently
+prediluvial
+prediluvian
+prediminish
+prediminishment
+prediminution
+predine
+predinner
+prediphtheritic
+prediploma
+prediplomacy
+prediplomatic
+predirect
+predirection
+predirector
+predisability
+predisable
+predisadvantage
+predisadvantageous
+predisadvantageously
+predisagree
+predisagreeable
+predisagreement
+predisappointment
+predisaster
+predisastrous
+prediscern
+prediscernment
+predischarge
+prediscipline
+predisclose
+predisclosure
+prediscontent
+prediscontented
+prediscontentment
+prediscontinuance
+prediscontinuation
+prediscontinue
+prediscount
+prediscountable
+prediscourage
+prediscouragement
+prediscourse
+prediscover
+prediscoverer
+prediscovery
+prediscreet
+prediscretion
+prediscretionary
+prediscriminate
+prediscrimination
+prediscriminator
+prediscuss
+prediscussion
+predisgrace
+predisguise
+predisgust
+predislike
+predismiss
+predismissal
+predismissory
+predisorder
+predisordered
+predisorderly
+predispatch
+predispatcher
+predisperse
+predispersion
+predisplace
+predisplacement
+predisplay
+predisponency
+predisponent
+predisposable
+predisposal
+predispose
+predisposed
+predisposedly
+predisposedness
+predisposition
+predispositional
+predisputant
+predisputation
+predispute
+predisregard
+predisrupt
+predisruption
+predissatisfaction
+predissolution
+predissolve
+predissuade
+predistinct
+predistinction
+predistinguish
+predistress
+predistribute
+predistribution
+predistributor
+predistrict
+predistrust
+predistrustful
+predisturb
+predisturbance
+prediversion
+predivert
+predivide
+predividend
+predivider
+predivinable
+predivinity
+predivision
+predivorce
+predivorcement
+predoctorate
+predocumentary
+predomestic
+predominance
+predominancy
+predominant
+predominantly
+predominate
+predominately
+predominatingly
+predomination
+predominator
+predonate
+predonation
+predonor
+predoom
+predorsal
+predoubt
+predoubter
+predoubtful
+predraft
+predrainage
+predramatic
+predraw
+predrawer
+predread
+predreadnought
+predrill
+predriller
+predrive
+predriver
+predry
+preduplicate
+preduplication
+predusk
+predwell
+predynamite
+predynastic
+preen
+preener
+preeze
+prefab
+prefabricate
+prefabrication
+prefabricator
+preface
+prefaceable
+prefacer
+prefacial
+prefacist
+prefactor
+prefactory
+prefamiliar
+prefamiliarity
+prefamiliarly
+prefamous
+prefashion
+prefatial
+prefator
+prefatorial
+prefatorially
+prefatorily
+prefatory
+prefavor
+prefavorable
+prefavorably
+prefavorite
+prefearful
+prefearfully
+prefeast
+prefect
+prefectly
+prefectoral
+prefectorial
+prefectorially
+prefectorian
+prefectship
+prefectual
+prefectural
+prefecture
+prefecundation
+prefecundatory
+prefederal
+prefelic
+prefer
+preferability
+preferable
+preferableness
+preferably
+preferee
+preference
+preferent
+preferential
+preferentialism
+preferentialist
+preferentially
+preferment
+prefermentation
+preferred
+preferredly
+preferredness
+preferrer
+preferrous
+prefertile
+prefertility
+prefertilization
+prefertilize
+prefervid
+prefestival
+prefeudal
+prefeudalic
+prefeudalism
+prefiction
+prefictional
+prefigurate
+prefiguration
+prefigurative
+prefiguratively
+prefigurativeness
+prefigure
+prefigurement
+prefiller
+prefilter
+prefinal
+prefinance
+prefinancial
+prefine
+prefinish
+prefix
+prefixable
+prefixal
+prefixally
+prefixation
+prefixed
+prefixedly
+prefixion
+prefixture
+preflagellate
+preflatter
+preflattery
+preflavor
+preflavoring
+preflection
+preflexion
+preflight
+preflood
+prefloration
+preflowering
+prefoliation
+prefool
+preforbidden
+preforceps
+preforgive
+preforgiveness
+preforgotten
+preform
+preformant
+preformation
+preformationary
+preformationism
+preformationist
+preformative
+preformed
+preformism
+preformist
+preformistic
+preformulate
+preformulation
+prefortunate
+prefortunately
+prefortune
+prefoundation
+prefounder
+prefragrance
+prefragrant
+prefrankness
+prefraternal
+prefraternally
+prefraud
+prefreeze
+prefreshman
+prefriendly
+prefriendship
+prefright
+prefrighten
+prefrontal
+prefulfill
+prefulfillment
+prefulgence
+prefulgency
+prefulgent
+prefunction
+prefunctional
+prefuneral
+prefungoidal
+prefurlough
+prefurnish
+pregain
+pregainer
+pregalvanize
+preganglionic
+pregather
+pregathering
+pregeminum
+pregenerate
+pregeneration
+pregenerosity
+pregenerous
+pregenerously
+pregenial
+pregeniculatum
+pregeniculum
+pregenital
+pregeological
+pregirlhood
+preglacial
+pregladden
+pregladness
+preglenoid
+preglenoidal
+preglobulin
+pregnability
+pregnable
+pregnance
+pregnancy
+pregnant
+pregnantly
+pregnantness
+pregolden
+pregolfing
+pregracile
+pregracious
+pregrade
+pregraduation
+pregranite
+pregranitic
+pregratification
+pregratify
+pregreet
+pregreeting
+pregrievance
+pregrowth
+preguarantee
+preguarantor
+preguard
+preguess
+preguidance
+preguide
+preguilt
+preguiltiness
+preguilty
+pregust
+pregustant
+pregustation
+pregustator
+pregustic
+prehallux
+prehalter
+prehandicap
+prehandle
+prehaps
+preharden
+preharmonious
+preharmoniousness
+preharmony
+preharsh
+preharshness
+preharvest
+prehatred
+prehaunt
+prehaunted
+prehaustorium
+prehazard
+prehazardous
+preheal
+prehearing
+preheat
+preheated
+preheater
+prehemiplegic
+prehend
+prehensible
+prehensile
+prehensility
+prehension
+prehensive
+prehensiveness
+prehensor
+prehensorial
+prehensory
+prehepatic
+prehepaticus
+preheroic
+prehesitancy
+prehesitate
+prehesitation
+prehexameral
+prehistorian
+prehistoric
+prehistorical
+prehistorically
+prehistorics
+prehistory
+prehnite
+prehnitic
+preholder
+preholding
+preholiday
+prehorizon
+prehorror
+prehostile
+prehostility
+prehuman
+prehumiliate
+prehumiliation
+prehumor
+prehunger
+prehydration
+prehypophysis
+preidea
+preidentification
+preidentify
+preignition
+preilluminate
+preillumination
+preillustrate
+preillustration
+preimage
+preimaginary
+preimagination
+preimagine
+preimbibe
+preimbue
+preimitate
+preimitation
+preimitative
+preimmigration
+preimpair
+preimpairment
+preimpart
+preimperial
+preimport
+preimportance
+preimportant
+preimportantly
+preimportation
+preimposal
+preimpose
+preimposition
+preimpress
+preimpression
+preimpressive
+preimprove
+preimprovement
+preinaugural
+preinaugurate
+preincarnate
+preincentive
+preinclination
+preincline
+preinclude
+preinclusion
+preincorporate
+preincorporation
+preincrease
+preindebted
+preindebtedness
+preindemnification
+preindemnify
+preindemnity
+preindependence
+preindependent
+preindependently
+preindesignate
+preindicant
+preindicate
+preindication
+preindispose
+preindisposition
+preinduce
+preinducement
+preinduction
+preinductive
+preindulge
+preindulgence
+preindulgent
+preindustrial
+preindustry
+preinfect
+preinfection
+preinfer
+preinference
+preinflection
+preinflectional
+preinflict
+preinfluence
+preinform
+preinformation
+preinhabit
+preinhabitant
+preinhabitation
+preinhere
+preinherit
+preinheritance
+preinitial
+preinitiate
+preinitiation
+preinjure
+preinjurious
+preinjury
+preinquisition
+preinscribe
+preinscription
+preinsert
+preinsertion
+preinsinuate
+preinsinuating
+preinsinuatingly
+preinsinuation
+preinsinuative
+preinspect
+preinspection
+preinspector
+preinspire
+preinstall
+preinstallation
+preinstill
+preinstillation
+preinstruct
+preinstruction
+preinstructional
+preinstructive
+preinsula
+preinsular
+preinsulate
+preinsulation
+preinsult
+preinsurance
+preinsure
+preintellectual
+preintelligence
+preintelligent
+preintelligently
+preintend
+preintention
+preintercede
+preintercession
+preinterchange
+preintercourse
+preinterest
+preinterfere
+preinterference
+preinterpret
+preinterpretation
+preinterpretative
+preinterview
+preintone
+preinvent
+preinvention
+preinventive
+preinventory
+preinvest
+preinvestigate
+preinvestigation
+preinvestigator
+preinvestment
+preinvitation
+preinvite
+preinvocation
+preinvolve
+preinvolvement
+preiotization
+preiotize
+preirrigation
+preirrigational
+preissuance
+preissue
+prejacent
+prejournalistic
+prejudge
+prejudgement
+prejudger
+prejudgment
+prejudication
+prejudicative
+prejudicator
+prejudice
+prejudiced
+prejudicedly
+prejudiceless
+prejudiciable
+prejudicial
+prejudicially
+prejudicialness
+prejudicious
+prejudiciously
+prejunior
+prejurisdiction
+prejustification
+prejustify
+prejuvenile
+Prekantian
+prekindergarten
+prekindle
+preknit
+preknow
+preknowledge
+prelabel
+prelabial
+prelabor
+prelabrum
+prelachrymal
+prelacrimal
+prelacteal
+prelacy
+prelanguage
+prelapsarian
+prelate
+prelatehood
+prelateship
+prelatess
+prelatial
+prelatic
+prelatical
+prelatically
+prelaticalness
+prelation
+prelatish
+prelatism
+prelatist
+prelatize
+prelatry
+prelature
+prelaunch
+prelaunching
+prelawful
+prelawfully
+prelawfulness
+prelease
+prelect
+prelection
+prelector
+prelectorship
+prelectress
+prelecture
+prelegacy
+prelegal
+prelegate
+prelegatee
+prelegend
+prelegendary
+prelegislative
+preliability
+preliable
+prelibation
+preliberal
+preliberality
+preliberally
+preliberate
+preliberation
+prelicense
+prelim
+preliminarily
+preliminary
+prelimit
+prelimitate
+prelimitation
+prelingual
+prelinguistic
+prelinpinpin
+preliquidate
+preliquidation
+preliteral
+preliterally
+preliteralness
+preliterary
+preliterate
+preliterature
+prelithic
+prelitigation
+preloan
+prelocalization
+prelocate
+prelogic
+prelogical
+preloral
+preloreal
+preloss
+prelude
+preluder
+preludial
+preludious
+preludiously
+preludium
+preludize
+prelumbar
+prelusion
+prelusive
+prelusively
+prelusorily
+prelusory
+preluxurious
+premachine
+premadness
+premaintain
+premaintenance
+premake
+premaker
+premaking
+premandibular
+premanhood
+premaniacal
+premanifest
+premanifestation
+premankind
+premanufacture
+premanufacturer
+premanufacturing
+premarital
+premarriage
+premarry
+premastery
+prematch
+premate
+prematerial
+prematernity
+prematrimonial
+prematuration
+premature
+prematurely
+prematureness
+prematurity
+premaxilla
+premaxillary
+premeasure
+premeasurement
+premechanical
+premedia
+premedial
+premedian
+premedic
+premedical
+premedicate
+premedication
+premedieval
+premedievalism
+premeditate
+premeditatedly
+premeditatedness
+premeditatingly
+premeditation
+premeditative
+premeditator
+premegalithic
+prememorandum
+premenace
+premenstrual
+premention
+premeridian
+premerit
+premetallic
+premethodical
+premial
+premiant
+premiate
+premidnight
+premidsummer
+premier
+premieral
+premiere
+premieress
+premierjus
+premiership
+premilitary
+premillenarian
+premillenarianism
+premillennial
+premillennialism
+premillennialist
+premillennialize
+premillennially
+premillennian
+preminister
+preministry
+premious
+premisal
+premise
+premisory
+premisrepresent
+premisrepresentation
+premiss
+premium
+premix
+premixer
+premixture
+premodel
+premodern
+premodification
+premodify
+premolar
+premold
+premolder
+premolding
+premonarchial
+premonetary
+Premongolian
+premonish
+premonishment
+premonition
+premonitive
+premonitor
+premonitorily
+premonitory
+premonopolize
+premonopoly
+Premonstrant
+Premonstratensian
+premonumental
+premoral
+premorality
+premorally
+premorbid
+premorbidly
+premorbidness
+premorning
+premorse
+premortal
+premortification
+premortify
+premortuary
+premosaic
+premotion
+premourn
+premove
+premovement
+premover
+premuddle
+premultiplication
+premultiplier
+premultiply
+premundane
+premunicipal
+premunition
+premunitory
+premusical
+premuster
+premutative
+premutiny
+premycotic
+premyelocyte
+premythical
+prename
+Prenanthes
+prenares
+prenarial
+prenaris
+prenasal
+prenatal
+prenatalist
+prenatally
+prenational
+prenative
+prenatural
+prenaval
+prender
+prendre
+prenebular
+prenecessitate
+preneglect
+preneglectful
+prenegligence
+prenegligent
+prenegotiate
+prenegotiation
+preneolithic
+prenephritic
+preneural
+preneuralgic
+prenight
+prenoble
+prenodal
+prenominal
+prenominate
+prenomination
+prenominical
+prenotation
+prenotice
+prenotification
+prenotify
+prenotion
+prentice
+prenticeship
+prenumber
+prenumbering
+prenuncial
+prenuptial
+prenursery
+preobedience
+preobedient
+preobject
+preobjection
+preobjective
+preobligate
+preobligation
+preoblige
+preobservance
+preobservation
+preobservational
+preobserve
+preobstruct
+preobstruction
+preobtain
+preobtainable
+preobtrude
+preobtrusion
+preobtrusive
+preobviate
+preobvious
+preobviously
+preobviousness
+preoccasioned
+preoccipital
+preocclusion
+preoccultation
+preoccupancy
+preoccupant
+preoccupate
+preoccupation
+preoccupative
+preoccupied
+preoccupiedly
+preoccupiedness
+preoccupier
+preoccupy
+preoccur
+preoccurrence
+preoceanic
+preocular
+preodorous
+preoffend
+preoffense
+preoffensive
+preoffensively
+preoffensiveness
+preoffer
+preoffering
+preofficial
+preofficially
+preominate
+preomission
+preomit
+preopen
+preopening
+preoperate
+preoperation
+preoperative
+preoperatively
+preoperator
+preopercle
+preopercular
+preoperculum
+preopinion
+preopinionated
+preoppose
+preopposition
+preoppress
+preoppression
+preoppressor
+preoptic
+preoptimistic
+preoption
+preoral
+preorally
+preorbital
+preordain
+preorder
+preordination
+preorganic
+preorganization
+preorganize
+preoriginal
+preoriginally
+preornamental
+preoutfit
+preoutline
+preoverthrow
+prep
+prepainful
+prepalatal
+prepalatine
+prepaleolithic
+prepanic
+preparable
+preparation
+preparationist
+preparative
+preparatively
+preparator
+preparatorily
+preparatory
+prepardon
+prepare
+prepared
+preparedly
+preparedness
+preparement
+preparental
+preparer
+preparietal
+preparingly
+preparliamentary
+preparoccipital
+preparoxysmal
+prepartake
+preparticipation
+prepartisan
+prepartition
+prepartnership
+prepatellar
+prepatent
+prepatriotic
+prepave
+prepavement
+prepay
+prepayable
+prepayment
+prepeduncle
+prepenetrate
+prepenetration
+prepenial
+prepense
+prepensely
+prepeople
+preperceive
+preperception
+preperceptive
+preperitoneal
+prepersuade
+prepersuasion
+prepersuasive
+preperusal
+preperuse
+prepetition
+prephragma
+prephthisical
+prepigmental
+prepink
+prepious
+prepituitary
+preplace
+preplacement
+preplacental
+preplan
+preplant
+prepledge
+preplot
+prepoetic
+prepoetical
+prepoison
+prepolice
+prepolish
+prepolitic
+prepolitical
+prepolitically
+prepollence
+prepollency
+prepollent
+prepollex
+preponder
+preponderance
+preponderancy
+preponderant
+preponderantly
+preponderate
+preponderately
+preponderating
+preponderatingly
+preponderation
+preponderous
+preponderously
+prepontile
+prepontine
+preportray
+preportrayal
+prepose
+preposition
+prepositional
+prepositionally
+prepositive
+prepositively
+prepositor
+prepositorial
+prepositure
+prepossess
+prepossessed
+prepossessing
+prepossessingly
+prepossessingness
+prepossession
+prepossessionary
+prepossessor
+preposterous
+preposterously
+preposterousness
+prepostorship
+prepotence
+prepotency
+prepotent
+prepotential
+prepotently
+prepractical
+prepractice
+preprandial
+prepreference
+prepreparation
+preprice
+preprimary
+preprimer
+preprimitive
+preprint
+preprofess
+preprofessional
+preprohibition
+prepromise
+prepromote
+prepromotion
+prepronounce
+prepronouncement
+preprophetic
+preprostatic
+preprove
+preprovide
+preprovision
+preprovocation
+preprovoke
+preprudent
+preprudently
+prepsychological
+prepsychology
+prepuberal
+prepubertal
+prepuberty
+prepubescent
+prepubic
+prepubis
+prepublication
+prepublish
+prepuce
+prepunctual
+prepunish
+prepunishment
+prepupa
+prepupal
+prepurchase
+prepurchaser
+prepurpose
+preputial
+preputium
+prepyloric
+prepyramidal
+prequalification
+prequalify
+prequarantine
+prequestion
+prequotation
+prequote
+preracing
+preradio
+prerailroad
+prerailroadite
+prerailway
+preramus
+prerational
+prereadiness
+preready
+prerealization
+prerealize
+prerebellion
+prereceipt
+prereceive
+prereceiver
+prerecital
+prerecite
+prereckon
+prereckoning
+prerecognition
+prerecognize
+prerecommend
+prerecommendation
+prereconcile
+prereconcilement
+prereconciliation
+prerectal
+preredeem
+preredemption
+prereduction
+prerefer
+prereference
+prerefine
+prerefinement
+prereform
+prereformation
+prereformatory
+prerefusal
+prerefuse
+preregal
+preregister
+preregistration
+preregulate
+preregulation
+prereject
+prerejection
+prerejoice
+prerelate
+prerelation
+prerelationship
+prerelease
+prereligious
+prereluctation
+preremit
+preremittance
+preremorse
+preremote
+preremoval
+preremove
+preremunerate
+preremuneration
+prerenal
+prerent
+prerental
+prereport
+prerepresent
+prerepresentation
+prereption
+prerepublican
+prerequest
+prerequire
+prerequirement
+prerequisite
+prerequisition
+preresemblance
+preresemble
+preresolve
+preresort
+prerespectability
+prerespectable
+prerespiration
+prerespire
+preresponsibility
+preresponsible
+prerestoration
+prerestrain
+prerestraint
+prerestrict
+prerestriction
+prereturn
+prereveal
+prerevelation
+prerevenge
+prereversal
+prereverse
+prereview
+prerevise
+prerevision
+prerevival
+prerevolutionary
+prerheumatic
+prerich
+prerighteous
+prerighteously
+prerighteousness
+prerogatival
+prerogative
+prerogatived
+prerogatively
+prerogativity
+prerolandic
+preromantic
+preromanticism
+preroute
+preroutine
+preroyal
+preroyally
+preroyalty
+prerupt
+preruption
+presacral
+presacrifice
+presacrificial
+presage
+presageful
+presagefully
+presager
+presagient
+presaging
+presagingly
+presalvation
+presanctification
+presanctified
+presanctify
+presanguine
+presanitary
+presartorial
+presatisfaction
+presatisfactory
+presatisfy
+presavage
+presavagery
+presay
+presbyacousia
+presbyacusia
+presbycousis
+presbycusis
+presbyope
+presbyophrenia
+presbyophrenic
+presbyopia
+presbyopic
+presbyopy
+presbyte
+presbyter
+presbyteral
+presbyterate
+presbyterated
+presbyteress
+presbyteria
+presbyterial
+presbyterially
+Presbyterian
+Presbyterianism
+Presbyterianize
+Presbyterianly
+presbyterium
+presbytership
+presbytery
+presbytia
+presbytic
+Presbytinae
+Presbytis
+presbytism
+prescapula
+prescapular
+prescapularis
+prescholastic
+preschool
+prescience
+prescient
+prescientific
+presciently
+prescind
+prescindent
+prescission
+prescored
+prescout
+prescribable
+prescribe
+prescriber
+prescript
+prescriptibility
+prescriptible
+prescription
+prescriptionist
+prescriptive
+prescriptively
+prescriptiveness
+prescriptorial
+prescrive
+prescutal
+prescutum
+preseal
+presearch
+preseason
+preseasonal
+presecular
+presecure
+presee
+preselect
+presell
+preseminal
+preseminary
+presence
+presenced
+presenceless
+presenile
+presenility
+presensation
+presension
+present
+presentability
+presentable
+presentableness
+presentably
+presental
+presentation
+presentational
+presentationism
+presentationist
+presentative
+presentatively
+presentee
+presentence
+presenter
+presential
+presentiality
+presentially
+presentialness
+presentient
+presentiment
+presentimental
+presentist
+presentive
+presentively
+presentiveness
+presently
+presentment
+presentness
+presentor
+preseparate
+preseparation
+preseparator
+preservability
+preservable
+preserval
+preservation
+preservationist
+preservative
+preservatize
+preservatory
+preserve
+preserver
+preserveress
+preses
+presession
+preset
+presettle
+presettlement
+presexual
+preshadow
+preshape
+preshare
+presharpen
+preshelter
+preship
+preshipment
+preshortage
+preshorten
+preshow
+preside
+presidence
+presidencia
+presidency
+president
+presidente
+presidentess
+presidential
+presidentially
+presidentiary
+presidentship
+presider
+presidial
+presidially
+presidiary
+presidio
+presidium
+presift
+presign
+presignal
+presignificance
+presignificancy
+presignificant
+presignification
+presignificative
+presignificator
+presignify
+presimian
+preslavery
+Presley
+presmooth
+presocial
+presocialism
+presocialist
+presolar
+presolicit
+presolicitation
+presolution
+presolve
+presophomore
+presound
+prespecialist
+prespecialize
+prespecific
+prespecifically
+prespecification
+prespecify
+prespeculate
+prespeculation
+presphenoid
+presphenoidal
+presphygmic
+prespinal
+prespinous
+prespiracular
+presplendor
+presplenomegalic
+prespoil
+prespontaneity
+prespontaneous
+prespontaneously
+prespread
+presprinkle
+prespur
+press
+pressable
+pressboard
+pressdom
+pressel
+presser
+pressfat
+pressful
+pressgang
+pressible
+pressing
+pressingly
+pressingness
+pression
+pressive
+pressman
+pressmanship
+pressmark
+pressor
+presspack
+pressroom
+pressurage
+pressural
+pressure
+pressureless
+pressureproof
+pressurize
+pressurizer
+presswoman
+presswork
+pressworker
+prest
+prestabilism
+prestability
+prestable
+prestamp
+prestandard
+prestandardization
+prestandardize
+prestant
+prestate
+prestation
+prestatistical
+presteam
+presteel
+prester
+presternal
+presternum
+prestidigital
+prestidigitate
+prestidigitation
+prestidigitator
+prestidigitatorial
+prestige
+prestigiate
+prestigiation
+prestigiator
+prestigious
+prestigiously
+prestigiousness
+prestimulate
+prestimulation
+prestimulus
+prestissimo
+presto
+prestock
+prestomial
+prestomium
+prestorage
+prestore
+prestraighten
+prestrain
+prestrengthen
+prestress
+prestretch
+prestricken
+prestruggle
+prestubborn
+prestudious
+prestudiously
+prestudiousness
+prestudy
+presubdue
+presubiculum
+presubject
+presubjection
+presubmission
+presubmit
+presubordinate
+presubordination
+presubscribe
+presubscriber
+presubscription
+presubsist
+presubsistence
+presubsistent
+presubstantial
+presubstitute
+presubstitution
+presuccess
+presuccessful
+presuccessfully
+presuffer
+presuffering
+presufficiency
+presufficient
+presufficiently
+presuffrage
+presuggest
+presuggestion
+presuggestive
+presuitability
+presuitable
+presuitably
+presumable
+presumably
+presume
+presumedly
+presumer
+presuming
+presumption
+presumptious
+presumptiously
+presumptive
+presumptively
+presumptuous
+presumptuously
+presumptuousness
+presuperficial
+presuperficiality
+presuperficially
+presuperfluity
+presuperfluous
+presuperfluously
+presuperintendence
+presuperintendency
+presupervise
+presupervision
+presupervisor
+presupplemental
+presupplementary
+presupplicate
+presupplication
+presupply
+presupport
+presupposal
+presuppose
+presupposition
+presuppositionless
+presuppress
+presuppression
+presuppurative
+presupremacy
+presupreme
+presurgery
+presurgical
+presurmise
+presurprisal
+presurprise
+presurrender
+presurround
+presurvey
+presusceptibility
+presusceptible
+presuspect
+presuspend
+presuspension
+presuspicion
+presuspicious
+presuspiciously
+presuspiciousness
+presustain
+presutural
+preswallow
+presylvian
+presympathize
+presympathy
+presymphonic
+presymphony
+presymphysial
+presymptom
+presymptomatic
+presynapsis
+presynaptic
+presystematic
+presystematically
+presystole
+presystolic
+pretabulate
+pretabulation
+pretan
+pretangible
+pretangibly
+pretannage
+pretardily
+pretardiness
+pretardy
+pretariff
+pretaste
+preteach
+pretechnical
+pretechnically
+pretelegraph
+pretelegraphic
+pretelephone
+pretelephonic
+pretell
+pretemperate
+pretemperately
+pretemporal
+pretend
+pretendant
+pretended
+pretendedly
+pretender
+Pretenderism
+pretendership
+pretendingly
+pretendingness
+pretense
+pretenseful
+pretenseless
+pretension
+pretensional
+pretensionless
+pretensive
+pretensively
+pretensiveness
+pretentative
+pretentious
+pretentiously
+pretentiousness
+pretercanine
+preterchristian
+preterconventional
+preterdetermined
+preterdeterminedly
+preterdiplomatic
+preterdiplomatically
+preterequine
+preteressential
+pretergress
+pretergression
+preterhuman
+preterience
+preterient
+preterintentional
+preterist
+preterit
+preteriteness
+preterition
+preteritive
+preteritness
+preterlabent
+preterlegal
+preterlethal
+preterminal
+pretermission
+pretermit
+pretermitter
+preternative
+preternatural
+preternaturalism
+preternaturalist
+preternaturality
+preternaturally
+preternaturalness
+preternormal
+preternotorious
+preternuptial
+preterpluperfect
+preterpolitical
+preterrational
+preterregular
+preterrestrial
+preterritorial
+preterroyal
+preterscriptural
+preterseasonable
+pretersensual
+pretervection
+pretest
+pretestify
+pretestimony
+pretext
+pretexted
+pretextuous
+pretheological
+prethoracic
+prethoughtful
+prethoughtfully
+prethoughtfulness
+prethreaten
+prethrill
+prethrust
+pretibial
+pretimeliness
+pretimely
+pretincture
+pretire
+pretoken
+pretone
+pretonic
+pretorial
+pretorship
+pretorsional
+pretorture
+pretournament
+pretrace
+pretracheal
+pretraditional
+pretrain
+pretraining
+pretransact
+pretransaction
+pretranscribe
+pretranscription
+pretranslate
+pretranslation
+pretransmission
+pretransmit
+pretransport
+pretransportation
+pretravel
+pretreat
+pretreatment
+pretreaty
+pretrematic
+pretribal
+pretry
+prettification
+prettifier
+prettify
+prettikin
+prettily
+prettiness
+pretty
+prettyface
+prettyish
+prettyism
+pretubercular
+pretuberculous
+pretympanic
+pretyphoid
+pretypify
+pretypographical
+pretyrannical
+pretyranny
+pretzel
+preultimate
+preultimately
+preumbonal
+preunderstand
+preundertake
+preunion
+preunite
+preutilizable
+preutilization
+preutilize
+prevacate
+prevacation
+prevaccinate
+prevaccination
+prevail
+prevailance
+prevailer
+prevailingly
+prevailingness
+prevailment
+prevalence
+prevalency
+prevalent
+prevalently
+prevalentness
+prevalescence
+prevalescent
+prevalid
+prevalidity
+prevalidly
+prevaluation
+prevalue
+prevariation
+prevaricate
+prevarication
+prevaricator
+prevaricatory
+prevascular
+prevegetation
+prevelar
+prevenance
+prevenancy
+prevene
+prevenience
+prevenient
+preveniently
+prevent
+preventability
+preventable
+preventative
+preventer
+preventible
+preventingly
+prevention
+preventionism
+preventionist
+preventive
+preventively
+preventiveness
+preventorium
+preventure
+preverb
+preverbal
+preverification
+preverify
+prevernal
+preversion
+prevertebral
+prevesical
+preveto
+previctorious
+previde
+previdence
+preview
+previgilance
+previgilant
+previgilantly
+previolate
+previolation
+previous
+previously
+previousness
+previse
+previsibility
+previsible
+previsibly
+prevision
+previsional
+previsit
+previsitor
+previsive
+previsor
+prevocal
+prevocalic
+prevocally
+prevocational
+prevogue
+prevoid
+prevoidance
+prevolitional
+prevolunteer
+prevomer
+prevotal
+prevote
+prevoyance
+prevoyant
+prevue
+prewar
+prewarn
+prewarrant
+prewash
+preweigh
+prewelcome
+prewhip
+prewilling
+prewillingly
+prewillingness
+prewire
+prewireless
+prewitness
+prewonder
+prewonderment
+preworldliness
+preworldly
+preworship
+preworthily
+preworthiness
+preworthy
+prewound
+prewrap
+prexy
+prey
+preyer
+preyful
+preyingly
+preyouthful
+prezonal
+prezone
+prezygapophysial
+prezygapophysis
+prezygomatic
+Pria
+priacanthid
+Priacanthidae
+priacanthine
+Priacanthus
+Priapean
+Priapic
+priapism
+Priapulacea
+priapulid
+Priapulida
+Priapulidae
+priapuloid
+Priapuloidea
+Priapulus
+Priapus
+Priapusian
+Price
+price
+priceable
+priceably
+priced
+priceite
+priceless
+pricelessness
+pricer
+prich
+prick
+prickant
+pricked
+pricker
+pricket
+prickfoot
+pricking
+prickingly
+prickish
+prickle
+prickleback
+prickled
+pricklefish
+prickless
+prickliness
+prickling
+pricklingly
+pricklouse
+prickly
+pricklyback
+prickmadam
+prickmedainty
+prickproof
+pricks
+prickseam
+prickshot
+prickspur
+pricktimber
+prickwood
+pricky
+pride
+prideful
+pridefully
+pridefulness
+prideless
+pridelessly
+prideling
+prideweed
+pridian
+priding
+pridingly
+pridy
+pried
+prier
+priest
+priestal
+priestcap
+priestcraft
+priestdom
+priesteen
+priestery
+priestess
+priestfish
+priesthood
+priestianity
+priestish
+priestism
+priestless
+priestlet
+priestlike
+priestliness
+priestling
+priestly
+priestship
+priestshire
+prig
+prigdom
+prigger
+priggery
+priggess
+priggish
+priggishly
+priggishness
+priggism
+prighood
+prigman
+prill
+prillion
+prim
+prima
+primacy
+primage
+primal
+primality
+primar
+primarian
+primaried
+primarily
+primariness
+primary
+primatal
+primate
+Primates
+primateship
+primatial
+primatic
+primatical
+primavera
+primaveral
+prime
+primegilt
+primely
+primeness
+primer
+primero
+primerole
+primeval
+primevalism
+primevally
+primeverose
+primevity
+primevous
+primevrin
+Primianist
+primigene
+primigenial
+primigenian
+primigenious
+primigenous
+primigravida
+primine
+priming
+primipara
+primiparity
+primiparous
+primipilar
+primitiae
+primitial
+primitias
+primitive
+primitively
+primitivism
+primitivist
+primitivistic
+primitivity
+primly
+primness
+primogenetrix
+primogenial
+primogenital
+primogenitary
+primogenitive
+primogenitor
+primogeniture
+primogenitureship
+primogenous
+primoprime
+primoprimitive
+primordality
+primordia
+primordial
+primordialism
+primordially
+primordiate
+primordium
+primosity
+primost
+primp
+primrose
+primrosed
+primrosetide
+primrosetime
+primrosy
+primsie
+Primula
+primula
+Primulaceae
+primulaceous
+Primulales
+primulaverin
+primulaveroside
+primulic
+primuline
+Primulinus
+Primus
+primus
+primwort
+primy
+prince
+princeage
+princecraft
+princedom
+princehood
+Princeite
+princekin
+princeless
+princelet
+princelike
+princeliness
+princeling
+princely
+princeps
+princeship
+princess
+princessdom
+princesse
+princesslike
+princessly
+princewood
+princified
+princify
+principal
+principality
+principally
+principalness
+principalship
+principate
+Principes
+principes
+principia
+principiant
+principiate
+principiation
+principium
+principle
+principulus
+princock
+princox
+prine
+pringle
+prink
+prinker
+prinkle
+prinky
+print
+printability
+printable
+printableness
+printed
+printer
+printerdom
+printerlike
+printery
+printing
+printless
+printline
+printscript
+printworks
+Priodon
+priodont
+Priodontes
+prion
+prionid
+Prionidae
+Prioninae
+prionine
+Prionodesmacea
+prionodesmacean
+prionodesmaceous
+prionodesmatic
+Prionodon
+prionodont
+Prionopinae
+prionopine
+Prionops
+Prionus
+prior
+prioracy
+prioral
+priorate
+prioress
+prioristic
+prioristically
+priorite
+priority
+priorly
+priorship
+priory
+prisable
+prisage
+prisal
+priscan
+Priscian
+Priscianist
+Priscilla
+Priscillian
+Priscillianism
+Priscillianist
+prism
+prismal
+prismatic
+prismatical
+prismatically
+prismatization
+prismatize
+prismatoid
+prismatoidal
+prismed
+prismoid
+prismoidal
+prismy
+prisometer
+prison
+prisonable
+prisondom
+prisoner
+prisonful
+prisonlike
+prisonment
+prisonous
+priss
+prissily
+prissiness
+prissy
+pristane
+pristine
+Pristipomatidae
+Pristipomidae
+Pristis
+Pristodus
+pritch
+Pritchardia
+pritchel
+prithee
+prius
+privacity
+privacy
+privant
+private
+privateer
+privateersman
+privately
+privateness
+privation
+privative
+privatively
+privativeness
+privet
+privilege
+privileged
+privileger
+privily
+priviness
+privity
+privy
+prizable
+prize
+prizeable
+prizeholder
+prizeman
+prizer
+prizery
+prizetaker
+prizeworthy
+pro
+proa
+proabolitionist
+proabsolutism
+proabsolutist
+proabstinence
+proacademic
+proacceptance
+proacquisition
+proacquittal
+proaction
+proactor
+proaddition
+proadjournment
+proadministration
+proadmission
+proadoption
+proadvertising
+proaesthetic
+proaggressionist
+proagitation
+proagrarian
+proagreement
+proagricultural
+proagule
+proairesis
+proairplane
+proal
+proalcoholism
+proalien
+proalliance
+proallotment
+proalteration
+proamateur
+proambient
+proamendment
+proamnion
+proamniotic
+proamusement
+proanaphora
+proanaphoral
+proanarchic
+proangiosperm
+proangiospermic
+proangiospermous
+proanimistic
+proannexation
+proannexationist
+proantarctic
+proanthropos
+proapostolic
+proappointment
+proapportionment
+proappreciation
+proappropriation
+proapproval
+proaquatic
+proarbitration
+proarbitrationist
+proarchery
+proarctic
+proaristocratic
+proarmy
+Proarthri
+proassessment
+proassociation
+proatheist
+proatheistic
+proathletic
+proatlas
+proattack
+proattendance
+proauction
+proaudience
+proaulion
+proauthor
+proauthority
+proautomobile
+proavian
+proaviation
+Proavis
+proaward
+prob
+probabiliorism
+probabiliorist
+probabilism
+probabilist
+probabilistic
+probability
+probabilize
+probabl
+probable
+probableness
+probably
+probachelor
+probal
+proballoon
+probang
+probanishment
+probankruptcy
+probant
+probargaining
+probaseball
+probasketball
+probate
+probathing
+probatical
+probation
+probational
+probationary
+probationer
+probationerhood
+probationership
+probationism
+probationist
+probationship
+probative
+probatively
+probator
+probatory
+probattle
+probattleship
+probe
+probeable
+probeer
+prober
+probetting
+probiology
+probituminous
+probity
+problem
+problematic
+problematical
+problematically
+problematist
+problematize
+problemdom
+problemist
+problemistic
+problemize
+problemwise
+problockade
+probonding
+probonus
+proborrowing
+proboscidal
+proboscidate
+Proboscidea
+proboscidean
+proboscideous
+proboscides
+proboscidial
+proboscidian
+proboscidiferous
+proboscidiform
+probosciform
+probosciformed
+Probosciger
+proboscis
+proboscislike
+probouleutic
+proboulevard
+probowling
+proboxing
+proboycott
+probrick
+probridge
+probroadcasting
+probudget
+probudgeting
+probuilding
+probusiness
+probuying
+procacious
+procaciously
+procacity
+procaine
+procambial
+procambium
+procanal
+procancellation
+procapital
+procapitalism
+procapitalist
+procarnival
+procarp
+procarpium
+procarrier
+procatalectic
+procatalepsis
+procatarctic
+procatarxis
+procathedral
+Procavia
+Procaviidae
+procedendo
+procedural
+procedure
+proceed
+proceeder
+proceeding
+proceeds
+proceleusmatic
+Procellaria
+procellarian
+procellarid
+Procellariidae
+Procellariiformes
+procellariine
+procellas
+procello
+procellose
+procellous
+procensorship
+procensure
+procentralization
+procephalic
+procercoid
+procereal
+procerebral
+procerebrum
+proceremonial
+proceremonialism
+proceremonialist
+proceres
+procerite
+proceritic
+procerity
+procerus
+process
+processal
+procession
+processional
+processionalist
+processionally
+processionary
+processioner
+processionist
+processionize
+processionwise
+processive
+processor
+processual
+procharity
+prochein
+prochemical
+prochlorite
+prochondral
+prochoos
+prochordal
+prochorion
+prochorionic
+prochromosome
+prochronic
+prochronism
+prochronize
+prochurch
+prochurchian
+procidence
+procident
+procidentia
+procivic
+procivilian
+procivism
+proclaim
+proclaimable
+proclaimant
+proclaimer
+proclaiming
+proclaimingly
+proclamation
+proclamator
+proclamatory
+proclassic
+proclassical
+proclergy
+proclerical
+proclericalism
+procline
+proclisis
+proclitic
+proclive
+proclivitous
+proclivity
+proclivous
+proclivousness
+Procne
+procnemial
+Procoelia
+procoelia
+procoelian
+procoelous
+procoercive
+procollectivistic
+procollegiate
+procombat
+procombination
+procomedy
+procommemoration
+procomment
+procommercial
+procommission
+procommittee
+procommunal
+procommunism
+procommunist
+procommutation
+procompensation
+procompetition
+procompromise
+procompulsion
+proconcentration
+proconcession
+proconciliation
+procondemnation
+proconfederationist
+proconference
+proconfession
+proconfessionist
+proconfiscation
+proconformity
+Proconnesian
+proconquest
+proconscription
+proconscriptive
+proconservation
+proconservationist
+proconsolidation
+proconstitutional
+proconstitutionalism
+proconsul
+proconsular
+proconsulary
+proconsulate
+proconsulship
+proconsultation
+procontinuation
+proconvention
+proconventional
+proconviction
+procoracoid
+procoracoidal
+procorporation
+procosmetic
+procosmopolitan
+procotton
+procourt
+procrastinate
+procrastinating
+procrastinatingly
+procrastination
+procrastinative
+procrastinatively
+procrastinator
+procrastinatory
+procreant
+procreate
+procreation
+procreative
+procreativeness
+procreator
+procreatory
+procreatress
+procreatrix
+procremation
+Procris
+procritic
+procritique
+Procrustean
+Procrusteanism
+Procrusteanize
+Procrustes
+procrypsis
+procryptic
+procryptically
+proctal
+proctalgia
+proctalgy
+proctatresia
+proctatresy
+proctectasia
+proctectomy
+procteurynter
+proctitis
+proctocele
+proctoclysis
+proctocolitis
+proctocolonoscopy
+proctocystoplasty
+proctocystotomy
+proctodaeal
+proctodaeum
+proctodynia
+proctoelytroplastic
+proctologic
+proctological
+proctologist
+proctology
+proctoparalysis
+proctoplastic
+proctoplasty
+proctoplegia
+proctopolypus
+proctoptoma
+proctoptosis
+proctor
+proctorage
+proctoral
+proctorial
+proctorially
+proctorical
+proctorization
+proctorize
+proctorling
+proctorrhagia
+proctorrhaphy
+proctorrhea
+proctorship
+proctoscope
+proctoscopic
+proctoscopy
+proctosigmoidectomy
+proctosigmoiditis
+proctospasm
+proctostenosis
+proctostomy
+proctotome
+proctotomy
+proctotresia
+proctotrypid
+Proctotrypidae
+proctotrypoid
+Proctotrypoidea
+proctovalvotomy
+Proculian
+procumbent
+procurable
+procuracy
+procural
+procurance
+procurate
+procuration
+procurative
+procurator
+procuratorate
+procuratorial
+procuratorship
+procuratory
+procuratrix
+procure
+procurement
+procurer
+procuress
+procurrent
+procursive
+procurvation
+procurved
+Procyon
+Procyonidae
+procyoniform
+Procyoniformia
+Procyoninae
+procyonine
+proczarist
+prod
+prodatary
+prodder
+proddle
+prodecoration
+prodefault
+prodefiance
+prodelay
+prodelision
+prodemocratic
+Prodenia
+prodenominational
+prodentine
+prodeportation
+prodespotic
+prodespotism
+prodialogue
+prodigal
+prodigalish
+prodigalism
+prodigality
+prodigalize
+prodigally
+prodigiosity
+prodigious
+prodigiously
+prodigiousness
+prodigus
+prodigy
+prodisarmament
+prodisplay
+prodissoconch
+prodissolution
+prodistribution
+prodition
+proditorious
+proditoriously
+prodivision
+prodivorce
+prodproof
+prodramatic
+prodroma
+prodromal
+prodromatic
+prodromatically
+prodrome
+prodromic
+prodromous
+prodromus
+producal
+produce
+produceable
+produceableness
+produced
+producent
+producer
+producership
+producibility
+producible
+producibleness
+product
+producted
+productibility
+productible
+productid
+Productidae
+productile
+production
+productional
+productionist
+productive
+productively
+productiveness
+productivity
+productoid
+productor
+productory
+productress
+Productus
+proecclesiastical
+proeconomy
+proeducation
+proeducational
+proegumenal
+proelectric
+proelectrical
+proelectrification
+proelectrocution
+proelimination
+proem
+proembryo
+proembryonic
+proemial
+proemium
+proemployee
+proemptosis
+proenforcement
+proenlargement
+proenzym
+proenzyme
+proepimeron
+proepiscopist
+proepisternum
+proequality
+proethical
+proethnic
+proethnically
+proetid
+Proetidae
+Proetus
+proevolution
+proevolutionist
+proexamination
+proexecutive
+proexemption
+proexercise
+proexperiment
+proexpert
+proexporting
+proexposure
+proextension
+proextravagance
+prof
+profaculty
+profanable
+profanableness
+profanably
+profanation
+profanatory
+profanchise
+profane
+profanely
+profanement
+profaneness
+profaner
+profanism
+profanity
+profanize
+profarmer
+profection
+profectional
+profectitious
+profederation
+profeminism
+profeminist
+proferment
+profert
+profess
+professable
+professed
+professedly
+profession
+professional
+professionalism
+professionalist
+professionality
+professionalization
+professionalize
+professionally
+professionist
+professionize
+professionless
+professive
+professively
+professor
+professorate
+professordom
+professoress
+professorial
+professorialism
+professorially
+professoriate
+professorlike
+professorling
+professorship
+professory
+proffer
+profferer
+proficience
+proficiency
+proficient
+proficiently
+proficientness
+profiction
+proficuous
+proficuously
+profile
+profiler
+profilist
+profilograph
+profit
+profitability
+profitable
+profitableness
+profitably
+profiteer
+profiteering
+profiter
+profiting
+profitless
+profitlessly
+profitlessness
+profitmonger
+profitmongering
+profitproof
+proflated
+proflavine
+profligacy
+profligate
+profligately
+profligateness
+profligation
+proflogger
+profluence
+profluent
+profluvious
+profluvium
+proforeign
+profound
+profoundly
+profoundness
+profraternity
+profugate
+profulgent
+profunda
+profundity
+profuse
+profusely
+profuseness
+profusion
+profusive
+profusively
+profusiveness
+prog
+progambling
+progamete
+progamic
+proganosaur
+Proganosauria
+progenerate
+progeneration
+progenerative
+progenital
+progenitive
+progenitiveness
+progenitor
+progenitorial
+progenitorship
+progenitress
+progenitrix
+progeniture
+progenity
+progeny
+progeotropic
+progeotropism
+progeria
+progermination
+progestational
+progesterone
+progestin
+progger
+proglottic
+proglottid
+proglottidean
+proglottis
+prognathi
+prognathic
+prognathism
+prognathous
+prognathy
+progne
+prognose
+prognosis
+prognostic
+prognosticable
+prognostically
+prognosticate
+prognostication
+prognosticative
+prognosticator
+prognosticatory
+progoneate
+progospel
+progovernment
+program
+programist
+programistic
+programma
+programmar
+programmatic
+programmatically
+programmatist
+programmer
+progrede
+progrediency
+progredient
+progress
+progresser
+progression
+progressional
+progressionally
+progressionary
+progressionism
+progressionist
+progressism
+progressist
+progressive
+progressively
+progressiveness
+progressivism
+progressivist
+progressivity
+progressor
+proguardian
+Progymnasium
+progymnosperm
+progymnospermic
+progymnospermous
+progypsy
+prohaste
+prohibit
+prohibiter
+prohibition
+prohibitionary
+prohibitionism
+prohibitionist
+prohibitive
+prohibitively
+prohibitiveness
+prohibitor
+prohibitorily
+prohibitory
+proholiday
+prohostility
+prohuman
+prohumanistic
+prohydrotropic
+prohydrotropism
+proidealistic
+proimmunity
+proinclusion
+proincrease
+proindemnity
+proindustrial
+proinjunction
+proinnovationist
+proinquiry
+proinsurance
+prointervention
+proinvestment
+proirrigation
+projacient
+project
+projectable
+projectedly
+projectile
+projecting
+projectingly
+projection
+projectional
+projectionist
+projective
+projectively
+projectivity
+projector
+projectress
+projectrix
+projecture
+projicience
+projicient
+projiciently
+projournalistic
+projudicial
+proke
+prokeimenon
+proker
+prokindergarten
+proklausis
+prolabium
+prolabor
+prolacrosse
+prolactin
+prolamin
+prolan
+prolapse
+prolapsus
+prolarva
+prolarval
+prolate
+prolately
+prolateness
+prolation
+prolative
+prolatively
+proleague
+proleaguer
+prolectite
+proleg
+prolegate
+prolegislative
+prolegomena
+prolegomenal
+prolegomenary
+prolegomenist
+prolegomenon
+prolegomenous
+proleniency
+prolepsis
+proleptic
+proleptical
+proleptically
+proleptics
+proletairism
+proletarian
+proletarianism
+proletarianization
+proletarianize
+proletarianly
+proletarianness
+proletariat
+proletariatism
+proletarization
+proletarize
+proletary
+proletcult
+proleucocyte
+proleukocyte
+prolicense
+prolicidal
+prolicide
+proliferant
+proliferate
+proliferation
+proliferative
+proliferous
+proliferously
+prolific
+prolificacy
+prolifical
+prolifically
+prolificalness
+prolificate
+prolification
+prolificity
+prolificly
+prolificness
+prolificy
+prolify
+proligerous
+proline
+proliquor
+proliterary
+proliturgical
+proliturgist
+prolix
+prolixity
+prolixly
+prolixness
+prolocution
+prolocutor
+prolocutorship
+prolocutress
+prolocutrix
+prologist
+prologize
+prologizer
+prologos
+prologue
+prologuelike
+prologuer
+prologuist
+prologuize
+prologuizer
+prologus
+prolong
+prolongable
+prolongableness
+prolongably
+prolongate
+prolongation
+prolonge
+prolonger
+prolongment
+prolusion
+prolusionize
+prolusory
+prolyl
+promachinery
+promachos
+promagisterial
+promagistracy
+promagistrate
+promajority
+promammal
+Promammalia
+promammalian
+promarriage
+promatrimonial
+promatrimonialist
+promaximum
+promemorial
+promenade
+promenader
+promenaderess
+promercantile
+promercy
+promerger
+promeristem
+promerit
+promeritor
+Promethea
+Promethean
+Prometheus
+promethium
+promic
+promilitarism
+promilitarist
+promilitary
+prominence
+prominency
+prominent
+prominently
+prominimum
+proministry
+prominority
+promisable
+promiscuity
+promiscuous
+promiscuously
+promiscuousness
+promise
+promisee
+promiseful
+promiseless
+promisemonger
+promiseproof
+promiser
+promising
+promisingly
+promisingness
+promisor
+promissionary
+promissive
+promissor
+promissorily
+promissory
+promitosis
+promittor
+promnesia
+promoderation
+promoderationist
+promodernist
+promodernistic
+promonarchic
+promonarchical
+promonarchicalness
+promonarchist
+promonopolist
+promonopoly
+promontoried
+promontory
+promoral
+promorph
+promorphological
+promorphologically
+promorphologist
+promorphology
+promotable
+promote
+promotement
+promoter
+promotion
+promotional
+promotive
+promotiveness
+promotor
+promotorial
+promotress
+promotrix
+promovable
+promovent
+prompt
+promptbook
+prompter
+promptitude
+promptive
+promptly
+promptness
+promptress
+promptuary
+prompture
+promulgate
+promulgation
+promulgator
+promulge
+promulger
+promuscidate
+promuscis
+promycelial
+promycelium
+promythic
+pronaos
+pronate
+pronation
+pronational
+pronationalism
+pronationalist
+pronationalistic
+pronative
+pronatoflexor
+pronator
+pronaval
+pronavy
+prone
+pronegotiation
+pronegro
+pronegroism
+pronely
+proneness
+pronephric
+pronephridiostome
+pronephron
+pronephros
+proneur
+prong
+prongbuck
+pronged
+pronger
+pronghorn
+pronglike
+pronic
+pronograde
+pronominal
+pronominalize
+pronominally
+pronomination
+pronotal
+pronotum
+pronoun
+pronounal
+pronounce
+pronounceable
+pronounced
+pronouncedly
+pronouncement
+pronounceness
+pronouncer
+pronpl
+pronto
+Pronuba
+pronuba
+pronubial
+pronuclear
+pronucleus
+pronumber
+pronunciability
+pronunciable
+pronuncial
+pronunciamento
+pronunciation
+pronunciative
+pronunciator
+pronunciatory
+pronymph
+pronymphal
+proo
+prooemiac
+prooemion
+prooemium
+proof
+proofer
+proofful
+proofing
+proofless
+prooflessly
+proofness
+proofread
+proofreader
+proofreading
+proofroom
+proofy
+prop
+propadiene
+propaedeutic
+propaedeutical
+propaedeutics
+propagability
+propagable
+propagableness
+propagand
+propaganda
+propagandic
+propagandism
+propagandist
+propagandistic
+propagandistically
+propagandize
+propagate
+propagation
+propagational
+propagative
+propagator
+propagatory
+propagatress
+propago
+propagulum
+propale
+propalinal
+propane
+propanedicarboxylic
+propanol
+propanone
+propapist
+proparasceve
+propargyl
+propargylic
+Proparia
+proparian
+proparliamental
+proparoxytone
+proparoxytonic
+proparticipation
+propatagial
+propatagian
+propatagium
+propatriotic
+propatriotism
+propatronage
+propayment
+propellable
+propellant
+propellent
+propeller
+propelment
+propend
+propendent
+propene
+propenoic
+propense
+propensely
+propenseness
+propension
+propensitude
+propensity
+propenyl
+propenylic
+proper
+properispome
+properispomenon
+properitoneal
+properly
+properness
+propertied
+property
+propertyless
+propertyship
+propessimism
+propessimist
+prophase
+prophasis
+prophecy
+prophecymonger
+prophesiable
+prophesier
+prophesy
+prophet
+prophetess
+prophethood
+prophetic
+prophetical
+propheticality
+prophetically
+propheticalness
+propheticism
+propheticly
+prophetism
+prophetize
+prophetless
+prophetlike
+prophetry
+prophetship
+prophilosophical
+prophloem
+prophoric
+prophototropic
+prophototropism
+prophylactic
+prophylactical
+prophylactically
+prophylaxis
+prophylaxy
+prophyll
+prophyllum
+propination
+propine
+propinoic
+propinquant
+propinque
+propinquity
+propinquous
+propiolaldehyde
+propiolate
+propiolic
+propionate
+propione
+Propionibacterieae
+Propionibacterium
+propionic
+propionitril
+propionitrile
+propionyl
+Propithecus
+propitiable
+propitial
+propitiate
+propitiatingly
+propitiation
+propitiative
+propitiator
+propitiatorily
+propitiatory
+propitious
+propitiously
+propitiousness
+proplasm
+proplasma
+proplastic
+propless
+propleural
+propleuron
+proplex
+proplexus
+Propliopithecus
+propodeal
+propodeon
+propodeum
+propodial
+propodiale
+propodite
+propoditic
+propodium
+propolis
+propolitical
+propolization
+propolize
+propone
+proponement
+proponent
+proponer
+propons
+Propontic
+propooling
+propopery
+proportion
+proportionability
+proportionable
+proportionableness
+proportionably
+proportional
+proportionalism
+proportionality
+proportionally
+proportionate
+proportionately
+proportionateness
+proportioned
+proportioner
+proportionless
+proportionment
+proposable
+proposal
+proposant
+propose
+proposer
+proposition
+propositional
+propositionally
+propositionize
+propositus
+propound
+propounder
+propoundment
+propoxy
+proppage
+propper
+propraetor
+propraetorial
+propraetorian
+proprecedent
+propriation
+proprietage
+proprietarian
+proprietariat
+proprietarily
+proprietary
+proprietor
+proprietorial
+proprietorially
+proprietorship
+proprietory
+proprietous
+proprietress
+proprietrix
+propriety
+proprioception
+proprioceptive
+proprioceptor
+propriospinal
+proprium
+proprivilege
+proproctor
+proprofit
+proprovincial
+proprovost
+props
+propterygial
+propterygium
+proptosed
+proptosis
+propublication
+propublicity
+propugnacled
+propugnaculum
+propugnation
+propugnator
+propugner
+propulsation
+propulsatory
+propulsion
+propulsity
+propulsive
+propulsor
+propulsory
+propunishment
+propupa
+propupal
+propurchase
+Propus
+propwood
+propygidium
+propyl
+propylacetic
+propylaeum
+propylamine
+propylation
+propylene
+propylic
+propylidene
+propylite
+propylitic
+propylitization
+propylon
+propyne
+propynoic
+proquaestor
+proracing
+prorailroad
+prorata
+proratable
+prorate
+proration
+prore
+proreader
+prorealism
+prorealist
+prorealistic
+proreality
+prorean
+prorebate
+prorebel
+prorecall
+proreciprocation
+prorecognition
+proreconciliation
+prorector
+prorectorate
+proredemption
+proreduction
+proreferendum
+proreform
+proreformist
+proregent
+prorelease
+Proreptilia
+proreptilian
+proreption
+prorepublican
+proresearch
+proreservationist
+proresignation
+prorestoration
+prorestriction
+prorevision
+prorevisionist
+prorevolution
+prorevolutionary
+prorevolutionist
+prorhinal
+Prorhipidoglossomorpha
+proritual
+proritualistic
+prorogate
+prorogation
+prorogator
+prorogue
+proroguer
+proromance
+proromantic
+proromanticism
+proroyal
+proroyalty
+prorrhesis
+prorsad
+prorsal
+proruption
+prosabbath
+prosabbatical
+prosacral
+prosaic
+prosaical
+prosaically
+prosaicalness
+prosaicism
+prosaicness
+prosaism
+prosaist
+prosar
+Prosarthri
+prosateur
+proscapula
+proscapular
+proscenium
+proscholastic
+proschool
+proscientific
+proscolecine
+proscolex
+proscribable
+proscribe
+proscriber
+proscript
+proscription
+proscriptional
+proscriptionist
+proscriptive
+proscriptively
+proscriptiveness
+proscutellar
+proscutellum
+proscynemata
+prose
+prosecrecy
+prosecretin
+prosect
+prosection
+prosector
+prosectorial
+prosectorium
+prosectorship
+prosecutable
+prosecute
+prosecution
+prosecutor
+prosecutrix
+proselenic
+proselike
+proselyte
+proselyter
+proselytical
+proselytingly
+proselytism
+proselytist
+proselytistic
+proselytization
+proselytize
+proselytizer
+proseman
+proseminar
+proseminary
+proseminate
+prosemination
+prosencephalic
+prosencephalon
+prosenchyma
+prosenchymatous
+proseneschal
+proser
+Proserpinaca
+prosethmoid
+proseucha
+proseuche
+prosification
+prosifier
+prosify
+prosiliency
+prosilient
+prosiliently
+prosilverite
+prosily
+Prosimiae
+prosimian
+prosiness
+prosing
+prosingly
+prosiphon
+prosiphonal
+prosiphonate
+prosish
+prosist
+proslambanomenos
+proslave
+proslaver
+proslavery
+proslaveryism
+prosneusis
+proso
+prosobranch
+Prosobranchia
+Prosobranchiata
+prosobranchiate
+prosocele
+prosodal
+prosode
+prosodemic
+prosodetic
+prosodiac
+prosodiacal
+prosodiacally
+prosodial
+prosodially
+prosodian
+prosodic
+prosodical
+prosodically
+prosodion
+prosodist
+prosodus
+prosody
+prosogaster
+prosogyrate
+prosogyrous
+prosoma
+prosomal
+prosomatic
+prosonomasia
+prosopalgia
+prosopalgic
+prosopantritis
+prosopectasia
+prosophist
+prosopic
+prosopically
+Prosopis
+prosopite
+Prosopium
+prosoplasia
+prosopography
+prosopon
+prosoponeuralgia
+prosopoplegia
+prosopoplegic
+prosopopoeia
+prosopopoeial
+prosoposchisis
+prosopospasm
+prosopotocia
+prosopyl
+prosopyle
+prosorus
+prospect
+prospection
+prospective
+prospectively
+prospectiveness
+prospectless
+prospector
+prospectus
+prospectusless
+prospeculation
+prosper
+prosperation
+prosperity
+prosperous
+prosperously
+prosperousness
+prospicience
+prosporangium
+prosport
+pross
+prossy
+prostatauxe
+prostate
+prostatectomy
+prostatelcosis
+prostatic
+prostaticovesical
+prostatism
+prostatitic
+prostatitis
+prostatocystitis
+prostatocystotomy
+prostatodynia
+prostatolith
+prostatomegaly
+prostatometer
+prostatomyomectomy
+prostatorrhea
+prostatorrhoea
+prostatotomy
+prostatovesical
+prostatovesiculectomy
+prostatovesiculitis
+prostemmate
+prostemmatic
+prosternal
+prosternate
+prosternum
+prostheca
+prosthenic
+prosthesis
+prosthetic
+prosthetically
+prosthetics
+prosthetist
+prosthion
+prosthionic
+prosthodontia
+prosthodontist
+Prostigmin
+prostitute
+prostitutely
+prostitution
+prostitutor
+prostomial
+prostomiate
+prostomium
+prostrate
+prostration
+prostrative
+prostrator
+prostrike
+prostyle
+prostylos
+prosubmission
+prosubscription
+prosubstantive
+prosubstitution
+prosuffrage
+prosupervision
+prosupport
+prosurgical
+prosurrender
+prosy
+prosyllogism
+prosyndicalism
+prosyndicalist
+protactic
+protactinium
+protagon
+protagonism
+protagonist
+Protagorean
+Protagoreanism
+protalbumose
+protamine
+protandric
+protandrism
+protandrous
+protandrously
+protandry
+protanomal
+protanomalous
+protanope
+protanopia
+protanopic
+protargentum
+protargin
+Protargol
+protariff
+protarsal
+protarsus
+protasis
+protaspis
+protatic
+protatically
+protax
+protaxation
+protaxial
+protaxis
+prote
+Protea
+protea
+Proteaceae
+proteaceous
+protead
+protean
+proteanly
+proteanwise
+protease
+protechnical
+protect
+protectant
+protectible
+protecting
+protectingly
+protectingness
+protection
+protectional
+protectionate
+protectionism
+protectionist
+protectionize
+protectionship
+protective
+protectively
+protectiveness
+Protectograph
+protector
+protectoral
+protectorate
+protectorial
+protectorian
+protectorless
+protectorship
+protectory
+protectress
+protectrix
+protege
+protegee
+protegulum
+proteic
+Proteida
+Proteidae
+proteide
+proteidean
+proteidogenous
+proteiform
+protein
+proteinaceous
+proteinase
+proteinic
+proteinochromogen
+proteinous
+proteinuria
+Proteles
+Protelidae
+Protelytroptera
+protelytropteran
+protelytropteron
+protelytropterous
+protemperance
+protempirical
+protemporaneous
+protend
+protension
+protensity
+protensive
+protensively
+proteoclastic
+proteogenous
+proteolysis
+proteolytic
+proteopectic
+proteopexic
+proteopexis
+proteopexy
+proteosaurid
+Proteosauridae
+Proteosaurus
+proteose
+Proteosoma
+proteosomal
+proteosome
+proteosuria
+protephemeroid
+Protephemeroidea
+proterandrous
+proterandrousness
+proterandry
+proteranthous
+proterobase
+proteroglyph
+Proteroglypha
+proteroglyphic
+proteroglyphous
+proterogynous
+proterogyny
+proterothesis
+proterotype
+Proterozoic
+protervity
+protest
+protestable
+protestancy
+protestant
+Protestantish
+Protestantishly
+protestantism
+Protestantize
+Protestantlike
+Protestantly
+protestation
+protestator
+protestatory
+protester
+protestingly
+protestive
+protestor
+protetrarch
+Proteus
+protevangel
+protevangelion
+protevangelium
+protext
+prothalamia
+prothalamion
+prothalamium
+prothallia
+prothallial
+prothallic
+prothalline
+prothallium
+prothalloid
+prothallus
+protheatrical
+protheca
+prothesis
+prothetic
+prothetical
+prothetically
+prothonotarial
+prothonotariat
+prothonotary
+prothonotaryship
+prothoracic
+prothorax
+prothrift
+prothrombin
+prothrombogen
+prothyl
+prothysteron
+protide
+protiodide
+protist
+Protista
+protistan
+protistic
+protistological
+protistologist
+protistology
+protiston
+Protium
+protium
+proto
+protoactinium
+protoalbumose
+protoamphibian
+protoanthropic
+protoapostate
+protoarchitect
+Protoascales
+Protoascomycetes
+protobacco
+Protobasidii
+Protobasidiomycetes
+protobasidiomycetous
+protobasidium
+protobishop
+protoblast
+protoblastic
+protoblattoid
+Protoblattoidea
+Protobranchia
+Protobranchiata
+protobranchiate
+protocalcium
+protocanonical
+Protocaris
+protocaseose
+protocatechualdehyde
+protocatechuic
+Protoceras
+Protoceratidae
+Protoceratops
+protocercal
+protocerebral
+protocerebrum
+protochemist
+protochemistry
+protochloride
+protochlorophyll
+Protochorda
+Protochordata
+protochordate
+protochromium
+protochronicler
+protocitizen
+protoclastic
+protocneme
+Protococcaceae
+protococcaceous
+protococcal
+Protococcales
+protococcoid
+Protococcus
+protocol
+protocolar
+protocolary
+Protocoleoptera
+protocoleopteran
+protocoleopteron
+protocoleopterous
+protocolist
+protocolization
+protocolize
+protoconch
+protoconchal
+protocone
+protoconid
+protoconule
+protoconulid
+protocopper
+protocorm
+protodeacon
+protoderm
+protodevil
+Protodonata
+protodonatan
+protodonate
+protodont
+Protodonta
+protodramatic
+protodynastic
+protoelastose
+protoepiphyte
+protoforaminifer
+protoforester
+protogaster
+protogelatose
+protogenal
+protogenes
+protogenesis
+protogenetic
+protogenic
+protogenist
+Protogeometric
+protogine
+protoglobulose
+protogod
+protogonous
+protogospel
+protograph
+protogynous
+protogyny
+protohematoblast
+Protohemiptera
+protohemipteran
+protohemipteron
+protohemipterous
+protoheresiarch
+Protohippus
+protohistorian
+protohistoric
+protohistory
+protohomo
+protohuman
+Protohydra
+protohydrogen
+Protohymenoptera
+protohymenopteran
+protohymenopteron
+protohymenopterous
+protoiron
+protoleration
+protoleucocyte
+protoleukocyte
+protolithic
+protoliturgic
+protolog
+protologist
+protoloph
+protoma
+protomagister
+protomagnate
+protomagnesium
+protomala
+protomalal
+protomalar
+protomammal
+protomammalian
+protomanganese
+protomartyr
+Protomastigida
+protome
+protomeristem
+protomerite
+protomeritic
+protometal
+protometallic
+protometaphrast
+Protominobacter
+Protomonadina
+protomonostelic
+protomorph
+protomorphic
+Protomycetales
+protomyosinose
+proton
+protone
+protonegroid
+protonema
+protonemal
+protonematal
+protonematoid
+protoneme
+Protonemertini
+protonephridial
+protonephridium
+protonephros
+protoneuron
+protoneurone
+protonic
+protonickel
+protonitrate
+protonotater
+protonym
+protonymph
+protonymphal
+protopapas
+protopappas
+protoparent
+protopathia
+protopathic
+protopathy
+protopatriarchal
+protopatrician
+protopattern
+protopectin
+protopectinase
+protopepsia
+Protoperlaria
+protoperlarian
+protophilosophic
+protophloem
+protophyll
+Protophyta
+protophyte
+protophytic
+protopin
+protopine
+protoplasm
+protoplasma
+protoplasmal
+protoplasmatic
+protoplasmic
+protoplast
+protoplastic
+protopod
+protopodial
+protopodite
+protopoditic
+protopoetic
+protopope
+protoporphyrin
+protopragmatic
+protopresbyter
+protopresbytery
+protoprism
+protoproteose
+protoprotestant
+protopteran
+Protopteridae
+protopteridophyte
+protopterous
+Protopterus
+protopyramid
+protore
+protorebel
+protoreligious
+protoreptilian
+Protorohippus
+protorosaur
+Protorosauria
+protorosaurian
+Protorosauridae
+protorosauroid
+Protorosaurus
+Protorthoptera
+protorthopteran
+protorthopteron
+protorthopterous
+protosalt
+protosaurian
+protoscientific
+Protoselachii
+protosilicate
+protosilicon
+protosinner
+Protosiphon
+Protosiphonaceae
+protosiphonaceous
+protosocial
+protosolution
+protospasm
+Protosphargis
+Protospondyli
+protospore
+Protostega
+Protostegidae
+protostele
+protostelic
+protostome
+protostrontium
+protosulphate
+protosulphide
+protosyntonose
+prototaxites
+prototheca
+protothecal
+prototheme
+protothere
+Prototheria
+prototherian
+prototitanium
+Prototracheata
+prototraitor
+prototroch
+prototrochal
+prototrophic
+prototypal
+prototype
+prototypic
+prototypical
+prototypically
+prototypographer
+prototyrant
+protovanadium
+protoveratrine
+protovertebra
+protovertebral
+protovestiary
+protovillain
+protovum
+protoxide
+protoxylem
+Protozoa
+protozoacidal
+protozoacide
+protozoal
+protozoan
+protozoea
+protozoean
+protozoiasis
+protozoic
+protozoological
+protozoologist
+protozoology
+protozoon
+protozoonal
+Protracheata
+protracheate
+protract
+protracted
+protractedly
+protractedness
+protracter
+protractible
+protractile
+protractility
+protraction
+protractive
+protractor
+protrade
+protradition
+protraditional
+protragedy
+protragical
+protragie
+protransfer
+protranslation
+protransubstantiation
+protravel
+protreasurer
+protreaty
+Protremata
+protreptic
+protreptical
+protriaene
+protropical
+protrudable
+protrude
+protrudent
+protrusible
+protrusile
+protrusion
+protrusive
+protrusively
+protrusiveness
+protuberance
+protuberancy
+protuberant
+protuberantial
+protuberantly
+protuberantness
+protuberate
+protuberosity
+protuberous
+Protura
+proturan
+protutor
+protutory
+protyl
+protyle
+Protylopus
+protype
+proudful
+proudhearted
+proudish
+proudishly
+proudling
+proudly
+proudness
+prouniformity
+prounion
+prounionist
+prouniversity
+proustite
+provability
+provable
+provableness
+provably
+provaccinist
+provand
+provant
+provascular
+prove
+provect
+provection
+proved
+proveditor
+provedly
+provedor
+provedore
+proven
+provenance
+Provencal
+Provencalize
+Provence
+Provencial
+provender
+provenience
+provenient
+provenly
+proventricular
+proventricule
+proventriculus
+prover
+proverb
+proverbial
+proverbialism
+proverbialist
+proverbialize
+proverbially
+proverbic
+proverbiologist
+proverbiology
+proverbize
+proverblike
+provicar
+provicariate
+providable
+providance
+provide
+provided
+providence
+provident
+providential
+providentialism
+providentially
+providently
+providentness
+provider
+providing
+providore
+providoring
+province
+provincial
+provincialate
+provincialism
+provincialist
+provinciality
+provincialization
+provincialize
+provincially
+provincialship
+provinciate
+provinculum
+provine
+proving
+provingly
+provision
+provisional
+provisionality
+provisionally
+provisionalness
+provisionary
+provisioner
+provisioneress
+provisionless
+provisionment
+provisive
+proviso
+provisor
+provisorily
+provisorship
+provisory
+provitamin
+provivisection
+provivisectionist
+provocant
+provocation
+provocational
+provocative
+provocatively
+provocativeness
+provocator
+provocatory
+provokable
+provoke
+provokee
+provoker
+provoking
+provokingly
+provokingness
+provolunteering
+provost
+provostal
+provostess
+provostorial
+provostry
+provostship
+prow
+prowar
+prowarden
+prowaterpower
+prowed
+prowersite
+prowess
+prowessed
+prowessful
+prowl
+prowler
+prowling
+prowlingly
+proxenet
+proxenete
+proxenetism
+proxenos
+proxenus
+proxeny
+proxically
+proximad
+proximal
+proximally
+proximate
+proximately
+proximateness
+proximation
+proximity
+proximo
+proximobuccal
+proximolabial
+proximolingual
+proxy
+proxyship
+proxysm
+prozone
+prozoning
+prozygapophysis
+prozymite
+prude
+prudelike
+prudely
+Prudence
+prudence
+prudent
+prudential
+prudentialism
+prudentialist
+prudentiality
+prudentially
+prudentialness
+prudently
+prudery
+prudish
+prudishly
+prudishness
+prudist
+prudity
+Prudy
+Prue
+pruh
+pruinate
+pruinescence
+pruinose
+pruinous
+prulaurasin
+prunable
+prunableness
+prunably
+Prunaceae
+prunase
+prunasin
+prune
+prunell
+Prunella
+prunella
+prunelle
+Prunellidae
+prunello
+pruner
+prunetin
+prunetol
+pruniferous
+pruniform
+pruning
+prunitrin
+prunt
+prunted
+Prunus
+prurience
+pruriency
+prurient
+pruriently
+pruriginous
+prurigo
+pruriousness
+pruritic
+pruritus
+prusiano
+Prussian
+Prussianism
+Prussianization
+Prussianize
+Prussianizer
+prussiate
+prussic
+Prussification
+Prussify
+prut
+prutah
+pry
+pryer
+prying
+pryingly
+pryingness
+pryler
+pryproof
+pryse
+prytaneum
+prytanis
+prytanize
+prytany
+psalis
+psalm
+psalmic
+psalmist
+psalmister
+psalmistry
+psalmless
+psalmodial
+psalmodic
+psalmodical
+psalmodist
+psalmodize
+psalmody
+psalmograph
+psalmographer
+psalmography
+psalmy
+psaloid
+psalter
+psalterial
+psalterian
+psalterion
+psalterist
+psalterium
+psaltery
+psaltes
+psaltress
+psammite
+psammitic
+psammocarcinoma
+psammocharid
+Psammocharidae
+psammogenous
+psammolithic
+psammologist
+psammology
+psammoma
+psammophile
+psammophilous
+Psammophis
+psammophyte
+psammophytic
+psammosarcoma
+psammotherapy
+psammous
+Psaronius
+pschent
+Psedera
+Pselaphidae
+Pselaphus
+psellism
+psellismus
+psephism
+psephisma
+psephite
+psephitic
+psephomancy
+Psephurus
+Psetta
+pseudaconine
+pseudaconitine
+pseudacusis
+pseudalveolar
+pseudambulacral
+pseudambulacrum
+pseudamoeboid
+pseudamphora
+pseudandry
+pseudangina
+pseudankylosis
+pseudaphia
+pseudaposematic
+pseudaposporous
+pseudapospory
+pseudapostle
+pseudarachnidan
+pseudarthrosis
+pseudataxic
+pseudatoll
+pseudaxine
+pseudaxis
+Pseudechis
+pseudelephant
+pseudelminth
+pseudelytron
+pseudembryo
+pseudembryonic
+pseudencephalic
+pseudencephalus
+pseudepigraph
+pseudepigrapha
+pseudepigraphal
+pseudepigraphic
+pseudepigraphical
+pseudepigraphous
+pseudepigraphy
+pseudepiploic
+pseudepiploon
+pseudepiscopacy
+pseudepiscopy
+pseudepisematic
+pseudesthesia
+pseudhalteres
+pseudhemal
+pseudimaginal
+pseudimago
+pseudisodomum
+pseudo
+pseudoacaccia
+pseudoacademic
+pseudoacademical
+pseudoaccidental
+pseudoacid
+pseudoaconitine
+pseudoacromegaly
+pseudoadiabatic
+pseudoaesthetic
+pseudoaffectionate
+pseudoalkaloid
+pseudoalum
+pseudoalveolar
+pseudoamateurish
+pseudoamatory
+pseudoanaphylactic
+pseudoanaphylaxis
+pseudoanatomic
+pseudoanatomical
+pseudoancestral
+pseudoanemia
+pseudoanemic
+pseudoangelic
+pseudoangina
+pseudoankylosis
+pseudoanthorine
+pseudoanthropoid
+pseudoanthropological
+pseudoanthropology
+pseudoantique
+pseudoapologetic
+pseudoapoplectic
+pseudoapoplexy
+pseudoappendicitis
+pseudoaquatic
+pseudoarchaic
+pseudoarchaism
+pseudoarchaist
+pseudoaristocratic
+pseudoarthrosis
+pseudoarticulation
+pseudoartistic
+pseudoascetic
+pseudoastringent
+pseudoasymmetrical
+pseudoasymmetry
+pseudoataxia
+pseudobacterium
+pseudobasidium
+pseudobenevolent
+pseudobenthonic
+pseudobenthos
+pseudobinary
+pseudobiological
+pseudoblepsia
+pseudoblepsis
+pseudobrachial
+pseudobrachium
+pseudobranch
+pseudobranchia
+pseudobranchial
+pseudobranchiate
+Pseudobranchus
+pseudobrookite
+pseudobrotherly
+pseudobulb
+pseudobulbar
+pseudobulbil
+pseudobulbous
+pseudobutylene
+pseudocandid
+pseudocapitulum
+pseudocarbamide
+pseudocarcinoid
+pseudocarp
+pseudocarpous
+pseudocartilaginous
+pseudocele
+pseudocelian
+pseudocelic
+pseudocellus
+pseudocentric
+pseudocentrous
+pseudocentrum
+Pseudoceratites
+pseudoceratitic
+pseudocercaria
+pseudoceryl
+pseudocharitable
+pseudochemical
+pseudochina
+pseudochromesthesia
+pseudochromia
+pseudochromosome
+pseudochronism
+pseudochronologist
+pseudochrysalis
+pseudochrysolite
+pseudochylous
+pseudocirrhosis
+pseudoclassic
+pseudoclassical
+pseudoclassicism
+pseudoclerical
+Pseudococcinae
+Pseudococcus
+pseudococtate
+pseudocollegiate
+pseudocolumella
+pseudocolumellar
+pseudocommissure
+pseudocommisural
+pseudocompetitive
+pseudoconcha
+pseudoconclude
+pseudocone
+pseudoconglomerate
+pseudoconglomeration
+pseudoconhydrine
+pseudoconjugation
+pseudoconservative
+pseudocorneous
+pseudocortex
+pseudocosta
+pseudocotyledon
+pseudocotyledonal
+pseudocritical
+pseudocroup
+pseudocrystalline
+pseudocubic
+pseudocultivated
+pseudocultural
+pseudocumene
+pseudocumenyl
+pseudocumidine
+pseudocumyl
+pseudocyclosis
+pseudocyesis
+pseudocyst
+pseudodeltidium
+pseudodementia
+pseudodemocratic
+pseudoderm
+pseudodermic
+pseudodiagnosis
+pseudodiastolic
+pseudodiphtheria
+pseudodiphtheritic
+pseudodipteral
+pseudodipterally
+pseudodipteros
+pseudodont
+pseudodox
+pseudodoxal
+pseudodoxy
+pseudodramatic
+pseudodysentery
+pseudoedema
+pseudoelectoral
+pseudoembryo
+pseudoembryonic
+pseudoemotional
+pseudoencephalitic
+pseudoenthusiastic
+pseudoephedrine
+pseudoepiscopal
+pseudoequalitarian
+pseudoerotic
+pseudoeroticism
+pseudoerysipelas
+pseudoerysipelatous
+pseudoerythrin
+pseudoethical
+pseudoetymological
+pseudoeugenics
+pseudoevangelical
+pseudofamous
+pseudofarcy
+pseudofeminine
+pseudofever
+pseudofeverish
+pseudofilaria
+pseudofilarian
+pseudofinal
+pseudofluctuation
+pseudofluorescence
+pseudofoliaceous
+pseudoform
+pseudofossil
+pseudogalena
+pseudoganglion
+pseudogaseous
+pseudogaster
+pseudogastrula
+pseudogeneral
+pseudogeneric
+pseudogenerous
+pseudogenteel
+pseudogenus
+pseudogeometry
+pseudogermanic
+pseudogeusia
+pseudogeustia
+pseudoglanders
+pseudoglioma
+pseudoglobulin
+pseudoglottis
+pseudograph
+pseudographeme
+pseudographer
+pseudographia
+pseudographize
+pseudography
+pseudograsserie
+Pseudogryphus
+pseudogyne
+pseudogynous
+pseudogyny
+pseudogyrate
+pseudohallucination
+pseudohallucinatory
+pseudohalogen
+pseudohemal
+pseudohermaphrodite
+pseudohermaphroditic
+pseudohermaphroditism
+pseudoheroic
+pseudohexagonal
+pseudohistoric
+pseudohistorical
+pseudoholoptic
+pseudohuman
+pseudohydrophobia
+pseudohyoscyamine
+pseudohypertrophic
+pseudohypertrophy
+pseudoidentical
+pseudoimpartial
+pseudoindependent
+pseudoinfluenza
+pseudoinsane
+pseudoinsoluble
+pseudoisatin
+pseudoism
+pseudoisomer
+pseudoisomeric
+pseudoisomerism
+pseudoisotropy
+pseudojervine
+pseudolabial
+pseudolabium
+pseudolalia
+Pseudolamellibranchia
+Pseudolamellibranchiata
+pseudolamellibranchiate
+pseudolaminated
+Pseudolarix
+pseudolateral
+pseudolatry
+pseudolegal
+pseudolegendary
+pseudoleucite
+pseudoleucocyte
+pseudoleukemia
+pseudoleukemic
+pseudoliberal
+pseudolichen
+pseudolinguistic
+pseudoliterary
+pseudolobar
+pseudological
+pseudologically
+pseudologist
+pseudologue
+pseudology
+pseudolunule
+pseudomalachite
+pseudomalaria
+pseudomancy
+pseudomania
+pseudomaniac
+pseudomantic
+pseudomantist
+pseudomasculine
+pseudomedical
+pseudomedieval
+pseudomelanosis
+pseudomembrane
+pseudomembranous
+pseudomeningitis
+pseudomenstruation
+pseudomer
+pseudomeric
+pseudomerism
+pseudomery
+pseudometallic
+pseudometameric
+pseudometamerism
+pseudomica
+pseudomilitarist
+pseudomilitaristic
+pseudomilitary
+pseudoministerial
+pseudomiraculous
+pseudomitotic
+pseudomnesia
+pseudomodern
+pseudomodest
+Pseudomonas
+pseudomonastic
+pseudomonoclinic
+pseudomonocotyledonous
+pseudomonocyclic
+pseudomonotropy
+pseudomoral
+pseudomorph
+pseudomorphia
+pseudomorphic
+pseudomorphine
+pseudomorphism
+pseudomorphose
+pseudomorphosis
+pseudomorphous
+pseudomorula
+pseudomorular
+pseudomucin
+pseudomucoid
+pseudomultilocular
+pseudomultiseptate
+pseudomythical
+pseudonarcotic
+pseudonational
+pseudonavicella
+pseudonavicellar
+pseudonavicula
+pseudonavicular
+pseudoneuropter
+Pseudoneuroptera
+pseudoneuropteran
+pseudoneuropterous
+pseudonitrole
+pseudonitrosite
+pseudonuclein
+pseudonucleolus
+pseudonychium
+pseudonym
+pseudonymal
+pseudonymic
+pseudonymity
+pseudonymous
+pseudonymously
+pseudonymousness
+pseudonymuncle
+pseudonymuncule
+pseudopapaverine
+pseudoparalysis
+pseudoparalytic
+pseudoparaplegia
+pseudoparasitic
+pseudoparasitism
+pseudoparenchyma
+pseudoparenchymatous
+pseudoparenchyme
+pseudoparesis
+pseudoparthenogenesis
+pseudopatriotic
+pseudopediform
+pseudopelletierine
+pseudopercular
+pseudoperculate
+pseudoperculum
+pseudoperianth
+pseudoperidium
+pseudoperiodic
+pseudoperipteral
+pseudopermanent
+pseudoperoxide
+pseudoperspective
+Pseudopeziza
+pseudophallic
+pseudophellandrene
+pseudophenanthrene
+pseudophenanthroline
+pseudophenocryst
+pseudophilanthropic
+pseudophilosophical
+Pseudophoenix
+pseudopionnotes
+pseudopious
+pseudoplasm
+pseudoplasma
+pseudoplasmodium
+pseudopneumonia
+pseudopod
+pseudopodal
+pseudopodia
+pseudopodial
+pseudopodian
+pseudopodiospore
+pseudopodium
+pseudopoetic
+pseudopoetical
+pseudopolitic
+pseudopolitical
+pseudopopular
+pseudopore
+pseudoporphyritic
+pseudopregnancy
+pseudopregnant
+pseudopriestly
+pseudoprimitive
+pseudoprimitivism
+pseudoprincely
+pseudoproboscis
+pseudoprofessional
+pseudoprofessorial
+pseudoprophetic
+pseudoprophetical
+pseudoprosperous
+pseudopsia
+pseudopsychological
+pseudoptics
+pseudoptosis
+pseudopupa
+pseudopupal
+pseudopurpurin
+pseudopyriform
+pseudoquinol
+pseudorabies
+pseudoracemic
+pseudoracemism
+pseudoramose
+pseudoramulus
+pseudorealistic
+pseudoreduction
+pseudoreformed
+pseudoregal
+pseudoreligious
+pseudoreminiscence
+pseudorganic
+pseudorheumatic
+pseudorhombohedral
+pseudoromantic
+pseudorunic
+pseudosacred
+pseudosacrilegious
+pseudosalt
+pseudosatirical
+pseudoscarlatina
+Pseudoscarus
+pseudoscholarly
+pseudoscholastic
+pseudoscientific
+Pseudoscines
+pseudoscinine
+pseudosclerosis
+pseudoscope
+pseudoscopic
+pseudoscopically
+pseudoscopy
+pseudoscorpion
+Pseudoscorpiones
+Pseudoscorpionida
+pseudoscutum
+pseudosematic
+pseudosensational
+pseudoseptate
+pseudoservile
+pseudosessile
+pseudosiphonal
+pseudosiphuncal
+pseudoskeletal
+pseudoskeleton
+pseudoskink
+pseudosmia
+pseudosocial
+pseudosocialistic
+pseudosolution
+pseudosoph
+pseudosopher
+pseudosophical
+pseudosophist
+pseudosophy
+pseudospectral
+pseudosperm
+pseudospermic
+pseudospermium
+pseudospermous
+pseudosphere
+pseudospherical
+pseudospiracle
+pseudospiritual
+pseudosporangium
+pseudospore
+pseudosquamate
+pseudostalactite
+pseudostalactitical
+pseudostalagmite
+pseudostalagmitical
+pseudostereoscope
+pseudostereoscopic
+pseudostereoscopism
+pseudostigma
+pseudostigmatic
+pseudostoma
+pseudostomatous
+pseudostomous
+pseudostratum
+pseudosubtle
+Pseudosuchia
+pseudosuchian
+pseudosweating
+pseudosyllogism
+pseudosymmetric
+pseudosymmetrical
+pseudosymmetry
+pseudosymptomatic
+pseudosyphilis
+pseudosyphilitic
+pseudotabes
+pseudotachylite
+pseudotetanus
+pseudotetragonal
+Pseudotetramera
+pseudotetrameral
+pseudotetramerous
+pseudotrachea
+pseudotracheal
+pseudotribal
+pseudotributary
+Pseudotrimera
+pseudotrimeral
+pseudotrimerous
+pseudotropine
+Pseudotsuga
+pseudotubercular
+pseudotuberculosis
+pseudotuberculous
+pseudoturbinal
+pseudotyphoid
+pseudoval
+pseudovarian
+pseudovary
+pseudovelar
+pseudovelum
+pseudoventricle
+pseudoviaduct
+pseudoviperine
+pseudoviscosity
+pseudoviscous
+pseudovolcanic
+pseudovolcano
+pseudovum
+pseudowhorl
+pseudoxanthine
+pseudoyohimbine
+pseudozealot
+pseudozoea
+pseudozoogloeal
+psha
+Pshav
+pshaw
+psi
+Psidium
+psilanthropic
+psilanthropism
+psilanthropist
+psilanthropy
+psiloceran
+Psiloceras
+psiloceratan
+psiloceratid
+Psiloceratidae
+psiloi
+psilology
+psilomelane
+psilomelanic
+Psilophytales
+psilophyte
+Psilophyton
+psilosis
+psilosopher
+psilosophy
+Psilotaceae
+psilotaceous
+psilothrum
+psilotic
+Psilotum
+psithurism
+Psithyrus
+psittaceous
+psittaceously
+Psittaci
+Psittacidae
+Psittaciformes
+Psittacinae
+psittacine
+psittacinite
+psittacism
+psittacistic
+Psittacomorphae
+psittacomorphic
+psittacosis
+Psittacus
+psoadic
+psoas
+psoatic
+psocid
+Psocidae
+psocine
+psoitis
+psomophagic
+psomophagist
+psomophagy
+psora
+Psoralea
+psoriasic
+psoriasiform
+psoriasis
+psoriatic
+psoriatiform
+psoric
+psoroid
+Psorophora
+psorophthalmia
+psorophthalmic
+Psoroptes
+psoroptic
+psorosis
+psorosperm
+psorospermial
+psorospermiasis
+psorospermic
+psorospermiform
+psorospermosis
+psorous
+pssimistical
+pst
+psych
+psychagogic
+psychagogos
+psychagogue
+psychagogy
+psychal
+psychalgia
+psychanalysis
+psychanalysist
+psychanalytic
+psychasthenia
+psychasthenic
+Psyche
+psyche
+Psychean
+psycheometry
+psychesthesia
+psychesthetic
+psychiasis
+psychiater
+psychiatria
+psychiatric
+psychiatrical
+psychiatrically
+psychiatrist
+psychiatrize
+psychiatry
+psychic
+psychical
+psychically
+Psychichthys
+psychicism
+psychicist
+psychics
+psychid
+Psychidae
+psychism
+psychist
+psychoanalysis
+psychoanalyst
+psychoanalytic
+psychoanalytical
+psychoanalytically
+psychoanalyze
+psychoanalyzer
+psychoautomatic
+psychobiochemistry
+psychobiologic
+psychobiological
+psychobiology
+psychobiotic
+psychocatharsis
+psychoclinic
+psychoclinical
+psychoclinicist
+Psychoda
+psychodiagnostics
+Psychodidae
+psychodispositional
+psychodrama
+psychodynamic
+psychodynamics
+psychoeducational
+psychoepilepsy
+psychoethical
+psychofugal
+psychogalvanic
+psychogalvanometer
+psychogenesis
+psychogenetic
+psychogenetical
+psychogenetically
+psychogenetics
+psychogenic
+psychogeny
+psychognosis
+psychognostic
+psychognosy
+psychogonic
+psychogonical
+psychogony
+psychogram
+psychograph
+psychographer
+psychographic
+psychographist
+psychography
+psychoid
+psychokinesia
+psychokinesis
+psychokinetic
+psychokyme
+psycholepsy
+psycholeptic
+psychologer
+psychologian
+psychologic
+psychological
+psychologically
+psychologics
+psychologism
+psychologist
+psychologize
+psychologue
+psychology
+psychomachy
+psychomancy
+psychomantic
+psychometer
+psychometric
+psychometrical
+psychometrically
+psychometrician
+psychometrics
+psychometrist
+psychometrize
+psychometry
+psychomonism
+psychomoral
+psychomorphic
+psychomorphism
+psychomotility
+psychomotor
+psychon
+psychoneural
+psychoneurological
+psychoneurosis
+psychoneurotic
+psychonomic
+psychonomics
+psychonomy
+psychony
+psychoorganic
+psychopannychian
+psychopannychism
+psychopannychist
+psychopannychistic
+psychopannychy
+psychopanychite
+psychopath
+psychopathia
+psychopathic
+psychopathist
+psychopathologic
+psychopathological
+psychopathologist
+psychopathy
+psychopetal
+psychophobia
+psychophysic
+psychophysical
+psychophysically
+psychophysicist
+psychophysics
+psychophysiologic
+psychophysiological
+psychophysiologically
+psychophysiologist
+psychophysiology
+psychoplasm
+psychopomp
+psychopompos
+psychorealism
+psychorealist
+psychorealistic
+psychoreflex
+psychorhythm
+psychorhythmia
+psychorhythmic
+psychorhythmical
+psychorhythmically
+psychorrhagic
+psychorrhagy
+psychosarcous
+psychosensorial
+psychosensory
+psychoses
+psychosexual
+psychosexuality
+psychosexually
+psychosis
+psychosocial
+psychosomatic
+psychosomatics
+psychosome
+psychosophy
+psychostasy
+psychostatic
+psychostatical
+psychostatically
+psychostatics
+psychosurgeon
+psychosurgery
+psychosynthesis
+psychosynthetic
+psychotaxis
+psychotechnical
+psychotechnician
+psychotechnics
+psychotechnological
+psychotechnology
+psychotheism
+psychotherapeutic
+psychotherapeutical
+psychotherapeutics
+psychotherapeutist
+psychotherapist
+psychotherapy
+psychotic
+Psychotria
+psychotrine
+psychovital
+Psychozoic
+psychroesthesia
+psychrograph
+psychrometer
+psychrometric
+psychrometrical
+psychrometry
+psychrophile
+psychrophilic
+psychrophobia
+psychrophore
+psychrophyte
+psychurgy
+psykter
+Psylla
+psylla
+psyllid
+Psyllidae
+psyllium
+ptarmic
+Ptarmica
+ptarmical
+ptarmigan
+Ptelea
+Ptenoglossa
+ptenoglossate
+Pteranodon
+pteranodont
+Pteranodontidae
+pteraspid
+Pteraspidae
+Pteraspis
+ptereal
+pterergate
+Pterian
+pteric
+Pterichthyodes
+Pterichthys
+pterideous
+pteridium
+pteridography
+pteridoid
+pteridological
+pteridologist
+pteridology
+pteridophilism
+pteridophilist
+pteridophilistic
+Pteridophyta
+pteridophyte
+pteridophytic
+pteridophytous
+pteridosperm
+Pteridospermae
+Pteridospermaphyta
+pteridospermaphytic
+pteridospermous
+pterion
+Pteris
+Pterobranchia
+pterobranchiate
+pterocarpous
+Pterocarpus
+Pterocarya
+Pterocaulon
+Pterocera
+Pteroceras
+Pterocles
+Pterocletes
+Pteroclidae
+Pteroclomorphae
+pteroclomorphic
+pterodactyl
+Pterodactyli
+pterodactylian
+pterodactylic
+pterodactylid
+Pterodactylidae
+pterodactyloid
+pterodactylous
+Pterodactylus
+pterographer
+pterographic
+pterographical
+pterography
+pteroid
+pteroma
+pteromalid
+Pteromalidae
+Pteromys
+pteropaedes
+pteropaedic
+pteropegal
+pteropegous
+pteropegum
+pterophorid
+Pterophoridae
+Pterophorus
+Pterophryne
+pteropid
+Pteropidae
+pteropine
+pteropod
+Pteropoda
+pteropodal
+pteropodan
+pteropodial
+Pteropodidae
+pteropodium
+pteropodous
+Pteropsida
+Pteropus
+pterosaur
+Pterosauri
+Pterosauria
+pterosaurian
+pterospermous
+Pterospora
+Pterostemon
+Pterostemonaceae
+pterostigma
+pterostigmal
+pterostigmatic
+pterostigmatical
+pterotheca
+pterothorax
+pterotic
+pteroylglutamic
+pterygial
+pterygiophore
+pterygium
+pterygobranchiate
+pterygode
+pterygodum
+Pterygogenea
+pterygoid
+pterygoidal
+pterygoidean
+pterygomalar
+pterygomandibular
+pterygomaxillary
+pterygopalatal
+pterygopalatine
+pterygopharyngeal
+pterygopharyngean
+pterygophore
+pterygopodium
+pterygoquadrate
+pterygosphenoid
+pterygospinous
+pterygostaphyline
+Pterygota
+pterygote
+pterygotous
+pterygotrabecular
+Pterygotus
+pteryla
+pterylographic
+pterylographical
+pterylography
+pterylological
+pterylology
+pterylosis
+Ptilichthyidae
+Ptiliidae
+Ptilimnium
+ptilinal
+ptilinum
+Ptilocercus
+Ptilonorhynchidae
+Ptilonorhynchinae
+ptilopaedes
+ptilopaedic
+ptilosis
+Ptilota
+ptinid
+Ptinidae
+ptinoid
+Ptinus
+ptisan
+ptochocracy
+ptochogony
+ptochology
+Ptolemaean
+Ptolemaian
+Ptolemaic
+Ptolemaical
+Ptolemaism
+Ptolemaist
+Ptolemean
+Ptolemy
+ptomain
+ptomaine
+ptomainic
+ptomatropine
+ptosis
+ptotic
+ptyalagogic
+ptyalagogue
+ptyalectasis
+ptyalin
+ptyalism
+ptyalize
+ptyalocele
+ptyalogenic
+ptyalolith
+ptyalolithiasis
+ptyalorrhea
+Ptychoparia
+ptychoparid
+ptychopariid
+ptychopterygial
+ptychopterygium
+Ptychosperma
+ptysmagogue
+ptyxis
+pu
+pua
+puan
+pub
+pubal
+pubble
+puberal
+pubertal
+pubertic
+puberty
+puberulent
+puberulous
+pubes
+pubescence
+pubescency
+pubescent
+pubian
+pubic
+pubigerous
+pubiotomy
+pubis
+public
+Publican
+publican
+publicanism
+publication
+publichearted
+publicheartedness
+publicism
+publicist
+publicity
+publicize
+publicly
+publicness
+Publilian
+publish
+publishable
+publisher
+publisheress
+publishership
+publishment
+pubococcygeal
+pubofemoral
+puboiliac
+puboischiac
+puboischial
+puboischiatic
+puboprostatic
+puborectalis
+pubotibial
+pubourethral
+pubovesical
+Puccinia
+Pucciniaceae
+pucciniaceous
+puccinoid
+puccoon
+puce
+pucelage
+pucellas
+pucelle
+Puchanahua
+pucherite
+puchero
+puck
+pucka
+puckball
+pucker
+puckerbush
+puckerel
+puckerer
+puckermouth
+puckery
+puckfist
+puckish
+puckishly
+puckishness
+puckle
+pucklike
+puckling
+puckneedle
+puckrel
+puckster
+pud
+puddee
+puddening
+pudder
+pudding
+puddingberry
+puddinghead
+puddingheaded
+puddinghouse
+puddinglike
+puddingwife
+puddingy
+puddle
+puddled
+puddlelike
+puddler
+puddling
+puddly
+puddock
+puddy
+pudency
+pudenda
+pudendal
+pudendous
+pudendum
+pudent
+pudge
+pudgily
+pudginess
+pudgy
+pudiano
+pudibund
+pudibundity
+pudic
+pudical
+pudicitia
+pudicity
+pudsey
+pudsy
+Pudu
+pudu
+pueblito
+Pueblo
+pueblo
+Puebloan
+puebloization
+puebloize
+Puelche
+Puelchean
+Pueraria
+puerer
+puericulture
+puerile
+puerilely
+puerileness
+puerilism
+puerility
+puerman
+puerpera
+puerperal
+puerperalism
+puerperant
+puerperium
+puerperous
+puerpery
+puff
+puffback
+puffball
+puffbird
+puffed
+puffer
+puffery
+puffily
+puffin
+puffiness
+puffinet
+puffing
+puffingly
+Puffinus
+pufflet
+puffwig
+puffy
+pug
+pugged
+pugger
+puggi
+pugginess
+pugging
+puggish
+puggle
+puggree
+puggy
+pugh
+pugil
+pugilant
+pugilism
+pugilist
+pugilistic
+pugilistical
+pugilistically
+puglianite
+pugman
+pugmill
+pugmiller
+pugnacious
+pugnaciously
+pugnaciousness
+pugnacity
+Puinavi
+Puinavian
+Puinavis
+puisne
+puissance
+puissant
+puissantly
+puissantness
+puist
+puistie
+puja
+Pujunan
+puka
+pukatea
+pukateine
+puke
+pukeko
+puker
+pukeweed
+Pukhtun
+pukish
+pukishness
+pukras
+puku
+puky
+pul
+pulahan
+pulahanism
+pulasan
+pulaskite
+Pulaya
+Pulayan
+pulchrify
+pulchritude
+pulchritudinous
+pule
+pulegol
+pulegone
+puler
+Pulex
+pulghere
+puli
+Pulian
+pulicarious
+pulicat
+pulicene
+pulicid
+Pulicidae
+pulicidal
+pulicide
+pulicine
+pulicoid
+pulicose
+pulicosity
+pulicous
+puling
+pulingly
+pulish
+pulk
+pulka
+pull
+pullable
+pullback
+pullboat
+pulldevil
+pulldoo
+pulldown
+pulldrive
+pullen
+puller
+pullery
+pullet
+pulley
+pulleyless
+pulli
+Pullman
+Pullmanize
+pullorum
+pullulant
+pullulate
+pullulation
+pullus
+pulmobranchia
+pulmobranchial
+pulmobranchiate
+pulmocardiac
+pulmocutaneous
+pulmogastric
+pulmometer
+pulmometry
+pulmonal
+pulmonar
+Pulmonaria
+pulmonarian
+pulmonary
+Pulmonata
+pulmonate
+pulmonated
+pulmonectomy
+pulmonic
+pulmonifer
+Pulmonifera
+pulmoniferous
+pulmonitis
+Pulmotor
+pulmotracheal
+Pulmotrachearia
+pulmotracheary
+pulmotracheate
+pulp
+pulpaceous
+pulpal
+pulpalgia
+pulpamenta
+pulpboard
+pulpectomy
+pulpefaction
+pulper
+pulpifier
+pulpify
+pulpily
+pulpiness
+pulpit
+pulpital
+pulpitarian
+pulpiteer
+pulpiter
+pulpitful
+pulpitic
+pulpitical
+pulpitically
+pulpitis
+pulpitish
+pulpitism
+pulpitize
+pulpitless
+pulpitly
+pulpitolatry
+pulpitry
+pulpless
+pulplike
+pulpotomy
+pulpous
+pulpousness
+pulpstone
+pulpwood
+pulpy
+pulque
+pulsant
+pulsatance
+pulsate
+pulsatile
+pulsatility
+Pulsatilla
+pulsation
+pulsational
+pulsative
+pulsatively
+pulsator
+pulsatory
+pulse
+pulseless
+pulselessly
+pulselessness
+pulselike
+pulsellum
+pulsidge
+pulsific
+pulsimeter
+pulsion
+pulsive
+pulsojet
+pulsometer
+pultaceous
+pulton
+pulu
+pulveraceous
+pulverant
+pulverate
+pulveration
+pulvereous
+pulverin
+pulverizable
+pulverizate
+pulverization
+pulverizator
+pulverize
+pulverizer
+pulverous
+pulverulence
+pulverulent
+pulverulently
+pulvic
+pulvil
+pulvillar
+pulvilliform
+pulvillus
+pulvinar
+Pulvinaria
+pulvinarian
+pulvinate
+pulvinated
+pulvinately
+pulvination
+pulvinic
+pulviniform
+pulvino
+pulvinule
+pulvinulus
+pulvinus
+pulviplume
+pulwar
+puly
+puma
+Pume
+pumicate
+pumice
+pumiced
+pumiceous
+pumicer
+pumiciform
+pumicose
+pummel
+pummice
+pump
+pumpable
+pumpage
+pumpellyite
+pumper
+pumpernickel
+pumpkin
+pumpkinification
+pumpkinify
+pumpkinish
+pumpkinity
+pumple
+pumpless
+pumplike
+pumpman
+pumpsman
+pumpwright
+pun
+puna
+punaise
+punalua
+punaluan
+Punan
+punatoo
+punch
+punchable
+punchboard
+puncheon
+puncher
+punchinello
+punching
+punchless
+punchlike
+punchproof
+punchy
+punct
+punctal
+punctate
+punctated
+punctation
+punctator
+puncticular
+puncticulate
+puncticulose
+punctiform
+punctiliar
+punctilio
+punctiliomonger
+punctiliosity
+punctilious
+punctiliously
+punctiliousness
+punctist
+punctographic
+punctual
+punctualist
+punctuality
+punctually
+punctualness
+punctuate
+punctuation
+punctuational
+punctuationist
+punctuative
+punctuator
+punctuist
+punctulate
+punctulated
+punctulation
+punctule
+punctulum
+punctum
+puncturation
+puncture
+punctured
+punctureless
+punctureproof
+puncturer
+pundigrion
+pundit
+pundita
+punditic
+punditically
+punditry
+pundonor
+pundum
+puneca
+pung
+punga
+pungapung
+pungar
+pungence
+pungency
+pungent
+pungently
+punger
+pungey
+pungi
+pungle
+pungled
+Punic
+Punica
+Punicaceae
+punicaceous
+puniceous
+punicial
+punicin
+punicine
+punily
+puniness
+punish
+punishability
+punishable
+punishableness
+punishably
+punisher
+punishment
+punishmentproof
+punition
+punitional
+punitionally
+punitive
+punitively
+punitiveness
+punitory
+Punjabi
+punjum
+punk
+punkah
+punketto
+punkie
+punkwood
+punky
+punless
+punlet
+punnable
+punnage
+punner
+punnet
+punnic
+punnical
+punnigram
+punningly
+punnology
+Puno
+punproof
+punster
+punstress
+punt
+punta
+puntabout
+puntal
+puntel
+punter
+punti
+puntil
+puntist
+Puntlatsh
+punto
+puntout
+puntsman
+punty
+puny
+punyish
+punyism
+pup
+pupa
+pupahood
+pupal
+puparial
+puparium
+pupate
+pupation
+pupelo
+Pupidae
+pupiferous
+pupiform
+pupigenous
+pupigerous
+pupil
+pupilability
+pupilage
+pupilar
+pupilate
+pupildom
+pupiled
+pupilize
+pupillarity
+pupillary
+pupilless
+Pupillidae
+pupillometer
+pupillometry
+pupilloscope
+pupilloscoptic
+pupilloscopy
+Pupipara
+pupiparous
+Pupivora
+pupivore
+pupivorous
+pupoid
+puppet
+puppetdom
+puppeteer
+puppethood
+puppetish
+puppetism
+puppetize
+puppetlike
+puppetly
+puppetman
+puppetmaster
+puppetry
+puppify
+puppily
+Puppis
+puppy
+puppydom
+puppyfish
+puppyfoot
+puppyhood
+puppyish
+puppyism
+puppylike
+puppysnatch
+pupulo
+Pupuluca
+pupunha
+Puquina
+Puquinan
+pur
+purana
+puranic
+puraque
+Purasati
+Purbeck
+Purbeckian
+purblind
+purblindly
+purblindness
+purchasability
+purchasable
+purchase
+purchaser
+purchasery
+purdah
+purdy
+pure
+pureblood
+purebred
+pured
+puree
+purehearted
+purely
+pureness
+purer
+purfle
+purfled
+purfler
+purfling
+purfly
+purga
+purgation
+purgative
+purgatively
+purgatorial
+purgatorian
+purgatory
+purge
+purgeable
+purger
+purgery
+purging
+purificant
+purification
+purificative
+purificator
+purificatory
+purifier
+puriform
+purify
+purine
+puriri
+purism
+purist
+puristic
+puristical
+Puritan
+puritandom
+Puritaness
+puritanic
+puritanical
+puritanically
+puritanicalness
+Puritanism
+puritanism
+Puritanize
+Puritanizer
+puritanlike
+Puritanly
+puritano
+purity
+Purkinje
+Purkinjean
+purl
+purler
+purlhouse
+purlicue
+purlieu
+purlieuman
+purlin
+purlman
+purloin
+purloiner
+purohepatitis
+purolymph
+puromucous
+purpart
+purparty
+purple
+purplelip
+purplely
+purpleness
+purplescent
+purplewood
+purplewort
+purplish
+purplishness
+purply
+purport
+purportless
+purpose
+purposedly
+purposeful
+purposefully
+purposefulness
+purposeless
+purposelessly
+purposelessness
+purposelike
+purposely
+purposer
+purposive
+purposively
+purposiveness
+purposivism
+purposivist
+purposivistic
+purpresture
+purpura
+purpuraceous
+purpurate
+purpure
+purpureal
+purpurean
+purpureous
+purpurescent
+purpuric
+purpuriferous
+purpuriform
+purpurigenous
+purpurin
+purpurine
+purpuriparous
+purpurite
+purpurize
+purpurogallin
+purpurogenous
+purpuroid
+purpuroxanthin
+purr
+purre
+purree
+purreic
+purrel
+purrer
+purring
+purringly
+purrone
+purry
+purse
+pursed
+purseful
+purseless
+purselike
+purser
+pursership
+Purshia
+pursily
+pursiness
+purslane
+purslet
+pursley
+pursuable
+pursual
+pursuance
+pursuant
+pursuantly
+pursue
+pursuer
+pursuit
+pursuitmeter
+pursuivant
+pursy
+purtenance
+Puru
+Puruha
+purulence
+purulency
+purulent
+purulently
+puruloid
+Purupuru
+purusha
+purushartha
+purvey
+purveyable
+purveyal
+purveyance
+purveyancer
+purveyor
+purveyoress
+purview
+purvoe
+purwannah
+pus
+Puschkinia
+Puseyism
+Puseyistical
+Puseyite
+push
+pushball
+pushcart
+pusher
+pushful
+pushfully
+pushfulness
+pushing
+pushingly
+pushingness
+pushmobile
+pushover
+pushpin
+Pushtu
+pushwainling
+pusillanimity
+pusillanimous
+pusillanimously
+pusillanimousness
+puss
+pusscat
+pussley
+pusslike
+pussy
+pussycat
+pussyfoot
+pussyfooted
+pussyfooter
+pussyfooting
+pussyfootism
+pussytoe
+pustulant
+pustular
+pustulate
+pustulated
+pustulation
+pustulatous
+pustule
+pustuled
+pustulelike
+pustuliform
+pustulose
+pustulous
+put
+putage
+putamen
+putaminous
+putanism
+putation
+putationary
+putative
+putatively
+putback
+putchen
+putcher
+puteal
+putelee
+puther
+puthery
+putid
+putidly
+putidness
+putlog
+putois
+Putorius
+putredinal
+putredinous
+putrefacient
+putrefactible
+putrefaction
+putrefactive
+putrefactiveness
+putrefiable
+putrefier
+putrefy
+putresce
+putrescence
+putrescency
+putrescent
+putrescibility
+putrescible
+putrescine
+putricide
+putrid
+putridity
+putridly
+putridness
+putrifacted
+putriform
+putrilage
+putrilaginous
+putrilaginously
+putschism
+putschist
+putt
+puttee
+putter
+putterer
+putteringly
+puttier
+puttock
+putty
+puttyblower
+puttyhead
+puttyhearted
+puttylike
+puttyroot
+puttywork
+puture
+puxy
+Puya
+Puyallup
+puzzle
+puzzleation
+puzzled
+puzzledly
+puzzledness
+puzzledom
+puzzlehead
+puzzleheaded
+puzzleheadedly
+puzzleheadedness
+puzzleman
+puzzlement
+puzzlepate
+puzzlepated
+puzzlepatedness
+puzzler
+puzzling
+puzzlingly
+puzzlingness
+pya
+pyal
+pyarthrosis
+pyche
+Pycnanthemum
+pycnia
+pycnial
+pycnid
+pycnidia
+pycnidial
+pycnidiophore
+pycnidiospore
+pycnidium
+pycniospore
+pycnite
+pycnium
+Pycnocoma
+pycnoconidium
+pycnodont
+Pycnodonti
+Pycnodontidae
+pycnodontoid
+Pycnodus
+pycnogonid
+Pycnogonida
+pycnogonidium
+pycnogonoid
+pycnometer
+pycnometochia
+pycnometochic
+pycnomorphic
+pycnomorphous
+Pycnonotidae
+Pycnonotinae
+pycnonotine
+Pycnonotus
+pycnosis
+pycnospore
+pycnosporic
+pycnostyle
+pycnotic
+pyelectasis
+pyelic
+pyelitic
+pyelitis
+pyelocystitis
+pyelogram
+pyelograph
+pyelographic
+pyelography
+pyelolithotomy
+pyelometry
+pyelonephritic
+pyelonephritis
+pyelonephrosis
+pyeloplasty
+pyeloscopy
+pyelotomy
+pyeloureterogram
+pyemesis
+pyemia
+pyemic
+pygal
+pygalgia
+pygarg
+pygargus
+pygidial
+pygidid
+Pygididae
+Pygidium
+pygidium
+pygmaean
+Pygmalion
+pygmoid
+Pygmy
+pygmy
+pygmydom
+pygmyhood
+pygmyish
+pygmyism
+pygmyship
+pygmyweed
+Pygobranchia
+Pygobranchiata
+pygobranchiate
+pygofer
+pygopagus
+pygopod
+Pygopodes
+Pygopodidae
+pygopodine
+pygopodous
+Pygopus
+pygostyle
+pygostyled
+pygostylous
+pyic
+pyin
+pyjama
+pyjamaed
+pyke
+pyknatom
+pyknic
+pyknotic
+pyla
+Pylades
+pylagore
+pylangial
+pylangium
+pylar
+pylephlebitic
+pylephlebitis
+pylethrombophlebitis
+pylethrombosis
+pylic
+pylon
+pyloralgia
+pylorectomy
+pyloric
+pyloristenosis
+pyloritis
+pylorocleisis
+pylorodilator
+pylorogastrectomy
+pyloroplasty
+pyloroptosis
+pyloroschesis
+pyloroscirrhus
+pyloroscopy
+pylorospasm
+pylorostenosis
+pylorostomy
+pylorus
+pyobacillosis
+pyocele
+pyoctanin
+pyocyanase
+pyocyanin
+pyocyst
+pyocyte
+pyodermatitis
+pyodermatosis
+pyodermia
+pyodermic
+pyogenesis
+pyogenetic
+pyogenic
+pyogenin
+pyogenous
+pyohemothorax
+pyoid
+pyolabyrinthitis
+pyolymph
+pyometra
+pyometritis
+pyonephritis
+pyonephrosis
+pyonephrotic
+pyopericarditis
+pyopericardium
+pyoperitoneum
+pyoperitonitis
+pyophagia
+pyophthalmia
+pyophylactic
+pyoplania
+pyopneumocholecystitis
+pyopneumocyst
+pyopneumopericardium
+pyopneumoperitoneum
+pyopneumoperitonitis
+pyopneumothorax
+pyopoiesis
+pyopoietic
+pyoptysis
+pyorrhea
+pyorrheal
+pyorrheic
+pyosalpingitis
+pyosalpinx
+pyosepticemia
+pyosepticemic
+pyosis
+pyospermia
+pyotherapy
+pyothorax
+pyotoxinemia
+pyoureter
+pyovesiculosis
+pyoxanthose
+pyr
+pyracanth
+Pyracantha
+Pyraceae
+pyracene
+pyral
+Pyrales
+pyralid
+Pyralidae
+pyralidan
+pyralidid
+Pyralididae
+pyralidiform
+Pyralidoidea
+pyralis
+pyraloid
+Pyrameis
+pyramid
+pyramidaire
+pyramidal
+pyramidale
+pyramidalis
+Pyramidalism
+Pyramidalist
+pyramidally
+pyramidate
+Pyramidella
+pyramidellid
+Pyramidellidae
+pyramider
+pyramides
+pyramidia
+pyramidic
+pyramidical
+pyramidically
+pyramidicalness
+pyramidion
+Pyramidist
+pyramidize
+pyramidlike
+pyramidoattenuate
+pyramidoidal
+pyramidologist
+pyramidoprismatic
+pyramidwise
+pyramoidal
+pyran
+pyranometer
+pyranyl
+pyrargyrite
+Pyrausta
+Pyraustinae
+pyrazine
+pyrazole
+pyrazoline
+pyrazolone
+pyrazolyl
+pyre
+pyrectic
+pyrena
+pyrene
+Pyrenean
+pyrenematous
+pyrenic
+pyrenin
+pyrenocarp
+pyrenocarpic
+pyrenocarpous
+Pyrenochaeta
+pyrenodean
+pyrenodeine
+pyrenodeous
+pyrenoid
+pyrenolichen
+Pyrenomycetales
+pyrenomycete
+Pyrenomycetes
+Pyrenomycetineae
+pyrenomycetous
+Pyrenopeziza
+pyrethrin
+Pyrethrum
+pyrethrum
+pyretic
+pyreticosis
+pyretogenesis
+pyretogenetic
+pyretogenic
+pyretogenous
+pyretography
+pyretology
+pyretolysis
+pyretotherapy
+pyrewinkes
+Pyrex
+pyrex
+pyrexia
+pyrexial
+pyrexic
+pyrexical
+pyrgeometer
+pyrgocephalic
+pyrgocephaly
+pyrgoidal
+pyrgologist
+pyrgom
+pyrheliometer
+pyrheliometric
+pyrheliometry
+pyrheliophor
+pyribole
+pyridazine
+pyridic
+pyridine
+pyridinium
+pyridinize
+pyridone
+pyridoxine
+pyridyl
+pyriform
+pyriformis
+pyrimidine
+pyrimidyl
+pyritaceous
+pyrite
+pyrites
+pyritic
+pyritical
+pyritiferous
+pyritization
+pyritize
+pyritohedral
+pyritohedron
+pyritoid
+pyritology
+pyritous
+pyro
+pyroacetic
+pyroacid
+pyroantimonate
+pyroantimonic
+pyroarsenate
+pyroarsenic
+pyroarsenious
+pyroarsenite
+pyrobelonite
+pyrobituminous
+pyroborate
+pyroboric
+pyrocatechin
+pyrocatechinol
+pyrocatechol
+pyrocatechuic
+pyrocellulose
+pyrochemical
+pyrochemically
+pyrochlore
+pyrochromate
+pyrochromic
+pyrocinchonic
+pyrocitric
+pyroclastic
+pyrocoll
+pyrocollodion
+pyrocomenic
+pyrocondensation
+pyroconductivity
+pyrocotton
+pyrocrystalline
+Pyrocystis
+Pyrodine
+pyroelectric
+pyroelectricity
+pyrogallate
+pyrogallic
+pyrogallol
+pyrogen
+pyrogenation
+pyrogenesia
+pyrogenesis
+pyrogenetic
+pyrogenetically
+pyrogenic
+pyrogenous
+pyroglutamic
+pyrognomic
+pyrognostic
+pyrognostics
+pyrograph
+pyrographer
+pyrographic
+pyrography
+pyrogravure
+pyroguaiacin
+pyroheliometer
+pyroid
+Pyrola
+Pyrolaceae
+pyrolaceous
+pyrolater
+pyrolatry
+pyroligneous
+pyrolignic
+pyrolignite
+pyrolignous
+pyrolite
+pyrollogical
+pyrologist
+pyrology
+pyrolusite
+pyrolysis
+pyrolytic
+pyrolyze
+pyromachy
+pyromagnetic
+pyromancer
+pyromancy
+pyromania
+pyromaniac
+pyromaniacal
+pyromantic
+pyromeconic
+pyromellitic
+pyrometallurgy
+pyrometamorphic
+pyrometamorphism
+pyrometer
+pyrometric
+pyrometrical
+pyrometrically
+pyrometry
+Pyromorphidae
+pyromorphism
+pyromorphite
+pyromorphous
+pyromotor
+pyromucate
+pyromucic
+pyromucyl
+pyronaphtha
+pyrone
+Pyronema
+pyronine
+pyronomics
+pyronyxis
+pyrope
+pyropen
+pyrophanite
+pyrophanous
+pyrophile
+pyrophilous
+pyrophobia
+pyrophone
+pyrophoric
+pyrophorous
+pyrophorus
+pyrophosphate
+pyrophosphoric
+pyrophosphorous
+pyrophotograph
+pyrophotography
+pyrophotometer
+pyrophyllite
+pyrophysalite
+pyropuncture
+pyropus
+pyroracemate
+pyroracemic
+pyroscope
+pyroscopy
+pyrosis
+pyrosmalite
+Pyrosoma
+Pyrosomatidae
+pyrosome
+Pyrosomidae
+pyrosomoid
+pyrosphere
+pyrostat
+pyrostereotype
+pyrostilpnite
+pyrosulphate
+pyrosulphite
+pyrosulphuric
+pyrosulphuryl
+pyrotantalate
+pyrotartaric
+pyrotartrate
+pyrotechnian
+pyrotechnic
+pyrotechnical
+pyrotechnically
+pyrotechnician
+pyrotechnics
+pyrotechnist
+pyrotechny
+pyroterebic
+pyrotheology
+Pyrotheria
+Pyrotherium
+pyrotic
+pyrotoxin
+pyrotritaric
+pyrotritartric
+pyrouric
+pyrovanadate
+pyrovanadic
+pyroxanthin
+pyroxene
+pyroxenic
+pyroxenite
+pyroxmangite
+pyroxonium
+pyroxyle
+pyroxylene
+pyroxylic
+pyroxylin
+Pyrrhic
+pyrrhic
+pyrrhichian
+pyrrhichius
+pyrrhicist
+Pyrrhocoridae
+Pyrrhonean
+Pyrrhonian
+Pyrrhonic
+Pyrrhonism
+Pyrrhonist
+Pyrrhonistic
+Pyrrhonize
+pyrrhotine
+pyrrhotism
+pyrrhotist
+pyrrhotite
+pyrrhous
+Pyrrhuloxia
+Pyrrhus
+pyrrodiazole
+pyrrol
+pyrrole
+pyrrolic
+pyrrolidine
+pyrrolidone
+pyrrolidyl
+pyrroline
+pyrrolylene
+pyrrophyllin
+pyrroporphyrin
+pyrrotriazole
+pyrroyl
+pyrryl
+pyrrylene
+Pyrula
+Pyrularia
+pyruline
+pyruloid
+Pyrus
+pyruvaldehyde
+pyruvate
+pyruvic
+pyruvil
+pyruvyl
+pyrylium
+Pythagorean
+Pythagoreanism
+Pythagoreanize
+Pythagoreanly
+Pythagoric
+Pythagorical
+Pythagorically
+Pythagorism
+Pythagorist
+Pythagorize
+Pythagorizer
+Pythia
+Pythiaceae
+Pythiacystis
+Pythiad
+Pythiambic
+Pythian
+Pythic
+Pythios
+Pythium
+Pythius
+pythogenesis
+pythogenetic
+pythogenic
+pythogenous
+python
+pythoness
+pythonic
+pythonical
+pythonid
+Pythonidae
+pythoniform
+Pythoninae
+pythonine
+pythonism
+Pythonissa
+pythonist
+pythonize
+pythonoid
+pythonomorph
+Pythonomorpha
+pythonomorphic
+pythonomorphous
+pyuria
+pyvuril
+pyx
+Pyxidanthera
+pyxidate
+pyxides
+pyxidium
+pyxie
+Pyxis
+pyxis
+Q
+q
+qasida
+qere
+qeri
+qintar
+Qoheleth
+qoph
+qua
+quab
+quabird
+quachil
+quack
+quackery
+quackhood
+quackish
+quackishly
+quackishness
+quackism
+quackle
+quacksalver
+quackster
+quacky
+quad
+quadded
+quaddle
+Quader
+Quadi
+quadmeter
+quadra
+quadrable
+quadragenarian
+quadragenarious
+Quadragesima
+quadragesimal
+quadragintesimal
+quadral
+quadrangle
+quadrangled
+quadrangular
+quadrangularly
+quadrangularness
+quadrangulate
+quadrans
+quadrant
+quadrantal
+quadrantes
+Quadrantid
+quadrantile
+quadrantlike
+quadrantly
+quadrat
+quadrate
+quadrated
+quadrateness
+quadratic
+quadratical
+quadratically
+quadratics
+Quadratifera
+quadratiferous
+quadratojugal
+quadratomandibular
+quadratosquamosal
+quadratrix
+quadratum
+quadrature
+quadratus
+quadrauricular
+quadrennia
+quadrennial
+quadrennially
+quadrennium
+quadriad
+quadrialate
+quadriannulate
+quadriarticulate
+quadriarticulated
+quadribasic
+quadric
+quadricapsular
+quadricapsulate
+quadricarinate
+quadricellular
+quadricentennial
+quadriceps
+quadrichord
+quadriciliate
+quadricinium
+quadricipital
+quadricone
+quadricorn
+quadricornous
+quadricostate
+quadricotyledonous
+quadricovariant
+quadricrescentic
+quadricrescentoid
+quadricuspid
+quadricuspidal
+quadricuspidate
+quadricycle
+quadricycler
+quadricyclist
+quadridentate
+quadridentated
+quadriderivative
+quadridigitate
+quadriennial
+quadriennium
+quadrienniumutile
+quadrifarious
+quadrifariously
+quadrifid
+quadrifilar
+quadrifocal
+quadrifoil
+quadrifoliate
+quadrifoliolate
+quadrifolious
+quadrifolium
+quadriform
+quadrifrons
+quadrifrontal
+quadrifurcate
+quadrifurcated
+quadrifurcation
+quadriga
+quadrigabled
+quadrigamist
+quadrigate
+quadrigatus
+quadrigeminal
+quadrigeminate
+quadrigeminous
+quadrigeminum
+quadrigenarious
+quadriglandular
+quadrihybrid
+quadrijugal
+quadrijugate
+quadrijugous
+quadrilaminar
+quadrilaminate
+quadrilateral
+quadrilaterally
+quadrilateralness
+quadrilingual
+quadriliteral
+quadrille
+quadrilled
+quadrillion
+quadrillionth
+quadrilobate
+quadrilobed
+quadrilocular
+quadriloculate
+quadrilogue
+quadrilogy
+quadrimembral
+quadrimetallic
+quadrimolecular
+quadrimum
+quadrinodal
+quadrinomial
+quadrinomical
+quadrinominal
+quadrinucleate
+quadrioxalate
+quadriparous
+quadripartite
+quadripartitely
+quadripartition
+quadripennate
+quadriphosphate
+quadriphyllous
+quadripinnate
+quadriplanar
+quadriplegia
+quadriplicate
+quadriplicated
+quadripolar
+quadripole
+quadriportico
+quadriporticus
+quadripulmonary
+quadriquadric
+quadriradiate
+quadrireme
+quadrisect
+quadrisection
+quadriseptate
+quadriserial
+quadrisetose
+quadrispiral
+quadristearate
+quadrisulcate
+quadrisulcated
+quadrisulphide
+quadrisyllabic
+quadrisyllabical
+quadrisyllable
+quadrisyllabous
+quadriternate
+quadritubercular
+quadrituberculate
+quadriurate
+quadrivalence
+quadrivalency
+quadrivalent
+quadrivalently
+quadrivalve
+quadrivalvular
+quadrivial
+quadrivious
+quadrivium
+quadrivoltine
+quadroon
+quadrual
+Quadrula
+quadrum
+Quadrumana
+quadrumanal
+quadrumane
+quadrumanous
+quadruped
+quadrupedal
+quadrupedan
+quadrupedant
+quadrupedantic
+quadrupedantical
+quadrupedate
+quadrupedation
+quadrupedism
+quadrupedous
+quadruplane
+quadruplator
+quadruple
+quadrupleness
+quadruplet
+quadruplex
+quadruplicate
+quadruplication
+quadruplicature
+quadruplicity
+quadruply
+quadrupole
+quaedam
+Quaequae
+quaesitum
+quaestor
+quaestorial
+quaestorian
+quaestorship
+quaestuary
+quaff
+quaffer
+quaffingly
+quag
+quagga
+quagginess
+quaggle
+quaggy
+quagmire
+quagmiry
+quahog
+quail
+quailberry
+quailery
+quailhead
+quaillike
+quaily
+quaint
+quaintance
+quaintise
+quaintish
+quaintly
+quaintness
+Quaitso
+quake
+quakeful
+quakeproof
+Quaker
+quaker
+quakerbird
+Quakerdom
+Quakeress
+Quakeric
+Quakerish
+Quakerishly
+Quakerishness
+Quakerism
+Quakerization
+Quakerize
+Quakerlet
+Quakerlike
+Quakerly
+Quakership
+Quakery
+quaketail
+quakiness
+quaking
+quakingly
+quaky
+quale
+qualifiable
+qualification
+qualificative
+qualificator
+qualificatory
+qualified
+qualifiedly
+qualifiedness
+qualifier
+qualify
+qualifyingly
+qualimeter
+qualitative
+qualitatively
+qualitied
+quality
+qualityless
+qualityship
+qualm
+qualminess
+qualmish
+qualmishly
+qualmishness
+qualmproof
+qualmy
+qualmyish
+qualtagh
+Quamasia
+Quamoclit
+quan
+quandary
+quandong
+quandy
+quannet
+quant
+quanta
+quantic
+quantical
+quantifiable
+quantifiably
+quantification
+quantifier
+quantify
+quantimeter
+quantitate
+quantitative
+quantitatively
+quantitativeness
+quantitied
+quantitive
+quantitively
+quantity
+quantivalence
+quantivalency
+quantivalent
+quantization
+quantize
+quantometer
+quantulum
+quantum
+Quapaw
+quaquaversal
+quaquaversally
+quar
+quarantinable
+quarantine
+quarantiner
+quaranty
+quardeel
+quare
+quarenden
+quarender
+quarentene
+quark
+quarl
+quarle
+quarred
+quarrel
+quarreled
+quarreler
+quarreling
+quarrelingly
+quarrelproof
+quarrelsome
+quarrelsomely
+quarrelsomeness
+quarriable
+quarried
+quarrier
+quarry
+quarryable
+quarrying
+quarryman
+quarrystone
+quart
+quartan
+quartane
+quartation
+quartenylic
+quarter
+quarterage
+quarterback
+quarterdeckish
+quartered
+quarterer
+quartering
+quarterization
+quarterland
+quarterly
+quarterman
+quartermaster
+quartermasterlike
+quartermastership
+quartern
+quarterpace
+quarters
+quartersaw
+quartersawed
+quarterspace
+quarterstaff
+quarterstetch
+quartet
+quartette
+quartetto
+quartful
+quartic
+quartile
+quartine
+quartiparous
+quarto
+Quartodeciman
+quartodecimanism
+quartole
+quartz
+quartzic
+quartziferous
+quartzite
+quartzitic
+quartzless
+quartzoid
+quartzose
+quartzous
+quartzy
+quash
+Quashee
+quashey
+quashy
+quasi
+quasijudicial
+Quasimodo
+quasky
+quassation
+quassative
+Quassia
+quassiin
+quassin
+quat
+quata
+quatch
+quatercentenary
+quatern
+quaternal
+quaternarian
+quaternarius
+quaternary
+quaternate
+quaternion
+quaternionic
+quaternionist
+quaternitarian
+quaternity
+quaters
+quatertenses
+quatorzain
+quatorze
+quatrain
+quatral
+quatrayle
+quatre
+quatrefeuille
+quatrefoil
+quatrefoiled
+quatrefoliated
+quatrible
+quatrin
+quatrino
+quatrocentism
+quatrocentist
+quatrocento
+Quatsino
+quattie
+quattrini
+quatuor
+quatuorvirate
+quauk
+quave
+quaver
+quaverer
+quavering
+quaveringly
+quaverous
+quavery
+quaverymavery
+quaw
+quawk
+quay
+quayage
+quayful
+quaylike
+quayman
+quayside
+quaysider
+qubba
+queach
+queachy
+queak
+queal
+quean
+queanish
+queasily
+queasiness
+queasom
+queasy
+quebrachamine
+quebrachine
+quebrachitol
+quebracho
+quebradilla
+Quechua
+Quechuan
+quedful
+queechy
+queen
+queencake
+queencraft
+queencup
+queendom
+queenfish
+queenhood
+queening
+queenite
+queenless
+queenlet
+queenlike
+queenliness
+queenly
+queenright
+queenroot
+queensberry
+queenship
+queenweed
+queenwood
+queer
+queerer
+queerish
+queerishness
+queerity
+queerly
+queerness
+queersome
+queery
+queest
+queesting
+queet
+queeve
+quegh
+quei
+queintise
+quelch
+Quelea
+quell
+queller
+quemado
+queme
+quemeful
+quemefully
+quemely
+quench
+quenchable
+quenchableness
+quencher
+quenchless
+quenchlessly
+quenchlessness
+quenelle
+quenselite
+quercetagetin
+quercetic
+quercetin
+quercetum
+quercic
+Querciflorae
+quercimeritrin
+quercin
+quercine
+quercinic
+quercitannic
+quercitannin
+quercite
+quercitin
+quercitol
+quercitrin
+quercitron
+quercivorous
+Quercus
+Querecho
+Querendi
+Querendy
+querent
+Queres
+querier
+queriman
+querimonious
+querimoniously
+querimoniousness
+querimony
+querist
+querken
+querl
+quern
+quernal
+Quernales
+quernstone
+querulent
+querulential
+querulist
+querulity
+querulosity
+querulous
+querulously
+querulousness
+query
+querying
+queryingly
+queryist
+quesited
+quesitive
+quest
+quester
+questeur
+questful
+questingly
+question
+questionability
+questionable
+questionableness
+questionably
+questionary
+questionee
+questioner
+questioningly
+questionist
+questionless
+questionlessly
+questionnaire
+questionous
+questionwise
+questman
+questor
+questorial
+questorship
+quet
+quetch
+quetenite
+quetzal
+queue
+quey
+Quiangan
+quiapo
+quib
+quibble
+quibbleproof
+quibbler
+quibblingly
+quiblet
+quica
+Quiche
+quick
+quickbeam
+quickborn
+quicken
+quickenance
+quickenbeam
+quickener
+quickfoot
+quickhatch
+quickhearted
+quickie
+quicklime
+quickly
+quickness
+quicksand
+quicksandy
+quickset
+quicksilver
+quicksilvering
+quicksilverish
+quicksilverishness
+quicksilvery
+quickstep
+quickthorn
+quickwork
+quid
+Quidae
+quiddative
+quidder
+Quiddist
+quiddit
+quidditative
+quidditatively
+quiddity
+quiddle
+quiddler
+quidnunc
+quiesce
+quiescence
+quiescency
+quiescent
+quiescently
+quiet
+quietable
+quieten
+quietener
+quieter
+quieting
+quietism
+quietist
+quietistic
+quietive
+quietlike
+quietly
+quietness
+quietsome
+quietude
+quietus
+quiff
+quiffing
+Quiina
+Quiinaceae
+quiinaceous
+quila
+quiles
+Quileute
+quilkin
+quill
+Quillagua
+quillai
+quillaic
+Quillaja
+quillaja
+quillback
+quilled
+quiller
+quillet
+quilleted
+quillfish
+quilling
+quilltail
+quillwork
+quillwort
+quilly
+quilt
+quilted
+quilter
+quilting
+Quimbaya
+Quimper
+quin
+quina
+quinacrine
+Quinaielt
+quinaldic
+quinaldine
+quinaldinic
+quinaldinium
+quinaldyl
+quinamicine
+quinamidine
+quinamine
+quinanisole
+quinaquina
+quinarian
+quinarius
+quinary
+quinate
+quinatoxine
+Quinault
+quinazoline
+quinazolyl
+quince
+quincentenary
+quincentennial
+quincewort
+quinch
+quincubital
+quincubitalism
+quincuncial
+quincuncially
+quincunx
+quincunxial
+quindecad
+quindecagon
+quindecangle
+quindecasyllabic
+quindecemvir
+quindecemvirate
+quindecennial
+quindecim
+quindecima
+quindecylic
+quindene
+quinetum
+quingentenary
+quinhydrone
+quinia
+quinible
+quinic
+quinicine
+quinidia
+quinidine
+quinin
+quinina
+quinine
+quininiazation
+quininic
+quininism
+quininize
+quiniretin
+quinisext
+quinisextine
+quinism
+quinite
+quinitol
+quinizarin
+quinize
+quink
+quinnat
+quinnet
+Quinnipiac
+quinoa
+quinocarbonium
+quinoform
+quinogen
+quinoid
+quinoidal
+quinoidation
+quinoidine
+quinol
+quinoline
+quinolinic
+quinolinium
+quinolinyl
+quinologist
+quinology
+quinolyl
+quinometry
+quinone
+quinonediimine
+quinonic
+quinonimine
+quinonization
+quinonize
+quinonoid
+quinonyl
+quinopyrin
+quinotannic
+quinotoxine
+quinova
+quinovatannic
+quinovate
+quinovic
+quinovin
+quinovose
+quinoxaline
+quinoxalyl
+quinoyl
+quinquagenarian
+quinquagenary
+Quinquagesima
+quinquagesimal
+quinquarticular
+Quinquatria
+Quinquatrus
+quinquecapsular
+quinquecostate
+quinquedentate
+quinquedentated
+quinquefarious
+quinquefid
+quinquefoliate
+quinquefoliated
+quinquefoliolate
+quinquegrade
+quinquejugous
+quinquelateral
+quinqueliteral
+quinquelobate
+quinquelobated
+quinquelobed
+quinquelocular
+quinqueloculine
+quinquenary
+quinquenerval
+quinquenerved
+quinquennalia
+quinquennia
+quinquenniad
+quinquennial
+quinquennialist
+quinquennially
+quinquennium
+quinquepartite
+quinquepedal
+quinquepedalian
+quinquepetaloid
+quinquepunctal
+quinquepunctate
+quinqueradial
+quinqueradiate
+quinquereme
+quinquertium
+quinquesect
+quinquesection
+quinqueseptate
+quinqueserial
+quinqueseriate
+quinquesyllabic
+quinquesyllable
+quinquetubercular
+quinquetuberculate
+quinquevalence
+quinquevalency
+quinquevalent
+quinquevalve
+quinquevalvous
+quinquevalvular
+quinqueverbal
+quinqueverbial
+quinquevir
+quinquevirate
+quinquiliteral
+quinquina
+quinquino
+quinse
+quinsied
+quinsy
+quinsyberry
+quinsywort
+quint
+quintad
+quintadena
+quintadene
+quintain
+quintal
+quintan
+quintant
+quintary
+quintato
+quinte
+quintelement
+quintennial
+quinternion
+quinteron
+quinteroon
+quintessence
+quintessential
+quintessentiality
+quintessentially
+quintessentiate
+quintet
+quintette
+quintetto
+quintic
+quintile
+Quintilis
+Quintillian
+quintillion
+quintillionth
+Quintin
+quintin
+quintiped
+Quintius
+quinto
+quintocubital
+quintocubitalism
+quintole
+quinton
+quintroon
+quintuple
+quintuplet
+quintuplicate
+quintuplication
+quintuplinerved
+quintupliribbed
+quintus
+quinuclidine
+quinyl
+quinze
+quinzieme
+quip
+quipful
+quipo
+quipper
+quippish
+quippishness
+quippy
+quipsome
+quipsomeness
+quipster
+quipu
+quira
+quire
+quirewise
+Quirinal
+Quirinalia
+quirinca
+quiritarian
+quiritary
+Quirite
+Quirites
+quirk
+quirkiness
+quirkish
+quirksey
+quirksome
+quirky
+quirl
+quirquincho
+quirt
+quis
+quisby
+quiscos
+quisle
+quisling
+Quisqualis
+quisqueite
+quisquilian
+quisquiliary
+quisquilious
+quisquous
+quisutsch
+quit
+quitch
+quitclaim
+quite
+Quitemoca
+Quiteno
+quitrent
+quits
+quittable
+quittance
+quitted
+quitter
+quittor
+Quitu
+quiver
+quivered
+quiverer
+quiverful
+quivering
+quiveringly
+quiverish
+quiverleaf
+quivery
+Quixote
+quixotic
+quixotical
+quixotically
+quixotism
+quixotize
+quixotry
+quiz
+quizzability
+quizzable
+quizzacious
+quizzatorial
+quizzee
+quizzer
+quizzery
+quizzical
+quizzicality
+quizzically
+quizzicalness
+quizzification
+quizzify
+quizziness
+quizzingly
+quizzish
+quizzism
+quizzity
+quizzy
+Qung
+quo
+quod
+quoddies
+quoddity
+quodlibet
+quodlibetal
+quodlibetarian
+quodlibetary
+quodlibetic
+quodlibetical
+quodlibetically
+quoilers
+quoin
+quoined
+quoining
+quoit
+quoiter
+quoitlike
+quoits
+quondam
+quondamly
+quondamship
+quoniam
+quop
+Quoratean
+quorum
+quot
+quota
+quotability
+quotable
+quotableness
+quotably
+quotation
+quotational
+quotationally
+quotationist
+quotative
+quote
+quotee
+quoteless
+quotennial
+quoter
+quoteworthy
+quoth
+quotha
+quotidian
+quotidianly
+quotidianness
+quotient
+quotiety
+quotingly
+quotity
+quotlibet
+quotum
+Qurti
+R
+r
+ra
+raad
+Raanan
+raash
+Rab
+rab
+raband
+rabanna
+rabat
+rabatine
+rabatte
+rabattement
+rabbanist
+rabbanite
+rabbet
+rabbeting
+rabbi
+rabbin
+rabbinate
+rabbindom
+Rabbinic
+rabbinic
+Rabbinica
+rabbinical
+rabbinically
+rabbinism
+rabbinist
+rabbinistic
+rabbinistical
+rabbinite
+rabbinize
+rabbinship
+rabbiship
+rabbit
+rabbitberry
+rabbiter
+rabbithearted
+rabbitlike
+rabbitmouth
+rabbitproof
+rabbitroot
+rabbitry
+rabbitskin
+rabbitweed
+rabbitwise
+rabbitwood
+rabbity
+rabble
+rabblelike
+rabblement
+rabbleproof
+rabbler
+rabblesome
+rabboni
+rabbonim
+Rabelaisian
+Rabelaisianism
+Rabelaism
+Rabi
+rabic
+rabid
+rabidity
+rabidly
+rabidness
+rabies
+rabietic
+rabific
+rabiform
+rabigenic
+Rabin
+rabinet
+rabirubia
+rabitic
+rabulistic
+rabulous
+raccoon
+raccoonberry
+raccroc
+race
+raceabout
+racebrood
+racecourse
+racegoer
+racegoing
+racelike
+racemate
+racemation
+raceme
+racemed
+racemic
+racemiferous
+racemiform
+racemism
+racemization
+racemize
+racemocarbonate
+racemocarbonic
+racemomethylate
+racemose
+racemosely
+racemous
+racemously
+racemule
+racemulose
+racer
+raceway
+rach
+rache
+Rachel
+rachial
+rachialgia
+rachialgic
+rachianalgesia
+Rachianectes
+rachianesthesia
+rachicentesis
+rachides
+rachidial
+rachidian
+rachiform
+Rachiglossa
+rachiglossate
+rachigraph
+rachilla
+rachiocentesis
+rachiococainize
+rachiocyphosis
+rachiodont
+rachiodynia
+rachiometer
+rachiomyelitis
+rachioparalysis
+rachioplegia
+rachioscoliosis
+rachiotome
+rachiotomy
+rachipagus
+rachis
+rachischisis
+rachitic
+rachitis
+rachitism
+rachitogenic
+rachitome
+rachitomous
+rachitomy
+Rachycentridae
+Rachycentron
+racial
+racialism
+racialist
+raciality
+racialization
+racialize
+racially
+racily
+raciness
+racing
+racinglike
+racism
+racist
+rack
+rackabones
+rackan
+rackboard
+racker
+racket
+racketeer
+racketeering
+racketer
+racketing
+racketlike
+racketproof
+racketry
+rackett
+rackettail
+rackety
+rackful
+racking
+rackingly
+rackle
+rackless
+rackmaster
+rackproof
+rackrentable
+rackway
+rackwork
+racloir
+racon
+raconteur
+racoon
+Racovian
+racy
+rad
+rada
+radar
+radarman
+radarscope
+raddle
+raddleman
+raddlings
+radectomy
+Radek
+radiability
+radiable
+radial
+radiale
+radialia
+radiality
+radialization
+radialize
+radially
+radian
+radiance
+radiancy
+radiant
+radiantly
+Radiata
+radiate
+radiated
+radiately
+radiateness
+radiatics
+radiatiform
+radiation
+radiational
+radiative
+radiatopatent
+radiatoporose
+radiatoporous
+radiator
+radiatory
+radiatostriate
+radiatosulcate
+radiature
+radical
+radicalism
+radicality
+radicalization
+radicalize
+radically
+radicalness
+radicand
+radicant
+radicate
+radicated
+radicating
+radication
+radicel
+radices
+radicicola
+radicicolous
+radiciferous
+radiciflorous
+radiciform
+radicivorous
+radicle
+radicolous
+radicose
+Radicula
+radicular
+radicule
+radiculectomy
+radiculitis
+radiculose
+radiectomy
+radiescent
+radiferous
+radii
+radio
+radioacoustics
+radioactinium
+radioactivate
+radioactive
+radioactively
+radioactivity
+radioamplifier
+radioanaphylaxis
+radioautograph
+radioautographic
+radioautography
+radiobicipital
+radiobroadcast
+radiobroadcaster
+radiobroadcasting
+radiobserver
+radiocarbon
+radiocarpal
+radiocast
+radiocaster
+radiochemical
+radiochemistry
+radiocinematograph
+radioconductor
+radiode
+radiodermatitis
+radiodetector
+radiodiagnosis
+radiodigital
+radiodontia
+radiodontic
+radiodontist
+radiodynamic
+radiodynamics
+radioelement
+radiogenic
+radiogoniometer
+radiogoniometric
+radiogoniometry
+radiogram
+radiograph
+radiographer
+radiographic
+radiographical
+radiographically
+radiography
+radiohumeral
+radioisotope
+Radiolaria
+radiolarian
+radiolead
+radiolite
+Radiolites
+radiolitic
+Radiolitidae
+radiolocation
+radiolocator
+radiologic
+radiological
+radiologist
+radiology
+radiolucency
+radiolucent
+radioluminescence
+radioluminescent
+radioman
+radiomedial
+radiometallography
+radiometeorograph
+radiometer
+radiometric
+radiometrically
+radiometry
+radiomicrometer
+radiomovies
+radiomuscular
+radionecrosis
+radioneuritis
+radionics
+radiopacity
+radiopalmar
+radiopaque
+radiopelvimetry
+radiophare
+radiophone
+radiophonic
+radiophony
+radiophosphorus
+radiophotograph
+radiophotography
+radiopraxis
+radioscope
+radioscopic
+radioscopical
+radioscopy
+radiosensibility
+radiosensitive
+radiosensitivity
+radiosonde
+radiosonic
+radiostereoscopy
+radiosurgery
+radiosurgical
+radiosymmetrical
+radiotechnology
+radiotelegram
+radiotelegraph
+radiotelegraphic
+radiotelegraphy
+radiotelephone
+radiotelephonic
+radiotelephony
+radioteria
+radiothallium
+radiotherapeutic
+radiotherapeutics
+radiotherapeutist
+radiotherapist
+radiotherapy
+radiothermy
+radiothorium
+radiotoxemia
+radiotransparency
+radiotransparent
+radiotrician
+Radiotron
+radiotropic
+radiotropism
+radiovision
+radish
+radishlike
+radium
+radiumization
+radiumize
+radiumlike
+radiumproof
+radiumtherapy
+radius
+radix
+radknight
+radman
+radome
+radon
+radsimir
+radula
+radulate
+raduliferous
+raduliform
+Rafael
+Rafe
+raff
+Raffaelesque
+raffe
+raffee
+raffery
+raffia
+raffinase
+raffinate
+raffing
+raffinose
+raffish
+raffishly
+raffishness
+raffle
+raffler
+Rafflesia
+rafflesia
+Rafflesiaceae
+rafflesiaceous
+Rafik
+raft
+raftage
+rafter
+raftiness
+raftlike
+raftman
+raftsman
+rafty
+rag
+raga
+ragabash
+ragabrash
+ragamuffin
+ragamuffinism
+ragamuffinly
+rage
+rageful
+ragefully
+rageless
+rageous
+rageously
+rageousness
+rageproof
+rager
+ragesome
+ragfish
+ragged
+raggedly
+raggedness
+raggedy
+raggee
+ragger
+raggery
+raggety
+raggil
+raggily
+ragging
+raggle
+raggled
+raggy
+raghouse
+Raghu
+raging
+ragingly
+raglan
+raglanite
+raglet
+raglin
+ragman
+Ragnar
+ragout
+ragpicker
+ragseller
+ragshag
+ragsorter
+ragstone
+ragtag
+ragtime
+ragtimer
+ragtimey
+ragule
+raguly
+ragweed
+ragwort
+rah
+Rahanwin
+rahdar
+rahdaree
+Rahul
+Raia
+raia
+Raiae
+raid
+raider
+raidproof
+Raif
+Raiidae
+raiiform
+rail
+railage
+railbird
+railer
+railhead
+railing
+railingly
+raillery
+railless
+raillike
+railly
+railman
+railroad
+railroadana
+railroader
+railroadiana
+railroading
+railroadish
+railroadship
+railway
+railwaydom
+railwayless
+Raimannia
+raiment
+raimentless
+rain
+rainband
+rainbird
+rainbound
+rainbow
+rainbowlike
+rainbowweed
+rainbowy
+rainburst
+raincoat
+raindrop
+Rainer
+rainer
+rainfall
+rainfowl
+rainful
+rainily
+raininess
+rainless
+rainlessness
+rainlight
+rainproof
+rainproofer
+rainspout
+rainstorm
+raintight
+rainwash
+rainworm
+rainy
+raioid
+Rais
+rais
+raisable
+raise
+raised
+raiseman
+raiser
+raisin
+raising
+raisiny
+Raj
+raj
+Raja
+raja
+Rajah
+rajah
+Rajarshi
+rajaship
+Rajasthani
+rajbansi
+Rajeev
+Rajendra
+Rajesh
+Rajidae
+Rajiv
+Rajput
+rakan
+rake
+rakeage
+rakeful
+rakehell
+rakehellish
+rakehelly
+raker
+rakery
+rakesteel
+rakestele
+rakh
+Rakhal
+raki
+rakily
+raking
+rakish
+rakishly
+rakishness
+rakit
+rakshasa
+raku
+Ralf
+rallentando
+ralliance
+Rallidae
+rallier
+ralliform
+Rallinae
+ralline
+Rallus
+rally
+Ralph
+ralph
+ralstonite
+Ram
+ram
+Rama
+ramada
+Ramadoss
+ramage
+Ramaism
+Ramaite
+ramal
+Raman
+Ramanan
+ramanas
+ramarama
+ramass
+ramate
+rambeh
+ramberge
+ramble
+rambler
+rambling
+ramblingly
+ramblingness
+Rambo
+rambong
+rambooze
+Rambouillet
+rambunctious
+rambutan
+ramdohrite
+rame
+rameal
+Ramean
+ramed
+ramekin
+ramellose
+rament
+ramentaceous
+ramental
+ramentiferous
+ramentum
+rameous
+ramequin
+Rameses
+Rameseum
+Ramesh
+Ramessid
+Ramesside
+ramet
+ramex
+ramfeezled
+ramgunshoch
+ramhead
+ramhood
+rami
+ramicorn
+ramie
+ramiferous
+ramificate
+ramification
+ramified
+ramiflorous
+ramiform
+ramify
+ramigerous
+Ramillie
+Ramillied
+ramiparous
+Ramiro
+ramisection
+ramisectomy
+Ramism
+Ramist
+Ramistical
+ramlike
+ramline
+rammack
+rammel
+rammelsbergite
+rammer
+rammerman
+rammish
+rammishly
+rammishness
+rammy
+Ramneek
+Ramnenses
+Ramnes
+Ramon
+Ramona
+Ramoosii
+ramose
+ramosely
+ramosity
+ramosopalmate
+ramosopinnate
+ramososubdivided
+ramous
+ramp
+rampacious
+rampaciously
+rampage
+rampageous
+rampageously
+rampageousness
+rampager
+rampagious
+rampancy
+rampant
+rampantly
+rampart
+ramped
+ramper
+Ramphastidae
+Ramphastides
+Ramphastos
+rampick
+rampike
+ramping
+rampingly
+rampion
+rampire
+rampler
+ramplor
+rampsman
+ramrace
+ramrod
+ramroddy
+ramscallion
+ramsch
+Ramsey
+ramshackle
+ramshackled
+ramshackleness
+ramshackly
+ramson
+ramstam
+ramtil
+ramular
+ramule
+ramuliferous
+ramulose
+ramulous
+ramulus
+ramus
+ramuscule
+Ramusi
+Ran
+ran
+Rana
+rana
+ranal
+Ranales
+ranarian
+ranarium
+Ranatra
+rance
+rancel
+rancellor
+rancelman
+rancer
+rancescent
+ranch
+ranche
+rancher
+rancheria
+ranchero
+ranchless
+ranchman
+rancho
+ranchwoman
+rancid
+rancidification
+rancidify
+rancidity
+rancidly
+rancidness
+rancor
+rancorous
+rancorously
+rancorousness
+rancorproof
+Rand
+rand
+Randal
+Randall
+Randallite
+randan
+randannite
+Randell
+randem
+rander
+Randia
+randing
+randir
+Randite
+randle
+Randolph
+random
+randomish
+randomization
+randomize
+randomly
+randomness
+randomwise
+Randy
+randy
+rane
+Ranella
+Ranere
+rang
+rangatira
+range
+ranged
+rangeless
+rangeman
+ranger
+rangership
+rangework
+rangey
+Rangifer
+rangiferine
+ranginess
+ranging
+rangle
+rangler
+rangy
+rani
+ranid
+Ranidae
+raniferous
+raniform
+Ranina
+Raninae
+ranine
+raninian
+ranivorous
+Ranjit
+rank
+ranked
+ranker
+rankish
+rankle
+rankless
+ranklingly
+rankly
+rankness
+ranksman
+rankwise
+rann
+rannel
+rannigal
+ranny
+Ranquel
+ransack
+ransacker
+ransackle
+ransel
+ranselman
+ransom
+ransomable
+ransomer
+ransomfree
+ransomless
+ranstead
+rant
+rantan
+rantankerous
+rantepole
+ranter
+Ranterism
+ranting
+rantingly
+rantipole
+rantock
+ranty
+ranula
+ranular
+Ranunculaceae
+ranunculaceous
+Ranunculales
+ranunculi
+Ranunculus
+Ranzania
+Raoulia
+rap
+Rapaces
+rapaceus
+rapacious
+rapaciously
+rapaciousness
+rapacity
+rapakivi
+Rapallo
+Rapanea
+Rapateaceae
+rapateaceous
+rape
+rapeful
+raper
+rapeseed
+Raphael
+Raphaelesque
+Raphaelic
+Raphaelism
+Raphaelite
+Raphaelitism
+raphania
+Raphanus
+raphany
+raphe
+Raphia
+raphide
+raphides
+raphidiferous
+raphidiid
+Raphidiidae
+Raphidodea
+Raphidoidea
+Raphiolepis
+raphis
+rapic
+rapid
+rapidity
+rapidly
+rapidness
+rapier
+rapiered
+rapillo
+rapine
+rapiner
+raping
+rapinic
+rapist
+raploch
+rappage
+rapparee
+rappe
+rappel
+rapper
+rapping
+Rappist
+rappist
+Rappite
+rapport
+rapscallion
+rapscallionism
+rapscallionly
+rapscallionry
+rapt
+raptatorial
+raptatory
+raptly
+raptness
+raptor
+Raptores
+raptorial
+raptorious
+raptril
+rapture
+raptured
+raptureless
+rapturist
+rapturize
+rapturous
+rapturously
+rapturousness
+raptury
+raptus
+rare
+rarebit
+rarefaction
+rarefactional
+rarefactive
+rarefiable
+rarefication
+rarefier
+rarefy
+rarely
+rareness
+rareripe
+Rareyfy
+rariconstant
+rarish
+rarity
+Rarotongan
+ras
+rasa
+Rasalas
+Rasalhague
+rasamala
+rasant
+rascacio
+rascal
+rascaldom
+rascaless
+rascalion
+rascalism
+rascality
+rascalize
+rascallike
+rascallion
+rascally
+rascalry
+rascalship
+rasceta
+rascette
+rase
+rasen
+Rasenna
+raser
+rasgado
+rash
+rasher
+rashful
+rashing
+rashlike
+rashly
+rashness
+Rashti
+rasion
+Raskolnik
+Rasores
+rasorial
+rasp
+raspatorium
+raspatory
+raspberriade
+raspberry
+raspberrylike
+rasped
+rasper
+rasping
+raspingly
+raspingness
+raspings
+raspish
+raspite
+raspy
+rasse
+Rasselas
+rassle
+Rastaban
+raster
+rastik
+rastle
+Rastus
+rasure
+rat
+rata
+ratability
+ratable
+ratableness
+ratably
+ratafee
+ratafia
+ratal
+ratanhia
+rataplan
+ratbite
+ratcatcher
+ratcatching
+ratch
+ratchel
+ratchelly
+ratcher
+ratchet
+ratchetlike
+ratchety
+ratching
+ratchment
+rate
+rated
+ratel
+rateless
+ratement
+ratepayer
+ratepaying
+rater
+ratfish
+rath
+rathe
+rathed
+rathely
+ratheness
+rather
+ratherest
+ratheripe
+ratherish
+ratherly
+rathest
+rathite
+Rathnakumar
+rathole
+rathskeller
+raticidal
+raticide
+ratification
+ratificationist
+ratifier
+ratify
+ratihabition
+ratine
+rating
+ratio
+ratiocinant
+ratiocinate
+ratiocination
+ratiocinative
+ratiocinator
+ratiocinatory
+ratiometer
+ration
+rationable
+rationably
+rational
+rationale
+rationalism
+rationalist
+rationalistic
+rationalistical
+rationalistically
+rationalisticism
+rationality
+rationalizable
+rationalization
+rationalize
+rationalizer
+rationally
+rationalness
+rationate
+rationless
+rationment
+Ratitae
+ratite
+ratitous
+ratlike
+ratline
+ratliner
+ratoon
+ratooner
+ratproof
+ratsbane
+ratskeller
+rattage
+rattail
+rattan
+ratteen
+ratten
+rattener
+ratter
+rattery
+ratti
+rattinet
+rattish
+rattle
+rattlebag
+rattlebones
+rattlebox
+rattlebrain
+rattlebrained
+rattlebush
+rattled
+rattlehead
+rattleheaded
+rattlejack
+rattlemouse
+rattlenut
+rattlepate
+rattlepated
+rattlepod
+rattleproof
+rattler
+rattleran
+rattleroot
+rattlertree
+rattles
+rattleskull
+rattleskulled
+rattlesnake
+rattlesome
+rattletrap
+rattleweed
+rattlewort
+rattling
+rattlingly
+rattlingness
+rattly
+ratton
+rattoner
+rattrap
+Rattus
+ratty
+ratwa
+ratwood
+raucid
+raucidity
+raucity
+raucous
+raucously
+raucousness
+raught
+raugrave
+rauk
+raukle
+Raul
+rauli
+raun
+raunge
+raupo
+rauque
+Rauraci
+Raurici
+Rauwolfia
+ravage
+ravagement
+ravager
+rave
+ravehook
+raveinelike
+ravel
+raveler
+ravelin
+raveling
+ravelly
+ravelment
+ravelproof
+raven
+Ravenala
+ravendom
+ravenduck
+Ravenelia
+ravener
+ravenhood
+ravening
+ravenish
+ravenlike
+ravenous
+ravenously
+ravenousness
+ravenry
+ravens
+Ravensara
+ravensara
+ravenstone
+ravenwise
+raver
+Ravi
+ravigote
+ravin
+ravinate
+Ravindran
+Ravindranath
+ravine
+ravined
+ravinement
+raviney
+raving
+ravingly
+ravioli
+ravish
+ravishedly
+ravisher
+ravishing
+ravishingly
+ravishment
+ravison
+ravissant
+raw
+rawboned
+rawbones
+rawhead
+rawhide
+rawhider
+rawish
+rawishness
+rawness
+rax
+Ray
+ray
+raya
+rayage
+Rayan
+rayed
+rayful
+rayless
+raylessness
+raylet
+Raymond
+rayon
+rayonnance
+rayonnant
+raze
+razee
+razer
+razoo
+razor
+razorable
+razorback
+razorbill
+razoredge
+razorless
+razormaker
+razormaking
+razorman
+razorstrop
+Razoumofskya
+razz
+razzia
+razzly
+re
+rea
+reaal
+reabandon
+reabolish
+reabolition
+reabridge
+reabsence
+reabsent
+reabsolve
+reabsorb
+reabsorption
+reabuse
+reacceptance
+reaccess
+reaccession
+reacclimatization
+reacclimatize
+reaccommodate
+reaccompany
+reaccomplish
+reaccomplishment
+reaccord
+reaccost
+reaccount
+reaccredit
+reaccrue
+reaccumulate
+reaccumulation
+reaccusation
+reaccuse
+reaccustom
+reacetylation
+reach
+reachable
+reacher
+reachieve
+reachievement
+reaching
+reachless
+reachy
+reacidification
+reacidify
+reacknowledge
+reacknowledgment
+reacquaint
+reacquaintance
+reacquire
+reacquisition
+react
+reactance
+reactant
+reaction
+reactional
+reactionally
+reactionariness
+reactionarism
+reactionarist
+reactionary
+reactionaryism
+reactionism
+reactionist
+reactivate
+reactivation
+reactive
+reactively
+reactiveness
+reactivity
+reactological
+reactology
+reactor
+reactualization
+reactualize
+reactuate
+read
+readability
+readable
+readableness
+readably
+readapt
+readaptability
+readaptable
+readaptation
+readaptive
+readaptiveness
+readd
+readdition
+readdress
+reader
+readerdom
+readership
+readhere
+readhesion
+readily
+readiness
+reading
+readingdom
+readjourn
+readjournment
+readjudicate
+readjust
+readjustable
+readjuster
+readjustment
+readmeasurement
+readminister
+readmiration
+readmire
+readmission
+readmit
+readmittance
+readopt
+readoption
+readorn
+readvance
+readvancement
+readvent
+readventure
+readvertency
+readvertise
+readvertisement
+readvise
+readvocate
+ready
+reaeration
+reaffect
+reaffection
+reaffiliate
+reaffiliation
+reaffirm
+reaffirmance
+reaffirmation
+reaffirmer
+reafflict
+reafford
+reafforest
+reafforestation
+reaffusion
+reagency
+reagent
+reaggravate
+reaggravation
+reaggregate
+reaggregation
+reaggressive
+reagin
+reagitate
+reagitation
+reagree
+reagreement
+reak
+Real
+real
+realarm
+reales
+realest
+realgar
+realienate
+realienation
+realign
+realignment
+realism
+realist
+realistic
+realistically
+realisticize
+reality
+realive
+realizability
+realizable
+realizableness
+realizably
+realization
+realize
+realizer
+realizing
+realizingly
+reallegation
+reallege
+reallegorize
+realliance
+reallocate
+reallocation
+reallot
+reallotment
+reallow
+reallowance
+reallude
+reallusion
+really
+realm
+realmless
+realmlet
+realness
+realter
+realteration
+realtor
+realty
+ream
+reamage
+reamalgamate
+reamalgamation
+reamass
+reambitious
+reamend
+reamendment
+reamer
+reamerer
+reaminess
+reamputation
+reamuse
+reamy
+reanalysis
+reanalyze
+reanchor
+reanimalize
+reanimate
+reanimation
+reanneal
+reannex
+reannexation
+reannotate
+reannounce
+reannouncement
+reannoy
+reannoyance
+reanoint
+reanswer
+reanvil
+reanxiety
+reap
+reapable
+reapdole
+reaper
+reapologize
+reapology
+reapparel
+reapparition
+reappeal
+reappear
+reappearance
+reappease
+reapplaud
+reapplause
+reappliance
+reapplicant
+reapplication
+reapplier
+reapply
+reappoint
+reappointment
+reapportion
+reapportionment
+reapposition
+reappraisal
+reappraise
+reappraisement
+reappreciate
+reappreciation
+reapprehend
+reapprehension
+reapproach
+reapprobation
+reappropriate
+reappropriation
+reapproval
+reapprove
+rear
+rearbitrate
+rearbitration
+rearer
+reargue
+reargument
+rearhorse
+rearisal
+rearise
+rearling
+rearm
+rearmament
+rearmost
+rearousal
+rearouse
+rearrange
+rearrangeable
+rearrangement
+rearranger
+rearray
+rearrest
+rearrival
+rearrive
+rearward
+rearwardly
+rearwardness
+rearwards
+reascend
+reascendancy
+reascendant
+reascendency
+reascendent
+reascension
+reascensional
+reascent
+reascertain
+reascertainment
+reashlar
+reasiness
+reask
+reason
+reasonability
+reasonable
+reasonableness
+reasonably
+reasoned
+reasonedly
+reasoner
+reasoning
+reasoningly
+reasonless
+reasonlessly
+reasonlessness
+reasonproof
+reaspire
+reassail
+reassault
+reassay
+reassemblage
+reassemble
+reassembly
+reassent
+reassert
+reassertion
+reassertor
+reassess
+reassessment
+reasseverate
+reassign
+reassignation
+reassignment
+reassimilate
+reassimilation
+reassist
+reassistance
+reassociate
+reassociation
+reassort
+reassortment
+reassume
+reassumption
+reassurance
+reassure
+reassured
+reassuredly
+reassurement
+reassurer
+reassuring
+reassuringly
+reastiness
+reastonish
+reastonishment
+reastray
+reasty
+reasy
+reattach
+reattachment
+reattack
+reattain
+reattainment
+reattempt
+reattend
+reattendance
+reattention
+reattentive
+reattest
+reattire
+reattract
+reattraction
+reattribute
+reattribution
+reatus
+reaudit
+reauthenticate
+reauthentication
+reauthorization
+reauthorize
+reavail
+reavailable
+reave
+reaver
+reavoid
+reavoidance
+reavouch
+reavow
+reawait
+reawake
+reawaken
+reawakening
+reawakenment
+reaward
+reaware
+reb
+rebab
+reback
+rebag
+rebait
+rebake
+rebalance
+rebale
+reballast
+reballot
+reban
+rebandage
+rebanish
+rebanishment
+rebankrupt
+rebankruptcy
+rebaptism
+rebaptismal
+rebaptization
+rebaptize
+rebaptizer
+rebar
+rebarbarization
+rebarbarize
+rebarbative
+rebargain
+rebase
+rebasis
+rebatable
+rebate
+rebateable
+rebatement
+rebater
+rebathe
+rebato
+rebawl
+rebeamer
+rebear
+rebeat
+rebeautify
+rebec
+Rebecca
+Rebeccaism
+Rebeccaites
+rebeck
+rebecome
+rebed
+rebeg
+rebeget
+rebeggar
+rebegin
+rebeginner
+rebeginning
+rebeguile
+rebehold
+Rebekah
+rebel
+rebeldom
+rebelief
+rebelieve
+rebeller
+rebellike
+rebellion
+rebellious
+rebelliously
+rebelliousness
+rebellow
+rebelly
+rebelong
+rebelove
+rebelproof
+rebemire
+rebend
+rebenediction
+rebenefit
+rebeset
+rebesiege
+rebestow
+rebestowal
+rebetake
+rebetray
+rebewail
+rebia
+rebias
+rebid
+rebill
+rebillet
+rebilling
+rebind
+rebirth
+rebite
+reblade
+reblame
+reblast
+rebleach
+reblend
+rebless
+reblock
+rebloom
+reblossom
+reblot
+reblow
+reblue
+rebluff
+reblunder
+reboant
+reboantic
+reboard
+reboast
+rebob
+reboil
+reboiler
+reboise
+reboisement
+rebold
+rebolt
+rebone
+rebook
+rebop
+rebore
+reborn
+reborrow
+rebottle
+Reboulia
+rebounce
+rebound
+reboundable
+rebounder
+reboundingness
+rebourbonize
+rebox
+rebrace
+rebraid
+rebranch
+rebrand
+rebrandish
+rebreathe
+rebreed
+rebrew
+rebribe
+rebrick
+rebridge
+rebring
+rebringer
+rebroach
+rebroadcast
+rebronze
+rebrown
+rebrush
+rebrutalize
+rebubble
+rebuckle
+rebud
+rebudget
+rebuff
+rebuffable
+rebuffably
+rebuffet
+rebuffproof
+rebuild
+rebuilder
+rebuilt
+rebukable
+rebuke
+rebukeable
+rebukeful
+rebukefully
+rebukefulness
+rebukeproof
+rebuker
+rebukingly
+rebulk
+rebunch
+rebundle
+rebunker
+rebuoy
+rebuoyage
+reburden
+reburgeon
+reburial
+reburn
+reburnish
+reburst
+rebury
+rebus
+rebush
+rebusy
+rebut
+rebute
+rebutment
+rebuttable
+rebuttal
+rebutter
+rebutton
+rebuy
+recable
+recadency
+recage
+recalcination
+recalcine
+recalcitrance
+recalcitrant
+recalcitrate
+recalcitration
+recalculate
+recalculation
+recalesce
+recalescence
+recalescent
+recalibrate
+recalibration
+recalk
+recall
+recallable
+recallist
+recallment
+recampaign
+recancel
+recancellation
+recandescence
+recandidacy
+recant
+recantation
+recanter
+recantingly
+recanvas
+recap
+recapacitate
+recapitalization
+recapitalize
+recapitulate
+recapitulation
+recapitulationist
+recapitulative
+recapitulator
+recapitulatory
+recappable
+recapper
+recaption
+recaptivate
+recaptivation
+recaptor
+recapture
+recapturer
+recarbon
+recarbonate
+recarbonation
+recarbonization
+recarbonize
+recarbonizer
+recarburization
+recarburize
+recarburizer
+recarnify
+recarpet
+recarriage
+recarrier
+recarry
+recart
+recarve
+recase
+recash
+recasket
+recast
+recaster
+recasting
+recatalogue
+recatch
+recaulescence
+recausticize
+recce
+recco
+reccy
+recede
+recedence
+recedent
+receder
+receipt
+receiptable
+receiptless
+receiptor
+receipts
+receivability
+receivable
+receivables
+receivablness
+receival
+receive
+received
+receivedness
+receiver
+receivership
+recelebrate
+recelebration
+recement
+recementation
+recency
+recense
+recension
+recensionist
+recensor
+recensure
+recensus
+recent
+recenter
+recently
+recentness
+recentralization
+recentralize
+recentre
+recept
+receptacle
+receptacular
+receptaculite
+Receptaculites
+receptaculitid
+Receptaculitidae
+receptaculitoid
+receptaculum
+receptant
+receptibility
+receptible
+reception
+receptionism
+receptionist
+receptitious
+receptive
+receptively
+receptiveness
+receptivity
+receptor
+receptoral
+receptorial
+receptual
+receptually
+recercelee
+recertificate
+recertify
+recess
+recesser
+recession
+recessional
+recessionary
+recessive
+recessively
+recessiveness
+recesslike
+recessor
+Rechabite
+Rechabitism
+rechafe
+rechain
+rechal
+rechallenge
+rechamber
+rechange
+rechant
+rechaos
+rechar
+recharge
+recharter
+rechase
+rechaser
+rechasten
+rechaw
+recheat
+recheck
+recheer
+recherche
+rechew
+rechip
+rechisel
+rechoose
+rechristen
+rechuck
+rechurn
+recidivation
+recidive
+recidivism
+recidivist
+recidivistic
+recidivity
+recidivous
+recipe
+recipiangle
+recipience
+recipiency
+recipiend
+recipiendary
+recipient
+recipiomotor
+reciprocable
+reciprocal
+reciprocality
+reciprocalize
+reciprocally
+reciprocalness
+reciprocate
+reciprocation
+reciprocative
+reciprocator
+reciprocatory
+reciprocitarian
+reciprocity
+recircle
+recirculate
+recirculation
+recision
+recission
+recissory
+recitable
+recital
+recitalist
+recitatif
+recitation
+recitationalism
+recitationist
+recitative
+recitatively
+recitativical
+recitativo
+recite
+recitement
+reciter
+recivilization
+recivilize
+reck
+reckla
+reckless
+recklessly
+recklessness
+reckling
+reckon
+reckonable
+reckoner
+reckoning
+reclaim
+reclaimable
+reclaimableness
+reclaimably
+reclaimant
+reclaimer
+reclaimless
+reclaimment
+reclama
+reclamation
+reclang
+reclasp
+reclass
+reclassification
+reclassify
+reclean
+recleaner
+recleanse
+reclear
+reclearance
+reclimb
+reclinable
+reclinate
+reclinated
+reclination
+recline
+recliner
+reclose
+reclothe
+reclothing
+recluse
+reclusely
+recluseness
+reclusery
+reclusion
+reclusive
+reclusiveness
+reclusory
+recoach
+recoagulation
+recoal
+recoast
+recoat
+recock
+recoct
+recoction
+recode
+recodification
+recodify
+recogitate
+recogitation
+recognition
+recognitive
+recognitor
+recognitory
+recognizability
+recognizable
+recognizably
+recognizance
+recognizant
+recognize
+recognizedly
+recognizee
+recognizer
+recognizingly
+recognizor
+recognosce
+recohabitation
+recoil
+recoiler
+recoilingly
+recoilment
+recoin
+recoinage
+recoiner
+recoke
+recollapse
+recollate
+recollation
+Recollect
+recollectable
+recollected
+recollectedly
+recollectedness
+recollectible
+recollection
+recollective
+recollectively
+recollectiveness
+Recollet
+recolonization
+recolonize
+recolor
+recomb
+recombination
+recombine
+recomember
+recomfort
+recommand
+recommence
+recommencement
+recommencer
+recommend
+recommendability
+recommendable
+recommendableness
+recommendably
+recommendation
+recommendatory
+recommendee
+recommender
+recommission
+recommit
+recommitment
+recommittal
+recommunicate
+recommunion
+recompact
+recompare
+recomparison
+recompass
+recompel
+recompensable
+recompensate
+recompensation
+recompense
+recompenser
+recompensive
+recompete
+recompetition
+recompetitor
+recompilation
+recompile
+recompilement
+recomplain
+recomplaint
+recomplete
+recompletion
+recompliance
+recomplicate
+recomplication
+recomply
+recompose
+recomposer
+recomposition
+recompound
+recomprehend
+recomprehension
+recompress
+recompression
+recomputation
+recompute
+recon
+reconceal
+reconcealment
+reconcede
+reconceive
+reconcentrate
+reconcentration
+reconception
+reconcert
+reconcession
+reconcilability
+reconcilable
+reconcilableness
+reconcilably
+reconcile
+reconcilee
+reconcileless
+reconcilement
+reconciler
+reconciliability
+reconciliable
+reconciliate
+reconciliation
+reconciliative
+reconciliator
+reconciliatory
+reconciling
+reconcilingly
+reconclude
+reconclusion
+reconcoct
+reconcrete
+reconcur
+recondemn
+recondemnation
+recondensation
+recondense
+recondite
+reconditely
+reconditeness
+recondition
+recondole
+reconduct
+reconduction
+reconfer
+reconfess
+reconfide
+reconfine
+reconfinement
+reconfirm
+reconfirmation
+reconfiscate
+reconfiscation
+reconform
+reconfound
+reconfront
+reconfuse
+reconfusion
+recongeal
+recongelation
+recongest
+recongestion
+recongratulate
+recongratulation
+reconjoin
+reconjunction
+reconnaissance
+reconnect
+reconnection
+reconnoissance
+reconnoiter
+reconnoiterer
+reconnoiteringly
+reconnoitre
+reconnoitrer
+reconnoitringly
+reconquer
+reconqueror
+reconquest
+reconsecrate
+reconsecration
+reconsent
+reconsider
+reconsideration
+reconsign
+reconsignment
+reconsole
+reconsolidate
+reconsolidation
+reconstituent
+reconstitute
+reconstitution
+reconstruct
+reconstructed
+reconstruction
+reconstructional
+reconstructionary
+reconstructionist
+reconstructive
+reconstructiveness
+reconstructor
+reconstrue
+reconsult
+reconsultation
+recontact
+recontemplate
+recontemplation
+recontend
+recontest
+recontinuance
+recontinue
+recontract
+recontraction
+recontrast
+recontribute
+recontribution
+recontrivance
+recontrive
+recontrol
+reconvalesce
+reconvalescence
+reconvalescent
+reconvene
+reconvention
+reconventional
+reconverge
+reconverse
+reconversion
+reconvert
+reconvertible
+reconvey
+reconveyance
+reconvict
+reconviction
+reconvince
+reconvoke
+recook
+recool
+recooper
+recopper
+recopy
+recopyright
+record
+recordable
+recordant
+recordation
+recordative
+recordatively
+recordatory
+recordedly
+recorder
+recordership
+recording
+recordist
+recordless
+recork
+recorporification
+recorporify
+recorrect
+recorrection
+recorrupt
+recorruption
+recostume
+recounsel
+recount
+recountable
+recountal
+recountenance
+recounter
+recountless
+recoup
+recoupable
+recouper
+recouple
+recoupment
+recourse
+recover
+recoverability
+recoverable
+recoverableness
+recoverance
+recoveree
+recoverer
+recoveringly
+recoverless
+recoveror
+recovery
+recramp
+recrank
+recrate
+recreance
+recreancy
+recreant
+recreantly
+recreantness
+recrease
+recreate
+recreation
+recreational
+recreationist
+recreative
+recreatively
+recreativeness
+recreator
+recreatory
+recredit
+recrement
+recremental
+recrementitial
+recrementitious
+recrescence
+recrew
+recriminate
+recrimination
+recriminative
+recriminator
+recriminatory
+recriticize
+recroon
+recrop
+recross
+recrowd
+recrown
+recrucify
+recrudency
+recrudesce
+recrudescence
+recrudescency
+recrudescent
+recruit
+recruitable
+recruitage
+recruital
+recruitee
+recruiter
+recruithood
+recruiting
+recruitment
+recruity
+recrush
+recrusher
+recrystallization
+recrystallize
+rect
+recta
+rectal
+rectalgia
+rectally
+rectangle
+rectangled
+rectangular
+rectangularity
+rectangularly
+rectangularness
+rectangulate
+rectangulometer
+rectectomy
+recti
+rectifiable
+rectification
+rectificative
+rectificator
+rectificatory
+rectified
+rectifier
+rectify
+rectigrade
+Rectigraph
+rectilineal
+rectilineally
+rectilinear
+rectilinearism
+rectilinearity
+rectilinearly
+rectilinearness
+rectilineation
+rectinerved
+rection
+rectipetality
+rectirostral
+rectischiac
+rectiserial
+rectitic
+rectitis
+rectitude
+rectitudinous
+recto
+rectoabdominal
+rectocele
+rectoclysis
+rectococcygeal
+rectococcygeus
+rectocolitic
+rectocolonic
+rectocystotomy
+rectogenital
+rectopexy
+rectoplasty
+rector
+rectoral
+rectorate
+rectoress
+rectorial
+rectorrhaphy
+rectorship
+rectory
+rectoscope
+rectoscopy
+rectosigmoid
+rectostenosis
+rectostomy
+rectotome
+rectotomy
+rectovaginal
+rectovesical
+rectress
+rectricial
+rectrix
+rectum
+rectus
+recubant
+recubate
+recultivate
+recultivation
+recumbence
+recumbency
+recumbent
+recumbently
+recuperability
+recuperance
+recuperate
+recuperation
+recuperative
+recuperativeness
+recuperator
+recuperatory
+recur
+recure
+recureful
+recureless
+recurl
+recurrence
+recurrency
+recurrent
+recurrently
+recurrer
+recurring
+recurringly
+recurse
+recursion
+recursive
+recurtain
+recurvant
+recurvate
+recurvation
+recurvature
+recurve
+Recurvirostra
+recurvirostral
+Recurvirostridae
+recurvopatent
+recurvoternate
+recurvous
+recusance
+recusancy
+recusant
+recusation
+recusative
+recusator
+recuse
+recushion
+recussion
+recut
+recycle
+Red
+red
+redact
+redaction
+redactional
+redactor
+redactorial
+redamage
+redamnation
+redan
+redare
+redargue
+redargution
+redargutive
+redargutory
+redarken
+redarn
+redart
+redate
+redaub
+redawn
+redback
+redbait
+redbeard
+redbelly
+redberry
+redbill
+redbird
+redbone
+redbreast
+redbrush
+redbuck
+redbud
+redcap
+redcoat
+redd
+redden
+reddendo
+reddendum
+reddening
+redder
+redding
+reddingite
+reddish
+reddishness
+reddition
+reddleman
+reddock
+reddsman
+reddy
+rede
+redeal
+redebate
+redebit
+redeceive
+redecide
+redecimate
+redecision
+redeck
+redeclaration
+redeclare
+redecline
+redecorate
+redecoration
+redecrease
+redecussate
+rededicate
+rededication
+rededicatory
+rededuct
+rededuction
+redeed
+redeem
+redeemability
+redeemable
+redeemableness
+redeemably
+redeemer
+redeemeress
+redeemership
+redeemless
+redefault
+redefeat
+redefecate
+redefer
+redefiance
+redefine
+redefinition
+redeflect
+redefy
+redeify
+redelay
+redelegate
+redelegation
+redeliberate
+redeliberation
+redeliver
+redeliverance
+redeliverer
+redelivery
+redemand
+redemandable
+redemise
+redemolish
+redemonstrate
+redemonstration
+redemptible
+Redemptine
+redemption
+redemptional
+redemptioner
+Redemptionist
+redemptionless
+redemptive
+redemptively
+redemptor
+redemptorial
+Redemptorist
+redemptory
+redemptress
+redemptrice
+redenigrate
+redeny
+redepend
+redeploy
+redeployment
+redeposit
+redeposition
+redepreciate
+redepreciation
+redeprive
+rederivation
+redescend
+redescent
+redescribe
+redescription
+redesertion
+redeserve
+redesign
+redesignate
+redesignation
+redesire
+redesirous
+redesman
+redespise
+redetect
+redetention
+redetermination
+redetermine
+redevelop
+redeveloper
+redevelopment
+redevise
+redevote
+redevotion
+redeye
+redfin
+redfinch
+redfish
+redfoot
+redhead
+redheaded
+redheadedly
+redheadedness
+redhearted
+redhibition
+redhibitory
+redhoop
+redia
+redictate
+redictation
+redient
+redifferentiate
+redifferentiation
+redig
+redigest
+redigestion
+rediminish
+redingote
+redintegrate
+redintegration
+redintegrative
+redintegrator
+redip
+redipper
+redirect
+redirection
+redisable
+redisappear
+redisburse
+redisbursement
+redischarge
+rediscipline
+rediscount
+rediscourage
+rediscover
+rediscoverer
+rediscovery
+rediscuss
+rediscussion
+redisembark
+redismiss
+redispatch
+redispel
+redisperse
+redisplay
+redispose
+redisposition
+redispute
+redissect
+redissection
+redisseise
+redisseisin
+redisseisor
+redisseize
+redisseizin
+redisseizor
+redissoluble
+redissolution
+redissolvable
+redissolve
+redistend
+redistill
+redistillation
+redistiller
+redistinguish
+redistrain
+redistrainer
+redistribute
+redistributer
+redistribution
+redistributive
+redistributor
+redistributory
+redistrict
+redisturb
+redive
+rediversion
+redivert
+redivertible
+redivide
+redivision
+redivive
+redivivous
+redivivus
+redivorce
+redivorcement
+redivulge
+redivulgence
+redjacket
+redknees
+redleg
+redlegs
+redly
+redmouth
+redness
+redo
+redock
+redocket
+redolence
+redolency
+redolent
+redolently
+redominate
+redondilla
+redoom
+redouble
+redoublement
+redoubler
+redoubling
+redoubt
+redoubtable
+redoubtableness
+redoubtably
+redoubted
+redound
+redowa
+redox
+redpoll
+redraft
+redrag
+redrape
+redraw
+redrawer
+redream
+redredge
+redress
+redressable
+redressal
+redresser
+redressible
+redressive
+redressless
+redressment
+redressor
+redrill
+redrive
+redroot
+redry
+redsear
+redshank
+redshirt
+redskin
+redstart
+redstreak
+redtab
+redtail
+redthroat
+redtop
+redub
+redubber
+reduce
+reduceable
+reduceableness
+reduced
+reducement
+reducent
+reducer
+reducibility
+reducible
+reducibleness
+reducibly
+reducing
+reduct
+reductant
+reductase
+reductibility
+reduction
+reductional
+reductionism
+reductionist
+reductionistic
+reductive
+reductively
+reductor
+reductorial
+redue
+Redunca
+redundance
+redundancy
+redundant
+redundantly
+reduplicate
+reduplication
+reduplicative
+reduplicatively
+reduplicatory
+reduplicature
+reduviid
+Reduviidae
+reduvioid
+Reduvius
+redux
+redward
+redware
+redweed
+redwing
+redwithe
+redwood
+redye
+Ree
+ree
+reechy
+reed
+reedbird
+reedbuck
+reedbush
+reeded
+reeden
+reeder
+reediemadeasy
+reedily
+reediness
+reeding
+reedish
+reedition
+reedless
+reedlike
+reedling
+reedmaker
+reedmaking
+reedman
+reedplot
+reedwork
+reedy
+reef
+reefable
+reefer
+reefing
+reefy
+reek
+reeker
+reekingly
+reeky
+reel
+reelable
+reeled
+reeler
+reelingly
+reelrall
+reem
+reeming
+reemish
+reen
+reenge
+reeper
+Rees
+reese
+reeshle
+reesk
+reesle
+reest
+reester
+reestle
+reesty
+reet
+reetam
+reetle
+reeve
+reeveland
+reeveship
+ref
+reface
+refacilitate
+refall
+refallow
+refan
+refascinate
+refascination
+refashion
+refashioner
+refashionment
+refasten
+refathered
+refavor
+refect
+refection
+refectionary
+refectioner
+refective
+refectorarian
+refectorary
+refectorer
+refectorial
+refectorian
+refectory
+refederate
+refeed
+refeel
+refeign
+refel
+refence
+refer
+referable
+referee
+reference
+referenda
+referendal
+referendary
+referendaryship
+referendum
+referent
+referential
+referentially
+referently
+referment
+referral
+referrer
+referrible
+referribleness
+refertilization
+refertilize
+refetch
+refight
+refigure
+refill
+refillable
+refilm
+refilter
+refinable
+refinage
+refinance
+refind
+refine
+refined
+refinedly
+refinedness
+refinement
+refiner
+refinery
+refinger
+refining
+refiningly
+refinish
+refire
+refit
+refitment
+refix
+refixation
+refixture
+reflag
+reflagellate
+reflame
+reflash
+reflate
+reflation
+reflationism
+reflect
+reflectance
+reflected
+reflectedly
+reflectedness
+reflectent
+reflecter
+reflectibility
+reflectible
+reflecting
+reflectingly
+reflection
+reflectional
+reflectionist
+reflectionless
+reflective
+reflectively
+reflectiveness
+reflectivity
+reflectometer
+reflectometry
+reflector
+reflectoscope
+refledge
+reflee
+reflex
+reflexed
+reflexibility
+reflexible
+reflexism
+reflexive
+reflexively
+reflexiveness
+reflexivity
+reflexly
+reflexness
+reflexogenous
+reflexological
+reflexologist
+reflexology
+refling
+refloat
+refloatation
+reflog
+reflood
+refloor
+reflorescence
+reflorescent
+reflourish
+reflourishment
+reflow
+reflower
+refluctuation
+refluence
+refluency
+refluent
+reflush
+reflux
+refluxed
+refly
+refocillate
+refocillation
+refocus
+refold
+refoment
+refont
+refool
+refoot
+reforbid
+reforce
+reford
+reforecast
+reforest
+reforestation
+reforestization
+reforestize
+reforestment
+reforfeit
+reforfeiture
+reforge
+reforger
+reforget
+reforgive
+reform
+reformability
+reformable
+reformableness
+reformado
+reformandum
+Reformati
+reformation
+reformational
+reformationary
+reformationist
+reformative
+reformatively
+reformatness
+reformatory
+reformed
+reformedly
+reformer
+reformeress
+reformingly
+reformism
+reformist
+reformistic
+reformproof
+reformulate
+reformulation
+reforsake
+refortification
+refortify
+reforward
+refound
+refoundation
+refounder
+refract
+refractable
+refracted
+refractedly
+refractedness
+refractile
+refractility
+refracting
+refraction
+refractional
+refractionate
+refractionist
+refractive
+refractively
+refractiveness
+refractivity
+refractometer
+refractometric
+refractometry
+refractor
+refractorily
+refractoriness
+refractory
+refracture
+refragability
+refragable
+refragableness
+refrain
+refrainer
+refrainment
+reframe
+refrangent
+refrangibility
+refrangible
+refrangibleness
+refreeze
+refrenation
+refrenzy
+refresh
+refreshant
+refreshen
+refreshener
+refresher
+refreshful
+refreshfully
+refreshing
+refreshingly
+refreshingness
+refreshment
+refrigerant
+refrigerate
+refrigerating
+refrigeration
+refrigerative
+refrigerator
+refrigeratory
+refrighten
+refringence
+refringency
+refringent
+refront
+refrustrate
+reft
+refuel
+refueling
+refuge
+refugee
+refugeeism
+refugeeship
+refulge
+refulgence
+refulgency
+refulgent
+refulgently
+refulgentness
+refunction
+refund
+refunder
+refundment
+refurbish
+refurbishment
+refurl
+refurnish
+refurnishment
+refusable
+refusal
+refuse
+refuser
+refusing
+refusingly
+refusion
+refusive
+refutability
+refutable
+refutably
+refutal
+refutation
+refutative
+refutatory
+refute
+refuter
+reg
+regain
+regainable
+regainer
+regainment
+regal
+regale
+Regalecidae
+Regalecus
+regalement
+regaler
+regalia
+regalian
+regalism
+regalist
+regality
+regalize
+regallop
+regally
+regalness
+regalvanization
+regalvanize
+regard
+regardable
+regardance
+regardancy
+regardant
+regarder
+regardful
+regardfully
+regardfulness
+regarding
+regardless
+regardlessly
+regardlessness
+regarment
+regarnish
+regarrison
+regather
+regatta
+regauge
+regelate
+regelation
+regency
+regeneracy
+regenerance
+regenerant
+regenerate
+regenerateness
+regeneration
+regenerative
+regeneratively
+regenerator
+regeneratory
+regeneratress
+regeneratrix
+regenesis
+regent
+regental
+regentess
+regentship
+regerminate
+regermination
+reges
+reget
+Regga
+Reggie
+regia
+regicidal
+regicide
+regicidism
+regift
+regifuge
+regild
+regill
+regime
+regimen
+regimenal
+regiment
+regimental
+regimentaled
+regimentalled
+regimentally
+regimentals
+regimentary
+regimentation
+regiminal
+regin
+reginal
+Reginald
+region
+regional
+regionalism
+regionalist
+regionalistic
+regionalization
+regionalize
+regionally
+regionary
+regioned
+register
+registered
+registerer
+registership
+registrability
+registrable
+registral
+registrant
+registrar
+registrarship
+registrary
+registrate
+registration
+registrational
+registrationist
+registrator
+registrer
+registry
+regive
+regladden
+reglair
+reglaze
+regle
+reglement
+reglementary
+reglementation
+reglementist
+reglet
+reglorified
+regloss
+reglove
+reglow
+reglue
+regma
+regmacarp
+regnal
+regnancy
+regnant
+regnerable
+regolith
+regorge
+regovern
+regradation
+regrade
+regraduate
+regraduation
+regraft
+regrant
+regrasp
+regrass
+regrate
+regrater
+regratification
+regratify
+regrating
+regratingly
+regrator
+regratress
+regravel
+regrede
+regreen
+regreet
+regress
+regression
+regressionist
+regressive
+regressively
+regressiveness
+regressivity
+regressor
+regret
+regretful
+regretfully
+regretfulness
+regretless
+regrettable
+regrettableness
+regrettably
+regretter
+regrettingly
+regrind
+regrinder
+regrip
+regroup
+regroupment
+regrow
+regrowth
+reguarantee
+reguard
+reguardant
+reguide
+regula
+regulable
+regular
+Regulares
+Regularia
+regularity
+regularization
+regularize
+regularizer
+regularly
+regularness
+regulatable
+regulate
+regulated
+regulation
+regulationist
+regulative
+regulatively
+regulator
+regulatorship
+regulatory
+regulatress
+regulatris
+reguli
+reguline
+regulize
+Regulus
+regulus
+regur
+regurge
+regurgitant
+regurgitate
+regurgitation
+regush
+reh
+rehabilitate
+rehabilitation
+rehabilitative
+rehair
+rehale
+rehallow
+rehammer
+rehandicap
+rehandle
+rehandler
+rehandling
+rehang
+rehappen
+reharden
+reharm
+reharmonize
+reharness
+reharrow
+reharvest
+rehash
+rehaul
+rehazard
+rehead
+reheal
+reheap
+rehear
+rehearing
+rehearsal
+rehearse
+rehearser
+rehearten
+reheat
+reheater
+Reheboth
+rehedge
+reheel
+reheighten
+Rehoboam
+Rehoboth
+Rehobothan
+rehoe
+rehoist
+rehollow
+rehonor
+rehonour
+rehood
+rehook
+rehoop
+rehouse
+rehumanize
+rehumble
+rehumiliate
+rehumiliation
+rehung
+rehybridize
+rehydrate
+rehydration
+rehypothecate
+rehypothecation
+rehypothecator
+reichsgulden
+Reichsland
+Reichslander
+reichsmark
+reichspfennig
+reichstaler
+Reid
+reidentification
+reidentify
+reif
+reification
+reify
+reign
+reignite
+reignition
+reignore
+reillume
+reilluminate
+reillumination
+reillumine
+reillustrate
+reillustration
+reim
+reimage
+reimagination
+reimagine
+reimbark
+reimbarkation
+reimbibe
+reimbody
+reimbursable
+reimburse
+reimbursement
+reimburser
+reimbush
+reimbushment
+reimkennar
+reimmerge
+reimmerse
+reimmersion
+reimmigrant
+reimmigration
+reimpact
+reimpark
+reimpart
+reimpatriate
+reimpatriation
+reimpel
+reimplant
+reimplantation
+reimply
+reimport
+reimportation
+reimportune
+reimpose
+reimposition
+reimposure
+reimpregnate
+reimpress
+reimpression
+reimprint
+reimprison
+reimprisonment
+reimprove
+reimprovement
+reimpulse
+rein
+reina
+reinability
+reinaugurate
+reinauguration
+reincapable
+reincarnadine
+reincarnate
+reincarnation
+reincarnationism
+reincarnationist
+reincense
+reincentive
+reincidence
+reincidency
+reincite
+reinclination
+reincline
+reinclude
+reinclusion
+reincorporate
+reincorporation
+reincrease
+reincrudate
+reincrudation
+reinculcate
+reincur
+reindebted
+reindebtedness
+reindeer
+reindependence
+reindicate
+reindication
+reindict
+reindictment
+reindifferent
+reindorse
+reinduce
+reinducement
+reindue
+reindulge
+reindulgence
+Reiner
+reinette
+reinfect
+reinfection
+reinfectious
+reinfer
+reinfest
+reinfestation
+reinflame
+reinflate
+reinflation
+reinflict
+reinfliction
+reinfluence
+reinforce
+reinforcement
+reinforcer
+reinform
+reinfuse
+reinfusion
+reingraft
+reingratiate
+reingress
+reinhabit
+reinhabitation
+Reinhard
+reinherit
+reinitiate
+reinitiation
+reinject
+reinjure
+reinless
+reinoculate
+reinoculation
+reinquire
+reinquiry
+reins
+reinsane
+reinsanity
+reinscribe
+reinsert
+reinsertion
+reinsist
+reinsman
+reinspect
+reinspection
+reinspector
+reinsphere
+reinspiration
+reinspire
+reinspirit
+reinstall
+reinstallation
+reinstallment
+reinstalment
+reinstate
+reinstatement
+reinstation
+reinstator
+reinstauration
+reinstil
+reinstill
+reinstitute
+reinstitution
+reinstruct
+reinstruction
+reinsult
+reinsurance
+reinsure
+reinsurer
+reintegrate
+reintegration
+reintend
+reinter
+reintercede
+reintercession
+reinterchange
+reinterest
+reinterfere
+reinterference
+reinterment
+reinterpret
+reinterpretation
+reinterrogate
+reinterrogation
+reinterrupt
+reinterruption
+reintervene
+reintervention
+reinterview
+reinthrone
+reintimate
+reintimation
+reintitule
+reintrench
+reintroduce
+reintroduction
+reintrude
+reintrusion
+reintuition
+reintuitive
+reinvade
+reinvasion
+reinvent
+reinvention
+reinventor
+reinversion
+reinvert
+reinvest
+reinvestigate
+reinvestigation
+reinvestiture
+reinvestment
+reinvigorate
+reinvigoration
+reinvitation
+reinvite
+reinvoice
+reinvolve
+Reinwardtia
+reirrigate
+reirrigation
+reis
+reisolation
+reissuable
+reissue
+reissuement
+reissuer
+reit
+reitbok
+reitbuck
+reitemize
+reiter
+reiterable
+reiterance
+reiterant
+reiterate
+reiterated
+reiteratedly
+reiteratedness
+reiteration
+reiterative
+reiteratively
+reiver
+rejail
+Rejang
+reject
+rejectable
+rejectableness
+rejectage
+rejectamenta
+rejecter
+rejectingly
+rejection
+rejective
+rejectment
+rejector
+rejerk
+rejoice
+rejoiceful
+rejoicement
+rejoicer
+rejoicing
+rejoicingly
+rejoin
+rejoinder
+rejolt
+rejourney
+rejudge
+rejumble
+rejunction
+rejustification
+rejustify
+rejuvenant
+rejuvenate
+rejuvenation
+rejuvenative
+rejuvenator
+rejuvenesce
+rejuvenescence
+rejuvenescent
+rejuvenize
+Reki
+rekick
+rekill
+rekindle
+rekindlement
+rekindler
+reking
+rekiss
+reknit
+reknow
+rel
+relabel
+relace
+relacquer
+relade
+reladen
+relais
+relament
+relamp
+reland
+relap
+relapper
+relapsable
+relapse
+relapseproof
+relapser
+relapsing
+relast
+relaster
+relata
+relatability
+relatable
+relatch
+relate
+related
+relatedness
+relater
+relatinization
+relation
+relational
+relationality
+relationally
+relationary
+relationism
+relationist
+relationless
+relationship
+relatival
+relative
+relatively
+relativeness
+relativism
+relativist
+relativistic
+relativity
+relativization
+relativize
+relator
+relatrix
+relatum
+relaunch
+relax
+relaxable
+relaxant
+relaxation
+relaxative
+relaxatory
+relaxed
+relaxedly
+relaxedness
+relaxer
+relay
+relayman
+relbun
+relead
+releap
+relearn
+releasable
+release
+releasee
+releasement
+releaser
+releasor
+releather
+relection
+relegable
+relegate
+relegation
+relend
+relent
+relenting
+relentingly
+relentless
+relentlessly
+relentlessness
+relentment
+relessee
+relessor
+relet
+reletter
+relevance
+relevancy
+relevant
+relevantly
+relevate
+relevation
+relevator
+relevel
+relevy
+reliability
+reliable
+reliableness
+reliably
+reliance
+reliant
+reliantly
+reliberate
+relic
+relicary
+relicense
+relick
+reliclike
+relicmonger
+relict
+relicted
+reliction
+relief
+reliefless
+relier
+relievable
+relieve
+relieved
+relievedly
+reliever
+relieving
+relievingly
+relievo
+relift
+religate
+religation
+relight
+relightable
+relighten
+relightener
+relighter
+religion
+religionary
+religionate
+religioner
+religionism
+religionist
+religionistic
+religionize
+religionless
+religiose
+religiosity
+religious
+religiously
+religiousness
+relime
+relimit
+relimitation
+reline
+reliner
+relink
+relinquent
+relinquish
+relinquisher
+relinquishment
+reliquaire
+reliquary
+reliquefy
+reliquiae
+reliquian
+reliquidate
+reliquidation
+reliquism
+relish
+relishable
+relisher
+relishing
+relishingly
+relishsome
+relishy
+relist
+relisten
+relitigate
+relive
+Rellyan
+Rellyanism
+Rellyanite
+reload
+reloan
+relocable
+relocate
+relocation
+relocator
+relock
+relodge
+relook
+relose
+relost
+relot
+relove
+relower
+relucent
+reluct
+reluctance
+reluctancy
+reluctant
+reluctantly
+reluctate
+reluctation
+reluctivity
+relume
+relumine
+rely
+remade
+remagnetization
+remagnetize
+remagnification
+remagnify
+remail
+remain
+remainder
+remainderman
+remaindership
+remainer
+remains
+remaintain
+remaintenance
+remake
+remaker
+reman
+remanage
+remanagement
+remanation
+remancipate
+remancipation
+remand
+remandment
+remanence
+remanency
+remanent
+remanet
+remanipulate
+remanipulation
+remantle
+remanufacture
+remanure
+remap
+remarch
+remargin
+remark
+remarkability
+remarkable
+remarkableness
+remarkably
+remarkedly
+remarker
+remarket
+remarque
+remarriage
+remarry
+remarshal
+remask
+remass
+remast
+remasticate
+remastication
+rematch
+rematerialize
+remble
+Rembrandt
+Rembrandtesque
+Rembrandtish
+Rembrandtism
+remeant
+remeasure
+remeasurement
+remede
+remediable
+remediableness
+remediably
+remedial
+remedially
+remediation
+remediless
+remedilessly
+remedilessness
+remeditate
+remeditation
+remedy
+remeet
+remelt
+remember
+rememberability
+rememberable
+rememberably
+rememberer
+remembrance
+remembrancer
+remembrancership
+rememorize
+remenace
+remend
+remerge
+remetal
+remex
+Remi
+remica
+remicate
+remication
+remicle
+remiform
+remigate
+remigation
+remiges
+remigial
+remigrant
+remigrate
+remigration
+Remijia
+remilitarization
+remilitarize
+remill
+remimic
+remind
+remindal
+reminder
+remindful
+remindingly
+remineralization
+remineralize
+remingle
+reminisce
+reminiscence
+reminiscenceful
+reminiscencer
+reminiscency
+reminiscent
+reminiscential
+reminiscentially
+reminiscently
+reminiscer
+reminiscitory
+remint
+remiped
+remirror
+remise
+remisrepresent
+remisrepresentation
+remiss
+remissful
+remissibility
+remissible
+remissibleness
+remission
+remissive
+remissively
+remissiveness
+remissly
+remissness
+remissory
+remisunderstand
+remit
+remitment
+remittable
+remittal
+remittance
+remittancer
+remittee
+remittence
+remittency
+remittent
+remittently
+remitter
+remittitur
+remittor
+remix
+remixture
+remnant
+remnantal
+remobilization
+remobilize
+Remoboth
+remock
+remodel
+remodeler
+remodeller
+remodelment
+remodification
+remodify
+remolade
+remold
+remollient
+remonetization
+remonetize
+remonstrance
+remonstrant
+remonstrantly
+remonstrate
+remonstrating
+remonstratingly
+remonstration
+remonstrative
+remonstratively
+remonstrator
+remonstratory
+remontado
+remontant
+remontoir
+remop
+remora
+remord
+remorse
+remorseful
+remorsefully
+remorsefulness
+remorseless
+remorselessly
+remorselessness
+remorseproof
+remortgage
+remote
+remotely
+remoteness
+remotion
+remotive
+remould
+remount
+removability
+removable
+removableness
+removably
+removal
+remove
+removed
+removedly
+removedness
+removement
+remover
+removing
+remultiplication
+remultiply
+remunerability
+remunerable
+remunerably
+remunerate
+remuneration
+remunerative
+remuneratively
+remunerativeness
+remunerator
+remuneratory
+remurmur
+Remus
+remuster
+remutation
+renable
+renably
+renail
+Renaissance
+renaissance
+Renaissancist
+Renaissant
+renal
+rename
+Renardine
+renascence
+renascency
+renascent
+renascible
+renascibleness
+renature
+renavigate
+renavigation
+rencontre
+rencounter
+renculus
+rend
+render
+renderable
+renderer
+rendering
+renderset
+rendezvous
+rendibility
+rendible
+rendition
+rendlewood
+rendrock
+rendzina
+reneague
+Renealmia
+renecessitate
+reneg
+renegade
+renegadism
+renegado
+renegation
+renege
+reneger
+reneglect
+renegotiable
+renegotiate
+renegotiation
+renegotiations
+renegue
+renerve
+renes
+renet
+renew
+renewability
+renewable
+renewably
+renewal
+renewedly
+renewedness
+renewer
+renewment
+renicardiac
+renickel
+renidification
+renidify
+reniform
+Renilla
+Renillidae
+renin
+renipericardial
+reniportal
+renipuncture
+renish
+renishly
+renitence
+renitency
+renitent
+renk
+renky
+renne
+rennet
+renneting
+rennin
+renniogen
+renocutaneous
+renogastric
+renography
+renointestinal
+renominate
+renomination
+renopericardial
+renopulmonary
+renormalize
+renotation
+renotice
+renotification
+renotify
+renounce
+renounceable
+renouncement
+renouncer
+renourish
+renovate
+renovater
+renovatingly
+renovation
+renovative
+renovator
+renovatory
+renovize
+renown
+renowned
+renownedly
+renownedness
+renowner
+renownful
+renownless
+rensselaerite
+rent
+rentability
+rentable
+rentage
+rental
+rentaler
+rentaller
+rented
+rentee
+renter
+rentless
+rentrant
+rentrayeuse
+Renu
+renumber
+renumerate
+renumeration
+renunciable
+renunciance
+renunciant
+renunciate
+renunciation
+renunciative
+renunciator
+renunciatory
+renunculus
+renverse
+renvoi
+renvoy
+reobject
+reobjectivization
+reobjectivize
+reobligate
+reobligation
+reoblige
+reobscure
+reobservation
+reobserve
+reobtain
+reobtainable
+reobtainment
+reoccasion
+reoccupation
+reoccupy
+reoccur
+reoccurrence
+reoffend
+reoffense
+reoffer
+reoffset
+reoil
+reometer
+reomission
+reomit
+reopen
+reoperate
+reoperation
+reoppose
+reopposition
+reoppress
+reoppression
+reorchestrate
+reordain
+reorder
+reordinate
+reordination
+reorganization
+reorganizationist
+reorganize
+reorganizer
+reorient
+reorientation
+reornament
+reoutfit
+reoutline
+reoutput
+reoutrage
+reovercharge
+reoverflow
+reovertake
+reoverwork
+reown
+reoxidation
+reoxidize
+reoxygenate
+reoxygenize
+rep
+repace
+repacification
+repacify
+repack
+repackage
+repacker
+repaganization
+repaganize
+repaganizer
+repage
+repaint
+repair
+repairable
+repairableness
+repairer
+repairman
+repale
+repand
+repandly
+repandodentate
+repandodenticulate
+repandolobate
+repandous
+repandousness
+repanel
+repaper
+reparability
+reparable
+reparably
+reparagraph
+reparate
+reparation
+reparative
+reparatory
+repark
+repartable
+repartake
+repartee
+reparticipate
+reparticipation
+repartition
+repartitionable
+repass
+repassable
+repassage
+repasser
+repast
+repaste
+repasture
+repatch
+repatency
+repatent
+repatriable
+repatriate
+repatriation
+repatronize
+repattern
+repave
+repavement
+repawn
+repay
+repayable
+repayal
+repaying
+repayment
+repeal
+repealability
+repealable
+repealableness
+repealer
+repealist
+repealless
+repeat
+repeatability
+repeatable
+repeatal
+repeated
+repeatedly
+repeater
+repeg
+repel
+repellance
+repellant
+repellence
+repellency
+repellent
+repellently
+repeller
+repelling
+repellingly
+repellingness
+repen
+repenetrate
+repension
+repent
+repentable
+repentance
+repentant
+repentantly
+repenter
+repentingly
+repeople
+reperceive
+repercept
+reperception
+repercolation
+repercuss
+repercussion
+repercussive
+repercussively
+repercussiveness
+repercutient
+reperform
+reperformance
+reperfume
+reperible
+repermission
+repermit
+reperplex
+repersonalization
+repersonalize
+repersuade
+repersuasion
+repertoire
+repertorial
+repertorily
+repertorium
+repertory
+reperusal
+reperuse
+repetend
+repetition
+repetitional
+repetitionary
+repetitious
+repetitiously
+repetitiousness
+repetitive
+repetitively
+repetitiveness
+repetitory
+repetticoat
+repew
+Rephael
+rephase
+rephonate
+rephosphorization
+rephosphorize
+rephotograph
+rephrase
+repic
+repick
+repicture
+repiece
+repile
+repin
+repine
+repineful
+repinement
+repiner
+repiningly
+repipe
+repique
+repitch
+repkie
+replace
+replaceability
+replaceable
+replacement
+replacer
+replait
+replan
+replane
+replant
+replantable
+replantation
+replanter
+replaster
+replate
+replay
+replead
+repleader
+repleat
+repledge
+repledger
+replenish
+replenisher
+replenishingly
+replenishment
+replete
+repletely
+repleteness
+repletion
+repletive
+repletively
+repletory
+repleviable
+replevin
+replevisable
+replevisor
+replevy
+repliant
+replica
+replicate
+replicated
+replicatile
+replication
+replicative
+replicatively
+replicatory
+replier
+replight
+replod
+replot
+replotment
+replotter
+replough
+replow
+replum
+replume
+replunder
+replunge
+reply
+replyingly
+repocket
+repoint
+repolish
+repoll
+repollute
+repolon
+repolymerization
+repolymerize
+reponder
+repone
+repope
+repopulate
+repopulation
+report
+reportable
+reportage
+reportedly
+reporter
+reporteress
+reporterism
+reportership
+reportingly
+reportion
+reportorial
+reportorially
+reposal
+repose
+reposed
+reposedly
+reposedness
+reposeful
+reposefully
+reposefulness
+reposer
+reposit
+repositary
+reposition
+repositor
+repository
+repossess
+repossession
+repossessor
+repost
+repostpone
+repot
+repound
+repour
+repowder
+repp
+repped
+repractice
+repray
+repreach
+reprecipitate
+reprecipitation
+repredict
+reprefer
+reprehend
+reprehendable
+reprehendatory
+reprehender
+reprehensibility
+reprehensible
+reprehensibleness
+reprehensibly
+reprehension
+reprehensive
+reprehensively
+reprehensory
+repreparation
+reprepare
+represcribe
+represent
+representability
+representable
+representamen
+representant
+representation
+representational
+representationalism
+representationalist
+representationary
+representationism
+representationist
+representative
+representatively
+representativeness
+representativeship
+representativity
+representer
+representment
+represide
+repress
+repressed
+repressedly
+represser
+repressible
+repressibly
+repression
+repressionary
+repressionist
+repressive
+repressively
+repressiveness
+repressment
+repressor
+repressory
+repressure
+reprice
+reprieval
+reprieve
+repriever
+reprimand
+reprimander
+reprimanding
+reprimandingly
+reprime
+reprimer
+reprint
+reprinter
+reprisal
+reprisalist
+reprise
+repristinate
+repristination
+reprivatization
+reprivatize
+reprivilege
+reproach
+reproachable
+reproachableness
+reproachably
+reproacher
+reproachful
+reproachfully
+reproachfulness
+reproachingly
+reproachless
+reproachlessness
+reprobacy
+reprobance
+reprobate
+reprobateness
+reprobater
+reprobation
+reprobationary
+reprobationer
+reprobative
+reprobatively
+reprobator
+reprobatory
+reproceed
+reprocess
+reproclaim
+reproclamation
+reprocurable
+reprocure
+reproduce
+reproduceable
+reproducer
+reproducibility
+reproducible
+reproduction
+reproductionist
+reproductive
+reproductively
+reproductiveness
+reproductivity
+reproductory
+reprofane
+reprofess
+reprohibit
+repromise
+repromulgate
+repromulgation
+repronounce
+repronunciation
+reproof
+reproofless
+repropagate
+repropitiate
+repropitiation
+reproportion
+reproposal
+repropose
+reprosecute
+reprosecution
+reprosper
+reprotect
+reprotection
+reprotest
+reprovable
+reprovableness
+reprovably
+reproval
+reprove
+reprover
+reprovide
+reprovingly
+reprovision
+reprovocation
+reprovoke
+reprune
+reps
+reptant
+reptatorial
+reptatory
+reptile
+reptiledom
+reptilelike
+reptilferous
+Reptilia
+reptilian
+reptiliary
+reptiliform
+reptilious
+reptiliousness
+reptilism
+reptility
+reptilivorous
+reptiloid
+republic
+republican
+republicanism
+republicanization
+republicanize
+republicanizer
+republication
+republish
+republisher
+republishment
+repuddle
+repudiable
+repudiate
+repudiation
+repudiationist
+repudiative
+repudiator
+repudiatory
+repuff
+repugn
+repugnable
+repugnance
+repugnancy
+repugnant
+repugnantly
+repugnantness
+repugnate
+repugnatorial
+repugner
+repullulate
+repullulation
+repullulative
+repullulescent
+repulpit
+repulse
+repulseless
+repulseproof
+repulser
+repulsion
+repulsive
+repulsively
+repulsiveness
+repulsory
+repulverize
+repump
+repunish
+repunishment
+repurchase
+repurchaser
+repurge
+repurification
+repurify
+repurple
+repurpose
+repursue
+repursuit
+reputability
+reputable
+reputableness
+reputably
+reputation
+reputationless
+reputative
+reputatively
+repute
+reputed
+reputedly
+reputeless
+requalification
+requalify
+requarantine
+requeen
+requench
+request
+requester
+requestion
+requiem
+Requienia
+requiescence
+requin
+requirable
+require
+requirement
+requirer
+requisite
+requisitely
+requisiteness
+requisition
+requisitionary
+requisitioner
+requisitionist
+requisitor
+requisitorial
+requisitory
+requit
+requitable
+requital
+requitative
+requite
+requiteful
+requitement
+requiter
+requiz
+requotation
+requote
+rerack
+reracker
+reradiation
+rerail
+reraise
+rerake
+rerank
+rerate
+reread
+rereader
+rerebrace
+reredos
+reree
+rereel
+rereeve
+rerefief
+reregister
+reregistration
+reregulate
+reregulation
+rereign
+reremouse
+rerent
+rerental
+reresupper
+rerig
+rering
+rerise
+rerival
+rerivet
+rerob
+rerobe
+reroll
+reroof
+reroot
+rerope
+reroute
+rerow
+reroyalize
+rerub
+rerummage
+rerun
+resaca
+resack
+resacrifice
+resaddle
+resail
+resalable
+resale
+resalt
+resalutation
+resalute
+resalvage
+resample
+resanctify
+resanction
+resatisfaction
+resatisfy
+resaw
+resawer
+resawyer
+resay
+resazurin
+rescan
+reschedule
+rescind
+rescindable
+rescinder
+rescindment
+rescissible
+rescission
+rescissory
+rescore
+rescramble
+rescratch
+rescribe
+rescript
+rescription
+rescriptive
+rescriptively
+rescrub
+rescuable
+rescue
+rescueless
+rescuer
+reseal
+reseam
+research
+researcher
+researchful
+researchist
+reseat
+resecrete
+resecretion
+resect
+resection
+resectional
+Reseda
+reseda
+Resedaceae
+resedaceous
+resee
+reseed
+reseek
+resegment
+resegmentation
+reseise
+reseiser
+reseize
+reseizer
+reseizure
+reselect
+reselection
+reself
+resell
+reseller
+resemblable
+resemblance
+resemblant
+resemble
+resembler
+resemblingly
+reseminate
+resend
+resene
+resensation
+resensitization
+resensitize
+resent
+resentationally
+resentence
+resenter
+resentful
+resentfullness
+resentfully
+resentience
+resentingly
+resentless
+resentment
+resepulcher
+resequent
+resequester
+resequestration
+reserene
+reservable
+reserval
+reservation
+reservationist
+reservatory
+reserve
+reserved
+reservedly
+reservedness
+reservee
+reserveful
+reserveless
+reserver
+reservery
+reservice
+reservist
+reservoir
+reservor
+reset
+resettable
+resetter
+resettle
+resettlement
+resever
+resew
+resex
+resh
+reshake
+reshape
+reshare
+resharpen
+reshave
+reshear
+reshearer
+resheathe
+reshelve
+reshift
+reshine
+reshingle
+reship
+reshipment
+reshipper
+reshoe
+reshoot
+reshoulder
+reshovel
+reshower
+reshrine
+reshuffle
+reshun
+reshunt
+reshut
+reshuttle
+resiccate
+reside
+residence
+residencer
+residency
+resident
+residental
+residenter
+residential
+residentiality
+residentially
+residentiary
+residentiaryship
+residentship
+resider
+residua
+residual
+residuary
+residuation
+residue
+residuent
+residuous
+residuum
+resift
+resigh
+resign
+resignal
+resignatary
+resignation
+resignationism
+resigned
+resignedly
+resignedness
+resignee
+resigner
+resignful
+resignment
+resile
+resilement
+resilial
+resiliate
+resilience
+resiliency
+resilient
+resilifer
+resiliometer
+resilition
+resilium
+resilver
+resin
+resina
+resinaceous
+resinate
+resinbush
+resiner
+resinfiable
+resing
+resinic
+resiniferous
+resinification
+resinifluous
+resiniform
+resinify
+resinize
+resink
+resinlike
+resinoelectric
+resinoextractive
+resinogenous
+resinoid
+resinol
+resinolic
+resinophore
+resinosis
+resinous
+resinously
+resinousness
+resinovitreous
+resiny
+resipiscence
+resipiscent
+resist
+resistability
+resistable
+resistableness
+resistance
+resistant
+resistantly
+resister
+resistful
+resistibility
+resistible
+resistibleness
+resistibly
+resisting
+resistingly
+resistive
+resistively
+resistiveness
+resistivity
+resistless
+resistlessly
+resistlessness
+resistor
+resitting
+resize
+resizer
+resketch
+reskin
+reslash
+reslate
+reslay
+reslide
+reslot
+resmell
+resmelt
+resmile
+resmooth
+resnap
+resnatch
+resnatron
+resnub
+resoak
+resoap
+resoften
+resoil
+resojourn
+resolder
+resole
+resolemnize
+resolicit
+resolidification
+resolidify
+resolubility
+resoluble
+resolubleness
+resolute
+resolutely
+resoluteness
+resolution
+resolutioner
+resolutionist
+resolutory
+resolvability
+resolvable
+resolvableness
+resolvancy
+resolve
+resolved
+resolvedly
+resolvedness
+resolvent
+resolver
+resolvible
+resonance
+resonancy
+resonant
+resonantly
+resonate
+resonator
+resonatory
+resoothe
+resorb
+resorbence
+resorbent
+resorcin
+resorcine
+resorcinism
+resorcinol
+resorcinolphthalein
+resorcinum
+resorcylic
+resorption
+resorptive
+resort
+resorter
+resorufin
+resought
+resound
+resounder
+resounding
+resoundingly
+resource
+resourceful
+resourcefully
+resourcefulness
+resourceless
+resourcelessness
+resoutive
+resow
+resp
+respace
+respade
+respan
+respangle
+resparkle
+respeak
+respect
+respectability
+respectabilize
+respectable
+respectableness
+respectably
+respectant
+respecter
+respectful
+respectfully
+respectfulness
+respecting
+respective
+respectively
+respectiveness
+respectless
+respectlessly
+respectlessness
+respectworthy
+respell
+respersive
+respin
+respirability
+respirable
+respirableness
+respiration
+respirational
+respirative
+respirator
+respiratored
+respiratorium
+respiratory
+respire
+respirit
+respirometer
+respite
+respiteless
+resplend
+resplendence
+resplendency
+resplendent
+resplendently
+resplice
+resplit
+respoke
+respond
+responde
+respondence
+respondency
+respondent
+respondentia
+responder
+responsal
+responsary
+response
+responseless
+responser
+responsibility
+responsible
+responsibleness
+responsibly
+responsion
+responsive
+responsively
+responsiveness
+responsivity
+responsorial
+responsory
+respot
+respray
+respread
+respring
+resprout
+respue
+resquare
+resqueak
+ressaidar
+ressala
+ressaldar
+ressaut
+rest
+restable
+restack
+restaff
+restain
+restainable
+restake
+restamp
+restandardization
+restandardize
+restant
+restart
+restate
+restatement
+restaur
+restaurant
+restaurate
+restaurateur
+restauration
+restbalk
+resteal
+resteel
+resteep
+restem
+restep
+rester
+resterilize
+restes
+restful
+restfully
+restfulness
+restharrow
+resthouse
+Restiaceae
+restiaceous
+restiad
+restibrachium
+restiff
+restiffen
+restiffener
+restiffness
+restifle
+restiform
+restigmatize
+restimulate
+restimulation
+resting
+restingly
+Restio
+Restionaceae
+restionaceous
+restipulate
+restipulation
+restipulatory
+restir
+restis
+restitch
+restitute
+restitution
+restitutionism
+restitutionist
+restitutive
+restitutor
+restitutory
+restive
+restively
+restiveness
+restless
+restlessly
+restlessness
+restock
+restopper
+restorable
+restorableness
+restoral
+restoration
+restorationer
+restorationism
+restorationist
+restorative
+restoratively
+restorativeness
+restorator
+restoratory
+restore
+restorer
+restow
+restowal
+restproof
+restraighten
+restrain
+restrainability
+restrained
+restrainedly
+restrainedness
+restrainer
+restraining
+restrainingly
+restraint
+restraintful
+restrap
+restratification
+restream
+restrengthen
+restress
+restretch
+restrict
+restricted
+restrictedly
+restrictedness
+restriction
+restrictionary
+restrictionist
+restrictive
+restrictively
+restrictiveness
+restrike
+restring
+restringe
+restringency
+restringent
+restrip
+restrive
+restroke
+restudy
+restuff
+restward
+restwards
+resty
+restyle
+resubject
+resubjection
+resubjugate
+resublimation
+resublime
+resubmerge
+resubmission
+resubmit
+resubordinate
+resubscribe
+resubscriber
+resubscription
+resubstitute
+resubstitution
+resucceed
+resuck
+resudation
+resue
+resuffer
+resufferance
+resuggest
+resuggestion
+resuing
+resuit
+result
+resultance
+resultancy
+resultant
+resultantly
+resultative
+resultful
+resultfully
+resulting
+resultingly
+resultive
+resultless
+resultlessly
+resultlessness
+resumability
+resumable
+resume
+resumer
+resummon
+resummons
+resumption
+resumptive
+resumptively
+resun
+resup
+resuperheat
+resupervise
+resupinate
+resupinated
+resupination
+resupine
+resupply
+resupport
+resuppose
+resupposition
+resuppress
+resuppression
+resurface
+resurge
+resurgence
+resurgency
+resurgent
+resurprise
+resurrect
+resurrectible
+resurrection
+resurrectional
+resurrectionary
+resurrectioner
+resurrectioning
+resurrectionism
+resurrectionist
+resurrectionize
+resurrective
+resurrector
+resurrender
+resurround
+resurvey
+resuscitable
+resuscitant
+resuscitate
+resuscitation
+resuscitative
+resuscitator
+resuspect
+resuspend
+resuspension
+reswage
+reswallow
+resward
+reswarm
+reswear
+resweat
+resweep
+reswell
+reswill
+reswim
+resyllabification
+resymbolization
+resymbolize
+resynthesis
+resynthesize
+ret
+retable
+retack
+retackle
+retag
+retail
+retailer
+retailment
+retailor
+retain
+retainability
+retainable
+retainableness
+retainal
+retainder
+retainer
+retainership
+retaining
+retake
+retaker
+retaliate
+retaliation
+retaliationist
+retaliative
+retaliator
+retaliatory
+retalk
+retama
+retame
+retan
+retanner
+retape
+retard
+retardance
+retardant
+retardate
+retardation
+retardative
+retardatory
+retarded
+retardence
+retardent
+retarder
+retarding
+retardingly
+retardive
+retardment
+retardure
+retare
+retariff
+retaste
+retation
+retattle
+retax
+retaxation
+retch
+reteach
+retecious
+retelegraph
+retelephone
+retell
+retelling
+retem
+retemper
+retempt
+retemptation
+retenant
+retender
+retene
+retent
+retention
+retentionist
+retentive
+retentively
+retentiveness
+retentivity
+retentor
+Retepora
+retepore
+Reteporidae
+retest
+retexture
+rethank
+rethatch
+rethaw
+rethe
+retheness
+rethicken
+rethink
+rethrash
+rethread
+rethreaten
+rethresh
+rethresher
+rethrill
+rethrive
+rethrone
+rethrow
+rethrust
+rethunder
+retia
+retial
+Retiariae
+retiarian
+retiarius
+retiary
+reticella
+reticello
+reticence
+reticency
+reticent
+reticently
+reticket
+reticle
+reticula
+reticular
+Reticularia
+reticularian
+reticularly
+reticulary
+reticulate
+reticulated
+reticulately
+reticulation
+reticulatocoalescent
+reticulatogranulate
+reticulatoramose
+reticulatovenose
+reticule
+reticuled
+reticulin
+reticulitis
+reticulocyte
+reticulocytosis
+reticuloramose
+Reticulosa
+reticulose
+reticulovenose
+reticulum
+retie
+retier
+retiform
+retighten
+retile
+retill
+retimber
+retime
+retin
+retina
+retinacular
+retinaculate
+retinaculum
+retinal
+retinalite
+retinasphalt
+retinasphaltum
+retincture
+retinene
+retinerved
+retinian
+retinispora
+retinite
+retinitis
+retinize
+retinker
+retinoblastoma
+retinochorioid
+retinochorioidal
+retinochorioiditis
+retinoid
+retinol
+retinopapilitis
+retinophoral
+retinophore
+retinoscope
+retinoscopic
+retinoscopically
+retinoscopist
+retinoscopy
+Retinospora
+retinue
+retinula
+retinular
+retinule
+retip
+retiracied
+retiracy
+retirade
+retiral
+retire
+retired
+retiredly
+retiredness
+retirement
+retirer
+retiring
+retiringly
+retiringness
+retistene
+retoast
+retold
+retolerate
+retoleration
+retomb
+retonation
+retook
+retool
+retooth
+retoother
+retort
+retortable
+retorted
+retorter
+retortion
+retortive
+retorture
+retoss
+retotal
+retouch
+retoucher
+retouching
+retouchment
+retour
+retourable
+retrace
+retraceable
+retracement
+retrack
+retract
+retractability
+retractable
+retractation
+retracted
+retractibility
+retractible
+retractile
+retractility
+retraction
+retractive
+retractively
+retractiveness
+retractor
+retrad
+retrade
+retradition
+retrahent
+retrain
+retral
+retrally
+retramp
+retrample
+retranquilize
+retranscribe
+retranscription
+retransfer
+retransference
+retransfigure
+retransform
+retransformation
+retransfuse
+retransit
+retranslate
+retranslation
+retransmission
+retransmissive
+retransmit
+retransmute
+retransplant
+retransport
+retransportation
+retravel
+retraverse
+retraxit
+retread
+retreat
+retreatal
+retreatant
+retreater
+retreatful
+retreating
+retreatingness
+retreative
+retreatment
+retree
+retrench
+retrenchable
+retrencher
+retrenchment
+retrial
+retribute
+retribution
+retributive
+retributively
+retributor
+retributory
+retricked
+retrievability
+retrievable
+retrievableness
+retrievably
+retrieval
+retrieve
+retrieveless
+retrievement
+retriever
+retrieverish
+retrim
+retrimmer
+retrip
+retroact
+retroaction
+retroactive
+retroactively
+retroactivity
+retroalveolar
+retroauricular
+retrobronchial
+retrobuccal
+retrobulbar
+retrocaecal
+retrocardiac
+retrocecal
+retrocede
+retrocedence
+retrocedent
+retrocervical
+retrocession
+retrocessional
+retrocessionist
+retrocessive
+retrochoir
+retroclavicular
+retroclusion
+retrocognition
+retrocognitive
+retrocolic
+retroconsciousness
+retrocopulant
+retrocopulation
+retrocostal
+retrocouple
+retrocoupler
+retrocurved
+retrodate
+retrodeviation
+retrodisplacement
+retroduction
+retrodural
+retroesophageal
+retroflected
+retroflection
+retroflex
+retroflexed
+retroflexion
+retroflux
+retroform
+retrofract
+retrofracted
+retrofrontal
+retrogastric
+retrogenerative
+retrogradation
+retrogradatory
+retrograde
+retrogradely
+retrogradient
+retrogradingly
+retrogradism
+retrogradist
+retrogress
+retrogression
+retrogressionist
+retrogressive
+retrogressively
+retrohepatic
+retroinfection
+retroinsular
+retroiridian
+retroject
+retrojection
+retrojugular
+retrolabyrinthine
+retrolaryngeal
+retrolingual
+retrolocation
+retromammary
+retromammillary
+retromandibular
+retromastoid
+retromaxillary
+retromigration
+retromingent
+retromingently
+retromorphosed
+retromorphosis
+retronasal
+retroperitoneal
+retroperitoneally
+retropharyngeal
+retropharyngitis
+retroplacental
+retroplexed
+retroposed
+retroposition
+retropresbyteral
+retropubic
+retropulmonary
+retropulsion
+retropulsive
+retroreception
+retrorectal
+retroreflective
+retrorenal
+retrorse
+retrorsely
+retroserrate
+retroserrulate
+retrospect
+retrospection
+retrospective
+retrospectively
+retrospectiveness
+retrospectivity
+retrosplenic
+retrostalsis
+retrostaltic
+retrosternal
+retrosusception
+retrot
+retrotarsal
+retrotemporal
+retrothyroid
+retrotracheal
+retrotransfer
+retrotransference
+retrotympanic
+retrousse
+retrovaccinate
+retrovaccination
+retrovaccine
+retroverse
+retroversion
+retrovert
+retrovision
+retroxiphoid
+retrude
+retrue
+retrusible
+retrusion
+retrust
+retry
+retted
+retter
+rettery
+retting
+rettory
+retube
+retuck
+retumble
+retumescence
+retune
+returban
+returf
+returfer
+return
+returnability
+returnable
+returned
+returner
+returnless
+returnlessly
+retuse
+retwine
+retwist
+retying
+retype
+retzian
+Reub
+Reuben
+Reubenites
+Reuchlinian
+Reuchlinism
+Reuel
+reundercut
+reundergo
+reundertake
+reundulate
+reundulation
+reune
+reunfold
+reunification
+reunify
+reunion
+reunionism
+reunionist
+reunionistic
+reunitable
+reunite
+reunitedly
+reuniter
+reunition
+reunitive
+reunpack
+reuphold
+reupholster
+reuplift
+reurge
+reuse
+reutilization
+reutilize
+reutter
+reutterance
+rev
+revacate
+revaccinate
+revaccination
+revalenta
+revalescence
+revalescent
+revalidate
+revalidation
+revalorization
+revalorize
+revaluate
+revaluation
+revalue
+revamp
+revamper
+revampment
+revaporization
+revaporize
+revarnish
+revary
+reve
+reveal
+revealability
+revealable
+revealableness
+revealed
+revealedly
+revealer
+revealing
+revealingly
+revealingness
+revealment
+revegetate
+revegetation
+revehent
+reveil
+reveille
+revel
+revelability
+revelant
+revelation
+revelational
+revelationer
+revelationist
+revelationize
+revelative
+revelator
+revelatory
+reveler
+revellent
+revelly
+revelment
+revelrout
+revelry
+revenant
+revend
+revender
+revendicate
+revendication
+reveneer
+revenge
+revengeable
+revengeful
+revengefully
+revengefulness
+revengeless
+revengement
+revenger
+revengingly
+revent
+reventilate
+reventure
+revenual
+revenue
+revenued
+revenuer
+rever
+reverable
+reverb
+reverbatory
+reverberant
+reverberate
+reverberation
+reverberative
+reverberator
+reverberatory
+reverbrate
+reverdure
+revere
+revered
+reverence
+reverencer
+reverend
+reverendly
+reverendship
+reverent
+reverential
+reverentiality
+reverentially
+reverentialness
+reverently
+reverentness
+reverer
+reverie
+reverification
+reverify
+reverist
+revers
+reversability
+reversable
+reversal
+reverse
+reversed
+reversedly
+reverseful
+reverseless
+reversely
+reversement
+reverser
+reverseways
+reversewise
+reversi
+reversibility
+reversible
+reversibleness
+reversibly
+reversification
+reversifier
+reversify
+reversing
+reversingly
+reversion
+reversionable
+reversional
+reversionally
+reversionary
+reversioner
+reversionist
+reversis
+reversist
+reversive
+reverso
+revert
+revertal
+reverter
+revertibility
+revertible
+revertive
+revertively
+revery
+revest
+revestiary
+revestry
+revet
+revete
+revetement
+revetment
+revibrate
+revibration
+revibrational
+revictorious
+revictory
+revictual
+revictualment
+revie
+review
+reviewability
+reviewable
+reviewage
+reviewal
+reviewer
+revieweress
+reviewish
+reviewless
+revigorate
+revigoration
+revile
+revilement
+reviler
+reviling
+revilingly
+revindicate
+revindication
+reviolate
+reviolation
+revirescence
+revirescent
+Revisable
+revisable
+revisableness
+revisal
+revise
+Revised
+revisee
+reviser
+revisership
+revisible
+revision
+revisional
+revisionary
+revisionism
+revisionist
+revisit
+revisitant
+revisitation
+revisor
+revisory
+revisualization
+revisualize
+revitalization
+revitalize
+revitalizer
+revivability
+revivable
+revivably
+revival
+revivalism
+revivalist
+revivalistic
+revivalize
+revivatory
+revive
+revivement
+reviver
+revivification
+revivifier
+revivify
+reviving
+revivingly
+reviviscence
+reviviscency
+reviviscent
+reviviscible
+revivor
+revocability
+revocable
+revocableness
+revocably
+revocation
+revocative
+revocatory
+revoice
+revokable
+revoke
+revokement
+revoker
+revokingly
+revolant
+revolatilize
+revolt
+revolter
+revolting
+revoltingly
+revoltress
+revolubility
+revoluble
+revolubly
+revolunteer
+revolute
+revoluted
+revolution
+revolutional
+revolutionally
+revolutionarily
+revolutionariness
+revolutionary
+revolutioneering
+revolutioner
+revolutionism
+revolutionist
+revolutionize
+revolutionizement
+revolutionizer
+revolvable
+revolvably
+revolve
+revolvement
+revolvency
+revolver
+revolving
+revolvingly
+revomit
+revote
+revue
+revuette
+revuist
+revulsed
+revulsion
+revulsionary
+revulsive
+revulsively
+rewade
+rewager
+rewake
+rewaken
+rewall
+rewallow
+reward
+rewardable
+rewardableness
+rewardably
+rewardedly
+rewarder
+rewardful
+rewardfulness
+rewarding
+rewardingly
+rewardless
+rewardproof
+rewarehouse
+rewarm
+rewarn
+rewash
+rewater
+rewave
+rewax
+rewaybill
+rewayle
+reweaken
+rewear
+reweave
+rewed
+reweigh
+reweigher
+reweight
+rewelcome
+reweld
+rewend
+rewet
+rewhelp
+rewhirl
+rewhisper
+rewhiten
+rewiden
+rewin
+rewind
+rewinder
+rewirable
+rewire
+rewish
+rewithdraw
+rewithdrawal
+rewood
+reword
+rework
+reworked
+rewound
+rewove
+rewoven
+rewrap
+rewrite
+rewriter
+Rex
+rex
+rexen
+reyield
+Reynard
+Reynold
+reyoke
+reyouth
+rezbanyite
+rhabdite
+rhabditiform
+Rhabditis
+rhabdium
+Rhabdocarpum
+Rhabdocoela
+rhabdocoelan
+rhabdocoele
+Rhabdocoelida
+rhabdocoelidan
+rhabdocoelous
+rhabdoid
+rhabdoidal
+rhabdolith
+rhabdom
+rhabdomal
+rhabdomancer
+rhabdomancy
+rhabdomantic
+rhabdomantist
+Rhabdomonas
+rhabdomyoma
+rhabdomyosarcoma
+rhabdomysarcoma
+rhabdophane
+rhabdophanite
+Rhabdophora
+rhabdophoran
+Rhabdopleura
+rhabdopod
+rhabdos
+rhabdosome
+rhabdosophy
+rhabdosphere
+rhabdus
+Rhacianectes
+Rhacomitrium
+Rhacophorus
+Rhadamanthine
+Rhadamanthus
+Rhadamanthys
+Rhaetian
+Rhaetic
+rhagades
+rhagadiform
+rhagiocrin
+rhagionid
+Rhagionidae
+rhagite
+Rhagodia
+rhagon
+rhagonate
+rhagose
+rhamn
+Rhamnaceae
+rhamnaceous
+rhamnal
+Rhamnales
+rhamnetin
+rhamninase
+rhamninose
+rhamnite
+rhamnitol
+rhamnohexite
+rhamnohexitol
+rhamnohexose
+rhamnonic
+rhamnose
+rhamnoside
+Rhamnus
+rhamphoid
+Rhamphorhynchus
+Rhamphosuchus
+rhamphotheca
+Rhapidophyllum
+Rhapis
+rhapontic
+rhaponticin
+rhapontin
+rhapsode
+rhapsodic
+rhapsodical
+rhapsodically
+rhapsodie
+rhapsodism
+rhapsodist
+rhapsodistic
+rhapsodize
+rhapsodomancy
+rhapsody
+Rhaptopetalaceae
+rhason
+rhasophore
+rhatania
+rhatany
+rhe
+Rhea
+rhea
+rheadine
+Rheae
+rhebok
+rhebosis
+rheeboc
+rheebok
+rheen
+rhegmatype
+rhegmatypy
+Rhegnopteri
+rheic
+Rheidae
+Rheiformes
+rhein
+rheinic
+rhema
+rhematic
+rhematology
+rheme
+Rhemish
+Rhemist
+Rhenish
+rhenium
+rheobase
+rheocrat
+rheologist
+rheology
+rheometer
+rheometric
+rheometry
+rheophile
+rheophore
+rheophoric
+rheoplankton
+rheoscope
+rheoscopic
+rheostat
+rheostatic
+rheostatics
+rheotactic
+rheotan
+rheotaxis
+rheotome
+rheotrope
+rheotropic
+rheotropism
+rhesian
+rhesus
+rhetor
+rhetoric
+rhetorical
+rhetorically
+rhetoricalness
+rhetoricals
+rhetorician
+rhetorize
+Rheum
+rheum
+rheumarthritis
+rheumatalgia
+rheumatic
+rheumatical
+rheumatically
+rheumaticky
+rheumatism
+rheumatismal
+rheumatismoid
+rheumative
+rheumatiz
+rheumatize
+rheumatoid
+rheumatoidal
+rheumatoidally
+rheumed
+rheumic
+rheumily
+rheuminess
+rheumy
+Rhexia
+rhexis
+rhigolene
+rhigosis
+rhigotic
+Rhina
+rhinal
+rhinalgia
+Rhinanthaceae
+Rhinanthus
+rhinarium
+rhincospasm
+rhine
+Rhineland
+Rhinelander
+rhinencephalic
+rhinencephalon
+rhinencephalous
+rhinenchysis
+Rhineodon
+Rhineodontidae
+rhinestone
+Rhineura
+rhineurynter
+Rhinidae
+rhinion
+rhinitis
+rhino
+Rhinobatidae
+Rhinobatus
+rhinobyon
+rhinocaul
+rhinocele
+rhinocelian
+rhinocerial
+rhinocerian
+rhinocerine
+rhinoceroid
+rhinoceros
+rhinoceroslike
+rhinocerotic
+Rhinocerotidae
+rhinocerotiform
+rhinocerotine
+rhinocerotoid
+rhinochiloplasty
+Rhinoderma
+rhinodynia
+rhinogenous
+rhinolalia
+rhinolaryngology
+rhinolaryngoscope
+rhinolite
+rhinolith
+rhinolithic
+rhinological
+rhinologist
+rhinology
+rhinolophid
+Rhinolophidae
+rhinolophine
+rhinopharyngeal
+rhinopharyngitis
+rhinopharynx
+Rhinophidae
+Rhinophis
+rhinophonia
+rhinophore
+rhinophyma
+rhinoplastic
+rhinoplasty
+rhinopolypus
+Rhinoptera
+Rhinopteridae
+rhinorrhagia
+rhinorrhea
+rhinorrheal
+rhinoscleroma
+rhinoscope
+rhinoscopic
+rhinoscopy
+rhinosporidiosis
+Rhinosporidium
+rhinotheca
+rhinothecal
+Rhinthonic
+Rhinthonica
+rhipidate
+rhipidion
+Rhipidistia
+rhipidistian
+rhipidium
+Rhipidoglossa
+rhipidoglossal
+rhipidoglossate
+Rhipidoptera
+rhipidopterous
+rhipiphorid
+Rhipiphoridae
+Rhipiptera
+rhipipteran
+rhipipterous
+Rhipsalis
+Rhiptoglossa
+rhizanthous
+rhizautoicous
+Rhizina
+Rhizinaceae
+rhizine
+rhizinous
+Rhizobium
+rhizocarp
+Rhizocarpeae
+rhizocarpean
+rhizocarpian
+rhizocarpic
+rhizocarpous
+rhizocaul
+rhizocaulus
+Rhizocephala
+rhizocephalan
+rhizocephalous
+rhizocorm
+Rhizoctonia
+rhizoctoniose
+rhizodermis
+Rhizodus
+Rhizoflagellata
+rhizoflagellate
+rhizogen
+rhizogenetic
+rhizogenic
+rhizogenous
+rhizoid
+rhizoidal
+rhizoma
+rhizomatic
+rhizomatous
+rhizome
+rhizomelic
+rhizomic
+rhizomorph
+rhizomorphic
+rhizomorphoid
+rhizomorphous
+rhizoneure
+rhizophagous
+rhizophilous
+Rhizophora
+Rhizophoraceae
+rhizophoraceous
+rhizophore
+rhizophorous
+rhizophyte
+rhizoplast
+rhizopod
+Rhizopoda
+rhizopodal
+rhizopodan
+rhizopodist
+rhizopodous
+Rhizopogon
+Rhizopus
+rhizosphere
+Rhizostomae
+Rhizostomata
+rhizostomatous
+rhizostome
+rhizostomous
+Rhizota
+rhizotaxis
+rhizotaxy
+rhizote
+rhizotic
+rhizotomi
+rhizotomy
+rho
+Rhoda
+rhodaline
+Rhodamine
+rhodamine
+rhodanate
+Rhodanian
+rhodanic
+rhodanine
+rhodanthe
+rhodeose
+Rhodes
+Rhodesian
+Rhodesoid
+rhodeswood
+Rhodian
+rhodic
+rhoding
+rhodinol
+rhodite
+rhodium
+rhodizite
+rhodizonic
+Rhodobacteriaceae
+Rhodobacterioideae
+rhodochrosite
+Rhodococcus
+Rhodocystis
+rhodocyte
+rhododendron
+rhodolite
+Rhodomelaceae
+rhodomelaceous
+rhodonite
+Rhodope
+rhodophane
+Rhodophyceae
+rhodophyceous
+rhodophyll
+Rhodophyllidaceae
+Rhodophyta
+rhodoplast
+rhodopsin
+Rhodora
+Rhodoraceae
+rhodorhiza
+rhodosperm
+Rhodospermeae
+rhodospermin
+rhodospermous
+Rhodospirillum
+Rhodothece
+Rhodotypos
+Rhodymenia
+Rhodymeniaceae
+rhodymeniaceous
+Rhodymeniales
+Rhoeadales
+Rhoecus
+Rhoeo
+rhomb
+rhombencephalon
+rhombenporphyr
+rhombic
+rhombical
+rhombiform
+rhomboclase
+rhomboganoid
+Rhomboganoidei
+rhombogene
+rhombogenic
+rhombogenous
+rhombohedra
+rhombohedral
+rhombohedrally
+rhombohedric
+rhombohedron
+rhomboid
+rhomboidal
+rhomboidally
+rhomboideus
+rhomboidly
+rhomboquadratic
+rhomborectangular
+rhombos
+rhombovate
+Rhombozoa
+rhombus
+rhonchal
+rhonchial
+rhonchus
+Rhonda
+rhopalic
+rhopalism
+rhopalium
+Rhopalocera
+rhopaloceral
+rhopalocerous
+Rhopalura
+rhotacism
+rhotacismus
+rhotacistic
+rhotacize
+rhubarb
+rhubarby
+rhumb
+rhumba
+rhumbatron
+Rhus
+rhyacolite
+rhyme
+rhymeless
+rhymelet
+rhymemaker
+rhymemaking
+rhymeproof
+rhymer
+rhymery
+rhymester
+rhymewise
+rhymic
+rhymist
+rhymy
+Rhynchobdellae
+Rhynchobdellida
+Rhynchocephala
+Rhynchocephali
+Rhynchocephalia
+rhynchocephalian
+rhynchocephalic
+rhynchocephalous
+Rhynchocoela
+rhynchocoelan
+rhynchocoelic
+rhynchocoelous
+rhyncholite
+Rhynchonella
+Rhynchonellacea
+Rhynchonellidae
+rhynchonelloid
+Rhynchophora
+rhynchophoran
+rhynchophore
+rhynchophorous
+Rhynchopinae
+Rhynchops
+Rhynchosia
+Rhynchospora
+Rhynchota
+rhynchotal
+rhynchote
+rhynchotous
+rhynconellid
+Rhyncostomi
+Rhynia
+Rhyniaceae
+Rhynocheti
+Rhynsburger
+rhyobasalt
+rhyodacite
+rhyolite
+rhyolitic
+rhyotaxitic
+rhyparographer
+rhyparographic
+rhyparographist
+rhyparography
+rhypography
+rhyptic
+rhyptical
+rhysimeter
+Rhyssa
+rhythm
+rhythmal
+rhythmic
+rhythmical
+rhythmicality
+rhythmically
+rhythmicity
+rhythmicize
+rhythmics
+rhythmist
+rhythmizable
+rhythmization
+rhythmize
+rhythmless
+rhythmometer
+rhythmopoeia
+rhythmproof
+Rhytidodon
+rhytidome
+rhytidosis
+Rhytina
+Rhytisma
+rhyton
+ria
+rial
+riancy
+riant
+riantly
+riata
+rib
+ribald
+ribaldish
+ribaldly
+ribaldrous
+ribaldry
+riband
+Ribandism
+Ribandist
+ribandlike
+ribandmaker
+ribandry
+ribat
+ribaudequin
+ribaudred
+ribband
+ribbandry
+ribbed
+ribber
+ribbet
+ribbidge
+ribbing
+ribble
+ribbon
+ribbonback
+ribboner
+ribbonfish
+Ribbonism
+ribbonlike
+ribbonmaker
+Ribbonman
+ribbonry
+ribbonweed
+ribbonwood
+ribbony
+ribby
+ribe
+Ribes
+Ribhus
+ribless
+riblet
+riblike
+riboflavin
+ribonic
+ribonuclease
+ribonucleic
+ribose
+ribroast
+ribroaster
+ribroasting
+ribskin
+ribspare
+Ribston
+ribwork
+ribwort
+Ric
+Ricardian
+Ricardianism
+Ricardo
+Riccia
+Ricciaceae
+ricciaceous
+Ricciales
+rice
+ricebird
+riceland
+ricer
+ricey
+Rich
+rich
+Richard
+Richardia
+Richardsonia
+richdom
+Richebourg
+richellite
+richen
+riches
+richesse
+richling
+richly
+Richmond
+Richmondena
+richness
+richt
+richterite
+richweed
+ricin
+ricine
+ricinelaidic
+ricinelaidinic
+ricinic
+ricinine
+ricininic
+ricinium
+ricinoleate
+ricinoleic
+ricinolein
+ricinolic
+Ricinulei
+Ricinus
+ricinus
+Rick
+rick
+rickardite
+ricker
+ricketily
+ricketiness
+ricketish
+rickets
+Rickettsia
+rickettsial
+Rickettsiales
+rickettsialpox
+rickety
+rickey
+rickle
+rickmatic
+rickrack
+ricksha
+rickshaw
+rickstaddle
+rickstand
+rickstick
+Ricky
+rickyard
+ricochet
+ricolettaite
+ricrac
+rictal
+rictus
+rid
+ridable
+ridableness
+ridably
+riddam
+riddance
+riddel
+ridden
+ridder
+ridding
+riddle
+riddlemeree
+riddler
+riddling
+riddlingly
+riddlings
+ride
+rideable
+rideau
+riden
+rident
+rider
+ridered
+rideress
+riderless
+ridge
+ridgeband
+ridgeboard
+ridgebone
+ridged
+ridgel
+ridgelet
+ridgelike
+ridgeling
+ridgepiece
+ridgeplate
+ridgepole
+ridgepoled
+ridger
+ridgerope
+ridgetree
+ridgeway
+ridgewise
+ridgil
+ridging
+ridgingly
+ridgling
+ridgy
+ridibund
+ridicule
+ridiculer
+ridiculize
+ridiculosity
+ridiculous
+ridiculously
+ridiculousness
+riding
+ridingman
+ridotto
+rie
+riebeckite
+riem
+Riemannean
+Riemannian
+riempie
+rier
+Riesling
+rife
+rifely
+rifeness
+Riff
+riff
+Riffi
+Riffian
+riffle
+riffler
+riffraff
+Rifi
+Rifian
+rifle
+riflebird
+rifledom
+rifleman
+riflemanship
+rifleproof
+rifler
+riflery
+rifleshot
+rifling
+rift
+rifter
+riftless
+rifty
+rig
+rigadoon
+rigamajig
+rigamarole
+rigation
+rigbane
+Rigel
+Rigelian
+rigescence
+rigescent
+riggald
+rigger
+rigging
+riggish
+riggite
+riggot
+right
+rightabout
+righten
+righteous
+righteously
+righteousness
+righter
+rightful
+rightfully
+rightfulness
+rightheaded
+righthearted
+rightist
+rightle
+rightless
+rightlessness
+rightly
+rightmost
+rightness
+righto
+rightship
+rightward
+rightwardly
+rightwards
+righty
+rigid
+rigidify
+rigidist
+rigidity
+rigidly
+rigidness
+rigidulous
+rigling
+rigmaree
+rigmarole
+rigmarolery
+rigmarolic
+rigmarolish
+rigmarolishly
+rignum
+rigol
+rigolette
+rigor
+rigorism
+rigorist
+rigoristic
+rigorous
+rigorously
+rigorousness
+rigsby
+rigsdaler
+Rigsmaal
+Rigsmal
+rigwiddie
+rigwiddy
+Rik
+Rikari
+rikisha
+rikk
+riksha
+rikshaw
+Riksmaal
+Riksmal
+rilawa
+rile
+riley
+rill
+rillet
+rillett
+rillette
+rillock
+rillstone
+rilly
+rim
+rima
+rimal
+rimate
+rimbase
+rime
+rimeless
+rimer
+rimester
+rimfire
+rimiform
+rimland
+rimless
+rimmaker
+rimmaking
+rimmed
+rimmer
+rimose
+rimosely
+rimosity
+rimous
+rimpi
+rimple
+rimption
+rimrock
+rimu
+rimula
+rimulose
+rimy
+Rinaldo
+rinceau
+rinch
+rincon
+Rind
+rind
+Rinde
+rinded
+rinderpest
+rindle
+rindless
+rindy
+rine
+ring
+ringable
+Ringatu
+ringbark
+ringbarker
+ringbill
+ringbird
+ringbolt
+ringbone
+ringboned
+ringcraft
+ringdove
+ringe
+ringed
+ringent
+ringer
+ringeye
+ringgiver
+ringgiving
+ringgoer
+ringhals
+ringhead
+ringiness
+ringing
+ringingly
+ringingness
+ringite
+ringle
+ringlead
+ringleader
+ringleaderless
+ringleadership
+ringless
+ringlet
+ringleted
+ringlety
+ringlike
+ringmaker
+ringmaking
+ringman
+ringmaster
+ringneck
+ringsail
+ringside
+ringsider
+ringster
+ringtail
+ringtaw
+ringtime
+ringtoss
+ringwalk
+ringwall
+ringwise
+ringworm
+ringy
+rink
+rinka
+rinker
+rinkite
+rinncefada
+rinneite
+rinner
+rinsable
+rinse
+rinser
+rinsing
+rinthereout
+rintherout
+Rio
+rio
+riot
+rioter
+rioting
+riotingly
+riotist
+riotistic
+riotocracy
+riotous
+riotously
+riotousness
+riotproof
+riotry
+rip
+ripa
+ripal
+riparial
+riparian
+Riparii
+riparious
+ripcord
+ripe
+ripelike
+ripely
+ripen
+ripener
+ripeness
+ripening
+ripeningly
+riper
+ripgut
+ripicolous
+ripidolite
+ripienist
+ripieno
+ripier
+ripost
+riposte
+rippable
+ripper
+ripperman
+rippet
+rippier
+ripping
+rippingly
+rippingness
+rippit
+ripple
+rippleless
+rippler
+ripplet
+rippling
+ripplingly
+ripply
+rippon
+riprap
+riprapping
+ripsack
+ripsaw
+ripsnorter
+ripsnorting
+Ripuarian
+ripup
+riroriro
+risala
+risberm
+rise
+risen
+riser
+rishi
+rishtadar
+risibility
+risible
+risibleness
+risibles
+risibly
+rising
+risk
+risker
+riskful
+riskfulness
+riskily
+riskiness
+riskish
+riskless
+riskproof
+risky
+risorial
+risorius
+risp
+risper
+risque
+risquee
+Riss
+rissel
+risser
+Rissian
+rissle
+Rissoa
+rissoid
+Rissoidae
+rist
+ristori
+rit
+Rita
+rita
+Ritalynne
+ritardando
+Ritchey
+rite
+riteless
+ritelessness
+ritling
+ritornel
+ritornelle
+ritornello
+Ritschlian
+Ritschlianism
+rittingerite
+ritual
+ritualism
+ritualist
+ritualistic
+ritualistically
+rituality
+ritualize
+ritualless
+ritually
+ritzy
+riva
+rivage
+rival
+rivalable
+rivaless
+rivalism
+rivality
+rivalize
+rivalless
+rivalrous
+rivalry
+rivalship
+rive
+rivel
+rivell
+riven
+river
+riverain
+riverbank
+riverbush
+riverdamp
+rivered
+riverhead
+riverhood
+riverine
+riverish
+riverless
+riverlet
+riverlike
+riverling
+riverly
+riverman
+riverscape
+riverside
+riversider
+riverward
+riverwards
+riverwash
+riverway
+riverweed
+riverwise
+rivery
+rivet
+riveter
+rivethead
+riveting
+rivetless
+rivetlike
+Rivina
+riving
+rivingly
+Rivinian
+rivose
+Rivularia
+Rivulariaceae
+rivulariaceous
+rivulation
+rivulet
+rivulose
+rix
+rixatrix
+rixy
+riyal
+riziform
+rizzar
+rizzle
+rizzom
+rizzomed
+rizzonite
+Ro
+roach
+roachback
+road
+roadability
+roadable
+roadbed
+roadblock
+roadbook
+roadcraft
+roaded
+roader
+roadfellow
+roadhead
+roadhouse
+roading
+roadite
+roadless
+roadlessness
+roadlike
+roadman
+roadmaster
+roadside
+roadsider
+roadsman
+roadstead
+roadster
+roadstone
+roadtrack
+roadway
+roadweed
+roadwise
+roadworthiness
+roadworthy
+roam
+roamage
+roamer
+roaming
+roamingly
+roan
+roanoke
+roar
+roarer
+roaring
+roaringly
+roast
+roastable
+roaster
+roasting
+roastingly
+Rob
+rob
+robalito
+robalo
+roband
+robber
+robberproof
+robbery
+Robbin
+robbin
+robbing
+robe
+robeless
+Robenhausian
+rober
+roberd
+Roberdsman
+Robert
+Roberta
+Roberto
+Robigalia
+Robigus
+Robin
+robin
+robinet
+robing
+Robinia
+robinin
+robinoside
+roble
+robomb
+roborant
+roborate
+roboration
+roborative
+roborean
+roboreous
+robot
+robotesque
+robotian
+robotism
+robotistic
+robotization
+robotize
+robotlike
+robotry
+robur
+roburite
+robust
+robustful
+robustfully
+robustfulness
+robustic
+robusticity
+robustious
+robustiously
+robustiousness
+robustity
+robustly
+robustness
+roc
+rocambole
+Roccella
+Roccellaceae
+roccellic
+roccellin
+roccelline
+Rochea
+rochelime
+Rochelle
+rocher
+rochet
+rocheted
+rock
+rockable
+rockably
+rockaby
+rockabye
+rockallite
+Rockaway
+rockaway
+rockbell
+rockberry
+rockbird
+rockborn
+rockbrush
+rockcist
+rockcraft
+rockelay
+rocker
+rockery
+rocket
+rocketeer
+rocketer
+rocketlike
+rocketor
+rocketry
+rockety
+rockfall
+rockfish
+rockfoil
+rockhair
+rockhearted
+Rockies
+rockiness
+rocking
+rockingly
+rockish
+rocklay
+rockless
+rocklet
+rocklike
+rockling
+rockman
+rockrose
+rockshaft
+rockslide
+rockstaff
+rocktree
+rockward
+rockwards
+rockweed
+rockwood
+rockwork
+rocky
+rococo
+Rocouyenne
+rocta
+Rod
+rod
+rodd
+roddikin
+roddin
+rodding
+rode
+Rodent
+rodent
+Rodentia
+rodential
+rodentially
+rodentian
+rodenticidal
+rodenticide
+rodentproof
+rodeo
+Roderic
+Roderick
+rodge
+Rodger
+rodham
+Rodinal
+Rodinesque
+roding
+rodingite
+rodknight
+rodless
+rodlet
+rodlike
+rodmaker
+rodman
+Rodney
+rodney
+Rodolph
+Rodolphus
+rodomont
+rodomontade
+rodomontadist
+rodomontador
+rodsman
+rodster
+rodwood
+roe
+roeblingite
+roebuck
+roed
+roelike
+roentgen
+roentgenism
+roentgenization
+roentgenize
+roentgenogram
+roentgenograph
+roentgenographic
+roentgenographically
+roentgenography
+roentgenologic
+roentgenological
+roentgenologically
+roentgenologist
+roentgenology
+roentgenometer
+roentgenometry
+roentgenoscope
+roentgenoscopic
+roentgenoscopy
+roentgenotherapy
+roentgentherapy
+roer
+roestone
+roey
+rog
+rogan
+rogation
+Rogationtide
+rogative
+rogatory
+Roger
+roger
+Rogero
+rogersite
+roggle
+Rogue
+rogue
+roguedom
+rogueling
+roguery
+rogueship
+roguing
+roguish
+roguishly
+roguishness
+rohan
+Rohilla
+rohob
+rohun
+rohuna
+roi
+roid
+roil
+roily
+Roist
+roister
+roisterer
+roistering
+roisteringly
+roisterly
+roisterous
+roisterously
+roit
+Rok
+roka
+roke
+rokeage
+rokee
+rokelay
+roker
+rokey
+roky
+Roland
+Rolandic
+role
+roleo
+Rolf
+Rolfe
+roll
+rollable
+rollback
+rolled
+rollejee
+roller
+rollerer
+rollermaker
+rollermaking
+rollerman
+rollerskater
+rollerskating
+rolley
+rolleyway
+rolleywayman
+rolliche
+rollichie
+rollick
+rollicker
+rollicking
+rollickingly
+rollickingness
+rollicksome
+rollicksomeness
+rollicky
+rolling
+rollingly
+Rollinia
+rollix
+rollmop
+Rollo
+rollock
+rollway
+roloway
+Romaean
+Romagnese
+Romagnol
+Romagnole
+Romaic
+romaika
+Romain
+romaine
+Romaji
+romal
+Roman
+Romance
+romance
+romancealist
+romancean
+romanceful
+romanceish
+romanceishness
+romanceless
+romancelet
+romancelike
+romancemonger
+romanceproof
+romancer
+romanceress
+romancical
+romancing
+romancist
+romancy
+Romandom
+Romane
+Romanes
+Romanese
+Romanesque
+Romanhood
+Romanian
+Romanic
+Romaniform
+Romanish
+Romanism
+Romanist
+Romanistic
+Romanite
+Romanity
+romanium
+Romanization
+Romanize
+Romanizer
+Romanly
+Romansch
+Romansh
+romantic
+romantical
+romanticalism
+romanticality
+romantically
+romanticalness
+romanticism
+romanticist
+romanticistic
+romanticity
+romanticize
+romanticly
+romanticness
+romantism
+romantist
+Romany
+romanza
+romaunt
+rombos
+rombowline
+Rome
+romeite
+Romeo
+romerillo
+romero
+Romescot
+Romeshot
+Romeward
+Romewards
+Romic
+Romipetal
+Romish
+Romishly
+Romishness
+rommack
+Rommany
+Romney
+Romneya
+romp
+romper
+romping
+rompingly
+rompish
+rompishly
+rompishness
+rompu
+rompy
+Romulian
+Romulus
+Ron
+Ronald
+roncador
+Roncaglian
+roncet
+ronco
+rond
+rondache
+rondacher
+rondawel
+ronde
+rondeau
+rondel
+rondelet
+Rondeletia
+rondelier
+rondelle
+rondellier
+rondino
+rondle
+rondo
+rondoletto
+rondure
+rone
+Rong
+Ronga
+rongeur
+Ronni
+ronquil
+Ronsardian
+Ronsardism
+Ronsardist
+Ronsardize
+Ronsdorfer
+Ronsdorfian
+rontgen
+ronyon
+rood
+roodebok
+roodle
+roodstone
+roof
+roofage
+roofer
+roofing
+roofless
+rooflet
+rooflike
+roofman
+rooftree
+roofward
+roofwise
+roofy
+rooibok
+rooinek
+rook
+rooker
+rookeried
+rookery
+rookie
+rookish
+rooklet
+rooklike
+rooky
+rool
+room
+roomage
+roomed
+roomer
+roomful
+roomie
+roomily
+roominess
+roomkeeper
+roomless
+roomlet
+roommate
+roomstead
+roomth
+roomthily
+roomthiness
+roomthy
+roomward
+roomy
+roon
+roorback
+roosa
+Roosevelt
+Rooseveltian
+roost
+roosted
+rooster
+roosterfish
+roosterhood
+roosterless
+roosters
+roostership
+Root
+root
+rootage
+rootcap
+rooted
+rootedly
+rootedness
+rooter
+rootery
+rootfast
+rootfastness
+roothold
+rootiness
+rootle
+rootless
+rootlessness
+rootlet
+rootlike
+rootling
+rootstalk
+rootstock
+rootwalt
+rootward
+rootwise
+rootworm
+rooty
+roove
+ropable
+rope
+ropeable
+ropeband
+ropebark
+ropedance
+ropedancer
+ropedancing
+ropelayer
+ropelaying
+ropelike
+ropemaker
+ropemaking
+ropeman
+roper
+roperipe
+ropery
+ropes
+ropesmith
+ropetrick
+ropewalk
+ropewalker
+ropeway
+ropework
+ropily
+ropiness
+roping
+ropish
+ropishness
+ropp
+ropy
+roque
+roquelaure
+roquer
+roquet
+roquette
+roquist
+roral
+roratorio
+Rori
+roric
+Roridula
+Roridulaceae
+roriferous
+rorifluent
+Roripa
+Rorippa
+roritorious
+rorqual
+rorty
+rorulent
+rory
+Rosa
+Rosabel
+Rosabella
+Rosaceae
+rosacean
+rosaceous
+rosal
+Rosales
+Rosalia
+Rosalie
+Rosalind
+Rosaline
+Rosamond
+rosanilin
+rosaniline
+rosarian
+rosario
+rosarium
+rosaruby
+rosary
+rosated
+Roschach
+roscherite
+roscid
+roscoelite
+rose
+roseal
+roseate
+roseately
+rosebay
+rosebud
+rosebush
+rosed
+rosedrop
+rosefish
+rosehead
+rosehill
+rosehiller
+roseine
+rosel
+roseless
+roselet
+roselike
+roselite
+rosella
+rosellate
+roselle
+Rosellinia
+rosemary
+Rosenbergia
+rosenbuschite
+roseola
+roseolar
+roseoliform
+roseolous
+roseous
+roseroot
+rosery
+roset
+rosetan
+rosetangle
+rosetime
+Rosetta
+rosette
+rosetted
+rosetty
+rosetum
+rosety
+roseways
+rosewise
+rosewood
+rosewort
+Rosicrucian
+Rosicrucianism
+rosied
+rosier
+rosieresite
+rosilla
+rosillo
+rosily
+rosin
+rosinate
+rosinduline
+Rosine
+rosiness
+rosinous
+rosinweed
+rosinwood
+rosiny
+rosland
+rosmarine
+Rosmarinus
+Rosminian
+Rosminianism
+rosoli
+rosolic
+rosolio
+rosolite
+rosorial
+Ross
+ross
+rosser
+rossite
+rostel
+rostellar
+Rostellaria
+rostellarian
+rostellate
+rostelliform
+rostellum
+roster
+rostra
+rostral
+rostrally
+rostrate
+rostrated
+rostriferous
+rostriform
+rostroantennary
+rostrobranchial
+rostrocarinate
+rostrocaudal
+rostroid
+rostrolateral
+rostrular
+rostrulate
+rostrulum
+rostrum
+rosular
+rosulate
+rosy
+rot
+rota
+rotacism
+Rotal
+rotal
+Rotala
+Rotalia
+rotalian
+rotaliform
+rotaliiform
+rotaman
+rotameter
+rotan
+Rotanev
+rotang
+Rotarian
+Rotarianism
+rotarianize
+Rotary
+rotary
+rotascope
+rotatable
+rotate
+rotated
+rotating
+rotation
+rotational
+rotative
+rotatively
+rotativism
+rotatodentate
+rotatoplane
+rotator
+Rotatoria
+rotatorian
+rotatory
+rotch
+rote
+rotella
+rotenone
+roter
+rotge
+rotgut
+rother
+rothermuck
+rotifer
+Rotifera
+rotiferal
+rotiferan
+rotiferous
+rotiform
+rotisserie
+roto
+rotograph
+rotogravure
+rotor
+rotorcraft
+rotproof
+Rotse
+rottan
+rotten
+rottenish
+rottenly
+rottenness
+rottenstone
+rotter
+rotting
+rottle
+rottlera
+rottlerin
+rottock
+rottolo
+rotula
+rotulad
+rotular
+rotulet
+rotulian
+rotuliform
+rotulus
+rotund
+rotunda
+rotundate
+rotundifoliate
+rotundifolious
+rotundiform
+rotundify
+rotundity
+rotundly
+rotundness
+rotundo
+rotundotetragonal
+roub
+roucou
+roud
+roue
+rouelle
+rouge
+rougeau
+rougeberry
+rougelike
+rougemontite
+rougeot
+rough
+roughage
+roughcast
+roughcaster
+roughdraft
+roughdraw
+roughdress
+roughdry
+roughen
+roughener
+rougher
+roughet
+roughhearted
+roughheartedness
+roughhew
+roughhewer
+roughhewn
+roughhouse
+roughhouser
+roughhousing
+roughhousy
+roughie
+roughing
+roughings
+roughish
+roughishly
+roughishness
+roughleg
+roughly
+roughness
+roughometer
+roughride
+roughrider
+roughroot
+roughscuff
+roughsetter
+roughshod
+roughslant
+roughsome
+roughstring
+roughstuff
+roughtail
+roughtailed
+roughwork
+roughwrought
+roughy
+rougy
+rouille
+rouky
+roulade
+rouleau
+roulette
+Rouman
+Roumeliote
+roun
+rounce
+rounceval
+rouncy
+round
+roundabout
+roundaboutly
+roundaboutness
+rounded
+roundedly
+roundedness
+roundel
+roundelay
+roundeleer
+rounder
+roundfish
+roundhead
+roundheaded
+roundheadedness
+roundhouse
+rounding
+roundish
+roundishness
+roundlet
+roundline
+roundly
+roundmouthed
+roundness
+roundnose
+roundnosed
+roundridge
+roundseam
+roundsman
+roundtail
+roundtop
+roundtree
+roundup
+roundwise
+roundwood
+roundworm
+roundy
+roup
+rouper
+roupet
+roupily
+roupingwife
+roupit
+roupy
+rouse
+rouseabout
+rousedness
+rousement
+rouser
+rousing
+rousingly
+Rousseau
+Rousseauan
+Rousseauism
+Rousseauist
+Rousseauistic
+Rousseauite
+Roussellian
+roussette
+Roussillon
+roust
+roustabout
+rouster
+rousting
+rout
+route
+router
+routh
+routhercock
+routhie
+routhiness
+routhy
+routinary
+routine
+routineer
+routinely
+routing
+routinish
+routinism
+routinist
+routinization
+routinize
+routivarite
+routous
+routously
+rouvillite
+rove
+rover
+rovet
+rovetto
+roving
+rovingly
+rovingness
+row
+rowable
+rowan
+rowanberry
+rowboat
+rowdily
+rowdiness
+rowdy
+rowdydow
+rowdydowdy
+rowdyish
+rowdyishly
+rowdyishness
+rowdyism
+rowdyproof
+rowed
+rowel
+rowelhead
+rowen
+Rowena
+rower
+rowet
+rowiness
+rowing
+Rowland
+rowlandite
+Rowleian
+rowlet
+Rowley
+Rowleyan
+rowlock
+rowport
+rowty
+rowy
+rox
+Roxana
+Roxane
+Roxanne
+Roxburgh
+Roxburghiaceae
+Roxbury
+Roxie
+Roxolani
+Roxy
+roxy
+Roy
+royal
+royale
+royalet
+royalism
+royalist
+royalization
+royalize
+royally
+royalty
+Royena
+royet
+royetness
+royetous
+royetously
+Roystonea
+royt
+rozum
+Rua
+ruach
+ruana
+rub
+rubasse
+rubato
+rubbed
+rubber
+rubberer
+rubberize
+rubberless
+rubberneck
+rubbernecker
+rubbernose
+rubbers
+rubberstone
+rubberwise
+rubbery
+rubbing
+rubbingstone
+rubbish
+rubbishing
+rubbishingly
+rubbishly
+rubbishry
+rubbishy
+rubble
+rubbler
+rubblestone
+rubblework
+rubbly
+rubdown
+Rube
+rubedinous
+rubedity
+rubefacient
+rubefaction
+rubelet
+rubella
+rubelle
+rubellite
+rubellosis
+Rubensian
+rubeola
+rubeolar
+rubeoloid
+ruberythric
+ruberythrinic
+rubescence
+rubescent
+Rubia
+Rubiaceae
+rubiaceous
+Rubiales
+rubianic
+rubiate
+rubiator
+rubican
+rubicelle
+Rubicola
+Rubicon
+rubiconed
+rubicund
+rubicundity
+rubidic
+rubidine
+rubidium
+rubied
+rubific
+rubification
+rubificative
+rubify
+rubiginous
+rubijervine
+rubine
+rubineous
+rubious
+ruble
+rublis
+rubor
+rubric
+rubrica
+rubrical
+rubricality
+rubrically
+rubricate
+rubrication
+rubricator
+rubrician
+rubricism
+rubricist
+rubricity
+rubricize
+rubricose
+rubrific
+rubrification
+rubrify
+rubrisher
+rubrospinal
+rubstone
+Rubus
+ruby
+rubylike
+rubytail
+rubythroat
+rubywise
+rucervine
+Rucervus
+Ruchbah
+ruche
+ruching
+ruck
+rucker
+ruckle
+ruckling
+rucksack
+rucksey
+ruckus
+rucky
+ructation
+ruction
+rud
+rudas
+Rudbeckia
+rudd
+rudder
+rudderhead
+rudderhole
+rudderless
+rudderlike
+rudderpost
+rudderstock
+ruddied
+ruddily
+ruddiness
+ruddle
+ruddleman
+ruddock
+ruddy
+ruddyish
+rude
+rudely
+rudeness
+rudented
+rudenture
+ruderal
+rudesby
+Rudesheimer
+rudge
+rudiment
+rudimental
+rudimentarily
+rudimentariness
+rudimentary
+rudimentation
+rudish
+Rudista
+Rudistae
+rudistan
+rudistid
+rudity
+Rudmasday
+Rudolf
+Rudolph
+Rudolphus
+Rudy
+rue
+rueful
+ruefully
+ruefulness
+ruelike
+ruelle
+Ruellia
+ruen
+ruer
+ruesome
+ruesomeness
+ruewort
+rufescence
+rufescent
+ruff
+ruffable
+ruffed
+ruffer
+ruffian
+ruffianage
+ruffiandom
+ruffianhood
+ruffianish
+ruffianism
+ruffianize
+ruffianlike
+ruffianly
+ruffiano
+ruffin
+ruffle
+ruffled
+ruffleless
+rufflement
+ruffler
+rufflike
+ruffliness
+ruffling
+ruffly
+ruficarpous
+ruficaudate
+ruficoccin
+ruficornate
+rufigallic
+rufoferruginous
+rufofulvous
+rufofuscous
+rufopiceous
+rufotestaceous
+rufous
+rufter
+rufulous
+Rufus
+rufus
+rug
+ruga
+rugate
+Rugbeian
+Rugby
+rugged
+ruggedly
+ruggedness
+Rugger
+rugging
+ruggle
+ruggy
+rugheaded
+ruglike
+rugmaker
+rugmaking
+Rugosa
+rugosa
+rugose
+rugosely
+rugosity
+rugous
+rugulose
+ruin
+ruinable
+ruinate
+ruination
+ruinatious
+ruinator
+ruined
+ruiner
+ruing
+ruiniform
+ruinlike
+ruinous
+ruinously
+ruinousness
+ruinproof
+Rukbat
+rukh
+rulable
+Rulander
+rule
+ruledom
+ruleless
+rulemonger
+ruler
+rulership
+ruling
+rulingly
+rull
+ruller
+rullion
+Rum
+rum
+rumal
+Ruman
+Rumanian
+rumbelow
+rumble
+rumblegarie
+rumblegumption
+rumblement
+rumbler
+rumbling
+rumblingly
+rumbly
+rumbo
+rumbooze
+rumbowline
+rumbowling
+rumbullion
+rumbumptious
+rumbustical
+rumbustious
+rumbustiousness
+rumchunder
+Rumelian
+rumen
+rumenitis
+rumenocentesis
+rumenotomy
+Rumex
+rumfustian
+rumgumption
+rumgumptious
+ruminal
+ruminant
+Ruminantia
+ruminantly
+ruminate
+ruminating
+ruminatingly
+rumination
+ruminative
+ruminatively
+ruminator
+rumkin
+rumless
+rumly
+rummage
+rummager
+rummagy
+rummer
+rummily
+rumminess
+rummish
+rummy
+rumness
+rumney
+rumor
+rumorer
+rumormonger
+rumorous
+rumorproof
+rumourmonger
+rump
+rumpad
+rumpadder
+rumpade
+Rumper
+rumple
+rumpless
+rumply
+rumpscuttle
+rumpuncheon
+rumpus
+rumrunner
+rumrunning
+rumshop
+rumswizzle
+rumtytoo
+run
+runabout
+runagate
+runaround
+runaway
+runback
+runboard
+runby
+runch
+runchweed
+runcinate
+rundale
+Rundi
+rundle
+rundlet
+rune
+runecraft
+runed
+runefolk
+runeless
+runelike
+runer
+runesmith
+runestaff
+runeword
+runfish
+rung
+runghead
+rungless
+runholder
+runic
+runically
+runiform
+runite
+runkeeper
+runkle
+runkly
+runless
+runlet
+runman
+runnable
+runnel
+runner
+runnet
+running
+runningly
+runny
+runoff
+runologist
+runology
+runout
+runover
+runproof
+runrig
+runround
+runt
+runted
+runtee
+runtiness
+runtish
+runtishly
+runtishness
+runty
+runway
+rupa
+rupee
+Rupert
+rupestral
+rupestrian
+rupestrine
+rupia
+rupiah
+rupial
+Rupicapra
+Rupicaprinae
+rupicaprine
+Rupicola
+Rupicolinae
+rupicoline
+rupicolous
+rupie
+rupitic
+Ruppia
+ruptile
+ruption
+ruptive
+ruptuary
+rupturable
+rupture
+ruptured
+rupturewort
+rural
+ruralism
+ruralist
+ruralite
+rurality
+ruralization
+ruralize
+rurally
+ruralness
+rurban
+ruridecanal
+rurigenous
+Ruritania
+Ruritanian
+ruru
+Rus
+Rusa
+Ruscus
+ruse
+rush
+rushbush
+rushed
+rushen
+rusher
+rushiness
+rushing
+rushingly
+rushingness
+rushland
+rushlight
+rushlighted
+rushlike
+rushlit
+rushy
+Rusin
+rusine
+rusk
+ruskin
+Ruskinian
+rusky
+rusma
+rusot
+ruspone
+Russ
+russel
+Russelia
+Russell
+Russellite
+Russene
+russet
+russeting
+russetish
+russetlike
+russety
+Russia
+russia
+Russian
+Russianism
+Russianist
+Russianization
+Russianize
+Russification
+Russificator
+Russifier
+Russify
+Russine
+Russism
+Russniak
+Russolatrous
+Russolatry
+Russomania
+Russomaniac
+Russomaniacal
+Russophile
+Russophilism
+Russophilist
+Russophobe
+Russophobia
+Russophobiac
+Russophobism
+Russophobist
+russud
+Russula
+rust
+rustable
+rustful
+rustic
+rustical
+rustically
+rusticalness
+rusticate
+rustication
+rusticator
+rusticial
+rusticism
+rusticity
+rusticize
+rusticly
+rusticness
+rusticoat
+rustily
+rustiness
+rustle
+rustler
+rustless
+rustling
+rustlingly
+rustlingness
+rustly
+rustproof
+rustre
+rustred
+Rusty
+rusty
+rustyback
+rustyish
+ruswut
+rut
+Ruta
+rutabaga
+Rutaceae
+rutaceous
+rutaecarpine
+rutate
+rutch
+rutelian
+Rutelinae
+Ruth
+ruth
+ruthenate
+Ruthene
+Ruthenian
+ruthenic
+ruthenious
+ruthenium
+ruthenous
+ruther
+rutherford
+rutherfordine
+rutherfordite
+ruthful
+ruthfully
+ruthfulness
+ruthless
+ruthlessly
+ruthlessness
+rutic
+rutidosis
+rutilant
+rutilated
+rutile
+rutilous
+rutin
+rutinose
+Rutiodon
+ruttee
+rutter
+ruttiness
+ruttish
+ruttishly
+ruttishness
+rutty
+Rutuli
+rutyl
+rutylene
+ruvid
+rux
+rvulsant
+ryal
+ryania
+rybat
+ryder
+rye
+ryen
+Rymandra
+ryme
+Rynchospora
+rynchosporous
+rynd
+rynt
+ryot
+ryotwar
+ryotwari
+rype
+rypeck
+rytidosis
+Rytina
+Ryukyu
+S
+s
+sa
+saa
+Saad
+Saan
+Saarbrucken
+sab
+Saba
+sabadilla
+sabadine
+sabadinine
+Sabaean
+Sabaeanism
+Sabaeism
+sabaigrass
+Sabaism
+Sabaist
+Sabal
+Sabalaceae
+sabalo
+Saban
+sabanut
+Sabaoth
+Sabathikos
+Sabazian
+Sabazianism
+Sabazios
+sabbat
+Sabbatarian
+Sabbatarianism
+Sabbatary
+Sabbatean
+Sabbath
+sabbath
+Sabbathaian
+Sabbathaic
+Sabbathaist
+Sabbathbreaker
+Sabbathbreaking
+Sabbathism
+Sabbathize
+Sabbathkeeper
+Sabbathkeeping
+Sabbathless
+Sabbathlike
+Sabbathly
+Sabbatia
+sabbatia
+Sabbatian
+Sabbatic
+sabbatic
+Sabbatical
+sabbatical
+Sabbatically
+Sabbaticalness
+sabbatine
+sabbatism
+Sabbatist
+Sabbatization
+Sabbatize
+sabbaton
+sabbitha
+sabdariffa
+sabe
+sabeca
+Sabella
+sabella
+sabellan
+Sabellaria
+sabellarian
+Sabelli
+Sabellian
+Sabellianism
+Sabellianize
+sabellid
+Sabellidae
+sabelloid
+saber
+saberbill
+sabered
+saberleg
+saberlike
+saberproof
+sabertooth
+saberwing
+Sabia
+Sabiaceae
+sabiaceous
+Sabian
+Sabianism
+sabicu
+Sabik
+Sabina
+sabina
+Sabine
+sabine
+Sabinian
+sabino
+Sabir
+sable
+sablefish
+sableness
+sably
+sabora
+saboraim
+sabot
+sabotage
+saboted
+saboteur
+sabotine
+Sabra
+sabra
+sabretache
+Sabrina
+Sabromin
+sabromin
+Sabuja
+sabuline
+sabulite
+sabulose
+sabulosity
+sabulous
+sabulum
+saburra
+saburral
+saburration
+sabutan
+sabzi
+Sac
+sac
+Sacae
+sacalait
+sacaline
+sacaton
+sacatra
+sacbrood
+saccade
+saccadic
+Saccammina
+saccate
+saccated
+Saccha
+saccharamide
+saccharase
+saccharate
+saccharated
+saccharephidrosis
+saccharic
+saccharide
+sacchariferous
+saccharification
+saccharifier
+saccharify
+saccharilla
+saccharimeter
+saccharimetric
+saccharimetrical
+saccharimetry
+saccharin
+saccharinate
+saccharinated
+saccharine
+saccharineish
+saccharinely
+saccharinic
+saccharinity
+saccharization
+saccharize
+saccharobacillus
+saccharobiose
+saccharobutyric
+saccharoceptive
+saccharoceptor
+saccharochemotropic
+saccharocolloid
+saccharofarinaceous
+saccharogalactorrhea
+saccharogenic
+saccharohumic
+saccharoid
+saccharoidal
+saccharolactonic
+saccharolytic
+saccharometabolic
+saccharometabolism
+saccharometer
+saccharometric
+saccharometry
+saccharomucilaginous
+Saccharomyces
+saccharomyces
+Saccharomycetaceae
+saccharomycetaceous
+Saccharomycetales
+saccharomycete
+Saccharomycetes
+saccharomycetic
+saccharomycosis
+saccharon
+saccharonate
+saccharone
+saccharonic
+saccharophylly
+saccharorrhea
+saccharoscope
+saccharose
+saccharostarchy
+saccharosuria
+saccharotriose
+saccharous
+saccharulmic
+saccharulmin
+Saccharum
+saccharum
+saccharuria
+sacciferous
+sacciform
+Saccobranchiata
+saccobranchiate
+Saccobranchus
+saccoderm
+Saccolabium
+saccolabium
+saccomyian
+saccomyid
+Saccomyidae
+Saccomyina
+saccomyine
+saccomyoid
+Saccomyoidea
+saccomyoidean
+Saccomys
+Saccopharyngidae
+Saccopharynx
+Saccorhiza
+saccos
+saccular
+sacculate
+sacculated
+sacculation
+saccule
+Sacculina
+sacculoutricular
+sacculus
+saccus
+sacellum
+sacerdocy
+sacerdotage
+sacerdotal
+sacerdotalism
+sacerdotalist
+sacerdotalize
+sacerdotally
+sacerdotical
+sacerdotism
+sachamaker
+sachem
+sachemdom
+sachemic
+sachemship
+sachet
+Sacheverell
+Sacian
+sack
+sackage
+sackamaker
+sackbag
+sackbut
+sackcloth
+sackclothed
+sackdoudle
+sacked
+sacken
+sacker
+sackful
+sacking
+sackless
+sacklike
+sackmaker
+sackmaking
+sackman
+sacktime
+saclike
+saco
+sacope
+sacque
+sacra
+sacrad
+sacral
+sacralgia
+sacralization
+sacrament
+sacramental
+sacramentalism
+sacramentalist
+sacramentality
+sacramentally
+sacramentalness
+Sacramentarian
+sacramentarian
+sacramentarianism
+sacramentarist
+Sacramentary
+sacramentary
+sacramenter
+sacramentism
+sacramentize
+Sacramento
+sacramentum
+sacraria
+sacrarial
+sacrarium
+sacrectomy
+sacred
+sacredly
+sacredness
+sacrificable
+sacrificant
+Sacrificati
+sacrification
+sacrificator
+sacrificatory
+sacrificature
+sacrifice
+sacrificer
+sacrificial
+sacrificially
+sacrificing
+sacrilege
+sacrileger
+sacrilegious
+sacrilegiously
+sacrilegiousness
+sacrilegist
+sacrilumbal
+sacrilumbalis
+sacring
+Sacripant
+sacrist
+sacristan
+sacristy
+sacro
+sacrocaudal
+sacrococcygeal
+sacrococcygean
+sacrococcygeus
+sacrococcyx
+sacrocostal
+sacrocotyloid
+sacrocotyloidean
+sacrocoxalgia
+sacrocoxitis
+sacrodorsal
+sacrodynia
+sacrofemoral
+sacroiliac
+sacroinguinal
+sacroischiac
+sacroischiadic
+sacroischiatic
+sacrolumbal
+sacrolumbalis
+sacrolumbar
+sacropectineal
+sacroperineal
+sacropictorial
+sacroposterior
+sacropubic
+sacrorectal
+sacrosanct
+sacrosanctity
+sacrosanctness
+sacrosciatic
+sacrosecular
+sacrospinal
+sacrospinalis
+sacrospinous
+sacrotomy
+sacrotuberous
+sacrovertebral
+sacrum
+sad
+Sadachbia
+Sadalmelik
+Sadalsuud
+sadden
+saddening
+saddeningly
+saddik
+saddirham
+saddish
+saddle
+saddleback
+saddlebag
+saddlebow
+saddlecloth
+saddled
+saddleleaf
+saddleless
+saddlelike
+saddlenose
+saddler
+saddlery
+saddlesick
+saddlesore
+saddlesoreness
+saddlestead
+saddletree
+saddlewise
+saddling
+Sadducaic
+Sadducean
+Sadducee
+Sadduceeism
+Sadduceeist
+Sadducism
+Sadducize
+sade
+sadh
+sadhe
+sadhearted
+sadhu
+sadic
+Sadie
+sadiron
+sadism
+sadist
+sadistic
+sadistically
+Sadite
+sadly
+sadness
+sado
+sadomasochism
+Sadr
+sadr
+saecula
+saeculum
+Saeima
+saernaite
+saeter
+saeume
+Safar
+safari
+Safavi
+Safawid
+safe
+safeblower
+safeblowing
+safebreaker
+safebreaking
+safecracking
+safeguard
+safeguarder
+safehold
+safekeeper
+safekeeping
+safelight
+safely
+safemaker
+safemaking
+safen
+safener
+safeness
+safety
+Saffarian
+Saffarid
+saffian
+safflor
+safflorite
+safflow
+safflower
+saffron
+saffroned
+saffrontree
+saffronwood
+saffrony
+Safi
+Safine
+Safini
+safranin
+safranine
+safranophile
+safrole
+saft
+sag
+saga
+sagaciate
+sagacious
+sagaciously
+sagaciousness
+sagacity
+Sagai
+sagaie
+sagaman
+sagamite
+sagamore
+sagapenum
+sagathy
+sage
+sagebrush
+sagebrusher
+sagebush
+sageleaf
+sagely
+sagene
+sageness
+sagenite
+sagenitic
+Sageretia
+sagerose
+sageship
+sagewood
+sagger
+sagging
+saggon
+saggy
+saghavart
+Sagina
+saginate
+sagination
+saging
+Sagitarii
+sagitta
+sagittal
+sagittally
+Sagittaria
+Sagittariid
+Sagittarius
+sagittarius
+Sagittary
+sagittary
+sagittate
+Sagittid
+sagittiferous
+sagittiform
+sagittocyst
+sagittoid
+sagless
+sago
+sagoin
+sagolike
+Sagra
+saguaro
+Saguerus
+sagum
+saguran
+sagvandite
+sagwire
+sagy
+sah
+Sahadeva
+Sahaptin
+Sahara
+Saharan
+Saharian
+Saharic
+sahh
+sahib
+Sahibah
+Sahidic
+sahme
+Saho
+sahoukar
+sahukar
+sai
+saic
+said
+Saidi
+Saify
+saiga
+Saiid
+sail
+sailable
+sailage
+sailboat
+sailcloth
+sailed
+sailer
+sailfish
+sailflying
+sailing
+sailingly
+sailless
+sailmaker
+sailmaking
+sailor
+sailoring
+sailorizing
+sailorless
+sailorlike
+sailorly
+sailorman
+sailorproof
+sailplane
+sailship
+sailsman
+saily
+saim
+saimiri
+saimy
+sain
+Sainfoin
+saint
+saintdom
+sainted
+saintess
+sainthood
+saintish
+saintism
+saintless
+saintlike
+saintlily
+saintliness
+saintling
+saintly
+saintologist
+saintology
+Saintpaulia
+saintship
+saip
+Saiph
+sair
+sairly
+sairve
+sairy
+Saite
+saithe
+Saitic
+Saiva
+Saivism
+saj
+sajou
+Sak
+Saka
+Sakai
+Sakalava
+sake
+sakeber
+sakeen
+Sakel
+Sakelarides
+Sakell
+Sakellaridis
+saker
+sakeret
+Sakha
+saki
+sakieh
+Sakkara
+Saktism
+sakulya
+Sakyamuni
+Sal
+sal
+salaam
+salaamlike
+salability
+salable
+salableness
+salably
+salaceta
+salacious
+salaciously
+salaciousness
+salacity
+salacot
+salad
+salading
+salago
+salagrama
+salal
+salamandarin
+salamander
+salamanderlike
+Salamandra
+salamandrian
+Salamandridae
+salamandriform
+Salamandrina
+salamandrine
+salamandroid
+salambao
+Salaminian
+salamo
+salampore
+salangane
+salangid
+Salangidae
+Salar
+salar
+salariat
+salaried
+salary
+salaryless
+salat
+salay
+sale
+salegoer
+salele
+salema
+salenixon
+salep
+saleratus
+saleroom
+salesclerk
+Salesian
+saleslady
+salesman
+salesmanship
+salespeople
+salesperson
+salesroom
+saleswoman
+salework
+saleyard
+salfern
+Salian
+Saliaric
+Salic
+salic
+Salicaceae
+salicaceous
+Salicales
+Salicariaceae
+salicetum
+salicin
+salicional
+salicorn
+Salicornia
+salicyl
+salicylal
+salicylaldehyde
+salicylamide
+salicylanilide
+salicylase
+salicylate
+salicylic
+salicylide
+salicylidene
+salicylism
+salicylize
+salicylous
+salicyluric
+salicylyl
+salience
+salient
+Salientia
+salientian
+saliently
+saliferous
+salifiable
+salification
+salify
+saligenin
+saligot
+salimeter
+salimetry
+Salina
+salina
+Salinan
+salination
+saline
+Salinella
+salinelle
+salineness
+saliniferous
+salinification
+saliniform
+salinity
+salinize
+salinometer
+salinometry
+salinosulphureous
+salinoterreous
+Salisburia
+Salish
+Salishan
+salite
+salited
+Saliva
+saliva
+salival
+Salivan
+salivant
+salivary
+salivate
+salivation
+salivator
+salivatory
+salivous
+Salix
+salix
+salle
+sallee
+salleeman
+sallenders
+sallet
+sallier
+salloo
+sallow
+sallowish
+sallowness
+sallowy
+Sally
+sally
+Sallybloom
+sallyman
+sallywood
+Salm
+salma
+salmagundi
+salmiac
+salmine
+salmis
+Salmo
+Salmon
+salmon
+salmonberry
+Salmonella
+salmonella
+salmonellae
+salmonellosis
+salmonet
+salmonid
+Salmonidae
+salmoniform
+salmonlike
+salmonoid
+Salmonoidea
+Salmonoidei
+salmonsite
+salmwood
+salnatron
+Salol
+salol
+Salome
+salometer
+salometry
+salomon
+Salomonia
+Salomonian
+Salomonic
+salon
+saloon
+saloonist
+saloonkeeper
+saloop
+Salopian
+salopian
+salp
+Salpa
+salpa
+salpacean
+salpian
+salpicon
+Salpidae
+salpiform
+Salpiglossis
+salpiglossis
+salpingectomy
+salpingemphraxis
+salpinges
+salpingian
+salpingion
+salpingitic
+salpingitis
+salpingocatheterism
+salpingocele
+salpingocyesis
+salpingomalleus
+salpingonasal
+salpingopalatal
+salpingopalatine
+salpingoperitonitis
+salpingopexy
+salpingopharyngeal
+salpingopharyngeus
+salpingopterygoid
+salpingorrhaphy
+salpingoscope
+salpingostaphyline
+salpingostenochoria
+salpingostomatomy
+salpingostomy
+salpingotomy
+salpinx
+salpoid
+salse
+salsifis
+salsify
+salsilla
+Salsola
+Salsolaceae
+salsolaceous
+salsuginous
+salt
+salta
+saltant
+saltarella
+saltarello
+saltary
+saltate
+saltation
+saltativeness
+Saltator
+saltator
+Saltatoria
+saltatorial
+saltatorian
+saltatoric
+saltatorious
+saltatory
+saltbush
+saltcat
+saltcatch
+saltcellar
+salted
+saltee
+salten
+salter
+saltern
+saltery
+saltfat
+saltfoot
+salthouse
+saltier
+saltierra
+saltierwise
+Saltigradae
+saltigrade
+saltimbanco
+saltimbank
+saltimbankery
+saltine
+saltiness
+salting
+saltish
+saltishly
+saltishness
+saltless
+saltlessness
+saltly
+saltmaker
+saltmaking
+saltman
+saltmouth
+saltness
+saltometer
+saltorel
+saltpan
+saltpeter
+saltpetrous
+saltpond
+saltspoon
+saltspoonful
+saltsprinkler
+saltus
+saltweed
+saltwife
+saltworker
+saltworks
+saltwort
+salty
+salubrify
+salubrious
+salubriously
+salubriousness
+salubrity
+saluki
+salung
+salutarily
+salutariness
+salutary
+salutation
+salutational
+salutationless
+salutatious
+salutatorian
+salutatorily
+salutatorium
+salutatory
+salute
+saluter
+salutiferous
+salutiferously
+Salva
+salvability
+salvable
+salvableness
+salvably
+Salvadora
+salvadora
+Salvadoraceae
+salvadoraceous
+Salvadoran
+Salvadorian
+salvage
+salvageable
+salvagee
+salvageproof
+salvager
+salvaging
+Salvarsan
+salvarsan
+salvatella
+salvation
+salvational
+salvationism
+salvationist
+salvatory
+salve
+salveline
+Salvelinus
+salver
+salverform
+Salvia
+salvianin
+salvific
+salvifical
+salvifically
+Salvinia
+Salviniaceae
+salviniaceous
+Salviniales
+salviol
+salvo
+salvor
+salvy
+Salwey
+salzfelle
+Sam
+sam
+Samadera
+samadh
+samadhi
+samaj
+Samal
+saman
+Samandura
+Samani
+Samanid
+Samantha
+samara
+samaria
+samariform
+Samaritan
+Samaritaness
+Samaritanism
+samarium
+Samarkand
+samaroid
+samarra
+samarskite
+Samas
+samba
+Sambal
+sambal
+sambaqui
+sambar
+Sambara
+Sambathe
+sambhogakaya
+Sambo
+sambo
+Sambucaceae
+Sambucus
+sambuk
+sambuke
+sambunigrin
+Samburu
+same
+samekh
+samel
+sameliness
+samely
+samen
+sameness
+samesome
+Samgarnebo
+samh
+Samhain
+samhita
+Samian
+samiel
+Samir
+samiresite
+samiri
+samisen
+Samish
+samite
+samkara
+samlet
+sammel
+sammer
+sammier
+Sammy
+sammy
+Samnani
+Samnite
+Samoan
+Samogitian
+samogonka
+Samolus
+Samosatenian
+samothere
+Samotherium
+Samothracian
+samovar
+Samoyed
+Samoyedic
+samp
+sampaguita
+sampaloc
+sampan
+samphire
+sampi
+sample
+sampleman
+sampler
+samplery
+sampling
+Sampsaean
+Samsam
+samsara
+samshu
+Samsien
+samskara
+Samson
+samson
+Samsoness
+Samsonian
+Samsonic
+Samsonistic
+samsonite
+Samucan
+Samucu
+Samuel
+samurai
+Samydaceae
+San
+san
+sanability
+sanable
+sanableness
+sanai
+Sanand
+sanative
+sanativeness
+sanatoria
+sanatorium
+sanatory
+Sanballat
+sanbenito
+Sanche
+sancho
+sanct
+sancta
+sanctanimity
+sanctifiable
+sanctifiableness
+sanctifiably
+sanctificate
+sanctification
+sanctified
+sanctifiedly
+sanctifier
+sanctify
+sanctifyingly
+sanctilogy
+sanctiloquent
+sanctimonial
+sanctimonious
+sanctimoniously
+sanctimoniousness
+sanctimony
+sanction
+sanctionable
+sanctionary
+sanctionative
+sanctioner
+sanctionist
+sanctionless
+sanctionment
+sanctitude
+sanctity
+sanctologist
+Sanctology
+sanctorium
+sanctuaried
+sanctuarize
+sanctuary
+sanctum
+Sanctus
+Sancy
+sancyite
+sand
+sandak
+sandal
+sandaled
+sandaliform
+sandaling
+sandalwood
+sandalwort
+sandan
+sandarac
+sandaracin
+sandastros
+Sandawe
+sandbag
+sandbagger
+sandbank
+sandbin
+sandblast
+sandboard
+sandbox
+sandboy
+sandbur
+sandclub
+sandculture
+sanded
+Sandeep
+Sandemanian
+Sandemanianism
+Sandemanism
+Sander
+sander
+sanderling
+sanders
+sandfish
+sandflower
+sandglass
+sandheat
+sandhi
+sandiferous
+sandiness
+sanding
+Sandip
+sandiver
+sandix
+sandlapper
+sandless
+sandlike
+sandling
+sandman
+sandnatter
+sandnecker
+sandpaper
+sandpaperer
+sandpeep
+sandpiper
+sandproof
+Sandra
+sandrock
+sandspit
+sandspur
+sandstay
+sandstone
+sandstorm
+sandust
+sandweed
+sandweld
+sandwich
+sandwood
+sandworm
+sandwort
+Sandy
+sandy
+sandyish
+sane
+sanely
+saneness
+Sanetch
+Sanford
+Sanforized
+sang
+sanga
+Sangamon
+sangar
+sangaree
+sangei
+sanger
+sangerbund
+sangerfest
+Sanggil
+sangha
+Sangho
+Sangir
+Sangirese
+sanglant
+sangley
+Sangraal
+sangreeroot
+sangrel
+sangsue
+sanguicolous
+sanguifacient
+sanguiferous
+sanguification
+sanguifier
+sanguifluous
+sanguimotor
+sanguimotory
+sanguinaceous
+Sanguinaria
+sanguinarily
+sanguinariness
+sanguinary
+sanguine
+sanguineless
+sanguinely
+sanguineness
+sanguineobilious
+sanguineophlegmatic
+sanguineous
+sanguineousness
+sanguineovascular
+sanguinicolous
+sanguiniferous
+sanguinification
+sanguinism
+sanguinity
+sanguinivorous
+sanguinocholeric
+sanguinolency
+sanguinolent
+sanguinopoietic
+sanguinous
+Sanguisorba
+Sanguisorbaceae
+sanguisuge
+sanguisugent
+sanguisugous
+sanguivorous
+Sanhedrim
+Sanhedrin
+Sanhedrist
+Sanhita
+sanicle
+Sanicula
+sanidine
+sanidinic
+sanidinite
+sanies
+sanification
+sanify
+sanious
+sanipractic
+sanitarian
+sanitarily
+sanitarist
+sanitarium
+sanitary
+sanitate
+sanitation
+sanitationist
+sanitist
+sanitize
+Sanity
+sanity
+sanjak
+sanjakate
+sanjakbeg
+sanjakship
+Sanjay
+Sanjeev
+Sanjib
+sank
+sankha
+Sankhya
+sannaite
+Sannoisian
+sannup
+sannyasi
+sannyasin
+sanopurulent
+sanoserous
+Sanpoil
+sans
+Sansar
+sansei
+Sansevieria
+sanshach
+sansi
+Sanskrit
+Sanskritic
+Sanskritist
+Sanskritization
+Sanskritize
+sant
+Santa
+Santal
+santal
+Santalaceae
+santalaceous
+Santalales
+Santali
+santalic
+santalin
+santalol
+Santalum
+santalwood
+santapee
+Santee
+santene
+Santiago
+santimi
+santims
+santir
+Santo
+Santolina
+santon
+santonica
+santonin
+santoninic
+santorinite
+Santos
+sanukite
+Sanvitalia
+Sanyakoan
+sao
+Saoshyant
+sap
+sapa
+sapajou
+sapan
+sapanwood
+sapbush
+sapek
+Saperda
+sapful
+Sapharensian
+saphead
+sapheaded
+sapheadedness
+saphena
+saphenal
+saphenous
+saphie
+sapid
+sapidity
+sapidless
+sapidness
+sapience
+sapiency
+sapient
+sapiential
+sapientially
+sapientize
+sapiently
+sapin
+sapinda
+Sapindaceae
+sapindaceous
+Sapindales
+sapindaship
+Sapindus
+Sapium
+sapiutan
+saple
+sapless
+saplessness
+sapling
+saplinghood
+sapo
+sapodilla
+sapogenin
+saponaceous
+saponaceousness
+saponacity
+Saponaria
+saponarin
+saponary
+Saponi
+saponifiable
+saponification
+saponifier
+saponify
+saponin
+saponite
+sapophoric
+sapor
+saporific
+saporosity
+saporous
+Sapota
+sapota
+Sapotaceae
+sapotaceous
+sapote
+sapotilha
+sapotilla
+sapotoxin
+sappanwood
+sappare
+sapper
+Sapphic
+sapphic
+sapphire
+sapphireberry
+sapphired
+sapphirewing
+sapphiric
+sapphirine
+Sapphism
+Sapphist
+Sappho
+sappiness
+sapping
+sapples
+sappy
+sapremia
+sapremic
+saprine
+saprocoll
+saprodil
+saprodontia
+saprogenic
+saprogenous
+Saprolegnia
+Saprolegniaceae
+saprolegniaceous
+Saprolegniales
+saprolegnious
+saprolite
+saprolitic
+sapropel
+sapropelic
+sapropelite
+saprophagan
+saprophagous
+saprophile
+saprophilous
+saprophyte
+saprophytic
+saprophytically
+saprophytism
+saprostomous
+saprozoic
+sapsago
+sapskull
+sapsuck
+sapsucker
+sapucaia
+sapucainha
+sapwood
+sapwort
+Saqib
+sar
+Sara
+saraad
+sarabacan
+Sarabaite
+saraband
+Saracen
+Saracenian
+Saracenic
+Saracenical
+Saracenism
+Saracenlike
+Sarada
+saraf
+Sarah
+Sarakolet
+Sarakolle
+Saramaccaner
+Saran
+sarangi
+sarangousty
+Saratoga
+Saratogan
+Saravan
+Sarawakese
+sarawakite
+Sarawan
+sarbacane
+sarbican
+sarcasm
+sarcasmproof
+sarcast
+sarcastic
+sarcastical
+sarcastically
+sarcasticalness
+sarcasticness
+sarcelle
+sarcenet
+sarcilis
+Sarcina
+sarcine
+sarcitis
+sarcle
+sarcler
+sarcoadenoma
+Sarcobatus
+sarcoblast
+sarcocarcinoma
+sarcocarp
+sarcocele
+Sarcococca
+Sarcocolla
+sarcocollin
+sarcocyst
+Sarcocystidea
+sarcocystidean
+sarcocystidian
+Sarcocystis
+sarcocystoid
+sarcocyte
+sarcode
+sarcoderm
+Sarcodes
+sarcodic
+sarcodictyum
+Sarcodina
+sarcodous
+sarcoenchondroma
+sarcogenic
+sarcogenous
+sarcoglia
+Sarcogyps
+sarcoid
+sarcolactic
+sarcolemma
+sarcolemmic
+sarcolemmous
+sarcoline
+sarcolite
+sarcologic
+sarcological
+sarcologist
+sarcology
+sarcolysis
+sarcolyte
+sarcolytic
+sarcoma
+sarcomatoid
+sarcomatosis
+sarcomatous
+sarcomere
+Sarcophaga
+sarcophagal
+sarcophagi
+sarcophagic
+sarcophagid
+Sarcophagidae
+sarcophagine
+sarcophagize
+sarcophagous
+sarcophagus
+sarcophagy
+sarcophile
+sarcophilous
+Sarcophilus
+sarcoplasm
+sarcoplasma
+sarcoplasmatic
+sarcoplasmic
+sarcoplast
+sarcoplastic
+sarcopoietic
+Sarcopsylla
+Sarcopsyllidae
+Sarcoptes
+sarcoptic
+sarcoptid
+Sarcoptidae
+Sarcorhamphus
+sarcosepsis
+sarcosepta
+sarcoseptum
+sarcosine
+sarcosis
+sarcosoma
+sarcosperm
+sarcosporid
+Sarcosporida
+Sarcosporidia
+sarcosporidial
+sarcosporidian
+sarcosporidiosis
+sarcostosis
+sarcostyle
+sarcotheca
+sarcotherapeutics
+sarcotherapy
+sarcotic
+sarcous
+Sarcura
+Sard
+sard
+sardachate
+Sardanapalian
+Sardanapalus
+sardel
+Sardian
+sardine
+sardinewise
+Sardinian
+sardius
+Sardoin
+sardonic
+sardonical
+sardonically
+sardonicism
+sardonyx
+sare
+sargasso
+Sargassum
+sargassum
+sargo
+Sargonic
+Sargonid
+Sargonide
+sargus
+sari
+sarif
+Sarigue
+sarigue
+sarinda
+sarip
+sark
+sarkar
+sarkful
+sarkical
+sarkine
+sarking
+sarkinite
+sarkit
+sarkless
+sarlak
+sarlyk
+Sarmatian
+Sarmatic
+sarmatier
+sarment
+sarmenta
+sarmentaceous
+sarmentiferous
+sarmentose
+sarmentous
+sarmentum
+sarna
+sarod
+saron
+sarong
+saronic
+saronide
+saros
+Sarothamnus
+Sarothra
+sarothrum
+sarpler
+sarpo
+sarra
+Sarracenia
+sarracenia
+Sarraceniaceae
+sarraceniaceous
+sarracenial
+Sarraceniales
+sarraf
+sarrazin
+sarrusophone
+sarrusophonist
+sarsa
+sarsaparilla
+sarsaparillin
+Sarsar
+Sarsechim
+sarsen
+sarsenet
+Sarsi
+Sart
+sart
+sartage
+sartain
+Sartish
+sartor
+sartoriad
+sartorial
+sartorially
+sartorian
+sartorite
+sartorius
+Saruk
+sarus
+Sarvarthasiddha
+sarwan
+Sarzan
+sasa
+sasan
+sasani
+sasanqua
+sash
+sashay
+sashery
+sashing
+sashless
+sasin
+sasine
+saskatoon
+sassaby
+sassafac
+sassafrack
+sassafras
+Sassak
+Sassan
+Sassanian
+Sassanid
+Sassanidae
+Sassanide
+Sassenach
+sassolite
+sassy
+sassywood
+Sastean
+sat
+satable
+Satan
+satan
+Satanael
+Satanas
+satang
+satanic
+satanical
+satanically
+satanicalness
+Satanism
+Satanist
+satanist
+Satanistic
+Satanity
+satanize
+Satanology
+Satanophany
+Satanophil
+Satanophobia
+Satanship
+satara
+satchel
+satcheled
+sate
+sateen
+sateenwood
+sateless
+satelles
+satellitarian
+satellite
+satellited
+satellitesimal
+satellitian
+satellitic
+satellitious
+satellitium
+satellitoid
+satellitory
+satelloid
+satiability
+satiable
+satiableness
+satiably
+satiate
+satiation
+Satieno
+satient
+satiety
+satin
+satinbush
+satine
+satined
+satinette
+satinfin
+satinflower
+satinite
+satinity
+satinize
+satinleaf
+satinlike
+satinpod
+satinwood
+satiny
+satire
+satireproof
+satiric
+satirical
+satirically
+satiricalness
+satirist
+satirizable
+satirize
+satirizer
+satisdation
+satisdiction
+satisfaction
+satisfactional
+satisfactionist
+satisfactionless
+satisfactive
+satisfactorily
+satisfactoriness
+satisfactorious
+satisfactory
+satisfiable
+satisfice
+satisfied
+satisfiedly
+satisfiedness
+satisfier
+satisfy
+satisfying
+satisfyingly
+satisfyingness
+satispassion
+satlijk
+Satrae
+satrap
+satrapal
+satrapess
+satrapic
+satrapical
+satrapy
+satron
+Satsuma
+sattle
+sattva
+satura
+saturability
+saturable
+saturant
+saturate
+saturated
+saturater
+saturation
+saturator
+Saturday
+Satureia
+Saturn
+Saturnal
+Saturnale
+Saturnalia
+saturnalia
+Saturnalian
+saturnalian
+Saturnia
+Saturnian
+saturnian
+Saturnicentric
+saturniid
+Saturniidae
+Saturnine
+saturnine
+saturninely
+saturnineness
+saturninity
+saturnism
+saturnity
+saturnize
+Saturnus
+satyagrahi
+satyashodak
+satyr
+satyresque
+satyress
+satyriasis
+satyric
+Satyridae
+Satyrinae
+satyrine
+satyrion
+satyrism
+satyrlike
+satyromaniac
+sauce
+sauceboat
+saucebox
+saucedish
+sauceless
+sauceline
+saucemaker
+saucemaking
+sauceman
+saucepan
+sauceplate
+saucer
+saucerful
+saucerleaf
+saucerless
+saucerlike
+saucily
+sauciness
+saucy
+Sauerbraten
+sauerkraut
+sauf
+sauger
+saugh
+saughen
+Saul
+sauld
+saulie
+sault
+saulter
+Saulteur
+saum
+saumon
+saumont
+Saumur
+Saumya
+sauna
+saunders
+saunderswood
+saunter
+saunterer
+sauntering
+saunteringly
+sauqui
+saur
+Saura
+Sauraseni
+Saurauia
+Saurauiaceae
+saurel
+Sauria
+saurian
+sauriasis
+sauriosis
+Saurischia
+saurischian
+Sauroctonos
+saurodont
+Saurodontidae
+Saurognathae
+saurognathism
+saurognathous
+Sauromatian
+saurophagous
+sauropod
+Sauropoda
+sauropodous
+sauropsid
+Sauropsida
+sauropsidan
+sauropsidian
+Sauropterygia
+sauropterygian
+Saurornithes
+saurornithic
+Saururaceae
+saururaceous
+Saururae
+saururan
+saururous
+Saururus
+saury
+sausage
+sausagelike
+sausinger
+Saussurea
+saussurite
+saussuritic
+saussuritization
+saussuritize
+saut
+saute
+sauterelle
+sauterne
+sauternes
+sauteur
+sauty
+Sauvagesia
+sauve
+sauvegarde
+savable
+savableness
+savacu
+savage
+savagedom
+savagely
+savageness
+savagerous
+savagery
+savagess
+savagism
+savagize
+savanilla
+savanna
+Savannah
+savant
+Savara
+savarin
+savation
+save
+saved
+saveloy
+saver
+Savery
+savin
+saving
+savingly
+savingness
+savior
+savioress
+saviorhood
+saviorship
+Saviour
+Savitar
+Savitri
+savola
+Savonarolist
+Savonnerie
+savor
+savored
+savorer
+savorily
+savoriness
+savoringly
+savorless
+savorous
+savorsome
+savory
+savour
+savoy
+Savoyard
+savoyed
+savoying
+savssat
+savvy
+saw
+sawah
+Sawaiori
+sawali
+Sawan
+sawarra
+sawback
+sawbelly
+sawbill
+sawbones
+sawbuck
+sawbwa
+sawder
+sawdust
+sawdustish
+sawdustlike
+sawdusty
+sawed
+sawer
+sawfish
+sawfly
+sawhorse
+sawing
+sawish
+sawlike
+sawmaker
+sawmaking
+sawman
+sawmill
+sawmiller
+sawmilling
+sawmon
+sawmont
+sawn
+Sawney
+sawney
+sawsetter
+sawsharper
+sawsmith
+sawt
+sawway
+sawworker
+sawwort
+sawyer
+sax
+saxatile
+saxboard
+saxcornet
+Saxe
+saxhorn
+Saxicava
+saxicavous
+Saxicola
+saxicole
+Saxicolidae
+Saxicolinae
+saxicoline
+saxicolous
+Saxifraga
+Saxifragaceae
+saxifragaceous
+saxifragant
+saxifrage
+saxifragous
+saxifrax
+saxigenous
+Saxish
+Saxon
+Saxondom
+Saxonian
+Saxonic
+Saxonical
+Saxonically
+Saxonish
+Saxonism
+Saxonist
+saxonite
+Saxonization
+Saxonize
+Saxonly
+Saxony
+saxophone
+saxophonist
+saxotromba
+saxpence
+saxten
+saxtie
+saxtuba
+say
+saya
+sayability
+sayable
+sayableness
+Sayal
+sayer
+sayette
+sayid
+saying
+sazen
+Sbaikian
+sblood
+sbodikins
+scab
+scabbard
+scabbardless
+scabbed
+scabbedness
+scabbery
+scabbily
+scabbiness
+scabble
+scabbler
+scabbling
+scabby
+scabellum
+scaberulous
+scabid
+scabies
+scabietic
+scabinus
+Scabiosa
+scabiosity
+scabious
+scabish
+scabland
+scabrate
+scabrescent
+scabrid
+scabridity
+scabridulous
+scabrities
+scabriusculose
+scabriusculous
+scabrosely
+scabrous
+scabrously
+scabrousness
+scabwort
+scacchic
+scacchite
+scad
+scaddle
+scads
+Scaean
+scaff
+scaffer
+scaffery
+scaffie
+scaffle
+scaffold
+scaffoldage
+scaffolder
+scaffolding
+scaglia
+scagliola
+scagliolist
+scala
+scalable
+scalableness
+scalably
+scalage
+scalar
+scalare
+Scalaria
+scalarian
+scalariform
+Scalariidae
+scalarwise
+scalation
+scalawag
+scalawaggery
+scalawaggy
+scald
+scaldberry
+scalded
+scalder
+scaldfish
+scaldic
+scalding
+scaldweed
+scaldy
+scale
+scaleback
+scalebark
+scaleboard
+scaled
+scaledrake
+scalefish
+scaleful
+scaleless
+scalelet
+scalelike
+scaleman
+scalena
+scalene
+scalenohedral
+scalenohedron
+scalenon
+scalenous
+scalenum
+scalenus
+scalepan
+scaleproof
+scaler
+scales
+scalesman
+scalesmith
+scaletail
+scalewing
+scalewise
+scalework
+scalewort
+scaliger
+scaliness
+scaling
+scall
+scalled
+scallion
+scallola
+scallom
+scallop
+scalloper
+scalloping
+scallopwise
+scalma
+scaloni
+Scalops
+Scalopus
+scalp
+scalpeen
+scalpel
+scalpellar
+scalpellic
+scalpellum
+scalpellus
+scalper
+scalping
+scalpless
+scalpriform
+scalprum
+scalpture
+scalt
+scaly
+scalytail
+scam
+scamander
+Scamandrius
+scamble
+scambler
+scambling
+scamell
+scamler
+scamles
+scammoniate
+scammonin
+scammony
+scammonyroot
+scamp
+scampavia
+scamper
+scamperer
+scamphood
+scamping
+scampingly
+scampish
+scampishly
+scampishness
+scampsman
+scan
+scandal
+scandalization
+scandalize
+scandalizer
+scandalmonger
+scandalmongering
+scandalmongery
+scandalmonging
+scandalous
+scandalously
+scandalousness
+scandalproof
+scandaroon
+scandent
+scandia
+Scandian
+scandic
+scandicus
+Scandinavia
+Scandinavian
+Scandinavianism
+scandium
+Scandix
+Scania
+Scanian
+Scanic
+scanmag
+scannable
+scanner
+scanning
+scanningly
+scansion
+scansionist
+Scansores
+scansorial
+scansorious
+scant
+scanties
+scantily
+scantiness
+scantity
+scantle
+scantling
+scantlinged
+scantly
+scantness
+scanty
+scap
+scape
+scapegallows
+scapegoat
+scapegoatism
+scapegrace
+scapel
+scapeless
+scapement
+scapethrift
+scapha
+Scaphander
+Scaphandridae
+scaphion
+Scaphiopodidae
+Scaphiopus
+scaphism
+scaphite
+Scaphites
+Scaphitidae
+scaphitoid
+scaphocephalic
+scaphocephalism
+scaphocephalous
+scaphocephalus
+scaphocephaly
+scaphocerite
+scaphoceritic
+scaphognathite
+scaphognathitic
+scaphoid
+scapholunar
+scaphopod
+Scaphopoda
+scaphopodous
+scapiform
+scapigerous
+scapoid
+scapolite
+scapolitization
+scapose
+scapple
+scappler
+scapula
+scapulalgia
+scapular
+scapulare
+scapulary
+scapulated
+scapulectomy
+scapulet
+scapulimancy
+scapuloaxillary
+scapulobrachial
+scapuloclavicular
+scapulocoracoid
+scapulodynia
+scapulohumeral
+scapulopexy
+scapuloradial
+scapulospinal
+scapulothoracic
+scapuloulnar
+scapulovertebral
+scapus
+scar
+scarab
+scarabaean
+scarabaei
+scarabaeid
+Scarabaeidae
+scarabaeidoid
+scarabaeiform
+Scarabaeinae
+scarabaeoid
+scarabaeus
+scarabee
+scaraboid
+Scaramouch
+scaramouch
+scarce
+scarcelins
+scarcely
+scarcement
+scarcen
+scarceness
+scarcity
+scare
+scarebabe
+scarecrow
+scarecrowish
+scarecrowy
+scareful
+scarehead
+scaremonger
+scaremongering
+scareproof
+scarer
+scaresome
+scarf
+scarface
+scarfed
+scarfer
+scarflike
+scarfpin
+scarfskin
+scarfwise
+scarfy
+scarid
+Scaridae
+scarification
+scarificator
+scarifier
+scarify
+scarily
+scariose
+scarious
+scarlatina
+scarlatinal
+scarlatiniform
+scarlatinoid
+scarlatinous
+scarless
+scarlet
+scarletberry
+scarletseed
+scarlety
+scarman
+scarn
+scaroid
+scarp
+scarpines
+scarping
+scarpment
+scarproof
+scarred
+scarrer
+scarring
+scarry
+scart
+scarth
+Scarus
+scarus
+scarved
+scary
+scase
+scasely
+scat
+scatch
+scathe
+scatheful
+scatheless
+scathelessly
+scathing
+scathingly
+Scaticook
+scatland
+scatologia
+scatologic
+scatological
+scatology
+scatomancy
+scatophagid
+Scatophagidae
+scatophagoid
+scatophagous
+scatophagy
+scatoscopy
+scatter
+scatterable
+scatteration
+scatteraway
+scatterbrain
+scatterbrained
+scatterbrains
+scattered
+scatteredly
+scatteredness
+scatterer
+scattergood
+scattering
+scatteringly
+scatterling
+scattermouch
+scattery
+scatty
+scatula
+scaturient
+scaul
+scaum
+scaup
+scauper
+scaur
+scaurie
+scaut
+scavage
+scavel
+scavenage
+scavenge
+scavenger
+scavengerism
+scavengership
+scavengery
+scavenging
+scaw
+scawd
+scawl
+scazon
+scazontic
+sceat
+scelalgia
+scelerat
+scelidosaur
+scelidosaurian
+scelidosauroid
+Scelidosaurus
+Scelidotherium
+Sceliphron
+sceloncus
+Sceloporus
+scelotyrbe
+scena
+scenario
+scenarioist
+scenarioization
+scenarioize
+scenarist
+scenarization
+scenarize
+scenary
+scend
+scene
+scenecraft
+Scenedesmus
+sceneful
+sceneman
+scenery
+sceneshifter
+scenewright
+scenic
+scenical
+scenically
+scenist
+scenite
+scenograph
+scenographer
+scenographic
+scenographical
+scenographically
+scenography
+Scenopinidae
+scent
+scented
+scenter
+scentful
+scenting
+scentless
+scentlessness
+scentproof
+scentwood
+scepsis
+scepter
+scepterdom
+sceptered
+scepterless
+sceptic
+sceptral
+sceptropherous
+sceptrosophy
+sceptry
+scerne
+sceuophorion
+sceuophylacium
+sceuophylax
+schaapsteker
+Schaefferia
+schairerite
+schalmei
+schalmey
+schalstein
+schanz
+schapbachite
+schappe
+schapped
+schapping
+scharf
+Scharlachberger
+schatchen
+Scheat
+Schedar
+schediasm
+schediastic
+Schedius
+schedular
+schedulate
+schedule
+schedulize
+scheelite
+scheffel
+schefferite
+schelling
+Schellingian
+Schellingianism
+Schellingism
+schelly
+scheltopusik
+schema
+schemata
+schematic
+schematically
+schematism
+schematist
+schematization
+schematize
+schematizer
+schematogram
+schematograph
+schematologetically
+schematomancy
+schematonics
+scheme
+schemeful
+schemeless
+schemer
+schemery
+scheming
+schemingly
+schemist
+schemy
+schene
+schepel
+schepen
+scherm
+scherzando
+scherzi
+scherzo
+schesis
+Scheuchzeria
+Scheuchzeriaceae
+scheuchzeriaceous
+schiavone
+Schiedam
+schiffli
+schiller
+schillerfels
+schillerization
+schillerize
+schilling
+schimmel
+schindylesis
+schindyletic
+Schinus
+schipperke
+Schisandra
+Schisandraceae
+schism
+schisma
+schismatic
+schismatical
+schismatically
+schismaticalness
+schismatism
+schismatist
+schismatize
+schismic
+schismless
+schist
+schistaceous
+schistic
+schistocelia
+schistocephalus
+Schistocerca
+schistocoelia
+schistocormia
+schistocormus
+schistocyte
+schistocytosis
+schistoglossia
+schistoid
+schistomelia
+schistomelus
+schistoprosopia
+schistoprosopus
+schistorrhachis
+schistoscope
+schistose
+schistosity
+Schistosoma
+schistosome
+schistosomia
+schistosomiasis
+schistosomus
+schistosternia
+schistothorax
+schistous
+schistus
+Schizaea
+Schizaeaceae
+schizaeaceous
+Schizanthus
+schizanthus
+schizaxon
+schizocarp
+schizocarpic
+schizocarpous
+schizochroal
+schizocoele
+schizocoelic
+schizocoelous
+schizocyte
+schizocytosis
+schizodinic
+schizogamy
+schizogenesis
+schizogenetic
+schizogenetically
+schizogenic
+schizogenous
+schizogenously
+schizognath
+Schizognathae
+schizognathism
+schizognathous
+schizogonic
+schizogony
+Schizogregarinae
+schizogregarine
+Schizogregarinida
+schizoid
+schizoidism
+Schizolaenaceae
+schizolaenaceous
+schizolite
+schizolysigenous
+Schizomeria
+schizomycete
+Schizomycetes
+schizomycetic
+schizomycetous
+schizomycosis
+Schizonemertea
+schizonemertean
+schizonemertine
+Schizoneura
+Schizonotus
+schizont
+schizopelmous
+Schizopetalon
+schizophasia
+Schizophragma
+schizophrene
+schizophrenia
+schizophreniac
+schizophrenic
+Schizophyceae
+Schizophyllum
+Schizophyta
+schizophyte
+schizophytic
+schizopod
+Schizopoda
+schizopodal
+schizopodous
+schizorhinal
+schizospore
+schizostele
+schizostelic
+schizostely
+schizothecal
+schizothoracic
+schizothyme
+schizothymia
+schizothymic
+schizotrichia
+Schizotrypanum
+schiztic
+Schlauraffenland
+Schleichera
+schlemiel
+schlemihl
+schlenter
+schlieren
+schlieric
+schloop
+Schmalkaldic
+schmaltz
+schmelz
+schmelze
+schnabel
+Schnabelkanne
+schnapper
+schnapps
+schnauzer
+schneider
+Schneiderian
+schnitzel
+schnorchel
+schnorkel
+schnorrer
+scho
+schochat
+schochet
+schoenobatic
+schoenobatist
+Schoenocaulon
+Schoenus
+schoenus
+Schoharie
+schola
+scholae
+scholaptitude
+scholar
+scholarch
+scholardom
+scholarian
+scholarism
+scholarless
+scholarlike
+scholarliness
+scholarly
+scholarship
+scholasm
+scholastic
+scholastical
+scholastically
+scholasticate
+scholasticism
+scholasticly
+scholia
+scholiast
+scholiastic
+scholion
+scholium
+Schomburgkia
+schone
+schonfelsite
+Schoodic
+School
+school
+schoolable
+schoolbag
+schoolbook
+schoolbookish
+schoolboy
+schoolboydom
+schoolboyhood
+schoolboyish
+schoolboyishly
+schoolboyishness
+schoolboyism
+schoolbutter
+schoolcraft
+schooldame
+schooldom
+schooled
+schoolery
+schoolfellow
+schoolfellowship
+schoolful
+schoolgirl
+schoolgirlhood
+schoolgirlish
+schoolgirlishly
+schoolgirlishness
+schoolgirlism
+schoolgirly
+schoolgoing
+schoolhouse
+schooling
+schoolingly
+schoolish
+schoolkeeper
+schoolkeeping
+schoolless
+schoollike
+schoolmaam
+schoolmaamish
+schoolmaid
+schoolman
+schoolmaster
+schoolmasterhood
+schoolmastering
+schoolmasterish
+schoolmasterishly
+schoolmasterishness
+schoolmasterism
+schoolmasterly
+schoolmastership
+schoolmastery
+schoolmate
+schoolmiss
+schoolmistress
+schoolmistressy
+schoolroom
+schoolteacher
+schoolteacherish
+schoolteacherly
+schoolteachery
+schoolteaching
+schooltide
+schooltime
+schoolward
+schoolwork
+schoolyard
+schoon
+schooner
+Schopenhauereanism
+Schopenhauerian
+Schopenhauerism
+schoppen
+schorenbergite
+schorl
+schorlaceous
+schorlomite
+schorlous
+schorly
+schottische
+schottish
+schout
+schraubthaler
+Schrebera
+schreiner
+schreinerize
+schriesheimite
+Schrund
+schtoff
+schuh
+schuhe
+schuit
+schule
+schultenite
+schungite
+schuss
+schute
+schwa
+schwabacher
+Schwalbea
+schwarz
+Schwarzian
+schweizer
+schweizerkase
+Schwendenerian
+Schwenkfelder
+Schwenkfeldian
+Sciadopitys
+Sciaena
+sciaenid
+Sciaenidae
+sciaeniform
+Sciaeniformes
+sciaenoid
+scialytic
+sciamachy
+Scian
+sciapod
+sciapodous
+Sciara
+sciarid
+Sciaridae
+Sciarinae
+sciatheric
+sciatherical
+sciatherically
+sciatic
+sciatica
+sciatical
+sciatically
+sciaticky
+scibile
+science
+scienced
+scient
+sciential
+scientician
+scientific
+scientifical
+scientifically
+scientificalness
+scientificogeographical
+scientificohistorical
+scientificophilosophical
+scientificopoetic
+scientificoreligious
+scientificoromantic
+scientintically
+scientism
+Scientist
+scientist
+scientistic
+scientistically
+scientize
+scientolism
+scilicet
+Scilla
+scillain
+scillipicrin
+Scillitan
+scillitin
+scillitoxin
+Scillonian
+scimitar
+scimitared
+scimitarpod
+scincid
+Scincidae
+scincidoid
+scinciform
+scincoid
+scincoidian
+Scincomorpha
+Scincus
+scind
+sciniph
+scintilla
+scintillant
+scintillantly
+scintillate
+scintillating
+scintillatingly
+scintillation
+scintillator
+scintillescent
+scintillize
+scintillometer
+scintilloscope
+scintillose
+scintillously
+scintle
+scintler
+scintling
+sciograph
+sciographic
+sciography
+sciolism
+sciolist
+sciolistic
+sciolous
+sciomachiology
+sciomachy
+sciomancy
+sciomantic
+scion
+sciophilous
+sciophyte
+scioptic
+sciopticon
+scioptics
+scioptric
+sciosophist
+sciosophy
+Sciot
+scioterical
+scioterique
+sciotheism
+sciotheric
+sciotherical
+sciotherically
+scious
+scirenga
+Scirophoria
+Scirophorion
+Scirpus
+scirrhi
+scirrhogastria
+scirrhoid
+scirrhoma
+scirrhosis
+scirrhous
+scirrhus
+scirrosity
+scirtopod
+Scirtopoda
+scirtopodous
+scissel
+scissible
+scissile
+scission
+scissiparity
+scissor
+scissorbill
+scissorbird
+scissorer
+scissoring
+scissorium
+scissorlike
+scissorlikeness
+scissors
+scissorsbird
+scissorsmith
+scissorstail
+scissortail
+scissorwise
+scissura
+scissure
+Scissurella
+scissurellid
+Scissurellidae
+Scitaminales
+Scitamineae
+sciurid
+Sciuridae
+sciurine
+sciuroid
+sciuromorph
+Sciuromorpha
+sciuromorphic
+Sciuropterus
+Sciurus
+sclaff
+sclate
+sclater
+Sclav
+Sclavonian
+sclaw
+scler
+sclera
+scleral
+scleranth
+Scleranthaceae
+Scleranthus
+scleratogenous
+sclere
+sclerectasia
+sclerectomy
+scleredema
+sclereid
+sclerema
+sclerencephalia
+sclerenchyma
+sclerenchymatous
+sclerenchyme
+sclererythrin
+scleretinite
+Scleria
+scleriasis
+sclerification
+sclerify
+sclerite
+scleritic
+scleritis
+sclerized
+sclerobase
+sclerobasic
+scleroblast
+scleroblastema
+scleroblastemic
+scleroblastic
+sclerocauly
+sclerochorioiditis
+sclerochoroiditis
+scleroconjunctival
+scleroconjunctivitis
+sclerocornea
+sclerocorneal
+sclerodactylia
+sclerodactyly
+scleroderm
+Scleroderma
+scleroderma
+Sclerodermaceae
+Sclerodermata
+Sclerodermatales
+sclerodermatitis
+sclerodermatous
+Sclerodermi
+sclerodermia
+sclerodermic
+sclerodermite
+sclerodermitic
+sclerodermitis
+sclerodermous
+sclerogen
+Sclerogeni
+sclerogenoid
+sclerogenous
+scleroid
+scleroiritis
+sclerokeratitis
+sclerokeratoiritis
+scleroma
+scleromata
+scleromeninx
+scleromere
+sclerometer
+sclerometric
+scleronychia
+scleronyxis
+Scleropages
+Scleroparei
+sclerophthalmia
+sclerophyll
+sclerophyllous
+sclerophylly
+scleroprotein
+sclerosal
+sclerosarcoma
+Scleroscope
+scleroscope
+sclerose
+sclerosed
+scleroseptum
+sclerosis
+scleroskeletal
+scleroskeleton
+Sclerospora
+sclerostenosis
+Sclerostoma
+sclerostomiasis
+sclerotal
+sclerote
+sclerotia
+sclerotial
+sclerotic
+sclerotica
+sclerotical
+scleroticectomy
+scleroticochorioiditis
+scleroticochoroiditis
+scleroticonyxis
+scleroticotomy
+Sclerotinia
+sclerotinial
+sclerotiniose
+sclerotioid
+sclerotitic
+sclerotitis
+sclerotium
+sclerotized
+sclerotoid
+sclerotome
+sclerotomic
+sclerotomy
+sclerous
+scleroxanthin
+sclerozone
+scliff
+sclim
+sclimb
+scoad
+scob
+scobby
+scobicular
+scobiform
+scobs
+scoff
+scoffer
+scoffery
+scoffing
+scoffingly
+scoffingstock
+scofflaw
+scog
+scoggan
+scogger
+scoggin
+scogginism
+scogginist
+scoinson
+scoke
+scolb
+scold
+scoldable
+scoldenore
+scolder
+scolding
+scoldingly
+scoleces
+scoleciasis
+scolecid
+Scolecida
+scoleciform
+scolecite
+scolecoid
+scolecology
+scolecophagous
+scolecospore
+scoleryng
+scolex
+Scolia
+scolia
+scolices
+scoliid
+Scoliidae
+scoliograptic
+scoliokyposis
+scoliometer
+scolion
+scoliorachitic
+scoliosis
+scoliotic
+scoliotone
+scolite
+scollop
+scolog
+scolopaceous
+Scolopacidae
+scolopacine
+Scolopax
+Scolopendra
+scolopendra
+Scolopendrella
+Scolopendrellidae
+scolopendrelloid
+scolopendrid
+Scolopendridae
+scolopendriform
+scolopendrine
+Scolopendrium
+scolopendroid
+scolophore
+scolopophore
+Scolymus
+scolytid
+Scolytidae
+scolytoid
+Scolytus
+Scomber
+scomberoid
+Scombresocidae
+Scombresox
+scombrid
+Scombridae
+scombriform
+Scombriformes
+scombrine
+scombroid
+Scombroidea
+scombroidean
+scombrone
+sconce
+sconcer
+sconcheon
+sconcible
+scone
+scoon
+scoop
+scooped
+scooper
+scoopful
+scooping
+scoopingly
+scoot
+scooter
+scopa
+scoparin
+scoparius
+scopate
+scope
+scopeless
+scopelid
+Scopelidae
+scopeliform
+scopelism
+scopeloid
+Scopelus
+scopet
+scopic
+Scopidae
+scopiferous
+scopiform
+scopiformly
+scopine
+scopiped
+scopola
+scopolamine
+scopoleine
+scopoletin
+scopoline
+scopperil
+scops
+scoptical
+scoptically
+scoptophilia
+scoptophiliac
+scoptophilic
+scoptophobia
+scopula
+Scopularia
+scopularian
+scopulate
+scopuliferous
+scopuliform
+scopuliped
+Scopulipedes
+scopulite
+scopulous
+scopulousness
+Scopus
+scorbute
+scorbutic
+scorbutical
+scorbutically
+scorbutize
+scorbutus
+scorch
+scorched
+scorcher
+scorching
+scorchingly
+scorchingness
+scorchproof
+score
+scoreboard
+scorebook
+scored
+scorekeeper
+scorekeeping
+scoreless
+scorer
+scoria
+scoriac
+scoriaceous
+scoriae
+scorification
+scorifier
+scoriform
+scorify
+scoring
+scorious
+scorn
+scorned
+scorner
+scornful
+scornfully
+scornfulness
+scorningly
+scornproof
+scorny
+scorodite
+Scorpaena
+scorpaenid
+Scorpaenidae
+scorpaenoid
+scorpene
+scorper
+Scorpidae
+Scorpididae
+Scorpii
+Scorpiid
+Scorpio
+scorpioid
+scorpioidal
+Scorpioidea
+scorpion
+Scorpiones
+scorpionic
+scorpionid
+Scorpionida
+Scorpionidea
+Scorpionis
+scorpionweed
+scorpionwort
+Scorpiurus
+Scorpius
+scorse
+scortation
+scortatory
+Scorzonera
+Scot
+scot
+scotale
+Scotch
+scotch
+scotcher
+Scotchery
+Scotchification
+Scotchify
+Scotchiness
+scotching
+Scotchman
+scotchman
+Scotchness
+Scotchwoman
+Scotchy
+scote
+scoter
+scoterythrous
+Scotia
+scotia
+Scotic
+scotino
+Scotism
+Scotist
+Scotistic
+Scotistical
+Scotize
+Scotlandwards
+scotodinia
+scotogram
+scotograph
+scotographic
+scotography
+scotoma
+scotomata
+scotomatic
+scotomatical
+scotomatous
+scotomia
+scotomic
+scotomy
+scotophobia
+scotopia
+scotopic
+scotoscope
+scotosis
+Scots
+Scotsman
+Scotswoman
+Scott
+Scotticism
+Scotticize
+Scottie
+Scottification
+Scottify
+Scottish
+Scottisher
+Scottishly
+Scottishman
+Scottishness
+Scotty
+scouch
+scouk
+scoundrel
+scoundreldom
+scoundrelish
+scoundrelism
+scoundrelly
+scoundrelship
+scoup
+scour
+scourage
+scoured
+scourer
+scouress
+scourfish
+scourge
+scourger
+scourging
+scourgingly
+scouriness
+scouring
+scourings
+scourway
+scourweed
+scourwort
+scoury
+scouse
+scout
+scoutcraft
+scoutdom
+scouter
+scouth
+scouther
+scouthood
+scouting
+scoutingly
+scoutish
+scoutmaster
+scoutwatch
+scove
+scovel
+scovillite
+scovy
+scow
+scowbank
+scowbanker
+scowder
+scowl
+scowler
+scowlful
+scowling
+scowlingly
+scowlproof
+scowman
+scrab
+scrabble
+scrabbled
+scrabbler
+scrabe
+scrae
+scraffle
+scrag
+scragged
+scraggedly
+scraggedness
+scragger
+scraggily
+scragginess
+scragging
+scraggled
+scraggling
+scraggly
+scraggy
+scraily
+scram
+scramasax
+scramble
+scramblement
+scrambler
+scrambling
+scramblingly
+scrambly
+scrampum
+scran
+scranch
+scrank
+scranky
+scrannel
+scranning
+scranny
+scrap
+scrapable
+scrapbook
+scrape
+scrapeage
+scraped
+scrapepenny
+scraper
+scrapie
+scraping
+scrapingly
+scrapler
+scraplet
+scrapling
+scrapman
+scrapmonger
+scrappage
+scrapped
+scrapper
+scrappet
+scrappily
+scrappiness
+scrapping
+scrappingly
+scrapple
+scrappler
+scrappy
+scrapworks
+scrapy
+scrat
+scratch
+scratchable
+scratchably
+scratchback
+scratchboard
+scratchbrush
+scratchcard
+scratchcarding
+scratchcat
+scratcher
+scratches
+scratchification
+scratchiness
+scratching
+scratchingly
+scratchless
+scratchlike
+scratchman
+scratchproof
+scratchweed
+scratchwork
+scratchy
+scrath
+scratter
+scrattle
+scrattling
+scrauch
+scrauchle
+scraunch
+scraw
+scrawk
+scrawl
+scrawler
+scrawliness
+scrawly
+scrawm
+scrawnily
+scrawniness
+scrawny
+scray
+scraze
+screak
+screaking
+screaky
+scream
+screamer
+screaminess
+screaming
+screamingly
+screamproof
+screamy
+scree
+screech
+screechbird
+screecher
+screechily
+screechiness
+screeching
+screechingly
+screechy
+screed
+screek
+screel
+screeman
+screen
+screenable
+screenage
+screencraft
+screendom
+screened
+screener
+screening
+screenless
+screenlike
+screenman
+screenplay
+screensman
+screenwise
+screenwork
+screenwriter
+screeny
+screet
+screeve
+screeved
+screever
+screich
+screigh
+screve
+screver
+screw
+screwable
+screwage
+screwball
+screwbarrel
+screwdrive
+screwdriver
+screwed
+screwer
+screwhead
+screwiness
+screwing
+screwish
+screwless
+screwlike
+screwman
+screwmatics
+screwship
+screwsman
+screwstem
+screwstock
+screwwise
+screwworm
+screwy
+scribable
+scribacious
+scribaciousness
+scribal
+scribatious
+scribatiousness
+scribblage
+scribblative
+scribblatory
+scribble
+scribbleable
+scribbled
+scribbledom
+scribbleism
+scribblemania
+scribblement
+scribbleomania
+scribbler
+scribbling
+scribblingly
+scribbly
+scribe
+scriber
+scribeship
+scribing
+scribism
+scribophilous
+scride
+scrieve
+scriever
+scriggle
+scriggler
+scriggly
+scrike
+scrim
+scrime
+scrimer
+scrimmage
+scrimmager
+scrimp
+scrimped
+scrimpily
+scrimpiness
+scrimpingly
+scrimply
+scrimpness
+scrimption
+scrimpy
+scrimshander
+scrimshandy
+scrimshank
+scrimshanker
+scrimshaw
+scrimshon
+scrimshorn
+scrin
+scrinch
+scrine
+scringe
+scriniary
+scrip
+scripee
+scripless
+scrippage
+script
+scription
+scriptitious
+scriptitiously
+scriptitory
+scriptive
+scriptor
+scriptorial
+scriptorium
+scriptory
+scriptural
+Scripturalism
+scripturalism
+Scripturalist
+scripturalist
+Scripturality
+scripturality
+scripturalize
+scripturally
+scripturalness
+Scripturarian
+Scripture
+scripture
+Scriptured
+scriptured
+Scriptureless
+scripturiency
+scripturient
+Scripturism
+scripturism
+Scripturist
+scripula
+scripulum
+scritch
+scritoire
+scrivaille
+scrive
+scrivello
+scriven
+scrivener
+scrivenership
+scrivenery
+scrivening
+scrivenly
+scriver
+scrob
+scrobble
+scrobe
+scrobicula
+scrobicular
+scrobiculate
+scrobiculated
+scrobicule
+scrobiculus
+scrobis
+scrod
+scrodgill
+scroff
+scrofula
+scrofularoot
+scrofulaweed
+scrofulide
+scrofulism
+scrofulitic
+scrofuloderm
+scrofuloderma
+scrofulorachitic
+scrofulosis
+scrofulotuberculous
+scrofulous
+scrofulously
+scrofulousness
+scrog
+scroggy
+scrolar
+scroll
+scrolled
+scrollery
+scrollhead
+scrollwise
+scrollwork
+scrolly
+scronach
+scroo
+scrooch
+scrooge
+scroop
+Scrophularia
+Scrophulariaceae
+scrophulariaceous
+scrota
+scrotal
+scrotectomy
+scrotiform
+scrotitis
+scrotocele
+scrotofemoral
+scrotum
+scrouge
+scrouger
+scrounge
+scrounger
+scrounging
+scrout
+scrow
+scroyle
+scrub
+scrubbable
+scrubbed
+scrubber
+scrubbery
+scrubbily
+scrubbiness
+scrubbird
+scrubbly
+scrubboard
+scrubby
+scrubgrass
+scrubland
+scrubwood
+scruf
+scruff
+scruffle
+scruffman
+scruffy
+scruft
+scrum
+scrummage
+scrummager
+scrump
+scrumple
+scrumption
+scrumptious
+scrumptiously
+scrumptiousness
+scrunch
+scrunchy
+scrunge
+scrunger
+scrunt
+scruple
+scrupleless
+scrupler
+scruplesome
+scruplesomeness
+scrupula
+scrupular
+scrupuli
+scrupulist
+scrupulosity
+scrupulous
+scrupulously
+scrupulousness
+scrupulum
+scrupulus
+scrush
+scrutability
+scrutable
+scrutate
+scrutation
+scrutator
+scrutatory
+scrutinant
+scrutinate
+scrutineer
+scrutinization
+scrutinize
+scrutinizer
+scrutinizingly
+scrutinous
+scrutinously
+scrutiny
+scruto
+scrutoire
+scruze
+scry
+scryer
+scud
+scuddaler
+scuddawn
+scudder
+scuddick
+scuddle
+scuddy
+scudi
+scudler
+scudo
+scuff
+scuffed
+scuffer
+scuffle
+scuffler
+scufflingly
+scuffly
+scuffy
+scuft
+scufter
+scug
+scuggery
+sculch
+sculduddery
+scull
+sculler
+scullery
+scullful
+scullion
+scullionish
+scullionize
+scullionship
+scullog
+sculp
+sculper
+sculpin
+sculpt
+sculptile
+sculptitory
+sculptograph
+sculptography
+Sculptor
+sculptor
+Sculptorid
+sculptress
+sculptural
+sculpturally
+sculpturation
+sculpture
+sculptured
+sculpturer
+sculpturesque
+sculpturesquely
+sculpturesqueness
+sculpturing
+sculsh
+scum
+scumber
+scumble
+scumbling
+scumboard
+scumfish
+scumless
+scumlike
+scummed
+scummer
+scumming
+scummy
+scumproof
+scun
+scuncheon
+scunder
+scunner
+scup
+scupful
+scuppaug
+scupper
+scuppernong
+scuppet
+scuppler
+scur
+scurdy
+scurf
+scurfer
+scurfily
+scurfiness
+scurflike
+scurfy
+scurrier
+scurrile
+scurrilist
+scurrility
+scurrilize
+scurrilous
+scurrilously
+scurrilousness
+scurry
+scurvied
+scurvily
+scurviness
+scurvish
+scurvy
+scurvyweed
+scusation
+scuse
+scut
+scuta
+scutage
+scutal
+scutate
+scutated
+scutatiform
+scutation
+scutch
+scutcheon
+scutcheoned
+scutcheonless
+scutcheonlike
+scutcheonwise
+scutcher
+scutching
+scute
+scutel
+scutella
+scutellae
+scutellar
+Scutellaria
+scutellarin
+scutellate
+scutellated
+scutellation
+scutellerid
+Scutelleridae
+scutelliform
+scutelligerous
+scutelliplantar
+scutelliplantation
+scutellum
+scutibranch
+Scutibranchia
+scutibranchian
+scutibranchiate
+scutifer
+scutiferous
+scutiform
+scutiger
+Scutigera
+scutigeral
+Scutigeridae
+scutigerous
+scutiped
+scutter
+scuttle
+scuttlebutt
+scuttleful
+scuttleman
+scuttler
+scuttling
+scuttock
+scutty
+scutula
+scutular
+scutulate
+scutulated
+scutulum
+Scutum
+scutum
+scybala
+scybalous
+scybalum
+scye
+scyelite
+Scyld
+Scylla
+Scyllaea
+Scyllaeidae
+scyllarian
+Scyllaridae
+scyllaroid
+Scyllarus
+Scyllidae
+Scylliidae
+scyllioid
+Scylliorhinidae
+scylliorhinoid
+Scylliorhinus
+scyllite
+scyllitol
+Scyllium
+scypha
+scyphae
+scyphate
+scyphi
+scyphiferous
+scyphiform
+scyphiphorous
+scyphistoma
+scyphistomae
+scyphistomoid
+scyphistomous
+scyphoi
+scyphomancy
+Scyphomedusae
+scyphomedusan
+scyphomedusoid
+scyphophore
+Scyphophori
+scyphophorous
+scyphopolyp
+scyphose
+scyphostoma
+Scyphozoa
+scyphozoan
+scyphula
+scyphulus
+scyphus
+scyt
+scytale
+Scyth
+scythe
+scytheless
+scythelike
+scytheman
+scythesmith
+scythestone
+scythework
+Scythian
+Scythic
+Scythize
+scytitis
+scytoblastema
+scytodepsic
+Scytonema
+Scytonemataceae
+scytonemataceous
+scytonematoid
+scytonematous
+Scytopetalaceae
+scytopetalaceous
+Scytopetalum
+sdeath
+sdrucciola
+se
+sea
+seabeach
+seabeard
+Seabee
+seaberry
+seaboard
+seaborderer
+seabound
+seacannie
+seacatch
+seacoast
+seaconny
+seacraft
+seacrafty
+seacunny
+seadog
+seadrome
+seafardinger
+seafare
+seafarer
+seafaring
+seaflood
+seaflower
+seafolk
+Seaforthia
+seafowl
+Seaghan
+seagirt
+seagoer
+seagoing
+seah
+seahound
+seak
+seal
+sealable
+sealant
+sealch
+sealed
+sealer
+sealery
+sealess
+sealet
+sealette
+sealflower
+sealike
+sealine
+sealing
+sealless
+seallike
+sealskin
+sealwort
+Sealyham
+seam
+seaman
+seamancraft
+seamanite
+seamanlike
+seamanly
+seamanship
+seamark
+Seamas
+seambiter
+seamed
+seamer
+seaminess
+seaming
+seamless
+seamlessly
+seamlessness
+seamlet
+seamlike
+seamost
+seamrend
+seamrog
+seamster
+seamstress
+Seamus
+seamy
+Sean
+seance
+seapiece
+seaplane
+seaport
+seaquake
+sear
+searce
+searcer
+search
+searchable
+searchableness
+searchant
+searcher
+searcheress
+searcherlike
+searchership
+searchful
+searching
+searchingly
+searchingness
+searchless
+searchlight
+searchment
+searcloth
+seared
+searedness
+searer
+searing
+searlesite
+searness
+seary
+Seasan
+seascape
+seascapist
+seascout
+seascouting
+seashine
+seashore
+seasick
+seasickness
+seaside
+seasider
+season
+seasonable
+seasonableness
+seasonably
+seasonal
+seasonality
+seasonally
+seasonalness
+seasoned
+seasonedly
+seasoner
+seasoning
+seasoninglike
+seasonless
+seastrand
+seastroke
+seat
+seatang
+seated
+seater
+seathe
+seating
+seatless
+seatrain
+seatron
+seatsman
+seatwork
+seave
+seavy
+seawant
+seaward
+seawardly
+seaware
+seaway
+seaweed
+seaweedy
+seawife
+seawoman
+seaworn
+seaworthiness
+seaworthy
+seax
+Seba
+sebacate
+sebaceous
+sebacic
+sebait
+Sebastian
+sebastianite
+Sebastichthys
+Sebastodes
+sebate
+sebesten
+sebiferous
+sebific
+sebilla
+sebiparous
+sebkha
+sebolith
+seborrhagia
+seborrhea
+seborrheal
+seborrheic
+seborrhoic
+Sebright
+sebum
+sebundy
+sec
+secability
+secable
+Secale
+secalin
+secaline
+secalose
+Secamone
+secancy
+secant
+secantly
+secateur
+secede
+Seceder
+seceder
+secern
+secernent
+secernment
+secesh
+secesher
+Secessia
+Secession
+secession
+Secessional
+secessional
+secessionalist
+Secessiondom
+secessioner
+secessionism
+secessionist
+sech
+Sechium
+Sechuana
+seck
+Seckel
+seclude
+secluded
+secludedly
+secludedness
+secluding
+secluse
+seclusion
+seclusionist
+seclusive
+seclusively
+seclusiveness
+secodont
+secohm
+secohmmeter
+second
+secondar
+secondarily
+secondariness
+secondary
+seconde
+seconder
+secondhand
+secondhanded
+secondhandedly
+secondhandedness
+secondly
+secondment
+secondness
+secos
+secpar
+secque
+secre
+secrecy
+secret
+secreta
+secretage
+secretagogue
+secretarial
+secretarian
+Secretariat
+secretariat
+secretariate
+secretary
+secretaryship
+secrete
+secretin
+secretion
+secretional
+secretionary
+secretitious
+secretive
+secretively
+secretiveness
+secretly
+secretmonger
+secretness
+secreto
+secretomotor
+secretor
+secretory
+secretum
+sect
+sectarial
+sectarian
+sectarianism
+sectarianize
+sectarianly
+sectarism
+sectarist
+sectary
+sectator
+sectile
+sectility
+section
+sectional
+sectionalism
+sectionalist
+sectionality
+sectionalization
+sectionalize
+sectionally
+sectionary
+sectionist
+sectionize
+sectioplanography
+sectism
+sectist
+sectiuncle
+sective
+sector
+sectoral
+sectored
+sectorial
+sectroid
+sectwise
+secular
+secularism
+secularist
+secularistic
+secularity
+secularization
+secularize
+secularizer
+secularly
+secularness
+secund
+secundate
+secundation
+secundiflorous
+secundigravida
+secundine
+secundipara
+secundiparity
+secundiparous
+secundly
+secundogeniture
+secundoprimary
+secundus
+securable
+securance
+secure
+securely
+securement
+secureness
+securer
+securicornate
+securifer
+Securifera
+securiferous
+securiform
+Securigera
+securigerous
+securitan
+security
+Sedaceae
+Sedan
+sedan
+Sedang
+sedanier
+Sedat
+sedate
+sedately
+sedateness
+sedation
+sedative
+sedent
+Sedentaria
+sedentarily
+sedentariness
+sedentary
+sedentation
+Seder
+sederunt
+sedge
+sedged
+sedgelike
+sedging
+sedgy
+sedigitate
+sedigitated
+sedile
+sedilia
+sediment
+sedimental
+sedimentarily
+sedimentary
+sedimentate
+sedimentation
+sedimentous
+sedimetric
+sedimetrical
+sedition
+seditionary
+seditionist
+seditious
+seditiously
+seditiousness
+sedjadeh
+Sedovic
+seduce
+seduceable
+seducee
+seducement
+seducer
+seducible
+seducing
+seducingly
+seducive
+seduct
+seduction
+seductionist
+seductive
+seductively
+seductiveness
+seductress
+sedulity
+sedulous
+sedulously
+sedulousness
+Sedum
+sedum
+see
+seeable
+seeableness
+Seebeck
+seecatch
+seech
+seed
+seedage
+seedbed
+seedbird
+seedbox
+seedcake
+seedcase
+seedeater
+seeded
+Seeder
+seeder
+seedful
+seedgall
+seedily
+seediness
+seedkin
+seedless
+seedlessness
+seedlet
+seedlike
+seedling
+seedlip
+seedman
+seedness
+seedsman
+seedstalk
+seedtime
+seedy
+seege
+seeing
+seeingly
+seeingness
+seek
+seeker
+Seekerism
+seeking
+seel
+seelful
+seely
+seem
+seemable
+seemably
+seemer
+seeming
+seemingly
+seemingness
+seemless
+seemlihead
+seemlily
+seemliness
+seemly
+seen
+seenie
+Seenu
+seep
+seepage
+seeped
+seepweed
+seepy
+seer
+seerband
+seercraft
+seeress
+seerfish
+seerhand
+seerhood
+seerlike
+seerpaw
+seership
+seersucker
+seesaw
+seesawiness
+seesee
+seethe
+seething
+seethingly
+seetulputty
+Sefekhet
+seg
+seggar
+seggard
+segged
+seggrom
+Seginus
+segment
+segmental
+segmentally
+segmentary
+segmentate
+segmentation
+segmented
+sego
+segol
+segolate
+segreant
+segregable
+segregant
+segregate
+segregateness
+segregation
+segregational
+segregationist
+segregative
+segregator
+Sehyo
+seiche
+Seid
+Seidel
+seidel
+Seidlitz
+seigneur
+seigneurage
+seigneuress
+seigneurial
+seigneury
+seignior
+seigniorage
+seignioral
+seignioralty
+seigniorial
+seigniority
+seigniorship
+seigniory
+seignorage
+seignoral
+seignorial
+seignorize
+seignory
+seilenoi
+seilenos
+seine
+seiner
+seirospore
+seirosporic
+seise
+seism
+seismal
+seismatical
+seismetic
+seismic
+seismically
+seismicity
+seismism
+seismochronograph
+seismogram
+seismograph
+seismographer
+seismographic
+seismographical
+seismography
+seismologic
+seismological
+seismologically
+seismologist
+seismologue
+seismology
+seismometer
+seismometric
+seismometrical
+seismometrograph
+seismometry
+seismomicrophone
+seismoscope
+seismoscopic
+seismotectonic
+seismotherapy
+seismotic
+seit
+seity
+Seiurus
+Seiyuhonto
+Seiyukai
+seizable
+seize
+seizer
+seizin
+seizing
+seizor
+seizure
+sejant
+sejoin
+sejoined
+sejugate
+sejugous
+sejunct
+sejunctive
+sejunctively
+sejunctly
+Sekane
+Sekani
+Sekar
+Seker
+Sekhwan
+sekos
+selachian
+Selachii
+selachoid
+Selachoidei
+Selachostome
+Selachostomi
+selachostomous
+seladang
+Selaginaceae
+Selaginella
+Selaginellaceae
+selaginellaceous
+selagite
+Selago
+selah
+selamin
+selamlik
+selbergite
+Selbornian
+seldom
+seldomcy
+seldomer
+seldomly
+seldomness
+seldor
+seldseen
+sele
+select
+selectable
+selected
+selectedly
+selectee
+selection
+selectionism
+selectionist
+selective
+selectively
+selectiveness
+selectivity
+selectly
+selectman
+selectness
+selector
+Selena
+selenate
+Selene
+selenian
+seleniate
+selenic
+Selenicereus
+selenide
+Selenidera
+seleniferous
+selenigenous
+selenion
+selenious
+Selenipedium
+selenite
+selenitic
+selenitical
+selenitiferous
+selenitish
+selenium
+seleniuret
+selenobismuthite
+selenocentric
+selenodont
+Selenodonta
+selenodonty
+selenograph
+selenographer
+selenographic
+selenographical
+selenographically
+selenographist
+selenography
+selenolatry
+selenological
+selenologist
+selenology
+selenomancy
+selenoscope
+selenosis
+selenotropic
+selenotropism
+selenotropy
+selensilver
+selensulphur
+Seleucian
+Seleucid
+Seleucidae
+Seleucidan
+Seleucidean
+Seleucidian
+Seleucidic
+self
+selfcide
+selfdom
+selfful
+selffulness
+selfheal
+selfhood
+selfish
+selfishly
+selfishness
+selfism
+selfist
+selfless
+selflessly
+selflessness
+selfly
+selfness
+selfpreservatory
+selfsame
+selfsameness
+selfward
+selfwards
+selictar
+seligmannite
+selihoth
+Selina
+Selinuntine
+selion
+Seljuk
+Seljukian
+sell
+sella
+sellable
+sellably
+sellaite
+sellar
+sellate
+sellenders
+seller
+Selli
+sellie
+selliform
+selling
+sellout
+selly
+selsoviet
+selsyn
+selt
+Selter
+Seltzer
+seltzogene
+Selung
+selva
+selvage
+selvaged
+selvagee
+selvedge
+selzogene
+Semaeostomae
+Semaeostomata
+Semang
+semanteme
+semantic
+semantical
+semantically
+semantician
+semanticist
+semantics
+semantological
+semantology
+semantron
+semaphore
+semaphoric
+semaphorical
+semaphorically
+semaphorist
+semarum
+semasiological
+semasiologically
+semasiologist
+semasiology
+semateme
+sematic
+sematographic
+sematography
+sematology
+sematrope
+semball
+semblable
+semblably
+semblance
+semblant
+semblative
+semble
+seme
+Semecarpus
+semeed
+semeia
+semeiography
+semeiologic
+semeiological
+semeiologist
+semeiology
+semeion
+semeiotic
+semeiotical
+semeiotics
+semelfactive
+semelincident
+semen
+semence
+Semeostoma
+semese
+semester
+semestral
+semestrial
+semi
+semiabstracted
+semiaccomplishment
+semiacid
+semiacidified
+semiacquaintance
+semiadherent
+semiadjectively
+semiadnate
+semiaerial
+semiaffectionate
+semiagricultural
+Semiahmoo
+semialbinism
+semialcoholic
+semialien
+semiallegiance
+semialpine
+semialuminous
+semiamplexicaul
+semiamplitude
+semianarchist
+semianatomical
+semianatropal
+semianatropous
+semiangle
+semiangular
+semianimal
+semianimate
+semianimated
+semiannealed
+semiannual
+semiannually
+semiannular
+semianthracite
+semiantiministerial
+semiantique
+semiape
+semiaperiodic
+semiaperture
+semiappressed
+semiaquatic
+semiarborescent
+semiarc
+semiarch
+semiarchitectural
+semiarid
+semiaridity
+semiarticulate
+semiasphaltic
+semiatheist
+semiattached
+semiautomatic
+semiautomatically
+semiautonomous
+semiaxis
+semibacchanalian
+semibachelor
+semibald
+semibalked
+semiball
+semiballoon
+semiband
+semibarbarian
+semibarbarianism
+semibarbaric
+semibarbarism
+semibarbarous
+semibaronial
+semibarren
+semibase
+semibasement
+semibastion
+semibay
+semibeam
+semibejan
+semibelted
+semibifid
+semibituminous
+semibleached
+semiblind
+semiblunt
+semibody
+semiboiled
+semibolshevist
+semibolshevized
+semibouffant
+semibourgeois
+semibreve
+semibull
+semiburrowing
+semic
+semicadence
+semicalcareous
+semicalcined
+semicallipygian
+semicanal
+semicanalis
+semicannibalic
+semicantilever
+semicarbazide
+semicarbazone
+semicarbonate
+semicarbonize
+semicardinal
+semicartilaginous
+semicastrate
+semicastration
+semicatholicism
+semicaudate
+semicelestial
+semicell
+semicellulose
+semicentenarian
+semicentenary
+semicentennial
+semicentury
+semichannel
+semichaotic
+semichemical
+semicheviot
+semichevron
+semichiffon
+semichivalrous
+semichoric
+semichorus
+semichrome
+semicircle
+semicircled
+semicircular
+semicircularity
+semicircularly
+semicircularness
+semicircumference
+semicircumferentor
+semicircumvolution
+semicirque
+semicitizen
+semicivilization
+semicivilized
+semiclassic
+semiclassical
+semiclause
+semicleric
+semiclerical
+semiclimber
+semiclimbing
+semiclose
+semiclosed
+semiclosure
+semicoagulated
+semicoke
+semicollapsible
+semicollar
+semicollegiate
+semicolloid
+semicolloquial
+semicolon
+semicolonial
+semicolumn
+semicolumnar
+semicoma
+semicomatose
+semicombined
+semicombust
+semicomic
+semicomical
+semicommercial
+semicompact
+semicompacted
+semicomplete
+semicomplicated
+semiconceal
+semiconcrete
+semiconducting
+semiconductor
+semicone
+semiconfident
+semiconfinement
+semiconfluent
+semiconformist
+semiconformity
+semiconic
+semiconical
+semiconnate
+semiconnection
+semiconoidal
+semiconscious
+semiconsciously
+semiconsciousness
+semiconservative
+semiconsonant
+semiconsonantal
+semiconspicuous
+semicontinent
+semicontinuum
+semicontraction
+semicontradiction
+semiconvergence
+semiconvergent
+semiconversion
+semiconvert
+semicordate
+semicordated
+semicoriaceous
+semicorneous
+semicoronate
+semicoronated
+semicoronet
+semicostal
+semicostiferous
+semicotton
+semicotyle
+semicounterarch
+semicountry
+semicrepe
+semicrescentic
+semicretin
+semicretinism
+semicriminal
+semicroma
+semicrome
+semicrustaceous
+semicrystallinc
+semicubical
+semicubit
+semicup
+semicupium
+semicupola
+semicured
+semicurl
+semicursive
+semicurvilinear
+semicyclic
+semicycloid
+semicylinder
+semicylindric
+semicylindrical
+semicynical
+semidaily
+semidangerous
+semidark
+semidarkness
+semidead
+semideaf
+semidecay
+semidecussation
+semidefinite
+semideific
+semideification
+semideistical
+semideity
+semidelight
+semidelirious
+semideltaic
+semidemented
+semidenatured
+semidependence
+semidependent
+semideponent
+semidesert
+semidestructive
+semidetached
+semidetachment
+semideveloped
+semidiagrammatic
+semidiameter
+semidiapason
+semidiapente
+semidiaphaneity
+semidiaphanous
+semidiatessaron
+semidifference
+semidigested
+semidigitigrade
+semidigression
+semidilapidation
+semidine
+semidirect
+semidisabled
+semidisk
+semiditone
+semidiurnal
+semidivided
+semidivine
+semidocumentary
+semidodecagon
+semidole
+semidome
+semidomed
+semidomestic
+semidomesticated
+semidomestication
+semidomical
+semidormant
+semidouble
+semidrachm
+semidramatic
+semidress
+semidressy
+semidried
+semidry
+semidrying
+semiductile
+semidull
+semiduplex
+semiduration
+semieducated
+semieffigy
+semiegg
+semiegret
+semielastic
+semielision
+semiellipse
+semiellipsis
+semiellipsoidal
+semielliptic
+semielliptical
+semienclosed
+semiengaged
+semiequitant
+semierect
+semieremitical
+semiessay
+semiexecutive
+semiexpanded
+semiexplanation
+semiexposed
+semiexternal
+semiextinct
+semiextinction
+semifable
+semifabulous
+semifailure
+semifamine
+semifascia
+semifasciated
+semifashion
+semifast
+semifatalistic
+semiferal
+semiferous
+semifeudal
+semifeudalism
+semifib
+semifiction
+semifictional
+semifigurative
+semifigure
+semifinal
+semifinalist
+semifine
+semifinish
+semifinished
+semifiscal
+semifistular
+semifit
+semifitting
+semifixed
+semiflashproof
+semiflex
+semiflexed
+semiflexible
+semiflexion
+semiflexure
+semiflint
+semifloating
+semifloret
+semifloscular
+semifloscule
+semiflosculose
+semiflosculous
+semifluctuant
+semifluctuating
+semifluid
+semifluidic
+semifluidity
+semifoaming
+semiforbidding
+semiforeign
+semiform
+semiformal
+semiformed
+semifossil
+semifossilized
+semifrantic
+semifriable
+semifrontier
+semifuddle
+semifunctional
+semifused
+semifusion
+semify
+semigala
+semigelatinous
+semigentleman
+semigenuflection
+semigirder
+semiglaze
+semiglazed
+semiglobe
+semiglobose
+semiglobular
+semiglobularly
+semiglorious
+semiglutin
+semigod
+semigovernmental
+semigrainy
+semigranitic
+semigranulate
+semigravel
+semigroove
+semihand
+semihard
+semiharden
+semihardy
+semihastate
+semihepatization
+semiherbaceous
+semiheterocercal
+semihexagon
+semihexagonal
+semihiant
+semihiatus
+semihibernation
+semihigh
+semihistorical
+semihobo
+semihonor
+semihoral
+semihorny
+semihostile
+semihot
+semihuman
+semihumanitarian
+semihumanized
+semihumbug
+semihumorous
+semihumorously
+semihyaline
+semihydrate
+semihydrobenzoinic
+semihyperbola
+semihyperbolic
+semihyperbolical
+semijealousy
+semijubilee
+semijudicial
+semijuridical
+semilanceolate
+semilatent
+semilatus
+semileafless
+semilegendary
+semilegislative
+semilens
+semilenticular
+semilethal
+semiliberal
+semilichen
+semiligneous
+semilimber
+semilined
+semiliquid
+semiliquidity
+semiliterate
+semilocular
+semilogarithmic
+semilogical
+semilong
+semilooper
+semiloose
+semiloyalty
+semilucent
+semilunar
+semilunare
+semilunary
+semilunate
+semilunation
+semilune
+semiluxation
+semiluxury
+semimachine
+semimade
+semimadman
+semimagical
+semimagnetic
+semimajor
+semimalignant
+semimanufacture
+semimanufactured
+semimarine
+semimarking
+semimathematical
+semimature
+semimechanical
+semimedicinal
+semimember
+semimembranosus
+semimembranous
+semimenstrual
+semimercerized
+semimessianic
+semimetal
+semimetallic
+semimetamorphosis
+semimicrochemical
+semimild
+semimilitary
+semimill
+semimineral
+semimineralized
+semiminim
+semiminor
+semimolecule
+semimonastic
+semimonitor
+semimonopoly
+semimonster
+semimonthly
+semimoron
+semimucous
+semimute
+semimystic
+semimystical
+semimythical
+seminaked
+seminal
+seminality
+seminally
+seminaphthalidine
+seminaphthylamine
+seminar
+seminarcosis
+seminarial
+seminarian
+seminarianism
+seminarist
+seminaristic
+seminarize
+seminary
+seminasal
+seminase
+seminatant
+seminate
+semination
+seminationalization
+seminative
+seminebulous
+seminecessary
+seminegro
+seminervous
+seminiferal
+seminiferous
+seminific
+seminifical
+seminification
+seminist
+seminium
+seminivorous
+seminocturnal
+Seminole
+seminoma
+seminomad
+seminomadic
+seminomata
+seminonconformist
+seminonflammable
+seminonsensical
+seminormal
+seminose
+seminovel
+seminovelty
+seminude
+seminudity
+seminule
+seminuliferous
+seminuria
+seminvariant
+seminvariantive
+semioblivion
+semioblivious
+semiobscurity
+semioccasional
+semioccasionally
+semiocclusive
+semioctagonal
+semiofficial
+semiofficially
+semiography
+Semionotidae
+Semionotus
+semiopacity
+semiopacous
+semiopal
+semiopalescent
+semiopaque
+semiopened
+semiorb
+semiorbicular
+semiorbicularis
+semiorbiculate
+semiordinate
+semiorganized
+semioriental
+semioscillation
+semiosseous
+semiostracism
+semiotic
+semiotician
+semioval
+semiovaloid
+semiovate
+semioviparous
+semiovoid
+semiovoidal
+semioxidated
+semioxidized
+semioxygenated
+semioxygenized
+semipagan
+semipalmate
+semipalmated
+semipalmation
+semipanic
+semipapal
+semipapist
+semiparallel
+semiparalysis
+semiparameter
+semiparasitic
+semiparasitism
+semipaste
+semipastoral
+semipasty
+semipause
+semipeace
+semipectinate
+semipectinated
+semipectoral
+semiped
+semipedal
+semipellucid
+semipellucidity
+semipendent
+semipenniform
+semiperfect
+semiperimeter
+semiperimetry
+semiperiphery
+semipermanent
+semipermeability
+semipermeable
+semiperoid
+semiperspicuous
+semipertinent
+semipervious
+semipetaloid
+semipetrified
+semiphase
+semiphilologist
+semiphilosophic
+semiphilosophical
+semiphlogisticated
+semiphonotypy
+semiphosphorescent
+semipinacolic
+semipinacolin
+semipinnate
+semipiscine
+semiplantigrade
+semiplastic
+semiplumaceous
+semiplume
+semipolar
+semipolitical
+semipolitician
+semipoor
+semipopish
+semipopular
+semiporcelain
+semiporous
+semiporphyritic
+semiportable
+semipostal
+semipractical
+semiprecious
+semipreservation
+semiprimigenous
+semiprivacy
+semiprivate
+semipro
+semiprofane
+semiprofessional
+semiprofessionalized
+semipronation
+semiprone
+semipronominal
+semiproof
+semiproselyte
+semiprosthetic
+semiprostrate
+semiprotectorate
+semiproven
+semipublic
+semipupa
+semipurulent
+semiputrid
+semipyramidal
+semipyramidical
+semipyritic
+semiquadrangle
+semiquadrantly
+semiquadrate
+semiquantitative
+semiquantitatively
+semiquartile
+semiquaver
+semiquietism
+semiquietist
+semiquinquefid
+semiquintile
+semiquote
+semiradial
+semiradiate
+Semiramis
+Semiramize
+semirapacious
+semirare
+semirattlesnake
+semiraw
+semirebellion
+semirecondite
+semirecumbent
+semirefined
+semireflex
+semiregular
+semirelief
+semireligious
+semireniform
+semirepublican
+semiresinous
+semiresolute
+semirespectability
+semirespectable
+semireticulate
+semiretirement
+semiretractile
+semireverberatory
+semirevolute
+semirevolution
+semirevolutionist
+semirhythm
+semiriddle
+semirigid
+semiring
+semiroll
+semirotary
+semirotating
+semirotative
+semirotatory
+semirotund
+semirotunda
+semiround
+semiroyal
+semiruin
+semirural
+semirustic
+semis
+semisacerdotal
+semisacred
+semisagittate
+semisaint
+semisaline
+semisaltire
+semisaprophyte
+semisaprophytic
+semisarcodic
+semisatiric
+semisaturation
+semisavage
+semisavagedom
+semisavagery
+semiscenic
+semischolastic
+semiscientific
+semiseafaring
+semisecondary
+semisecrecy
+semisecret
+semisection
+semisedentary
+semisegment
+semisensuous
+semisentient
+semisentimental
+semiseparatist
+semiseptate
+semiserf
+semiserious
+semiseriously
+semiseriousness
+semiservile
+semisevere
+semiseverely
+semiseverity
+semisextile
+semishady
+semishaft
+semisheer
+semishirker
+semishrub
+semishrubby
+semisightseeing
+semisilica
+semisimious
+semisimple
+semisingle
+semisixth
+semiskilled
+semislave
+semismelting
+semismile
+semisocial
+semisocialism
+semisociative
+semisocinian
+semisoft
+semisolemn
+semisolemnity
+semisolemnly
+semisolid
+semisolute
+semisomnambulistic
+semisomnolence
+semisomnous
+semisopor
+semisovereignty
+semispan
+semispeculation
+semisphere
+semispheric
+semispherical
+semispheroidal
+semispinalis
+semispiral
+semispiritous
+semispontaneity
+semispontaneous
+semispontaneously
+semispontaneousness
+semisport
+semisporting
+semisquare
+semistagnation
+semistaminate
+semistarvation
+semistarved
+semistate
+semisteel
+semistiff
+semistill
+semistock
+semistory
+semistratified
+semistriate
+semistriated
+semistuporous
+semisubterranean
+semisuburban
+semisuccess
+semisuccessful
+semisuccessfully
+semisucculent
+semisupernatural
+semisupinated
+semisupination
+semisupine
+semisuspension
+semisymmetric
+semita
+semitact
+semitae
+semitailored
+semital
+semitandem
+semitangent
+semitaur
+Semite
+semitechnical
+semiteetotal
+semitelic
+semitendinosus
+semitendinous
+semiterete
+semiterrestrial
+semitertian
+semitesseral
+semitessular
+semitheological
+semithoroughfare
+Semitic
+Semiticism
+Semiticize
+Semitics
+semitime
+Semitism
+Semitist
+Semitization
+Semitize
+semitonal
+semitonally
+semitone
+semitonic
+semitonically
+semitontine
+semitorpid
+semitour
+semitrailer
+semitrained
+semitransept
+semitranslucent
+semitransparency
+semitransparent
+semitransverse
+semitreasonable
+semitrimmed
+semitropic
+semitropical
+semitropics
+semitruth
+semituberous
+semitubular
+semiuncial
+semiundressed
+semiuniversalist
+semiupright
+semiurban
+semiurn
+semivalvate
+semivault
+semivector
+semivegetable
+semivertebral
+semiverticillate
+semivibration
+semivirtue
+semiviscid
+semivital
+semivitreous
+semivitrification
+semivitrified
+semivocal
+semivocalic
+semivolatile
+semivolcanic
+semivoluntary
+semivowel
+semivulcanized
+semiwaking
+semiwarfare
+semiweekly
+semiwild
+semiwoody
+semiyearly
+semmet
+semmit
+Semnae
+Semnones
+Semnopithecinae
+semnopithecine
+Semnopithecus
+semola
+semolella
+semolina
+semological
+semology
+Semostomae
+semostomeous
+semostomous
+semperannual
+sempergreen
+semperidentical
+semperjuvenescent
+sempervirent
+sempervirid
+Sempervivum
+sempitern
+sempiternal
+sempiternally
+sempiternity
+sempiternize
+sempiternous
+sempstrywork
+semsem
+semuncia
+semuncial
+sen
+Senaah
+senaite
+senam
+senarian
+senarius
+senarmontite
+senary
+senate
+senator
+senatorial
+senatorially
+senatorian
+senatorship
+senatory
+senatress
+senatrices
+senatrix
+sence
+Senci
+sencion
+send
+sendable
+sendal
+sendee
+sender
+sending
+Seneca
+Senecan
+Senecio
+senecioid
+senecionine
+senectitude
+senectude
+senectuous
+senega
+Senegal
+Senegalese
+Senegambian
+senegin
+senesce
+senescence
+senescent
+seneschal
+seneschally
+seneschalship
+seneschalsy
+seneschalty
+sengreen
+senicide
+Senijextee
+senile
+senilely
+senilism
+senility
+senilize
+senior
+seniority
+seniorship
+Senlac
+Senna
+senna
+sennegrass
+sennet
+sennight
+sennit
+sennite
+senocular
+Senones
+Senonian
+sensa
+sensable
+sensal
+sensate
+sensation
+sensational
+sensationalism
+sensationalist
+sensationalistic
+sensationalize
+sensationally
+sensationary
+sensationish
+sensationism
+sensationist
+sensationistic
+sensationless
+sensatorial
+sensatory
+sense
+sensed
+senseful
+senseless
+senselessly
+senselessness
+sensibilia
+sensibilisin
+sensibilitist
+sensibilitous
+sensibility
+sensibilium
+sensibilization
+sensibilize
+sensible
+sensibleness
+sensibly
+sensical
+sensifacient
+sensiferous
+sensific
+sensificatory
+sensifics
+sensify
+sensigenous
+sensile
+sensilia
+sensilla
+sensillum
+sension
+sensism
+sensist
+sensistic
+sensitive
+sensitively
+sensitiveness
+sensitivity
+sensitization
+sensitize
+sensitizer
+sensitometer
+sensitometric
+sensitometry
+sensitory
+sensive
+sensize
+senso
+sensomobile
+sensomobility
+sensomotor
+sensoparalysis
+sensor
+sensoria
+sensorial
+sensoriglandular
+sensorimotor
+sensorimuscular
+sensorium
+sensorivascular
+sensorivasomotor
+sensorivolitional
+sensory
+sensual
+sensualism
+sensualist
+sensualistic
+sensuality
+sensualization
+sensualize
+sensually
+sensualness
+sensuism
+sensuist
+sensum
+sensuosity
+sensuous
+sensuously
+sensuousness
+sensyne
+sent
+sentence
+sentencer
+sentential
+sententially
+sententiarian
+sententiarist
+sententiary
+sententiosity
+sententious
+sententiously
+sententiousness
+sentience
+sentiendum
+sentient
+sentiently
+sentiment
+sentimental
+sentimentalism
+sentimentalist
+sentimentality
+sentimentalization
+sentimentalize
+sentimentalizer
+sentimentally
+sentimenter
+sentimentless
+sentinel
+sentinellike
+sentinelship
+sentinelwise
+sentisection
+sentition
+sentry
+Senusi
+Senusian
+Senusism
+sepad
+sepal
+sepaled
+sepaline
+sepalled
+sepalody
+sepaloid
+separability
+separable
+separableness
+separably
+separata
+separate
+separatedly
+separately
+separateness
+separates
+separatical
+separating
+separation
+separationism
+separationist
+separatism
+separatist
+separatistic
+separative
+separatively
+separativeness
+separator
+separatory
+separatress
+separatrix
+separatum
+Sepharad
+Sephardi
+Sephardic
+Sephardim
+Sepharvites
+sephen
+sephiric
+sephirothic
+sepia
+sepiaceous
+sepialike
+sepian
+sepiarian
+sepiary
+sepic
+sepicolous
+Sepiidae
+sepiment
+sepioid
+Sepioidea
+Sepiola
+Sepiolidae
+sepiolite
+sepion
+sepiost
+sepiostaire
+sepium
+sepone
+sepoy
+seppuku
+seps
+Sepsidae
+sepsine
+sepsis
+Sept
+sept
+septa
+septal
+septan
+septane
+septangle
+septangled
+septangular
+septangularness
+septarian
+septariate
+septarium
+septate
+septated
+septation
+septatoarticulate
+septavalent
+septave
+septcentenary
+septectomy
+September
+Septemberer
+Septemberism
+Septemberist
+Septembral
+Septembrian
+Septembrist
+Septembrize
+Septembrizer
+septemdecenary
+septemfid
+septemfluous
+septemfoliate
+septemfoliolate
+septemia
+septempartite
+septemplicate
+septemvious
+septemvir
+septemvirate
+septemviri
+septenar
+septenarian
+septenarius
+septenary
+septenate
+septendecennial
+septendecimal
+septennary
+septennate
+septenniad
+septennial
+septennialist
+septenniality
+septennially
+septennium
+septenous
+Septentrio
+Septentrion
+septentrional
+septentrionality
+septentrionally
+septentrionate
+septentrionic
+septerium
+septet
+septfoil
+Septi
+Septibranchia
+Septibranchiata
+septic
+septical
+septically
+septicemia
+septicemic
+septicidal
+septicidally
+septicity
+septicization
+septicolored
+septicopyemia
+septicopyemic
+septier
+septifarious
+septiferous
+septifluous
+septifolious
+septiform
+septifragal
+septifragally
+septilateral
+septile
+septillion
+septillionth
+septimal
+septimanal
+septimanarian
+septime
+septimetritis
+septimole
+septinsular
+septipartite
+septisyllabic
+septisyllable
+septivalent
+septleva
+Septobasidium
+septocosta
+septocylindrical
+Septocylindrium
+septodiarrhea
+septogerm
+Septogloeum
+septoic
+septole
+septomarginal
+septomaxillary
+septonasal
+Septoria
+septotomy
+septship
+septuagenarian
+septuagenarianism
+septuagenary
+septuagesima
+Septuagint
+septuagint
+Septuagintal
+septulate
+septulum
+septum
+septuncial
+septuor
+septuple
+septuplet
+septuplicate
+septuplication
+sepulcher
+sepulchral
+sepulchralize
+sepulchrally
+sepulchrous
+sepultural
+sepulture
+sequa
+sequacious
+sequaciously
+sequaciousness
+sequacity
+Sequan
+Sequani
+Sequanian
+sequel
+sequela
+sequelae
+sequelant
+sequence
+sequencer
+sequency
+sequent
+sequential
+sequentiality
+sequentially
+sequently
+sequest
+sequester
+sequestered
+sequesterment
+sequestra
+sequestrable
+sequestral
+sequestrate
+sequestration
+sequestrator
+sequestratrices
+sequestratrix
+sequestrectomy
+sequestrotomy
+sequestrum
+sequin
+sequitur
+Sequoia
+ser
+sera
+serab
+Serabend
+seragli
+seraglio
+serai
+serail
+seral
+seralbumin
+seralbuminous
+serang
+serape
+Serapea
+Serapeum
+seraph
+seraphic
+seraphical
+seraphically
+seraphicalness
+seraphicism
+seraphicness
+seraphim
+seraphina
+seraphine
+seraphism
+seraphlike
+seraphtide
+Serapias
+Serapic
+Serapis
+Serapist
+serasker
+seraskerate
+seraskier
+seraskierat
+serau
+seraw
+Serb
+Serbdom
+Serbian
+Serbize
+Serbonian
+Serbophile
+Serbophobe
+sercial
+serdab
+Serdar
+Sere
+sere
+Serean
+sereh
+Serena
+serenade
+serenader
+serenata
+serenate
+Serendib
+serendibite
+serendipity
+serendite
+serene
+serenely
+sereneness
+serenify
+serenissime
+serenissimi
+serenissimo
+serenity
+serenize
+Serenoa
+Serer
+Seres
+sereward
+serf
+serfage
+serfdom
+serfhood
+serfish
+serfishly
+serfishness
+serfism
+serflike
+serfship
+Serge
+serge
+sergeancy
+Sergeant
+sergeant
+sergeantcy
+sergeantess
+sergeantry
+sergeantship
+sergeanty
+sergedesoy
+Sergei
+serger
+sergette
+serging
+Sergio
+Sergiu
+Sergius
+serglobulin
+Seri
+serial
+serialist
+seriality
+serialization
+serialize
+serially
+Serian
+seriary
+seriate
+seriately
+seriatim
+seriation
+Seric
+Sericana
+sericate
+sericated
+sericea
+sericeotomentose
+sericeous
+sericicultural
+sericiculture
+sericiculturist
+sericin
+sericipary
+sericite
+sericitic
+sericitization
+Sericocarpus
+sericteria
+sericterium
+serictery
+sericultural
+sericulture
+sericulturist
+seriema
+series
+serif
+serific
+Seriform
+serigraph
+serigrapher
+serigraphy
+serimeter
+serin
+serine
+serinette
+seringa
+seringal
+seringhi
+Serinus
+serio
+seriocomedy
+seriocomic
+seriocomical
+seriocomically
+seriogrotesque
+Seriola
+Seriolidae
+serioline
+serioludicrous
+seriopantomimic
+serioridiculous
+seriosity
+serious
+seriously
+seriousness
+seripositor
+Serjania
+serjeant
+serment
+sermo
+sermocination
+sermocinatrix
+sermon
+sermoneer
+sermoner
+sermonesque
+sermonet
+sermonettino
+sermonic
+sermonically
+sermonics
+sermonish
+sermonism
+sermonist
+sermonize
+sermonizer
+sermonless
+sermonoid
+sermonolatry
+sermonology
+sermonproof
+sermonwise
+sermuncle
+sernamby
+sero
+seroalbumin
+seroalbuminuria
+seroanaphylaxis
+serobiological
+serocolitis
+serocyst
+serocystic
+serodermatosis
+serodermitis
+serodiagnosis
+serodiagnostic
+seroenteritis
+seroenzyme
+serofibrinous
+serofibrous
+serofluid
+serogelatinous
+serohemorrhagic
+serohepatitis
+seroimmunity
+serolactescent
+serolemma
+serolin
+serolipase
+serologic
+serological
+serologically
+serologist
+serology
+seromaniac
+seromembranous
+seromucous
+seromuscular
+seron
+seronegative
+seronegativity
+seroon
+seroot
+seroperitoneum
+serophthisis
+serophysiology
+seroplastic
+seropneumothorax
+seropositive
+seroprevention
+seroprognosis
+seroprophylaxis
+seroprotease
+seropuriform
+seropurulent
+seropus
+seroreaction
+serosa
+serosanguineous
+serosanguinolent
+seroscopy
+serositis
+serosity
+serosynovial
+serosynovitis
+serotherapeutic
+serotherapeutics
+serotherapist
+serotherapy
+serotina
+serotinal
+serotine
+serotinous
+serotoxin
+serous
+serousness
+serovaccine
+serow
+serozyme
+Serpari
+serpedinous
+Serpens
+Serpent
+serpent
+serpentaria
+Serpentarian
+Serpentarii
+serpentarium
+Serpentarius
+serpentary
+serpentcleide
+serpenteau
+Serpentes
+serpentess
+Serpentian
+serpenticidal
+serpenticide
+Serpentid
+serpentiferous
+serpentiform
+serpentina
+serpentine
+serpentinely
+Serpentinian
+serpentinic
+serpentiningly
+serpentinization
+serpentinize
+serpentinoid
+serpentinous
+Serpentis
+serpentivorous
+serpentize
+serpentlike
+serpently
+serpentoid
+serpentry
+serpentwood
+serphid
+Serphidae
+serphoid
+Serphoidea
+serpierite
+serpiginous
+serpiginously
+serpigo
+serpivolant
+serpolet
+Serpula
+serpula
+Serpulae
+serpulae
+serpulan
+serpulid
+Serpulidae
+serpulidan
+serpuline
+serpulite
+serpulitic
+serpuloid
+serra
+serradella
+serrage
+serran
+serrana
+serranid
+Serranidae
+Serrano
+serrano
+serranoid
+Serranus
+Serrasalmo
+serrate
+serrated
+serratic
+serratiform
+serratile
+serration
+serratirostral
+serratocrenate
+serratodentate
+serratodenticulate
+serratoglandulous
+serratospinose
+serrature
+serricorn
+Serricornia
+Serridentines
+Serridentinus
+serried
+serriedly
+serriedness
+Serrifera
+serriferous
+serriform
+serriped
+serrirostrate
+serrulate
+serrulated
+serrulation
+serry
+sert
+serta
+Sertularia
+sertularian
+Sertulariidae
+sertularioid
+sertule
+sertulum
+sertum
+serum
+serumal
+serut
+servable
+servage
+serval
+servaline
+servant
+servantcy
+servantdom
+servantess
+servantless
+servantlike
+servantry
+servantship
+servation
+serve
+servente
+serventism
+server
+servery
+servet
+Servetian
+Servetianism
+Servian
+service
+serviceability
+serviceable
+serviceableness
+serviceably
+serviceberry
+serviceless
+servicelessness
+serviceman
+Servidor
+servidor
+servient
+serviential
+serviette
+servile
+servilely
+servileness
+servilism
+servility
+servilize
+serving
+servingman
+servist
+Servite
+servitor
+servitorial
+servitorship
+servitress
+servitrix
+servitude
+serviture
+Servius
+servo
+servomechanism
+servomotor
+servulate
+serwamby
+sesame
+sesamoid
+sesamoidal
+sesamoiditis
+Sesamum
+Sesban
+Sesbania
+sescuple
+Seseli
+Seshat
+Sesia
+Sesiidae
+sesma
+sesqui
+sesquialter
+sesquialtera
+sesquialteral
+sesquialteran
+sesquialterous
+sesquibasic
+sesquicarbonate
+sesquicentennial
+sesquichloride
+sesquiduplicate
+sesquihydrate
+sesquihydrated
+sesquinona
+sesquinonal
+sesquioctava
+sesquioctaval
+sesquioxide
+sesquipedal
+sesquipedalian
+sesquipedalianism
+sesquipedality
+sesquiplicate
+sesquiquadrate
+sesquiquarta
+sesquiquartal
+sesquiquartile
+sesquiquinta
+sesquiquintal
+sesquiquintile
+sesquisalt
+sesquiseptimal
+sesquisextal
+sesquisilicate
+sesquisquare
+sesquisulphate
+sesquisulphide
+sesquisulphuret
+sesquiterpene
+sesquitertia
+sesquitertial
+sesquitertian
+sesquitertianal
+sess
+sessile
+sessility
+Sessiliventres
+session
+sessional
+sessionary
+sessions
+sesterce
+sestertium
+sestet
+sesti
+sestiad
+Sestian
+sestina
+sestine
+sestole
+sestuor
+Sesuto
+Sesuvium
+set
+seta
+setaceous
+setaceously
+setae
+setal
+Setaria
+setarious
+setback
+setbolt
+setdown
+setfast
+Seth
+seth
+sethead
+Sethian
+Sethic
+Sethite
+Setibo
+setier
+Setifera
+setiferous
+setiform
+setigerous
+setiparous
+setirostral
+setline
+setness
+setoff
+seton
+Setophaga
+Setophaginae
+setophagine
+setose
+setous
+setout
+setover
+setscrew
+setsman
+sett
+settable
+settaine
+settee
+setter
+settergrass
+setterwort
+setting
+settle
+settleable
+settled
+settledly
+settledness
+settlement
+settler
+settlerdom
+settling
+settlings
+settlor
+settsman
+setula
+setule
+setuliform
+setulose
+setulous
+setup
+setwall
+setwise
+setwork
+seugh
+Sevastopol
+seven
+sevenbark
+sevener
+sevenfold
+sevenfolded
+sevenfoldness
+sevennight
+sevenpence
+sevenpenny
+sevenscore
+seventeen
+seventeenfold
+seventeenth
+seventeenthly
+seventh
+seventhly
+seventieth
+seventy
+seventyfold
+sever
+severable
+several
+severalfold
+severality
+severalize
+severally
+severalness
+severalth
+severalty
+severance
+severation
+severe
+severedly
+severely
+severeness
+severer
+Severian
+severingly
+severish
+severity
+severization
+severize
+severy
+Sevillian
+sew
+sewable
+sewage
+sewan
+sewed
+sewellel
+sewen
+sewer
+sewerage
+sewered
+sewerless
+sewerlike
+sewerman
+sewery
+sewing
+sewless
+sewn
+sewround
+sex
+sexadecimal
+sexagenarian
+sexagenarianism
+sexagenary
+Sexagesima
+sexagesimal
+sexagesimally
+sexagesimals
+sexagonal
+sexangle
+sexangled
+sexangular
+sexangularly
+sexannulate
+sexarticulate
+sexcentenary
+sexcuspidate
+sexdigital
+sexdigitate
+sexdigitated
+sexdigitism
+sexed
+sexenary
+sexennial
+sexennially
+sexennium
+sexern
+sexfarious
+sexfid
+sexfoil
+sexhood
+sexifid
+sexillion
+sexiped
+sexipolar
+sexisyllabic
+sexisyllable
+sexitubercular
+sexivalence
+sexivalency
+sexivalent
+sexless
+sexlessly
+sexlessness
+sexlike
+sexlocular
+sexly
+sexological
+sexologist
+sexology
+sexpartite
+sexradiate
+sext
+sextactic
+sextain
+sextan
+sextans
+Sextant
+sextant
+sextantal
+sextar
+sextarii
+sextarius
+sextary
+sextennial
+sextern
+sextet
+sextic
+sextile
+Sextilis
+sextillion
+sextillionth
+sextipara
+sextipartite
+sextipartition
+sextiply
+sextipolar
+sexto
+sextodecimo
+sextole
+sextolet
+sexton
+sextoness
+sextonship
+sextry
+sextubercular
+sextuberculate
+sextula
+sextulary
+sextumvirate
+sextuple
+sextuplet
+sextuplex
+sextuplicate
+sextuply
+sexual
+sexuale
+sexualism
+sexualist
+sexuality
+sexualization
+sexualize
+sexually
+sexuous
+sexupara
+sexuparous
+sexy
+sey
+seybertite
+Seymeria
+Seymour
+sfoot
+Sgad
+sgraffiato
+sgraffito
+sh
+sha
+shaatnez
+shab
+Shaban
+shabash
+Shabbath
+shabbed
+shabbify
+shabbily
+shabbiness
+shabble
+shabby
+shabbyish
+shabrack
+shabunder
+Shabuoth
+shachle
+shachly
+shack
+shackanite
+shackatory
+shackbolt
+shackland
+shackle
+shacklebone
+shackledom
+shackler
+shacklewise
+shackling
+shackly
+shacky
+shad
+shadbelly
+shadberry
+shadbird
+shadbush
+shadchan
+shaddock
+shade
+shaded
+shadeful
+shadeless
+shadelessness
+shader
+shadetail
+shadflower
+shadily
+shadine
+shadiness
+shading
+shadkan
+shadoof
+Shadow
+shadow
+shadowable
+shadowbox
+shadowboxing
+shadowed
+shadower
+shadowfoot
+shadowgram
+shadowgraph
+shadowgraphic
+shadowgraphist
+shadowgraphy
+shadowily
+shadowiness
+shadowing
+shadowishly
+shadowist
+shadowland
+shadowless
+shadowlessness
+shadowlike
+shadowly
+shadowy
+shadrach
+shady
+shaffle
+Shafiite
+shaft
+shafted
+shafter
+shaftfoot
+shafting
+shaftless
+shaftlike
+shaftman
+shaftment
+shaftsman
+shaftway
+shafty
+shag
+shaganappi
+shagbag
+shagbark
+shagged
+shaggedness
+shaggily
+shagginess
+shaggy
+Shagia
+shaglet
+shaglike
+shagpate
+shagrag
+shagreen
+shagreened
+shagroon
+shagtail
+shah
+Shahaptian
+shaharith
+shahdom
+shahi
+Shahid
+shahin
+shahzada
+Shai
+Shaigia
+shaikh
+Shaikiyeh
+shaitan
+Shaiva
+Shaivism
+Shaka
+shakable
+shake
+shakeable
+shakebly
+shakedown
+shakefork
+shaken
+shakenly
+shakeout
+shakeproof
+Shaker
+shaker
+shakerag
+Shakerdom
+Shakeress
+Shakerism
+Shakerlike
+shakers
+shakescene
+Shakespearean
+Shakespeareana
+Shakespeareanism
+Shakespeareanly
+Shakespearize
+Shakespearolater
+Shakespearolatry
+shakha
+Shakil
+shakily
+shakiness
+shaking
+shakingly
+shako
+shaksheer
+Shakta
+Shakti
+shakti
+Shaktism
+shaku
+shaky
+Shakyamuni
+Shalako
+shale
+shalelike
+shaleman
+shall
+shallal
+shallon
+shalloon
+shallop
+shallopy
+shallot
+shallow
+shallowbrained
+shallowhearted
+shallowish
+shallowist
+shallowly
+shallowness
+shallowpate
+shallowpated
+shallows
+shallowy
+shallu
+shalom
+shalt
+shalwar
+shaly
+Sham
+sham
+shama
+shamable
+shamableness
+shamably
+shamal
+shamalo
+shaman
+shamaness
+shamanic
+shamanism
+shamanist
+shamanistic
+shamanize
+shamateur
+shamba
+Shambala
+shamble
+shambling
+shamblingly
+shambrier
+Shambu
+shame
+shameable
+shamed
+shameface
+shamefaced
+shamefacedly
+shamefacedness
+shamefast
+shamefastly
+shamefastness
+shameful
+shamefully
+shamefulness
+shameless
+shamelessly
+shamelessness
+shameproof
+shamer
+shamesick
+shameworthy
+shamianah
+Shamim
+shamir
+Shammar
+shammed
+shammer
+shammick
+shamming
+shammish
+shammock
+shammocking
+shammocky
+shammy
+shampoo
+shampooer
+shamrock
+shamroot
+shamsheer
+Shan
+shan
+shanachas
+shanachie
+Shandean
+shandry
+shandrydan
+Shandy
+shandy
+shandygaff
+Shandyism
+Shane
+Shang
+Shangalla
+shangan
+Shanghai
+shanghai
+shanghaier
+shank
+Shankar
+shanked
+shanker
+shankings
+shankpiece
+shanksman
+shanna
+Shannon
+shanny
+shansa
+shant
+Shantung
+shanty
+shantylike
+shantyman
+shantytown
+shap
+shapable
+Shape
+shape
+shaped
+shapeful
+shapeless
+shapelessly
+shapelessness
+shapeliness
+shapely
+shapen
+shaper
+shapeshifter
+shapesmith
+shaping
+shapingly
+shapometer
+shaps
+Shaptan
+shapy
+sharable
+Sharada
+Sharan
+shard
+Shardana
+sharded
+shardy
+share
+shareable
+sharebone
+sharebroker
+sharecrop
+sharecropper
+shareholder
+shareholdership
+shareman
+sharepenny
+sharer
+shareship
+sharesman
+sharewort
+Sharezer
+shargar
+Shari
+Sharia
+Sharira
+shark
+sharkful
+sharkish
+sharklet
+sharklike
+sharkship
+sharkskin
+sharky
+sharn
+sharnbud
+sharny
+Sharon
+sharp
+sharpen
+sharpener
+sharper
+sharpie
+sharpish
+sharply
+sharpness
+sharps
+sharpsaw
+sharpshin
+sharpshod
+sharpshooter
+sharpshooting
+sharptail
+sharpware
+sharpy
+Sharra
+sharrag
+sharry
+Shasta
+shastaite
+Shastan
+shaster
+shastra
+shastraik
+shastri
+shastrik
+shat
+shatan
+shathmont
+Shatter
+shatter
+shatterbrain
+shatterbrained
+shatterer
+shatterheaded
+shattering
+shatteringly
+shatterment
+shatterpated
+shatterproof
+shatterwit
+shattery
+shattuckite
+shauchle
+shaugh
+shaul
+Shaula
+shaup
+shauri
+shauwe
+shavable
+shave
+shaveable
+shaved
+shavee
+shaveling
+shaven
+shaver
+shavery
+Shavese
+shavester
+shavetail
+shaveweed
+Shavian
+Shaviana
+Shavianism
+shaving
+shavings
+Shaw
+shaw
+Shawanese
+Shawano
+shawl
+shawled
+shawling
+shawlless
+shawllike
+shawlwise
+shawm
+Shawn
+Shawnee
+shawneewood
+shawny
+Shawwal
+shawy
+shay
+Shaysite
+she
+shea
+sheading
+sheaf
+sheafage
+sheaflike
+sheafripe
+sheafy
+sheal
+shealing
+Shean
+shear
+shearbill
+sheard
+shearer
+sheargrass
+shearhog
+shearing
+shearless
+shearling
+shearman
+shearmouse
+shears
+shearsman
+sheartail
+shearwater
+shearwaters
+sheat
+sheatfish
+sheath
+sheathbill
+sheathe
+sheathed
+sheather
+sheathery
+sheathing
+sheathless
+sheathlike
+sheathy
+sheave
+sheaved
+sheaveless
+sheaveman
+shebang
+Shebat
+shebeen
+shebeener
+Shechem
+Shechemites
+shed
+shedded
+shedder
+shedding
+sheder
+shedhand
+shedlike
+shedman
+shedwise
+shee
+sheely
+sheen
+sheenful
+sheenless
+sheenly
+sheeny
+sheep
+sheepback
+sheepberry
+sheepbine
+sheepbiter
+sheepbiting
+sheepcote
+sheepcrook
+sheepfaced
+sheepfacedly
+sheepfacedness
+sheepfold
+sheepfoot
+sheepgate
+sheephead
+sheepheaded
+sheephearted
+sheepherder
+sheepherding
+sheephook
+sheephouse
+sheepify
+sheepish
+sheepishly
+sheepishness
+sheepkeeper
+sheepkeeping
+sheepkill
+sheepless
+sheeplet
+sheeplike
+sheepling
+sheepman
+sheepmaster
+sheepmonger
+sheepnose
+sheepnut
+sheeppen
+sheepshank
+sheepshead
+sheepsheadism
+sheepshear
+sheepshearer
+sheepshearing
+sheepshed
+sheepskin
+sheepsplit
+sheepsteal
+sheepstealer
+sheepstealing
+sheepwalk
+sheepwalker
+sheepweed
+sheepy
+sheer
+sheered
+sheering
+sheerly
+sheerness
+sheet
+sheetage
+sheeted
+sheeter
+sheetflood
+sheetful
+sheeting
+sheetless
+sheetlet
+sheetlike
+sheetling
+sheetways
+sheetwise
+sheetwork
+sheetwriting
+sheety
+Sheffield
+shehitah
+sheik
+sheikdom
+sheikhlike
+sheikhly
+sheiklike
+sheikly
+Sheila
+shekel
+Shekinah
+Shel
+shela
+sheld
+sheldapple
+shelder
+sheldfowl
+sheldrake
+shelduck
+shelf
+shelfback
+shelffellow
+shelfful
+shelflist
+shelfmate
+shelfpiece
+shelfroom
+shelfworn
+shelfy
+shell
+shellac
+shellacker
+shellacking
+shellapple
+shellback
+shellblow
+shellblowing
+shellbound
+shellburst
+shellcracker
+shelleater
+shelled
+sheller
+Shelleyan
+Shelleyana
+shellfire
+shellfish
+shellfishery
+shellflower
+shellful
+shellhead
+shelliness
+shelling
+shellman
+shellmonger
+shellproof
+shellshake
+shellum
+shellwork
+shellworker
+shelly
+shellycoat
+shelta
+shelter
+shelterage
+sheltered
+shelterer
+shelteringly
+shelterless
+shelterlessness
+shelterwood
+sheltery
+sheltron
+shelty
+shelve
+shelver
+shelving
+shelvingly
+shelvingness
+shelvy
+Shelyak
+Shemaka
+sheminith
+Shemite
+Shemitic
+Shemitish
+Shemu
+Shen
+shenanigan
+shend
+sheng
+Shenshai
+Sheol
+sheolic
+shepherd
+shepherdage
+shepherddom
+shepherdess
+shepherdhood
+Shepherdia
+shepherdish
+shepherdism
+shepherdize
+shepherdless
+shepherdlike
+shepherdling
+shepherdly
+shepherdry
+sheppeck
+sheppey
+shepstare
+sher
+Sherani
+Sherardia
+sherardize
+sherardizer
+Sheratan
+Sheraton
+sherbacha
+sherbet
+sherbetlee
+sherbetzide
+sheriat
+sherif
+sherifa
+sherifate
+sheriff
+sheriffalty
+sheriffdom
+sheriffess
+sheriffhood
+sheriffry
+sheriffship
+sheriffwick
+sherifi
+sherifian
+sherify
+sheristadar
+Sheriyat
+sherlock
+Sherman
+Sherpa
+Sherramoor
+Sherri
+sherry
+Sherrymoor
+sherryvallies
+Shesha
+sheth
+Shetland
+Shetlander
+Shetlandic
+sheugh
+sheva
+shevel
+sheveled
+shevri
+shewa
+shewbread
+shewel
+sheyle
+shi
+Shiah
+shibah
+shibar
+shibboleth
+shibbolethic
+shibuichi
+shice
+shicer
+shicker
+shickered
+shide
+shied
+shiel
+shield
+shieldable
+shieldboard
+shielddrake
+shielded
+shielder
+shieldflower
+shielding
+shieldless
+shieldlessly
+shieldlessness
+shieldlike
+shieldling
+shieldmaker
+shieldmay
+shieldtail
+shieling
+shier
+shies
+shiest
+shift
+shiftable
+shiftage
+shifter
+shiftful
+shiftfulness
+shiftily
+shiftiness
+shifting
+shiftingly
+shiftingness
+shiftless
+shiftlessly
+shiftlessness
+shifty
+Shigella
+shiggaion
+shigram
+shih
+Shiism
+Shiite
+Shiitic
+Shik
+shikar
+shikara
+shikargah
+shikari
+shikasta
+shikimi
+shikimic
+shikimole
+shikimotoxin
+shikken
+shiko
+shikra
+shilf
+shilfa
+Shilh
+Shilha
+shill
+shilla
+shillaber
+shillelagh
+shillet
+shillety
+shillhouse
+shillibeer
+shilling
+shillingless
+shillingsworth
+shilloo
+Shilluh
+Shilluk
+Shiloh
+shilpit
+shim
+shimal
+Shimei
+shimmer
+shimmering
+shimmeringly
+shimmery
+shimmy
+Shimonoseki
+shimose
+shimper
+shin
+Shina
+shinaniging
+shinarump
+shinbone
+shindig
+shindle
+shindy
+shine
+shineless
+shiner
+shingle
+shingled
+shingler
+shingles
+shinglewise
+shinglewood
+shingling
+shingly
+shinily
+shininess
+shining
+shiningly
+shiningness
+shinleaf
+Shinnecock
+shinner
+shinnery
+shinning
+shinny
+shinplaster
+shintiyan
+Shinto
+Shintoism
+Shintoist
+Shintoistic
+Shintoize
+shinty
+Shinwari
+shinwood
+shiny
+shinza
+ship
+shipboard
+shipbound
+shipboy
+shipbreaking
+shipbroken
+shipbuilder
+shipbuilding
+shipcraft
+shipentine
+shipful
+shipkeeper
+shiplap
+shipless
+shiplessly
+shiplet
+shipload
+shipman
+shipmanship
+shipmast
+shipmaster
+shipmate
+shipmatish
+shipment
+shipowner
+shipowning
+shippable
+shippage
+shipped
+shipper
+shipping
+shipplane
+shippo
+shippon
+shippy
+shipshape
+shipshapely
+shipside
+shipsmith
+shipward
+shipwards
+shipway
+shipwork
+shipworm
+shipwreck
+shipwrecky
+shipwright
+shipwrightery
+shipwrightry
+shipyard
+shirakashi
+shirallee
+Shiraz
+shire
+shirehouse
+shireman
+shirewick
+shirk
+shirker
+shirky
+shirl
+shirlcock
+Shirley
+shirpit
+shirr
+shirring
+shirt
+shirtband
+shirtiness
+shirting
+shirtless
+shirtlessness
+shirtlike
+shirtmaker
+shirtmaking
+shirtman
+shirttail
+shirtwaist
+shirty
+Shirvan
+shish
+shisham
+shisn
+shita
+shitepoke
+shither
+shittah
+shittim
+shittimwood
+shiv
+Shivaism
+Shivaist
+Shivaistic
+Shivaite
+shivaree
+shive
+shiver
+shivereens
+shiverer
+shivering
+shiveringly
+shiverproof
+shiversome
+shiverweed
+shivery
+shivey
+shivoo
+shivy
+shivzoku
+Shkupetar
+Shlu
+Shluh
+Sho
+sho
+Shoa
+shoad
+shoader
+shoal
+shoalbrain
+shoaler
+shoaliness
+shoalness
+shoalwise
+shoaly
+shoat
+shock
+shockability
+shockable
+shockedness
+shocker
+shockheaded
+shocking
+shockingly
+shockingness
+shocklike
+shockproof
+shod
+shodden
+shoddily
+shoddiness
+shoddy
+shoddydom
+shoddyism
+shoddyite
+shoddylike
+shoddyward
+shoddywards
+shode
+shoder
+shoe
+shoebill
+shoebinder
+shoebindery
+shoebinding
+shoebird
+shoeblack
+shoeboy
+shoebrush
+shoecraft
+shoeflower
+shoehorn
+shoeing
+shoeingsmith
+shoelace
+shoeless
+shoemaker
+shoemaking
+shoeman
+shoepack
+shoer
+shoescraper
+shoeshine
+shoeshop
+shoesmith
+shoestring
+shoewoman
+shoful
+shog
+shogaol
+shoggie
+shoggle
+shoggly
+shogi
+shogun
+shogunal
+shogunate
+shohet
+shoji
+Shojo
+shola
+shole
+Shona
+shone
+shoneen
+shonkinite
+shoo
+shood
+shoofa
+shoofly
+shooi
+shook
+shool
+shooldarry
+shooler
+shoop
+shoopiltie
+shoor
+shoot
+shootable
+shootboard
+shootee
+shooter
+shoother
+shooting
+shootist
+shootman
+shop
+shopboard
+shopbook
+shopboy
+shopbreaker
+shopbreaking
+shopfolk
+shopful
+shopgirl
+shopgirlish
+shophar
+shopkeeper
+shopkeeperess
+shopkeeperish
+shopkeeperism
+shopkeepery
+shopkeeping
+shopland
+shoplet
+shoplifter
+shoplifting
+shoplike
+shopmaid
+shopman
+shopmark
+shopmate
+shopocracy
+shopocrat
+shoppe
+shopper
+shopping
+shoppish
+shoppishness
+shoppy
+shopster
+shoptalk
+shopwalker
+shopwear
+shopwife
+shopwindow
+shopwoman
+shopwork
+shopworker
+shopworn
+shoq
+Shor
+shor
+shoran
+shore
+Shorea
+shoreberry
+shorebush
+shored
+shoregoing
+shoreland
+shoreless
+shoreman
+shorer
+shoreside
+shoresman
+shoreward
+shorewards
+shoreweed
+shoreyer
+shoring
+shorling
+shorn
+short
+shortage
+shortbread
+shortcake
+shortchange
+shortchanger
+shortclothes
+shortcoat
+shortcomer
+shortcoming
+shorten
+shortener
+shortening
+shorter
+shortfall
+shorthand
+shorthanded
+shorthandedness
+shorthander
+shorthead
+shorthorn
+Shortia
+shortish
+shortly
+shortness
+shorts
+shortschat
+shortsighted
+shortsightedly
+shortsightedness
+shortsome
+shortstaff
+shortstop
+shorttail
+Shortzy
+Shoshonean
+shoshonite
+shot
+shotbush
+shote
+shotgun
+shotless
+shotlike
+shotmaker
+shotman
+shotproof
+shotsman
+shotstar
+shott
+shotted
+shotten
+shotter
+shotty
+Shotweld
+shou
+should
+shoulder
+shouldered
+shoulderer
+shoulderette
+shouldering
+shouldna
+shouldnt
+shoupeltin
+shout
+shouter
+shouting
+shoutingly
+shoval
+shove
+shovegroat
+shovel
+shovelard
+shovelbill
+shovelboard
+shovelfish
+shovelful
+shovelhead
+shovelmaker
+shovelman
+shovelnose
+shovelweed
+shover
+show
+showable
+showance
+showbird
+showboard
+showboat
+showboater
+showboating
+showcase
+showdom
+showdown
+shower
+showerer
+showerful
+showeriness
+showerless
+showerlike
+showerproof
+showery
+showily
+showiness
+showing
+showish
+showless
+showman
+showmanism
+showmanry
+showmanship
+shown
+showpiece
+showroom
+showup
+showworthy
+showy
+showyard
+shoya
+shrab
+shraddha
+shradh
+shraf
+shrag
+shram
+shrank
+shrap
+shrapnel
+shrave
+shravey
+shreadhead
+shred
+shredcock
+shredder
+shredding
+shreddy
+shredless
+shredlike
+Shree
+shree
+shreeve
+shrend
+shrew
+shrewd
+shrewdish
+shrewdly
+shrewdness
+shrewdom
+shrewdy
+shrewish
+shrewishly
+shrewishness
+shrewlike
+shrewly
+shrewmouse
+shrewstruck
+shriek
+shrieker
+shriekery
+shriekily
+shriekiness
+shriekingly
+shriekproof
+shrieky
+shrieval
+shrievalty
+shrift
+shrike
+shrill
+shrilling
+shrillish
+shrillness
+shrilly
+shrimp
+shrimper
+shrimpfish
+shrimpi
+shrimpish
+shrimpishness
+shrimplike
+shrimpy
+shrinal
+Shrine
+shrine
+shrineless
+shrinelet
+shrinelike
+Shriner
+shrink
+shrinkable
+shrinkage
+shrinkageproof
+shrinker
+shrinkhead
+shrinking
+shrinkingly
+shrinkproof
+shrinky
+shrip
+shrite
+shrive
+shrivel
+shriven
+shriver
+shriving
+shroff
+shrog
+Shropshire
+shroud
+shrouded
+shrouding
+shroudless
+shroudlike
+shroudy
+Shrove
+shrove
+shrover
+Shrovetide
+shrub
+shrubbed
+shrubbery
+shrubbiness
+shrubbish
+shrubby
+shrubland
+shrubless
+shrublet
+shrublike
+shrubwood
+shruff
+shrug
+shruggingly
+shrunk
+shrunken
+shrups
+Shtokavski
+shtreimel
+Shu
+shuba
+shubunkin
+shuck
+shucker
+shucking
+shuckins
+shuckpen
+shucks
+shudder
+shudderful
+shudderiness
+shudderingly
+shuddersome
+shuddery
+shuff
+shuffle
+shuffleboard
+shufflecap
+shuffler
+shufflewing
+shuffling
+shufflingly
+shug
+Shuhali
+Shukria
+Shukulumbwe
+shul
+Shulamite
+shuler
+shulwaurs
+shumac
+shun
+Shunammite
+shune
+shunless
+shunnable
+shunner
+shunt
+shunter
+shunting
+shure
+shurf
+shush
+shusher
+Shuswap
+shut
+shutdown
+shutness
+shutoff
+Shutoku
+shutout
+shuttance
+shutten
+shutter
+shuttering
+shutterless
+shutterwise
+shutting
+shuttle
+shuttlecock
+shuttleheaded
+shuttlelike
+shuttlewise
+Shuvra
+shwanpan
+shy
+Shyam
+shydepoke
+shyer
+shyish
+Shylock
+Shylockism
+shyly
+shyness
+shyster
+si
+Sia
+siak
+sial
+sialaden
+sialadenitis
+sialadenoncus
+sialagogic
+sialagogue
+sialagoguic
+sialemesis
+Sialia
+sialic
+sialid
+Sialidae
+sialidan
+Sialis
+sialoangitis
+sialogenous
+sialoid
+sialolith
+sialolithiasis
+sialology
+sialorrhea
+sialoschesis
+sialosemeiology
+sialosis
+sialostenosis
+sialosyrinx
+sialozemia
+Siam
+siamang
+Siamese
+sib
+Sibbaldus
+sibbed
+sibbens
+sibber
+sibboleth
+sibby
+Siberian
+Siberic
+siberite
+sibilance
+sibilancy
+sibilant
+sibilantly
+sibilate
+sibilatingly
+sibilator
+sibilatory
+sibilous
+sibilus
+Sibiric
+sibling
+sibness
+sibrede
+sibship
+sibyl
+sibylesque
+sibylic
+sibylism
+sibylla
+sibylline
+sibyllist
+sic
+Sicambri
+Sicambrian
+Sicana
+Sicani
+Sicanian
+sicarian
+sicarious
+sicarius
+sicca
+siccaneous
+siccant
+siccate
+siccation
+siccative
+siccimeter
+siccity
+sice
+Sicel
+Siceliot
+Sicilian
+sicilian
+siciliana
+Sicilianism
+sicilica
+sicilicum
+sicilienne
+sicinnian
+sick
+sickbed
+sicken
+sickener
+sickening
+sickeningly
+sicker
+sickerly
+sickerness
+sickhearted
+sickish
+sickishly
+sickishness
+sickle
+sicklebill
+sickled
+sicklelike
+sickleman
+sicklemia
+sicklemic
+sicklepod
+sickler
+sicklerite
+sickless
+sickleweed
+sicklewise
+sicklewort
+sicklied
+sicklily
+sickliness
+sickling
+sickly
+sickness
+sicknessproof
+sickroom
+sicsac
+sicula
+sicular
+Siculi
+Siculian
+Sicyonian
+Sicyonic
+Sicyos
+Sid
+Sida
+Sidalcea
+sidder
+Siddha
+Siddhanta
+Siddhartha
+Siddhi
+siddur
+side
+sideage
+sidearm
+sideboard
+sidebone
+sidebones
+sideburns
+sidecar
+sidecarist
+sidecheck
+sided
+sidedness
+sideflash
+sidehead
+sidehill
+sidekicker
+sidelang
+sideless
+sideline
+sideling
+sidelings
+sidelingwise
+sidelong
+sidenote
+sidepiece
+sider
+sideral
+sideration
+siderealize
+sidereally
+siderean
+siderin
+siderism
+siderite
+sideritic
+Sideritis
+siderognost
+siderographic
+siderographical
+siderographist
+siderography
+siderolite
+siderology
+sideromagnetic
+sideromancy
+sideromelane
+sideronatrite
+sideronym
+sideroscope
+siderose
+siderosis
+siderostat
+siderostatic
+siderotechny
+siderous
+Sideroxylon
+sidership
+siderurgical
+siderurgy
+sides
+sidesaddle
+sideshake
+sideslip
+sidesman
+sidesplitter
+sidesplitting
+sidesplittingly
+sidesway
+sideswipe
+sideswiper
+sidetrack
+sidewalk
+sideward
+sidewards
+sideway
+sideways
+sidewinder
+sidewipe
+sidewiper
+sidewise
+sidhe
+sidi
+siding
+sidle
+sidler
+sidling
+sidlingly
+Sidney
+Sidonian
+Sidrach
+sidth
+sidy
+sie
+siege
+siegeable
+siegecraft
+siegenite
+sieger
+siegework
+Siegfried
+Sieglingia
+Siegmund
+Siegurd
+Siena
+Sienese
+sienna
+sier
+siering
+sierozem
+Sierra
+sierra
+sierran
+siesta
+siestaland
+Sieva
+sieve
+sieveful
+sievelike
+siever
+Sieversia
+sievings
+sievy
+sifac
+sifaka
+Sifatite
+sife
+siffilate
+siffle
+sifflement
+sifflet
+sifflot
+sift
+siftage
+sifted
+sifter
+sifting
+sig
+Siganidae
+Siganus
+sigatoka
+Sigaultian
+sigger
+sigh
+sigher
+sighful
+sighfully
+sighing
+sighingly
+sighingness
+sighless
+sighlike
+sight
+sightable
+sighted
+sighten
+sightening
+sighter
+sightful
+sightfulness
+sighthole
+sighting
+sightless
+sightlessly
+sightlessness
+sightlily
+sightliness
+sightly
+sightproof
+sightworthiness
+sightworthy
+sighty
+sigil
+sigilative
+Sigillaria
+Sigillariaceae
+sigillariaceous
+sigillarian
+sigillarid
+sigillarioid
+sigillarist
+sigillaroid
+sigillary
+sigillate
+sigillated
+sigillation
+sigillistic
+sigillographer
+sigillographical
+sigillography
+sigillum
+sigla
+siglarian
+siglos
+Sigma
+sigma
+sigmaspire
+sigmate
+sigmatic
+sigmation
+sigmatism
+sigmodont
+Sigmodontes
+sigmoid
+sigmoidal
+sigmoidally
+sigmoidectomy
+sigmoiditis
+sigmoidopexy
+sigmoidoproctostomy
+sigmoidorectostomy
+sigmoidoscope
+sigmoidoscopy
+sigmoidostomy
+Sigmund
+sign
+signable
+signal
+signalee
+signaler
+signalese
+signaletic
+signaletics
+signalism
+signalist
+signality
+signalize
+signally
+signalman
+signalment
+signary
+signatary
+signate
+signation
+signator
+signatory
+signatural
+signature
+signatureless
+signaturist
+signboard
+signee
+signer
+signet
+signetwise
+signifer
+signifiable
+significal
+significance
+significancy
+significant
+significantly
+significantness
+significate
+signification
+significatist
+significative
+significatively
+significativeness
+significator
+significatory
+significatrix
+significature
+significavit
+significian
+significs
+signifier
+signify
+signior
+signiorship
+signist
+signless
+signlike
+signman
+signorial
+signorship
+signory
+signpost
+signum
+signwriter
+Sigurd
+Sihasapa
+Sika
+sika
+sikar
+sikatch
+sike
+sikerly
+sikerness
+siket
+Sikh
+sikhara
+Sikhism
+sikhra
+Sikinnis
+Sikkimese
+Siksika
+sil
+silage
+silaginoid
+silane
+Silas
+silbergroschen
+silcrete
+sile
+silen
+Silenaceae
+silenaceous
+Silenales
+silence
+silenced
+silencer
+silency
+Silene
+sileni
+silenic
+silent
+silential
+silentiary
+silentious
+silentish
+silently
+silentness
+silenus
+silesia
+Silesian
+Siletz
+silex
+silexite
+silhouette
+silhouettist
+silhouettograph
+silica
+silicam
+silicane
+silicate
+silication
+silicatization
+Silicea
+silicean
+siliceocalcareous
+siliceofelspathic
+siliceofluoric
+siliceous
+silicic
+silicicalcareous
+silicicolous
+silicide
+silicidize
+siliciferous
+silicification
+silicifluoric
+silicifluoride
+silicify
+siliciophite
+silicious
+Silicispongiae
+silicium
+siliciuretted
+silicize
+silicle
+silico
+silicoacetic
+silicoalkaline
+silicoaluminate
+silicoarsenide
+silicocalcareous
+silicochloroform
+silicocyanide
+silicoethane
+silicoferruginous
+Silicoflagellata
+Silicoflagellatae
+silicoflagellate
+Silicoflagellidae
+silicofluoric
+silicofluoride
+silicohydrocarbon
+Silicoidea
+silicomagnesian
+silicomanganese
+silicomethane
+silicon
+silicone
+siliconize
+silicononane
+silicopropane
+silicosis
+Silicospongiae
+silicotalcose
+silicotic
+silicotitanate
+silicotungstate
+silicotungstic
+silicula
+silicular
+silicule
+siliculose
+siliculous
+silicyl
+Silipan
+siliqua
+siliquaceous
+siliquae
+Siliquaria
+Siliquariidae
+silique
+siliquiferous
+siliquiform
+siliquose
+siliquous
+silk
+silkalene
+silkaline
+silked
+silken
+silker
+silkflower
+silkgrower
+silkie
+silkily
+silkiness
+silklike
+silkman
+silkness
+silksman
+silktail
+silkweed
+silkwoman
+silkwood
+silkwork
+silkworks
+silkworm
+silky
+sill
+sillabub
+silladar
+Sillaginidae
+Sillago
+sillandar
+sillar
+siller
+Sillery
+sillibouk
+sillikin
+sillily
+sillimanite
+silliness
+sillock
+sillograph
+sillographer
+sillographist
+sillometer
+sillon
+silly
+sillyhood
+sillyhow
+sillyish
+sillyism
+sillyton
+silo
+siloist
+Silpha
+silphid
+Silphidae
+silphium
+silt
+siltage
+siltation
+silting
+siltlike
+silty
+silundum
+Silures
+Silurian
+Siluric
+silurid
+Siluridae
+Siluridan
+siluroid
+Siluroidei
+Silurus
+silva
+silvan
+silvanity
+silvanry
+Silvanus
+silvendy
+silver
+silverback
+silverbeater
+silverbelly
+silverberry
+silverbill
+silverboom
+silverbush
+silvered
+silverer
+silvereye
+silverfin
+silverfish
+silverhead
+silverily
+silveriness
+silvering
+silverish
+silverite
+silverize
+silverizer
+silverleaf
+silverless
+silverlike
+silverling
+silverly
+silvern
+silverness
+silverpoint
+silverrod
+silverside
+silversides
+silverskin
+silversmith
+silversmithing
+silverspot
+silvertail
+silvertip
+silvertop
+silvervine
+silverware
+silverweed
+silverwing
+silverwood
+silverwork
+silverworker
+silvery
+Silvester
+Silvia
+silvical
+silvicolous
+silvics
+silvicultural
+silviculturally
+silviculture
+silviculturist
+Silvius
+Silybum
+silyl
+Sim
+sima
+Simaba
+simal
+simar
+Simarouba
+Simaroubaceae
+simaroubaceous
+simball
+simbil
+simblin
+simblot
+Simblum
+sime
+Simeon
+Simeonism
+Simeonite
+Simia
+simiad
+simial
+simian
+simianity
+simiesque
+Simiidae
+Simiinae
+similar
+similarity
+similarize
+similarly
+similative
+simile
+similimum
+similiter
+similitive
+similitude
+similitudinize
+simility
+similize
+similor
+simioid
+simious
+simiousness
+simity
+simkin
+simlin
+simling
+simmer
+simmeringly
+simmon
+simnel
+simnelwise
+simoleon
+Simon
+simoniac
+simoniacal
+simoniacally
+Simonian
+Simonianism
+simonious
+simonism
+Simonist
+simonist
+simony
+simool
+simoom
+simoon
+Simosaurus
+simous
+simp
+simpai
+simper
+simperer
+simperingly
+simple
+simplehearted
+simpleheartedly
+simpleheartedness
+simpleness
+simpler
+simpleton
+simpletonian
+simpletonianism
+simpletonic
+simpletonish
+simpletonism
+simplex
+simplexed
+simplexity
+simplicident
+Simplicidentata
+simplicidentate
+simplicist
+simplicitarian
+simplicity
+simplicize
+simplification
+simplificative
+simplificator
+simplified
+simplifiedly
+simplifier
+simplify
+simplism
+simplist
+simplistic
+simply
+simsim
+simson
+simulacra
+simulacral
+simulacre
+simulacrize
+simulacrum
+simulance
+simulant
+simular
+simulate
+simulation
+simulative
+simulatively
+simulator
+simulatory
+simulcast
+simuler
+simuliid
+Simuliidae
+simulioid
+Simulium
+simultaneity
+simultaneous
+simultaneously
+simultaneousness
+sin
+sina
+Sinae
+Sinaean
+Sinaic
+sinaite
+Sinaitic
+sinal
+sinalbin
+Sinaloa
+sinamay
+sinamine
+sinapate
+sinapic
+sinapine
+sinapinic
+Sinapis
+sinapis
+sinapism
+sinapize
+sinapoline
+sinarchism
+sinarchist
+sinarquism
+sinarquist
+sinarquista
+sinawa
+sincaline
+since
+sincere
+sincerely
+sincereness
+sincerity
+sincipital
+sinciput
+sind
+sinder
+Sindhi
+sindle
+sindoc
+sindon
+sindry
+sine
+sinecural
+sinecure
+sinecureship
+sinecurism
+sinecurist
+Sinesian
+sinew
+sinewed
+sinewiness
+sinewless
+sinewous
+sinewy
+sinfonia
+sinfonie
+sinfonietta
+sinful
+sinfully
+sinfulness
+sing
+singability
+singable
+singableness
+singally
+singarip
+singe
+singed
+singeing
+singeingly
+singer
+singey
+Singfo
+singh
+Singhalese
+singillatim
+singing
+singingly
+singkamas
+single
+singlebar
+singled
+singlehanded
+singlehandedly
+singlehandedness
+singlehearted
+singleheartedly
+singleheartedness
+singlehood
+singleness
+singler
+singles
+singlestick
+singlesticker
+singlet
+singleton
+singletree
+singlings
+singly
+Singpho
+Singsing
+singsong
+singsongy
+Singspiel
+singspiel
+singstress
+singular
+singularism
+singularist
+singularity
+singularization
+singularize
+singularly
+singularness
+singult
+singultous
+singultus
+sinh
+Sinhalese
+Sinian
+Sinic
+Sinicism
+Sinicization
+Sinicize
+Sinico
+Sinification
+Sinify
+sinigrin
+sinigrinase
+sinigrosid
+sinigroside
+Sinisian
+Sinism
+sinister
+sinisterly
+sinisterness
+sinisterwise
+sinistrad
+sinistral
+sinistrality
+sinistrally
+sinistration
+sinistrin
+sinistrocerebral
+sinistrocular
+sinistrodextral
+sinistrogyrate
+sinistrogyration
+sinistrogyric
+sinistromanual
+sinistrorsal
+sinistrorsally
+sinistrorse
+sinistrous
+sinistrously
+sinistruous
+Sinite
+Sinitic
+sink
+sinkable
+sinkage
+sinker
+sinkerless
+sinkfield
+sinkhead
+sinkhole
+sinking
+Sinkiuse
+sinkless
+sinklike
+sinkroom
+sinkstone
+sinky
+sinless
+sinlessly
+sinlessness
+sinlike
+sinnable
+sinnableness
+sinnen
+sinner
+sinneress
+sinnership
+sinnet
+Sinningia
+sinningly
+sinningness
+sinoatrial
+sinoauricular
+Sinogram
+sinoidal
+Sinolog
+Sinologer
+Sinological
+Sinologist
+Sinologue
+Sinology
+sinomenine
+Sinonism
+Sinophile
+Sinophilism
+sinopia
+Sinopic
+sinopite
+sinople
+sinproof
+Sinsiga
+sinsion
+sinsring
+sinsyne
+sinter
+Sinto
+sintoc
+Sintoism
+Sintoist
+Sintsink
+Sintu
+sinuate
+sinuated
+sinuatedentate
+sinuately
+sinuation
+sinuatocontorted
+sinuatodentate
+sinuatodentated
+sinuatopinnatifid
+sinuatoserrated
+sinuatoundulate
+sinuatrial
+sinuauricular
+sinuitis
+sinuose
+sinuosely
+sinuosity
+sinuous
+sinuously
+sinuousness
+Sinupallia
+sinupallial
+Sinupallialia
+Sinupalliata
+sinupalliate
+sinus
+sinusal
+sinusitis
+sinuslike
+sinusoid
+sinusoidal
+sinusoidally
+sinuventricular
+sinward
+siol
+Sion
+sion
+Sionite
+Siouan
+Sioux
+sip
+sipage
+sipe
+siper
+siphoid
+siphon
+siphonaceous
+siphonage
+siphonal
+Siphonales
+Siphonaptera
+siphonapterous
+Siphonaria
+siphonariid
+Siphonariidae
+Siphonata
+siphonate
+Siphoneae
+siphoneous
+siphonet
+siphonia
+siphonial
+Siphoniata
+siphonic
+Siphonifera
+siphoniferous
+siphoniform
+siphonium
+siphonless
+siphonlike
+Siphonobranchiata
+siphonobranchiate
+Siphonocladales
+Siphonocladiales
+siphonogam
+Siphonogama
+siphonogamic
+siphonogamous
+siphonogamy
+siphonoglyph
+siphonoglyphe
+siphonognathid
+Siphonognathidae
+siphonognathous
+Siphonognathus
+Siphonophora
+siphonophoran
+siphonophore
+siphonophorous
+siphonoplax
+siphonopore
+siphonorhinal
+siphonorhine
+siphonosome
+siphonostele
+siphonostelic
+siphonostely
+Siphonostoma
+Siphonostomata
+siphonostomatous
+siphonostome
+siphonostomous
+siphonozooid
+siphonula
+siphorhinal
+siphorhinian
+siphosome
+siphuncle
+siphuncled
+siphuncular
+Siphunculata
+siphunculate
+siphunculated
+Sipibo
+sipid
+sipidity
+Siping
+siping
+sipling
+sipper
+sippet
+sippingly
+sippio
+Sipunculacea
+sipunculacean
+sipunculid
+Sipunculida
+sipunculoid
+Sipunculoidea
+Sipunculus
+sipylite
+Sir
+sir
+sircar
+sirdar
+sirdarship
+sire
+Siredon
+sireless
+siren
+sirene
+Sirenia
+sirenian
+sirenic
+sirenical
+sirenically
+Sirenidae
+sirening
+sirenize
+sirenlike
+sirenoid
+Sirenoidea
+Sirenoidei
+sireny
+sireship
+siress
+sirgang
+Sirian
+sirian
+Sirianian
+siriasis
+siricid
+Siricidae
+Siricoidea
+sirih
+siriometer
+Sirione
+siris
+Sirius
+sirkeer
+sirki
+sirky
+sirloin
+sirloiny
+Sirmian
+Sirmuellera
+siroc
+sirocco
+siroccoish
+siroccoishly
+sirpea
+sirple
+sirpoon
+sirrah
+sirree
+sirship
+siruaballi
+siruelas
+sirup
+siruped
+siruper
+sirupy
+Siryan
+Sis
+sis
+sisal
+siscowet
+sise
+sisel
+siserara
+siserary
+siserskite
+sish
+sisham
+sisi
+siskin
+Sisley
+sismotherapy
+siss
+Sisseton
+sissification
+sissify
+sissiness
+sissoo
+Sissu
+sissy
+sissyish
+sissyism
+sist
+Sistani
+sister
+sisterhood
+sisterin
+sistering
+sisterize
+sisterless
+sisterlike
+sisterliness
+sisterly
+sistern
+Sistine
+sistle
+sistomensin
+sistrum
+Sistrurus
+Sisymbrium
+Sisyphean
+Sisyphian
+Sisyphides
+Sisyphism
+Sisyphist
+Sisyphus
+Sisyrinchium
+sisyrinchium
+sit
+Sita
+sitao
+sitar
+sitatunga
+sitch
+site
+sitfast
+sith
+sithcund
+sithe
+sithement
+sithence
+sithens
+sitient
+sitio
+sitiology
+sitiomania
+sitiophobia
+Sitka
+Sitkan
+sitology
+sitomania
+Sitophilus
+sitophobia
+sitophobic
+sitosterin
+sitosterol
+sitotoxism
+Sitta
+sittee
+sitten
+sitter
+Sittidae
+Sittinae
+sittine
+sitting
+sittringy
+situal
+situate
+situated
+situation
+situational
+situla
+situlae
+situs
+Sium
+Siusi
+Siuslaw
+Siva
+siva
+Sivaism
+Sivaist
+Sivaistic
+Sivaite
+Sivan
+Sivapithecus
+sivathere
+Sivatheriidae
+Sivatheriinae
+sivatherioid
+Sivatherium
+siver
+sivvens
+Siwan
+Siwash
+siwash
+six
+sixain
+sixer
+sixfoil
+sixfold
+sixhaend
+sixhynde
+sixpence
+sixpenny
+sixpennyworth
+sixscore
+sixsome
+sixte
+sixteen
+sixteener
+sixteenfold
+sixteenmo
+sixteenth
+sixteenthly
+sixth
+sixthet
+sixthly
+sixtieth
+Sixtowns
+Sixtus
+sixty
+sixtyfold
+sixtypenny
+sizable
+sizableness
+sizably
+sizal
+sizar
+sizarship
+size
+sizeable
+sizeableness
+sized
+sizeman
+sizer
+sizes
+siziness
+sizing
+sizy
+sizygia
+sizygium
+sizz
+sizzard
+sizzing
+sizzle
+sizzling
+sizzlingly
+Sjaak
+sjambok
+Sjouke
+skaddle
+skaff
+skaffie
+skag
+skaillie
+skainsmate
+skair
+skaitbird
+skal
+skalawag
+skaldship
+skance
+Skanda
+skandhas
+skart
+skasely
+Skat
+skat
+skate
+skateable
+skater
+skatikas
+skatiku
+skating
+skatist
+skatole
+skatosine
+skatoxyl
+skaw
+skean
+skeanockle
+skedaddle
+skedaddler
+skedge
+skedgewith
+skedlock
+skee
+skeed
+skeeg
+skeel
+skeeling
+skeely
+skeen
+skeenyie
+skeer
+skeered
+skeery
+skeesicks
+skeet
+Skeeter
+skeeter
+skeezix
+Skef
+skeg
+skegger
+skeif
+skeigh
+skeily
+skein
+skeiner
+skeipp
+skel
+skelder
+skelderdrake
+skeldrake
+skeletal
+skeletin
+skeletogenous
+skeletogeny
+skeletomuscular
+skeleton
+skeletonian
+skeletonic
+skeletonization
+skeletonize
+skeletonizer
+skeletonless
+skeletonweed
+skeletony
+skelf
+skelgoose
+skelic
+skell
+skellat
+skeller
+skelloch
+skellum
+skelly
+skelp
+skelper
+skelpin
+skelping
+skelter
+Skeltonian
+Skeltonic
+Skeltonical
+Skeltonics
+skemmel
+skemp
+sken
+skene
+skeo
+skeough
+skep
+skepful
+skeppist
+skeppund
+skeptic
+skeptical
+skeptically
+skepticalness
+skepticism
+skepticize
+sker
+skere
+skerret
+skerrick
+skerry
+sketch
+sketchability
+sketchable
+sketchbook
+sketchee
+sketcher
+sketchily
+sketchiness
+sketching
+sketchingly
+sketchist
+sketchlike
+sketchy
+skete
+sketiotai
+skeuomorph
+skeuomorphic
+skevish
+skew
+skewback
+skewbacked
+skewbald
+skewed
+skewer
+skewerer
+skewerwood
+skewings
+skewl
+skewly
+skewness
+skewwhiff
+skewwise
+skewy
+skey
+skeyting
+ski
+skiagram
+skiagraph
+skiagrapher
+skiagraphic
+skiagraphical
+skiagraphically
+skiagraphy
+skiameter
+skiametry
+skiapod
+skiapodous
+skiascope
+skiascopy
+skibby
+skibslast
+skice
+skid
+skidded
+skidder
+skidding
+skiddingly
+skiddoo
+skiddy
+Skidi
+skidpan
+skidproof
+skidway
+skied
+skieppe
+skiepper
+skier
+skies
+skiff
+skiffless
+skiffling
+skift
+skiing
+skijore
+skijorer
+skijoring
+skil
+skilder
+skildfel
+skilfish
+skill
+skillagalee
+skilled
+skillenton
+skillessness
+skillet
+skillful
+skillfully
+skillfulness
+skilligalee
+skilling
+skillion
+skilly
+skilpot
+skilts
+skim
+skimback
+skime
+skimmed
+skimmer
+skimmerton
+Skimmia
+skimming
+skimmingly
+skimmington
+skimmity
+skimp
+skimpily
+skimpiness
+skimpingly
+skimpy
+skin
+skinbound
+skinch
+skinflint
+skinflintily
+skinflintiness
+skinflinty
+skinful
+skink
+skinker
+skinking
+skinkle
+skinless
+skinlike
+skinned
+skinner
+skinnery
+skinniness
+skinning
+skinny
+skintight
+skinworm
+skiogram
+skiograph
+skiophyte
+Skip
+skip
+skipbrain
+Skipetar
+skipjack
+skipjackly
+skipkennel
+skipman
+skippable
+skippel
+skipper
+skippered
+skippership
+skippery
+skippet
+skipping
+skippingly
+skipple
+skippund
+skippy
+skiptail
+skirl
+skirlcock
+skirling
+skirmish
+skirmisher
+skirmishing
+skirmishingly
+skirp
+skirr
+skirreh
+skirret
+skirt
+skirtboard
+skirted
+skirter
+skirting
+skirtingly
+skirtless
+skirtlike
+skirty
+skirwhit
+skirwort
+skit
+skite
+skiter
+skither
+Skitswish
+Skittaget
+Skittagetan
+skitter
+skittish
+skittishly
+skittishness
+skittle
+skittled
+skittler
+skittles
+skitty
+skittyboot
+skiv
+skive
+skiver
+skiverwood
+skiving
+skivvies
+sklate
+sklater
+sklent
+skleropelite
+sklinter
+skoal
+Skodaic
+skogbolite
+Skoinolon
+skokiaan
+Skokomish
+skomerite
+skoo
+skookum
+Skopets
+skoptsy
+skout
+skraeling
+skraigh
+skrike
+skrimshander
+skrupul
+skua
+skulduggery
+skulk
+skulker
+skulking
+skulkingly
+skull
+skullbanker
+skullcap
+skulled
+skullery
+skullfish
+skullful
+skully
+skulp
+skun
+skunk
+skunkbill
+skunkbush
+skunkdom
+skunkery
+skunkhead
+skunkish
+skunklet
+skunktop
+skunkweed
+skunky
+Skupshtina
+skuse
+skutterudite
+sky
+skybal
+skycraft
+Skye
+skyey
+skyful
+skyish
+skylark
+skylarker
+skyless
+skylight
+skylike
+skylook
+skyman
+skyphoi
+skyphos
+skyplast
+skyre
+skyrgaliard
+skyrocket
+skyrockety
+skysail
+skyscape
+skyscraper
+skyscraping
+skyshine
+skyugle
+skyward
+skywards
+skyway
+skywrite
+skywriter
+skywriting
+sla
+slab
+slabbed
+slabber
+slabberer
+slabbery
+slabbiness
+slabbing
+slabby
+slabman
+slabness
+slabstone
+slack
+slackage
+slacked
+slacken
+slackener
+slacker
+slackerism
+slacking
+slackingly
+slackly
+slackness
+slad
+sladang
+slade
+slae
+slag
+slaggability
+slaggable
+slagger
+slagging
+slaggy
+slagless
+slaglessness
+slagman
+slain
+slainte
+slaister
+slaistery
+slait
+slake
+slakeable
+slakeless
+slaker
+slaking
+slaky
+slam
+slammakin
+slammerkin
+slammock
+slammocking
+slammocky
+slamp
+slampamp
+slampant
+slander
+slanderer
+slanderful
+slanderfully
+slandering
+slanderingly
+slanderous
+slanderously
+slanderousness
+slanderproof
+slane
+slang
+slangily
+slanginess
+slangish
+slangishly
+slangism
+slangkop
+slangous
+slangster
+slanguage
+slangular
+slangy
+slank
+slant
+slantindicular
+slantindicularly
+slanting
+slantingly
+slantingways
+slantly
+slantways
+slantwise
+slap
+slapdash
+slapdashery
+slape
+slaphappy
+slapjack
+slapper
+slapping
+slapstick
+slapsticky
+slare
+slart
+slarth
+Slartibartfast
+slash
+slashed
+slasher
+slashing
+slashingly
+slashy
+slat
+slatch
+slate
+slateful
+slatelike
+slatemaker
+slatemaking
+slater
+slateworks
+slateyard
+slath
+slather
+slatify
+slatiness
+slating
+slatish
+slatted
+slatter
+slattern
+slatternish
+slatternliness
+slatternly
+slatternness
+slattery
+slatting
+slaty
+slaughter
+slaughterer
+slaughterhouse
+slaughteringly
+slaughterman
+slaughterous
+slaughterously
+slaughteryard
+slaum
+Slav
+Slavdom
+Slave
+slave
+slaveborn
+slaved
+slaveholder
+slaveholding
+slaveland
+slaveless
+slavelet
+slavelike
+slaveling
+slavemonger
+slaveowner
+slaveownership
+slavepen
+slaver
+slaverer
+slavering
+slaveringly
+slavery
+Slavey
+slavey
+Slavi
+Slavian
+Slavic
+Slavicism
+Slavicize
+Slavification
+Slavify
+slavikite
+slaving
+Slavish
+slavish
+slavishly
+slavishness
+Slavism
+Slavist
+Slavistic
+Slavization
+Slavize
+slavocracy
+slavocrat
+slavocratic
+Slavonian
+Slavonianize
+Slavonic
+Slavonically
+Slavonicize
+Slavonish
+Slavonism
+Slavonization
+Slavonize
+Slavophile
+Slavophilism
+Slavophobe
+Slavophobist
+slaw
+slay
+slayable
+slayer
+slaying
+sleathy
+sleave
+sleaved
+sleaziness
+sleazy
+Sleb
+sleck
+sled
+sledded
+sledder
+sledding
+sledful
+sledge
+sledgeless
+sledgemeter
+sledger
+sledging
+sledlike
+slee
+sleech
+sleechy
+sleek
+sleeken
+sleeker
+sleeking
+sleekit
+sleekly
+sleekness
+sleeky
+sleep
+sleeper
+sleepered
+sleepful
+sleepfulness
+sleepify
+sleepily
+sleepiness
+sleeping
+sleepingly
+sleepland
+sleepless
+sleeplessly
+sleeplessness
+sleeplike
+sleepmarken
+sleepproof
+sleepry
+sleepwaker
+sleepwaking
+sleepwalk
+sleepwalker
+sleepwalking
+sleepward
+sleepwort
+sleepy
+sleepyhead
+sleer
+sleet
+sleetiness
+sleeting
+sleetproof
+sleety
+sleeve
+sleeveband
+sleeveboard
+sleeved
+sleeveen
+sleevefish
+sleeveful
+sleeveless
+sleevelessness
+sleevelet
+sleevelike
+sleever
+sleigh
+sleigher
+sleighing
+sleight
+sleightful
+sleighty
+slendang
+slender
+slenderish
+slenderize
+slenderly
+slenderness
+slent
+slepez
+slept
+slete
+sleuth
+sleuthdog
+sleuthful
+sleuthhound
+sleuthlike
+slew
+slewed
+slewer
+slewing
+sley
+sleyer
+slice
+sliceable
+sliced
+slicer
+slich
+slicht
+slicing
+slicingly
+slick
+slicken
+slickens
+slickenside
+slicker
+slickered
+slickery
+slicking
+slickly
+slickness
+slid
+slidable
+slidableness
+slidably
+slidage
+slidden
+slidder
+sliddery
+slide
+slideable
+slideableness
+slideably
+slided
+slidehead
+slideman
+slideproof
+slider
+slideway
+sliding
+slidingly
+slidingness
+slidometer
+slifter
+slight
+slighted
+slighter
+slightily
+slightiness
+slighting
+slightingly
+slightish
+slightly
+slightness
+slighty
+slim
+slime
+slimeman
+slimer
+slimily
+sliminess
+slimish
+slimishness
+slimly
+slimmish
+slimness
+slimpsy
+slimsy
+slimy
+sline
+sling
+slingball
+slinge
+slinger
+slinging
+slingshot
+slingsman
+slingstone
+slink
+slinker
+slinkily
+slinkiness
+slinking
+slinkingly
+slinkskin
+slinkweed
+slinky
+slip
+slipback
+slipband
+slipboard
+slipbody
+slipcase
+slipcoach
+slipcoat
+slipe
+slipgibbet
+sliphorn
+sliphouse
+slipknot
+slipless
+slipman
+slipover
+slippage
+slipped
+slipper
+slippered
+slipperflower
+slipperily
+slipperiness
+slipperlike
+slipperweed
+slipperwort
+slippery
+slipperyback
+slipperyroot
+slippiness
+slipping
+slippingly
+slipproof
+slippy
+slipshod
+slipshoddiness
+slipshoddy
+slipshodness
+slipshoe
+slipslap
+slipslop
+slipsloppish
+slipsloppism
+slipsole
+slipstep
+slipstring
+sliptopped
+slipway
+slirt
+slish
+slit
+slitch
+slite
+slither
+slithering
+slitheroo
+slithers
+slithery
+slithy
+slitless
+slitlike
+slitshell
+slitted
+slitter
+slitting
+slitty
+slitwise
+slive
+sliver
+sliverer
+sliverlike
+sliverproof
+slivery
+sliving
+slivovitz
+sloan
+Sloanea
+slob
+slobber
+slobberchops
+slobberer
+slobbers
+slobbery
+slobby
+slock
+slocken
+slod
+slodder
+slodge
+slodger
+sloe
+sloeberry
+sloebush
+sloetree
+slog
+slogan
+sloganeer
+sloganize
+slogger
+slogging
+slogwood
+sloka
+sloke
+slommock
+slon
+slone
+slonk
+sloo
+sloom
+sloomy
+sloop
+sloopman
+sloosh
+slop
+slopdash
+slope
+sloped
+slopely
+slopeness
+sloper
+slopeways
+slopewise
+sloping
+slopingly
+slopingness
+slopmaker
+slopmaking
+sloppage
+slopped
+sloppery
+sloppily
+sloppiness
+slopping
+sloppy
+slops
+slopseller
+slopselling
+slopshop
+slopstone
+slopwork
+slopworker
+slopy
+slorp
+slosh
+slosher
+sloshily
+sloshiness
+sloshy
+slot
+slote
+sloted
+sloth
+slothful
+slothfully
+slothfulness
+slothound
+slotted
+slotter
+slottery
+slotting
+slotwise
+slouch
+sloucher
+slouchily
+slouchiness
+slouching
+slouchingly
+slouchy
+slough
+sloughiness
+sloughy
+slour
+sloush
+Slovak
+Slovakian
+Slovakish
+sloven
+Slovene
+Slovenian
+Slovenish
+slovenlike
+slovenliness
+slovenly
+slovenwood
+Slovintzi
+slow
+slowbellied
+slowbelly
+slowdown
+slowgoing
+slowheaded
+slowhearted
+slowheartedness
+slowhound
+slowish
+slowly
+slowmouthed
+slowpoke
+slowrie
+slows
+slowworm
+sloyd
+slub
+slubber
+slubberdegullion
+slubberer
+slubbering
+slubberingly
+slubberly
+slubbery
+slubbing
+slubby
+slud
+sludder
+sluddery
+sludge
+sludged
+sludger
+sludgy
+slue
+sluer
+slug
+slugabed
+sluggard
+sluggarding
+sluggardize
+sluggardliness
+sluggardly
+sluggardness
+sluggardry
+slugged
+slugger
+slugging
+sluggingly
+sluggish
+sluggishly
+sluggishness
+sluggy
+sluglike
+slugwood
+sluice
+sluicelike
+sluicer
+sluiceway
+sluicing
+sluicy
+sluig
+sluit
+slum
+slumber
+slumberer
+slumberful
+slumbering
+slumberingly
+slumberland
+slumberless
+slumberous
+slumberously
+slumberousness
+slumberproof
+slumbersome
+slumbery
+slumbrous
+slumdom
+slumgullion
+slumgum
+slumland
+slummage
+slummer
+slumminess
+slumming
+slummock
+slummocky
+slummy
+slump
+slumpproof
+slumproof
+slumpwork
+slumpy
+slumward
+slumwise
+slung
+slungbody
+slunge
+slunk
+slunken
+slur
+slurbow
+slurp
+slurry
+slush
+slusher
+slushily
+slushiness
+slushy
+slut
+slutch
+slutchy
+sluther
+sluthood
+slutter
+sluttery
+sluttikin
+sluttish
+sluttishly
+sluttishness
+slutty
+sly
+slyboots
+slyish
+slyly
+slyness
+slype
+sma
+smachrie
+smack
+smackee
+smacker
+smackful
+smacking
+smackingly
+smacksman
+smaik
+Smalcaldian
+Smalcaldic
+small
+smallage
+smallclothes
+smallcoal
+smallen
+smaller
+smallhearted
+smallholder
+smalling
+smallish
+smallmouth
+smallmouthed
+smallness
+smallpox
+smalls
+smallsword
+smalltime
+smallware
+smally
+smalm
+smalt
+smalter
+smaltine
+smaltite
+smalts
+smaragd
+smaragdine
+smaragdite
+smaragdus
+smarm
+smarmy
+smart
+smarten
+smarting
+smartingly
+smartish
+smartism
+smartless
+smartly
+smartness
+smartweed
+smarty
+smash
+smashable
+smashage
+smashboard
+smasher
+smashery
+smashing
+smashingly
+smashment
+smashup
+smatter
+smatterer
+smattering
+smatteringly
+smattery
+smaze
+smear
+smearcase
+smeared
+smearer
+smeariness
+smearless
+smeary
+smectic
+smectis
+smectite
+Smectymnuan
+Smectymnuus
+smeddum
+smee
+smeech
+smeek
+smeeky
+smeer
+smeeth
+smegma
+smell
+smellable
+smellage
+smelled
+smeller
+smellful
+smellfungi
+smellfungus
+smelliness
+smelling
+smellproof
+smellsome
+smelly
+smelt
+smelter
+smelterman
+smeltery
+smeltman
+smeth
+smethe
+smeuse
+smew
+smich
+smicker
+smicket
+smiddie
+smiddum
+smidge
+smidgen
+smifligate
+smifligation
+smiggins
+Smilacaceae
+smilacaceous
+Smilaceae
+smilaceous
+smilacin
+Smilacina
+Smilax
+smilax
+smile
+smileable
+smileage
+smileful
+smilefulness
+smileless
+smilelessly
+smilelessness
+smilemaker
+smilemaking
+smileproof
+smiler
+smilet
+smiling
+smilingly
+smilingness
+Smilodon
+smily
+Smintheus
+Sminthian
+sminthurid
+Sminthuridae
+Sminthurus
+smirch
+smircher
+smirchless
+smirchy
+smiris
+smirk
+smirker
+smirking
+smirkingly
+smirkish
+smirkle
+smirkly
+smirky
+smirtle
+smit
+smitch
+smite
+smiter
+smith
+smitham
+smithcraft
+smither
+smithereens
+smithery
+Smithian
+Smithianism
+smithing
+smithite
+Smithsonian
+smithsonite
+smithwork
+smithy
+smithydander
+smiting
+smitten
+smitting
+smock
+smocker
+smockface
+smocking
+smockless
+smocklike
+smog
+smokables
+smoke
+smokeable
+smokebox
+smokebush
+smoked
+smokefarthings
+smokehouse
+smokejack
+smokeless
+smokelessly
+smokelessness
+smokelike
+smokeproof
+smoker
+smokery
+smokestack
+smokestone
+smoketight
+smokewood
+smokily
+smokiness
+smoking
+smokish
+smoky
+smokyseeming
+smolder
+smolderingness
+smolt
+smooch
+smoochy
+smoodge
+smoodger
+smook
+smoorich
+Smoos
+smoot
+smooth
+smoothable
+smoothback
+smoothbore
+smoothbored
+smoothcoat
+smoothen
+smoother
+smoothification
+smoothify
+smoothing
+smoothingly
+smoothish
+smoothly
+smoothmouthed
+smoothness
+smoothpate
+smopple
+smore
+smorgasbord
+smote
+smother
+smotherable
+smotheration
+smothered
+smotherer
+smotheriness
+smothering
+smotheringly
+smothery
+smotter
+smouch
+smoucher
+smous
+smouse
+smouser
+smout
+smriti
+smudge
+smudged
+smudgedly
+smudgeless
+smudgeproof
+smudger
+smudgily
+smudginess
+smudgy
+smug
+smuggery
+smuggish
+smuggishly
+smuggishness
+smuggle
+smuggleable
+smuggler
+smugglery
+smuggling
+smugism
+smugly
+smugness
+smuisty
+smur
+smurr
+smurry
+smuse
+smush
+smut
+smutch
+smutchin
+smutchless
+smutchy
+smutproof
+smutted
+smutter
+smuttily
+smuttiness
+smutty
+Smyrna
+Smyrnaite
+Smyrnean
+Smyrniot
+Smyrniote
+smyth
+smytrie
+snab
+snabbie
+snabble
+snack
+snackle
+snackman
+snaff
+snaffle
+snaffles
+snafu
+snag
+snagbush
+snagged
+snagger
+snaggled
+snaggletooth
+snaggy
+snagrel
+snail
+snaileater
+snailery
+snailfish
+snailflower
+snailish
+snailishly
+snaillike
+snails
+snaily
+snaith
+snake
+snakebark
+snakeberry
+snakebird
+snakebite
+snakefish
+snakeflower
+snakehead
+snakeholing
+snakeleaf
+snakeless
+snakelet
+snakelike
+snakeling
+snakemouth
+snakeneck
+snakeology
+snakephobia
+snakepiece
+snakepipe
+snakeproof
+snaker
+snakeroot
+snakery
+snakeship
+snakeskin
+snakestone
+snakeweed
+snakewise
+snakewood
+snakeworm
+snakewort
+snakily
+snakiness
+snaking
+snakish
+snaky
+snap
+snapback
+snapbag
+snapberry
+snapdragon
+snape
+snaper
+snaphead
+snapholder
+snapjack
+snapless
+snappable
+snapped
+snapper
+snappily
+snappiness
+snapping
+snappingly
+snappish
+snappishly
+snappishness
+snapps
+snappy
+snaps
+snapsack
+snapshot
+snapshotter
+snapweed
+snapwood
+snapwort
+snapy
+snare
+snareless
+snarer
+snaringly
+snark
+snarl
+snarler
+snarleyyow
+snarlingly
+snarlish
+snarly
+snary
+snaste
+snatch
+snatchable
+snatched
+snatcher
+snatchily
+snatching
+snatchingly
+snatchproof
+snatchy
+snath
+snathe
+snavel
+snavvle
+snaw
+snead
+sneak
+sneaker
+sneakiness
+sneaking
+sneakingly
+sneakingness
+sneakish
+sneakishly
+sneakishness
+sneaksby
+sneaksman
+sneaky
+sneap
+sneath
+sneathe
+sneb
+sneck
+sneckdraw
+sneckdrawing
+sneckdrawn
+snecker
+snecket
+sned
+snee
+sneer
+sneerer
+sneerful
+sneerfulness
+sneering
+sneeringly
+sneerless
+sneery
+sneesh
+sneeshing
+sneest
+sneesty
+sneeze
+sneezeless
+sneezeproof
+sneezer
+sneezeweed
+sneezewood
+sneezewort
+sneezing
+sneezy
+snell
+snelly
+Snemovna
+snerp
+snew
+snib
+snibble
+snibbled
+snibbler
+snibel
+snicher
+snick
+snickdraw
+snickdrawing
+snicker
+snickering
+snickeringly
+snickersnee
+snicket
+snickey
+snickle
+sniddle
+snide
+snideness
+sniff
+sniffer
+sniffily
+sniffiness
+sniffing
+sniffingly
+sniffish
+sniffishness
+sniffle
+sniffler
+sniffly
+sniffy
+snift
+snifter
+snifty
+snig
+snigger
+sniggerer
+sniggering
+sniggle
+sniggler
+sniggoringly
+snip
+snipe
+snipebill
+snipefish
+snipelike
+sniper
+sniperscope
+sniping
+snipish
+snipjack
+snipnose
+snipocracy
+snipper
+snippersnapper
+snipperty
+snippet
+snippetiness
+snippety
+snippiness
+snipping
+snippish
+snippy
+snipsnapsnorum
+sniptious
+snipy
+snirl
+snirt
+snirtle
+snitch
+snitcher
+snite
+snithe
+snithy
+snittle
+snivel
+sniveled
+sniveler
+sniveling
+snively
+snivy
+snob
+snobber
+snobbery
+snobbess
+snobbing
+snobbish
+snobbishly
+snobbishness
+snobbism
+snobby
+snobdom
+snobling
+snobocracy
+snobocrat
+snobographer
+snobography
+snobologist
+snobonomer
+snobscat
+snocher
+snock
+snocker
+snod
+snodly
+snoek
+snoeking
+snog
+snoga
+Snohomish
+snoke
+Snonowas
+snood
+snooded
+snooding
+snook
+snooker
+snookered
+snoop
+snooper
+snooperscope
+snoopy
+snoose
+snoot
+snootily
+snootiness
+snooty
+snoove
+snooze
+snoozer
+snooziness
+snoozle
+snoozy
+snop
+Snoqualmie
+Snoquamish
+snore
+snoreless
+snorer
+snoring
+snoringly
+snork
+snorkel
+snorker
+snort
+snorter
+snorting
+snortingly
+snortle
+snorty
+snot
+snotter
+snottily
+snottiness
+snotty
+snouch
+snout
+snouted
+snouter
+snoutish
+snoutless
+snoutlike
+snouty
+Snow
+snow
+Snowball
+snowball
+snowbank
+snowbell
+snowberg
+snowberry
+snowbird
+snowblink
+snowbound
+snowbreak
+snowbush
+snowcap
+snowcraft
+Snowdonian
+snowdrift
+snowdrop
+snowfall
+snowflake
+snowflight
+snowflower
+snowfowl
+snowhammer
+snowhouse
+snowie
+snowily
+snowiness
+snowish
+snowk
+snowl
+snowland
+snowless
+snowlike
+snowmanship
+snowmobile
+snowplow
+snowproof
+snowscape
+snowshade
+snowshed
+snowshine
+snowshoe
+snowshoed
+snowshoeing
+snowshoer
+snowslide
+snowslip
+snowstorm
+snowsuit
+snowworm
+snowy
+snozzle
+snub
+snubbable
+snubbed
+snubbee
+snubber
+snubbiness
+snubbing
+snubbingly
+snubbish
+snubbishly
+snubbishness
+snubby
+snubproof
+snuck
+snudge
+snuff
+snuffbox
+snuffboxer
+snuffcolored
+snuffer
+snuffers
+snuffiness
+snuffing
+snuffingly
+snuffish
+snuffle
+snuffler
+snuffles
+snuffless
+snuffliness
+snuffling
+snufflingly
+snuffly
+snuffman
+snuffy
+snug
+snugger
+snuggery
+snuggish
+snuggle
+snugify
+snugly
+snugness
+snum
+snup
+snupper
+snur
+snurl
+snurly
+snurp
+snurt
+snuzzle
+sny
+snying
+so
+soak
+soakage
+soakaway
+soaked
+soaken
+soaker
+soaking
+soakingly
+soakman
+soaky
+soally
+soam
+soap
+soapbark
+soapberry
+soapbox
+soapboxer
+soapbubbly
+soapbush
+soaper
+soapery
+soapfish
+soapily
+soapiness
+soaplees
+soapless
+soaplike
+soapmaker
+soapmaking
+soapmonger
+soaprock
+soaproot
+soapstone
+soapsud
+soapsuddy
+soapsuds
+soapsudsy
+soapweed
+soapwood
+soapwort
+soapy
+soar
+soarability
+soarable
+soarer
+soaring
+soaringly
+soary
+sob
+sobber
+sobbing
+sobbingly
+sobby
+sobeit
+sober
+soberer
+sobering
+soberingly
+soberize
+soberlike
+soberly
+soberness
+sobersault
+sobersided
+sobersides
+soberwise
+sobful
+soboles
+soboliferous
+sobproof
+Sobralia
+sobralite
+Sobranje
+sobrevest
+sobriety
+sobriquet
+sobriquetical
+soc
+socage
+socager
+soccer
+soccerist
+soccerite
+soce
+socht
+sociability
+sociable
+sociableness
+sociably
+social
+Sociales
+socialism
+socialist
+socialistic
+socialite
+sociality
+socializable
+socialization
+socialize
+socializer
+socially
+socialness
+sociation
+sociative
+societal
+societally
+societarian
+societarianism
+societary
+societified
+societism
+societist
+societologist
+societology
+society
+societyish
+societyless
+socii
+Socinian
+Socinianism
+Socinianistic
+Socinianize
+sociobiological
+sociocentric
+sociocracy
+sociocrat
+sociocratic
+sociocultural
+sociodrama
+sociodramatic
+socioeconomic
+socioeducational
+sociogenesis
+sociogenetic
+sociogeny
+sociography
+sociolatry
+sociolegal
+sociologian
+sociologic
+sociological
+sociologically
+sociologism
+sociologist
+sociologistic
+sociologize
+sociologizer
+sociologizing
+sociology
+sociomedical
+sociometric
+sociometry
+socionomic
+socionomics
+socionomy
+sociophagous
+sociopolitical
+socioreligious
+socioromantic
+sociostatic
+sociotechnical
+socius
+sock
+sockdolager
+socker
+socket
+socketful
+socketless
+sockeye
+sockless
+socklessness
+sockmaker
+sockmaking
+socky
+socle
+socman
+socmanry
+soco
+Socorrito
+Socotran
+Socotri
+Socotrine
+Socratean
+Socratic
+Socratical
+Socratically
+Socraticism
+Socratism
+Socratist
+Socratize
+sod
+soda
+sodaclase
+sodaic
+sodaless
+sodalist
+sodalite
+sodalithite
+sodality
+sodamide
+sodbuster
+sodded
+sodden
+soddenly
+soddenness
+sodding
+soddite
+soddy
+sodic
+sodio
+sodioaluminic
+sodioaurous
+sodiocitrate
+sodiohydric
+sodioplatinic
+sodiosalicylate
+sodiotartrate
+sodium
+sodless
+sodoku
+Sodom
+sodomic
+Sodomist
+Sodomite
+sodomitess
+sodomitic
+sodomitical
+sodomitically
+Sodomitish
+sodomy
+sodwork
+sody
+soe
+soekoe
+soever
+sofa
+sofane
+sofar
+soffit
+Sofia
+Sofoklis
+Sofronia
+soft
+softa
+softball
+softbrained
+soften
+softener
+softening
+softhead
+softheaded
+softhearted
+softheartedly
+softheartedness
+softhorn
+softish
+softling
+softly
+softner
+softness
+softship
+softtack
+softwood
+softy
+sog
+Soga
+Sogdian
+Sogdianese
+Sogdianian
+Sogdoite
+soger
+soget
+soggarth
+soggendalite
+soggily
+sogginess
+sogging
+soggy
+soh
+soho
+Soiesette
+soiesette
+soil
+soilage
+soiled
+soiling
+soilless
+soilproof
+soilure
+soily
+soiree
+soixantine
+Soja
+soja
+sojourn
+sojourner
+sojourney
+sojournment
+sok
+soka
+soke
+sokeman
+sokemanemot
+sokemanry
+soken
+Sokoki
+Sokotri
+Sokulk
+Sol
+sol
+sola
+solace
+solaceful
+solacement
+solaceproof
+solacer
+solacious
+solaciously
+solaciousness
+solan
+Solanaceae
+solanaceous
+solanal
+Solanales
+solander
+solaneine
+solaneous
+solanidine
+solanine
+Solanum
+solanum
+solar
+solarism
+solarist
+solaristic
+solaristically
+solaristics
+Solarium
+solarium
+solarization
+solarize
+solarometer
+solate
+solatia
+solation
+solatium
+solay
+sold
+soldado
+Soldan
+soldan
+soldanel
+Soldanella
+soldanelle
+soldanrie
+solder
+solderer
+soldering
+solderless
+soldi
+soldier
+soldierbird
+soldierbush
+soldierdom
+soldieress
+soldierfish
+soldierhearted
+soldierhood
+soldiering
+soldierize
+soldierlike
+soldierliness
+soldierly
+soldierproof
+soldiership
+soldierwise
+soldierwood
+soldiery
+soldo
+sole
+Solea
+solea
+soleas
+solecism
+solecist
+solecistic
+solecistical
+solecistically
+solecize
+solecizer
+Soleidae
+soleiform
+soleil
+soleless
+solely
+solemn
+solemncholy
+solemnify
+solemnitude
+solemnity
+solemnization
+solemnize
+solemnizer
+solemnly
+solemnness
+Solen
+solen
+solenacean
+solenaceous
+soleness
+solenette
+solenial
+Solenidae
+solenite
+solenitis
+solenium
+solenoconch
+Solenoconcha
+solenocyte
+Solenodon
+solenodont
+Solenodontidae
+solenogaster
+Solenogastres
+solenoglyph
+Solenoglypha
+solenoglyphic
+solenoid
+solenoidal
+solenoidally
+Solenopsis
+solenostele
+solenostelic
+solenostomid
+Solenostomidae
+solenostomoid
+solenostomous
+Solenostomus
+solent
+solentine
+solepiece
+soleplate
+soleprint
+soler
+Solera
+soles
+soleus
+soleyn
+solfataric
+solfeggio
+solferino
+soli
+soliative
+solicit
+solicitant
+solicitation
+solicitationism
+solicited
+solicitee
+soliciter
+soliciting
+solicitor
+solicitorship
+solicitous
+solicitously
+solicitousness
+solicitress
+solicitrix
+solicitude
+solicitudinous
+solid
+Solidago
+solidago
+solidaric
+solidarily
+solidarism
+solidarist
+solidaristic
+solidarity
+solidarize
+solidary
+solidate
+solidi
+solidifiability
+solidifiable
+solidifiableness
+solidification
+solidifier
+solidiform
+solidify
+solidish
+solidism
+solidist
+solidistic
+solidity
+solidly
+solidness
+solidum
+Solidungula
+solidungular
+solidungulate
+solidus
+solifidian
+solifidianism
+solifluction
+solifluctional
+soliform
+Solifugae
+solifuge
+solifugean
+solifugid
+solifugous
+soliloquacious
+soliloquist
+soliloquium
+soliloquize
+soliloquizer
+soliloquizing
+soliloquizingly
+soliloquy
+solilunar
+Solio
+solio
+soliped
+solipedal
+solipedous
+solipsism
+solipsismal
+solipsist
+solipsistic
+solist
+solitaire
+solitarian
+solitarily
+solitariness
+solitary
+soliterraneous
+solitidal
+solitude
+solitudinarian
+solitudinize
+solitudinous
+solivagant
+solivagous
+sollar
+solleret
+Sollya
+solmizate
+solmization
+solo
+solod
+solodi
+solodization
+solodize
+soloecophanes
+soloist
+Solomon
+Solomonian
+Solomonic
+Solomonical
+Solomonitic
+Solon
+solon
+solonchak
+solonetz
+solonetzic
+solonetzicity
+Solonian
+Solonic
+solonist
+soloth
+solotink
+solotnik
+solpugid
+Solpugida
+Solpugidea
+Solpugides
+solstice
+solsticion
+solstitia
+solstitial
+solstitially
+solstitium
+solubility
+solubilization
+solubilize
+soluble
+solubleness
+solubly
+solum
+solute
+solution
+solutional
+solutioner
+solutionist
+solutize
+solutizer
+Solutrean
+solvability
+solvable
+solvableness
+solvate
+solvation
+solve
+solvement
+solvency
+solvend
+solvent
+solvently
+solventproof
+solver
+solvolysis
+solvolytic
+solvolyze
+solvsbergite
+Solyma
+Solymaean
+soma
+somacule
+Somal
+somal
+Somali
+somaplasm
+Somaschian
+somasthenia
+somata
+somatasthenia
+Somateria
+somatic
+somatical
+somatically
+somaticosplanchnic
+somaticovisceral
+somatics
+somatism
+somatist
+somatization
+somatochrome
+somatocyst
+somatocystic
+somatoderm
+somatogenetic
+somatogenic
+somatognosis
+somatognostic
+somatologic
+somatological
+somatologically
+somatologist
+somatology
+somatome
+somatomic
+somatophyte
+somatophytic
+somatoplasm
+somatopleural
+somatopleure
+somatopleuric
+somatopsychic
+somatosplanchnic
+somatotonia
+somatotonic
+somatotropic
+somatotropically
+somatotropism
+somatotype
+somatotyper
+somatotypy
+somatous
+somber
+somberish
+somberly
+somberness
+sombre
+sombrerite
+sombrero
+sombreroed
+sombrous
+sombrously
+sombrousness
+some
+somebody
+someday
+somedeal
+somegate
+somehow
+someone
+somepart
+someplace
+somers
+somersault
+somerset
+Somersetian
+somervillite
+somesthesia
+somesthesis
+somesthetic
+something
+somethingness
+sometime
+sometimes
+someway
+someways
+somewhat
+somewhatly
+somewhatness
+somewhen
+somewhence
+somewhere
+somewheres
+somewhile
+somewhiles
+somewhither
+somewhy
+somewise
+somital
+somite
+somitic
+somma
+sommaite
+sommelier
+somnambulance
+somnambulancy
+somnambulant
+somnambular
+somnambulary
+somnambulate
+somnambulation
+somnambulator
+somnambule
+somnambulency
+somnambulic
+somnambulically
+somnambulism
+somnambulist
+somnambulistic
+somnambulize
+somnambulous
+somnial
+somniative
+somnifacient
+somniferous
+somniferously
+somnific
+somnifuge
+somnify
+somniloquacious
+somniloquence
+somniloquent
+somniloquism
+somniloquist
+somniloquize
+somniloquous
+somniloquy
+Somniosus
+somnipathist
+somnipathy
+somnivolency
+somnivolent
+somnolence
+somnolency
+somnolent
+somnolently
+somnolescence
+somnolescent
+somnolism
+somnolize
+somnopathy
+somnorific
+somnus
+sompay
+sompne
+sompner
+Son
+son
+sonable
+sonance
+sonancy
+sonant
+sonantal
+sonantic
+sonantina
+sonantized
+sonar
+sonata
+sonatina
+sonation
+Sonchus
+sond
+sondation
+sondeli
+Sonderbund
+sonderclass
+Sondergotter
+Sondylomorum
+soneri
+song
+songbird
+songbook
+songcraft
+songfest
+songful
+songfully
+songfulness
+Songhai
+Songish
+songish
+songland
+songle
+songless
+songlessly
+songlessness
+songlet
+songlike
+songman
+Songo
+Songoi
+songster
+songstress
+songworthy
+songwright
+songy
+sonhood
+sonic
+soniferous
+sonification
+soniou
+Sonja
+sonk
+sonless
+sonlike
+sonlikeness
+sonly
+Sonneratia
+Sonneratiaceae
+sonneratiaceous
+sonnet
+sonnetary
+sonneteer
+sonneteeress
+sonnetic
+sonneting
+sonnetish
+sonnetist
+sonnetize
+sonnetlike
+sonnetwise
+sonnikins
+Sonny
+sonny
+sonobuoy
+sonometer
+Sonoran
+sonorant
+sonorescence
+sonorescent
+sonoric
+sonoriferous
+sonoriferously
+sonorific
+sonority
+sonorophone
+sonorosity
+sonorous
+sonorously
+sonorousness
+Sonrai
+sons
+sonship
+sonsy
+sontag
+soodle
+soodly
+Soohong
+sook
+Sooke
+sooky
+sool
+sooloos
+soon
+sooner
+soonish
+soonly
+Soorah
+soorawn
+soord
+soorkee
+Soot
+soot
+sooter
+sooterkin
+sooth
+soothe
+soother
+sootherer
+soothful
+soothing
+soothingly
+soothingness
+soothless
+soothsay
+soothsayer
+soothsayership
+soothsaying
+sootily
+sootiness
+sootless
+sootlike
+sootproof
+sooty
+sootylike
+sop
+sope
+soph
+Sopheric
+Sopherim
+Sophia
+sophia
+Sophian
+sophic
+sophical
+sophically
+sophiologic
+sophiology
+sophism
+Sophist
+sophister
+sophistic
+sophistical
+sophistically
+sophisticalness
+sophisticant
+sophisticate
+sophisticated
+sophistication
+sophisticative
+sophisticator
+sophisticism
+Sophistress
+sophistress
+sophistry
+Sophoclean
+sophomore
+sophomoric
+sophomorical
+sophomorically
+Sophora
+sophoria
+Sophronia
+sophronize
+Sophy
+sophy
+sopite
+sopition
+sopor
+soporiferous
+soporiferously
+soporiferousness
+soporific
+soporifical
+soporifically
+soporose
+sopper
+soppiness
+sopping
+soppy
+soprani
+sopranino
+sopranist
+soprano
+sora
+Sorabian
+sorage
+soral
+Sorb
+sorb
+Sorbaria
+sorbate
+sorbefacient
+sorbent
+Sorbian
+sorbic
+sorbile
+sorbin
+sorbinose
+Sorbish
+sorbite
+sorbitic
+sorbitize
+sorbitol
+Sorbonic
+Sorbonical
+Sorbonist
+Sorbonne
+sorbose
+sorboside
+Sorbus
+sorbus
+sorcer
+sorcerer
+sorceress
+sorcering
+sorcerous
+sorcerously
+sorcery
+sorchin
+sorda
+Sordaria
+Sordariaceae
+sordawalite
+sordellina
+Sordello
+sordes
+sordid
+sordidity
+sordidly
+sordidness
+sordine
+sordino
+sordor
+sore
+soredia
+soredial
+sorediate
+sorediferous
+sorediform
+soredioid
+soredium
+soree
+sorefalcon
+sorefoot
+sorehawk
+sorehead
+soreheaded
+soreheadedly
+soreheadedness
+sorehearted
+sorehon
+sorely
+sorema
+soreness
+Sorex
+sorgho
+Sorghum
+sorghum
+sorgo
+sori
+soricid
+Soricidae
+soricident
+Soricinae
+soricine
+soricoid
+Soricoidea
+soriferous
+sorite
+sorites
+soritical
+sorn
+sornare
+sornari
+sorner
+sorning
+soroban
+Soroptimist
+sororal
+sororate
+sororial
+sororially
+sororicidal
+sororicide
+sorority
+sororize
+sorose
+sorosis
+sorosphere
+Sorosporella
+Sorosporium
+sorption
+sorra
+Sorrel
+sorrel
+sorrento
+sorrily
+sorriness
+sorroa
+sorrow
+sorrower
+sorrowful
+sorrowfully
+sorrowfulness
+sorrowing
+sorrowingly
+sorrowless
+sorrowproof
+sorrowy
+sorry
+sorryhearted
+sorryish
+sort
+sortable
+sortably
+sortal
+sortation
+sorted
+sorter
+sortie
+sortilege
+sortileger
+sortilegic
+sortilegious
+sortilegus
+sortilegy
+sortiment
+sortition
+sortly
+sorty
+sorus
+sorva
+sory
+sosh
+soshed
+Sosia
+soso
+sosoish
+Sospita
+soss
+sossle
+sostenuto
+sot
+Sotadean
+Sotadic
+Soter
+Soteres
+soterial
+soteriologic
+soteriological
+soteriology
+Sothiac
+Sothiacal
+Sothic
+Sothis
+Sotho
+sotie
+Sotik
+sotnia
+sotnik
+sotol
+sots
+sottage
+sotted
+sotter
+sottish
+sottishly
+sottishness
+sou
+souari
+soubise
+soubrette
+soubrettish
+soucar
+souchet
+Souchong
+souchong
+souchy
+soud
+soudagur
+souffle
+souffleed
+sough
+sougher
+soughing
+sought
+Souhegan
+soul
+soulack
+soulcake
+souled
+Souletin
+soulful
+soulfully
+soulfulness
+soulical
+soulish
+soulless
+soullessly
+soullessness
+soullike
+Soulmass
+soulsaving
+soulward
+souly
+soum
+soumansite
+soumarque
+sound
+soundable
+soundage
+soundboard
+sounder
+soundful
+soundheaded
+soundheadedness
+soundhearted
+soundheartednes
+sounding
+soundingly
+soundingness
+soundless
+soundlessly
+soundlessness
+soundly
+soundness
+soundproof
+soundproofing
+soup
+soupbone
+soupcon
+souper
+souple
+soupless
+souplike
+soupspoon
+soupy
+sour
+sourbelly
+sourberry
+sourbread
+sourbush
+sourcake
+source
+sourceful
+sourcefulness
+sourceless
+sourcrout
+sourdeline
+sourdine
+soured
+souredness
+souren
+sourer
+sourhearted
+souring
+sourish
+sourishly
+sourishness
+sourjack
+sourling
+sourly
+sourness
+sourock
+soursop
+sourtop
+sourweed
+sourwood
+soury
+sousaphone
+sousaphonist
+souse
+souser
+souslik
+soutane
+souter
+souterrain
+South
+south
+southard
+southbound
+Southcottian
+Southdown
+southeast
+southeaster
+southeasterly
+southeastern
+southeasternmost
+southeastward
+southeastwardly
+southeastwards
+souther
+southerland
+southerliness
+southerly
+southermost
+southern
+Southerner
+southerner
+southernism
+southernize
+southernliness
+southernly
+southernmost
+southernness
+southernwood
+southing
+southland
+southlander
+southmost
+southness
+southpaw
+Southron
+southron
+Southronie
+Southumbrian
+southward
+southwardly
+southwards
+southwest
+southwester
+southwesterly
+southwestern
+Southwesterner
+southwesternmost
+southwestward
+southwestwardly
+souvenir
+souverain
+souwester
+sov
+sovereign
+sovereigness
+sovereignly
+sovereignness
+sovereignship
+sovereignty
+soviet
+sovietdom
+sovietic
+sovietism
+sovietist
+sovietization
+sovietize
+sovite
+sovkhose
+sovkhoz
+sovran
+sovranty
+sow
+sowable
+sowan
+sowans
+sowar
+sowarry
+sowback
+sowbacked
+sowbane
+sowbelly
+sowbread
+sowdones
+sowel
+sowens
+sower
+sowfoot
+sowing
+sowins
+sowl
+sowle
+sowlike
+sowlth
+sown
+sowse
+sowt
+sowte
+Soxhlet
+soy
+soya
+soybean
+Soyot
+sozin
+sozolic
+sozzle
+sozzly
+spa
+Space
+space
+spaceband
+spaced
+spaceful
+spaceless
+spacer
+spacesaving
+spaceship
+spaciness
+spacing
+spaciosity
+spaciotemporal
+spacious
+spaciously
+spaciousness
+spack
+spacy
+spad
+spade
+spadebone
+spaded
+spadefish
+spadefoot
+spadeful
+spadelike
+spademan
+spader
+spadesman
+spadewise
+spadework
+spadger
+spadiceous
+spadices
+spadicifloral
+spadiciflorous
+spadiciform
+spadicose
+spadilla
+spadille
+spading
+spadix
+spadone
+spadonic
+spadonism
+spadrone
+spadroon
+spae
+spaebook
+spaecraft
+spaedom
+spaeman
+spaer
+spaewife
+spaewoman
+spaework
+spaewright
+spaghetti
+Spagnuoli
+spagyric
+spagyrical
+spagyrically
+spagyrist
+spahi
+spaid
+spaik
+spairge
+spak
+Spalacidae
+spalacine
+Spalax
+spald
+spalder
+spalding
+spale
+spall
+spallation
+spaller
+spalling
+spalpeen
+spalt
+span
+spancel
+spandle
+spandrel
+spandy
+spane
+spanemia
+spanemy
+spang
+spanghew
+spangle
+spangled
+spangler
+spanglet
+spangly
+spangolite
+Spaniard
+Spaniardization
+Spaniardize
+Spaniardo
+spaniel
+spaniellike
+spanielship
+spaning
+Spaniol
+Spaniolate
+Spanioli
+Spaniolize
+spanipelagic
+Spanish
+Spanishize
+Spanishly
+spank
+spanker
+spankily
+spanking
+spankingly
+spanky
+spanless
+spann
+spannel
+spanner
+spannerman
+spanopnoea
+spanpiece
+spantoon
+spanule
+spanworm
+Spar
+spar
+sparable
+sparada
+sparadrap
+sparagrass
+sparagus
+Sparassis
+sparassodont
+Sparassodonta
+Sparaxis
+sparaxis
+sparch
+spare
+spareable
+spareless
+sparely
+spareness
+sparer
+sparerib
+sparesome
+Sparganiaceae
+Sparganium
+sparganium
+sparganosis
+sparganum
+sparge
+sparger
+spargosis
+sparhawk
+sparid
+Sparidae
+sparing
+sparingly
+sparingness
+spark
+sparkback
+sparked
+sparker
+sparkiness
+sparking
+sparkish
+sparkishly
+sparkishness
+sparkle
+sparkleberry
+sparkler
+sparkless
+sparklessly
+sparklet
+sparklike
+sparkliness
+sparkling
+sparklingly
+sparklingness
+sparkly
+sparkproof
+sparks
+sparky
+sparlike
+sparling
+sparm
+Sparmannia
+Sparnacian
+sparoid
+sparpiece
+sparred
+sparrer
+sparring
+sparringly
+sparrow
+sparrowbill
+sparrowcide
+sparrowdom
+sparrowgrass
+sparrowish
+sparrowless
+sparrowlike
+sparrowtail
+sparrowtongue
+sparrowwort
+sparrowy
+sparry
+sparse
+sparsedly
+sparsely
+sparsile
+sparsioplast
+sparsity
+spart
+Spartacan
+Spartacide
+Spartacism
+Spartacist
+spartacist
+Spartan
+Spartanhood
+Spartanic
+Spartanically
+Spartanism
+Spartanize
+Spartanlike
+Spartanly
+sparteine
+sparterie
+sparth
+Spartiate
+Spartina
+Spartium
+spartle
+Sparus
+sparver
+spary
+spasm
+spasmatic
+spasmatical
+spasmatomancy
+spasmed
+spasmic
+spasmodic
+spasmodical
+spasmodically
+spasmodicalness
+spasmodism
+spasmodist
+spasmolytic
+spasmophilia
+spasmophilic
+spasmotin
+spasmotoxin
+spasmous
+Spass
+spastic
+spastically
+spasticity
+spat
+spatalamancy
+Spatangida
+Spatangina
+spatangoid
+Spatangoida
+Spatangoidea
+spatangoidean
+Spatangus
+spatchcock
+spate
+spatha
+spathaceous
+spathal
+spathe
+spathed
+spatheful
+spathic
+Spathiflorae
+spathilae
+spathilla
+spathose
+spathous
+spathulate
+Spathyema
+spatial
+spatiality
+spatialization
+spatialize
+spatially
+spatiate
+spatiation
+spatilomancy
+spatiotemporal
+spatling
+spatted
+spatter
+spatterdashed
+spatterdasher
+spatterdock
+spattering
+spatteringly
+spatterproof
+spatterwork
+spatting
+spattle
+spattlehoe
+Spatula
+spatula
+spatulamancy
+spatular
+spatulate
+spatulation
+spatule
+spatuliform
+spatulose
+spave
+spaver
+spavie
+spavied
+spaviet
+spavin
+spavindy
+spavined
+spawn
+spawneater
+spawner
+spawning
+spawny
+spay
+spayad
+spayard
+spaying
+speak
+speakable
+speakableness
+speakably
+speaker
+speakeress
+speakership
+speakhouse
+speakies
+speaking
+speakingly
+speakingness
+speakless
+speaklessly
+speal
+spealbone
+spean
+spear
+spearcast
+spearer
+spearfish
+spearflower
+spearhead
+spearing
+spearman
+spearmanship
+spearmint
+spearproof
+spearsman
+spearwood
+spearwort
+speary
+spec
+specchie
+spece
+special
+specialism
+specialist
+specialistic
+speciality
+specialization
+specialize
+specialized
+specializer
+specially
+specialness
+specialty
+speciation
+specie
+species
+speciestaler
+specifiable
+specific
+specifical
+specificality
+specifically
+specificalness
+specificate
+specification
+specificative
+specificatively
+specificity
+specificize
+specificly
+specificness
+specifier
+specifist
+specify
+specillum
+specimen
+specimenize
+speciology
+speciosity
+specious
+speciously
+speciousness
+speck
+specked
+speckedness
+speckfall
+speckiness
+specking
+speckle
+specklebelly
+specklebreast
+speckled
+speckledbill
+speckledness
+speckless
+specklessly
+specklessness
+speckling
+speckly
+speckproof
+specks
+specksioneer
+specky
+specs
+spectacle
+spectacled
+spectacleless
+spectaclelike
+spectaclemaker
+spectaclemaking
+spectacles
+spectacular
+spectacularism
+spectacularity
+spectacularly
+spectator
+spectatordom
+spectatorial
+spectatorship
+spectatory
+spectatress
+spectatrix
+specter
+spectered
+specterlike
+spectra
+spectral
+spectralism
+spectrality
+spectrally
+spectralness
+spectrobolograph
+spectrobolographic
+spectrobolometer
+spectrobolometric
+spectrochemical
+spectrochemistry
+spectrocolorimetry
+spectrocomparator
+spectroelectric
+spectrogram
+spectrograph
+spectrographic
+spectrographically
+spectrography
+spectroheliogram
+spectroheliograph
+spectroheliographic
+spectrohelioscope
+spectrological
+spectrologically
+spectrology
+spectrometer
+spectrometric
+spectrometry
+spectromicroscope
+spectromicroscopical
+spectrophobia
+spectrophone
+spectrophonic
+spectrophotoelectric
+spectrophotograph
+spectrophotography
+spectrophotometer
+spectrophotometric
+spectrophotometry
+spectropolarimeter
+spectropolariscope
+spectropyrheliometer
+spectropyrometer
+spectroradiometer
+spectroradiometric
+spectroradiometry
+spectroscope
+spectroscopic
+spectroscopically
+spectroscopist
+spectroscopy
+spectrotelescope
+spectrous
+spectrum
+spectry
+specula
+specular
+Specularia
+specularly
+speculate
+speculation
+speculatist
+speculative
+speculatively
+speculativeness
+speculativism
+speculator
+speculatory
+speculatrices
+speculatrix
+speculist
+speculum
+specus
+sped
+speech
+speechcraft
+speecher
+speechful
+speechfulness
+speechification
+speechifier
+speechify
+speeching
+speechless
+speechlessly
+speechlessness
+speechlore
+speechmaker
+speechmaking
+speechment
+speed
+speedaway
+speedboat
+speedboating
+speedboatman
+speeder
+speedful
+speedfully
+speedfulness
+speedily
+speediness
+speeding
+speedingly
+speedless
+speedometer
+speedster
+speedway
+speedwell
+speedy
+speel
+speelken
+speelless
+speen
+speer
+speering
+speerity
+speiskobalt
+speiss
+spekboom
+spelaean
+spelder
+spelding
+speldring
+speleological
+speleologist
+speleology
+spelk
+spell
+spellable
+spellbind
+spellbinder
+spellbinding
+spellbound
+spellcraft
+spelldown
+speller
+spellful
+spelling
+spellingdown
+spellingly
+spellmonger
+spellproof
+spellword
+spellwork
+spelt
+spelter
+spelterman
+speltoid
+speltz
+speluncar
+speluncean
+spelunk
+spelunker
+spence
+Spencean
+Spencer
+spencer
+Spencerian
+Spencerianism
+Spencerism
+spencerite
+spend
+spendable
+spender
+spendful
+spendible
+spending
+spendless
+spendthrift
+spendthrifty
+Spenerism
+spense
+Spenserian
+spent
+speos
+Speotyto
+sperable
+Speranza
+sperate
+Spergula
+Spergularia
+sperity
+sperket
+sperling
+sperm
+sperma
+spermaceti
+spermacetilike
+spermaduct
+spermalist
+Spermaphyta
+spermaphyte
+spermaphytic
+spermarium
+spermary
+spermashion
+spermatangium
+spermatheca
+spermathecal
+spermatic
+spermatically
+spermatid
+spermatiferous
+spermatin
+spermatiogenous
+spermation
+spermatiophore
+spermatism
+spermatist
+spermatitis
+spermatium
+spermatize
+spermatoblast
+spermatoblastic
+spermatocele
+spermatocyst
+spermatocystic
+spermatocystitis
+spermatocytal
+spermatocyte
+spermatogemma
+spermatogenesis
+spermatogenetic
+spermatogenic
+spermatogenous
+spermatogeny
+spermatogonial
+spermatogonium
+spermatoid
+spermatolysis
+spermatolytic
+spermatophoral
+spermatophore
+spermatophorous
+Spermatophyta
+spermatophyte
+spermatophytic
+spermatoplasm
+spermatoplasmic
+spermatoplast
+spermatorrhea
+spermatospore
+spermatotheca
+spermatova
+spermatovum
+spermatoxin
+spermatozoa
+spermatozoal
+spermatozoan
+spermatozoic
+spermatozoid
+spermatozoon
+spermaturia
+spermic
+spermidine
+spermiducal
+spermiduct
+spermigerous
+spermine
+spermiogenesis
+spermism
+spermist
+spermoblast
+spermoblastic
+spermocarp
+spermocenter
+spermoderm
+spermoduct
+spermogenesis
+spermogenous
+spermogone
+spermogoniferous
+spermogonium
+spermogonous
+spermologer
+spermological
+spermologist
+spermology
+spermolysis
+spermolytic
+spermophile
+spermophiline
+Spermophilus
+spermophore
+spermophorium
+Spermophyta
+spermophyte
+spermophytic
+spermosphere
+spermotheca
+spermotoxin
+spermous
+spermoviduct
+spermy
+speronara
+speronaro
+sperone
+sperrylite
+spessartite
+spet
+spetch
+spetrophoby
+speuchan
+spew
+spewer
+spewiness
+spewing
+spewy
+spex
+sphacel
+Sphacelaria
+Sphacelariaceae
+sphacelariaceous
+Sphacelariales
+sphacelate
+sphacelated
+sphacelation
+sphacelia
+sphacelial
+sphacelism
+sphaceloderma
+Sphaceloma
+sphacelotoxin
+sphacelous
+sphacelus
+Sphaeralcea
+sphaeraphides
+Sphaerella
+sphaerenchyma
+Sphaeriaceae
+sphaeriaceous
+Sphaeriales
+sphaeridia
+sphaeridial
+sphaeridium
+Sphaeriidae
+Sphaerioidaceae
+sphaeristerium
+sphaerite
+Sphaerium
+sphaeroblast
+Sphaerobolaceae
+Sphaerobolus
+Sphaerocarpaceae
+Sphaerocarpales
+Sphaerocarpus
+sphaerocobaltite
+Sphaerococcaceae
+sphaerococcaceous
+Sphaerococcus
+sphaerolite
+sphaerolitic
+Sphaeroma
+Sphaeromidae
+Sphaerophoraceae
+Sphaerophorus
+Sphaeropsidaceae
+Sphaeropsidales
+Sphaeropsis
+sphaerosiderite
+sphaerosome
+sphaerospore
+Sphaerostilbe
+Sphaerotheca
+Sphaerotilus
+sphagion
+Sphagnaceae
+sphagnaceous
+Sphagnales
+sphagnicolous
+sphagnologist
+sphagnology
+sphagnous
+Sphagnum
+sphagnum
+Sphakiot
+sphalerite
+Sphargis
+sphecid
+Sphecidae
+Sphecina
+Sphecoidea
+spheges
+sphegid
+Sphegidae
+Sphegoidea
+sphendone
+sphene
+sphenethmoid
+sphenethmoidal
+sphenic
+sphenion
+Sphenisci
+Spheniscidae
+Sphenisciformes
+spheniscine
+spheniscomorph
+Spheniscomorphae
+spheniscomorphic
+Spheniscus
+sphenobasilar
+sphenobasilic
+sphenocephalia
+sphenocephalic
+sphenocephalous
+sphenocephaly
+Sphenodon
+sphenodon
+sphenodont
+Sphenodontia
+Sphenodontidae
+sphenoethmoid
+sphenoethmoidal
+sphenofrontal
+sphenogram
+sphenographic
+sphenographist
+sphenography
+sphenoid
+sphenoidal
+sphenoiditis
+sphenolith
+sphenomalar
+sphenomandibular
+sphenomaxillary
+sphenopalatine
+sphenoparietal
+sphenopetrosal
+Sphenophorus
+Sphenophyllaceae
+sphenophyllaceous
+Sphenophyllales
+Sphenophyllum
+Sphenopteris
+sphenosquamosal
+sphenotemporal
+sphenotic
+sphenotribe
+sphenotripsy
+sphenoturbinal
+sphenovomerine
+sphenozygomatic
+spherable
+spheral
+spherality
+spheraster
+spheration
+sphere
+sphereless
+spheric
+spherical
+sphericality
+spherically
+sphericalness
+sphericist
+sphericity
+sphericle
+sphericocylindrical
+sphericotetrahedral
+sphericotriangular
+spherics
+spheriform
+spherify
+spheroconic
+spherocrystal
+spherograph
+spheroidal
+spheroidally
+spheroidic
+spheroidical
+spheroidically
+spheroidicity
+spheroidism
+spheroidity
+spheroidize
+spheromere
+spherometer
+spheroquartic
+spherula
+spherular
+spherulate
+spherule
+spherulite
+spherulitic
+spherulitize
+sphery
+spheterize
+Sphex
+sphexide
+sphincter
+sphincteral
+sphincteralgia
+sphincterate
+sphincterectomy
+sphincterial
+sphincteric
+sphincterismus
+sphincteroscope
+sphincteroscopy
+sphincterotomy
+sphindid
+Sphindidae
+Sphindus
+sphingal
+sphinges
+sphingid
+Sphingidae
+sphingiform
+sphingine
+sphingoid
+sphingometer
+sphingomyelin
+sphingosine
+Sphingurinae
+Sphingurus
+sphinx
+sphinxian
+sphinxianness
+sphinxlike
+Sphoeroides
+sphragide
+sphragistic
+sphragistics
+sphygmia
+sphygmic
+sphygmochronograph
+sphygmodic
+sphygmogram
+sphygmograph
+sphygmographic
+sphygmography
+sphygmoid
+sphygmology
+sphygmomanometer
+sphygmomanometric
+sphygmomanometry
+sphygmometer
+sphygmometric
+sphygmophone
+sphygmophonic
+sphygmoscope
+sphygmus
+Sphyraena
+sphyraenid
+Sphyraenidae
+sphyraenoid
+Sphyrapicus
+Sphyrna
+Sphyrnidae
+Spica
+spica
+spical
+spicant
+Spicaria
+spicate
+spicated
+spiccato
+spice
+spiceable
+spiceberry
+spicebush
+spicecake
+spiced
+spiceful
+spicehouse
+spiceland
+spiceless
+spicelike
+spicer
+spicery
+spicewood
+spiciferous
+spiciform
+spicigerous
+spicilege
+spicily
+spiciness
+spicing
+spick
+spicket
+spickle
+spicknel
+spicose
+spicosity
+spicous
+spicousness
+spicula
+spiculae
+spicular
+spiculate
+spiculated
+spiculation
+spicule
+spiculiferous
+spiculiform
+spiculigenous
+spiculigerous
+spiculofiber
+spiculose
+spiculous
+spiculum
+spiculumamoris
+spicy
+spider
+spidered
+spiderflower
+spiderish
+spiderless
+spiderlike
+spiderling
+spiderly
+spiderweb
+spiderwork
+spiderwort
+spidery
+spidger
+spied
+spiegel
+spiegeleisen
+spiel
+spieler
+spier
+spiff
+spiffed
+spiffily
+spiffiness
+spiffing
+spiffy
+spiflicate
+spiflicated
+spiflication
+spig
+Spigelia
+Spigeliaceae
+Spigelian
+spiggoty
+spignet
+spigot
+Spike
+spike
+spikebill
+spiked
+spikedness
+spikefish
+spikehorn
+spikelet
+spikelike
+spikenard
+spiker
+spiketail
+spiketop
+spikeweed
+spikewise
+spikily
+spikiness
+spiking
+spiky
+Spilanthes
+spile
+spilehole
+spiler
+spileworm
+spilikin
+spiling
+spilite
+spilitic
+spill
+spillage
+spiller
+spillet
+spillproof
+spillway
+spilly
+Spilogale
+spiloma
+spilosite
+spilt
+spilth
+spilus
+spin
+spina
+spinacene
+spinaceous
+spinach
+spinachlike
+Spinacia
+spinae
+spinage
+spinal
+spinales
+spinalis
+spinally
+spinate
+spinder
+spindlage
+spindle
+spindleage
+spindled
+spindleful
+spindlehead
+spindlelegs
+spindlelike
+spindler
+spindleshanks
+spindletail
+spindlewise
+spindlewood
+spindleworm
+spindliness
+spindling
+spindly
+spindrift
+spine
+spinebill
+spinebone
+spined
+spinel
+spineless
+spinelessly
+spinelessness
+spinelet
+spinelike
+spinescence
+spinescent
+spinet
+spinetail
+spingel
+spinibulbar
+spinicarpous
+spinicerebellar
+spinidentate
+spiniferous
+Spinifex
+spinifex
+spiniform
+spinifugal
+spinigerous
+spinigrade
+spininess
+spinipetal
+spinitis
+spinituberculate
+spink
+spinnable
+spinnaker
+spinner
+spinneret
+spinnerular
+spinnerule
+spinnery
+spinney
+spinning
+spinningly
+spinobulbar
+spinocarpous
+spinocerebellar
+spinogalvanization
+spinoglenoid
+spinoid
+spinomuscular
+spinoneural
+spinoperipheral
+spinose
+spinosely
+spinoseness
+spinosity
+spinosodentate
+spinosodenticulate
+spinosotubercular
+spinosotuberculate
+spinosympathetic
+spinotectal
+spinothalamic
+spinotuberculous
+spinous
+spinousness
+Spinozism
+Spinozist
+Spinozistic
+spinster
+spinsterdom
+spinsterhood
+spinsterial
+spinsterish
+spinsterishly
+spinsterism
+spinsterlike
+spinsterly
+spinsterous
+spinstership
+spinstress
+spintext
+spinthariscope
+spinthariscopic
+spintherism
+spinulate
+spinulation
+spinule
+spinulescent
+spinuliferous
+spinuliform
+Spinulosa
+spinulose
+spinulosely
+spinulosociliate
+spinulosodentate
+spinulosodenticulate
+spinulosogranulate
+spinulososerrate
+spinulous
+spiny
+spionid
+Spionidae
+Spioniformia
+spiracle
+spiracula
+spiracular
+spiraculate
+spiraculiferous
+spiraculiform
+spiraculum
+Spiraea
+Spiraeaceae
+spiral
+spirale
+spiraled
+spiraliform
+spiralism
+spirality
+spiralization
+spiralize
+spirally
+spiraloid
+spiraltail
+spiralwise
+spiran
+spirant
+Spiranthes
+spiranthic
+spiranthy
+spirantic
+spirantize
+spiraster
+spirate
+spirated
+spiration
+spire
+spirea
+spired
+spiregrass
+spireless
+spirelet
+spireme
+spirepole
+spireward
+spirewise
+spiricle
+Spirifer
+Spirifera
+Spiriferacea
+spiriferid
+Spiriferidae
+spiriferoid
+spiriferous
+spiriform
+spirignath
+spirignathous
+spirilla
+Spirillaceae
+spirillaceous
+spirillar
+spirillolysis
+spirillosis
+spirillotropic
+spirillotropism
+spirillum
+spiring
+spirit
+spiritally
+spiritdom
+spirited
+spiritedly
+spiritedness
+spiriter
+spiritful
+spiritfully
+spiritfulness
+spirithood
+spiriting
+spiritism
+spiritist
+spiritistic
+spiritize
+spiritland
+spiritleaf
+spiritless
+spiritlessly
+spiritlessness
+spiritlike
+spiritmonger
+spiritous
+spiritrompe
+spiritsome
+spiritual
+spiritualism
+spiritualist
+spiritualistic
+spiritualistically
+spirituality
+spiritualization
+spiritualize
+spiritualizer
+spiritually
+spiritualness
+spiritualship
+spiritualty
+spirituosity
+spirituous
+spirituously
+spirituousness
+spiritus
+spiritweed
+spirity
+spirivalve
+spirket
+spirketing
+spirling
+spiro
+Spirobranchia
+Spirobranchiata
+spirobranchiate
+Spirochaeta
+Spirochaetaceae
+spirochaetal
+Spirochaetales
+Spirochaete
+spirochetal
+spirochete
+spirochetemia
+spirochetic
+spirocheticidal
+spirocheticide
+spirochetosis
+spirochetotic
+Spirodela
+spirogram
+spirograph
+spirographidin
+spirographin
+Spirographis
+Spirogyra
+spiroid
+spiroloculine
+spirometer
+spirometric
+spirometrical
+spirometry
+Spironema
+spiropentane
+Spirophyton
+Spirorbis
+spiroscope
+Spirosoma
+spirous
+spirt
+Spirula
+spirulate
+spiry
+spise
+spissated
+spissitude
+Spisula
+spit
+spital
+spitball
+spitballer
+spitbox
+spitchcock
+spite
+spiteful
+spitefully
+spitefulness
+spiteless
+spiteproof
+spitfire
+spitful
+spithamai
+spithame
+spitish
+spitpoison
+spitscocked
+spitstick
+spitted
+spitten
+spitter
+spitting
+spittle
+spittlefork
+spittlestaff
+spittoon
+spitz
+Spitzenburg
+spitzkop
+spiv
+spivery
+Spizella
+spizzerinctum
+Splachnaceae
+splachnaceous
+splachnoid
+Splachnum
+splacknuck
+splairge
+splanchnapophysial
+splanchnapophysis
+splanchnectopia
+splanchnemphraxis
+splanchnesthesia
+splanchnesthetic
+splanchnic
+splanchnoblast
+splanchnocoele
+splanchnoderm
+splanchnodiastasis
+splanchnodynia
+splanchnographer
+splanchnographical
+splanchnography
+splanchnolith
+splanchnological
+splanchnologist
+splanchnology
+splanchnomegalia
+splanchnomegaly
+splanchnopathy
+splanchnopleural
+splanchnopleure
+splanchnopleuric
+splanchnoptosia
+splanchnoptosis
+splanchnosclerosis
+splanchnoscopy
+splanchnoskeletal
+splanchnoskeleton
+splanchnosomatic
+splanchnotomical
+splanchnotomy
+splanchnotribe
+splash
+splashboard
+splashed
+splasher
+splashiness
+splashing
+splashingly
+splashproof
+splashy
+splat
+splatch
+splatcher
+splatchy
+splathering
+splatter
+splatterdash
+splatterdock
+splatterer
+splatterfaced
+splatterwork
+splay
+splayed
+splayer
+splayfoot
+splayfooted
+splaymouth
+splaymouthed
+spleen
+spleenful
+spleenfully
+spleenish
+spleenishly
+spleenishness
+spleenless
+spleenwort
+spleeny
+spleet
+spleetnew
+splenadenoma
+splenalgia
+splenalgic
+splenalgy
+splenatrophia
+splenatrophy
+splenauxe
+splenculus
+splendacious
+splendaciously
+splendaciousness
+splendent
+splendently
+splender
+splendescent
+splendid
+splendidly
+splendidness
+splendiferous
+splendiferously
+splendiferousness
+splendor
+splendorous
+splendorproof
+splendourproof
+splenectama
+splenectasis
+splenectomist
+splenectomize
+splenectomy
+splenectopia
+splenectopy
+splenelcosis
+splenemia
+splenemphraxis
+spleneolus
+splenepatitis
+splenetic
+splenetical
+splenetically
+splenetive
+splenial
+splenic
+splenical
+splenicterus
+splenification
+spleniform
+splenitis
+splenitive
+splenium
+splenius
+splenization
+splenoblast
+splenocele
+splenoceratosis
+splenocleisis
+splenocolic
+splenocyte
+splenodiagnosis
+splenodynia
+splenography
+splenohemia
+splenoid
+splenolaparotomy
+splenology
+splenolymph
+splenolymphatic
+splenolysin
+splenolysis
+splenoma
+splenomalacia
+splenomedullary
+splenomegalia
+splenomegalic
+splenomegaly
+splenomyelogenous
+splenoncus
+splenonephric
+splenopancreatic
+splenoparectama
+splenoparectasis
+splenopathy
+splenopexia
+splenopexis
+splenopexy
+splenophrenic
+splenopneumonia
+splenoptosia
+splenoptosis
+splenorrhagia
+splenorrhaphy
+splenotomy
+splenotoxin
+splenotyphoid
+splenulus
+splenunculus
+splet
+spleuchan
+splice
+spliceable
+splicer
+splicing
+splinder
+spline
+splineway
+splint
+splintage
+splinter
+splinterd
+splinterless
+splinternew
+splinterproof
+splintery
+splintwood
+splinty
+split
+splitbeak
+splitfinger
+splitfruit
+splitmouth
+splitnew
+splitsaw
+splittail
+splitten
+splitter
+splitting
+splitworm
+splodge
+splodgy
+splore
+splosh
+splotch
+splotchily
+splotchiness
+splotchy
+splother
+splunge
+splurge
+splurgily
+splurgy
+splurt
+spluther
+splutter
+splutterer
+spoach
+Spock
+spode
+spodiosite
+spodium
+spodogenic
+spodogenous
+spodomancy
+spodomantic
+spodumene
+spoffish
+spoffle
+spoffy
+spogel
+spoil
+spoilable
+spoilage
+spoilation
+spoiled
+spoiler
+spoilfive
+spoilful
+spoiling
+spoilless
+spoilment
+spoilsman
+spoilsmonger
+spoilsport
+spoilt
+Spokan
+spoke
+spokeless
+spoken
+spokeshave
+spokesman
+spokesmanship
+spokester
+spokeswoman
+spokeswomanship
+spokewise
+spoky
+spole
+spolia
+spoliarium
+spoliary
+spoliate
+spoliation
+spoliator
+spoliatory
+spolium
+spondaic
+spondaical
+spondaize
+spondean
+spondee
+spondiac
+Spondiaceae
+Spondias
+spondulics
+spondyl
+spondylalgia
+spondylarthritis
+spondylarthrocace
+spondylexarthrosis
+spondylic
+spondylid
+Spondylidae
+spondylioid
+spondylitic
+spondylitis
+spondylium
+spondylizema
+spondylocace
+Spondylocladium
+spondylodiagnosis
+spondylodidymia
+spondylodymus
+spondyloid
+spondylolisthesis
+spondylolisthetic
+spondylopathy
+spondylopyosis
+spondyloschisis
+spondylosis
+spondylosyndesis
+spondylotherapeutics
+spondylotherapist
+spondylotherapy
+spondylotomy
+spondylous
+Spondylus
+spondylus
+spong
+sponge
+spongecake
+sponged
+spongeful
+spongeless
+spongelet
+spongelike
+spongeous
+spongeproof
+sponger
+spongewood
+Spongiae
+spongian
+spongicolous
+spongiculture
+Spongida
+spongiferous
+spongiform
+Spongiidae
+Spongilla
+spongillid
+Spongillidae
+spongilline
+spongily
+spongin
+sponginblast
+sponginblastic
+sponginess
+sponging
+spongingly
+spongioblast
+spongioblastoma
+spongiocyte
+spongiolin
+spongiopilin
+spongioplasm
+spongioplasmic
+spongiose
+spongiosity
+spongiousness
+Spongiozoa
+spongiozoon
+spongoblast
+spongoblastic
+spongoid
+spongology
+spongophore
+Spongospora
+spongy
+sponsal
+sponsalia
+sponsibility
+sponsible
+sponsing
+sponsion
+sponsional
+sponson
+sponsor
+sponsorial
+sponsorship
+sponspeck
+spontaneity
+spontaneous
+spontaneously
+spontaneousness
+spontoon
+spoof
+spoofer
+spoofery
+spoofish
+spook
+spookdom
+spookery
+spookily
+spookiness
+spookish
+spookism
+spookist
+spookological
+spookologist
+spookology
+spooky
+spool
+spooler
+spoolful
+spoollike
+spoolwood
+spoom
+spoon
+spoonbill
+spoondrift
+spooner
+spoonerism
+spooneyism
+spooneyly
+spooneyness
+spoonflower
+spoonful
+spoonhutch
+spoonily
+spooniness
+spooning
+spoonism
+spoonless
+spoonlike
+spoonmaker
+spoonmaking
+spoonways
+spoonwood
+spoony
+spoonyism
+spoor
+spoorer
+spoot
+spor
+sporabola
+sporaceous
+sporades
+sporadial
+sporadic
+sporadical
+sporadically
+sporadicalness
+sporadicity
+sporadism
+sporadosiderite
+sporal
+sporange
+sporangia
+sporangial
+sporangidium
+sporangiferous
+sporangiform
+sporangioid
+sporangiola
+sporangiole
+sporangiolum
+sporangiophore
+sporangiospore
+sporangite
+Sporangites
+sporangium
+sporation
+spore
+spored
+sporeformer
+sporeforming
+sporeling
+sporicide
+sporid
+sporidesm
+sporidia
+sporidial
+sporidiferous
+sporidiole
+sporidiolum
+sporidium
+sporiferous
+sporification
+sporiparity
+sporiparous
+sporoblast
+Sporobolus
+sporocarp
+sporocarpium
+Sporochnaceae
+Sporochnus
+sporocyst
+sporocystic
+sporocystid
+sporocyte
+sporodochia
+sporodochium
+sporoduct
+sporogenesis
+sporogenic
+sporogenous
+sporogeny
+sporogone
+sporogonial
+sporogonic
+sporogonium
+sporogony
+sporoid
+sporologist
+sporomycosis
+sporont
+sporophore
+sporophoric
+sporophorous
+sporophydium
+sporophyll
+sporophyllary
+sporophyllum
+sporophyte
+sporophytic
+sporoplasm
+sporosac
+sporostegium
+sporostrote
+sporotrichosis
+sporotrichotic
+Sporotrichum
+sporous
+Sporozoa
+sporozoal
+sporozoan
+sporozoic
+sporozoite
+sporozoon
+sporran
+sport
+sportability
+sportable
+sportance
+sporter
+sportful
+sportfully
+sportfulness
+sportily
+sportiness
+sporting
+sportingly
+sportive
+sportively
+sportiveness
+sportless
+sportling
+sportly
+sports
+sportsman
+sportsmanlike
+sportsmanliness
+sportsmanly
+sportsmanship
+sportsome
+sportswear
+sportswoman
+sportswomanly
+sportswomanship
+sportula
+sportulae
+sporty
+sporular
+sporulate
+sporulation
+sporule
+sporuliferous
+sporuloid
+sposh
+sposhy
+spot
+spotless
+spotlessly
+spotlessness
+spotlight
+spotlighter
+spotlike
+spotrump
+spotsman
+spottable
+spotted
+spottedly
+spottedness
+spotteldy
+spotter
+spottily
+spottiness
+spotting
+spottle
+spotty
+spoucher
+spousage
+spousal
+spousally
+spouse
+spousehood
+spouseless
+spousy
+spout
+spouter
+spoutiness
+spouting
+spoutless
+spoutlike
+spoutman
+spouty
+sprachle
+sprack
+sprackish
+sprackle
+sprackly
+sprackness
+sprad
+spraddle
+sprag
+spragger
+spraggly
+spraich
+sprain
+spraint
+spraints
+sprang
+sprangle
+sprangly
+sprank
+sprat
+spratter
+spratty
+sprauchle
+sprawl
+sprawler
+sprawling
+sprawlingly
+sprawly
+spray
+sprayboard
+sprayer
+sprayey
+sprayful
+sprayfully
+sprayless
+spraylike
+sprayproof
+spread
+spreadation
+spreadboard
+spreaded
+spreader
+spreadhead
+spreading
+spreadingly
+spreadingness
+spreadover
+spready
+spreaghery
+spreath
+spreckle
+spree
+spreeuw
+Sprekelia
+spreng
+sprent
+spret
+sprew
+sprewl
+spridhogue
+spried
+sprier
+spriest
+sprig
+sprigged
+sprigger
+spriggy
+sprightful
+sprightfully
+sprightfulness
+sprightlily
+sprightliness
+sprightly
+sprighty
+spriglet
+sprigtail
+Spring
+spring
+springal
+springald
+springboard
+springbok
+springbuck
+springe
+springer
+springerle
+springfinger
+springfish
+springful
+springhaas
+springhalt
+springhead
+springhouse
+springily
+springiness
+springing
+springingly
+springle
+springless
+springlet
+springlike
+springly
+springmaker
+springmaking
+springtail
+springtide
+springtime
+springtrap
+springwood
+springworm
+springwort
+springwurzel
+springy
+sprink
+sprinkle
+sprinkled
+sprinkleproof
+sprinkler
+sprinklered
+sprinkling
+sprint
+sprinter
+sprit
+sprite
+spritehood
+spritsail
+sprittail
+sprittie
+spritty
+sproat
+sprocket
+sprod
+sprogue
+sproil
+sprong
+sprose
+sprottle
+sprout
+sproutage
+sprouter
+sproutful
+sprouting
+sproutland
+sproutling
+sprowsy
+spruce
+sprucely
+spruceness
+sprucery
+sprucification
+sprucify
+sprue
+spruer
+sprug
+spruiker
+spruit
+sprung
+sprunny
+sprunt
+spruntly
+spry
+spryly
+spryness
+spud
+Spudboy
+spudder
+spuddle
+spuddy
+spuffle
+spug
+spuilyie
+spuilzie
+spuke
+spume
+spumescence
+spumescent
+spumiferous
+spumification
+spumiform
+spumone
+spumose
+spumous
+spumy
+spun
+spung
+spunk
+spunkie
+spunkily
+spunkiness
+spunkless
+spunky
+spunny
+spur
+spurflower
+spurgall
+spurge
+spurgewort
+spuriae
+spuriosity
+spurious
+spuriously
+spuriousness
+Spurius
+spurl
+spurless
+spurlet
+spurlike
+spurling
+spurmaker
+spurmoney
+spurn
+spurner
+spurnpoint
+spurnwater
+spurproof
+spurred
+spurrer
+spurrial
+spurrier
+spurrings
+spurrite
+spurry
+spurt
+spurter
+spurtive
+spurtively
+spurtle
+spurway
+spurwing
+spurwinged
+spurwort
+sput
+sputa
+sputative
+sputter
+sputterer
+sputtering
+sputteringly
+sputtery
+sputum
+sputumary
+sputumose
+sputumous
+Spy
+spy
+spyboat
+spydom
+spyer
+spyfault
+spyglass
+spyhole
+spyism
+spyproof
+Spyros
+spyship
+spytower
+squab
+squabash
+squabasher
+squabbed
+squabbish
+squabble
+squabbler
+squabbling
+squabblingly
+squabbly
+squabby
+squacco
+squad
+squaddy
+squadrate
+squadrism
+squadron
+squadrone
+squadroned
+squail
+squailer
+squalene
+Squali
+squalid
+Squalida
+Squalidae
+squalidity
+squalidly
+squalidness
+squaliform
+squall
+squaller
+squallery
+squallish
+squally
+squalm
+Squalodon
+squalodont
+Squalodontidae
+squaloid
+Squaloidei
+squalor
+Squalus
+squam
+squama
+squamaceous
+squamae
+Squamariaceae
+Squamata
+squamate
+squamated
+squamatine
+squamation
+squamatogranulous
+squamatotuberculate
+squame
+squamella
+squamellate
+squamelliferous
+squamelliform
+squameous
+squamiferous
+squamiform
+squamify
+squamigerous
+squamipennate
+Squamipennes
+squamipinnate
+Squamipinnes
+squamocellular
+squamoepithelial
+squamoid
+squamomastoid
+squamoparietal
+squamopetrosal
+squamosa
+squamosal
+squamose
+squamosely
+squamoseness
+squamosis
+squamosity
+squamosodentated
+squamosoimbricated
+squamosomaxillary
+squamosoparietal
+squamosoradiate
+squamosotemporal
+squamosozygomatic
+squamosphenoid
+squamosphenoidal
+squamotemporal
+squamous
+squamously
+squamousness
+squamozygomatic
+Squamscot
+squamula
+squamulae
+squamulate
+squamulation
+squamule
+squamuliform
+squamulose
+squander
+squanderer
+squanderingly
+squandermania
+squandermaniac
+squantum
+squarable
+square
+squareage
+squarecap
+squared
+squaredly
+squareface
+squareflipper
+squarehead
+squarelike
+squarely
+squareman
+squaremouth
+squareness
+squarer
+squaretail
+squarewise
+squaring
+squarish
+squarishly
+squark
+squarrose
+squarrosely
+squarrous
+squarrulose
+squarson
+squarsonry
+squary
+squash
+squashberry
+squasher
+squashily
+squashiness
+squashy
+squat
+Squatarola
+squatarole
+Squatina
+squatina
+squatinid
+Squatinidae
+squatinoid
+Squatinoidei
+squatly
+squatment
+squatmore
+squatness
+squattage
+squatted
+squatter
+squatterarchy
+squatterdom
+squatterproof
+squattily
+squattiness
+squatting
+squattingly
+squattish
+squattocracy
+squattocratic
+squatty
+squatwise
+squaw
+squawberry
+squawbush
+squawdom
+squawfish
+squawflower
+squawk
+squawker
+squawkie
+squawking
+squawkingly
+squawky
+Squawmish
+squawroot
+Squawtits
+squawweed
+Squaxon
+squdge
+squdgy
+squeak
+squeaker
+squeakery
+squeakily
+squeakiness
+squeaking
+squeakingly
+squeaklet
+squeakproof
+squeaky
+squeakyish
+squeal
+squeald
+squealer
+squealing
+squeam
+squeamish
+squeamishly
+squeamishness
+squeamous
+squeamy
+Squedunk
+squeege
+squeegee
+squeezability
+squeezable
+squeezableness
+squeezably
+squeeze
+squeezeman
+squeezer
+squeezing
+squeezingly
+squeezy
+squelch
+squelcher
+squelchily
+squelchiness
+squelching
+squelchingly
+squelchingness
+squelchy
+squench
+squencher
+squeteague
+squib
+squibber
+squibbery
+squibbish
+squiblet
+squibling
+squid
+squiddle
+squidge
+squidgereen
+squidgy
+squiffed
+squiffer
+squiffy
+squiggle
+squiggly
+squilgee
+squilgeer
+Squill
+Squilla
+squilla
+squillagee
+squillery
+squillian
+squillid
+Squillidae
+squilloid
+Squilloidea
+squimmidge
+squin
+squinance
+squinancy
+squinch
+squinny
+squinsy
+squint
+squinted
+squinter
+squinting
+squintingly
+squintingness
+squintly
+squintness
+squinty
+squirage
+squiralty
+squire
+squirearch
+squirearchal
+squirearchical
+squirearchy
+squiredom
+squireen
+squirehood
+squireless
+squirelet
+squirelike
+squireling
+squirely
+squireocracy
+squireship
+squiress
+squiret
+squirewise
+squirish
+squirism
+squirk
+squirm
+squirminess
+squirming
+squirmingly
+squirmy
+squirr
+squirrel
+squirrelfish
+squirrelian
+squirreline
+squirrelish
+squirrellike
+squirrelproof
+squirreltail
+squirt
+squirter
+squirtiness
+squirting
+squirtingly
+squirtish
+squirty
+squish
+squishy
+squit
+squitch
+squitchy
+squitter
+squoze
+squush
+squushy
+sraddha
+sramana
+Sri
+sri
+Sridhar
+Sridharan
+Srikanth
+Srinivas
+Srinivasan
+Sriram
+Srivatsan
+sruti
+Ssi
+ssu
+st
+staab
+Staatsrat
+stab
+stabber
+stabbing
+stabbingly
+stabile
+stabilify
+stabilist
+stabilitate
+stability
+stabilization
+stabilizator
+stabilize
+stabilizer
+stable
+stableboy
+stableful
+stablekeeper
+stablelike
+stableman
+stableness
+stabler
+stablestand
+stableward
+stablewards
+stabling
+stablishment
+stably
+staboy
+stabproof
+stabulate
+stabulation
+stabwort
+staccato
+Stacey
+stacher
+stachydrin
+stachydrine
+stachyose
+Stachys
+stachys
+Stachytarpheta
+Stachyuraceae
+stachyuraceous
+Stachyurus
+stack
+stackage
+stackencloud
+stacker
+stackfreed
+stackful
+stackgarth
+Stackhousia
+Stackhousiaceae
+stackhousiaceous
+stackless
+stackman
+stackstand
+stackyard
+stacte
+stactometer
+Stacy
+stadda
+staddle
+staddling
+stade
+stadholder
+stadholderate
+stadholdership
+stadhouse
+stadia
+stadic
+stadimeter
+stadiometer
+stadion
+stadium
+stafette
+staff
+staffed
+staffelite
+staffer
+staffless
+staffman
+stag
+stagbush
+stage
+stageability
+stageable
+stageableness
+stageably
+stagecoach
+stagecoaching
+stagecraft
+staged
+stagedom
+stagehand
+stagehouse
+stageland
+stagelike
+stageman
+stager
+stagery
+stagese
+stagewise
+stageworthy
+stagewright
+staggard
+staggart
+staggarth
+Stagger
+stagger
+staggerbush
+staggerer
+staggering
+staggeringly
+staggers
+staggerweed
+staggerwort
+staggery
+staggie
+staggy
+staghead
+staghorn
+staghound
+staghunt
+staghunter
+staghunting
+stagiary
+stagily
+staginess
+staging
+Stagirite
+Stagiritic
+staglike
+stagmometer
+stagnance
+stagnancy
+stagnant
+stagnantly
+stagnantness
+stagnate
+stagnation
+stagnatory
+stagnature
+stagnicolous
+stagnize
+stagnum
+Stagonospora
+stagskin
+stagworm
+stagy
+Stahlhelm
+Stahlhelmer
+Stahlhelmist
+Stahlian
+Stahlianism
+Stahlism
+staia
+staid
+staidly
+staidness
+stain
+stainability
+stainable
+stainableness
+stainably
+stainer
+stainful
+stainierite
+staining
+stainless
+stainlessly
+stainlessness
+stainproof
+staio
+stair
+stairbeak
+stairbuilder
+stairbuilding
+staircase
+staired
+stairhead
+stairless
+stairlike
+stairstep
+stairway
+stairwise
+stairwork
+stairy
+staith
+staithman
+staiver
+stake
+stakehead
+stakeholder
+stakemaster
+staker
+stakerope
+Stakhanovism
+Stakhanovite
+stalactic
+stalactical
+stalactiform
+stalactital
+stalactite
+stalactited
+stalactitic
+stalactitical
+stalactitically
+stalactitiform
+stalactitious
+stalagma
+stalagmite
+stalagmitic
+stalagmitical
+stalagmitically
+stalagmometer
+stalagmometric
+stalagmometry
+stale
+stalely
+stalemate
+staleness
+staling
+Stalinism
+Stalinist
+Stalinite
+stalk
+stalkable
+stalked
+stalker
+stalkily
+stalkiness
+stalking
+stalkingly
+stalkless
+stalklet
+stalklike
+stalko
+stalky
+stall
+stallage
+stallar
+stallboard
+stallenger
+staller
+stallership
+stalling
+stallion
+stallionize
+stallman
+stallment
+stalwart
+stalwartism
+stalwartize
+stalwartly
+stalwartness
+stam
+stambha
+stambouline
+stamen
+stamened
+stamin
+stamina
+staminal
+staminate
+stamineal
+stamineous
+staminiferous
+staminigerous
+staminode
+staminodium
+staminody
+stammel
+stammer
+stammerer
+stammering
+stammeringly
+stammeringness
+stammerwort
+stamnos
+stamp
+stampable
+stampage
+stampedable
+stampede
+stampeder
+stampedingly
+stampee
+stamper
+stampery
+stamphead
+Stampian
+stamping
+stample
+stampless
+stampman
+stampsman
+stampweed
+Stan
+stance
+stanch
+stanchable
+stanchel
+stancheled
+stancher
+stanchion
+stanchless
+stanchly
+stanchness
+stand
+standage
+standard
+standardbred
+standardizable
+standardization
+standardize
+standardized
+standardizer
+standardwise
+standee
+standel
+standelwelks
+standelwort
+stander
+standergrass
+standerwort
+standfast
+standing
+standish
+standoff
+standoffish
+standoffishness
+standout
+standpat
+standpatism
+standpatter
+standpipe
+standpoint
+standpost
+standstill
+stane
+stanechat
+stang
+Stangeria
+stanhope
+Stanhopea
+stanine
+Stanislaw
+stanjen
+stank
+stankie
+Stanley
+Stanly
+stannane
+stannary
+stannate
+stannator
+stannel
+stanner
+stannery
+stannic
+stannide
+stanniferous
+stannite
+stanno
+stannotype
+stannous
+stannoxyl
+stannum
+stannyl
+stanza
+stanzaed
+stanzaic
+stanzaical
+stanzaically
+stanze
+stap
+stapedectomy
+stapedial
+stapediform
+stapediovestibular
+stapedius
+Stapelia
+stapelia
+stapes
+staphisagria
+staphyle
+Staphylea
+Staphyleaceae
+staphyleaceous
+staphylectomy
+staphyledema
+staphylematoma
+staphylic
+staphyline
+staphylinic
+staphylinid
+Staphylinidae
+staphylinideous
+Staphylinoidea
+Staphylinus
+staphylion
+staphylitis
+staphyloangina
+staphylococcal
+staphylococci
+staphylococcic
+Staphylococcus
+staphylococcus
+staphylodermatitis
+staphylodialysis
+staphyloedema
+staphylohemia
+staphylolysin
+staphyloma
+staphylomatic
+staphylomatous
+staphylomycosis
+staphyloncus
+staphyloplastic
+staphyloplasty
+staphyloptosia
+staphyloptosis
+staphyloraphic
+staphylorrhaphic
+staphylorrhaphy
+staphyloschisis
+staphylosis
+staphylotome
+staphylotomy
+staphylotoxin
+staple
+stapled
+stapler
+staplewise
+stapling
+Star
+star
+starblind
+starbloom
+starboard
+starbolins
+starbright
+Starbuck
+starch
+starchboard
+starched
+starchedly
+starchedness
+starcher
+starchflower
+starchily
+starchiness
+starchless
+starchlike
+starchly
+starchmaker
+starchmaking
+starchman
+starchness
+starchroot
+starchworks
+starchwort
+starchy
+starcraft
+stardom
+stare
+staree
+starer
+starets
+starfish
+starflower
+starfruit
+starful
+stargaze
+stargazer
+stargazing
+staring
+staringly
+stark
+starken
+starkly
+starkness
+starky
+starless
+starlessly
+starlessness
+starlet
+starlight
+starlighted
+starlights
+starlike
+starling
+starlit
+starlite
+starlitten
+starmonger
+starn
+starnel
+starnie
+starnose
+Staroobriadtsi
+starost
+starosta
+starosty
+starred
+starrily
+starriness
+starring
+starringly
+starry
+starshake
+starshine
+starship
+starshoot
+starshot
+starstone
+starstroke
+start
+starter
+startful
+startfulness
+starthroat
+starting
+startingly
+startish
+startle
+startler
+startling
+startlingly
+startlingness
+startlish
+startlishness
+startly
+startor
+starty
+starvation
+starve
+starveacre
+starved
+starvedly
+starveling
+starver
+starvy
+starward
+starwise
+starworm
+starwort
+stary
+stases
+stash
+stashie
+stasidion
+stasimetric
+stasimon
+stasimorphy
+stasiphobia
+stasis
+stassfurtite
+statable
+statal
+statant
+statcoulomb
+State
+state
+statecraft
+stated
+statedly
+stateful
+statefully
+statefulness
+statehood
+Statehouse
+stateless
+statelet
+statelich
+statelily
+stateliness
+stately
+statement
+statemonger
+statequake
+stater
+stateroom
+statesboy
+stateside
+statesider
+statesman
+statesmanese
+statesmanlike
+statesmanly
+statesmanship
+statesmonger
+stateswoman
+stateway
+statfarad
+stathmoi
+stathmos
+static
+statical
+statically
+Statice
+staticproof
+statics
+station
+stational
+stationarily
+stationariness
+stationary
+stationer
+stationery
+stationman
+stationmaster
+statiscope
+statism
+statist
+statistic
+statistical
+statistically
+statistician
+statisticize
+statistics
+statistology
+stative
+statoblast
+statocracy
+statocyst
+statolatry
+statolith
+statolithic
+statometer
+stator
+statoreceptor
+statorhab
+statoscope
+statospore
+statuarism
+statuarist
+statuary
+statue
+statuecraft
+statued
+statueless
+statuelike
+statuesque
+statuesquely
+statuesqueness
+statuette
+stature
+statured
+status
+statutable
+statutableness
+statutably
+statutary
+statute
+statutorily
+statutory
+statvolt
+staucher
+stauk
+staumer
+staun
+staunch
+staunchable
+staunchly
+staunchness
+staup
+stauracin
+stauraxonia
+stauraxonial
+staurion
+staurolatry
+staurolite
+staurolitic
+staurology
+Stauromedusae
+stauromedusan
+stauropegial
+stauropegion
+stauroscope
+stauroscopic
+stauroscopically
+staurotide
+stauter
+stave
+staveable
+staveless
+staver
+stavers
+staverwort
+stavesacre
+stavewise
+stavewood
+staving
+stavrite
+staw
+stawn
+staxis
+stay
+stayable
+stayed
+stayer
+staylace
+stayless
+staylessness
+staymaker
+staymaking
+staynil
+stays
+staysail
+stayship
+stchi
+stead
+steadfast
+steadfastly
+steadfastness
+steadier
+steadily
+steadiment
+steadiness
+steading
+steadman
+steady
+steadying
+steadyingly
+steadyish
+steak
+steal
+stealability
+stealable
+stealage
+stealed
+stealer
+stealing
+stealingly
+stealth
+stealthful
+stealthfully
+stealthily
+stealthiness
+stealthless
+stealthlike
+stealthwise
+stealthy
+stealy
+steam
+steamboat
+steamboating
+steamboatman
+steamcar
+steamer
+steamerful
+steamerless
+steamerload
+steamily
+steaminess
+steaming
+steamless
+steamlike
+steampipe
+steamproof
+steamship
+steamtight
+steamtightness
+steamy
+stean
+steaning
+steapsin
+stearate
+stearic
+steariform
+stearin
+stearolactone
+stearone
+stearoptene
+stearrhea
+stearyl
+steatin
+steatite
+steatitic
+steatocele
+steatogenous
+steatolysis
+steatolytic
+steatoma
+steatomatous
+steatopathic
+steatopyga
+steatopygia
+steatopygic
+steatopygous
+Steatornis
+Steatornithes
+Steatornithidae
+steatorrhea
+steatosis
+stech
+stechados
+steckling
+steddle
+Stedman
+steed
+steedless
+steedlike
+steek
+steekkan
+steekkannen
+steel
+Steelboy
+steeler
+steelhead
+steelhearted
+steelification
+steelify
+steeliness
+steeling
+steelless
+steellike
+steelmaker
+steelmaking
+steelproof
+steelware
+steelwork
+steelworker
+steelworks
+steely
+steelyard
+Steen
+steen
+steenboc
+steenbock
+steenbok
+Steenie
+steenkirk
+steenstrupine
+steenth
+steep
+steepdown
+steepen
+steeper
+steepgrass
+steepish
+steeple
+steeplebush
+steeplechase
+steeplechaser
+steeplechasing
+steepled
+steepleless
+steeplelike
+steepletop
+steeply
+steepness
+steepweed
+steepwort
+steepy
+steer
+steerability
+steerable
+steerage
+steerageway
+steerer
+steering
+steeringly
+steerling
+steerman
+steermanship
+steersman
+steerswoman
+steeve
+steevely
+steever
+steeving
+Stefan
+steg
+steganogram
+steganographical
+steganographist
+steganography
+Steganophthalmata
+steganophthalmate
+steganophthalmatous
+Steganophthalmia
+steganopod
+steganopodan
+Steganopodes
+steganopodous
+stegnosis
+stegnotic
+stegocarpous
+Stegocephalia
+stegocephalian
+stegocephalous
+Stegodon
+stegodont
+stegodontine
+Stegomus
+Stegomyia
+stegosaur
+Stegosauria
+stegosaurian
+stegosauroid
+Stegosaurus
+steid
+steigh
+Stein
+stein
+Steinberger
+steinbok
+Steinerian
+steinful
+steinkirk
+Steironema
+stekan
+stela
+stelae
+stelai
+stelar
+stele
+stell
+Stella
+stella
+stellar
+Stellaria
+stellary
+stellate
+stellated
+stellately
+stellature
+stelleridean
+stellerine
+stelliferous
+stellification
+stelliform
+stellify
+stelling
+stellionate
+stelliscript
+Stellite
+stellite
+stellular
+stellularly
+stellulate
+stelography
+stem
+stema
+stemhead
+stemless
+stemlet
+stemlike
+stemma
+stemmata
+stemmatiform
+stemmatous
+stemmed
+stemmer
+stemmery
+stemming
+stemmy
+Stemona
+Stemonaceae
+stemonaceous
+stemple
+stempost
+stemson
+stemwards
+stemware
+sten
+stenar
+stench
+stenchel
+stenchful
+stenching
+stenchion
+stenchy
+stencil
+stenciler
+stencilmaker
+stencilmaking
+stend
+steng
+stengah
+stenion
+steno
+stenobathic
+stenobenthic
+stenobragmatic
+stenobregma
+stenocardia
+stenocardiac
+Stenocarpus
+stenocephalia
+stenocephalic
+stenocephalous
+stenocephaly
+stenochoria
+stenochrome
+stenochromy
+stenocoriasis
+stenocranial
+stenocrotaphia
+Stenofiber
+stenog
+stenogastric
+stenogastry
+Stenoglossa
+stenograph
+stenographer
+stenographic
+stenographical
+stenographically
+stenographist
+stenography
+stenohaline
+stenometer
+stenopaic
+Stenopelmatidae
+stenopetalous
+stenophile
+Stenophragma
+stenophyllous
+stenorhyncous
+stenosed
+stenosepalous
+stenosis
+stenosphere
+stenostomatous
+stenostomia
+Stenotaphrum
+stenotelegraphy
+stenothermal
+stenothorax
+stenotic
+stenotype
+stenotypic
+stenotypist
+stenotypy
+stent
+stenter
+stenterer
+stenton
+Stentor
+stentorian
+stentorianly
+stentorine
+stentorious
+stentoriously
+stentoriousness
+stentoronic
+stentorophonic
+stentrel
+step
+stepaunt
+stepbairn
+stepbrother
+stepbrotherhood
+stepchild
+stepdame
+stepdaughter
+stepfather
+stepfatherhood
+stepfatherly
+stepgrandchild
+stepgrandfather
+stepgrandmother
+stepgrandson
+Stephan
+Stephana
+stephane
+stephanial
+Stephanian
+stephanic
+Stephanie
+stephanion
+stephanite
+Stephanoceros
+Stephanokontae
+stephanome
+stephanos
+Stephanotis
+stephanotis
+Stephanurus
+Stephe
+Stephen
+stepladder
+stepless
+steplike
+stepminnie
+stepmother
+stepmotherhood
+stepmotherless
+stepmotherliness
+stepmotherly
+stepnephew
+stepniece
+stepparent
+steppe
+stepped
+steppeland
+stepper
+stepping
+steppingstone
+steprelation
+steprelationship
+stepsire
+stepsister
+stepson
+stepstone
+stept
+stepuncle
+stepway
+stepwise
+steradian
+stercobilin
+stercolin
+stercophagic
+stercophagous
+stercoraceous
+stercoral
+Stercoranism
+Stercoranist
+Stercorariidae
+Stercorariinae
+stercorarious
+Stercorarius
+stercorary
+stercorate
+stercoration
+stercorean
+stercoremia
+stercoreous
+Stercorianism
+stercoricolous
+Stercorist
+stercorite
+stercorol
+stercorous
+stercovorous
+Sterculia
+Sterculiaceae
+sterculiaceous
+sterculiad
+stere
+stereagnosis
+Sterelmintha
+sterelminthic
+sterelminthous
+stereo
+stereobate
+stereobatic
+stereoblastula
+stereocamera
+stereocampimeter
+stereochemic
+stereochemical
+stereochemically
+stereochemistry
+stereochromatic
+stereochromatically
+stereochrome
+stereochromic
+stereochromically
+stereochromy
+stereocomparagraph
+stereocomparator
+stereoelectric
+stereofluoroscopic
+stereofluoroscopy
+stereogastrula
+stereognosis
+stereognostic
+stereogoniometer
+stereogram
+stereograph
+stereographer
+stereographic
+stereographical
+stereographically
+stereography
+stereoisomer
+stereoisomeric
+stereoisomerical
+stereoisomeride
+stereoisomerism
+stereomatrix
+stereome
+stereomer
+stereomeric
+stereomerical
+stereomerism
+stereometer
+stereometric
+stereometrical
+stereometrically
+stereometry
+stereomicrometer
+stereomonoscope
+stereoneural
+stereophantascope
+stereophonic
+stereophony
+stereophotogrammetry
+stereophotograph
+stereophotographic
+stereophotography
+stereophotomicrograph
+stereophotomicrography
+stereophysics
+stereopicture
+stereoplanigraph
+stereoplanula
+stereoplasm
+stereoplasma
+stereoplasmic
+stereopsis
+stereoptician
+stereopticon
+stereoradiograph
+stereoradiography
+Stereornithes
+stereornithic
+stereoroentgenogram
+stereoroentgenography
+stereoscope
+stereoscopic
+stereoscopically
+stereoscopism
+stereoscopist
+stereoscopy
+Stereospondyli
+stereospondylous
+stereostatic
+stereostatics
+stereotactic
+stereotactically
+stereotaxis
+stereotelemeter
+stereotelescope
+stereotomic
+stereotomical
+stereotomist
+stereotomy
+stereotropic
+stereotropism
+stereotypable
+stereotype
+stereotyped
+stereotyper
+stereotypery
+stereotypic
+stereotypical
+stereotyping
+stereotypist
+stereotypographer
+stereotypography
+stereotypy
+Stereum
+sterhydraulic
+steri
+steric
+sterically
+sterics
+steride
+sterigma
+sterigmata
+sterigmatic
+sterile
+sterilely
+sterileness
+sterilisable
+sterility
+sterilizability
+sterilizable
+sterilization
+sterilize
+sterilizer
+sterin
+sterk
+sterlet
+Sterling
+sterling
+sterlingly
+sterlingness
+Stern
+stern
+Sterna
+sterna
+sternad
+sternage
+sternal
+sternalis
+sternbergite
+sterncastle
+sterneber
+sternebra
+sternebrae
+sternebral
+sterned
+sternforemost
+Sterninae
+sternite
+sternitic
+sternly
+sternman
+sternmost
+sternness
+Sterno
+sternoclavicular
+sternocleidomastoid
+sternoclidomastoid
+sternocoracoid
+sternocostal
+sternofacial
+sternofacialis
+sternoglossal
+sternohumeral
+sternohyoid
+sternohyoidean
+sternomancy
+sternomastoid
+sternomaxillary
+sternonuchal
+sternopericardiac
+sternopericardial
+sternoscapular
+sternothere
+Sternotherus
+sternothyroid
+sternotracheal
+sternotribe
+sternovertebral
+sternoxiphoid
+sternpost
+sternson
+sternum
+sternutation
+sternutative
+sternutator
+sternutatory
+sternward
+sternway
+sternways
+sternworks
+stero
+steroid
+sterol
+Sterope
+sterrinck
+stert
+stertor
+stertorious
+stertoriously
+stertoriousness
+stertorous
+stertorously
+stertorousness
+sterve
+Stesichorean
+stet
+stetch
+stetharteritis
+stethogoniometer
+stethograph
+stethographic
+stethokyrtograph
+stethometer
+stethometric
+stethometry
+stethoparalysis
+stethophone
+stethophonometer
+stethoscope
+stethoscopic
+stethoscopical
+stethoscopically
+stethoscopist
+stethoscopy
+stethospasm
+Stevan
+Steve
+stevedorage
+stevedore
+stevedoring
+stevel
+Steven
+steven
+Stevensonian
+Stevensoniana
+Stevia
+stevia
+stew
+stewable
+steward
+stewardess
+stewardly
+stewardry
+stewardship
+Stewart
+Stewartia
+stewartry
+stewarty
+stewed
+stewpan
+stewpond
+stewpot
+stewy
+stey
+sthenia
+sthenic
+sthenochire
+stib
+stibbler
+stibblerig
+stibethyl
+stibial
+stibialism
+stibiate
+stibiated
+stibic
+stibiconite
+stibine
+stibious
+stibium
+stibnite
+stibonium
+sticcado
+stich
+sticharion
+sticheron
+stichic
+stichically
+stichid
+stichidium
+stichomancy
+stichometric
+stichometrical
+stichometrically
+stichometry
+stichomythic
+stichomythy
+stick
+stickability
+stickable
+stickadore
+stickadove
+stickage
+stickball
+sticked
+sticker
+stickers
+stickfast
+stickful
+stickily
+stickiness
+sticking
+stickit
+stickle
+stickleaf
+stickleback
+stickler
+stickless
+sticklike
+stickling
+stickly
+stickpin
+sticks
+stickseed
+sticksmanship
+sticktail
+sticktight
+stickum
+stickwater
+stickweed
+stickwork
+sticky
+Sticta
+Stictaceae
+Stictidaceae
+stictiform
+Stictis
+stid
+stiddy
+stife
+stiff
+stiffen
+stiffener
+stiffening
+stiffhearted
+stiffish
+stiffleg
+stifflike
+stiffly
+stiffneck
+stiffness
+stiffrump
+stifftail
+stifle
+stifledly
+stifler
+stifling
+stiflingly
+stigma
+stigmai
+stigmal
+stigmaria
+stigmarian
+stigmarioid
+stigmasterol
+stigmata
+stigmatal
+stigmatic
+stigmatical
+stigmatically
+stigmaticalness
+stigmatiferous
+stigmatiform
+stigmatism
+stigmatist
+stigmatization
+stigmatize
+stigmatizer
+stigmatoid
+stigmatose
+stigme
+stigmeology
+stigmonose
+stigonomancy
+Stikine
+Stilbaceae
+Stilbella
+stilbene
+stilbestrol
+stilbite
+stilboestrol
+Stilbum
+stile
+stileman
+stilet
+stiletto
+stilettolike
+still
+stillage
+stillatitious
+stillatory
+stillbirth
+stillborn
+stiller
+stillhouse
+stillicide
+stillicidium
+stilliform
+stilling
+Stillingia
+stillion
+stillish
+stillman
+stillness
+stillroom
+stillstand
+Stillwater
+stilly
+Stilophora
+Stilophoraceae
+stilpnomelane
+stilpnosiderite
+stilt
+stiltbird
+stilted
+stilter
+stiltify
+stiltiness
+stiltish
+stiltlike
+Stilton
+stilty
+stim
+stime
+stimpart
+stimpert
+stimulability
+stimulable
+stimulance
+stimulancy
+stimulant
+stimulate
+stimulatingly
+stimulation
+stimulative
+stimulator
+stimulatory
+stimulatress
+stimulatrix
+stimuli
+stimulogenous
+stimulus
+stimy
+stine
+sting
+stingaree
+stingareeing
+stingbull
+stinge
+stinger
+stingfish
+stingily
+stinginess
+stinging
+stingingly
+stingingness
+stingless
+stingo
+stingproof
+stingray
+stingtail
+stingy
+stink
+stinkard
+stinkardly
+stinkball
+stinkberry
+stinkbird
+stinkbug
+stinkbush
+stinkdamp
+stinker
+stinkhorn
+stinking
+stinkingly
+stinkingness
+stinkpot
+stinkstone
+stinkweed
+stinkwood
+stinkwort
+stint
+stinted
+stintedly
+stintedness
+stinter
+stintingly
+stintless
+stinty
+stion
+stionic
+Stipa
+stipe
+stiped
+stipel
+stipellate
+stipend
+stipendial
+stipendiarian
+stipendiary
+stipendiate
+stipendium
+stipendless
+stipes
+stipiform
+stipitate
+stipitiform
+stipiture
+Stipiturus
+stippen
+stipple
+stippled
+stippler
+stippling
+stipply
+stipula
+stipulable
+stipulaceous
+stipulae
+stipular
+stipulary
+stipulate
+stipulation
+stipulator
+stipulatory
+stipule
+stipuled
+stipuliferous
+stipuliform
+stir
+stirabout
+stirk
+stirless
+stirlessly
+stirlessness
+stirp
+stirpicultural
+stirpiculture
+stirpiculturist
+stirps
+stirra
+stirrable
+stirrage
+stirrer
+stirring
+stirringly
+stirrup
+stirrupless
+stirruplike
+stirrupwise
+stitch
+stitchbird
+stitchdown
+stitcher
+stitchery
+stitching
+stitchlike
+stitchwhile
+stitchwork
+stitchwort
+stite
+stith
+stithy
+stive
+stiver
+stivy
+Stizolobium
+stoa
+stoach
+stoat
+stoater
+stob
+stocah
+stoccado
+stoccata
+stochastic
+stochastical
+stochastically
+stock
+stockade
+stockannet
+stockbow
+stockbreeder
+stockbreeding
+Stockbridge
+stockbroker
+stockbrokerage
+stockbroking
+stockcar
+stocker
+stockfather
+stockfish
+stockholder
+stockholding
+stockhouse
+stockily
+stockiness
+stockinet
+stocking
+stockinger
+stockingless
+stockish
+stockishly
+stockishness
+stockjobber
+stockjobbery
+stockjobbing
+stockjudging
+stockkeeper
+stockkeeping
+stockless
+stocklike
+stockmaker
+stockmaking
+stockman
+stockowner
+stockpile
+stockpot
+stockproof
+stockrider
+stockriding
+stocks
+stockstone
+stocktaker
+stocktaking
+Stockton
+stockwork
+stockwright
+stocky
+stockyard
+stod
+stodge
+stodger
+stodgery
+stodgily
+stodginess
+stodgy
+stoechas
+stoep
+stof
+stoff
+stog
+stoga
+stogie
+stogy
+Stoic
+stoic
+stoical
+stoically
+stoicalness
+stoicharion
+stoichiological
+stoichiology
+stoichiometric
+stoichiometrical
+stoichiometrically
+stoichiometry
+Stoicism
+stoicism
+Stokavci
+Stokavian
+Stokavski
+stoke
+stokehold
+stokehole
+stoker
+stokerless
+Stokesia
+stokesite
+stola
+stolae
+stole
+stoled
+stolelike
+stolen
+stolenly
+stolenness
+stolenwise
+stolewise
+stolid
+stolidity
+stolidly
+stolidness
+stolist
+stolkjaerre
+stollen
+stolon
+stolonate
+stoloniferous
+stoloniferously
+stolonlike
+stolzite
+stoma
+stomacace
+stomach
+stomachable
+stomachal
+stomacher
+stomachful
+stomachfully
+stomachfulness
+stomachic
+stomachically
+stomachicness
+stomaching
+stomachless
+stomachlessness
+stomachy
+stomapod
+Stomapoda
+stomapodiform
+stomapodous
+stomata
+stomatal
+stomatalgia
+stomate
+stomatic
+stomatiferous
+stomatitic
+stomatitis
+stomatocace
+Stomatoda
+stomatodaeal
+stomatodaeum
+stomatode
+stomatodeum
+stomatodynia
+stomatogastric
+stomatograph
+stomatography
+stomatolalia
+stomatologic
+stomatological
+stomatologist
+stomatology
+stomatomalacia
+stomatomenia
+stomatomy
+stomatomycosis
+stomatonecrosis
+stomatopathy
+Stomatophora
+stomatophorous
+stomatoplastic
+stomatoplasty
+stomatopod
+Stomatopoda
+stomatopodous
+stomatorrhagia
+stomatoscope
+stomatoscopy
+stomatose
+stomatosepsis
+stomatotomy
+stomatotyphus
+stomatous
+stomenorrhagia
+stomium
+stomodaea
+stomodaeal
+stomodaeum
+Stomoisia
+stomoxys
+stomp
+stomper
+stonable
+stond
+Stone
+stone
+stoneable
+stonebird
+stonebiter
+stoneboat
+stonebow
+stonebrash
+stonebreak
+stonebrood
+stonecast
+stonechat
+stonecraft
+stonecrop
+stonecutter
+stoned
+stonedamp
+stonefish
+stonegale
+stonegall
+stonehand
+stonehatch
+stonehead
+stonehearted
+Stonehenge
+stonelayer
+stonelaying
+stoneless
+stonelessness
+stonelike
+stoneman
+stonemason
+stonemasonry
+stonen
+stonepecker
+stoner
+stoneroot
+stoneseed
+stoneshot
+stonesmatch
+stonesmich
+stonesmitch
+stonesmith
+stonewall
+stonewaller
+stonewally
+stoneware
+stoneweed
+stonewise
+stonewood
+stonework
+stoneworker
+stonewort
+stoneyard
+stong
+stonied
+stonifiable
+stonify
+stonily
+stoniness
+stoning
+stonish
+stonishment
+stonker
+stony
+stonyhearted
+stonyheartedly
+stonyheartedness
+stood
+stooded
+stooden
+stoof
+stooge
+stook
+stooker
+stookie
+stool
+stoolball
+stoollike
+stoon
+stoond
+stoop
+stooper
+stoopgallant
+stooping
+stoopingly
+stoory
+stoot
+stoothing
+stop
+stopa
+stopback
+stopblock
+stopboard
+stopcock
+stope
+stoper
+stopgap
+stophound
+stoping
+stopless
+stoplessness
+stopover
+stoppability
+stoppable
+stoppableness
+stoppably
+stoppage
+stopped
+stopper
+stopperless
+stoppeur
+stopping
+stoppit
+stopple
+stopwater
+stopwork
+storable
+storage
+storax
+store
+storeen
+storehouse
+storehouseman
+storekeep
+storekeeper
+storekeeping
+storeman
+storer
+storeroom
+storeship
+storesman
+storge
+storiate
+storiation
+storied
+storier
+storiette
+storify
+storiological
+storiologist
+storiology
+stork
+storken
+storkish
+storklike
+storkling
+storkwise
+storm
+stormable
+Stormberg
+stormbird
+stormbound
+stormcock
+stormer
+stormful
+stormfully
+stormfulness
+stormily
+storminess
+storming
+stormingly
+stormish
+stormless
+stormlessness
+stormlike
+stormproof
+stormward
+stormwind
+stormwise
+stormy
+Storting
+story
+storybook
+storyless
+storymaker
+storymonger
+storyteller
+storytelling
+storywise
+storywork
+stosh
+stoss
+stosston
+stot
+stotinka
+stotter
+stotterel
+stoun
+stound
+stoundmeal
+stoup
+stoupful
+stour
+stouring
+stourliness
+stourness
+stoury
+stoush
+stout
+stouten
+stouth
+stouthearted
+stoutheartedly
+stoutheartedness
+stoutish
+stoutly
+stoutness
+stoutwood
+stouty
+stove
+stovebrush
+stoveful
+stovehouse
+stoveless
+stovemaker
+stovemaking
+stoveman
+stoven
+stovepipe
+stover
+stovewood
+stow
+stowable
+stowage
+stowaway
+stowbord
+stowbordman
+stowce
+stowdown
+stower
+stowing
+stownlins
+stowwood
+stra
+strabism
+strabismal
+strabismally
+strabismic
+strabismical
+strabismometer
+strabismometry
+strabismus
+strabometer
+strabometry
+strabotome
+strabotomy
+strack
+strackling
+stract
+Strad
+strad
+stradametrical
+straddle
+straddleback
+straddlebug
+straddler
+straddleways
+straddlewise
+straddling
+straddlingly
+strade
+stradine
+stradiot
+Stradivari
+Stradivarius
+stradl
+stradld
+stradlings
+strae
+strafe
+strafer
+Straffordian
+strag
+straggle
+straggler
+straggling
+stragglingly
+straggly
+stragular
+stragulum
+straight
+straightabout
+straightaway
+straightedge
+straighten
+straightener
+straightforward
+straightforwardly
+straightforwardness
+straightforwards
+straighthead
+straightish
+straightly
+straightness
+straighttail
+straightup
+straightwards
+straightway
+straightways
+straightwise
+straik
+strain
+strainable
+strainableness
+strainably
+strained
+strainedly
+strainedness
+strainer
+strainerman
+straining
+strainingly
+strainless
+strainlessly
+strainproof
+strainslip
+straint
+strait
+straiten
+straitlacedness
+straitlacing
+straitly
+straitness
+straitsman
+straitwork
+Straka
+strake
+straked
+straky
+stram
+stramash
+stramazon
+stramineous
+stramineously
+strammel
+strammer
+stramonium
+stramony
+stramp
+strand
+strandage
+strander
+stranding
+strandless
+strandward
+strang
+strange
+strangeling
+strangely
+strangeness
+stranger
+strangerdom
+strangerhood
+strangerlike
+strangership
+strangerwise
+strangle
+strangleable
+stranglement
+strangler
+strangles
+strangletare
+strangleweed
+strangling
+stranglingly
+strangulable
+strangulate
+strangulation
+strangulative
+strangulatory
+strangullion
+strangurious
+strangury
+stranner
+strany
+strap
+straphang
+straphanger
+straphead
+strapless
+straplike
+strappable
+strappado
+strappan
+strapped
+strapper
+strapping
+strapple
+strapwork
+strapwort
+strass
+strata
+stratagem
+stratagematic
+stratagematical
+stratagematically
+stratagematist
+stratagemical
+stratagemically
+stratal
+stratameter
+stratege
+strategetic
+strategetics
+strategi
+strategian
+strategic
+strategical
+strategically
+strategics
+strategist
+strategize
+strategos
+strategy
+Stratfordian
+strath
+strathspey
+strati
+stratic
+straticulate
+straticulation
+stratification
+stratified
+stratiform
+stratify
+stratigrapher
+stratigraphic
+stratigraphical
+stratigraphically
+stratigraphist
+stratigraphy
+Stratiomyiidae
+Stratiotes
+stratlin
+stratochamber
+stratocracy
+stratocrat
+stratocratic
+stratographic
+stratographical
+stratographically
+stratography
+stratonic
+Stratonical
+stratopedarch
+stratoplane
+stratose
+stratosphere
+stratospheric
+stratospherical
+stratotrainer
+stratous
+stratum
+stratus
+straucht
+strauchten
+stravage
+strave
+straw
+strawberry
+strawberrylike
+strawbill
+strawboard
+strawbreadth
+strawen
+strawer
+strawflower
+strawfork
+strawless
+strawlike
+strawman
+strawmote
+strawsmall
+strawsmear
+strawstack
+strawstacker
+strawwalker
+strawwork
+strawworm
+strawy
+strawyard
+stray
+strayaway
+strayer
+strayling
+stre
+streahte
+streak
+streaked
+streakedly
+streakedness
+streaker
+streakily
+streakiness
+streaklike
+streakwise
+streaky
+stream
+streamer
+streamful
+streamhead
+streaminess
+streaming
+streamingly
+streamless
+streamlet
+streamlike
+streamline
+streamlined
+streamliner
+streamling
+streamside
+streamward
+streamway
+streamwort
+streamy
+streck
+streckly
+stree
+streek
+streel
+streeler
+streen
+streep
+street
+streetage
+streetcar
+streetful
+streetless
+streetlet
+streetlike
+streets
+streetside
+streetwalker
+streetwalking
+streetward
+streetway
+streetwise
+streite
+streke
+Strelitz
+Strelitzi
+strelitzi
+Strelitzia
+Streltzi
+streltzi
+stremma
+stremmatograph
+streng
+strengite
+strength
+strengthen
+strengthener
+strengthening
+strengtheningly
+strengthful
+strengthfulness
+strengthily
+strengthless
+strengthlessly
+strengthlessness
+strengthy
+strent
+strenth
+strenuity
+strenuosity
+strenuous
+strenuously
+strenuousness
+strepen
+strepent
+strepera
+streperous
+strephonade
+strephosymbolia
+strepitant
+strepitantly
+strepitation
+strepitous
+strepor
+Strepsiceros
+strepsiceros
+strepsinema
+Strepsiptera
+strepsipteral
+strepsipteran
+strepsipteron
+strepsipterous
+strepsis
+strepsitene
+streptaster
+streptobacilli
+streptobacillus
+Streptocarpus
+streptococcal
+streptococci
+streptococcic
+Streptococcus
+streptococcus
+streptolysin
+Streptomyces
+streptomycin
+Streptoneura
+streptoneural
+streptoneurous
+streptosepticemia
+streptothricial
+streptothricin
+streptothricosis
+Streptothrix
+streptotrichal
+streptotrichosis
+stress
+stresser
+stressful
+stressfully
+stressless
+stresslessness
+stret
+stretch
+stretchable
+stretchberry
+stretcher
+stretcherman
+stretchiness
+stretchneck
+stretchproof
+stretchy
+stretman
+strette
+stretti
+stretto
+strew
+strewage
+strewer
+strewment
+strewn
+strey
+streyne
+stria
+striae
+strial
+Striaria
+Striariaceae
+striatal
+striate
+striated
+striation
+striatum
+striature
+strich
+striche
+strick
+stricken
+strickenly
+strickenness
+stricker
+strickle
+strickler
+strickless
+strict
+striction
+strictish
+strictly
+strictness
+stricture
+strictured
+strid
+stridden
+striddle
+stride
+strideleg
+stridelegs
+stridence
+stridency
+strident
+stridently
+strider
+strideways
+stridhan
+stridhana
+stridhanum
+stridingly
+stridling
+stridlins
+stridor
+stridulant
+stridulate
+stridulation
+stridulator
+stridulatory
+stridulent
+stridulous
+stridulously
+stridulousness
+strife
+strifeful
+strifeless
+strifemaker
+strifemaking
+strifemonger
+strifeproof
+striffen
+strig
+Striga
+striga
+strigae
+strigal
+strigate
+Striges
+striggle
+stright
+Strigidae
+Strigiformes
+strigil
+strigilate
+strigilation
+strigilator
+strigiles
+strigilis
+strigillose
+strigilous
+Striginae
+strigine
+strigose
+strigous
+strigovite
+Strigula
+Strigulaceae
+strigulose
+strike
+strikeboat
+strikebreaker
+strikebreaking
+strikeless
+striker
+striking
+strikingly
+strikingness
+strind
+string
+stringboard
+stringcourse
+stringed
+stringency
+stringene
+stringent
+stringently
+stringentness
+stringer
+stringful
+stringhalt
+stringhalted
+stringhaltedness
+stringiness
+stringing
+stringless
+stringlike
+stringmaker
+stringmaking
+stringman
+stringpiece
+stringsman
+stringways
+stringwood
+stringy
+stringybark
+strinkle
+striola
+striolae
+striolate
+striolated
+striolet
+strip
+stripe
+striped
+stripeless
+striper
+striplet
+stripling
+strippage
+stripped
+stripper
+stripping
+strippit
+strippler
+stript
+stripy
+strit
+strive
+strived
+striven
+striver
+striving
+strivingly
+Strix
+strix
+stroam
+strobic
+strobila
+strobilaceous
+strobilae
+strobilate
+strobilation
+strobile
+strobili
+strobiliferous
+strobiliform
+strobiline
+strobilization
+strobiloid
+Strobilomyces
+Strobilophyta
+strobilus
+stroboscope
+stroboscopic
+stroboscopical
+stroboscopy
+strobotron
+strockle
+stroddle
+strode
+stroil
+stroke
+stroker
+strokesman
+stroking
+stroky
+strold
+stroll
+strolld
+stroller
+strom
+stroma
+stromal
+stromata
+Stromateidae
+stromateoid
+stromatic
+stromatiform
+stromatology
+Stromatopora
+Stromatoporidae
+stromatoporoid
+Stromatoporoidea
+stromatous
+stromb
+Strombidae
+strombiform
+strombite
+stromboid
+strombolian
+strombuliferous
+strombuliform
+Strombus
+strome
+stromeyerite
+stromming
+strone
+strong
+strongback
+strongbark
+strongbox
+strongbrained
+strongfully
+stronghand
+stronghead
+strongheadedly
+strongheadedness
+stronghearted
+stronghold
+strongish
+stronglike
+strongly
+strongness
+strongylate
+strongyle
+strongyliasis
+strongylid
+Strongylidae
+strongylidosis
+strongyloid
+Strongyloides
+strongyloidosis
+strongylon
+Strongyloplasmata
+Strongylosis
+strongylosis
+Strongylus
+strontia
+strontian
+strontianiferous
+strontianite
+strontic
+strontion
+strontitic
+strontium
+strook
+strooken
+stroot
+strop
+strophaic
+strophanhin
+Strophanthus
+Stropharia
+strophe
+strophic
+strophical
+strophically
+strophiolate
+strophiolated
+strophiole
+strophoid
+Strophomena
+Strophomenacea
+strophomenid
+Strophomenidae
+strophomenoid
+strophosis
+strophotaxis
+strophulus
+stropper
+stroppings
+stroth
+stroud
+strouding
+strounge
+stroup
+strouthiocamel
+strouthiocamelian
+strouthocamelian
+strove
+strow
+strowd
+strown
+stroy
+stroyer
+stroygood
+strub
+strubbly
+struck
+strucken
+structural
+structuralism
+structuralist
+structuralization
+structuralize
+structurally
+structuration
+structure
+structured
+structureless
+structurely
+structurist
+strudel
+strue
+struggle
+struggler
+struggling
+strugglingly
+Struldbrug
+Struldbruggian
+Struldbruggism
+strum
+struma
+strumae
+strumatic
+strumaticness
+strumectomy
+Strumella
+strumiferous
+strumiform
+strumiprivic
+strumiprivous
+strumitis
+strummer
+strumose
+strumous
+strumousness
+strumpet
+strumpetlike
+strumpetry
+strumstrum
+strumulose
+strung
+strunt
+strut
+struth
+struthian
+struthiform
+Struthio
+struthioid
+Struthiomimus
+Struthiones
+Struthionidae
+struthioniform
+Struthioniformes
+Struthiopteris
+struthious
+struthonine
+strutter
+strutting
+struttingly
+struv
+struvite
+strych
+strychnia
+strychnic
+strychnin
+strychnine
+strychninic
+strychninism
+strychninization
+strychninize
+strychnize
+strychnol
+Strychnos
+Strymon
+Stu
+Stuart
+Stuartia
+stub
+stubachite
+stubb
+stubbed
+stubbedness
+stubber
+stubbiness
+stubble
+stubbleberry
+stubbled
+stubbleward
+stubbly
+stubborn
+stubbornhearted
+stubbornly
+stubbornness
+stubboy
+stubby
+stubchen
+stuber
+stuboy
+stubrunner
+stucco
+stuccoer
+stuccowork
+stuccoworker
+stuccoyer
+stuck
+stuckling
+stucturelessness
+stud
+studbook
+studder
+studdie
+studding
+studdle
+stude
+student
+studenthood
+studentless
+studentlike
+studentry
+studentship
+studerite
+studfish
+studflower
+studhorse
+studia
+studiable
+studied
+studiedly
+studiedness
+studier
+studio
+studious
+studiously
+studiousness
+Studite
+Studium
+studium
+studwork
+study
+stue
+stuff
+stuffed
+stuffender
+stuffer
+stuffgownsman
+stuffily
+stuffiness
+stuffing
+stuffy
+stug
+stuggy
+stuiver
+stull
+stuller
+stulm
+stultification
+stultifier
+stultify
+stultiloquence
+stultiloquently
+stultiloquious
+stultioquy
+stultloquent
+stum
+stumble
+stumbler
+stumbling
+stumblingly
+stumbly
+stumer
+stummer
+stummy
+stump
+stumpage
+stumper
+stumpily
+stumpiness
+stumpish
+stumpless
+stumplike
+stumpling
+stumpnose
+stumpwise
+stumpy
+stun
+Stundism
+Stundist
+stung
+stunk
+stunkard
+stunner
+stunning
+stunningly
+stunpoll
+stunsail
+stunsle
+stunt
+stunted
+stuntedly
+stuntedness
+stunter
+stuntiness
+stuntness
+stunty
+stupa
+stupe
+stupefacient
+stupefaction
+stupefactive
+stupefactiveness
+stupefied
+stupefiedness
+stupefier
+stupefy
+stupend
+stupendly
+stupendous
+stupendously
+stupendousness
+stupent
+stupeous
+stupex
+stupid
+stupidhead
+stupidish
+stupidity
+stupidly
+stupidness
+stupor
+stuporific
+stuporose
+stuporous
+stupose
+stupp
+stuprate
+stupration
+stuprum
+stupulose
+sturdied
+sturdily
+sturdiness
+sturdy
+sturdyhearted
+sturgeon
+sturine
+Sturiones
+sturionine
+sturk
+Sturmian
+Sturnella
+Sturnidae
+sturniform
+Sturninae
+sturnine
+sturnoid
+Sturnus
+sturt
+sturtan
+sturtin
+sturtion
+sturtite
+stuss
+stut
+stutter
+stutterer
+stuttering
+stutteringly
+sty
+styan
+styca
+styceric
+stycerin
+stycerinol
+stychomythia
+styful
+styfziekte
+Stygial
+Stygian
+stylar
+Stylaster
+Stylasteridae
+stylate
+style
+stylebook
+styledom
+styleless
+stylelessness
+stylelike
+styler
+stylet
+stylewort
+Stylidiaceae
+stylidiaceous
+Stylidium
+styliferous
+styliform
+styline
+styling
+stylish
+stylishly
+stylishness
+stylist
+stylistic
+stylistical
+stylistically
+stylistics
+stylite
+stylitic
+stylitism
+stylization
+stylize
+stylizer
+stylo
+styloauricularis
+stylobate
+Stylochus
+styloglossal
+styloglossus
+stylogonidium
+stylograph
+stylographic
+stylographical
+stylographically
+stylography
+stylohyal
+stylohyoid
+stylohyoidean
+stylohyoideus
+styloid
+stylolite
+stylolitic
+stylomandibular
+stylomastoid
+stylomaxillary
+stylometer
+Stylommatophora
+stylommatophorous
+stylomyloid
+Stylonurus
+Stylonychia
+stylopharyngeal
+stylopharyngeus
+stylopid
+Stylopidae
+stylopization
+stylopized
+stylopod
+stylopodium
+Stylops
+stylops
+Stylosanthes
+stylospore
+stylosporous
+stylostegium
+stylotypite
+stylus
+stymie
+Stymphalian
+Stymphalid
+Stymphalides
+Styphelia
+styphnate
+styphnic
+stypsis
+styptic
+styptical
+stypticalness
+stypticity
+stypticness
+Styracaceae
+styracaceous
+styracin
+Styrax
+styrax
+styrene
+Styrian
+styrogallol
+styrol
+styrolene
+styrone
+styryl
+styrylic
+stythe
+styward
+Styx
+Styxian
+suability
+suable
+suably
+suade
+Suaeda
+suaharo
+Sualocin
+Suanitian
+suant
+suantly
+suasible
+suasion
+suasionist
+suasive
+suasively
+suasiveness
+suasory
+suavastika
+suave
+suavely
+suaveness
+suaveolent
+suavify
+suaviloquence
+suaviloquent
+suavity
+sub
+subabbot
+subabdominal
+subability
+subabsolute
+subacademic
+subaccount
+subacetate
+subacid
+subacidity
+subacidly
+subacidness
+subacidulous
+subacrid
+subacrodrome
+subacromial
+subact
+subacuminate
+subacute
+subacutely
+subadditive
+subadjacent
+subadjutor
+subadministrate
+subadministration
+subadministrator
+subadult
+subaduncate
+subaerate
+subaeration
+subaerial
+subaerially
+subaetheric
+subaffluent
+subage
+subagency
+subagent
+subaggregate
+subah
+subahdar
+subahdary
+subahship
+subaid
+Subakhmimic
+subalary
+subalate
+subalgebra
+subalkaline
+suballiance
+subalmoner
+subalpine
+subaltern
+subalternant
+subalternate
+subalternately
+subalternating
+subalternation
+subalternity
+subanal
+subandean
+subangled
+subangular
+subangulate
+subangulated
+subanniversary
+subantarctic
+subantichrist
+subantique
+Subanun
+subapical
+subaponeurotic
+subapostolic
+subapparent
+subappearance
+subappressed
+subapprobation
+subapterous
+subaquatic
+subaquean
+subaqueous
+subarachnoid
+subarachnoidal
+subarachnoidean
+subarboraceous
+subarboreal
+subarborescent
+subarch
+subarchesporial
+subarchitect
+subarctic
+subarcuate
+subarcuated
+subarcuation
+subarea
+subareolar
+subareolet
+Subarian
+subarmor
+subarouse
+subarrhation
+subartesian
+subarticle
+subarytenoid
+subascending
+subassemblage
+subassembly
+subassociation
+subastragalar
+subastragaloid
+subastral
+subastringent
+subatom
+subatomic
+subattenuate
+subattenuated
+subattorney
+subaud
+subaudible
+subaudition
+subauditionist
+subauditor
+subauditur
+subaural
+subauricular
+subautomatic
+subaverage
+subaxillar
+subaxillary
+subbailie
+subbailiff
+subbailiwick
+subballast
+subband
+subbank
+subbasal
+subbasaltic
+subbase
+subbasement
+subbass
+subbeadle
+subbeau
+subbias
+subbifid
+subbing
+subbituminous
+subbookkeeper
+subboreal
+subbourdon
+subbrachycephalic
+subbrachycephaly
+subbrachyskelic
+subbranch
+subbranched
+subbranchial
+subbreed
+subbrigade
+subbrigadier
+subbroker
+subbromid
+subbromide
+subbronchial
+subbureau
+subcaecal
+subcalcareous
+subcalcarine
+subcaliber
+subcallosal
+subcampanulate
+subcancellate
+subcandid
+subcantor
+subcapsular
+subcaptain
+subcaption
+subcarbide
+subcarbonate
+Subcarboniferous
+subcarbureted
+subcarburetted
+subcardinal
+subcarinate
+subcartilaginous
+subcase
+subcash
+subcashier
+subcasino
+subcast
+subcaste
+subcategory
+subcaudal
+subcaudate
+subcaulescent
+subcause
+subcavate
+subcavity
+subcelestial
+subcell
+subcellar
+subcenter
+subcentral
+subcentrally
+subchairman
+subchamberer
+subchancel
+subchanter
+subchapter
+subchaser
+subchela
+subchelate
+subcheliform
+subchief
+subchloride
+subchondral
+subchordal
+subchorioid
+subchorioidal
+subchorionic
+subchoroid
+subchoroidal
+subcinctorium
+subcineritious
+subcingulum
+subcircuit
+subcircular
+subcision
+subcity
+subclaim
+Subclamatores
+subclan
+subclass
+subclassify
+subclause
+subclavate
+subclavia
+subclavian
+subclavicular
+subclavioaxillary
+subclaviojugular
+subclavius
+subclerk
+subclimate
+subclimax
+subclinical
+subclover
+subcoastal
+subcollateral
+subcollector
+subcollegiate
+subcolumnar
+subcommander
+subcommendation
+subcommended
+subcommissary
+subcommissaryship
+subcommission
+subcommissioner
+subcommit
+subcommittee
+subcompany
+subcompensate
+subcompensation
+subcompressed
+subconcave
+subconcession
+subconcessionaire
+subconchoidal
+subconference
+subconformable
+subconical
+subconjunctival
+subconjunctively
+subconnate
+subconnect
+subconnivent
+subconscience
+subconscious
+subconsciously
+subconsciousness
+subconservator
+subconsideration
+subconstable
+subconstellation
+subconsul
+subcontained
+subcontest
+subcontiguous
+subcontinent
+subcontinental
+subcontinual
+subcontinued
+subcontinuous
+subcontract
+subcontracted
+subcontractor
+subcontraoctave
+subcontrariety
+subcontrarily
+subcontrary
+subcontrol
+subconvex
+subconvolute
+subcool
+subcoracoid
+subcordate
+subcordiform
+subcoriaceous
+subcorneous
+subcorporation
+subcortex
+subcortical
+subcortically
+subcorymbose
+subcosta
+subcostal
+subcostalis
+subcouncil
+subcranial
+subcreative
+subcreek
+subcrenate
+subcrepitant
+subcrepitation
+subcrescentic
+subcrest
+subcriminal
+subcrossing
+subcrureal
+subcrureus
+subcrust
+subcrustaceous
+subcrustal
+subcrystalline
+subcubical
+subcuboidal
+subcultrate
+subcultural
+subculture
+subcurate
+subcurator
+subcuratorship
+subcurrent
+subcutaneous
+subcutaneously
+subcutaneousness
+subcuticular
+subcutis
+subcyaneous
+subcyanide
+subcylindric
+subcylindrical
+subdatary
+subdate
+subdeacon
+subdeaconate
+subdeaconess
+subdeaconry
+subdeaconship
+subdealer
+subdean
+subdeanery
+subdeb
+subdebutante
+subdecanal
+subdecimal
+subdecuple
+subdeducible
+subdefinition
+subdelegate
+subdelegation
+subdelirium
+subdeltaic
+subdeltoid
+subdeltoidal
+subdemonstrate
+subdemonstration
+subdenomination
+subdentate
+subdentated
+subdented
+subdenticulate
+subdepartment
+subdeposit
+subdepository
+subdepot
+subdepressed
+subdeputy
+subderivative
+subdermal
+subdeterminant
+subdevil
+subdiaconal
+subdiaconate
+subdial
+subdialect
+subdialectal
+subdialectally
+subdiapason
+subdiapente
+subdiaphragmatic
+subdichotomize
+subdichotomous
+subdichotomously
+subdichotomy
+subdie
+subdilated
+subdirector
+subdiscoidal
+subdisjunctive
+subdistich
+subdistichous
+subdistinction
+subdistinguish
+subdistinguished
+subdistrict
+subdititious
+subdititiously
+subdivecious
+subdiversify
+subdividable
+subdivide
+subdivider
+subdividing
+subdividingly
+subdivine
+subdivisible
+subdivision
+subdivisional
+subdivisive
+subdoctor
+subdolent
+subdolichocephalic
+subdolichocephaly
+subdolous
+subdolously
+subdolousness
+subdominant
+subdorsal
+subdorsally
+subdouble
+subdrain
+subdrainage
+subdrill
+subdruid
+subduable
+subduableness
+subduably
+subdual
+subduce
+subduct
+subduction
+subdue
+subdued
+subduedly
+subduedness
+subduement
+subduer
+subduing
+subduingly
+subduple
+subduplicate
+subdural
+subdurally
+subecho
+subectodermal
+subedit
+subeditor
+subeditorial
+subeditorship
+subeffective
+subelection
+subelectron
+subelement
+subelementary
+subelliptic
+subelliptical
+subelongate
+subemarginate
+subencephalon
+subencephaltic
+subendocardial
+subendorse
+subendorsement
+subendothelial
+subendymal
+subenfeoff
+subengineer
+subentire
+subentitle
+subentry
+subepidermal
+subepiglottic
+subepithelial
+subepoch
+subequal
+subequality
+subequally
+subequatorial
+subequilateral
+subequivalve
+suber
+suberane
+suberate
+suberect
+subereous
+suberic
+suberiferous
+suberification
+suberiform
+suberin
+suberinization
+suberinize
+Suberites
+Suberitidae
+suberization
+suberize
+suberone
+suberose
+suberous
+subescheator
+subesophageal
+subessential
+subetheric
+subexaminer
+subexcitation
+subexcite
+subexecutor
+subexternal
+subface
+subfacies
+subfactor
+subfactorial
+subfactory
+subfalcate
+subfalcial
+subfalciform
+subfamily
+subfascial
+subfastigiate
+subfebrile
+subferryman
+subfestive
+subfeu
+subfeudation
+subfeudatory
+subfibrous
+subfief
+subfigure
+subfissure
+subfix
+subflavor
+subflexuose
+subfloor
+subflooring
+subflora
+subflush
+subfluvial
+subfocal
+subfoliar
+subforeman
+subform
+subformation
+subfossil
+subfossorial
+subfoundation
+subfraction
+subframe
+subfreshman
+subfrontal
+subfulgent
+subfumigation
+subfumose
+subfunctional
+subfusc
+subfuscous
+subfusiform
+subfusk
+subgalea
+subgallate
+subganger
+subgape
+subgelatinous
+subgeneric
+subgenerical
+subgenerically
+subgeniculate
+subgenital
+subgens
+subgenual
+subgenus
+subgeometric
+subget
+subgit
+subglabrous
+subglacial
+subglacially
+subglenoid
+subglobose
+subglobosely
+subglobular
+subglobulose
+subglossal
+subglossitis
+subglottic
+subglumaceous
+subgod
+subgoverness
+subgovernor
+subgrade
+subgranular
+subgrin
+subgroup
+subgular
+subgwely
+subgyre
+subgyrus
+subhalid
+subhalide
+subhall
+subharmonic
+subhastation
+subhatchery
+subhead
+subheading
+subheadquarters
+subheadwaiter
+subhealth
+subhedral
+subhemispherical
+subhepatic
+subherd
+subhero
+subhexagonal
+subhirsute
+subhooked
+subhorizontal
+subhornblendic
+subhouse
+subhuman
+subhumid
+subhyaline
+subhyaloid
+subhymenial
+subhymenium
+subhyoid
+subhyoidean
+subhypothesis
+subhysteria
+subicle
+subicteric
+subicular
+subiculum
+subidar
+subidea
+subideal
+subimaginal
+subimago
+subimbricate
+subimbricated
+subimposed
+subimpressed
+subincandescent
+subincident
+subincise
+subincision
+subincomplete
+subindex
+subindicate
+subindication
+subindicative
+subindices
+subindividual
+subinduce
+subinfer
+subinfeud
+subinfeudate
+subinfeudation
+subinfeudatory
+subinflammation
+subinflammatory
+subinform
+subingression
+subinguinal
+subinitial
+subinoculate
+subinoculation
+subinsert
+subinsertion
+subinspector
+subinspectorship
+subintegumental
+subintellection
+subintelligential
+subintelligitur
+subintent
+subintention
+subintercessor
+subinternal
+subinterval
+subintestinal
+subintroduce
+subintroduction
+subintroductory
+subinvoluted
+subinvolution
+subiodide
+subirrigate
+subirrigation
+subitane
+subitaneous
+subitem
+Subiya
+subjacency
+subjacent
+subjacently
+subjack
+subject
+subjectability
+subjectable
+subjectdom
+subjected
+subjectedly
+subjectedness
+subjecthood
+subjectibility
+subjectible
+subjectification
+subjectify
+subjectile
+subjection
+subjectional
+subjectist
+subjective
+subjectively
+subjectiveness
+subjectivism
+subjectivist
+subjectivistic
+subjectivistically
+subjectivity
+subjectivize
+subjectivoidealistic
+subjectless
+subjectlike
+subjectness
+subjectship
+subjee
+subjicible
+subjoin
+subjoinder
+subjoint
+subjudge
+subjudiciary
+subjugable
+subjugal
+subjugate
+subjugation
+subjugator
+subjugular
+subjunct
+subjunction
+subjunctive
+subjunctively
+subjunior
+subking
+subkingdom
+sublabial
+sublaciniate
+sublacustrine
+sublanate
+sublanceolate
+sublanguage
+sublapsarian
+sublapsarianism
+sublapsary
+sublaryngeal
+sublate
+sublateral
+sublation
+sublative
+subleader
+sublease
+sublecturer
+sublegislation
+sublegislature
+sublenticular
+sublessee
+sublessor
+sublet
+sublethal
+sublettable
+subletter
+sublevaminous
+sublevate
+sublevation
+sublevel
+sublibrarian
+sublicense
+sublicensee
+sublid
+sublieutenancy
+sublieutenant
+subligation
+sublighted
+sublimable
+sublimableness
+sublimant
+sublimate
+sublimation
+sublimational
+sublimationist
+sublimator
+sublimatory
+sublime
+sublimed
+sublimely
+sublimeness
+sublimer
+subliminal
+subliminally
+sublimish
+sublimitation
+sublimity
+sublimize
+sublinear
+sublineation
+sublingua
+sublinguae
+sublingual
+sublinguate
+sublittoral
+sublobular
+sublong
+subloral
+subloreal
+sublot
+sublumbar
+sublunar
+sublunary
+sublunate
+sublustrous
+subluxate
+subluxation
+submaid
+submain
+submakroskelic
+submammary
+subman
+submanager
+submania
+submanic
+submanor
+submarginal
+submarginally
+submarginate
+submargined
+submarine
+submariner
+submarinism
+submarinist
+submarshal
+submaster
+submaxilla
+submaxillary
+submaximal
+submeaning
+submedial
+submedian
+submediant
+submediation
+submediocre
+submeeting
+submember
+submembranaceous
+submembranous
+submeningeal
+submental
+submentum
+submerge
+submerged
+submergement
+submergence
+submergibility
+submergible
+submerse
+submersed
+submersibility
+submersible
+submersion
+submetallic
+submeter
+submetering
+submicron
+submicroscopic
+submicroscopically
+submiliary
+submind
+subminimal
+subminister
+submiss
+submissible
+submission
+submissionist
+submissive
+submissively
+submissiveness
+submissly
+submissness
+submit
+submittal
+submittance
+submitter
+submittingly
+submolecule
+submonition
+submontagne
+submontane
+submontanely
+submontaneous
+submorphous
+submortgage
+submotive
+submountain
+submucosa
+submucosal
+submucous
+submucronate
+submultiple
+submundane
+submuriate
+submuscular
+Submytilacea
+subnarcotic
+subnasal
+subnascent
+subnatural
+subnect
+subnervian
+subness
+subneural
+subnex
+subnitrate
+subnitrated
+subniveal
+subnivean
+subnormal
+subnormality
+subnotation
+subnote
+subnotochordal
+subnubilar
+subnucleus
+subnude
+subnumber
+subnuvolar
+suboblique
+subobscure
+subobscurely
+subobtuse
+suboccipital
+subocean
+suboceanic
+suboctave
+suboctile
+suboctuple
+subocular
+suboesophageal
+suboffice
+subofficer
+subofficial
+subolive
+subopaque
+subopercle
+subopercular
+suboperculum
+subopposite
+suboptic
+suboptimal
+suboptimum
+suboral
+suborbicular
+suborbiculate
+suborbiculated
+suborbital
+suborbitar
+suborbitary
+subordain
+suborder
+subordinacy
+subordinal
+subordinary
+subordinate
+subordinately
+subordinateness
+subordinating
+subordinatingly
+subordination
+subordinationism
+subordinationist
+subordinative
+suborganic
+suborn
+subornation
+subornative
+suborner
+Suboscines
+suboval
+subovate
+subovated
+suboverseer
+subovoid
+suboxidation
+suboxide
+subpackage
+subpagoda
+subpallial
+subpalmate
+subpanel
+subparagraph
+subparallel
+subpart
+subpartition
+subpartitioned
+subpartitionment
+subparty
+subpass
+subpassage
+subpastor
+subpatron
+subpattern
+subpavement
+subpectinate
+subpectoral
+subpeduncle
+subpeduncular
+subpedunculate
+subpellucid
+subpeltate
+subpeltated
+subpentagonal
+subpentangular
+subpericardial
+subperiod
+subperiosteal
+subperiosteally
+subperitoneal
+subperitoneally
+subpermanent
+subpermanently
+subperpendicular
+subpetiolar
+subpetiolate
+subpharyngeal
+subphosphate
+subphratry
+subphrenic
+subphylar
+subphylum
+subpial
+subpilose
+subpimp
+subpiston
+subplacenta
+subplant
+subplantigrade
+subplat
+subpleural
+subplinth
+subplot
+subplow
+subpodophyllous
+subpoena
+subpoenal
+subpolar
+subpolygonal
+subpool
+subpopular
+subpopulation
+subporphyritic
+subport
+subpostmaster
+subpostmastership
+subpostscript
+subpotency
+subpotent
+subpreceptor
+subpreceptorial
+subpredicate
+subpredication
+subprefect
+subprefectorial
+subprefecture
+subprehensile
+subpress
+subprimary
+subprincipal
+subprior
+subprioress
+subproblem
+subproctor
+subproduct
+subprofessional
+subprofessor
+subprofessoriate
+subprofitable
+subproportional
+subprotector
+subprovince
+subprovincial
+subpubescent
+subpubic
+subpulmonary
+subpulverizer
+subpunch
+subpunctuation
+subpurchaser
+subpurlin
+subputation
+subpyramidal
+subpyriform
+subquadrangular
+subquadrate
+subquality
+subquestion
+subquinquefid
+subquintuple
+Subra
+subrace
+subradial
+subradiance
+subradiate
+subradical
+subradius
+subradular
+subrailway
+subrameal
+subramose
+subramous
+subrange
+subrational
+subreader
+subreason
+subrebellion
+subrectangular
+subrector
+subreference
+subregent
+subregion
+subregional
+subregular
+subreguli
+subregulus
+subrelation
+subreligion
+subreniform
+subrent
+subrepand
+subrepent
+subreport
+subreptary
+subreption
+subreptitious
+subreputable
+subresin
+subretinal
+subrhombic
+subrhomboid
+subrhomboidal
+subrictal
+subrident
+subridently
+subrigid
+subrision
+subrisive
+subrisory
+subrogate
+subrogation
+subroot
+subrostral
+subround
+subrule
+subruler
+subsacral
+subsale
+subsaline
+subsalt
+subsample
+subsartorial
+subsatiric
+subsatirical
+subsaturated
+subsaturation
+subscapular
+subscapularis
+subscapulary
+subschedule
+subscheme
+subschool
+subscience
+subscleral
+subsclerotic
+subscribable
+subscribe
+subscriber
+subscribership
+subscript
+subscription
+subscriptionist
+subscriptive
+subscriptively
+subscripture
+subscrive
+subscriver
+subsea
+subsecive
+subsecretarial
+subsecretary
+subsect
+subsection
+subsecurity
+subsecute
+subsecutive
+subsegment
+subsemifusa
+subsemitone
+subsensation
+subsensible
+subsensual
+subsensuous
+subsept
+subseptuple
+subsequence
+subsequency
+subsequent
+subsequential
+subsequentially
+subsequently
+subsequentness
+subseries
+subserosa
+subserous
+subserrate
+subserve
+subserviate
+subservience
+subserviency
+subservient
+subserviently
+subservientness
+subsessile
+subset
+subsewer
+subsextuple
+subshaft
+subsheriff
+subshire
+subshrub
+subshrubby
+subside
+subsidence
+subsidency
+subsident
+subsider
+subsidiarie
+subsidiarily
+subsidiariness
+subsidiary
+subsiding
+subsidist
+subsidizable
+subsidization
+subsidize
+subsidizer
+subsidy
+subsilicate
+subsilicic
+subsill
+subsimilation
+subsimious
+subsimple
+subsinuous
+subsist
+subsistence
+subsistency
+subsistent
+subsistential
+subsistingly
+subsizar
+subsizarship
+subsmile
+subsneer
+subsocial
+subsoil
+subsoiler
+subsolar
+subsolid
+subsonic
+subsorter
+subsovereign
+subspace
+subspatulate
+subspecialist
+subspecialize
+subspecialty
+subspecies
+subspecific
+subspecifically
+subsphenoidal
+subsphere
+subspherical
+subspherically
+subspinous
+subspiral
+subspontaneous
+subsquadron
+substage
+substalagmite
+substalagmitic
+substance
+substanceless
+substanch
+substandard
+substandardize
+substant
+substantiability
+substantial
+substantialia
+substantialism
+substantialist
+substantiality
+substantialize
+substantially
+substantialness
+substantiate
+substantiation
+substantiative
+substantiator
+substantify
+substantious
+substantival
+substantivally
+substantive
+substantively
+substantiveness
+substantivity
+substantivize
+substantize
+substation
+substernal
+substituent
+substitutable
+substitute
+substituted
+substituter
+substituting
+substitutingly
+substitution
+substitutional
+substitutionally
+substitutionary
+substitutive
+substitutively
+substock
+substoreroom
+substory
+substract
+substraction
+substratal
+substrate
+substrati
+substrative
+substrator
+substratose
+substratosphere
+substratospheric
+substratum
+substriate
+substruct
+substruction
+substructional
+substructural
+substructure
+substylar
+substyle
+subsulfid
+subsulfide
+subsulphate
+subsulphid
+subsulphide
+subsult
+subsultive
+subsultorily
+subsultorious
+subsultory
+subsultus
+subsumable
+subsume
+subsumption
+subsumptive
+subsuperficial
+subsurety
+subsurface
+subsyndicate
+subsynod
+subsynodical
+subsystem
+subtack
+subtacksman
+subtangent
+subtarget
+subtartarean
+subtectal
+subtegminal
+subtegulaneous
+subtemperate
+subtenancy
+subtenant
+subtend
+subtense
+subtenure
+subtepid
+subteraqueous
+subterbrutish
+subtercelestial
+subterconscious
+subtercutaneous
+subterethereal
+subterfluent
+subterfluous
+subterfuge
+subterhuman
+subterjacent
+subtermarine
+subterminal
+subternatural
+subterpose
+subterposition
+subterrane
+subterraneal
+subterranean
+subterraneanize
+subterraneanly
+subterraneous
+subterraneously
+subterraneousness
+subterranity
+subterraqueous
+subterrene
+subterrestrial
+subterritorial
+subterritory
+subtersensual
+subtersensuous
+subtersuperlative
+subtersurface
+subtertian
+subtext
+subthalamic
+subthalamus
+subthoracic
+subthrill
+subtile
+subtilely
+subtileness
+subtilin
+subtilism
+subtilist
+subtility
+subtilization
+subtilize
+subtilizer
+subtill
+subtillage
+subtilty
+subtitle
+subtitular
+subtle
+subtleness
+subtlety
+subtlist
+subtly
+subtone
+subtonic
+subtorrid
+subtotal
+subtotem
+subtower
+subtract
+subtracter
+subtraction
+subtractive
+subtrahend
+subtranslucent
+subtransparent
+subtransverse
+subtrapezoidal
+subtread
+subtreasurer
+subtreasurership
+subtreasury
+subtrench
+subtriangular
+subtriangulate
+subtribal
+subtribe
+subtribual
+subtrifid
+subtrigonal
+subtrihedral
+subtriplicate
+subtriplicated
+subtriquetrous
+subtrist
+subtrochanteric
+subtrochlear
+subtropic
+subtropical
+subtropics
+subtrousers
+subtrude
+subtruncate
+subtrunk
+subtuberant
+subtunic
+subtunnel
+subturbary
+subturriculate
+subturriculated
+subtutor
+subtwined
+subtype
+subtypical
+subulate
+subulated
+subulicorn
+Subulicornia
+subuliform
+subultimate
+subumbellate
+subumbonal
+subumbral
+subumbrella
+subumbrellar
+subuncinate
+subunequal
+subungual
+subunguial
+Subungulata
+subungulate
+subunit
+subuniverse
+suburb
+suburban
+suburbandom
+suburbanhood
+suburbanism
+suburbanite
+suburbanity
+suburbanization
+suburbanize
+suburbanly
+suburbed
+suburbia
+suburbican
+suburbicarian
+suburbicary
+suburethral
+subursine
+subvaginal
+subvaluation
+subvarietal
+subvariety
+subvassal
+subvassalage
+subvein
+subvendee
+subvene
+subvention
+subventionary
+subventioned
+subventionize
+subventitious
+subventive
+subventral
+subventricose
+subvermiform
+subversal
+subverse
+subversed
+subversion
+subversionary
+subversive
+subversivism
+subvert
+subvertebral
+subverter
+subvertible
+subvertical
+subverticillate
+subvesicular
+subvestment
+subvicar
+subvicarship
+subvillain
+subvirate
+subvirile
+subvisible
+subvitalized
+subvitreous
+subvocal
+subvola
+subwarden
+subwater
+subway
+subwealthy
+subweight
+subwink
+subworker
+subworkman
+subzonal
+subzone
+subzygomatic
+succade
+succedanea
+succedaneous
+succedaneum
+succedent
+succeed
+succeedable
+succeeder
+succeeding
+succeedingly
+succent
+succentor
+succenturiate
+succenturiation
+success
+successful
+successfully
+successfulness
+succession
+successional
+successionally
+successionist
+successionless
+successive
+successively
+successiveness
+successivity
+successless
+successlessly
+successlessness
+successor
+successoral
+successorship
+successory
+succi
+succin
+succinamate
+succinamic
+succinamide
+succinanil
+succinate
+succinct
+succinctly
+succinctness
+succinctorium
+succinctory
+succincture
+succinic
+succiniferous
+succinimide
+succinite
+succinoresinol
+succinosulphuric
+succinous
+succinyl
+Succisa
+succise
+succivorous
+succor
+succorable
+succorer
+succorful
+succorless
+succorrhea
+succory
+succotash
+succourful
+succourless
+succous
+succub
+succuba
+succubae
+succube
+succubine
+succubous
+succubus
+succula
+succulence
+succulency
+succulent
+succulently
+succulentness
+succulous
+succumb
+succumbence
+succumbency
+succumbent
+succumber
+succursal
+succuss
+succussation
+succussatory
+succussion
+succussive
+such
+suchlike
+suchness
+Suchos
+suchwise
+sucivilized
+suck
+suckable
+suckabob
+suckage
+suckauhock
+sucken
+suckener
+sucker
+suckerel
+suckerfish
+suckerlike
+suckfish
+suckhole
+sucking
+suckle
+suckler
+suckless
+suckling
+suckstone
+suclat
+sucramine
+sucrate
+sucre
+sucroacid
+sucrose
+suction
+suctional
+Suctoria
+suctorial
+suctorian
+suctorious
+sucupira
+sucuri
+sucuriu
+sucuruju
+sud
+sudadero
+sudamen
+sudamina
+sudaminal
+Sudan
+Sudanese
+Sudani
+Sudanian
+Sudanic
+sudarium
+sudary
+sudate
+sudation
+sudatorium
+sudatory
+Sudburian
+sudburite
+sudd
+sudden
+suddenly
+suddenness
+suddenty
+Sudder
+sudder
+suddle
+suddy
+Sudic
+sudiform
+sudoral
+sudoresis
+sudoric
+sudoriferous
+sudoriferousness
+sudorific
+sudoriparous
+sudorous
+Sudra
+suds
+sudsman
+sudsy
+Sue
+sue
+Suecism
+suede
+suer
+Suerre
+Suessiones
+suet
+suety
+Sueve
+Suevi
+Suevian
+Suevic
+Sufeism
+suff
+suffect
+suffection
+suffer
+sufferable
+sufferableness
+sufferably
+sufferance
+sufferer
+suffering
+sufferingly
+suffete
+suffice
+sufficeable
+sufficer
+sufficiency
+sufficient
+sufficiently
+sufficientness
+sufficing
+sufficingly
+sufficingness
+suffiction
+suffix
+suffixal
+suffixation
+suffixion
+suffixment
+sufflaminate
+sufflamination
+sufflate
+sufflation
+sufflue
+suffocate
+suffocating
+suffocatingly
+suffocation
+suffocative
+Suffolk
+suffragan
+suffraganal
+suffraganate
+suffragancy
+suffraganeous
+suffragatory
+suffrage
+suffragette
+suffragettism
+suffragial
+suffragism
+suffragist
+suffragistic
+suffragistically
+suffragitis
+suffrago
+suffrutescent
+suffrutex
+suffruticose
+suffruticous
+suffruticulose
+suffumigate
+suffumigation
+suffusable
+suffuse
+suffused
+suffusedly
+suffusion
+suffusive
+Sufi
+Sufiism
+Sufiistic
+Sufism
+Sufistic
+sugamo
+sugan
+sugar
+sugarberry
+sugarbird
+sugarbush
+sugared
+sugarelly
+sugarer
+sugarhouse
+sugariness
+sugarless
+sugarlike
+sugarplum
+sugarsweet
+sugarworks
+sugary
+sugent
+sugescent
+suggest
+suggestable
+suggestedness
+suggester
+suggestibility
+suggestible
+suggestibleness
+suggestibly
+suggesting
+suggestingly
+suggestion
+suggestionability
+suggestionable
+suggestionism
+suggestionist
+suggestionize
+suggestive
+suggestively
+suggestiveness
+suggestivity
+suggestment
+suggestress
+suggestum
+suggillate
+suggillation
+sugh
+sugi
+Sugih
+suguaro
+suhuaro
+Sui
+suicidal
+suicidalism
+suicidally
+suicidalwise
+suicide
+suicidical
+suicidism
+suicidist
+suid
+Suidae
+suidian
+suiform
+suilline
+suimate
+Suina
+suine
+suing
+suingly
+suint
+Suiogoth
+Suiogothic
+Suiones
+suisimilar
+suist
+suit
+suitability
+suitable
+suitableness
+suitably
+suitcase
+suite
+suithold
+suiting
+suitor
+suitoress
+suitorship
+suity
+suji
+Suk
+Sukey
+sukiyaki
+sukkenye
+Suku
+Sula
+Sulaba
+Sulafat
+Sulaib
+sulbasutra
+sulcal
+sulcalization
+sulcalize
+sulcar
+sulcate
+sulcated
+sulcation
+sulcatoareolate
+sulcatocostate
+sulcatorimose
+sulciform
+sulcomarginal
+sulcular
+sulculate
+sulculus
+sulcus
+suld
+sulea
+sulfa
+sulfacid
+sulfadiazine
+sulfaguanidine
+sulfamate
+sulfamerazin
+sulfamerazine
+sulfamethazine
+sulfamethylthiazole
+sulfamic
+sulfamidate
+sulfamide
+sulfamidic
+sulfamine
+sulfaminic
+sulfamyl
+sulfanilamide
+sulfanilic
+sulfanilylguanidine
+sulfantimonide
+sulfapyrazine
+sulfapyridine
+sulfaquinoxaline
+sulfarsenide
+sulfarsenite
+sulfarseniuret
+sulfarsphenamine
+Sulfasuxidine
+sulfatase
+sulfathiazole
+sulfatic
+sulfatize
+sulfato
+sulfazide
+sulfhydrate
+sulfhydric
+sulfhydryl
+sulfindigotate
+sulfindigotic
+sulfindylic
+sulfion
+sulfionide
+sulfoacid
+sulfoamide
+sulfobenzide
+sulfobenzoate
+sulfobenzoic
+sulfobismuthite
+sulfoborite
+sulfocarbamide
+sulfocarbimide
+sulfocarbolate
+sulfocarbolic
+sulfochloride
+sulfocyan
+sulfocyanide
+sulfofication
+sulfogermanate
+sulfohalite
+sulfohydrate
+sulfoindigotate
+sulfoleic
+sulfolysis
+sulfomethylic
+sulfonamic
+sulfonamide
+sulfonate
+sulfonation
+sulfonator
+sulfonephthalein
+sulfonethylmethane
+sulfonic
+sulfonium
+sulfonmethane
+sulfonyl
+sulfophthalein
+sulfopurpurate
+sulfopurpuric
+sulforicinate
+sulforicinic
+sulforicinoleate
+sulforicinoleic
+sulfoselenide
+sulfosilicide
+sulfostannide
+sulfotelluride
+sulfourea
+sulfovinate
+sulfovinic
+sulfowolframic
+sulfoxide
+sulfoxism
+sulfoxylate
+sulfoxylic
+sulfurage
+sulfuran
+sulfurate
+sulfuration
+sulfurator
+sulfurea
+sulfureous
+sulfureously
+sulfureousness
+sulfuret
+sulfuric
+sulfurization
+sulfurize
+sulfurosyl
+sulfurous
+sulfury
+sulfuryl
+Sulidae
+Sulides
+Suliote
+sulk
+sulka
+sulker
+sulkily
+sulkiness
+sulky
+sulkylike
+sull
+sulla
+sullage
+Sullan
+sullen
+sullenhearted
+sullenly
+sullenness
+sulliable
+sullow
+sully
+sulpha
+sulphacid
+sulphaldehyde
+sulphamate
+sulphamic
+sulphamidate
+sulphamide
+sulphamidic
+sulphamine
+sulphaminic
+sulphamino
+sulphammonium
+sulphamyl
+sulphanilate
+sulphanilic
+sulphantimonate
+sulphantimonial
+sulphantimonic
+sulphantimonide
+sulphantimonious
+sulphantimonite
+sulpharsenate
+sulpharseniate
+sulpharsenic
+sulpharsenide
+sulpharsenious
+sulpharsenite
+sulpharseniuret
+sulpharsphenamine
+sulphatase
+sulphate
+sulphated
+sulphatic
+sulphation
+sulphatization
+sulphatize
+sulphato
+sulphatoacetic
+sulphatocarbonic
+sulphazide
+sulphazotize
+sulphbismuthite
+sulphethylate
+sulphethylic
+sulphhemoglobin
+sulphichthyolate
+sulphidation
+sulphide
+sulphidic
+sulphidize
+sulphimide
+sulphinate
+sulphindigotate
+sulphine
+sulphinic
+sulphinide
+sulphinyl
+sulphitation
+sulphite
+sulphitic
+sulphmethemoglobin
+sulpho
+sulphoacetic
+sulphoamid
+sulphoamide
+sulphoantimonate
+sulphoantimonic
+sulphoantimonious
+sulphoantimonite
+sulphoarsenic
+sulphoarsenious
+sulphoarsenite
+sulphoazotize
+sulphobenzide
+sulphobenzoate
+sulphobenzoic
+sulphobismuthite
+sulphoborite
+sulphobutyric
+sulphocarbamic
+sulphocarbamide
+sulphocarbanilide
+sulphocarbimide
+sulphocarbolate
+sulphocarbolic
+sulphocarbonate
+sulphocarbonic
+sulphochloride
+sulphochromic
+sulphocinnamic
+sulphocyan
+sulphocyanate
+sulphocyanic
+sulphocyanide
+sulphocyanogen
+sulphodichloramine
+sulphofication
+sulphofy
+sulphogallic
+sulphogel
+sulphogermanate
+sulphogermanic
+sulphohalite
+sulphohaloid
+sulphohydrate
+sulphoichthyolate
+sulphoichthyolic
+sulphoindigotate
+sulphoindigotic
+sulpholeate
+sulpholeic
+sulpholipin
+sulpholysis
+sulphonal
+sulphonalism
+sulphonamic
+sulphonamide
+sulphonamido
+sulphonamine
+sulphonaphthoic
+sulphonate
+sulphonated
+sulphonation
+sulphonator
+sulphoncyanine
+sulphone
+sulphonephthalein
+sulphonethylmethane
+sulphonic
+sulphonium
+sulphonmethane
+sulphonphthalein
+sulphonyl
+sulphoparaldehyde
+sulphophosphate
+sulphophosphite
+sulphophosphoric
+sulphophosphorous
+sulphophthalein
+sulphophthalic
+sulphopropionic
+sulphoproteid
+sulphopupuric
+sulphopurpurate
+sulphoricinate
+sulphoricinic
+sulphoricinoleate
+sulphoricinoleic
+sulphosalicylic
+sulphoselenide
+sulphoselenium
+sulphosilicide
+sulphosol
+sulphostannate
+sulphostannic
+sulphostannide
+sulphostannite
+sulphostannous
+sulphosuccinic
+sulphosulphurous
+sulphotannic
+sulphotelluride
+sulphoterephthalic
+sulphothionyl
+sulphotoluic
+sulphotungstate
+sulphotungstic
+sulphourea
+sulphovanadate
+sulphovinate
+sulphovinic
+sulphowolframic
+sulphoxide
+sulphoxism
+sulphoxylate
+sulphoxylic
+sulphoxyphosphate
+sulphozincate
+sulphur
+sulphurage
+sulphuran
+sulphurate
+sulphuration
+sulphurator
+sulphurea
+sulphurean
+sulphureity
+sulphureonitrous
+sulphureosaline
+sulphureosuffused
+sulphureous
+sulphureously
+sulphureousness
+sulphureovirescent
+sulphuret
+sulphureted
+sulphuric
+sulphuriferous
+sulphurity
+sulphurization
+sulphurize
+sulphurless
+sulphurlike
+sulphurosyl
+sulphurous
+sulphurously
+sulphurousness
+sulphurproof
+sulphurweed
+sulphurwort
+sulphury
+sulphuryl
+sulphydrate
+sulphydric
+sulphydryl
+Sulpician
+sultam
+sultan
+sultana
+sultanaship
+sultanate
+sultane
+sultanesque
+sultaness
+sultanian
+sultanic
+sultanin
+sultanism
+sultanist
+sultanize
+sultanlike
+sultanry
+sultanship
+sultone
+sultrily
+sultriness
+sultry
+Sulu
+Suluan
+sulung
+sulvanite
+sulvasutra
+sum
+sumac
+Sumak
+Sumass
+Sumatra
+sumatra
+Sumatran
+sumbul
+sumbulic
+Sumdum
+Sumerian
+Sumerology
+Sumitro
+sumless
+sumlessness
+summability
+summable
+summage
+summand
+summar
+summarily
+summariness
+summarist
+summarization
+summarize
+summarizer
+summary
+summate
+summation
+summational
+summative
+summatory
+summed
+summer
+summerbird
+summercastle
+summerer
+summerhead
+summeriness
+summering
+summerings
+summerish
+summerite
+summerize
+summerland
+summerlay
+summerless
+summerlike
+summerliness
+summerling
+summerly
+summerproof
+summertide
+summertime
+summertree
+summerward
+summerwood
+summery
+summist
+summit
+summital
+summitless
+summity
+summon
+summonable
+summoner
+summoningly
+summons
+summula
+summulist
+summut
+sumner
+Sumo
+sump
+sumpage
+sumper
+sumph
+sumphish
+sumphishly
+sumphishness
+sumphy
+sumpit
+sumpitan
+sumple
+sumpman
+sumpsimus
+sumpter
+sumption
+sumptuary
+sumptuosity
+sumptuous
+sumptuously
+sumptuousness
+sun
+sunbeam
+sunbeamed
+sunbeamy
+sunberry
+sunbird
+sunblink
+sunbonnet
+sunbonneted
+sunbow
+sunbreak
+sunburn
+sunburned
+sunburnedness
+sunburnproof
+sunburnt
+sunburntness
+sunburst
+suncherchor
+suncup
+sundae
+Sundanese
+Sundanesian
+sundang
+Sundar
+Sundaresan
+sundari
+Sunday
+Sundayfied
+Sundayish
+Sundayism
+Sundaylike
+Sundayness
+Sundayproof
+sundek
+sunder
+sunderable
+sunderance
+sunderer
+sunderment
+sunderwise
+sundew
+sundial
+sundik
+sundog
+sundown
+sundowner
+sundowning
+sundra
+sundri
+sundries
+sundriesman
+sundrily
+sundriness
+sundrops
+sundry
+sundryman
+sune
+sunfall
+sunfast
+sunfish
+sunfisher
+sunfishery
+sunflower
+Sung
+sung
+sungha
+sunglade
+sunglass
+sunglo
+sunglow
+Sunil
+sunk
+sunken
+sunket
+sunkland
+sunlamp
+sunland
+sunless
+sunlessly
+sunlessness
+sunlet
+sunlight
+sunlighted
+sunlike
+sunlit
+sunn
+Sunna
+Sunni
+Sunniah
+sunnily
+sunniness
+Sunnism
+Sunnite
+sunnud
+sunny
+sunnyhearted
+sunnyheartedness
+sunproof
+sunquake
+sunray
+sunrise
+sunrising
+sunroom
+sunscald
+sunset
+sunsetting
+sunsetty
+sunshade
+sunshine
+sunshineless
+sunshining
+sunshiny
+sunsmit
+sunsmitten
+sunspot
+sunspotted
+sunspottedness
+sunspottery
+sunspotty
+sunsquall
+sunstone
+sunstricken
+sunstroke
+sunt
+sunup
+sunward
+sunwards
+sunway
+sunways
+sunweed
+sunwise
+sunyie
+Suomi
+Suomic
+suovetaurilia
+sup
+supa
+Supai
+supari
+supawn
+supe
+supellex
+super
+superabduction
+superabhor
+superability
+superable
+superableness
+superably
+superabnormal
+superabominable
+superabomination
+superabound
+superabstract
+superabsurd
+superabundance
+superabundancy
+superabundant
+superabundantly
+superaccession
+superaccessory
+superaccommodating
+superaccomplished
+superaccrue
+superaccumulate
+superaccumulation
+superaccurate
+superacetate
+superachievement
+superacid
+superacidulated
+superacknowledgment
+superacquisition
+superacromial
+superactive
+superactivity
+superacute
+superadaptable
+superadd
+superaddition
+superadditional
+superadequate
+superadequately
+superadjacent
+superadministration
+superadmirable
+superadmiration
+superadorn
+superadornment
+superaerial
+superaesthetical
+superaffiliation
+superaffiuence
+superagency
+superaggravation
+superagitation
+superagrarian
+superalbal
+superalbuminosis
+superalimentation
+superalkaline
+superalkalinity
+superallowance
+superaltar
+superaltern
+superambitious
+superambulacral
+superanal
+superangelic
+superangelical
+superanimal
+superannuate
+superannuation
+superannuitant
+superannuity
+superapology
+superappreciation
+superaqueous
+superarbiter
+superarbitrary
+superarctic
+superarduous
+superarrogant
+superarseniate
+superartificial
+superartificially
+superaspiration
+superassertion
+superassociate
+superassume
+superastonish
+superastonishment
+superattachment
+superattainable
+superattendant
+superattraction
+superattractive
+superauditor
+superaural
+superaverage
+superavit
+superaward
+superaxillary
+superazotation
+superb
+superbelief
+superbeloved
+superbenefit
+superbenevolent
+superbenign
+superbias
+superbious
+superbity
+superblessed
+superblunder
+superbly
+superbness
+superbold
+superborrow
+superbrain
+superbrave
+superbrute
+superbuild
+superbungalow
+superbusy
+supercabinet
+supercalender
+supercallosal
+supercandid
+supercanine
+supercanonical
+supercanonization
+supercanopy
+supercapable
+supercaption
+supercarbonate
+supercarbonization
+supercarbonize
+supercarbureted
+supercargo
+supercargoship
+supercarpal
+supercatastrophe
+supercatholic
+supercausal
+supercaution
+supercelestial
+supercensure
+supercentral
+supercentrifuge
+supercerebellar
+supercerebral
+superceremonious
+supercharge
+supercharged
+supercharger
+superchemical
+superchivalrous
+superciliary
+superciliosity
+supercilious
+superciliously
+superciliousness
+supercilium
+supercivil
+supercivilization
+supercivilized
+superclaim
+superclass
+superclassified
+supercloth
+supercoincidence
+supercolossal
+supercolumnar
+supercolumniation
+supercombination
+supercombing
+supercommendation
+supercommentary
+supercommentator
+supercommercial
+supercompetition
+supercomplete
+supercomplex
+supercomprehension
+supercompression
+superconception
+superconductive
+superconductivity
+superconductor
+superconfident
+superconfirmation
+superconformable
+superconformist
+superconformity
+superconfusion
+supercongestion
+superconscious
+superconsciousness
+superconsecrated
+superconsequency
+superconservative
+superconstitutional
+supercontest
+supercontribution
+supercontrol
+supercool
+supercordial
+supercorporation
+supercow
+supercredit
+supercrescence
+supercrescent
+supercrime
+supercritic
+supercritical
+supercrowned
+supercrust
+supercube
+supercultivated
+supercurious
+supercycle
+supercynical
+superdainty
+superdanger
+superdebt
+superdeclamatory
+superdecoration
+superdeficit
+superdeity
+superdejection
+superdelegate
+superdelicate
+superdemand
+superdemocratic
+superdemonic
+superdemonstration
+superdensity
+superdeposit
+superdesirous
+superdevelopment
+superdevilish
+superdevotion
+superdiabolical
+superdiabolically
+superdicrotic
+superdifficult
+superdiplomacy
+superdirection
+superdiscount
+superdistention
+superdistribution
+superdividend
+superdivine
+superdivision
+superdoctor
+superdominant
+superdomineering
+superdonation
+superdose
+superdramatist
+superdreadnought
+superdubious
+superduplication
+superdural
+superdying
+superearthly
+supereconomy
+superedification
+superedify
+supereducation
+supereffective
+supereffluence
+supereffluently
+superego
+superelaborate
+superelastic
+superelated
+superelegance
+superelementary
+superelevated
+superelevation
+supereligible
+supereloquent
+supereminence
+supereminency
+supereminent
+supereminently
+superemphasis
+superemphasize
+superendorse
+superendorsement
+superendow
+superenergetic
+superenforcement
+superengrave
+superenrollment
+superepic
+superepoch
+superequivalent
+supererogant
+supererogantly
+supererogate
+supererogation
+supererogative
+supererogator
+supererogatorily
+supererogatory
+superespecial
+superessential
+superessentially
+superestablish
+superestablishment
+supereternity
+superether
+superethical
+superethmoidal
+superevangelical
+superevident
+superexacting
+superexalt
+superexaltation
+superexaminer
+superexceed
+superexceeding
+superexcellence
+superexcellency
+superexcellent
+superexcellently
+superexceptional
+superexcitation
+superexcited
+superexcitement
+superexcrescence
+superexert
+superexertion
+superexiguity
+superexist
+superexistent
+superexpand
+superexpansion
+superexpectation
+superexpenditure
+superexplicit
+superexport
+superexpressive
+superexquisite
+superexquisitely
+superexquisiteness
+superextend
+superextension
+superextol
+superextreme
+superfamily
+superfantastic
+superfarm
+superfat
+superfecundation
+superfecundity
+superfee
+superfeminine
+superfervent
+superfetate
+superfetation
+superfeudation
+superfibrination
+superficial
+superficialism
+superficialist
+superficiality
+superficialize
+superficially
+superficialness
+superficiary
+superficies
+superfidel
+superfinance
+superfine
+superfinical
+superfinish
+superfinite
+superfissure
+superfit
+superfix
+superfleet
+superflexion
+superfluent
+superfluid
+superfluitance
+superfluity
+superfluous
+superfluously
+superfluousness
+superflux
+superfoliaceous
+superfoliation
+superfolly
+superformal
+superformation
+superformidable
+superfortunate
+superfriendly
+superfrontal
+superfructified
+superfulfill
+superfulfillment
+superfunction
+superfunctional
+superfuse
+superfusibility
+superfusible
+superfusion
+supergaiety
+supergallant
+supergene
+supergeneric
+supergenerosity
+supergenerous
+supergenual
+supergiant
+superglacial
+superglorious
+superglottal
+supergoddess
+supergoodness
+supergovern
+supergovernment
+supergraduate
+supergrant
+supergratification
+supergratify
+supergravitate
+supergravitation
+superguarantee
+supergun
+superhandsome
+superhearty
+superheat
+superheater
+superheresy
+superhero
+superheroic
+superhet
+superheterodyne
+superhighway
+superhirudine
+superhistoric
+superhistorical
+superhive
+superhuman
+superhumanity
+superhumanize
+superhumanly
+superhumanness
+superhumeral
+superhypocrite
+superideal
+superignorant
+superillustrate
+superillustration
+superimpend
+superimpending
+superimpersonal
+superimply
+superimportant
+superimposable
+superimpose
+superimposed
+superimposition
+superimposure
+superimpregnated
+superimpregnation
+superimprobable
+superimproved
+superincentive
+superinclination
+superinclusive
+superincomprehensible
+superincrease
+superincumbence
+superincumbency
+superincumbent
+superincumbently
+superindependent
+superindiction
+superindifference
+superindifferent
+superindignant
+superindividual
+superindividualism
+superindividualist
+superinduce
+superinducement
+superinduct
+superinduction
+superindulgence
+superindulgent
+superindustrious
+superindustry
+superinenarrable
+superinfection
+superinfer
+superinference
+superinfeudation
+superinfinite
+superinfinitely
+superinfirmity
+superinfluence
+superinformal
+superinfuse
+superinfusion
+superingenious
+superingenuity
+superinitiative
+superinjustice
+superinnocent
+superinquisitive
+superinsaniated
+superinscription
+superinsist
+superinsistence
+superinsistent
+superinstitute
+superinstitution
+superintellectual
+superintend
+superintendence
+superintendency
+superintendent
+superintendential
+superintendentship
+superintender
+superintense
+superintolerable
+superinundation
+superior
+superioress
+superiority
+superiorly
+superiorness
+superiorship
+superirritability
+superius
+superjacent
+superjudicial
+superjurisdiction
+superjustification
+superknowledge
+superlabial
+superlaborious
+superlactation
+superlapsarian
+superlaryngeal
+superlation
+superlative
+superlatively
+superlativeness
+superlenient
+superlie
+superlikelihood
+superline
+superlocal
+superlogical
+superloyal
+superlucky
+superlunary
+superlunatical
+superluxurious
+supermagnificent
+supermagnificently
+supermalate
+superman
+supermanhood
+supermanifest
+supermanism
+supermanliness
+supermanly
+supermannish
+supermarginal
+supermarine
+supermarket
+supermarvelous
+supermasculine
+supermaterial
+supermathematical
+supermaxilla
+supermaxillary
+supermechanical
+supermedial
+supermedicine
+supermediocre
+supermental
+supermentality
+supermetropolitan
+supermilitary
+supermishap
+supermixture
+supermodest
+supermoisten
+supermolten
+supermoral
+supermorose
+supermunicipal
+supermuscan
+supermystery
+supernacular
+supernaculum
+supernal
+supernalize
+supernally
+supernatant
+supernatation
+supernation
+supernational
+supernationalism
+supernatural
+supernaturaldom
+supernaturalism
+supernaturalist
+supernaturality
+supernaturalize
+supernaturally
+supernaturalness
+supernature
+supernecessity
+supernegligent
+supernormal
+supernormally
+supernormalness
+supernotable
+supernova
+supernumeral
+supernumerariness
+supernumerary
+supernumeraryship
+supernumerous
+supernutrition
+superoanterior
+superobedience
+superobedient
+superobese
+superobject
+superobjection
+superobjectionable
+superobligation
+superobstinate
+superoccipital
+superoctave
+superocular
+superodorsal
+superoexternal
+superoffensive
+superofficious
+superofficiousness
+superofrontal
+superointernal
+superolateral
+superomedial
+superoposterior
+superopposition
+superoptimal
+superoptimist
+superoratorical
+superorbital
+superordain
+superorder
+superordinal
+superordinary
+superordinate
+superordination
+superorganic
+superorganism
+superorganization
+superorganize
+superornament
+superornamental
+superosculate
+superoutput
+superoxalate
+superoxide
+superoxygenate
+superoxygenation
+superparamount
+superparasite
+superparasitic
+superparasitism
+superparliamentary
+superpassage
+superpatient
+superpatriotic
+superpatriotism
+superperfect
+superperfection
+superperson
+superpersonal
+superpersonalism
+superpetrosal
+superphlogisticate
+superphlogistication
+superphosphate
+superphysical
+superpigmentation
+superpious
+superplausible
+superplease
+superplus
+superpolite
+superpolitic
+superponderance
+superponderancy
+superponderant
+superpopulation
+superposable
+superpose
+superposed
+superposition
+superpositive
+superpower
+superpowered
+superpraise
+superprecarious
+superprecise
+superprelatical
+superpreparation
+superprinting
+superprobability
+superproduce
+superproduction
+superproportion
+superprosperous
+superpublicity
+superpure
+superpurgation
+superquadrupetal
+superqualify
+superquote
+superradical
+superrational
+superrationally
+superreaction
+superrealism
+superrealist
+superrefine
+superrefined
+superrefinement
+superreflection
+superreform
+superreformation
+superregal
+superregeneration
+superregenerative
+superregistration
+superregulation
+superreliance
+superremuneration
+superrenal
+superrequirement
+superrespectable
+superresponsible
+superrestriction
+superreward
+superrheumatized
+superrighteous
+superromantic
+superroyal
+supersacerdotal
+supersacral
+supersacred
+supersacrifice
+supersafe
+supersagacious
+supersaint
+supersaintly
+supersalesman
+supersaliency
+supersalient
+supersalt
+supersanction
+supersanguine
+supersanity
+supersarcastic
+supersatisfaction
+supersatisfy
+supersaturate
+supersaturation
+superscandal
+superscholarly
+superscientific
+superscribe
+superscript
+superscription
+superscrive
+superseaman
+supersecret
+supersecretion
+supersecular
+supersecure
+supersedable
+supersede
+supersedeas
+supersedence
+superseder
+supersedure
+superselect
+superseminate
+supersemination
+superseminator
+supersensible
+supersensibly
+supersensitive
+supersensitiveness
+supersensitization
+supersensory
+supersensual
+supersensualism
+supersensualist
+supersensualistic
+supersensuality
+supersensually
+supersensuous
+supersensuousness
+supersentimental
+superseptal
+superseptuaginarian
+superseraphical
+superserious
+superservice
+superserviceable
+superserviceableness
+superserviceably
+supersesquitertial
+supersession
+supersessive
+supersevere
+supershipment
+supersignificant
+supersilent
+supersimplicity
+supersimplify
+supersincerity
+supersingular
+supersistent
+supersize
+supersmart
+supersocial
+supersoil
+supersolar
+supersolemn
+supersolemness
+supersolemnity
+supersolemnly
+supersolicit
+supersolicitation
+supersolid
+supersonant
+supersonic
+supersovereign
+supersovereignty
+superspecialize
+superspecies
+superspecification
+supersphenoid
+supersphenoidal
+superspinous
+superspiritual
+superspirituality
+supersquamosal
+superstage
+superstamp
+superstandard
+superstate
+superstatesman
+superstimulate
+superstimulation
+superstition
+superstitionist
+superstitionless
+superstitious
+superstitiously
+superstitiousness
+superstoical
+superstrain
+superstrata
+superstratum
+superstrenuous
+superstrict
+superstrong
+superstruct
+superstruction
+superstructor
+superstructory
+superstructural
+superstructure
+superstuff
+superstylish
+supersublimated
+supersuborder
+supersubsist
+supersubstantial
+supersubstantiality
+supersubstantiate
+supersubtilized
+supersubtle
+supersufficiency
+supersufficient
+supersulcus
+supersulphate
+supersulphuret
+supersulphureted
+supersulphurize
+supersuperabundance
+supersuperabundant
+supersuperabundantly
+supersuperb
+supersuperior
+supersupremacy
+supersupreme
+supersurprise
+supersuspicious
+supersweet
+supersympathy
+supersyndicate
+supersystem
+supertare
+supertartrate
+supertax
+supertaxation
+supertemporal
+supertempt
+supertemptation
+supertension
+superterranean
+superterraneous
+superterrene
+superterrestrial
+superthankful
+superthorough
+superthyroidism
+supertoleration
+supertonic
+supertotal
+supertower
+supertragic
+supertragical
+supertrain
+supertramp
+supertranscendent
+supertranscendently
+supertreason
+supertrivial
+supertuchun
+supertunic
+supertutelary
+superugly
+superultrafrostified
+superunfit
+superunit
+superunity
+superuniversal
+superuniverse
+superurgent
+supervalue
+supervast
+supervene
+supervenience
+supervenient
+supervenosity
+supervention
+supervestment
+supervexation
+supervictorious
+supervigilant
+supervigorous
+supervirulent
+supervisal
+supervisance
+supervise
+supervision
+supervisionary
+supervisive
+supervisor
+supervisorial
+supervisorship
+supervisory
+supervisual
+supervisure
+supervital
+supervive
+supervolition
+supervoluminous
+supervolute
+superwager
+superwealthy
+superweening
+superwise
+superwoman
+superworldly
+superwrought
+superyacht
+superzealous
+supinate
+supination
+supinator
+supine
+supinely
+supineness
+suppedaneum
+supper
+suppering
+supperless
+suppertime
+supperwards
+supping
+supplace
+supplant
+supplantation
+supplanter
+supplantment
+supple
+supplejack
+supplely
+supplement
+supplemental
+supplementally
+supplementarily
+supplementary
+supplementation
+supplementer
+suppleness
+suppletion
+suppletive
+suppletively
+suppletorily
+suppletory
+suppliable
+supplial
+suppliance
+suppliancy
+suppliant
+suppliantly
+suppliantness
+supplicancy
+supplicant
+supplicantly
+supplicat
+supplicate
+supplicating
+supplicatingly
+supplication
+supplicationer
+supplicative
+supplicator
+supplicatory
+supplicavit
+supplice
+supplier
+suppling
+supply
+support
+supportability
+supportable
+supportableness
+supportably
+supportance
+supporter
+supportful
+supporting
+supportingly
+supportive
+supportless
+supportlessly
+supportress
+supposable
+supposableness
+supposably
+supposal
+suppose
+supposed
+supposedly
+supposer
+supposing
+supposition
+suppositional
+suppositionally
+suppositionary
+suppositionless
+suppositious
+supposititious
+supposititiously
+supposititiousness
+suppositive
+suppositively
+suppository
+suppositum
+suppost
+suppress
+suppressal
+suppressed
+suppressedly
+suppresser
+suppressible
+suppression
+suppressionist
+suppressive
+suppressively
+suppressor
+supprise
+suppurant
+suppurate
+suppuration
+suppurative
+suppuratory
+suprabasidorsal
+suprabranchial
+suprabuccal
+supracaecal
+supracargo
+supracaudal
+supracensorious
+supracentenarian
+suprachorioid
+suprachorioidal
+suprachorioidea
+suprachoroid
+suprachoroidal
+suprachoroidea
+supraciliary
+supraclavicle
+supraclavicular
+supraclusion
+supracommissure
+supraconduction
+supraconductor
+supracondylar
+supracondyloid
+supraconscious
+supraconsciousness
+supracoralline
+supracostal
+supracoxal
+supracranial
+supracretaceous
+supradecompound
+supradental
+supradorsal
+supradural
+suprafeminine
+suprafine
+suprafoliaceous
+suprafoliar
+supraglacial
+supraglenoid
+supraglottic
+supragovernmental
+suprahepatic
+suprahistorical
+suprahuman
+suprahumanity
+suprahyoid
+suprailiac
+suprailium
+supraintellectual
+suprainterdorsal
+suprajural
+supralabial
+supralapsarian
+supralapsarianism
+supralateral
+supralegal
+supraliminal
+supraliminally
+supralineal
+supralinear
+supralocal
+supralocally
+supraloral
+supralunar
+supralunary
+supramammary
+supramarginal
+supramarine
+supramastoid
+supramaxilla
+supramaxillary
+supramaximal
+suprameatal
+supramechanical
+supramedial
+supramental
+supramolecular
+supramoral
+supramortal
+supramundane
+supranasal
+supranational
+supranatural
+supranaturalism
+supranaturalist
+supranaturalistic
+supranature
+supranervian
+supraneural
+supranormal
+supranuclear
+supraoccipital
+supraocclusion
+supraocular
+supraoesophagal
+supraoesophageal
+supraoptimal
+supraoptional
+supraoral
+supraorbital
+supraorbitar
+supraordinary
+supraordinate
+supraordination
+suprapapillary
+suprapedal
+suprapharyngeal
+supraposition
+supraprotest
+suprapubian
+suprapubic
+suprapygal
+supraquantivalence
+supraquantivalent
+suprarational
+suprarationalism
+suprarationality
+suprarenal
+suprarenalectomize
+suprarenalectomy
+suprarenalin
+suprarenine
+suprarimal
+suprasaturate
+suprascapula
+suprascapular
+suprascapulary
+suprascript
+suprasegmental
+suprasensible
+suprasensitive
+suprasensual
+suprasensuous
+supraseptal
+suprasolar
+suprasoriferous
+suprasphanoidal
+supraspinal
+supraspinate
+supraspinatus
+supraspinous
+suprasquamosal
+suprastandard
+suprastapedial
+suprastate
+suprasternal
+suprastigmal
+suprasubtle
+supratemporal
+supraterraneous
+supraterrestrial
+suprathoracic
+supratonsillar
+supratrochlear
+supratropical
+supratympanic
+supravaginal
+supraventricular
+supraversion
+supravital
+supraworld
+supremacy
+suprematism
+supreme
+supremely
+supremeness
+supremity
+sur
+sura
+suraddition
+surah
+surahi
+sural
+suralimentation
+suranal
+surangular
+surat
+surbase
+surbased
+surbasement
+surbate
+surbater
+surbed
+surcease
+surcharge
+surcharger
+surcingle
+surcoat
+surcrue
+surculi
+surculigerous
+surculose
+surculous
+surculus
+surd
+surdation
+surdeline
+surdent
+surdimutism
+surdity
+surdomute
+sure
+surely
+sureness
+sures
+Suresh
+surette
+surety
+suretyship
+surexcitation
+surf
+surface
+surfaced
+surfacedly
+surfaceless
+surfacely
+surfaceman
+surfacer
+surfacing
+surfactant
+surfacy
+surfbird
+surfboard
+surfboarding
+surfboat
+surfboatman
+surfeit
+surfeiter
+surfer
+surficial
+surfle
+surflike
+surfman
+surfmanship
+surfrappe
+surfuse
+surfusion
+surfy
+surge
+surgeful
+surgeless
+surgent
+surgeon
+surgeoncy
+surgeoness
+surgeonfish
+surgeonless
+surgeonship
+surgeproof
+surgerize
+surgery
+surgical
+surgically
+surginess
+surging
+surgy
+Suriana
+Surianaceae
+Suricata
+suricate
+suriga
+Surinam
+surinamine
+surlily
+surliness
+surly
+surma
+surmark
+surmaster
+surmisable
+surmisal
+surmisant
+surmise
+surmised
+surmisedly
+surmiser
+surmount
+surmountable
+surmountableness
+surmountal
+surmounted
+surmounter
+surmullet
+surname
+surnamer
+surnap
+surnay
+surnominal
+surpass
+surpassable
+surpasser
+surpassing
+surpassingly
+surpassingness
+surpeopled
+surplice
+surpliced
+surplicewise
+surplician
+surplus
+surplusage
+surpreciation
+surprint
+surprisable
+surprisal
+surprise
+surprisedly
+surprisement
+surpriseproof
+surpriser
+surprising
+surprisingly
+surprisingness
+surquedry
+surquidry
+surquidy
+surra
+surrealism
+surrealist
+surrealistic
+surrealistically
+surrebound
+surrebut
+surrebuttal
+surrebutter
+surrection
+surrejoin
+surrejoinder
+surrenal
+surrender
+surrenderee
+surrenderer
+surrenderor
+surreption
+surreptitious
+surreptitiously
+surreptitiousness
+surreverence
+surreverently
+surrey
+surrogacy
+surrogate
+surrogateship
+surrogation
+surrosion
+surround
+surrounded
+surroundedly
+surrounder
+surrounding
+surroundings
+sursaturation
+sursolid
+sursumduction
+sursumvergence
+sursumversion
+surtax
+surtout
+surturbrand
+surveillance
+surveillant
+survey
+surveyable
+surveyage
+surveyal
+surveyance
+surveying
+surveyor
+surveyorship
+survigrous
+survivability
+survivable
+survival
+survivalism
+survivalist
+survivance
+survivancy
+survive
+surviver
+surviving
+survivor
+survivoress
+survivorship
+Surya
+Sus
+Susan
+Susanchite
+Susanna
+Susanne
+susannite
+suscept
+susceptance
+susceptibility
+susceptible
+susceptibleness
+susceptibly
+susception
+susceptive
+susceptiveness
+susceptivity
+susceptor
+suscitate
+suscitation
+susi
+Susian
+Susianian
+Susie
+suslik
+susotoxin
+suspect
+suspectable
+suspected
+suspectedness
+suspecter
+suspectful
+suspectfulness
+suspectible
+suspectless
+suspector
+suspend
+suspended
+suspender
+suspenderless
+suspenders
+suspendibility
+suspendible
+suspensation
+suspense
+suspenseful
+suspensely
+suspensibility
+suspensible
+suspension
+suspensive
+suspensively
+suspensiveness
+suspensoid
+suspensor
+suspensorial
+suspensorium
+suspensory
+suspercollate
+suspicion
+suspicionable
+suspicional
+suspicionful
+suspicionless
+suspicious
+suspiciously
+suspiciousness
+suspiration
+suspiratious
+suspirative
+suspire
+suspirious
+Susquehanna
+Sussex
+sussexite
+Sussexman
+sussultatory
+sussultorial
+sustain
+sustainable
+sustained
+sustainer
+sustaining
+sustainingly
+sustainment
+sustanedly
+sustenance
+sustenanceless
+sustentacula
+sustentacular
+sustentaculum
+sustentation
+sustentational
+sustentative
+sustentator
+sustention
+sustentive
+sustentor
+Susu
+susu
+Susuhunan
+Susuidae
+Susumu
+susurr
+susurrant
+susurrate
+susurration
+susurringly
+susurrous
+susurrus
+Sutaio
+suterbery
+suther
+Sutherlandia
+sutile
+sutler
+sutlerage
+sutleress
+sutlership
+sutlery
+Suto
+sutor
+sutorial
+sutorian
+sutorious
+sutra
+Suttapitaka
+suttee
+sutteeism
+sutten
+suttin
+suttle
+Sutu
+sutural
+suturally
+suturation
+suture
+Suu
+suum
+Suwandi
+suwarro
+suwe
+Suyog
+suz
+Suzan
+Suzanne
+suzerain
+suzeraine
+suzerainship
+suzerainty
+Suzy
+Svan
+Svanetian
+Svanish
+Svante
+Svantovit
+svarabhakti
+svarabhaktic
+Svarloka
+svelte
+Svetambara
+sviatonosite
+swa
+Swab
+swab
+swabber
+swabberly
+swabble
+Swabian
+swack
+swacken
+swacking
+swad
+swaddle
+swaddlebill
+swaddler
+swaddling
+swaddy
+Swadeshi
+Swadeshism
+swag
+swagbellied
+swagbelly
+swage
+swager
+swagger
+swaggerer
+swaggering
+swaggeringly
+swaggie
+swaggy
+swaglike
+swagman
+swagsman
+Swahilese
+Swahili
+Swahilian
+Swahilize
+swaimous
+swain
+swainish
+swainishness
+swainship
+Swainsona
+swainsona
+swaird
+swale
+swaler
+swaling
+swalingly
+swallet
+swallo
+swallow
+swallowable
+swallower
+swallowlike
+swallowling
+swallowpipe
+swallowtail
+swallowwort
+swam
+swami
+swamp
+swampable
+swampberry
+swamper
+swampish
+swampishness
+swampland
+swampside
+swampweed
+swampwood
+swampy
+Swamy
+swan
+swandown
+swanflower
+swang
+swangy
+swanherd
+swanhood
+swanimote
+swank
+swanker
+swankily
+swankiness
+swanking
+swanky
+swanlike
+swanmark
+swanmarker
+swanmarking
+swanneck
+swannecked
+swanner
+swannery
+swannish
+swanny
+swanskin
+Swantevit
+swanweed
+swanwort
+swap
+swape
+swapper
+swapping
+swaraj
+swarajism
+swarajist
+swarbie
+sward
+swardy
+sware
+swarf
+swarfer
+swarm
+swarmer
+swarming
+swarmy
+swarry
+swart
+swartback
+swarth
+swarthily
+swarthiness
+swarthness
+swarthy
+swartish
+swartly
+swartness
+swartrutter
+swartrutting
+swarty
+Swartzbois
+Swartzia
+swarve
+swash
+swashbuckle
+swashbuckler
+swashbucklerdom
+swashbucklering
+swashbucklery
+swashbuckling
+swasher
+swashing
+swashway
+swashwork
+swashy
+swastika
+swastikaed
+Swat
+swat
+swatch
+Swatchel
+swatcher
+swatchway
+swath
+swathable
+swathband
+swathe
+swatheable
+swather
+swathy
+Swati
+Swatow
+swatter
+swattle
+swaver
+sway
+swayable
+swayed
+swayer
+swayful
+swaying
+swayingly
+swayless
+Swazi
+Swaziland
+sweal
+sweamish
+swear
+swearer
+swearingly
+swearword
+sweat
+sweatband
+sweatbox
+sweated
+sweater
+sweatful
+sweath
+sweatily
+sweatiness
+sweating
+sweatless
+sweatproof
+sweatshop
+sweatweed
+sweaty
+Swede
+Swedenborgian
+Swedenborgianism
+Swedenborgism
+swedge
+Swedish
+sweeny
+sweep
+sweepable
+sweepage
+sweepback
+sweepboard
+sweepdom
+sweeper
+sweeperess
+sweepforward
+sweeping
+sweepingly
+sweepingness
+sweepings
+sweepstake
+sweepwasher
+sweepwashings
+sweepy
+sweer
+sweered
+sweet
+sweetberry
+sweetbread
+sweetbrier
+sweetbriery
+sweeten
+sweetener
+sweetening
+sweetfish
+sweetful
+sweetheart
+sweetheartdom
+sweethearted
+sweetheartedness
+sweethearting
+sweetheartship
+sweetie
+sweeting
+sweetish
+sweetishly
+sweetishness
+sweetleaf
+sweetless
+sweetlike
+sweetling
+sweetly
+sweetmaker
+sweetmeat
+sweetmouthed
+sweetness
+sweetroot
+sweetshop
+sweetsome
+sweetsop
+sweetwater
+sweetweed
+sweetwood
+sweetwort
+sweety
+swego
+swelchie
+swell
+swellage
+swelldom
+swelldoodle
+swelled
+sweller
+swellfish
+swelling
+swellish
+swellishness
+swellmobsman
+swellness
+swelltoad
+swelly
+swelp
+swelt
+swelter
+sweltering
+swelteringly
+swelth
+sweltry
+swelty
+swep
+swept
+swerd
+Swertia
+swerve
+swerveless
+swerver
+swervily
+swick
+swidge
+Swietenia
+swift
+swiften
+swifter
+swiftfoot
+swiftlet
+swiftlike
+swiftness
+swifty
+swig
+swigger
+swiggle
+swile
+swill
+swillbowl
+swiller
+swilltub
+swim
+swimmable
+swimmer
+swimmeret
+swimmily
+swimminess
+swimming
+swimmingly
+swimmingness
+swimmist
+swimmy
+swimsuit
+swimy
+Swinburnesque
+Swinburnian
+swindle
+swindleable
+swindledom
+swindler
+swindlership
+swindlery
+swindling
+swindlingly
+swine
+swinebread
+swinecote
+swinehead
+swineherd
+swineherdship
+swinehood
+swinehull
+swinelike
+swinely
+swinepipe
+swinery
+swinestone
+swinesty
+swiney
+swing
+swingable
+swingback
+swingdevil
+swingdingle
+swinge
+swingeing
+swinger
+swinging
+swingingly
+Swingism
+swingle
+swinglebar
+swingletail
+swingletree
+swingstock
+swingtree
+swingy
+swinish
+swinishly
+swinishness
+swink
+swinney
+swipe
+swiper
+swipes
+swiple
+swipper
+swipy
+swird
+swire
+swirl
+swirlingly
+swirly
+swirring
+swish
+swisher
+swishing
+swishingly
+swishy
+Swiss
+swiss
+Swissess
+swissing
+switch
+switchback
+switchbacker
+switchboard
+switched
+switchel
+switcher
+switchgear
+switching
+switchkeeper
+switchlike
+switchman
+switchy
+switchyard
+swith
+swithe
+swithen
+swither
+Swithin
+Switzer
+Switzeress
+swivel
+swiveled
+swiveleye
+swiveleyed
+swivellike
+swivet
+swivetty
+swiz
+swizzle
+swizzler
+swob
+swollen
+swollenly
+swollenness
+swom
+swonken
+swoon
+swooned
+swooning
+swooningly
+swoony
+swoop
+swooper
+swoosh
+sword
+swordbill
+swordcraft
+swordfish
+swordfisherman
+swordfishery
+swordfishing
+swordick
+swording
+swordless
+swordlet
+swordlike
+swordmaker
+swordmaking
+swordman
+swordmanship
+swordplay
+swordplayer
+swordproof
+swordsman
+swordsmanship
+swordsmith
+swordster
+swordstick
+swordswoman
+swordtail
+swordweed
+swore
+sworn
+swosh
+swot
+swotter
+swounds
+swow
+swum
+swung
+swungen
+swure
+syagush
+sybarism
+sybarist
+Sybarital
+Sybaritan
+Sybarite
+Sybaritic
+Sybaritical
+Sybaritically
+Sybaritish
+sybaritism
+Sybil
+sybotic
+sybotism
+sycamine
+sycamore
+syce
+sycee
+sychnocarpous
+sycock
+sycoma
+sycomancy
+Sycon
+Syconaria
+syconarian
+syconate
+Sycones
+syconid
+Syconidae
+syconium
+syconoid
+syconus
+sycophancy
+sycophant
+sycophantic
+sycophantical
+sycophantically
+sycophantish
+sycophantishly
+sycophantism
+sycophantize
+sycophantry
+sycosiform
+sycosis
+Syd
+Sydneian
+Sydneyite
+sye
+Syed
+syenite
+syenitic
+syenodiorite
+syenogabbro
+sylid
+syllab
+syllabarium
+syllabary
+syllabatim
+syllabation
+syllabe
+syllabi
+syllabic
+syllabical
+syllabically
+syllabicate
+syllabication
+syllabicness
+syllabification
+syllabify
+syllabism
+syllabize
+syllable
+syllabled
+syllabus
+syllepsis
+sylleptic
+sylleptical
+sylleptically
+Syllidae
+syllidian
+Syllis
+sylloge
+syllogism
+syllogist
+syllogistic
+syllogistical
+syllogistically
+syllogistics
+syllogization
+syllogize
+syllogizer
+sylph
+sylphic
+sylphid
+sylphidine
+sylphish
+sylphize
+sylphlike
+Sylphon
+sylphy
+sylva
+sylvae
+sylvage
+Sylvan
+sylvan
+sylvanesque
+sylvanite
+sylvanitic
+sylvanity
+sylvanize
+sylvanly
+sylvanry
+sylvate
+sylvatic
+Sylvester
+sylvester
+sylvestral
+sylvestrene
+Sylvestrian
+sylvestrian
+Sylvestrine
+Sylvia
+Sylvian
+sylvic
+Sylvicolidae
+sylvicoline
+Sylviidae
+Sylviinae
+sylviine
+sylvine
+sylvinite
+sylvite
+symbasic
+symbasical
+symbasically
+symbasis
+symbiogenesis
+symbiogenetic
+symbiogenetically
+symbion
+symbiont
+symbiontic
+symbionticism
+symbiosis
+symbiot
+symbiote
+symbiotic
+symbiotically
+symbiotics
+symbiotism
+symbiotrophic
+symblepharon
+symbol
+symbolaeography
+symbolater
+symbolatrous
+symbolatry
+symbolic
+symbolical
+symbolically
+symbolicalness
+symbolicly
+symbolics
+symbolism
+symbolist
+symbolistic
+symbolistical
+symbolistically
+symbolization
+symbolize
+symbolizer
+symbolofideism
+symbological
+symbologist
+symbolography
+symbology
+symbololatry
+symbolology
+symbolry
+symbouleutic
+symbranch
+Symbranchia
+symbranchiate
+symbranchoid
+symbranchous
+symmachy
+symmedian
+symmelia
+symmelian
+symmelus
+symmetalism
+symmetral
+symmetric
+symmetrical
+symmetricality
+symmetrically
+symmetricalness
+symmetrist
+symmetrization
+symmetrize
+symmetroid
+symmetrophobia
+symmetry
+symmorphic
+symmorphism
+sympalmograph
+sympathectomize
+sympathectomy
+sympathetectomy
+sympathetic
+sympathetical
+sympathetically
+sympatheticism
+sympatheticity
+sympatheticness
+sympatheticotonia
+sympatheticotonic
+sympathetoblast
+sympathicoblast
+sympathicotonia
+sympathicotonic
+sympathicotripsy
+sympathism
+sympathist
+sympathize
+sympathizer
+sympathizing
+sympathizingly
+sympathoblast
+sympatholysis
+sympatholytic
+sympathomimetic
+sympathy
+sympatric
+sympatry
+Sympetalae
+sympetalous
+Symphalangus
+symphenomena
+symphenomenal
+symphile
+symphilic
+symphilism
+symphilous
+symphily
+symphogenous
+symphonetic
+symphonia
+symphonic
+symphonically
+symphonion
+symphonious
+symphoniously
+symphonist
+symphonize
+symphonous
+symphony
+Symphoricarpos
+symphoricarpous
+symphrase
+symphronistic
+symphyantherous
+symphycarpous
+Symphyla
+symphylan
+symphyllous
+symphylous
+symphynote
+symphyogenesis
+symphyogenetic
+symphyostemonous
+symphyseal
+symphyseotomy
+symphysial
+symphysian
+symphysic
+symphysion
+symphysiotomy
+symphysis
+symphysodactylia
+symphysotomy
+symphysy
+Symphyta
+symphytic
+symphytically
+symphytism
+symphytize
+Symphytum
+sympiesometer
+symplasm
+symplectic
+Symplegades
+symplesite
+Symplocaceae
+symplocaceous
+Symplocarpus
+symploce
+Symplocos
+sympode
+sympodia
+sympodial
+sympodially
+sympodium
+sympolity
+symposia
+symposiac
+symposiacal
+symposial
+symposiarch
+symposiast
+symposiastic
+symposion
+symposium
+symptom
+symptomatic
+symptomatical
+symptomatically
+symptomatics
+symptomatize
+symptomatography
+symptomatological
+symptomatologically
+symptomatology
+symptomical
+symptomize
+symptomless
+symptosis
+symtomology
+synacme
+synacmic
+synacmy
+synactic
+synadelphite
+synaeresis
+synagogal
+synagogian
+synagogical
+synagogism
+synagogist
+synagogue
+synalgia
+synalgic
+synallactic
+synallagmatic
+synaloepha
+synanastomosis
+synange
+synangia
+synangial
+synangic
+synangium
+synanthema
+synantherological
+synantherologist
+synantherology
+synantherous
+synanthesis
+synanthetic
+synanthic
+synanthous
+synanthrose
+synanthy
+synaphea
+synaposematic
+synapse
+synapses
+Synapsida
+synapsidan
+synapsis
+synaptai
+synaptase
+synapte
+synaptene
+Synaptera
+synapterous
+synaptic
+synaptical
+synaptically
+synapticula
+synapticulae
+synapticular
+synapticulate
+synapticulum
+Synaptosauria
+synaptychus
+synarchical
+synarchism
+synarchy
+synarmogoid
+Synarmogoidea
+synarquism
+synartesis
+synartete
+synartetic
+synarthrodia
+synarthrodial
+synarthrodially
+synarthrosis
+Synascidiae
+synascidian
+synastry
+synaxar
+synaxarion
+synaxarist
+synaxarium
+synaxary
+synaxis
+sync
+Syncarida
+syncarp
+syncarpia
+syncarpium
+syncarpous
+syncarpy
+syncategorematic
+syncategorematical
+syncategorematically
+syncategoreme
+syncephalic
+syncephalus
+syncerebral
+syncerebrum
+synch
+synchitic
+synchondoses
+synchondrosial
+synchondrosially
+synchondrosis
+synchondrotomy
+synchoresis
+synchro
+synchroflash
+synchromesh
+synchronal
+synchrone
+synchronic
+synchronical
+synchronically
+synchronism
+synchronistic
+synchronistical
+synchronistically
+synchronizable
+synchronization
+synchronize
+synchronized
+synchronizer
+synchronograph
+synchronological
+synchronology
+synchronous
+synchronously
+synchronousness
+synchrony
+synchroscope
+synchrotron
+synchysis
+Synchytriaceae
+Synchytrium
+syncladous
+synclastic
+synclinal
+synclinally
+syncline
+synclinical
+synclinore
+synclinorial
+synclinorian
+synclinorium
+synclitic
+syncliticism
+synclitism
+syncoelom
+syncopal
+syncopate
+syncopated
+syncopation
+syncopator
+syncope
+syncopic
+syncopism
+syncopist
+syncopize
+syncotyledonous
+syncracy
+syncraniate
+syncranterian
+syncranteric
+syncrasy
+syncretic
+syncretical
+syncreticism
+syncretion
+syncretism
+syncretist
+syncretistic
+syncretistical
+syncretize
+syncrisis
+Syncrypta
+syncryptic
+syncytia
+syncytial
+syncytioma
+syncytiomata
+syncytium
+syndactyl
+syndactylia
+syndactylic
+syndactylism
+syndactylous
+syndactyly
+syndectomy
+synderesis
+syndesis
+syndesmectopia
+syndesmitis
+syndesmography
+syndesmology
+syndesmoma
+Syndesmon
+syndesmoplasty
+syndesmorrhaphy
+syndesmosis
+syndesmotic
+syndesmotomy
+syndetic
+syndetical
+syndetically
+syndic
+syndical
+syndicalism
+syndicalist
+syndicalistic
+syndicalize
+syndicate
+syndicateer
+syndication
+syndicator
+syndicship
+syndoc
+syndrome
+syndromic
+syndyasmian
+Syndyoceras
+syne
+synecdoche
+synecdochic
+synecdochical
+synecdochically
+synecdochism
+synechia
+synechiological
+synechiology
+synechological
+synechology
+synechotomy
+synechthran
+synechthry
+synecology
+synecphonesis
+synectic
+synecticity
+Synedra
+synedral
+Synedria
+synedria
+synedrial
+synedrian
+Synedrion
+synedrion
+Synedrium
+synedrium
+synedrous
+syneidesis
+synema
+synemmenon
+synenergistic
+synenergistical
+synenergistically
+synentognath
+Synentognathi
+synentognathous
+syneresis
+synergastic
+synergetic
+synergia
+synergic
+synergically
+synergid
+synergidae
+synergidal
+synergism
+synergist
+synergistic
+synergistical
+synergistically
+synergize
+synergy
+synerize
+synesis
+synesthesia
+synesthetic
+synethnic
+syngamic
+syngamous
+syngamy
+Syngenesia
+syngenesian
+syngenesious
+syngenesis
+syngenetic
+syngenic
+syngenism
+syngenite
+Syngnatha
+Syngnathi
+syngnathid
+Syngnathidae
+syngnathoid
+syngnathous
+Syngnathus
+syngraph
+synizesis
+synkaryon
+synkatathesis
+synkinesia
+synkinesis
+synkinetic
+synneurosis
+synneusis
+synochoid
+synochus
+synocreate
+synod
+synodal
+synodalian
+synodalist
+synodally
+synodical
+synodically
+synodist
+synodite
+synodontid
+Synodontidae
+synodontoid
+synodsman
+Synodus
+synoecete
+synoeciosis
+synoecious
+synoeciously
+synoeciousness
+synoecism
+synoecize
+synoecy
+synoicous
+synomosy
+synonym
+synonymatic
+synonymic
+synonymical
+synonymicon
+synonymics
+synonymist
+synonymity
+synonymize
+synonymous
+synonymously
+synonymousness
+synonymy
+synophthalmus
+synopses
+synopsis
+synopsize
+synopsy
+synoptic
+synoptical
+synoptically
+Synoptist
+synoptist
+Synoptistic
+synorchidism
+synorchism
+synorthographic
+synosteology
+synosteosis
+synostose
+synostosis
+synostotic
+synostotical
+synostotically
+synousiacs
+synovectomy
+synovia
+synovial
+synovially
+synoviparous
+synovitic
+synovitis
+synpelmous
+synrhabdosome
+synsacral
+synsacrum
+synsepalous
+synspermous
+synsporous
+syntactic
+syntactical
+syntactically
+syntactician
+syntactics
+syntagma
+syntan
+syntasis
+syntax
+syntaxis
+syntaxist
+syntechnic
+syntectic
+syntelome
+syntenosis
+synteresis
+syntexis
+syntheme
+synthermal
+syntheses
+synthesis
+synthesism
+synthesist
+synthesization
+synthesize
+synthesizer
+synthete
+synthetic
+synthetical
+synthetically
+syntheticism
+synthetism
+synthetist
+synthetization
+synthetize
+synthetizer
+synthol
+synthroni
+synthronoi
+synthronos
+synthronus
+syntomia
+syntomy
+syntone
+syntonic
+syntonical
+syntonically
+syntonin
+syntonization
+syntonize
+syntonizer
+syntonolydian
+syntonous
+syntony
+syntripsis
+syntrope
+syntrophic
+syntropic
+syntropical
+syntropy
+syntype
+syntypic
+syntypicism
+Synura
+synusia
+synusiast
+syodicon
+sypher
+syphilide
+syphilidography
+syphilidologist
+syphiliphobia
+syphilis
+syphilitic
+syphilitically
+syphilization
+syphilize
+syphiloderm
+syphilodermatous
+syphilogenesis
+syphilogeny
+syphilographer
+syphilography
+syphiloid
+syphilologist
+syphilology
+syphiloma
+syphilomatous
+syphilophobe
+syphilophobia
+syphilophobic
+syphilopsychosis
+syphilosis
+syphilous
+Syracusan
+syre
+Syriac
+Syriacism
+Syriacist
+Syrian
+Syrianic
+Syrianism
+Syrianize
+Syriarch
+Syriasm
+syringa
+syringadenous
+syringe
+syringeal
+syringeful
+syringes
+syringin
+syringitis
+syringium
+syringocoele
+syringomyelia
+syringomyelic
+syringotome
+syringotomy
+syrinx
+Syriologist
+Syrma
+syrma
+Syrmian
+Syrnium
+Syrophoenician
+syrphian
+syrphid
+Syrphidae
+syrt
+syrtic
+Syrtis
+syrup
+syruped
+syruper
+syruplike
+syrupy
+Syryenian
+syssarcosis
+syssel
+sysselman
+syssiderite
+syssitia
+syssition
+systaltic
+systasis
+systatic
+system
+systematic
+systematical
+systematicality
+systematically
+systematician
+systematicness
+systematics
+systematism
+systematist
+systematization
+systematize
+systematizer
+systematology
+systemed
+systemic
+systemically
+systemist
+systemizable
+systemization
+systemize
+systemizer
+systemless
+systemproof
+systemwise
+systilius
+systolated
+systole
+systolic
+systyle
+systylous
+Syun
+syzygetic
+syzygetically
+syzygial
+syzygium
+syzygy
+szaibelyite
+Szekler
+szlachta
+szopelka
+T
+t
+ta
+taa
+Taal
+Taalbond
+taar
+Tab
+tab
+tabacin
+tabacosis
+tabacum
+tabanid
+Tabanidae
+tabaniform
+tabanuco
+Tabanus
+tabard
+tabarded
+tabaret
+Tabasco
+tabasheer
+tabashir
+tabaxir
+tabbarea
+tabber
+tabbinet
+Tabby
+tabby
+Tabebuia
+tabefaction
+tabefy
+tabella
+Tabellaria
+Tabellariaceae
+tabellion
+taberdar
+taberna
+tabernacle
+tabernacler
+tabernacular
+Tabernaemontana
+tabernariae
+tabes
+tabescence
+tabescent
+tabet
+tabetic
+tabetiform
+tabetless
+tabic
+tabid
+tabidly
+tabidness
+tabific
+tabifical
+tabinet
+Tabira
+Tabitha
+tabitude
+tabla
+tablature
+table
+tableau
+tableaux
+tablecloth
+tableclothwise
+tableclothy
+tabled
+tablefellow
+tablefellowship
+tableful
+tableity
+tableland
+tableless
+tablelike
+tablemaid
+tablemaker
+tablemaking
+tableman
+tablemate
+tabler
+tables
+tablespoon
+tablespoonful
+tablet
+tabletary
+tableware
+tablewise
+tabling
+tablinum
+Tabloid
+tabloid
+tabog
+taboo
+tabooism
+tabooist
+taboot
+taboparalysis
+taboparesis
+taboparetic
+tabophobia
+tabor
+taborer
+taboret
+taborin
+Taborite
+tabour
+tabourer
+tabouret
+tabret
+Tabriz
+tabu
+tabula
+tabulable
+tabular
+tabulare
+tabularium
+tabularization
+tabularize
+tabularly
+tabulary
+Tabulata
+tabulate
+tabulated
+tabulation
+tabulator
+tabulatory
+tabule
+tabuliform
+tabut
+tacahout
+tacamahac
+Tacana
+Tacanan
+Tacca
+Taccaceae
+taccaceous
+taccada
+tach
+Tachardia
+Tachardiinae
+tache
+tacheless
+tacheography
+tacheometer
+tacheometric
+tacheometry
+tacheture
+tachhydrite
+tachibana
+Tachina
+Tachinaria
+tachinarian
+tachinid
+Tachinidae
+tachiol
+tachistoscope
+tachistoscopic
+tachogram
+tachograph
+tachometer
+tachometry
+tachoscope
+tachycardia
+tachycardiac
+tachygen
+tachygenesis
+tachygenetic
+tachygenic
+tachyglossal
+tachyglossate
+Tachyglossidae
+Tachyglossus
+tachygraph
+tachygrapher
+tachygraphic
+tachygraphical
+tachygraphically
+tachygraphist
+tachygraphometer
+tachygraphometry
+tachygraphy
+tachyhydrite
+tachyiatry
+tachylalia
+tachylite
+tachylyte
+tachylytic
+tachymeter
+tachymetric
+tachymetry
+tachyphagia
+tachyphasia
+tachyphemia
+tachyphrasia
+tachyphrenia
+tachypnea
+tachyscope
+tachyseism
+tachysterol
+tachysystole
+tachythanatous
+tachytomy
+tachytype
+tacit
+Tacitean
+tacitly
+tacitness
+taciturn
+taciturnist
+taciturnity
+taciturnly
+tack
+tacker
+tacket
+tackety
+tackey
+tackiness
+tacking
+tackingly
+tackle
+tackled
+tackleless
+tackleman
+tackler
+tackless
+tackling
+tackproof
+tacksman
+tacky
+taclocus
+tacmahack
+tacnode
+Taconian
+Taconic
+taconite
+tacso
+Tacsonia
+tact
+tactable
+tactful
+tactfully
+tactfulness
+tactic
+tactical
+tactically
+tactician
+tactics
+tactile
+tactilist
+tactility
+tactilogical
+tactinvariant
+taction
+tactite
+tactive
+tactless
+tactlessly
+tactlessness
+tactometer
+tactor
+tactosol
+tactual
+tactualist
+tactuality
+tactually
+tactus
+tacuacine
+Taculli
+Tad
+tad
+tade
+Tadjik
+Tadousac
+tadpole
+tadpoledom
+tadpolehood
+tadpolelike
+tadpolism
+tae
+tael
+taen
+taenia
+taeniacidal
+taeniacide
+Taeniada
+taeniafuge
+taenial
+taenian
+taeniasis
+Taeniata
+taeniate
+taenicide
+Taenidia
+taenidium
+taeniform
+taenifuge
+taeniiform
+Taeniobranchia
+taeniobranchiate
+Taeniodonta
+Taeniodontia
+Taeniodontidae
+Taenioglossa
+taenioglossate
+taenioid
+taeniosome
+Taeniosomi
+taeniosomous
+taenite
+taennin
+Taetsia
+taffarel
+tafferel
+taffeta
+taffety
+taffle
+taffrail
+Taffy
+taffy
+taffylike
+taffymaker
+taffymaking
+taffywise
+tafia
+tafinagh
+taft
+tafwiz
+tag
+Tagabilis
+Tagakaolo
+Tagal
+Tagala
+Tagalize
+Tagalo
+Tagalog
+tagasaste
+Tagassu
+Tagassuidae
+tagatose
+Tagaur
+Tagbanua
+tagboard
+Tagetes
+tagetol
+tagetone
+tagged
+tagger
+taggle
+taggy
+Taghlik
+tagilite
+Tagish
+taglet
+Tagliacotian
+Tagliacozzian
+taglike
+taglock
+tagrag
+tagraggery
+tagsore
+tagtail
+tagua
+taguan
+Tagula
+tagwerk
+taha
+Tahami
+taheen
+tahil
+tahin
+Tahiti
+Tahitian
+tahkhana
+Tahltan
+tahr
+tahseeldar
+tahsil
+tahsildar
+Tahsin
+tahua
+Tai
+tai
+taiaha
+taich
+taiga
+taigle
+taiglesome
+taihoa
+taikhana
+tail
+tailage
+tailband
+tailboard
+tailed
+tailender
+tailer
+tailet
+tailfirst
+tailflower
+tailforemost
+tailge
+tailhead
+tailing
+tailings
+taille
+tailless
+taillessly
+taillessness
+taillie
+taillight
+taillike
+tailor
+tailorage
+tailorbird
+tailorcraft
+tailordom
+tailoress
+tailorhood
+tailoring
+tailorism
+tailorization
+tailorize
+tailorless
+tailorlike
+tailorly
+tailorman
+tailorship
+tailorwise
+tailory
+tailpiece
+tailpin
+tailpipe
+tailrace
+tailsman
+tailstock
+Tailte
+tailward
+tailwards
+tailwise
+taily
+tailzee
+tailzie
+taimen
+taimyrite
+tain
+Tainan
+Taino
+taint
+taintable
+taintless
+taintlessly
+taintlessness
+taintment
+taintor
+taintproof
+tainture
+taintworm
+Tainui
+taipan
+Taipi
+Taiping
+taipo
+tairge
+tairger
+tairn
+taisch
+taise
+Taisho
+taissle
+taistrel
+taistril
+Tait
+tait
+taiver
+taivers
+taivert
+Taiwanhemp
+Taiyal
+taj
+Tajik
+takable
+takamaka
+Takao
+takar
+Takayuki
+take
+takedown
+takedownable
+takeful
+Takelma
+taken
+taker
+Takeuchi
+Takhaar
+Takhtadjy
+Takilman
+takin
+taking
+takingly
+takingness
+takings
+Takitumu
+takosis
+takt
+Taku
+taky
+takyr
+Tal
+tal
+tala
+talabon
+talahib
+Talaing
+talaje
+talak
+talalgia
+Talamanca
+Talamancan
+talanton
+talao
+talapoin
+talar
+talari
+talaria
+talaric
+talayot
+talbot
+talbotype
+talc
+talcer
+Talcher
+talcky
+talclike
+talcochlorite
+talcoid
+talcomicaceous
+talcose
+talcous
+talcum
+tald
+tale
+talebearer
+talebearing
+talebook
+talecarrier
+talecarrying
+taled
+taleful
+Talegallinae
+Talegallus
+talemaster
+talemonger
+talemongering
+talent
+talented
+talentless
+talepyet
+taler
+tales
+talesman
+taleteller
+taletelling
+tali
+Taliacotian
+taliage
+taliation
+taliera
+taligrade
+Talinum
+talion
+talionic
+talipat
+taliped
+talipedic
+talipes
+talipomanus
+talipot
+talis
+talisay
+Talishi
+talisman
+talismanic
+talismanical
+talismanically
+talismanist
+talite
+Talitha
+talitol
+talk
+talkability
+talkable
+talkathon
+talkative
+talkatively
+talkativeness
+talker
+talkfest
+talkful
+talkie
+talkiness
+talking
+talkworthy
+talky
+tall
+tallage
+tallageability
+tallageable
+tallboy
+tallegalane
+taller
+tallero
+talles
+tallet
+talliable
+talliage
+talliar
+talliate
+tallier
+tallis
+tallish
+tallit
+tallith
+tallness
+talloel
+tallote
+tallow
+tallowberry
+tallower
+tallowiness
+tallowing
+tallowish
+tallowlike
+tallowmaker
+tallowmaking
+tallowman
+tallowroot
+tallowweed
+tallowwood
+tallowy
+tallwood
+tally
+tallyho
+tallyman
+tallymanship
+tallywag
+tallywalka
+tallywoman
+talma
+talmouse
+Talmud
+Talmudic
+Talmudical
+Talmudism
+Talmudist
+Talmudistic
+Talmudistical
+Talmudization
+Talmudize
+talocalcaneal
+talocalcanean
+talocrural
+talofibular
+talon
+talonavicular
+taloned
+talonic
+talonid
+taloscaphoid
+talose
+talotibial
+Talpa
+talpacoti
+talpatate
+talpetate
+talpicide
+talpid
+Talpidae
+talpiform
+talpify
+talpine
+talpoid
+talthib
+Taltushtuntude
+Taluche
+Taluhet
+taluk
+taluka
+talukdar
+talukdari
+talus
+taluto
+talwar
+talwood
+Talyshin
+tam
+Tama
+tamability
+tamable
+tamableness
+tamably
+Tamaceae
+Tamachek
+tamacoare
+tamale
+Tamanac
+Tamanaca
+Tamanaco
+tamandu
+tamandua
+tamanoas
+tamanoir
+tamanowus
+tamanu
+Tamara
+tamara
+tamarack
+tamaraite
+tamarao
+Tamaricaceae
+tamaricaceous
+tamarin
+tamarind
+Tamarindus
+tamarisk
+Tamarix
+Tamaroa
+tamas
+tamasha
+Tamashek
+Tamaulipecan
+tambac
+tambaroora
+tamber
+tambo
+tamboo
+Tambookie
+tambookie
+tambor
+Tambouki
+tambour
+tamboura
+tambourer
+tambouret
+tambourgi
+tambourin
+tambourinade
+tambourine
+tambourist
+tambreet
+Tambuki
+tamburan
+tamburello
+Tame
+tame
+tamehearted
+tameheartedness
+tamein
+tameless
+tamelessly
+tamelessness
+tamely
+tameness
+tamer
+Tamerlanism
+Tamias
+tamidine
+Tamil
+Tamilian
+Tamilic
+tamis
+tamise
+tamlung
+Tammanial
+Tammanize
+Tammany
+Tammanyism
+Tammanyite
+Tammanyize
+tammie
+tammock
+Tammy
+tammy
+Tamonea
+Tamoyo
+tamp
+tampala
+tampan
+tampang
+tamper
+tamperer
+tamperproof
+tampin
+tamping
+tampion
+tampioned
+tampon
+tamponade
+tamponage
+tamponment
+tampoon
+Tamul
+Tamulian
+Tamulic
+Tamus
+Tamworth
+Tamzine
+tan
+tana
+tanacetin
+tanacetone
+Tanacetum
+tanacetyl
+tanach
+tanager
+Tanagra
+Tanagraean
+Tanagridae
+tanagrine
+tanagroid
+Tanaidacea
+tanaist
+tanak
+Tanaka
+Tanala
+tanan
+tanbark
+tanbur
+tancel
+Tanchelmian
+tanchoir
+tandan
+tandem
+tandemer
+tandemist
+tandemize
+tandemwise
+tandle
+tandour
+Tandy
+tane
+tanekaha
+Tang
+tang
+tanga
+Tangaloa
+tangalung
+tangantangan
+Tangaridae
+Tangaroa
+Tangaroan
+tanged
+tangeite
+tangelo
+tangence
+tangency
+tangent
+tangental
+tangentally
+tangential
+tangentiality
+tangentially
+tangently
+tanger
+Tangerine
+tangfish
+tangham
+tanghan
+tanghin
+Tanghinia
+tanghinin
+tangi
+tangibile
+tangibility
+tangible
+tangibleness
+tangibly
+tangie
+Tangier
+tangilin
+Tangipahoa
+tangka
+tanglad
+tangle
+tangleberry
+tanglefish
+tanglefoot
+tanglement
+tangleproof
+tangler
+tangleroot
+tanglesome
+tangless
+tanglewrack
+tangling
+tanglingly
+tangly
+tango
+tangoreceptor
+tangram
+tangs
+tangue
+tanguile
+tangum
+tangun
+Tangut
+tangy
+tanh
+tanha
+tanhouse
+tania
+tanica
+tanier
+tanist
+tanistic
+tanistry
+tanistship
+Tanite
+Tanitic
+tanjib
+tanjong
+tank
+tanka
+tankage
+tankah
+tankard
+tanked
+tanker
+tankerabogus
+tankert
+tankette
+tankful
+tankle
+tankless
+tanklike
+tankmaker
+tankmaking
+tankman
+tankodrome
+tankroom
+tankwise
+tanling
+tannable
+tannage
+tannaic
+tannaim
+tannaitic
+tannalbin
+tannase
+tannate
+tanned
+tanner
+tannery
+tannic
+tannide
+tanniferous
+tannin
+tannined
+tanning
+tanninlike
+tannocaffeic
+tannogallate
+tannogallic
+tannogelatin
+tannogen
+tannoid
+tannometer
+tannyl
+Tano
+tanoa
+Tanoan
+tanproof
+tanquam
+Tanquelinian
+tanquen
+tanrec
+tanstuff
+tansy
+tantadlin
+tantafflin
+tantalate
+Tantalean
+Tantalian
+Tantalic
+tantalic
+tantaliferous
+tantalifluoride
+tantalite
+tantalization
+tantalize
+tantalizer
+tantalizingly
+tantalizingness
+tantalofluoride
+tantalum
+Tantalus
+tantamount
+tantara
+tantarabobus
+tantarara
+tanti
+tantivy
+tantle
+Tantony
+tantra
+tantric
+tantrik
+tantrism
+tantrist
+tantrum
+tantum
+tanwood
+tanworks
+Tanya
+tanyard
+Tanyoan
+Tanystomata
+tanystomatous
+tanystome
+tanzeb
+tanzib
+Tanzine
+tanzy
+Tao
+tao
+Taoism
+Taoist
+Taoistic
+Taonurus
+Taos
+taotai
+taoyin
+tap
+Tapa
+tapa
+Tapachula
+Tapachulteca
+tapacolo
+tapaculo
+Tapacura
+tapadera
+tapadero
+Tapajo
+tapalo
+tapamaker
+tapamaking
+tapas
+tapasvi
+Tape
+tape
+Tapeats
+tapeinocephalic
+tapeinocephalism
+tapeinocephaly
+tapeless
+tapelike
+tapeline
+tapemaker
+tapemaking
+tapeman
+tapen
+taper
+taperbearer
+tapered
+taperer
+tapering
+taperingly
+taperly
+tapermaker
+tapermaking
+taperness
+taperwise
+tapesium
+tapestring
+tapestry
+tapestrylike
+tapet
+tapetal
+tapete
+tapeti
+tapetless
+tapetum
+tapework
+tapeworm
+taphephobia
+taphole
+taphouse
+Taphria
+Taphrina
+Taphrinaceae
+tapia
+Tapijulapane
+tapinceophalism
+tapinocephalic
+tapinocephaly
+Tapinoma
+tapinophobia
+tapinophoby
+tapinosis
+tapioca
+tapir
+Tapiridae
+tapiridian
+tapirine
+Tapiro
+tapiroid
+Tapirus
+tapis
+tapism
+tapist
+taplash
+taplet
+Tapleyism
+tapmost
+tapnet
+tapoa
+Taposa
+tapoun
+tappa
+tappable
+tappableness
+tappall
+tappaul
+tappen
+tapper
+tapperer
+Tappertitian
+tappet
+tappietoorie
+tapping
+tappoon
+Taprobane
+taproom
+taproot
+taprooted
+taps
+tapster
+tapsterlike
+tapsterly
+tapstress
+tapu
+tapul
+Tapuya
+Tapuyan
+Tapuyo
+taqua
+tar
+tara
+tarabooka
+taraf
+tarafdar
+tarage
+Tarahumar
+Tarahumara
+Tarahumare
+Tarahumari
+Tarai
+tarairi
+tarakihi
+Taraktogenos
+taramellite
+Taramembe
+Taranchi
+tarand
+Tarandean
+Tarandian
+tarantara
+tarantass
+tarantella
+tarantism
+tarantist
+tarantula
+tarantular
+tarantulary
+tarantulated
+tarantulid
+Tarantulidae
+tarantulism
+tarantulite
+tarantulous
+tarapatch
+taraph
+tarapin
+Tarapon
+Tarasc
+Tarascan
+Tarasco
+tarassis
+tarata
+taratah
+taratantara
+taratantarize
+tarau
+taraxacerin
+taraxacin
+Taraxacum
+Tarazed
+tarbadillo
+tarbet
+tarboard
+tarbogan
+tarboggin
+tarboosh
+tarbooshed
+tarboy
+tarbrush
+tarbush
+tarbuttite
+Tardenoisian
+Tardigrada
+tardigrade
+tardigradous
+tardily
+tardiness
+tarditude
+tardive
+tardle
+tardy
+tare
+tarea
+tarefa
+tarefitch
+tarentala
+tarente
+Tarentine
+tarentism
+tarentola
+tarepatch
+Tareq
+tarfa
+tarflower
+targe
+targeman
+targer
+target
+targeted
+targeteer
+targetlike
+targetman
+Targum
+Targumic
+Targumical
+Targumist
+Targumistic
+Targumize
+Tarheel
+Tarheeler
+tarhood
+tari
+Tariana
+tarie
+tariff
+tariffable
+tariffication
+tariffism
+tariffist
+tariffite
+tariffize
+tariffless
+tarin
+Tariri
+tariric
+taririnic
+tarish
+Tarkalani
+Tarkani
+tarkashi
+tarkeean
+tarkhan
+tarlatan
+tarlataned
+tarletan
+tarlike
+tarltonize
+Tarmac
+tarmac
+tarman
+Tarmi
+tarmined
+tarn
+tarnal
+tarnally
+tarnation
+tarnish
+tarnishable
+tarnisher
+tarnishment
+tarnishproof
+tarnlike
+tarnside
+taro
+taroc
+tarocco
+tarok
+taropatch
+tarot
+tarp
+tarpan
+tarpaulin
+tarpaulinmaker
+Tarpeia
+Tarpeian
+tarpon
+tarpot
+tarpum
+Tarquin
+Tarquinish
+tarr
+tarrack
+tarradiddle
+tarradiddler
+tarragon
+tarragona
+tarras
+tarrass
+Tarrateen
+Tarratine
+tarred
+tarrer
+tarri
+tarriance
+tarrie
+tarrier
+tarrify
+tarrily
+tarriness
+tarrish
+tarrock
+tarrow
+tarry
+tarrying
+tarryingly
+tarryingness
+tars
+tarsadenitis
+tarsal
+tarsale
+tarsalgia
+tarse
+tarsectomy
+tarsectopia
+tarsi
+tarsia
+tarsier
+Tarsiidae
+tarsioid
+Tarsipedidae
+Tarsipedinae
+Tarsipes
+tarsitis
+Tarsius
+tarsochiloplasty
+tarsoclasis
+tarsomalacia
+tarsome
+tarsometatarsal
+tarsometatarsus
+tarsonemid
+Tarsonemidae
+Tarsonemus
+tarsophalangeal
+tarsophyma
+tarsoplasia
+tarsoplasty
+tarsoptosis
+tarsorrhaphy
+tarsotarsal
+tarsotibal
+tarsotomy
+tarsus
+tart
+tartago
+Tartan
+tartan
+tartana
+tartane
+Tartar
+tartar
+tartarated
+Tartarean
+Tartareous
+tartareous
+tartaret
+Tartarian
+Tartaric
+tartaric
+Tartarin
+tartarish
+Tartarism
+Tartarization
+tartarization
+Tartarize
+tartarize
+Tartarized
+Tartarlike
+tartarly
+Tartarology
+tartarous
+tartarproof
+tartarum
+Tartarus
+Tartary
+tartemorion
+tarten
+tartish
+tartishly
+tartle
+tartlet
+tartly
+tartness
+tartramate
+tartramic
+tartramide
+tartrate
+tartrated
+tartratoferric
+tartrazine
+tartrazinic
+tartro
+tartronate
+tartronic
+tartronyl
+tartronylurea
+tartrous
+tartryl
+tartrylic
+Tartufe
+tartufery
+tartufian
+tartufish
+tartufishly
+tartufism
+tartwoman
+Taruma
+Tarumari
+tarve
+Tarvia
+tarweed
+tarwhine
+tarwood
+tarworks
+taryard
+Taryba
+Tarzan
+Tarzanish
+tasajo
+tascal
+tasco
+taseometer
+tash
+tasheriff
+tashie
+tashlik
+Tashnagist
+Tashnakist
+tashreef
+tashrif
+Tasian
+tasimeter
+tasimetric
+tasimetry
+task
+taskage
+tasker
+taskit
+taskless
+tasklike
+taskmaster
+taskmastership
+taskmistress
+tasksetter
+tasksetting
+taskwork
+taslet
+Tasmanian
+tasmanite
+Tass
+tass
+tassago
+tassah
+tassal
+tassard
+tasse
+tassel
+tasseler
+tasselet
+tasselfish
+tassellus
+tasselmaker
+tasselmaking
+tassely
+tasser
+tasset
+tassie
+tassoo
+tastable
+tastableness
+tastably
+taste
+tasteable
+tasteableness
+tasteably
+tasted
+tasteful
+tastefully
+tastefulness
+tastekin
+tasteless
+tastelessly
+tastelessness
+tasten
+taster
+tastily
+tastiness
+tasting
+tastingly
+tasty
+tasu
+Tat
+tat
+Tatar
+Tatarian
+Tataric
+Tatarization
+Tatarize
+Tatary
+tataupa
+tatbeb
+tatchy
+tate
+tater
+Tates
+tath
+Tatian
+Tatianist
+tatie
+tatinek
+tatler
+tatou
+tatouay
+tatpurusha
+Tatsanottine
+tatsman
+tatta
+tatter
+tatterdemalion
+tatterdemalionism
+tatterdemalionry
+tattered
+tatteredly
+tatteredness
+tatterly
+tatterwallop
+tattery
+tatther
+tattied
+tatting
+tattle
+tattlement
+tattler
+tattlery
+tattletale
+tattling
+tattlingly
+tattoo
+tattooage
+tattooer
+tattooing
+tattooist
+tattooment
+tattva
+tatty
+Tatu
+tatu
+tatukira
+Tatusia
+Tatusiidae
+tau
+Taube
+Tauchnitz
+taught
+taula
+Tauli
+taum
+taun
+Taungthu
+taunt
+taunter
+taunting
+tauntingly
+tauntingness
+Taunton
+tauntress
+taupe
+taupo
+taupou
+taur
+tauranga
+taurean
+Tauri
+Taurian
+taurian
+Tauric
+tauric
+tauricide
+tauricornous
+Taurid
+Tauridian
+tauriferous
+tauriform
+taurine
+Taurini
+taurite
+taurobolium
+tauroboly
+taurocephalous
+taurocholate
+taurocholic
+taurocol
+taurocolla
+Tauroctonus
+taurodont
+tauroesque
+taurokathapsia
+taurolatry
+tauromachian
+tauromachic
+tauromachy
+tauromorphic
+tauromorphous
+taurophile
+taurophobe
+Tauropolos
+Taurotragus
+Taurus
+tauryl
+taut
+tautaug
+tauted
+tautegorical
+tautegory
+tauten
+tautirite
+tautit
+tautly
+tautness
+tautochrone
+tautochronism
+tautochronous
+tautog
+tautologic
+tautological
+tautologically
+tautologicalness
+tautologism
+tautologist
+tautologize
+tautologizer
+tautologous
+tautologously
+tautology
+tautomer
+tautomeral
+tautomeric
+tautomerism
+tautomerizable
+tautomerization
+tautomerize
+tautomery
+tautometer
+tautometric
+tautometrical
+tautomorphous
+tautonym
+tautonymic
+tautonymy
+tautoousian
+tautoousious
+tautophonic
+tautophonical
+tautophony
+tautopodic
+tautopody
+tautosyllabic
+tautotype
+tautourea
+tautousian
+tautousious
+tautozonal
+tautozonality
+tav
+Tavast
+Tavastian
+Tave
+tave
+tavell
+taver
+tavern
+taverner
+tavernize
+tavernless
+tavernlike
+tavernly
+tavernous
+tavernry
+tavernwards
+tavers
+tavert
+Tavghi
+tavistockite
+tavola
+tavolatite
+Tavy
+taw
+tawa
+tawdered
+tawdrily
+tawdriness
+tawdry
+tawer
+tawery
+Tawgi
+tawie
+tawite
+tawkee
+tawkin
+tawn
+tawney
+tawnily
+tawniness
+tawnle
+tawny
+tawpi
+tawpie
+taws
+tawse
+tawtie
+tax
+taxability
+taxable
+taxableness
+taxably
+Taxaceae
+taxaceous
+taxameter
+taxaspidean
+taxation
+taxational
+taxative
+taxatively
+taxator
+taxeater
+taxeating
+taxed
+taxeme
+taxemic
+taxeopod
+Taxeopoda
+taxeopodous
+taxeopody
+taxer
+taxgatherer
+taxgathering
+taxi
+taxiable
+taxiarch
+taxiauto
+taxibus
+taxicab
+Taxidea
+taxidermal
+taxidermic
+taxidermist
+taxidermize
+taxidermy
+taximan
+taximeter
+taximetered
+taxine
+taxing
+taxingly
+taxinomic
+taxinomist
+taxinomy
+taxiplane
+taxis
+taxite
+taxitic
+taxless
+taxlessly
+taxlessness
+taxman
+Taxodiaceae
+Taxodium
+taxodont
+taxology
+taxometer
+taxon
+taxonomer
+taxonomic
+taxonomical
+taxonomically
+taxonomist
+taxonomy
+taxor
+taxpaid
+taxpayer
+taxpaying
+Taxus
+taxwax
+taxy
+tay
+Tayassu
+Tayassuidae
+tayer
+Taygeta
+tayir
+Taylor
+Taylorism
+Taylorite
+taylorite
+Taylorize
+tayra
+Tayrona
+taysaam
+tazia
+Tcawi
+tch
+tchai
+tcharik
+tchast
+tche
+tcheirek
+Tcheka
+Tcherkess
+tchervonets
+tchervonetz
+Tchetchentsish
+Tchetnitsi
+Tchi
+tchick
+tchu
+Tchwi
+tck
+Td
+te
+tea
+teaberry
+teaboard
+teabox
+teaboy
+teacake
+teacart
+teach
+teachability
+teachable
+teachableness
+teachably
+teache
+teacher
+teacherage
+teacherdom
+teacheress
+teacherhood
+teacherless
+teacherlike
+teacherly
+teachership
+teachery
+teaching
+teachingly
+teachless
+teachment
+teachy
+teacup
+teacupful
+tead
+teadish
+teaer
+teaey
+teagardeny
+teagle
+Teague
+Teagueland
+Teaguelander
+teahouse
+teaish
+teaism
+teak
+teakettle
+teakwood
+teal
+tealeafy
+tealery
+tealess
+teallite
+team
+teamaker
+teamaking
+teaman
+teameo
+teamer
+teaming
+teamland
+teamless
+teamman
+teammate
+teamsman
+teamster
+teamwise
+teamwork
+tean
+teanal
+teap
+teapot
+teapotful
+teapottykin
+teapoy
+tear
+tearable
+tearableness
+tearably
+tearage
+tearcat
+teardown
+teardrop
+tearer
+tearful
+tearfully
+tearfulness
+tearing
+tearless
+tearlessly
+tearlessness
+tearlet
+tearlike
+tearoom
+tearpit
+tearproof
+tearstain
+teart
+tearthroat
+tearthumb
+teary
+teasable
+teasableness
+teasably
+tease
+teaseable
+teaseableness
+teaseably
+teasehole
+teasel
+teaseler
+teaseller
+teasellike
+teaselwort
+teasement
+teaser
+teashop
+teasiness
+teasing
+teasingly
+teasler
+teaspoon
+teaspoonful
+teasy
+teat
+teataster
+teated
+teatfish
+teathe
+teather
+teatime
+teatlike
+teatling
+teatman
+teaty
+teave
+teaware
+teaze
+teazer
+tebbet
+Tebet
+Tebeth
+Tebu
+tec
+Teca
+teca
+tecali
+Tech
+tech
+techily
+techiness
+technetium
+technic
+technica
+technical
+technicalism
+technicalist
+technicality
+technicalize
+technically
+technicalness
+technician
+technicism
+technicist
+technicological
+technicology
+Technicolor
+technicon
+technics
+techniphone
+technique
+techniquer
+technism
+technist
+technocausis
+technochemical
+technochemistry
+technocracy
+technocrat
+technocratic
+technographer
+technographic
+technographical
+technographically
+technography
+technolithic
+technologic
+technological
+technologically
+technologist
+technologue
+technology
+technonomic
+technonomy
+technopsychology
+techous
+techy
+teck
+Tecla
+tecnoctonia
+tecnology
+Teco
+Tecoma
+tecomin
+tecon
+Tecpanec
+tectal
+tectibranch
+Tectibranchia
+tectibranchian
+Tectibranchiata
+tectibranchiate
+tectiform
+tectocephalic
+tectocephaly
+tectological
+tectology
+Tectona
+tectonic
+tectonics
+tectorial
+tectorium
+Tectosages
+tectosphere
+tectospinal
+Tectospondyli
+tectospondylic
+tectospondylous
+tectrices
+tectricial
+tectum
+tecum
+tecuma
+Tecuna
+Ted
+ted
+Teda
+tedder
+Teddy
+tedescan
+tedge
+tediosity
+tedious
+tediously
+tediousness
+tediousome
+tedisome
+tedium
+tee
+teedle
+teel
+teem
+teemer
+teemful
+teemfulness
+teeming
+teemingly
+teemingness
+teemless
+teems
+teen
+teenage
+teenet
+teens
+teensy
+teenty
+teeny
+teer
+teerer
+teest
+Teeswater
+teet
+teetaller
+teetan
+teeter
+teeterboard
+teeterer
+teetertail
+teeth
+teethache
+teethbrush
+teethe
+teethful
+teethily
+teething
+teethless
+teethlike
+teethridge
+teethy
+teeting
+teetotal
+teetotaler
+teetotalism
+teetotalist
+teetotally
+teetotum
+teetotumism
+teetotumize
+teetotumwise
+teety
+teevee
+teewhaap
+teff
+teg
+Tegean
+Tegeticula
+tegmen
+tegmental
+tegmentum
+tegmina
+tegminal
+Tegmine
+tegua
+teguexin
+Teguima
+tegula
+tegular
+tegularly
+tegulated
+tegumen
+tegument
+tegumental
+tegumentary
+tegumentum
+tegurium
+Teheran
+tehseel
+tehseeldar
+tehsil
+tehsildar
+Tehuantepecan
+Tehueco
+Tehuelche
+Tehuelchean
+Tehuelet
+Teian
+teicher
+teiglech
+Teiidae
+teil
+teind
+teindable
+teinder
+teinland
+teinoscope
+teioid
+Teiresias
+Tejon
+tejon
+teju
+tekiah
+Tekintsi
+Tekke
+tekke
+tekken
+Tekkintzi
+teknonymous
+teknonymy
+tektite
+tekya
+telacoustic
+telakucha
+telamon
+telang
+telangiectasia
+telangiectasis
+telangiectasy
+telangiectatic
+telangiosis
+Telanthera
+telar
+telarian
+telary
+telautogram
+telautograph
+telautographic
+telautographist
+telautography
+telautomatic
+telautomatically
+telautomatics
+Telchines
+Telchinic
+tele
+teleanemograph
+teleangiectasia
+telebarograph
+telebarometer
+telecast
+telecaster
+telechemic
+telechirograph
+telecinematography
+telecode
+telecommunication
+telecryptograph
+telectroscope
+teledendrion
+teledendrite
+teledendron
+teledu
+telega
+telegenic
+Telegn
+telegnosis
+telegnostic
+telegonic
+telegonous
+telegony
+telegram
+telegrammatic
+telegrammic
+telegraph
+telegraphee
+telegrapheme
+telegrapher
+telegraphese
+telegraphic
+telegraphical
+telegraphically
+telegraphist
+telegraphone
+telegraphophone
+telegraphoscope
+telegraphy
+Telegu
+telehydrobarometer
+Telei
+Teleia
+teleianthous
+teleiosis
+telekinematography
+telekinesis
+telekinetic
+telelectric
+telelectrograph
+telelectroscope
+telemanometer
+Telemark
+telemark
+Telembi
+telemechanic
+telemechanics
+telemechanism
+telemetacarpal
+telemeteorograph
+telemeteorographic
+telemeteorography
+telemeter
+telemetric
+telemetrical
+telemetrist
+telemetrograph
+telemetrographic
+telemetrography
+telemetry
+telemotor
+telencephal
+telencephalic
+telencephalon
+telenergic
+telenergy
+teleneurite
+teleneuron
+Telenget
+telengiscope
+Telenomus
+teleobjective
+Teleocephali
+teleocephalous
+Teleoceras
+Teleodesmacea
+teleodesmacean
+teleodesmaceous
+teleodont
+teleologic
+teleological
+teleologically
+teleologism
+teleologist
+teleology
+teleometer
+teleophobia
+teleophore
+teleophyte
+teleoptile
+teleorganic
+teleoroentgenogram
+teleoroentgenography
+teleosaur
+teleosaurian
+Teleosauridae
+Teleosaurus
+teleost
+teleostean
+Teleostei
+teleosteous
+teleostomate
+teleostome
+Teleostomi
+teleostomian
+teleostomous
+teleotemporal
+teleotrocha
+teleozoic
+teleozoon
+telepathic
+telepathically
+telepathist
+telepathize
+telepathy
+telepheme
+telephone
+telephoner
+telephonic
+telephonical
+telephonically
+telephonist
+telephonograph
+telephonographic
+telephony
+telephote
+telephoto
+telephotograph
+telephotographic
+telephotography
+Telephus
+telepicture
+teleplasm
+teleplasmic
+teleplastic
+telepost
+teleprinter
+teleradiophone
+teleran
+telergic
+telergical
+telergically
+telergy
+telescope
+telescopic
+telescopical
+telescopically
+telescopiform
+telescopist
+Telescopium
+telescopy
+telescriptor
+teleseism
+teleseismic
+teleseismology
+teleseme
+telesia
+telesis
+telesmeter
+telesomatic
+telespectroscope
+telestereograph
+telestereography
+telestereoscope
+telesterion
+telesthesia
+telesthetic
+telestial
+telestic
+telestich
+teletactile
+teletactor
+teletape
+teletherapy
+telethermogram
+telethermograph
+telethermometer
+telethermometry
+telethon
+teletopometer
+teletranscription
+Teletype
+teletype
+teletyper
+teletypesetter
+teletypewriter
+teletyping
+Teleut
+teleuto
+teleutoform
+teleutosorus
+teleutospore
+teleutosporic
+teleutosporiferous
+teleview
+televiewer
+televise
+television
+televisional
+televisionary
+televisor
+televisual
+televocal
+televox
+telewriter
+Telfairia
+telfairic
+telfer
+telferage
+telford
+telfordize
+telharmonic
+telharmonium
+telharmony
+teli
+telial
+telic
+telical
+telically
+teliferous
+Telinga
+teliosorus
+teliospore
+teliosporic
+teliosporiferous
+teliostage
+telium
+tell
+tellable
+tellach
+tellee
+teller
+tellership
+telligraph
+Tellima
+Tellina
+Tellinacea
+tellinacean
+tellinaceous
+telling
+tellingly
+Tellinidae
+tellinoid
+tellsome
+tellt
+telltale
+telltalely
+telltruth
+tellural
+tellurate
+telluret
+tellureted
+tellurethyl
+telluretted
+tellurhydric
+tellurian
+telluric
+telluride
+telluriferous
+tellurion
+tellurism
+tellurist
+tellurite
+tellurium
+tellurize
+telluronium
+tellurous
+telmatological
+telmatology
+teloblast
+teloblastic
+telocentric
+telodendrion
+telodendron
+telodynamic
+telokinesis
+telolecithal
+telolemma
+telome
+telomic
+telomitic
+telonism
+Teloogoo
+Telopea
+telophase
+telophragma
+telopsis
+teloptic
+telosynapsis
+telosynaptic
+telosynaptist
+teloteropathic
+teloteropathically
+teloteropathy
+Telotremata
+telotrematous
+telotroch
+telotrocha
+telotrochal
+telotrochous
+telotrophic
+telotype
+telpath
+telpher
+telpherage
+telpherman
+telpherway
+telson
+telsonic
+telt
+Telugu
+telurgy
+telyn
+Tema
+temacha
+temalacatl
+Teman
+teman
+Temanite
+tembe
+temblor
+Tembu
+temenos
+temerarious
+temerariously
+temerariousness
+temeritous
+temerity
+temerous
+temerously
+temerousness
+temiak
+temin
+Temiskaming
+Temne
+Temnospondyli
+temnospondylous
+temp
+Tempe
+Tempean
+temper
+tempera
+temperability
+temperable
+temperably
+temperality
+temperament
+temperamental
+temperamentalist
+temperamentally
+temperamented
+temperance
+temperate
+temperately
+temperateness
+temperative
+temperature
+tempered
+temperedly
+temperedness
+temperer
+temperish
+temperless
+tempersome
+tempery
+tempest
+tempestical
+tempestive
+tempestively
+tempestivity
+tempestuous
+tempestuously
+tempestuousness
+tempesty
+tempi
+Templar
+templar
+templardom
+templarism
+templarlike
+templarlikeness
+templary
+template
+templater
+temple
+templed
+templeful
+templeless
+templelike
+templet
+Templetonia
+templeward
+templize
+tempo
+tempora
+temporal
+temporale
+temporalism
+temporalist
+temporality
+temporalize
+temporally
+temporalness
+temporalty
+temporaneous
+temporaneously
+temporaneousness
+temporarily
+temporariness
+temporary
+temporator
+temporization
+temporizer
+temporizing
+temporizingly
+temporoalar
+temporoauricular
+temporocentral
+temporocerebellar
+temporofacial
+temporofrontal
+temporohyoid
+temporomalar
+temporomandibular
+temporomastoid
+temporomaxillary
+temporooccipital
+temporoparietal
+temporopontine
+temporosphenoid
+temporosphenoidal
+temporozygomatic
+tempre
+temprely
+tempt
+temptability
+temptable
+temptableness
+temptation
+temptational
+temptationless
+temptatious
+temptatory
+tempter
+tempting
+temptingly
+temptingness
+temptress
+Tempyo
+temse
+temser
+temulence
+temulency
+temulent
+temulentive
+temulently
+ten
+tenability
+tenable
+tenableness
+tenably
+tenace
+tenacious
+tenaciously
+tenaciousness
+tenacity
+tenaculum
+tenai
+tenaille
+tenaillon
+Tenaktak
+tenancy
+tenant
+tenantable
+tenantableness
+tenanter
+tenantism
+tenantless
+tenantlike
+tenantry
+tenantship
+tench
+tenchweed
+Tencteri
+tend
+tendance
+tendant
+tendence
+tendency
+tendent
+tendential
+tendentious
+tendentiously
+tendentiousness
+tender
+tenderability
+tenderable
+tenderably
+tenderee
+tenderer
+tenderfoot
+tenderfootish
+tenderful
+tenderfully
+tenderheart
+tenderhearted
+tenderheartedly
+tenderheartedness
+tenderish
+tenderize
+tenderling
+tenderloin
+tenderly
+tenderness
+tenderometer
+tendersome
+tendinal
+tending
+tendingly
+tendinitis
+tendinous
+tendinousness
+tendomucoid
+tendon
+tendonous
+tendoplasty
+tendosynovitis
+tendotome
+tendotomy
+tendour
+tendovaginal
+tendovaginitis
+tendresse
+tendril
+tendriled
+tendriliferous
+tendrillar
+tendrilly
+tendrilous
+tendron
+tenebra
+Tenebrae
+tenebricose
+tenebrific
+tenebrificate
+Tenebrio
+tenebrionid
+Tenebrionidae
+tenebrious
+tenebriously
+tenebrity
+tenebrose
+tenebrosity
+tenebrous
+tenebrously
+tenebrousness
+tenectomy
+tenement
+tenemental
+tenementary
+tenementer
+tenementization
+tenementize
+tenendas
+tenendum
+tenent
+teneral
+Teneriffe
+tenesmic
+tenesmus
+tenet
+tenfold
+tenfoldness
+teng
+tengere
+tengerite
+Tenggerese
+tengu
+teniacidal
+teniacide
+tenible
+Tenino
+tenio
+tenline
+tenmantale
+tennantite
+tenne
+tenner
+Tennessean
+tennis
+tennisdom
+tennisy
+Tennysonian
+Tennysonianism
+Tenochtitlan
+tenodesis
+tenodynia
+tenography
+tenology
+tenomyoplasty
+tenomyotomy
+tenon
+tenonectomy
+tenoner
+Tenonian
+tenonitis
+tenonostosis
+tenontagra
+tenontitis
+tenontodynia
+tenontography
+tenontolemmitis
+tenontology
+tenontomyoplasty
+tenontomyotomy
+tenontophyma
+tenontoplasty
+tenontothecitis
+tenontotomy
+tenophony
+tenophyte
+tenoplastic
+tenoplasty
+tenor
+tenorist
+tenorister
+tenorite
+tenorless
+tenoroon
+tenorrhaphy
+tenositis
+tenostosis
+tenosuture
+tenotome
+tenotomist
+tenotomize
+tenotomy
+tenovaginitis
+tenpence
+tenpenny
+tenpin
+tenrec
+Tenrecidae
+tense
+tenseless
+tenselessness
+tensely
+tenseness
+tensibility
+tensible
+tensibleness
+tensibly
+tensify
+tensile
+tensilely
+tensileness
+tensility
+tensimeter
+tensiometer
+tension
+tensional
+tensionless
+tensity
+tensive
+tenson
+tensor
+tent
+tentability
+tentable
+tentacle
+tentacled
+tentaclelike
+tentacula
+tentacular
+Tentaculata
+tentaculate
+tentaculated
+Tentaculifera
+tentaculite
+Tentaculites
+Tentaculitidae
+tentaculocyst
+tentaculoid
+tentaculum
+tentage
+tentamen
+tentation
+tentative
+tentatively
+tentativeness
+tented
+tenter
+tenterbelly
+tenterer
+tenterhook
+tentful
+tenth
+tenthly
+tenthmeter
+tenthredinid
+Tenthredinidae
+tenthredinoid
+Tenthredinoidea
+Tenthredo
+tentiform
+tentigo
+tentillum
+tention
+tentless
+tentlet
+tentlike
+tentmaker
+tentmaking
+tentmate
+tentorial
+tentorium
+tenture
+tentwards
+tentwise
+tentwork
+tentwort
+tenty
+tenuate
+tenues
+tenuicostate
+tenuifasciate
+tenuiflorous
+tenuifolious
+tenuious
+tenuiroster
+tenuirostral
+tenuirostrate
+Tenuirostres
+tenuis
+tenuistriate
+tenuity
+tenuous
+tenuously
+tenuousness
+tenure
+tenurial
+tenurially
+teocalli
+teopan
+teosinte
+Teotihuacan
+tepache
+tepal
+Tepanec
+Tepecano
+tepee
+tepefaction
+tepefy
+Tepehua
+Tepehuane
+tepetate
+Tephillah
+tephillin
+tephramancy
+tephrite
+tephritic
+tephroite
+tephromalacia
+tephromyelitic
+Tephrosia
+tephrosis
+tepid
+tepidarium
+tepidity
+tepidly
+tepidness
+tepomporize
+teponaztli
+tepor
+tequila
+Tequistlateca
+Tequistlatecan
+tera
+teraglin
+terakihi
+teramorphous
+terap
+teraphim
+teras
+teratical
+teratism
+teratoblastoma
+teratogenesis
+teratogenetic
+teratogenic
+teratogenous
+teratogeny
+teratoid
+teratological
+teratologist
+teratology
+teratoma
+teratomatous
+teratoscopy
+teratosis
+terbia
+terbic
+terbium
+tercel
+tercelet
+tercentenarian
+tercentenarize
+tercentenary
+tercentennial
+tercer
+terceron
+tercet
+terchloride
+tercia
+tercine
+tercio
+terdiurnal
+terebate
+terebella
+terebellid
+Terebellidae
+terebelloid
+terebellum
+terebene
+terebenic
+terebenthene
+terebic
+terebilic
+terebinic
+terebinth
+Terebinthaceae
+terebinthial
+terebinthian
+terebinthic
+terebinthina
+terebinthinate
+terebinthine
+terebinthinous
+Terebinthus
+terebra
+terebral
+terebrant
+Terebrantia
+terebrate
+terebration
+Terebratula
+terebratular
+terebratulid
+Terebratulidae
+terebratuliform
+terebratuline
+terebratulite
+terebratuloid
+Terebridae
+Teredinidae
+teredo
+terek
+Terence
+Terentian
+terephthalate
+terephthalic
+Teresa
+Teresian
+Teresina
+terete
+teretial
+tereticaudate
+teretifolious
+teretipronator
+teretiscapular
+teretiscapularis
+teretish
+tereu
+Tereus
+terfez
+Terfezia
+Terfeziaceae
+tergal
+tergant
+tergeminate
+tergeminous
+tergiferous
+tergite
+tergitic
+tergiversant
+tergiversate
+tergiversation
+tergiversator
+tergiversatory
+tergiverse
+tergolateral
+tergum
+Teri
+Teriann
+terlinguaite
+term
+terma
+termagancy
+Termagant
+termagant
+termagantish
+termagantism
+termagantly
+termage
+termatic
+termen
+termer
+Termes
+termillenary
+termin
+terminability
+terminable
+terminableness
+terminably
+terminal
+Terminalia
+Terminaliaceae
+terminalization
+terminalized
+terminally
+terminant
+terminate
+termination
+terminational
+terminative
+terminatively
+terminator
+terminatory
+termine
+terminer
+termini
+terminine
+terminism
+terminist
+terministic
+terminize
+termino
+terminological
+terminologically
+terminologist
+terminology
+terminus
+termital
+termitarium
+termitary
+termite
+termitic
+termitid
+Termitidae
+termitophagous
+termitophile
+termitophilous
+termless
+termlessly
+termlessness
+termly
+termolecular
+termon
+termor
+termtime
+tern
+terna
+ternal
+ternar
+ternariant
+ternarious
+ternary
+ternate
+ternately
+ternatipinnate
+ternatisect
+ternatopinnate
+terne
+terneplate
+ternery
+ternion
+ternize
+ternlet
+Ternstroemia
+Ternstroemiaceae
+teroxide
+terp
+terpadiene
+terpane
+terpene
+terpeneless
+terphenyl
+terpilene
+terpin
+terpine
+terpinene
+terpineol
+terpinol
+terpinolene
+terpodion
+Terpsichore
+terpsichoreal
+terpsichoreally
+Terpsichorean
+terpsichorean
+Terraba
+terrace
+terraceous
+terracer
+terracette
+terracewards
+terracewise
+terracework
+terraciform
+terracing
+terraculture
+terraefilial
+terraefilian
+terrage
+terrain
+terral
+terramara
+terramare
+Terrance
+terrane
+terranean
+terraneous
+Terrapene
+terrapin
+terraquean
+terraqueous
+terraqueousness
+terrar
+terrarium
+terrazzo
+terrella
+terremotive
+Terrence
+terrene
+terrenely
+terreneness
+terreplein
+terrestrial
+terrestrialism
+terrestriality
+terrestrialize
+terrestrially
+terrestrialness
+terrestricity
+terrestrious
+terret
+terreted
+Terri
+terribility
+terrible
+terribleness
+terribly
+terricole
+terricoline
+terricolous
+terrier
+terrierlike
+terrific
+terrifical
+terrifically
+terrification
+terrificly
+terrificness
+terrifiedly
+terrifier
+terrify
+terrifying
+terrifyingly
+terrigenous
+terrine
+Territelae
+territelarian
+territorial
+territorialism
+territorialist
+territoriality
+territorialization
+territorialize
+territorially
+territorian
+territoried
+territory
+terron
+terror
+terrorful
+terrorific
+terrorism
+terrorist
+terroristic
+terroristical
+terrorization
+terrorize
+terrorizer
+terrorless
+terrorproof
+terrorsome
+Terry
+terry
+terse
+tersely
+terseness
+tersion
+tersulphate
+tersulphide
+tersulphuret
+tertenant
+tertia
+tertial
+tertian
+tertiana
+tertianship
+tertiarian
+tertiary
+tertiate
+tertius
+terton
+tertrinal
+Tertullianism
+Tertullianist
+teruncius
+terutero
+Teruyuki
+tervalence
+tervalency
+tervalent
+tervariant
+tervee
+terzetto
+terzina
+terzo
+tesack
+tesarovitch
+teschenite
+teschermacherite
+teskere
+teskeria
+Tess
+tessara
+tessarace
+tessaraconter
+tessaradecad
+tessaraglot
+tessaraphthong
+tessarescaedecahedron
+tessel
+tessella
+tessellar
+tessellate
+tessellated
+tessellation
+tessera
+tesseract
+tesseradecade
+tesseraic
+tesseral
+Tesserants
+tesserarian
+tesserate
+tesserated
+tesseratomic
+tesseratomy
+tessular
+test
+testa
+testable
+Testacea
+testacean
+testaceography
+testaceology
+testaceous
+testaceousness
+testacy
+testament
+testamental
+testamentally
+testamentalness
+testamentarily
+testamentary
+testamentate
+testamentation
+testamentum
+testamur
+testar
+testata
+testate
+testation
+testator
+testatorship
+testatory
+testatrices
+testatrix
+testatum
+teste
+tested
+testee
+tester
+testes
+testibrachial
+testibrachium
+testicardinate
+testicardine
+Testicardines
+testicle
+testicond
+testicular
+testiculate
+testiculated
+testiere
+testificate
+testification
+testificator
+testificatory
+testifier
+testify
+testily
+testimonial
+testimonialist
+testimonialization
+testimonialize
+testimonializer
+testimonium
+testimony
+testiness
+testing
+testingly
+testis
+teston
+testone
+testoon
+testor
+testosterone
+testril
+testudinal
+Testudinaria
+testudinarious
+Testudinata
+testudinate
+testudinated
+testudineal
+testudineous
+Testudinidae
+testudinous
+testudo
+testy
+Tesuque
+tetanic
+tetanical
+tetanically
+tetaniform
+tetanigenous
+tetanilla
+tetanine
+tetanism
+tetanization
+tetanize
+tetanoid
+tetanolysin
+tetanomotor
+tetanospasmin
+tetanotoxin
+tetanus
+tetany
+tetarcone
+tetarconid
+tetard
+tetartemorion
+tetartocone
+tetartoconid
+tetartohedral
+tetartohedrally
+tetartohedrism
+tetartohedron
+tetartoid
+tetartosymmetry
+tetch
+tetchy
+tete
+tetel
+teterrimous
+teth
+tethelin
+tether
+tetherball
+tethery
+tethydan
+Tethys
+Teton
+tetra
+tetraamylose
+tetrabasic
+tetrabasicity
+Tetrabelodon
+tetrabelodont
+tetrabiblos
+tetraborate
+tetraboric
+tetrabrach
+tetrabranch
+Tetrabranchia
+tetrabranchiate
+tetrabromid
+tetrabromide
+tetrabromo
+tetrabromoethane
+tetracadactylity
+tetracarboxylate
+tetracarboxylic
+tetracarpellary
+tetraceratous
+tetracerous
+Tetracerus
+tetrachical
+tetrachlorid
+tetrachloride
+tetrachloro
+tetrachloroethane
+tetrachloroethylene
+tetrachloromethane
+tetrachord
+tetrachordal
+tetrachordon
+tetrachoric
+tetrachotomous
+tetrachromatic
+tetrachromic
+tetrachronous
+tetracid
+tetracoccous
+tetracoccus
+tetracolic
+tetracolon
+tetracoral
+Tetracoralla
+tetracoralline
+tetracosane
+tetract
+tetractinal
+tetractine
+tetractinellid
+Tetractinellida
+tetractinellidan
+tetractinelline
+tetractinose
+tetracyclic
+tetrad
+tetradactyl
+tetradactylous
+tetradactyly
+tetradarchy
+tetradecane
+tetradecanoic
+tetradecapod
+Tetradecapoda
+tetradecapodan
+tetradecapodous
+tetradecyl
+Tetradesmus
+tetradiapason
+tetradic
+Tetradite
+tetradrachma
+tetradrachmal
+tetradrachmon
+tetradymite
+Tetradynamia
+tetradynamian
+tetradynamious
+tetradynamous
+tetraedron
+tetraedrum
+tetraethylsilane
+tetrafluoride
+tetrafolious
+tetragamy
+tetragenous
+tetraglot
+tetraglottic
+tetragon
+tetragonal
+tetragonally
+tetragonalness
+Tetragonia
+Tetragoniaceae
+tetragonidium
+tetragonous
+tetragonus
+tetragram
+tetragrammatic
+Tetragrammaton
+tetragrammatonic
+tetragyn
+Tetragynia
+tetragynian
+tetragynous
+tetrahedral
+tetrahedrally
+tetrahedric
+tetrahedrite
+tetrahedroid
+tetrahedron
+tetrahexahedral
+tetrahexahedron
+tetrahydrate
+tetrahydrated
+tetrahydric
+tetrahydride
+tetrahydro
+tetrahydroxy
+tetraiodid
+tetraiodide
+tetraiodo
+tetraiodophenolphthalein
+tetrakaidecahedron
+tetraketone
+tetrakisazo
+tetrakishexahedron
+tetralemma
+Tetralin
+tetralogic
+tetralogue
+tetralogy
+tetralophodont
+tetramastia
+tetramastigote
+Tetramera
+tetrameral
+tetrameralian
+tetrameric
+tetramerism
+tetramerous
+tetrameter
+tetramethyl
+tetramethylammonium
+tetramethylene
+tetramethylium
+tetramin
+tetramine
+tetrammine
+tetramorph
+tetramorphic
+tetramorphism
+tetramorphous
+tetrander
+Tetrandria
+tetrandrian
+tetrandrous
+tetrane
+tetranitrate
+tetranitro
+tetranitroaniline
+tetranuclear
+Tetranychus
+Tetrao
+Tetraodon
+tetraodont
+Tetraodontidae
+tetraonid
+Tetraonidae
+Tetraoninae
+tetraonine
+Tetrapanax
+tetrapartite
+tetrapetalous
+tetraphalangeate
+tetrapharmacal
+tetrapharmacon
+tetraphenol
+tetraphony
+tetraphosphate
+tetraphyllous
+tetrapla
+tetraplegia
+tetrapleuron
+tetraploid
+tetraploidic
+tetraploidy
+tetraplous
+Tetrapneumona
+Tetrapneumones
+tetrapneumonian
+tetrapneumonous
+tetrapod
+Tetrapoda
+tetrapodic
+tetrapody
+tetrapolar
+tetrapolis
+tetrapolitan
+tetrapous
+tetraprostyle
+tetrapteran
+tetrapteron
+tetrapterous
+tetraptote
+Tetrapturus
+tetraptych
+tetrapylon
+tetrapyramid
+tetrapyrenous
+tetraquetrous
+tetrarch
+tetrarchate
+tetrarchic
+tetrarchy
+tetrasaccharide
+tetrasalicylide
+tetraselenodont
+tetraseme
+tetrasemic
+tetrasepalous
+tetraskelion
+tetrasome
+tetrasomic
+tetrasomy
+tetraspermal
+tetraspermatous
+tetraspermous
+tetraspheric
+tetrasporange
+tetrasporangiate
+tetrasporangium
+tetraspore
+tetrasporic
+tetrasporiferous
+tetrasporous
+tetraster
+tetrastich
+tetrastichal
+tetrastichic
+Tetrastichidae
+tetrastichous
+Tetrastichus
+tetrastoon
+tetrastyle
+tetrastylic
+tetrastylos
+tetrastylous
+tetrasubstituted
+tetrasubstitution
+tetrasulphide
+tetrasyllabic
+tetrasyllable
+tetrasymmetry
+tetrathecal
+tetratheism
+tetratheite
+tetrathionates
+tetrathionic
+tetratomic
+tetratone
+tetravalence
+tetravalency
+tetravalent
+tetraxial
+tetraxon
+Tetraxonia
+tetraxonian
+tetraxonid
+Tetraxonida
+tetrazane
+tetrazene
+tetrazin
+tetrazine
+tetrazo
+tetrazole
+tetrazolium
+tetrazolyl
+tetrazone
+tetrazotization
+tetrazotize
+tetrazyl
+tetremimeral
+tetrevangelium
+tetric
+tetrical
+tetricity
+tetricous
+tetrigid
+Tetrigidae
+tetriodide
+Tetrix
+tetrobol
+tetrobolon
+tetrode
+Tetrodon
+tetrodont
+Tetrodontidae
+tetrole
+tetrolic
+tetronic
+tetronymal
+tetrose
+tetroxalate
+tetroxide
+tetrsyllabical
+tetryl
+tetrylene
+tetter
+tetterish
+tetterous
+tetterwort
+tettery
+Tettigidae
+tettigoniid
+Tettigoniidae
+tettix
+Tetum
+Teucer
+Teucri
+Teucrian
+teucrin
+Teucrium
+teufit
+teuk
+Teutolatry
+Teutomania
+Teutomaniac
+Teuton
+Teutondom
+Teutonesque
+Teutonia
+Teutonic
+Teutonically
+Teutonicism
+Teutonism
+Teutonist
+Teutonity
+Teutonization
+Teutonize
+Teutonomania
+Teutonophobe
+Teutonophobia
+Teutophil
+Teutophile
+Teutophilism
+Teutophobe
+Teutophobia
+Teutophobism
+teviss
+tew
+Tewa
+tewel
+tewer
+tewit
+tewly
+tewsome
+Texan
+Texas
+Texcocan
+texguino
+text
+textarian
+textbook
+textbookless
+textiferous
+textile
+textilist
+textlet
+textman
+textorial
+textrine
+textual
+textualism
+textualist
+textuality
+textually
+textuarist
+textuary
+textural
+texturally
+texture
+textureless
+tez
+Tezcatlipoca
+Tezcatzoncatl
+Tezcucan
+tezkere
+th
+tha
+thack
+thacker
+Thackerayan
+Thackerayana
+Thackerayesque
+thackless
+Thad
+Thai
+Thais
+thakur
+thakurate
+thalamencephalic
+thalamencephalon
+thalami
+thalamic
+Thalamiflorae
+thalamifloral
+thalamiflorous
+thalamite
+thalamium
+thalamocele
+thalamocoele
+thalamocortical
+thalamocrural
+thalamolenticular
+thalamomammillary
+thalamopeduncular
+Thalamophora
+thalamotegmental
+thalamotomy
+thalamus
+Thalarctos
+thalassal
+Thalassarctos
+thalassian
+thalassic
+thalassinid
+Thalassinidea
+thalassinidian
+thalassinoid
+thalassiophyte
+thalassiophytous
+thalasso
+Thalassochelys
+thalassocracy
+thalassocrat
+thalassographer
+thalassographic
+thalassographical
+thalassography
+thalassometer
+thalassophilous
+thalassophobia
+thalassotherapy
+thalattology
+thalenite
+thaler
+Thalesia
+Thalesian
+Thalessa
+Thalia
+Thaliacea
+thaliacean
+Thalian
+Thaliard
+Thalictrum
+thalli
+thallic
+thalliferous
+thalliform
+thalline
+thallious
+thallium
+thallochlore
+thallodal
+thallogen
+thallogenic
+thallogenous
+thalloid
+thallome
+Thallophyta
+thallophyte
+thallophytic
+thallose
+thallous
+thallus
+thalposis
+thalpotic
+thalthan
+thameng
+Thamesis
+Thamnidium
+thamnium
+thamnophile
+Thamnophilinae
+thamnophiline
+Thamnophilus
+Thamnophis
+Thamudean
+Thamudene
+Thamudic
+thamuria
+Thamus
+Thamyras
+than
+thana
+thanadar
+thanage
+thanan
+thanatism
+thanatist
+thanatobiologic
+thanatognomonic
+thanatographer
+thanatography
+thanatoid
+thanatological
+thanatologist
+thanatology
+thanatomantic
+thanatometer
+thanatophidia
+thanatophidian
+thanatophobe
+thanatophobia
+thanatophobiac
+thanatophoby
+thanatopsis
+Thanatos
+thanatosis
+thanatotic
+thanatousia
+thane
+thanedom
+thanehood
+thaneland
+thaneship
+thank
+thankee
+thanker
+thankful
+thankfully
+thankfulness
+thankless
+thanklessly
+thanklessness
+thanks
+thanksgiver
+thanksgiving
+thankworthily
+thankworthiness
+thankworthy
+thapes
+Thapsia
+thapsia
+thar
+Tharen
+tharf
+tharfcake
+Thargelion
+tharginyah
+tharm
+Thasian
+Thaspium
+that
+thatch
+thatcher
+thatching
+thatchless
+thatchwood
+thatchwork
+thatchy
+thatn
+thatness
+thats
+thaught
+Thaumantian
+Thaumantias
+thaumasite
+thaumatogeny
+thaumatography
+thaumatolatry
+thaumatology
+thaumatrope
+thaumatropical
+thaumaturge
+thaumaturgia
+thaumaturgic
+thaumaturgical
+thaumaturgics
+thaumaturgism
+thaumaturgist
+thaumaturgy
+thaumoscopic
+thave
+thaw
+thawer
+thawless
+thawn
+thawy
+The
+the
+Thea
+Theaceae
+theaceous
+theah
+theandric
+theanthropic
+theanthropical
+theanthropism
+theanthropist
+theanthropology
+theanthropophagy
+theanthropos
+theanthroposophy
+theanthropy
+thearchic
+thearchy
+theasum
+theat
+theater
+theatergoer
+theatergoing
+theaterless
+theaterlike
+theaterward
+theaterwards
+theaterwise
+Theatine
+theatral
+theatric
+theatricable
+theatrical
+theatricalism
+theatricality
+theatricalization
+theatricalize
+theatrically
+theatricalness
+theatricals
+theatrician
+theatricism
+theatricize
+theatrics
+theatrize
+theatrocracy
+theatrograph
+theatromania
+theatromaniac
+theatron
+theatrophile
+theatrophobia
+theatrophone
+theatrophonic
+theatropolis
+theatroscope
+theatry
+theave
+theb
+Thebaic
+Thebaid
+thebaine
+Thebais
+thebaism
+Theban
+Thebesian
+theca
+thecae
+thecal
+Thecamoebae
+thecaphore
+thecasporal
+thecaspore
+thecaspored
+thecasporous
+Thecata
+thecate
+thecia
+thecitis
+thecium
+Thecla
+thecla
+theclan
+thecodont
+thecoglossate
+thecoid
+Thecoidea
+Thecophora
+Thecosomata
+thecosomatous
+thee
+theek
+theeker
+theelin
+theelol
+Theemim
+theer
+theet
+theetsee
+theezan
+theft
+theftbote
+theftdom
+theftless
+theftproof
+theftuous
+theftuously
+thegether
+thegidder
+thegither
+thegn
+thegndom
+thegnhood
+thegnland
+thegnlike
+thegnly
+thegnship
+thegnworthy
+theiform
+Theileria
+theine
+theinism
+their
+theirn
+theirs
+theirselves
+theirsens
+theism
+theist
+theistic
+theistical
+theistically
+thelalgia
+Thelemite
+thelemite
+Thelephora
+Thelephoraceae
+Theligonaceae
+theligonaceous
+Theligonum
+thelitis
+thelium
+Thelodontidae
+Thelodus
+theloncus
+thelorrhagia
+Thelphusa
+thelphusian
+Thelphusidae
+thelyblast
+thelyblastic
+thelyotokous
+thelyotoky
+Thelyphonidae
+Thelyphonus
+thelyplasty
+thelytocia
+thelytoky
+thelytonic
+them
+thema
+themata
+thematic
+thematical
+thematically
+thematist
+theme
+themeless
+themelet
+themer
+Themis
+themis
+Themistian
+themsel
+themselves
+then
+thenabouts
+thenadays
+thenal
+thenar
+thenardite
+thence
+thenceafter
+thenceforth
+thenceforward
+thenceforwards
+thencefrom
+thenceward
+thenness
+Theo
+theoanthropomorphic
+theoanthropomorphism
+theoastrological
+Theobald
+Theobroma
+theobromic
+theobromine
+theocentric
+theocentricism
+theocentrism
+theochristic
+theocollectivism
+theocollectivist
+theocracy
+theocrasia
+theocrasical
+theocrasy
+theocrat
+theocratic
+theocratical
+theocratically
+theocratist
+Theocritan
+Theocritean
+theodemocracy
+theodicaea
+theodicean
+theodicy
+theodidact
+theodolite
+theodolitic
+Theodora
+Theodore
+Theodoric
+Theodosia
+Theodosian
+Theodotian
+theodrama
+theody
+theogamy
+theogeological
+theognostic
+theogonal
+theogonic
+theogonism
+theogonist
+theogony
+theohuman
+theokrasia
+theoktonic
+theoktony
+theolatrous
+theolatry
+theolepsy
+theoleptic
+theologal
+theologaster
+theologastric
+theologate
+theologeion
+theologer
+theologi
+theologian
+theologic
+theological
+theologically
+theologician
+theologicoastronomical
+theologicoethical
+theologicohistorical
+theologicometaphysical
+theologicomilitary
+theologicomoral
+theologiconatural
+theologicopolitical
+theologics
+theologism
+theologist
+theologium
+theologization
+theologize
+theologizer
+theologoumena
+theologoumenon
+theologue
+theologus
+theology
+theomachia
+theomachist
+theomachy
+theomammomist
+theomancy
+theomania
+theomaniac
+theomantic
+theomastix
+theomicrist
+theomisanthropist
+theomorphic
+theomorphism
+theomorphize
+theomythologer
+theomythology
+theonomy
+theopantism
+Theopaschist
+Theopaschitally
+Theopaschite
+Theopaschitic
+Theopaschitism
+theopathetic
+theopathic
+theopathy
+theophagic
+theophagite
+theophagous
+theophagy
+Theophania
+theophania
+theophanic
+theophanism
+theophanous
+theophany
+Theophila
+theophilanthrope
+theophilanthropic
+theophilanthropism
+theophilanthropist
+theophilanthropy
+theophile
+theophilist
+theophilosophic
+Theophilus
+theophobia
+theophoric
+theophorous
+Theophrastaceae
+theophrastaceous
+Theophrastan
+Theophrastean
+theophylline
+theophysical
+theopneust
+theopneusted
+theopneustia
+theopneustic
+theopneusty
+theopolitician
+theopolitics
+theopolity
+theopsychism
+theorbist
+theorbo
+theorem
+theorematic
+theorematical
+theorematically
+theorematist
+theoremic
+theoretic
+theoretical
+theoreticalism
+theoretically
+theoretician
+theoreticopractical
+theoretics
+theoria
+theoriai
+theoric
+theorical
+theorically
+theorician
+theoricon
+theorics
+theorism
+theorist
+theorization
+theorize
+theorizer
+theorum
+theory
+theoryless
+theorymonger
+theosoph
+theosopheme
+theosophic
+theosophical
+theosophically
+theosophism
+theosophist
+theosophistic
+theosophistical
+theosophize
+theosophy
+theotechnic
+theotechnist
+theotechny
+theoteleological
+theoteleology
+theotherapy
+Theotokos
+theow
+theowdom
+theowman
+Theraean
+theralite
+therapeusis
+Therapeutae
+Therapeutic
+therapeutic
+therapeutical
+therapeutically
+therapeutics
+therapeutism
+therapeutist
+Theraphosa
+theraphose
+theraphosid
+Theraphosidae
+theraphosoid
+therapist
+therapsid
+Therapsida
+therapy
+therblig
+there
+thereabouts
+thereabove
+thereacross
+thereafter
+thereafterward
+thereagainst
+thereamong
+thereamongst
+thereanent
+thereanents
+therearound
+thereas
+thereat
+thereaway
+thereaways
+therebeside
+therebesides
+therebetween
+thereby
+thereckly
+therefor
+therefore
+therefrom
+therehence
+therein
+thereinafter
+thereinbefore
+thereinto
+therence
+thereness
+thereof
+thereoid
+thereologist
+thereology
+thereon
+thereout
+thereover
+thereright
+theres
+Theresa
+therese
+therethrough
+theretill
+thereto
+theretofore
+theretoward
+thereunder
+thereuntil
+thereunto
+thereup
+thereupon
+Thereva
+therevid
+Therevidae
+therewhile
+therewith
+therewithal
+therewithin
+Theria
+theriac
+theriaca
+theriacal
+therial
+therianthropic
+therianthropism
+theriatrics
+theridiid
+Theridiidae
+Theridion
+theriodic
+theriodont
+Theriodonta
+Theriodontia
+theriolatry
+theriomancy
+theriomaniac
+theriomimicry
+theriomorph
+theriomorphic
+theriomorphism
+theriomorphosis
+theriomorphous
+theriotheism
+theriotrophical
+theriozoic
+therm
+thermacogenesis
+thermae
+thermal
+thermalgesia
+thermality
+thermally
+thermanalgesia
+thermanesthesia
+thermantic
+thermantidote
+thermatologic
+thermatologist
+thermatology
+thermesthesia
+thermesthesiometer
+thermetograph
+thermetrograph
+thermic
+thermically
+Thermidorian
+thermion
+thermionic
+thermionically
+thermionics
+thermistor
+Thermit
+thermit
+thermite
+thermo
+thermoammeter
+thermoanalgesia
+thermoanesthesia
+thermobarograph
+thermobarometer
+thermobattery
+thermocautery
+thermochemic
+thermochemical
+thermochemically
+thermochemist
+thermochemistry
+thermochroic
+thermochrosy
+thermocline
+thermocouple
+thermocurrent
+thermodiffusion
+thermoduric
+thermodynamic
+thermodynamical
+thermodynamically
+thermodynamician
+thermodynamicist
+thermodynamics
+thermodynamist
+thermoelectric
+thermoelectrical
+thermoelectrically
+thermoelectricity
+thermoelectrometer
+thermoelectromotive
+thermoelement
+thermoesthesia
+thermoexcitory
+thermogalvanometer
+thermogen
+thermogenerator
+thermogenesis
+thermogenetic
+thermogenic
+thermogenous
+thermogeny
+thermogeographical
+thermogeography
+thermogram
+thermograph
+thermography
+thermohyperesthesia
+thermojunction
+thermokinematics
+thermolabile
+thermolability
+thermological
+thermology
+thermoluminescence
+thermoluminescent
+thermolysis
+thermolytic
+thermolyze
+thermomagnetic
+thermomagnetism
+thermometamorphic
+thermometamorphism
+thermometer
+thermometerize
+thermometric
+thermometrical
+thermometrically
+thermometrograph
+thermometry
+thermomotive
+thermomotor
+thermomultiplier
+thermonastic
+thermonasty
+thermonatrite
+thermoneurosis
+thermoneutrality
+thermonous
+thermonuclear
+thermopair
+thermopalpation
+thermopenetration
+thermoperiod
+thermoperiodic
+thermoperiodicity
+thermoperiodism
+thermophile
+thermophilic
+thermophilous
+thermophobous
+thermophone
+thermophore
+thermophosphor
+thermophosphorescence
+thermopile
+thermoplastic
+thermoplasticity
+thermoplegia
+thermopleion
+thermopolymerization
+thermopolypnea
+thermopolypneic
+Thermopsis
+thermoradiotherapy
+thermoreduction
+thermoregulation
+thermoregulator
+thermoresistance
+thermoresistant
+thermos
+thermoscope
+thermoscopic
+thermoscopical
+thermoscopically
+thermosetting
+thermosiphon
+thermostability
+thermostable
+thermostat
+thermostatic
+thermostatically
+thermostatics
+thermostimulation
+thermosynthesis
+thermosystaltic
+thermosystaltism
+thermotactic
+thermotank
+thermotaxic
+thermotaxis
+thermotelephone
+thermotensile
+thermotension
+thermotherapeutics
+thermotherapy
+thermotic
+thermotical
+thermotically
+thermotics
+thermotropic
+thermotropism
+thermotropy
+thermotype
+thermotypic
+thermotypy
+thermovoltaic
+therodont
+theroid
+therolatry
+therologic
+therological
+therologist
+therology
+Theromora
+Theromores
+theromorph
+Theromorpha
+theromorphia
+theromorphic
+theromorphism
+theromorphological
+theromorphology
+theromorphous
+Theron
+theropod
+Theropoda
+theropodous
+thersitean
+Thersites
+thersitical
+thesauri
+thesaurus
+these
+Thesean
+theses
+Theseum
+Theseus
+thesial
+thesicle
+thesis
+Thesium
+Thesmophoria
+Thesmophorian
+Thesmophoric
+thesmothetae
+thesmothete
+thesmothetes
+thesocyte
+Thespesia
+Thespesius
+Thespian
+Thessalian
+Thessalonian
+thestreen
+theta
+thetch
+thetic
+thetical
+thetically
+thetics
+thetin
+thetine
+Thetis
+theurgic
+theurgical
+theurgically
+theurgist
+theurgy
+Thevetia
+thevetin
+thew
+thewed
+thewless
+thewness
+thewy
+they
+theyll
+theyre
+thiacetic
+thiadiazole
+thialdine
+thiamide
+thiamin
+thiamine
+thianthrene
+thiasi
+thiasine
+thiasite
+thiasoi
+thiasos
+thiasote
+thiasus
+thiazine
+thiazole
+thiazoline
+thick
+thickbrained
+thicken
+thickener
+thickening
+thicket
+thicketed
+thicketful
+thickety
+thickhead
+thickheaded
+thickheadedly
+thickheadedness
+thickish
+thickleaf
+thicklips
+thickly
+thickneck
+thickness
+thicknessing
+thickset
+thickskin
+thickskull
+thickskulled
+thickwind
+thickwit
+thief
+thiefcraft
+thiefdom
+thiefland
+thiefmaker
+thiefmaking
+thiefproof
+thieftaker
+thiefwise
+Thielavia
+Thielaviopsis
+thienone
+thienyl
+Thierry
+thievable
+thieve
+thieveless
+thiever
+thievery
+thieving
+thievingly
+thievish
+thievishly
+thievishness
+thig
+thigger
+thigging
+thigh
+thighbone
+thighed
+thight
+thightness
+thigmonegative
+thigmopositive
+thigmotactic
+thigmotactically
+thigmotaxis
+thigmotropic
+thigmotropically
+thigmotropism
+Thilanottine
+thilk
+thill
+thiller
+thilly
+thimber
+thimble
+thimbleberry
+thimbled
+thimbleflower
+thimbleful
+thimblelike
+thimblemaker
+thimblemaking
+thimbleman
+thimblerig
+thimblerigger
+thimbleriggery
+thimblerigging
+thimbleweed
+thin
+thinbrained
+thine
+thing
+thingal
+thingamabob
+thinghood
+thinginess
+thingish
+thingless
+thinglet
+thinglike
+thinglikeness
+thingliness
+thingly
+thingman
+thingness
+thingstead
+thingum
+thingumajig
+thingumbob
+thingummy
+thingy
+Think
+think
+thinkable
+thinkableness
+thinkably
+thinker
+thinkful
+thinking
+thinkingly
+thinkingpart
+thinkling
+thinly
+thinner
+thinness
+thinning
+thinnish
+Thinocoridae
+Thinocorus
+thinolite
+thio
+thioacetal
+thioacetic
+thioalcohol
+thioaldehyde
+thioamide
+thioantimonate
+thioantimoniate
+thioantimonious
+thioantimonite
+thioarsenate
+thioarseniate
+thioarsenic
+thioarsenious
+thioarsenite
+Thiobacillus
+Thiobacteria
+thiobacteria
+Thiobacteriales
+thiobismuthite
+thiocarbamic
+thiocarbamide
+thiocarbamyl
+thiocarbanilide
+thiocarbimide
+thiocarbonate
+thiocarbonic
+thiocarbonyl
+thiochloride
+thiochrome
+thiocresol
+thiocyanate
+thiocyanation
+thiocyanic
+thiocyanide
+thiocyano
+thiocyanogen
+thiodiazole
+thiodiphenylamine
+thiofuran
+thiofurane
+thiofurfuran
+thiofurfurane
+thiogycolic
+thiohydrate
+thiohydrolysis
+thiohydrolyze
+thioindigo
+thioketone
+thiol
+thiolacetic
+thiolactic
+thiolic
+thionamic
+thionaphthene
+thionate
+thionation
+thioneine
+thionic
+thionine
+thionitrite
+thionium
+thionobenzoic
+thionthiolic
+thionurate
+thionyl
+thionylamine
+thiophen
+thiophene
+thiophenic
+thiophenol
+thiophosgene
+thiophosphate
+thiophosphite
+thiophosphoric
+thiophosphoryl
+thiophthene
+thiopyran
+thioresorcinol
+thiosinamine
+Thiospira
+thiostannate
+thiostannic
+thiostannite
+thiostannous
+thiosulphate
+thiosulphonic
+thiosulphuric
+Thiothrix
+thiotolene
+thiotungstate
+thiotungstic
+thiouracil
+thiourea
+thiourethan
+thiourethane
+thioxene
+thiozone
+thiozonide
+thir
+third
+thirdborough
+thirdings
+thirdling
+thirdly
+thirdness
+thirdsman
+thirl
+thirlage
+thirling
+thirst
+thirster
+thirstful
+thirstily
+thirstiness
+thirsting
+thirstingly
+thirstland
+thirstle
+thirstless
+thirstlessness
+thirstproof
+thirsty
+thirt
+thirteen
+thirteener
+thirteenfold
+thirteenth
+thirteenthly
+thirtieth
+thirty
+thirtyfold
+thirtyish
+this
+thishow
+thislike
+thisn
+thisness
+thissen
+thistle
+thistlebird
+thistled
+thistledown
+thistlelike
+thistleproof
+thistlery
+thistlish
+thistly
+thiswise
+thither
+thitherto
+thitherward
+thitsiol
+thiuram
+thivel
+thixle
+thixolabile
+thixotropic
+thixotropy
+Thlaspi
+Thlingchadinne
+Thlinget
+thlipsis
+Tho
+tho
+thob
+thocht
+thof
+thoft
+thoftfellow
+thoke
+thokish
+thole
+tholeiite
+tholepin
+tholi
+tholoi
+tholos
+tholus
+Thomaean
+Thomas
+Thomasa
+Thomasine
+thomasing
+Thomasite
+thomisid
+Thomisidae
+Thomism
+Thomist
+Thomistic
+Thomistical
+Thomite
+Thomomys
+thomsenolite
+Thomsonian
+Thomsonianism
+thomsonite
+thon
+thonder
+Thondracians
+Thondraki
+Thondrakians
+thone
+thong
+Thonga
+thonged
+thongman
+thongy
+thoo
+thooid
+thoom
+thoracalgia
+thoracaorta
+thoracectomy
+thoracentesis
+thoraces
+thoracic
+Thoracica
+thoracical
+thoracicoabdominal
+thoracicoacromial
+thoracicohumeral
+thoracicolumbar
+thoraciform
+thoracispinal
+thoracoabdominal
+thoracoacromial
+thoracobronchotomy
+thoracoceloschisis
+thoracocentesis
+thoracocyllosis
+thoracocyrtosis
+thoracodelphus
+thoracodidymus
+thoracodorsal
+thoracodynia
+thoracogastroschisis
+thoracograph
+thoracohumeral
+thoracolumbar
+thoracolysis
+thoracomelus
+thoracometer
+thoracometry
+thoracomyodynia
+thoracopagus
+thoracoplasty
+thoracoschisis
+thoracoscope
+thoracoscopy
+Thoracostei
+thoracostenosis
+thoracostomy
+Thoracostraca
+thoracostracan
+thoracostracous
+thoracotomy
+thoral
+thorascope
+thorax
+thore
+thoria
+thorianite
+thoriate
+thoric
+thoriferous
+thorina
+thorite
+thorium
+thorn
+thornback
+thornbill
+thornbush
+thorned
+thornen
+thornhead
+thornily
+thorniness
+thornless
+thornlessness
+thornlet
+thornlike
+thornproof
+thornstone
+thorntail
+thorny
+thoro
+thorocopagous
+thorogummite
+thoron
+thorough
+Thoroughbred
+thoroughbred
+thoroughbredness
+thoroughfare
+thoroughfarer
+thoroughfaresome
+thoroughfoot
+thoroughgoing
+thoroughgoingly
+thoroughgoingness
+thoroughgrowth
+thoroughly
+thoroughness
+thoroughpaced
+thoroughpin
+thoroughsped
+thoroughstem
+thoroughstitch
+thoroughstitched
+thoroughwax
+thoroughwort
+thorp
+thort
+thorter
+thortveitite
+Thos
+Those
+those
+thou
+though
+thought
+thoughted
+thoughten
+thoughtful
+thoughtfully
+thoughtfulness
+thoughtkin
+thoughtless
+thoughtlessly
+thoughtlessness
+thoughtlet
+thoughtness
+thoughtsick
+thoughty
+thousand
+thousandfold
+thousandfoldly
+thousandth
+thousandweight
+thouse
+thow
+thowel
+thowless
+thowt
+Thraces
+Thracian
+thrack
+thraep
+thrail
+thrain
+thrall
+thrallborn
+thralldom
+thram
+thrammle
+thrang
+thrangity
+thranite
+thranitic
+thrap
+thrapple
+thrash
+thrashel
+thrasher
+thrasherman
+thrashing
+thrasonic
+thrasonical
+thrasonically
+thrast
+Thraupidae
+thrave
+thraver
+thraw
+thrawcrook
+thrawn
+thrawneen
+Thrax
+thread
+threadbare
+threadbareness
+threadbarity
+threaded
+threaden
+threader
+threadfin
+threadfish
+threadflower
+threadfoot
+threadiness
+threadle
+threadless
+threadlet
+threadlike
+threadmaker
+threadmaking
+threadway
+threadweed
+threadworm
+thready
+threap
+threaper
+threat
+threaten
+threatenable
+threatener
+threatening
+threateningly
+threatful
+threatfully
+threatless
+threatproof
+three
+threefold
+threefolded
+threefoldedness
+threefoldly
+threefoldness
+threeling
+threeness
+threepence
+threepenny
+threepennyworth
+threescore
+threesome
+thremmatology
+threne
+threnetic
+threnetical
+threnode
+threnodial
+threnodian
+threnodic
+threnodical
+threnodist
+threnody
+threnos
+threonin
+threonine
+threose
+threpsology
+threptic
+thresh
+threshel
+thresher
+thresherman
+threshingtime
+threshold
+Threskiornithidae
+Threskiornithinae
+threw
+thribble
+thrice
+thricecock
+thridacium
+thrift
+thriftbox
+thriftily
+thriftiness
+thriftless
+thriftlessly
+thriftlessness
+thriftlike
+thrifty
+thrill
+thriller
+thrillful
+thrillfully
+thrilling
+thrillingly
+thrillingness
+thrillproof
+thrillsome
+thrilly
+thrimble
+thrimp
+Thrinax
+thring
+thrinter
+thrioboly
+thrip
+thripel
+Thripidae
+thripple
+thrips
+thrive
+thriveless
+thriven
+thriver
+thriving
+thrivingly
+thrivingness
+thro
+throat
+throatal
+throatband
+throated
+throatful
+throatily
+throatiness
+throating
+throatlash
+throatlatch
+throatless
+throatlet
+throatroot
+throatstrap
+throatwort
+throaty
+throb
+throbber
+throbbingly
+throbless
+throck
+throdden
+throddy
+throe
+thrombase
+thrombin
+thromboangiitis
+thromboarteritis
+thrombocyst
+thrombocyte
+thrombocytopenia
+thrombogen
+thrombogenic
+thromboid
+thrombokinase
+thrombolymphangitis
+thrombopenia
+thrombophlebitis
+thromboplastic
+thromboplastin
+thrombose
+thrombosis
+thrombostasis
+thrombotic
+thrombus
+thronal
+throne
+thronedom
+throneless
+thronelet
+thronelike
+throneward
+throng
+thronger
+throngful
+throngingly
+thronize
+thropple
+throstle
+throstlelike
+throttle
+throttler
+throttling
+throttlingly
+throu
+throuch
+throucht
+through
+throughbear
+throughbred
+throughcome
+throughgang
+throughganging
+throughgoing
+throughgrow
+throughknow
+throughout
+throughput
+throve
+throw
+throwaway
+throwback
+throwdown
+thrower
+throwing
+thrown
+throwoff
+throwout
+throwster
+throwwort
+thrum
+thrummer
+thrummers
+thrummy
+thrumwort
+thrush
+thrushel
+thrushlike
+thrushy
+thrust
+thruster
+thrustful
+thrustfulness
+thrusting
+thrustings
+thrutch
+thrutchings
+Thruthvang
+thruv
+thrymsa
+Thryonomys
+Thuan
+Thuban
+Thucydidean
+thud
+thudding
+thuddingly
+thug
+thugdom
+thuggee
+thuggeeism
+thuggery
+thuggess
+thuggish
+thuggism
+Thuidium
+Thuja
+thujene
+thujin
+thujone
+Thujopsis
+thujyl
+Thule
+thulia
+thulir
+thulite
+thulium
+thulr
+thuluth
+thumb
+thumbbird
+thumbed
+thumber
+thumbkin
+thumble
+thumbless
+thumblike
+thumbmark
+thumbnail
+thumbpiece
+thumbprint
+thumbrope
+thumbscrew
+thumbstall
+thumbstring
+thumbtack
+thumby
+thumlungur
+thump
+thumper
+thumping
+thumpingly
+Thunar
+Thunbergia
+thunbergilene
+thunder
+thunderation
+thunderball
+thunderbearer
+thunderbearing
+thunderbird
+thunderblast
+thunderbolt
+thunderburst
+thunderclap
+thundercloud
+thundercrack
+thunderer
+thunderfish
+thunderflower
+thunderful
+thunderhead
+thunderheaded
+thundering
+thunderingly
+thunderless
+thunderlike
+thunderous
+thunderously
+thunderousness
+thunderpeal
+thunderplump
+thunderproof
+thundershower
+thundersmite
+thundersquall
+thunderstick
+thunderstone
+thunderstorm
+thunderstrike
+thunderstroke
+thunderstruck
+thunderwood
+thunderworm
+thunderwort
+thundery
+thundrous
+thundrously
+thung
+thunge
+Thunnidae
+Thunnus
+Thunor
+thuoc
+Thurberia
+thurible
+thuribuler
+thuribulum
+thurifer
+thuriferous
+thurificate
+thurificati
+thurification
+thurify
+Thuringian
+thuringite
+Thurio
+thurl
+thurm
+thurmus
+Thurnia
+Thurniaceae
+thurrock
+Thursday
+thurse
+thurt
+thus
+thusgate
+Thushi
+thusly
+thusness
+thuswise
+thutter
+Thuyopsis
+thwack
+thwacker
+thwacking
+thwackingly
+thwackstave
+thwaite
+thwart
+thwartedly
+thwarteous
+thwarter
+thwarting
+thwartingly
+thwartly
+thwartman
+thwartness
+thwartover
+thwartsaw
+thwartship
+thwartships
+thwartways
+thwartwise
+thwite
+thwittle
+thy
+Thyestean
+Thyestes
+thyine
+thylacine
+thylacitis
+Thylacoleo
+Thylacynus
+thymacetin
+Thymallidae
+Thymallus
+thymate
+thyme
+thymectomize
+thymectomy
+thymegol
+Thymelaea
+Thymelaeaceae
+thymelaeaceous
+Thymelaeales
+thymelcosis
+thymele
+thymelic
+thymelical
+thymelici
+thymene
+thymetic
+thymic
+thymicolymphatic
+thymine
+thymiosis
+thymitis
+thymocyte
+thymogenic
+thymol
+thymolate
+thymolize
+thymolphthalein
+thymolsulphonephthalein
+thymoma
+thymonucleic
+thymopathy
+thymoprivic
+thymoprivous
+thymopsyche
+thymoquinone
+thymotactic
+thymotic
+Thymus
+thymus
+thymy
+thymyl
+thymylic
+thynnid
+Thynnidae
+Thyraden
+thyratron
+thyreoadenitis
+thyreoantitoxin
+thyreoarytenoid
+thyreoarytenoideus
+thyreocervical
+thyreocolloid
+Thyreocoridae
+thyreoepiglottic
+thyreogenic
+thyreogenous
+thyreoglobulin
+thyreoglossal
+thyreohyal
+thyreohyoid
+thyreoid
+thyreoidal
+thyreoideal
+thyreoidean
+thyreoidectomy
+thyreoiditis
+thyreoitis
+thyreolingual
+thyreoprotein
+thyreosis
+thyreotomy
+thyreotoxicosis
+thyreotropic
+thyridial
+Thyrididae
+thyridium
+Thyris
+thyrisiferous
+thyroadenitis
+thyroantitoxin
+thyroarytenoid
+thyroarytenoideus
+thyrocardiac
+thyrocele
+thyrocervical
+thyrocolloid
+thyrocricoid
+thyroepiglottic
+thyroepiglottidean
+thyrogenic
+thyroglobulin
+thyroglossal
+thyrohyal
+thyrohyoid
+thyrohyoidean
+thyroid
+thyroidal
+thyroidea
+thyroideal
+thyroidean
+thyroidectomize
+thyroidectomy
+thyroidism
+thyroiditis
+thyroidization
+thyroidless
+thyroidotomy
+thyroiodin
+thyrolingual
+thyronine
+thyroparathyroidectomize
+thyroparathyroidectomy
+thyroprival
+thyroprivia
+thyroprivic
+thyroprivous
+thyroprotein
+Thyrostraca
+thyrostracan
+thyrotherapy
+thyrotomy
+thyrotoxic
+thyrotoxicosis
+thyrotropic
+thyroxine
+thyrse
+thyrsiflorous
+thyrsiform
+thyrsoid
+thyrsoidal
+thyrsus
+Thysanocarpus
+thysanopter
+Thysanoptera
+thysanopteran
+thysanopteron
+thysanopterous
+Thysanoura
+thysanouran
+thysanourous
+Thysanura
+thysanuran
+thysanurian
+thysanuriform
+thysanurous
+thysel
+thyself
+thysen
+Ti
+ti
+Tiahuanacan
+Tiam
+tiang
+tiao
+tiar
+tiara
+tiaralike
+tiarella
+Tiatinagua
+tib
+Tibbie
+Tibbu
+tibby
+Tiberian
+Tiberine
+Tiberius
+tibet
+Tibetan
+tibey
+tibia
+tibiad
+tibiae
+tibial
+tibiale
+tibicinist
+tibiocalcanean
+tibiofemoral
+tibiofibula
+tibiofibular
+tibiometatarsal
+tibionavicular
+tibiopopliteal
+tibioscaphoid
+tibiotarsal
+tibiotarsus
+Tibouchina
+tibourbou
+tiburon
+Tiburtine
+tic
+tical
+ticca
+tice
+ticement
+ticer
+Tichodroma
+tichodrome
+tichorrhine
+tick
+tickbean
+tickbird
+tickeater
+ticked
+ticken
+ticker
+ticket
+ticketer
+ticketing
+ticketless
+ticketmonger
+tickey
+tickicide
+tickie
+ticking
+tickle
+tickleback
+ticklebrain
+tickled
+ticklely
+ticklenburg
+tickleness
+tickleproof
+tickler
+ticklesome
+tickless
+tickleweed
+tickling
+ticklingly
+ticklish
+ticklishly
+ticklishness
+tickly
+tickney
+tickproof
+tickseed
+tickseeded
+ticktack
+ticktacker
+ticktacktoe
+ticktick
+ticktock
+tickweed
+ticky
+ticul
+Ticuna
+Ticunan
+tid
+tidal
+tidally
+tidbit
+tiddle
+tiddledywinks
+tiddler
+tiddley
+tiddling
+tiddlywink
+tiddlywinking
+tiddy
+tide
+tided
+tideful
+tidehead
+tideland
+tideless
+tidelessness
+tidelike
+tidely
+tidemaker
+tidemaking
+tidemark
+tiderace
+tidesman
+tidesurveyor
+Tideswell
+tidewaiter
+tidewaitership
+tideward
+tidewater
+tideway
+tidiable
+tidily
+tidiness
+tiding
+tidingless
+tidings
+tidley
+tidological
+tidology
+tidy
+tidyism
+tidytips
+tie
+tieback
+tied
+Tiefenthal
+tiemaker
+tiemaking
+tiemannite
+tien
+tiepin
+tier
+tierce
+tierced
+tierceron
+tiered
+tierer
+tierlike
+tiersman
+tietick
+tiewig
+tiewigged
+tiff
+tiffany
+tiffanyite
+tiffie
+tiffin
+tiffish
+tiffle
+tiffy
+tifinagh
+tift
+tifter
+tig
+tige
+tigella
+tigellate
+tigelle
+tigellum
+tigellus
+tiger
+tigerbird
+tigereye
+tigerflower
+tigerfoot
+tigerhearted
+tigerhood
+tigerish
+tigerishly
+tigerishness
+tigerism
+tigerkin
+tigerlike
+tigerling
+tigerly
+tigernut
+tigerproof
+tigerwood
+tigery
+Tigger
+tigger
+tight
+tighten
+tightener
+tightfisted
+tightish
+tightly
+tightness
+tightrope
+tights
+tightwad
+tightwire
+tiglaldehyde
+tiglic
+tiglinic
+tignum
+Tigrai
+Tigre
+Tigrean
+tigress
+tigresslike
+Tigridia
+Tigrina
+tigrine
+Tigris
+tigroid
+tigrolysis
+tigrolytic
+tigtag
+Tigua
+Tigurine
+Tiki
+tikitiki
+tikka
+tikker
+tiklin
+tikolosh
+tikor
+tikur
+til
+tilaite
+tilaka
+tilasite
+tilbury
+Tilda
+tilde
+tile
+tiled
+tilefish
+tilelike
+tilemaker
+tilemaking
+tiler
+tileroot
+tilery
+tileseed
+tilestone
+tileways
+tilework
+tileworks
+tilewright
+tileyard
+Tilia
+Tiliaceae
+tiliaceous
+tilikum
+tiling
+till
+tillable
+Tillaea
+Tillaeastrum
+tillage
+Tillamook
+Tillandsia
+tiller
+tillering
+tillerless
+tillerman
+Tilletia
+Tilletiaceae
+tilletiaceous
+tilley
+tillite
+tillodont
+Tillodontia
+Tillodontidae
+tillot
+tillotter
+tilly
+tilmus
+tilpah
+Tilsit
+tilt
+tiltable
+tiltboard
+tilter
+tilth
+tilting
+tiltlike
+tiltmaker
+tiltmaking
+tiltup
+tilty
+tiltyard
+tilyer
+Tim
+timable
+Timaeus
+Timalia
+Timaliidae
+Timaliinae
+timaliine
+timaline
+Timani
+timar
+timarau
+timawa
+timazite
+timbal
+timbale
+timbang
+timbe
+timber
+timbered
+timberer
+timberhead
+timbering
+timberjack
+timberland
+timberless
+timberlike
+timberling
+timberman
+timbermonger
+timbern
+timbersome
+timbertuned
+timberwood
+timberwork
+timberwright
+timbery
+timberyard
+Timbira
+timbo
+timbre
+timbrel
+timbreled
+timbreler
+timbrologist
+timbrology
+timbromania
+timbromaniac
+timbromanist
+timbrophilic
+timbrophilism
+timbrophilist
+timbrophily
+time
+timeable
+timecard
+timed
+timeful
+timefully
+timefulness
+timekeep
+timekeeper
+timekeepership
+timeless
+timelessly
+timelessness
+Timelia
+Timeliidae
+timeliine
+timelily
+timeliness
+timeling
+timely
+timenoguy
+timeous
+timeously
+timepiece
+timepleaser
+timeproof
+timer
+times
+timesaver
+timesaving
+timeserver
+timeserving
+timeservingness
+timetable
+timetaker
+timetaking
+timeward
+timework
+timeworker
+timeworn
+Timias
+timid
+timidity
+timidly
+timidness
+timing
+timish
+timist
+Timne
+Timo
+timocracy
+timocratic
+timocratical
+Timon
+timon
+timoneer
+Timonian
+Timonism
+Timonist
+Timonize
+timor
+Timorese
+timorous
+timorously
+timorousness
+Timote
+Timotean
+Timothean
+Timothy
+timothy
+timpani
+timpanist
+timpano
+Timucua
+Timucuan
+Timuquan
+Timuquanan
+tin
+Tina
+Tinamidae
+tinamine
+tinamou
+tinampipi
+tincal
+tinchel
+tinchill
+tinclad
+tinct
+tinction
+tinctorial
+tinctorially
+tinctorious
+tinctumutation
+tincture
+tind
+tindal
+tindalo
+tinder
+tinderbox
+tindered
+tinderish
+tinderlike
+tinderous
+tindery
+tine
+tinea
+tineal
+tinean
+tined
+tinegrass
+tineid
+Tineidae
+Tineina
+tineine
+tineman
+tineoid
+Tineoidea
+tinetare
+tinety
+tineweed
+tinful
+Ting
+ting
+tinge
+tinged
+tinger
+Tinggian
+tingi
+tingibility
+tingible
+tingid
+Tingidae
+Tingis
+tingitid
+Tingitidae
+tinglass
+tingle
+tingler
+tingletangle
+tingling
+tinglingly
+tinglish
+tingly
+tingtang
+tinguaite
+tinguaitic
+Tinguian
+tinguy
+tinhorn
+tinhouse
+tinily
+tininess
+tining
+tink
+tinker
+tinkerbird
+tinkerdom
+tinkerer
+tinkerlike
+tinkerly
+tinkershire
+tinkershue
+tinkerwise
+tinkle
+tinkler
+tinklerman
+tinkling
+tinklingly
+tinkly
+tinlet
+tinlike
+tinman
+Tinne
+tinned
+tinner
+tinnery
+tinnet
+Tinni
+tinnified
+tinnily
+tinniness
+tinning
+tinnitus
+tinnock
+tinny
+Tino
+Tinoceras
+tinosa
+tinsel
+tinsellike
+tinselly
+tinselmaker
+tinselmaking
+tinselry
+tinselweaver
+tinselwork
+tinsman
+tinsmith
+tinsmithing
+tinsmithy
+tinstone
+tinstuff
+tint
+tinta
+tintage
+tintamarre
+tintarron
+tinted
+tinter
+tintie
+tintiness
+tinting
+tintingly
+tintinnabula
+tintinnabulant
+tintinnabular
+tintinnabulary
+tintinnabulate
+tintinnabulation
+tintinnabulatory
+tintinnabulism
+tintinnabulist
+tintinnabulous
+tintinnabulum
+tintist
+tintless
+tintometer
+tintometric
+tintometry
+tinty
+tintype
+tintyper
+tinwald
+tinware
+tinwoman
+tinwork
+tinworker
+tinworking
+tiny
+tinzenite
+Tionontates
+Tionontati
+Tiou
+tip
+tipburn
+tipcart
+tipcat
+tipe
+tipful
+tiphead
+Tiphia
+Tiphiidae
+tipiti
+tiple
+tipless
+tiplet
+tipman
+tipmost
+tiponi
+tippable
+tipped
+tippee
+tipper
+tippet
+tipping
+tipple
+tippleman
+tippler
+tipply
+tipproof
+tippy
+tipsification
+tipsifier
+tipsify
+tipsily
+tipsiness
+tipstaff
+tipster
+tipstock
+tipsy
+tiptail
+tipteerer
+tiptilt
+tiptoe
+tiptoeing
+tiptoeingly
+tiptop
+tiptopness
+tiptopper
+tiptoppish
+tiptoppishness
+tiptopsome
+Tipula
+Tipularia
+tipulid
+Tipulidae
+tipuloid
+Tipuloidea
+tipup
+Tipura
+tirade
+tiralee
+tire
+tired
+tiredly
+tiredness
+tiredom
+tirehouse
+tireless
+tirelessly
+tirelessness
+tiremaid
+tiremaker
+tiremaking
+tireman
+tirer
+tireroom
+tiresmith
+tiresome
+tiresomely
+tiresomeness
+tiresomeweed
+tirewoman
+Tirhutia
+tiriba
+tiring
+tiringly
+tirl
+tirma
+tirocinium
+Tirolean
+Tirolese
+Tironian
+tirr
+tirralirra
+tirret
+Tirribi
+tirrivee
+tirrlie
+tirrwirr
+tirthankara
+Tirurai
+tirve
+tirwit
+tisane
+tisar
+Tishiya
+Tishri
+Tisiphone
+tissual
+tissue
+tissued
+tissueless
+tissuelike
+tissuey
+tisswood
+tiswin
+tit
+Titan
+titanate
+titanaugite
+Titanesque
+Titaness
+titania
+Titanian
+Titanic
+titanic
+Titanical
+Titanically
+Titanichthyidae
+Titanichthys
+titaniferous
+titanifluoride
+Titanism
+titanite
+titanitic
+titanium
+Titanlike
+titano
+titanocolumbate
+titanocyanide
+titanofluoride
+Titanolater
+Titanolatry
+Titanomachia
+Titanomachy
+titanomagnetite
+titanoniobate
+titanosaur
+Titanosaurus
+titanosilicate
+titanothere
+Titanotheridae
+Titanotherium
+titanous
+titanyl
+titar
+titbit
+titbitty
+tite
+titer
+titeration
+titfish
+tithable
+tithal
+tithe
+tithebook
+titheless
+tithemonger
+tithepayer
+tither
+titheright
+tithing
+tithingman
+tithingpenny
+tithonic
+tithonicity
+tithonographic
+tithonometer
+Tithymalopsis
+Tithymalus
+titi
+Titian
+titian
+Titianesque
+Titianic
+titien
+Tities
+titilate
+titillability
+titillant
+titillater
+titillating
+titillatingly
+titillation
+titillative
+titillator
+titillatory
+titivate
+titivation
+titivator
+titlark
+title
+titleboard
+titled
+titledom
+titleholder
+titleless
+titleproof
+titler
+titleship
+titlike
+titling
+titlist
+titmal
+titman
+Titmarsh
+Titmarshian
+titmouse
+Titoism
+Titoist
+titoki
+titrable
+titratable
+titrate
+titration
+titre
+titrimetric
+titrimetry
+titter
+titterel
+titterer
+tittering
+titteringly
+tittery
+tittie
+tittle
+tittlebat
+tittler
+tittup
+tittupy
+titty
+tittymouse
+titubancy
+titubant
+titubantly
+titubate
+titubation
+titular
+titularity
+titularly
+titulary
+titulation
+titule
+titulus
+Titurel
+Titus
+tiver
+Tivoli
+tivoli
+tivy
+Tiwaz
+tiza
+tizeur
+tizzy
+tjanting
+tji
+tjosite
+tlaco
+Tlakluit
+Tlapallan
+Tlascalan
+Tlingit
+tmema
+Tmesipteris
+tmesis
+to
+toa
+toad
+toadback
+toadeat
+toadeater
+toader
+toadery
+toadess
+toadfish
+toadflax
+toadflower
+toadhead
+toadier
+toadish
+toadless
+toadlet
+toadlike
+toadlikeness
+toadling
+toadpipe
+toadroot
+toadship
+toadstone
+toadstool
+toadstoollike
+toadwise
+toady
+toadyish
+toadyism
+toadyship
+Toag
+toast
+toastable
+toastee
+toaster
+toastiness
+toastmaster
+toastmastery
+toastmistress
+toasty
+toat
+toatoa
+Toba
+tobacco
+tobaccofied
+tobaccoism
+tobaccoite
+tobaccoless
+tobaccolike
+tobaccoman
+tobacconalian
+tobacconist
+tobacconistical
+tobacconize
+tobaccophil
+tobaccoroot
+tobaccoweed
+tobaccowood
+tobaccoy
+tobe
+Tobiah
+Tobias
+Tobikhar
+tobine
+tobira
+toboggan
+tobogganeer
+tobogganer
+tobogganist
+Toby
+toby
+tobyman
+tocalote
+toccata
+Tocharese
+Tocharian
+Tocharic
+Tocharish
+tocher
+tocherless
+tock
+toco
+Tocobaga
+tocodynamometer
+tocogenetic
+tocogony
+tocokinin
+tocological
+tocologist
+tocology
+tocome
+tocometer
+tocopherol
+tocororo
+tocsin
+tocusso
+Tod
+tod
+Toda
+today
+todayish
+Todd
+todder
+toddick
+toddite
+toddle
+toddlekins
+toddler
+toddy
+toddyize
+toddyman
+tode
+Todea
+Todidae
+Todus
+tody
+toe
+toeboard
+toecap
+toecapped
+toed
+toeless
+toelike
+toellite
+toenail
+toeplate
+Toerless
+toernebohmite
+toetoe
+toff
+toffee
+toffeeman
+toffing
+toffish
+toffy
+toffyman
+Tofieldia
+Toft
+toft
+tofter
+toftman
+toftstead
+tofu
+tog
+toga
+togaed
+togalike
+togata
+togate
+togated
+togawise
+together
+togetherhood
+togetheriness
+togetherness
+toggel
+toggery
+toggle
+toggler
+togless
+togs
+togt
+togue
+toher
+toheroa
+toho
+Tohome
+tohubohu
+tohunga
+toi
+toil
+toiled
+toiler
+toilet
+toileted
+toiletry
+toilette
+toiletted
+toiletware
+toilful
+toilfully
+toilinet
+toiling
+toilingly
+toilless
+toillessness
+toilsome
+toilsomely
+toilsomeness
+toilworn
+toise
+toit
+toitish
+toity
+Tokay
+tokay
+toke
+Tokelau
+token
+tokened
+tokenless
+toko
+tokology
+tokonoma
+tokopat
+tol
+tolamine
+tolan
+tolane
+tolbooth
+told
+toldo
+tole
+Toledan
+Toledo
+Toledoan
+tolerability
+tolerable
+tolerableness
+tolerablish
+tolerably
+tolerance
+tolerancy
+Tolerant
+tolerant
+tolerantism
+tolerantly
+tolerate
+toleration
+tolerationism
+tolerationist
+tolerative
+tolerator
+tolerism
+Toletan
+tolfraedic
+tolguacha
+tolidine
+tolite
+toll
+tollable
+tollage
+tollbooth
+Tollefsen
+toller
+tollery
+tollgate
+tollgatherer
+tollhouse
+tolliker
+tolling
+tollkeeper
+tollman
+tollmaster
+tollpenny
+tolltaker
+tolly
+Tolowa
+tolpatch
+tolpatchery
+tolsester
+tolsey
+Tolstoyan
+Tolstoyism
+Tolstoyist
+tolt
+Toltec
+Toltecan
+tolter
+tolu
+tolualdehyde
+toluate
+toluene
+toluic
+toluide
+toluidide
+toluidine
+toluidino
+toluido
+Toluifera
+tolunitrile
+toluol
+toluquinaldine
+tolusafranine
+toluyl
+toluylene
+toluylenediamine
+toluylic
+tolyl
+tolylene
+tolylenediamine
+Tolypeutes
+tolypeutine
+Tom
+Toma
+tomahawk
+tomahawker
+tomalley
+toman
+Tomas
+tomatillo
+tomato
+tomb
+tombac
+tombal
+tombe
+tombic
+tombless
+tomblet
+tomblike
+tombola
+tombolo
+tomboy
+tomboyful
+tomboyish
+tomboyishly
+tomboyishness
+tomboyism
+tombstone
+tomcat
+tomcod
+tome
+tomeful
+tomelet
+toment
+tomentose
+tomentous
+tomentulose
+tomentum
+tomfool
+tomfoolery
+tomfoolish
+tomfoolishness
+tomial
+tomin
+tomish
+Tomistoma
+tomium
+tomjohn
+Tomkin
+tomkin
+Tommer
+Tomming
+Tommy
+tommy
+tommybag
+tommycod
+tommyrot
+tomnoddy
+tomnoup
+tomogram
+tomographic
+tomography
+Tomopteridae
+Tomopteris
+tomorn
+tomorrow
+tomorrower
+tomorrowing
+tomorrowness
+tomosis
+Tompion
+tompiper
+tompon
+tomtate
+tomtit
+Tomtitmouse
+ton
+tonal
+tonalamatl
+tonalist
+tonalite
+tonalitive
+tonality
+tonally
+tonant
+tonation
+tondino
+tone
+toned
+toneless
+tonelessly
+tonelessness
+toneme
+toneproof
+toner
+tonetic
+tonetically
+tonetician
+tonetics
+tong
+Tonga
+tonga
+Tongan
+Tongas
+tonger
+tongkang
+tongman
+Tongrian
+tongs
+tongsman
+tongue
+tonguecraft
+tongued
+tonguedoughty
+tonguefence
+tonguefencer
+tongueflower
+tongueful
+tongueless
+tonguelet
+tonguelike
+tongueman
+tonguemanship
+tongueplay
+tongueproof
+tonguer
+tongueshot
+tonguesman
+tonguesore
+tonguester
+tonguetip
+tonguey
+tonguiness
+tonguing
+tonic
+tonically
+tonicity
+tonicize
+tonicobalsamic
+tonicoclonic
+tonicostimulant
+tonify
+tonight
+Tonikan
+tonish
+tonishly
+tonishness
+tonite
+tonitrocirrus
+tonitruant
+tonitruone
+tonitruous
+tonjon
+tonk
+Tonkawa
+Tonkawan
+tonkin
+Tonkinese
+tonlet
+Tonna
+tonnage
+tonneau
+tonneaued
+tonner
+tonnish
+tonnishly
+tonnishness
+tonoclonic
+tonogram
+tonograph
+tonological
+tonology
+tonometer
+tonometric
+tonometry
+tonophant
+tonoplast
+tonoscope
+tonotactic
+tonotaxis
+tonous
+tonsbergite
+tonsil
+tonsilectomy
+tonsilitic
+tonsillar
+tonsillary
+tonsillectome
+tonsillectomic
+tonsillectomize
+tonsillectomy
+tonsillith
+tonsillitic
+tonsillitis
+tonsillolith
+tonsillotome
+tonsillotomy
+tonsilomycosis
+tonsor
+tonsorial
+tonsurate
+tonsure
+tonsured
+tontine
+tontiner
+Tonto
+tonus
+Tony
+tony
+tonyhoop
+too
+toodle
+toodleloodle
+took
+tooken
+tool
+toolbox
+toolbuilder
+toolbuilding
+tooler
+toolhead
+toolholder
+toolholding
+tooling
+toolless
+toolmaker
+toolmaking
+toolman
+toolmark
+toolmarking
+toolplate
+toolroom
+toolsetter
+toolslide
+toolsmith
+toolstock
+toolstone
+toom
+toomly
+toon
+Toona
+toonwood
+toop
+toorie
+toorock
+tooroo
+toosh
+toot
+tooter
+tooth
+toothache
+toothaching
+toothachy
+toothbill
+toothbrush
+toothbrushy
+toothchiseled
+toothcomb
+toothcup
+toothdrawer
+toothdrawing
+toothed
+toother
+toothflower
+toothful
+toothill
+toothing
+toothless
+toothlessly
+toothlessness
+toothlet
+toothleted
+toothlike
+toothpick
+toothplate
+toothproof
+toothsome
+toothsomely
+toothsomeness
+toothstick
+toothwash
+toothwork
+toothwort
+toothy
+tootle
+tootler
+tootlish
+tootsy
+toozle
+toozoo
+top
+topalgia
+toparch
+toparchia
+toparchical
+toparchy
+topass
+Topatopa
+topaz
+topazfels
+topazine
+topazite
+topazolite
+topazy
+topcap
+topcast
+topchrome
+topcoat
+topcoating
+tope
+topectomy
+topee
+topeewallah
+topeng
+topepo
+toper
+toperdom
+topesthesia
+topflight
+topfull
+topgallant
+toph
+tophaceous
+tophaike
+Tophet
+tophetic
+tophetize
+tophus
+tophyperidrosis
+topi
+topia
+topiarian
+topiarist
+topiarius
+topiary
+topic
+topical
+topicality
+topically
+topinambou
+Topinish
+topknot
+topknotted
+topless
+toplighted
+toplike
+topline
+toploftical
+toploftily
+toploftiness
+toplofty
+topmaker
+topmaking
+topman
+topmast
+topmost
+topmostly
+topnotch
+topnotcher
+topo
+topoalgia
+topochemical
+topognosia
+topognosis
+topograph
+topographer
+topographic
+topographical
+topographically
+topographics
+topographist
+topographize
+topographometric
+topography
+topolatry
+topologic
+topological
+topologist
+topology
+toponarcosis
+toponym
+toponymal
+toponymic
+toponymical
+toponymics
+toponymist
+toponymy
+topophobia
+topophone
+topotactic
+topotaxis
+topotype
+topotypic
+topotypical
+topped
+topper
+toppiece
+topping
+toppingly
+toppingness
+topple
+toppler
+topply
+toppy
+toprail
+toprope
+tops
+topsail
+topsailite
+topside
+topsl
+topsman
+topsoil
+topstone
+topswarm
+Topsy
+topsyturn
+toptail
+topwise
+toque
+Tor
+tor
+tora
+torah
+Toraja
+toral
+toran
+torbanite
+torbanitic
+torbernite
+torc
+torcel
+torch
+torchbearer
+torchbearing
+torcher
+torchless
+torchlight
+torchlighted
+torchlike
+torchman
+torchon
+torchweed
+torchwood
+torchwort
+torcular
+torculus
+tordrillite
+tore
+toreador
+tored
+Torenia
+torero
+toreumatography
+toreumatology
+toreutic
+toreutics
+torfaceous
+torfel
+torgoch
+Torgot
+toric
+Toriest
+Torified
+torii
+Torilis
+Torinese
+Toriness
+torma
+tormen
+torment
+tormenta
+tormentable
+tormentation
+tormentative
+tormented
+tormentedly
+tormentful
+tormentil
+tormentilla
+tormenting
+tormentingly
+tormentingness
+tormentive
+tormentor
+tormentous
+tormentress
+tormentry
+tormentum
+tormina
+torminal
+torminous
+tormodont
+torn
+tornachile
+tornade
+tornadic
+tornado
+tornadoesque
+tornadoproof
+tornal
+tornaria
+tornarian
+tornese
+torney
+tornillo
+Tornit
+tornote
+tornus
+toro
+toroid
+toroidal
+torolillo
+Toromona
+Torontonian
+tororokombu
+Torosaurus
+torose
+torosity
+torotoro
+torous
+torpedineer
+Torpedinidae
+torpedinous
+torpedo
+torpedoer
+torpedoist
+torpedolike
+torpedoplane
+torpedoproof
+torpent
+torpescence
+torpescent
+torpid
+torpidity
+torpidly
+torpidness
+torpify
+torpitude
+torpor
+torporific
+torporize
+torquate
+torquated
+torque
+torqued
+torques
+torrefaction
+torrefication
+torrefy
+torrent
+torrentful
+torrentfulness
+torrential
+torrentiality
+torrentially
+torrentine
+torrentless
+torrentlike
+torrentuous
+torrentwise
+Torreya
+Torricellian
+torrid
+torridity
+torridly
+torridness
+Torridonian
+Torrubia
+torsade
+torse
+torsel
+torsibility
+torsigraph
+torsile
+torsimeter
+torsiogram
+torsiograph
+torsiometer
+torsion
+torsional
+torsionally
+torsioning
+torsionless
+torsive
+torsk
+torso
+torsoclusion
+torsometer
+torsoocclusion
+Torsten
+tort
+torta
+torteau
+torticollar
+torticollis
+torticone
+tortile
+tortility
+tortilla
+tortille
+tortious
+tortiously
+tortive
+tortoise
+tortoiselike
+Tortonian
+tortrices
+tortricid
+Tortricidae
+Tortricina
+tortricine
+tortricoid
+Tortricoidea
+Tortrix
+tortula
+Tortulaceae
+tortulaceous
+tortulous
+tortuose
+tortuosity
+tortuous
+tortuously
+tortuousness
+torturable
+torturableness
+torture
+tortured
+torturedly
+tortureproof
+torturer
+torturesome
+torturing
+torturingly
+torturous
+torturously
+toru
+torula
+torulaceous
+torulaform
+toruliform
+torulin
+toruloid
+torulose
+torulosis
+torulous
+torulus
+torus
+torve
+torvid
+torvity
+torvous
+Tory
+tory
+Torydom
+Toryess
+Toryfication
+Toryfy
+toryhillite
+Toryish
+Toryism
+Toryistic
+Toryize
+Toryship
+toryweed
+tosaphist
+tosaphoth
+toscanite
+Tosephta
+Tosephtas
+tosh
+toshakhana
+tosher
+toshery
+toshly
+toshnail
+toshy
+tosily
+Tosk
+Toskish
+toss
+tosser
+tossicated
+tossily
+tossing
+tossingly
+tossment
+tosspot
+tossup
+tossy
+tost
+tosticate
+tostication
+toston
+tosy
+tot
+total
+totalitarian
+totalitarianism
+totality
+totalization
+totalizator
+totalize
+totalizer
+totally
+totalness
+totanine
+Totanus
+totaquin
+totaquina
+totaquine
+totara
+totchka
+tote
+toteload
+totem
+totemic
+totemically
+totemism
+totemist
+totemistic
+totemite
+totemization
+totemy
+toter
+tother
+totient
+Totipalmatae
+totipalmate
+totipalmation
+totipotence
+totipotency
+totipotent
+totipotential
+totipotentiality
+totitive
+toto
+Totonac
+Totonacan
+Totonaco
+totora
+Totoro
+totquot
+totter
+totterer
+tottergrass
+tottering
+totteringly
+totterish
+tottery
+Tottie
+totting
+tottle
+tottlish
+totty
+tottyhead
+totuava
+totum
+toty
+totyman
+tou
+toucan
+toucanet
+Toucanid
+touch
+touchable
+touchableness
+touchback
+touchbell
+touchbox
+touchdown
+touched
+touchedness
+toucher
+touchhole
+touchily
+touchiness
+touching
+touchingly
+touchingness
+touchless
+touchline
+touchous
+touchpan
+touchpiece
+touchstone
+touchwood
+touchy
+Toufic
+toug
+tough
+toughen
+toughener
+toughhead
+toughhearted
+toughish
+toughly
+toughness
+tought
+tould
+toumnah
+Tounatea
+toup
+toupee
+toupeed
+toupet
+tour
+touraco
+tourbillion
+tourer
+tourette
+touring
+tourism
+tourist
+touristdom
+touristic
+touristproof
+touristry
+touristship
+touristy
+tourize
+tourmaline
+tourmalinic
+tourmaliniferous
+tourmalinization
+tourmalinize
+tourmalite
+tourn
+tournament
+tournamental
+tournant
+tournasin
+tournay
+tournee
+Tournefortia
+Tournefortian
+tourney
+tourneyer
+tourniquet
+tourte
+tousche
+touse
+touser
+tousle
+tously
+tousy
+tout
+touter
+Tovah
+tovar
+Tovaria
+Tovariaceae
+tovariaceous
+tovarish
+tow
+towable
+towage
+towai
+towan
+toward
+towardliness
+towardly
+towardness
+towards
+towboat
+towcock
+towd
+towel
+towelette
+toweling
+towelry
+tower
+towered
+towering
+toweringly
+towerless
+towerlet
+towerlike
+towerman
+towerproof
+towerwise
+towerwork
+towerwort
+towery
+towght
+towhead
+towheaded
+towhee
+towing
+towkay
+towlike
+towline
+towmast
+town
+towned
+townee
+towner
+townet
+townfaring
+townfolk
+townful
+towngate
+townhood
+townify
+towniness
+townish
+townishly
+townishness
+townist
+townland
+townless
+townlet
+townlike
+townling
+townly
+townman
+townsboy
+townscape
+Townsendia
+Townsendite
+townsfellow
+townsfolk
+township
+townside
+townsite
+townsman
+townspeople
+townswoman
+townward
+townwards
+townwear
+towny
+towpath
+towrope
+towser
+towy
+tox
+toxa
+toxalbumic
+toxalbumin
+toxalbumose
+toxamin
+toxanemia
+toxaphene
+toxcatl
+toxemia
+toxemic
+toxic
+toxicaemia
+toxical
+toxically
+toxicant
+toxicarol
+toxication
+toxicemia
+toxicity
+toxicodendrol
+Toxicodendron
+toxicoderma
+toxicodermatitis
+toxicodermatosis
+toxicodermia
+toxicodermitis
+toxicogenic
+toxicognath
+toxicohaemia
+toxicohemia
+toxicoid
+toxicologic
+toxicological
+toxicologically
+toxicologist
+toxicology
+toxicomania
+toxicopathic
+toxicopathy
+toxicophagous
+toxicophagy
+toxicophidia
+toxicophobia
+toxicosis
+toxicotraumatic
+toxicum
+toxidermic
+toxidermitis
+toxifer
+Toxifera
+toxiferous
+toxigenic
+toxihaemia
+toxihemia
+toxiinfection
+toxiinfectious
+toxin
+toxinemia
+toxinfection
+toxinfectious
+toxinosis
+toxiphobia
+toxiphobiac
+toxiphoric
+toxitabellae
+toxity
+Toxodon
+toxodont
+Toxodontia
+toxogenesis
+Toxoglossa
+toxoglossate
+toxoid
+toxology
+toxolysis
+toxon
+toxone
+toxonosis
+toxophil
+toxophile
+toxophilism
+toxophilite
+toxophilitic
+toxophilitism
+toxophilous
+toxophily
+toxophoric
+toxophorous
+toxoplasmosis
+toxosis
+toxosozin
+Toxostoma
+toxotae
+Toxotes
+Toxotidae
+Toxylon
+toy
+toydom
+toyer
+toyful
+toyfulness
+toyhouse
+toying
+toyingly
+toyish
+toyishly
+toyishness
+toyland
+toyless
+toylike
+toymaker
+toymaking
+toyman
+toyon
+toyshop
+toysome
+toytown
+toywoman
+toywort
+toze
+tozee
+tozer
+tra
+trabacolo
+trabal
+trabant
+trabascolo
+trabea
+trabeae
+trabeatae
+trabeated
+trabeation
+trabecula
+trabecular
+trabecularism
+trabeculate
+trabeculated
+trabeculation
+trabecule
+trabuch
+trabucho
+Tracaulon
+trace
+traceability
+traceable
+traceableness
+traceably
+traceless
+tracelessly
+tracer
+traceried
+tracery
+Tracey
+trachea
+tracheaectasy
+tracheal
+trachealgia
+trachealis
+trachean
+Trachearia
+trachearian
+tracheary
+Tracheata
+tracheate
+tracheation
+tracheid
+tracheidal
+tracheitis
+trachelagra
+trachelate
+trachelectomopexia
+trachelectomy
+trachelismus
+trachelitis
+trachelium
+tracheloacromialis
+trachelobregmatic
+tracheloclavicular
+trachelocyllosis
+trachelodynia
+trachelology
+trachelomastoid
+trachelopexia
+tracheloplasty
+trachelorrhaphy
+tracheloscapular
+Trachelospermum
+trachelotomy
+trachenchyma
+tracheobronchial
+tracheobronchitis
+tracheocele
+tracheochromatic
+tracheoesophageal
+tracheofissure
+tracheolar
+tracheolaryngeal
+tracheolaryngotomy
+tracheole
+tracheolingual
+tracheopathia
+tracheopathy
+tracheopharyngeal
+Tracheophonae
+tracheophone
+tracheophonesis
+tracheophonine
+tracheophony
+tracheoplasty
+tracheopyosis
+tracheorrhagia
+tracheoschisis
+tracheoscopic
+tracheoscopist
+tracheoscopy
+tracheostenosis
+tracheostomy
+tracheotome
+tracheotomist
+tracheotomize
+tracheotomy
+Trachinidae
+trachinoid
+Trachinus
+trachitis
+trachle
+Trachodon
+trachodont
+trachodontid
+Trachodontidae
+Trachoma
+trachomatous
+Trachomedusae
+trachomedusan
+trachyandesite
+trachybasalt
+trachycarpous
+Trachycarpus
+trachychromatic
+trachydolerite
+trachyglossate
+Trachylinae
+trachyline
+Trachymedusae
+trachymedusan
+trachyphonia
+trachyphonous
+Trachypteridae
+trachypteroid
+Trachypterus
+trachyspermous
+trachyte
+trachytic
+trachytoid
+tracing
+tracingly
+track
+trackable
+trackage
+trackbarrow
+tracked
+tracker
+trackhound
+trackingscout
+tracklayer
+tracklaying
+trackless
+tracklessly
+tracklessness
+trackman
+trackmanship
+trackmaster
+trackscout
+trackshifter
+tracksick
+trackside
+trackwalker
+trackway
+trackwork
+tract
+tractability
+tractable
+tractableness
+tractably
+tractarian
+Tractarianism
+tractarianize
+tractate
+tractator
+tractatule
+tractellate
+tractellum
+tractiferous
+tractile
+tractility
+traction
+tractional
+tractioneering
+Tractite
+tractlet
+tractor
+tractoration
+tractorism
+tractorist
+tractorization
+tractorize
+tractory
+tractrix
+Tracy
+tradable
+tradal
+trade
+tradecraft
+tradeful
+tradeless
+trademaster
+trader
+tradership
+Tradescantia
+tradesfolk
+tradesman
+tradesmanlike
+tradesmanship
+tradesmanwise
+tradespeople
+tradesperson
+tradeswoman
+tradiment
+trading
+tradite
+tradition
+traditional
+traditionalism
+traditionalist
+traditionalistic
+traditionality
+traditionalize
+traditionally
+traditionarily
+traditionary
+traditionate
+traditionately
+traditioner
+traditionism
+traditionist
+traditionitis
+traditionize
+traditionless
+traditionmonger
+traditious
+traditive
+traditor
+traditores
+traditorship
+traduce
+traducement
+traducent
+traducer
+traducian
+traducianism
+traducianist
+traducianistic
+traducible
+traducing
+traducingly
+traduction
+traductionist
+trady
+traffic
+trafficability
+trafficable
+trafficableness
+trafficless
+trafficway
+trafflicker
+trafflike
+trag
+tragacanth
+tragacantha
+tragacanthin
+tragal
+Tragasol
+tragedial
+tragedian
+tragedianess
+tragedical
+tragedienne
+tragedietta
+tragedist
+tragedization
+tragedize
+tragedy
+tragelaph
+tragelaphine
+Tragelaphus
+tragi
+tragic
+tragical
+tragicality
+tragically
+tragicalness
+tragicaster
+tragicize
+tragicly
+tragicness
+tragicofarcical
+tragicoheroicomic
+tragicolored
+tragicomedian
+tragicomedy
+tragicomic
+tragicomical
+tragicomicality
+tragicomically
+tragicomipastoral
+tragicoromantic
+tragicose
+tragopan
+Tragopogon
+Tragulidae
+Tragulina
+traguline
+traguloid
+Traguloidea
+Tragulus
+tragus
+trah
+traheen
+traik
+trail
+trailer
+trailery
+trailiness
+trailing
+trailingly
+trailless
+trailmaker
+trailmaking
+trailman
+trailside
+trailsman
+traily
+train
+trainable
+trainage
+trainagraph
+trainband
+trainbearer
+trainbolt
+trainboy
+trained
+trainee
+trainer
+trainful
+training
+trainless
+trainload
+trainman
+trainmaster
+trainsick
+trainster
+traintime
+trainway
+trainy
+traipse
+trait
+traitless
+traitor
+traitorhood
+traitorism
+traitorize
+traitorlike
+traitorling
+traitorous
+traitorously
+traitorousness
+traitorship
+traitorwise
+traitress
+traject
+trajectile
+trajection
+trajectitious
+trajectory
+trajet
+tralatician
+tralaticiary
+tralatition
+tralatitious
+tralatitiously
+tralira
+Trallian
+tram
+trama
+tramal
+tramcar
+trame
+Trametes
+tramful
+tramless
+tramline
+tramman
+trammel
+trammeled
+trammeler
+trammelhead
+trammeling
+trammelingly
+trammelled
+trammellingly
+trammer
+tramming
+trammon
+tramontane
+tramp
+trampage
+trampdom
+tramper
+trampess
+tramphood
+trampish
+trampishly
+trampism
+trample
+trampler
+tramplike
+trampolin
+trampoline
+trampoose
+trampot
+tramroad
+tramsmith
+tramway
+tramwayman
+tramyard
+Tran
+trance
+tranced
+trancedly
+tranceful
+trancelike
+tranchefer
+tranchet
+trancoidal
+traneen
+trank
+tranka
+tranker
+trankum
+tranky
+tranquil
+tranquility
+tranquilization
+tranquilize
+tranquilizer
+tranquilizing
+tranquilizingly
+tranquillity
+tranquillization
+tranquillize
+tranquilly
+tranquilness
+transaccidentation
+transact
+transaction
+transactional
+transactionally
+transactioneer
+transactor
+transalpine
+transalpinely
+transalpiner
+transamination
+transanimate
+transanimation
+transannular
+transapical
+transappalachian
+transaquatic
+transarctic
+transatlantic
+transatlantically
+transatlantican
+transatlanticism
+transaudient
+transbaikal
+transbaikalian
+transbay
+transboard
+transborder
+transcalency
+transcalent
+transcalescency
+transcalescent
+Transcaucasian
+transceiver
+transcend
+transcendence
+transcendency
+transcendent
+transcendental
+transcendentalism
+transcendentalist
+transcendentalistic
+transcendentality
+transcendentalize
+transcendentally
+transcendently
+transcendentness
+transcendible
+transcending
+transcendingly
+transcendingness
+transcension
+transchannel
+transcolor
+transcoloration
+transconductance
+transcondylar
+transcondyloid
+transconscious
+transcontinental
+transcorporate
+transcorporeal
+transcortical
+transcreate
+transcribable
+transcribble
+transcribbler
+transcribe
+transcriber
+transcript
+transcription
+transcriptional
+transcriptionally
+transcriptitious
+transcriptive
+transcriptively
+transcriptural
+transcrystalline
+transcurrent
+transcurrently
+transcurvation
+transdermic
+transdesert
+transdialect
+transdiaphragmatic
+transdiurnal
+transducer
+transduction
+transect
+transection
+transelement
+transelementate
+transelementation
+transempirical
+transenna
+transept
+transeptal
+transeptally
+transequatorial
+transessentiate
+transeunt
+transexperiential
+transfashion
+transfeature
+transfer
+transferability
+transferable
+transferableness
+transferably
+transferal
+transferee
+transference
+transferent
+transferential
+transferography
+transferor
+transferotype
+transferred
+transferrer
+transferribility
+transferring
+transferror
+transferrotype
+transfigurate
+transfiguration
+transfigurative
+transfigure
+transfigurement
+transfiltration
+transfinite
+transfix
+transfixation
+transfixion
+transfixture
+transfluent
+transfluvial
+transflux
+transforation
+transform
+transformability
+transformable
+transformance
+transformation
+transformationist
+transformative
+transformator
+transformer
+transforming
+transformingly
+transformism
+transformist
+transformistic
+transfrontal
+transfrontier
+transfuge
+transfugitive
+transfuse
+transfuser
+transfusible
+transfusion
+transfusionist
+transfusive
+transfusively
+transgredient
+transgress
+transgressible
+transgressing
+transgressingly
+transgression
+transgressional
+transgressive
+transgressively
+transgressor
+transhape
+transhuman
+transhumanate
+transhumanation
+transhumance
+transhumanize
+transhumant
+transience
+transiency
+transient
+transiently
+transientness
+transigence
+transigent
+transiliac
+transilience
+transiliency
+transilient
+transilluminate
+transillumination
+transilluminator
+transimpression
+transincorporation
+transindividual
+transinsular
+transire
+transischiac
+transisthmian
+transistor
+transit
+transitable
+transiter
+transition
+transitional
+transitionally
+transitionalness
+transitionary
+transitionist
+transitival
+transitive
+transitively
+transitiveness
+transitivism
+transitivity
+transitman
+transitorily
+transitoriness
+transitory
+transitus
+Transjordanian
+translade
+translatable
+translatableness
+translate
+translater
+translation
+translational
+translationally
+translative
+translator
+translatorese
+translatorial
+translatorship
+translatory
+translatress
+translatrix
+translay
+transleithan
+transletter
+translinguate
+transliterate
+transliteration
+transliterator
+translocalization
+translocate
+translocation
+translocatory
+translucence
+translucency
+translucent
+translucently
+translucid
+transmarginal
+transmarine
+transmaterial
+transmateriation
+transmedial
+transmedian
+transmental
+transmentation
+transmeridional
+transmethylation
+transmigrant
+transmigrate
+transmigration
+transmigrationism
+transmigrationist
+transmigrative
+transmigratively
+transmigrator
+transmigratory
+transmissibility
+transmissible
+transmission
+transmissional
+transmissionist
+transmissive
+transmissively
+transmissiveness
+transmissivity
+transmissometer
+transmissory
+transmit
+transmittable
+transmittal
+transmittance
+transmittancy
+transmittant
+transmitter
+transmittible
+transmogrification
+transmogrifier
+transmogrify
+transmold
+transmontane
+transmorphism
+transmundane
+transmural
+transmuscle
+transmutability
+transmutable
+transmutableness
+transmutably
+transmutation
+transmutational
+transmutationist
+transmutative
+transmutatory
+transmute
+transmuter
+transmuting
+transmutive
+transmutual
+transnatation
+transnational
+transnatural
+transnaturation
+transnature
+transnihilation
+transnormal
+transocean
+transoceanic
+transocular
+transom
+transomed
+transonic
+transorbital
+transpacific
+transpadane
+transpalatine
+transpalmar
+transpanamic
+transparence
+transparency
+transparent
+transparentize
+transparently
+transparentness
+transparietal
+transparish
+transpeciate
+transpeciation
+transpeer
+transpenetrable
+transpeninsular
+transperitoneal
+transperitoneally
+transpersonal
+transphenomenal
+transphysical
+transpicuity
+transpicuous
+transpicuously
+transpierce
+transpirability
+transpirable
+transpiration
+transpirative
+transpiratory
+transpire
+transpirometer
+transplace
+transplant
+transplantability
+transplantable
+transplantar
+transplantation
+transplantee
+transplanter
+transplendency
+transplendent
+transplendently
+transpleural
+transpleurally
+transpolar
+transponibility
+transponible
+transpontine
+transport
+transportability
+transportable
+transportableness
+transportal
+transportance
+transportation
+transportational
+transportationist
+transportative
+transported
+transportedly
+transportedness
+transportee
+transporter
+transporting
+transportingly
+transportive
+transportment
+transposability
+transposable
+transposableness
+transposal
+transpose
+transposer
+transposition
+transpositional
+transpositive
+transpositively
+transpositor
+transpository
+transpour
+transprint
+transprocess
+transprose
+transproser
+transpulmonary
+transpyloric
+transradiable
+transrational
+transreal
+transrectification
+transrhenane
+transrhodanian
+transriverine
+transsegmental
+transsensual
+transseptal
+transsepulchral
+transshape
+transshift
+transship
+transshipment
+transsolid
+transstellar
+transsubjective
+transtemporal
+Transteverine
+transthalamic
+transthoracic
+transubstantial
+transubstantially
+transubstantiate
+transubstantiation
+transubstantiationalist
+transubstantiationite
+transubstantiative
+transubstantiatively
+transubstantiatory
+transudate
+transudation
+transudative
+transudatory
+transude
+transumpt
+transumption
+transumptive
+transuranian
+transuranic
+transuranium
+transuterine
+transvaal
+Transvaaler
+Transvaalian
+transvaluate
+transvaluation
+transvalue
+transvasate
+transvasation
+transvase
+transvectant
+transvection
+transvenom
+transverbate
+transverbation
+transverberate
+transverberation
+transversal
+transversale
+transversalis
+transversality
+transversally
+transversan
+transversary
+transverse
+transversely
+transverseness
+transverser
+transversion
+transversive
+transversocubital
+transversomedial
+transversospinal
+transversovertical
+transversum
+transversus
+transvert
+transverter
+transvest
+transvestism
+transvestite
+transvestitism
+transvolation
+transwritten
+Transylvanian
+trant
+tranter
+trantlum
+Tranzschelia
+trap
+Trapa
+Trapaceae
+trapaceous
+trapball
+trapes
+trapezate
+trapeze
+trapezia
+trapezial
+trapezian
+trapeziform
+trapezing
+trapeziometacarpal
+trapezist
+trapezium
+trapezius
+trapezohedral
+trapezohedron
+trapezoid
+trapezoidal
+trapezoidiform
+trapfall
+traphole
+trapiferous
+traplight
+traplike
+trapmaker
+trapmaking
+trappean
+trapped
+trapper
+trapperlike
+trappiness
+trapping
+trappingly
+Trappist
+trappist
+Trappistine
+trappoid
+trappose
+trappous
+trappy
+traprock
+traps
+trapshoot
+trapshooter
+trapshooting
+trapstick
+trapunto
+trasformism
+trash
+trashery
+trashify
+trashily
+trashiness
+traship
+trashless
+trashrack
+trashy
+trass
+Trastevere
+Trasteverine
+trasy
+traulism
+trauma
+traumasthenia
+traumatic
+traumatically
+traumaticin
+traumaticine
+traumatism
+traumatize
+traumatology
+traumatonesis
+traumatopnea
+traumatopyra
+traumatosis
+traumatotactic
+traumatotaxis
+traumatropic
+traumatropism
+Trautvetteria
+travail
+travale
+travally
+travated
+trave
+travel
+travelability
+travelable
+traveldom
+traveled
+traveler
+traveleress
+travelerlike
+traveling
+travellability
+travellable
+travelled
+traveller
+travelogue
+traveloguer
+traveltime
+traversable
+traversal
+traversary
+traverse
+traversed
+traversely
+traverser
+traversewise
+traversework
+traversing
+traversion
+travertin
+travertine
+travestier
+travestiment
+travesty
+Travis
+travis
+travois
+travoy
+trawl
+trawlboat
+trawler
+trawlerman
+trawlnet
+tray
+trayful
+traylike
+treacher
+treacherous
+treacherously
+treacherousness
+treachery
+treacle
+treaclelike
+treaclewort
+treacliness
+treacly
+tread
+treadboard
+treader
+treading
+treadle
+treadler
+treadmill
+treadwheel
+treason
+treasonable
+treasonableness
+treasonably
+treasonful
+treasonish
+treasonist
+treasonless
+treasonmonger
+treasonous
+treasonously
+treasonproof
+treasurable
+treasure
+treasureless
+treasurer
+treasurership
+treasuress
+treasurous
+treasury
+treasuryship
+treat
+treatable
+treatableness
+treatably
+treatee
+treater
+treating
+treatise
+treatiser
+treatment
+treator
+treaty
+treatyist
+treatyite
+treatyless
+Trebellian
+treble
+trebleness
+trebletree
+trebly
+trebuchet
+trecentist
+trechmannite
+treckschuyt
+Treculia
+treddle
+tredecile
+tredille
+tree
+treebeard
+treebine
+treed
+treefish
+treeful
+treehair
+treehood
+treeify
+treeiness
+treeless
+treelessness
+treelet
+treelike
+treeling
+treemaker
+treemaking
+treeman
+treen
+treenail
+treescape
+treeship
+treespeeler
+treetop
+treeward
+treewards
+treey
+tref
+trefgordd
+trefle
+trefoil
+trefoiled
+trefoillike
+trefoilwise
+tregadyne
+tregerg
+tregohm
+trehala
+trehalase
+trehalose
+treillage
+trek
+trekker
+trekometer
+trekpath
+trellis
+trellised
+trellislike
+trelliswork
+Trema
+Tremandra
+Tremandraceae
+tremandraceous
+Trematoda
+trematode
+Trematodea
+Trematodes
+trematoid
+Trematosaurus
+tremble
+tremblement
+trembler
+trembling
+tremblingly
+tremblingness
+tremblor
+trembly
+Tremella
+Tremellaceae
+tremellaceous
+Tremellales
+tremelliform
+tremelline
+tremellineous
+tremelloid
+tremellose
+tremendous
+tremendously
+tremendousness
+tremetol
+tremie
+tremolando
+tremolant
+tremolist
+tremolite
+tremolitic
+tremolo
+tremor
+tremorless
+tremorlessly
+tremulant
+tremulate
+tremulation
+tremulous
+tremulously
+tremulousness
+trenail
+trench
+trenchancy
+trenchant
+trenchantly
+trenchantness
+trenchboard
+trenched
+trencher
+trencherless
+trencherlike
+trenchermaker
+trenchermaking
+trencherman
+trencherside
+trencherwise
+trencherwoman
+trenchful
+trenchlet
+trenchlike
+trenchmaster
+trenchmore
+trenchward
+trenchwise
+trenchwork
+trend
+trendle
+Trent
+trental
+Trentepohlia
+Trentepohliaceae
+trentepohliaceous
+Trentine
+Trenton
+trepan
+trepanation
+trepang
+trepanize
+trepanner
+trepanning
+trepanningly
+trephination
+trephine
+trephiner
+trephocyte
+trephone
+trepid
+trepidancy
+trepidant
+trepidate
+trepidation
+trepidatory
+trepidity
+trepidly
+trepidness
+Treponema
+treponematous
+treponemiasis
+treponemiatic
+treponemicidal
+treponemicide
+Trepostomata
+trepostomatous
+Treron
+Treronidae
+Treroninae
+tresaiel
+trespass
+trespassage
+trespasser
+trespassory
+tress
+tressed
+tressful
+tressilate
+tressilation
+tressless
+tresslet
+tresslike
+tresson
+tressour
+tressure
+tressured
+tressy
+trest
+trestle
+trestletree
+trestlewise
+trestlework
+trestling
+tret
+trevally
+trevet
+Trevor
+trews
+trewsman
+Trey
+trey
+tri
+triable
+triableness
+triace
+triacetamide
+triacetate
+triacetonamine
+triachenium
+triacid
+triacontaeterid
+triacontane
+triaconter
+triact
+triactinal
+triactine
+triad
+triadelphous
+Triadenum
+triadic
+triadical
+triadically
+triadism
+triadist
+triaene
+triaenose
+triage
+triagonal
+triakisicosahedral
+triakisicosahedron
+triakisoctahedral
+triakisoctahedrid
+triakisoctahedron
+triakistetrahedral
+triakistetrahedron
+trial
+trialate
+trialism
+trialist
+triality
+trialogue
+triamid
+triamide
+triamine
+triamino
+triammonium
+triamylose
+triander
+Triandria
+triandrian
+triandrous
+triangle
+triangled
+triangler
+triangleways
+trianglewise
+trianglework
+Triangula
+triangular
+triangularity
+triangularly
+triangulate
+triangulately
+triangulation
+triangulator
+Triangulid
+trianguloid
+triangulopyramidal
+triangulotriangular
+Triangulum
+triannual
+triannulate
+Trianon
+Triantaphyllos
+triantelope
+trianthous
+triapsal
+triapsidal
+triarch
+triarchate
+triarchy
+triarctic
+triarcuated
+triareal
+triarii
+Triarthrus
+triarticulate
+Trias
+Triassic
+triaster
+triatic
+Triatoma
+triatomic
+triatomicity
+triaxial
+triaxon
+triaxonian
+triazane
+triazin
+triazine
+triazo
+triazoic
+triazole
+triazolic
+tribade
+tribadism
+tribady
+tribal
+tribalism
+tribalist
+tribally
+tribarred
+tribase
+tribasic
+tribasicity
+tribasilar
+tribble
+tribe
+tribeless
+tribelet
+tribelike
+tribesfolk
+tribeship
+tribesman
+tribesmanship
+tribespeople
+tribeswoman
+triblastic
+triblet
+triboelectric
+triboelectricity
+tribofluorescence
+tribofluorescent
+Tribolium
+triboluminescence
+triboluminescent
+tribometer
+Tribonema
+Tribonemaceae
+tribophosphorescence
+tribophosphorescent
+tribophosphoroscope
+triborough
+tribrac
+tribrach
+tribrachial
+tribrachic
+tribracteate
+tribracteolate
+tribromacetic
+tribromide
+tribromoethanol
+tribromophenol
+tribromphenate
+tribromphenol
+tribual
+tribually
+tribular
+tribulate
+tribulation
+tribuloid
+Tribulus
+tribuna
+tribunal
+tribunate
+tribune
+tribuneship
+tribunitial
+tribunitian
+tribunitiary
+tribunitive
+tributable
+tributarily
+tributariness
+tributary
+tribute
+tributer
+tributist
+tributorian
+tributyrin
+trica
+tricae
+tricalcic
+tricalcium
+tricapsular
+tricar
+tricarballylic
+tricarbimide
+tricarbon
+tricarboxylic
+tricarinate
+tricarinated
+tricarpellary
+tricarpellate
+tricarpous
+tricaudal
+tricaudate
+trice
+tricellular
+tricenarious
+tricenarium
+tricenary
+tricennial
+tricentenarian
+tricentenary
+tricentennial
+tricentral
+tricephal
+tricephalic
+tricephalous
+tricephalus
+triceps
+Triceratops
+triceria
+tricerion
+tricerium
+trichatrophia
+trichauxis
+Trichechidae
+trichechine
+trichechodont
+Trichechus
+trichevron
+trichi
+trichia
+trichiasis
+Trichilia
+Trichina
+trichina
+trichinae
+trichinal
+Trichinella
+trichiniasis
+trichiniferous
+trichinization
+trichinize
+trichinoid
+trichinopoly
+trichinoscope
+trichinoscopy
+trichinosed
+trichinosis
+trichinotic
+trichinous
+trichite
+trichitic
+trichitis
+trichiurid
+Trichiuridae
+trichiuroid
+Trichiurus
+trichloride
+trichlormethane
+trichloro
+trichloroacetic
+trichloroethylene
+trichloromethane
+trichloromethyl
+trichobacteria
+trichobezoar
+trichoblast
+trichobranchia
+trichobranchiate
+trichocarpous
+trichocephaliasis
+Trichocephalus
+trichoclasia
+trichoclasis
+trichocyst
+trichocystic
+trichode
+Trichoderma
+Trichodesmium
+Trichodontidae
+trichoepithelioma
+trichogen
+trichogenous
+trichoglossia
+Trichoglossidae
+Trichoglossinae
+trichoglossine
+Trichogramma
+Trichogrammatidae
+trichogyne
+trichogynial
+trichogynic
+trichoid
+Tricholaena
+trichological
+trichologist
+trichology
+Tricholoma
+trichoma
+Trichomanes
+trichomaphyte
+trichomatose
+trichomatosis
+trichomatous
+trichome
+trichomic
+trichomonad
+Trichomonadidae
+Trichomonas
+trichomoniasis
+trichomycosis
+trichonosus
+trichopathic
+trichopathy
+trichophore
+trichophoric
+trichophyllous
+trichophyte
+trichophytia
+trichophytic
+Trichophyton
+trichophytosis
+Trichoplax
+trichopore
+trichopter
+Trichoptera
+trichoptera
+trichopteran
+trichopteron
+trichopterous
+trichopterygid
+Trichopterygidae
+trichord
+trichorrhea
+trichorrhexic
+trichorrhexis
+Trichosanthes
+trichoschisis
+trichosis
+trichosporange
+trichosporangial
+trichosporangium
+Trichosporum
+trichostasis
+Trichostema
+trichostrongyle
+trichostrongylid
+Trichostrongylus
+trichothallic
+trichotillomania
+trichotomic
+trichotomism
+trichotomist
+trichotomize
+trichotomous
+trichotomously
+trichotomy
+trichroic
+trichroism
+trichromat
+trichromate
+trichromatic
+trichromatism
+trichromatist
+trichrome
+trichromic
+trichronous
+trichuriasis
+Trichuris
+trichy
+Tricia
+tricinium
+tricipital
+tricircular
+trick
+tricker
+trickery
+trickful
+trickily
+trickiness
+tricking
+trickingly
+trickish
+trickishly
+trickishness
+trickle
+trickless
+tricklet
+tricklike
+trickling
+tricklingly
+trickly
+trickment
+trickproof
+tricksical
+tricksily
+tricksiness
+tricksome
+trickster
+trickstering
+trickstress
+tricksy
+tricktrack
+tricky
+triclad
+Tricladida
+triclinate
+triclinia
+triclinial
+tricliniarch
+tricliniary
+triclinic
+triclinium
+triclinohedric
+tricoccose
+tricoccous
+tricolette
+tricolic
+tricolon
+tricolor
+tricolored
+tricolumnar
+tricompound
+triconch
+Triconodon
+triconodont
+Triconodonta
+triconodontid
+triconodontoid
+triconodonty
+triconsonantal
+triconsonantalism
+tricophorous
+tricorn
+tricornered
+tricornute
+tricorporal
+tricorporate
+tricoryphean
+tricosane
+tricosanone
+tricostate
+tricosyl
+tricosylic
+tricot
+tricotine
+tricotyledonous
+tricresol
+tricrotic
+tricrotism
+tricrotous
+tricrural
+tricurvate
+tricuspal
+tricuspid
+tricuspidal
+tricuspidate
+tricuspidated
+tricussate
+tricyanide
+tricycle
+tricyclene
+tricycler
+tricyclic
+tricyclist
+Tricyrtis
+Tridacna
+Tridacnidae
+tridactyl
+tridactylous
+tridaily
+triddler
+tridecane
+tridecene
+tridecilateral
+tridecoic
+tridecyl
+tridecylene
+tridecylic
+trident
+tridental
+tridentate
+tridentated
+tridentiferous
+Tridentine
+Tridentinian
+tridepside
+tridermic
+tridiametral
+tridiapason
+tridigitate
+tridimensional
+tridimensionality
+tridimensioned
+tridiurnal
+tridominium
+tridrachm
+triduan
+triduum
+tridymite
+tridynamous
+tried
+triedly
+trielaidin
+triene
+triennial
+trienniality
+triennially
+triennium
+triens
+triental
+Trientalis
+triequal
+trier
+trierarch
+trierarchal
+trierarchic
+trierarchy
+trierucin
+trieteric
+trieterics
+triethanolamine
+triethyl
+triethylamine
+triethylstibine
+trifa
+trifacial
+trifarious
+trifasciated
+triferous
+trifid
+trifilar
+trifistulary
+triflagellate
+trifle
+trifledom
+trifler
+triflet
+trifling
+triflingly
+triflingness
+trifloral
+triflorate
+triflorous
+trifluoride
+trifocal
+trifoil
+trifold
+trifoliate
+trifoliated
+trifoliolate
+trifoliosis
+Trifolium
+trifolium
+trifoly
+triforial
+triforium
+triform
+triformed
+triformin
+triformity
+triformous
+trifoveolate
+trifuran
+trifurcal
+trifurcate
+trifurcation
+trig
+trigamist
+trigamous
+trigamy
+trigeminal
+trigeminous
+trigeneric
+trigesimal
+trigger
+triggered
+triggerfish
+triggerless
+trigintal
+trigintennial
+Trigla
+triglandular
+triglid
+Triglidae
+triglochid
+Triglochin
+triglochin
+triglot
+trigly
+triglyceride
+triglyceryl
+triglyph
+triglyphal
+triglyphed
+triglyphic
+triglyphical
+trigness
+trigon
+Trigona
+trigonal
+trigonally
+trigone
+Trigonella
+trigonelline
+trigoneutic
+trigoneutism
+Trigonia
+Trigoniaceae
+trigoniacean
+trigoniaceous
+trigonic
+trigonid
+Trigoniidae
+trigonite
+trigonitis
+trigonocephalic
+trigonocephalous
+Trigonocephalus
+trigonocephaly
+trigonocerous
+trigonododecahedron
+trigonodont
+trigonoid
+trigonometer
+trigonometric
+trigonometrical
+trigonometrician
+trigonometry
+trigonon
+trigonotype
+trigonous
+trigonum
+trigram
+trigrammatic
+trigrammatism
+trigrammic
+trigraph
+trigraphic
+triguttulate
+trigyn
+Trigynia
+trigynian
+trigynous
+trihalide
+trihedral
+trihedron
+trihemeral
+trihemimer
+trihemimeral
+trihemimeris
+trihemiobol
+trihemiobolion
+trihemitetartemorion
+trihoral
+trihourly
+trihybrid
+trihydrate
+trihydrated
+trihydric
+trihydride
+trihydrol
+trihydroxy
+trihypostatic
+trijugate
+trijugous
+trijunction
+trikaya
+trike
+triker
+trikeria
+trikerion
+triketo
+triketone
+trikir
+trilabe
+trilabiate
+trilamellar
+trilamellated
+trilaminar
+trilaminate
+trilarcenous
+trilateral
+trilaterality
+trilaterally
+trilateralness
+trilaurin
+trilby
+trilemma
+trilinear
+trilineate
+trilineated
+trilingual
+trilinguar
+trilinolate
+trilinoleate
+trilinolenate
+trilinolenin
+Trilisa
+trilit
+trilite
+triliteral
+triliteralism
+triliterality
+triliterally
+triliteralness
+trilith
+trilithic
+trilithon
+trill
+trillachan
+trillet
+trilli
+Trilliaceae
+trilliaceous
+trillibub
+trilliin
+trilling
+trillion
+trillionaire
+trillionize
+trillionth
+Trillium
+trillium
+trillo
+trilobate
+trilobated
+trilobation
+trilobe
+trilobed
+Trilobita
+trilobite
+trilobitic
+trilocular
+triloculate
+trilogic
+trilogical
+trilogist
+trilogy
+Trilophodon
+trilophodont
+triluminar
+triluminous
+trim
+trimacer
+trimacular
+trimargarate
+trimargarin
+trimastigate
+trimellitic
+trimembral
+trimensual
+trimer
+Trimera
+trimercuric
+Trimeresurus
+trimeric
+trimeride
+trimerite
+trimerization
+trimerous
+trimesic
+trimesinic
+trimesitic
+trimesitinic
+trimester
+trimestral
+trimestrial
+trimesyl
+trimetalism
+trimetallic
+trimeter
+trimethoxy
+trimethyl
+trimethylacetic
+trimethylamine
+trimethylbenzene
+trimethylene
+trimethylmethane
+trimethylstibine
+trimetric
+trimetrical
+trimetrogon
+trimly
+trimmer
+trimming
+trimmingly
+trimness
+trimodal
+trimodality
+trimolecular
+trimonthly
+trimoric
+trimorph
+trimorphic
+trimorphism
+trimorphous
+trimotor
+trimotored
+trimstone
+trimtram
+trimuscular
+trimyristate
+trimyristin
+trin
+Trinacrian
+trinal
+trinality
+trinalize
+trinary
+trinational
+trindle
+trine
+trinely
+trinervate
+trinerve
+trinerved
+trineural
+Tringa
+tringine
+tringle
+tringoid
+Trinidadian
+trinidado
+Trinil
+Trinitarian
+trinitarian
+Trinitarianism
+trinitrate
+trinitration
+trinitride
+trinitrin
+trinitro
+trinitrocarbolic
+trinitrocellulose
+trinitrocresol
+trinitroglycerin
+trinitromethane
+trinitrophenol
+trinitroresorcin
+trinitrotoluene
+trinitroxylene
+trinitroxylol
+Trinity
+trinity
+trinityhood
+trink
+trinkerman
+trinket
+trinketer
+trinketry
+trinkety
+trinkle
+trinklement
+trinklet
+trinkums
+Trinobantes
+trinoctial
+trinodal
+trinode
+trinodine
+trinol
+trinomial
+trinomialism
+trinomialist
+trinomiality
+trinomially
+trinopticon
+Trinorantum
+Trinovant
+Trinovantes
+trintle
+trinucleate
+Trinucleus
+Trio
+trio
+triobol
+triobolon
+trioctile
+triocular
+triode
+triodia
+triodion
+Triodon
+Triodontes
+Triodontidae
+triodontoid
+Triodontoidea
+Triodontoidei
+Triodontophorus
+Trioecia
+trioecious
+trioeciously
+trioecism
+triolcous
+triole
+trioleate
+triolefin
+trioleic
+triolein
+triolet
+triology
+Trionychidae
+trionychoid
+Trionychoideachid
+trionychoidean
+trionym
+trionymal
+Trionyx
+trioperculate
+Triopidae
+Triops
+trior
+triorchis
+triorchism
+triorthogonal
+triose
+Triosteum
+triovulate
+trioxazine
+trioxide
+trioxymethylene
+triozonide
+trip
+tripal
+tripaleolate
+tripalmitate
+tripalmitin
+tripara
+tripart
+triparted
+tripartedly
+tripartible
+tripartient
+tripartite
+tripartitely
+tripartition
+tripaschal
+tripe
+tripedal
+tripel
+tripelike
+tripeman
+tripemonger
+tripennate
+tripenny
+tripeptide
+tripersonal
+tripersonalism
+tripersonalist
+tripersonality
+tripersonally
+tripery
+tripeshop
+tripestone
+tripetaloid
+tripetalous
+tripewife
+tripewoman
+triphammer
+triphane
+triphase
+triphaser
+Triphasia
+triphasic
+triphenyl
+triphenylamine
+triphenylated
+triphenylcarbinol
+triphenylmethane
+triphenylmethyl
+triphenylphosphine
+triphibian
+triphibious
+triphony
+Triphora
+triphthong
+triphyletic
+triphyline
+triphylite
+triphyllous
+Triphysite
+tripinnate
+tripinnated
+tripinnately
+tripinnatifid
+tripinnatisect
+Tripitaka
+triplane
+Triplaris
+triplasian
+triplasic
+triple
+tripleback
+triplefold
+triplegia
+tripleness
+triplet
+tripletail
+tripletree
+triplewise
+triplex
+triplexity
+triplicate
+triplication
+triplicative
+triplicature
+Triplice
+Triplicist
+triplicity
+triplicostate
+tripliform
+triplinerved
+tripling
+triplite
+triploblastic
+triplocaulescent
+triplocaulous
+Triplochitonaceae
+triploid
+triploidic
+triploidite
+triploidy
+triplopia
+triplopy
+triplum
+triplumbic
+triply
+tripmadam
+tripod
+tripodal
+tripodial
+tripodian
+tripodic
+tripodical
+tripody
+tripointed
+tripolar
+tripoli
+Tripoline
+tripoline
+Tripolitan
+tripolite
+tripos
+tripotassium
+trippant
+tripper
+trippet
+tripping
+trippingly
+trippingness
+trippist
+tripple
+trippler
+Tripsacum
+tripsill
+tripsis
+tripsome
+tripsomely
+triptane
+tripterous
+triptote
+triptych
+triptyque
+tripudial
+tripudiant
+tripudiary
+tripudiate
+tripudiation
+tripudist
+tripudium
+tripunctal
+tripunctate
+tripy
+Tripylaea
+tripylaean
+Tripylarian
+tripylarian
+tripyrenous
+triquadrantal
+triquetra
+triquetral
+triquetric
+triquetrous
+triquetrously
+triquetrum
+triquinate
+triquinoyl
+triradial
+triradially
+triradiate
+triradiated
+triradiately
+triradiation
+Triratna
+trirectangular
+triregnum
+trireme
+trirhombohedral
+trirhomboidal
+triricinolein
+trisaccharide
+trisaccharose
+trisacramentarian
+Trisagion
+trisalt
+trisazo
+trisceptral
+trisect
+trisected
+trisection
+trisector
+trisectrix
+triseme
+trisemic
+trisensory
+trisepalous
+triseptate
+triserial
+triserially
+triseriate
+triseriatim
+trisetose
+Trisetum
+trishna
+trisilane
+trisilicane
+trisilicate
+trisilicic
+trisinuate
+trisinuated
+triskele
+triskelion
+trismegist
+trismegistic
+trismic
+trismus
+trisoctahedral
+trisoctahedron
+trisodium
+trisome
+trisomic
+trisomy
+trisonant
+Trisotropis
+trispast
+trispaston
+trispermous
+trispinose
+trisplanchnic
+trisporic
+trisporous
+trisquare
+trist
+tristachyous
+Tristam
+Tristan
+Tristania
+tristate
+tristearate
+tristearin
+tristeness
+tristetrahedron
+tristeza
+tristful
+tristfully
+tristfulness
+tristich
+Tristichaceae
+tristichic
+tristichous
+tristigmatic
+tristigmatose
+tristiloquy
+tristisonous
+Tristram
+tristylous
+trisubstituted
+trisubstitution
+trisul
+trisula
+trisulcate
+trisulcated
+trisulphate
+trisulphide
+trisulphone
+trisulphonic
+trisulphoxide
+trisylabic
+trisyllabical
+trisyllabically
+trisyllabism
+trisyllabity
+trisyllable
+tritactic
+tritagonist
+tritangent
+tritangential
+tritanope
+tritanopia
+tritanopic
+tritaph
+trite
+Triteleia
+tritely
+tritemorion
+tritencephalon
+triteness
+triternate
+triternately
+triterpene
+tritetartemorion
+tritheism
+tritheist
+tritheistic
+tritheistical
+tritheite
+tritheocracy
+trithing
+trithioaldehyde
+trithiocarbonate
+trithiocarbonic
+trithionate
+trithionic
+Trithrinax
+tritical
+triticality
+tritically
+triticalness
+triticeous
+triticeum
+triticin
+triticism
+triticoid
+Triticum
+triticum
+tritish
+tritium
+tritocerebral
+tritocerebrum
+tritocone
+tritoconid
+Tritogeneia
+tritolo
+Tritoma
+tritomite
+Triton
+triton
+tritonal
+tritonality
+tritone
+Tritoness
+Tritonia
+Tritonic
+Tritonidae
+tritonoid
+tritonous
+tritonymph
+tritonymphal
+tritopatores
+tritopine
+tritor
+tritoral
+tritorium
+tritoxide
+tritozooid
+tritriacontane
+trittichan
+tritubercular
+Trituberculata
+trituberculism
+trituberculy
+triturable
+tritural
+triturate
+trituration
+triturator
+triturature
+triturium
+Triturus
+trityl
+Tritylodon
+Triumfetta
+Triumph
+triumph
+triumphal
+triumphance
+triumphancy
+triumphant
+triumphantly
+triumphator
+triumpher
+triumphing
+triumphwise
+triumvir
+triumviral
+triumvirate
+triumviri
+triumvirship
+triunal
+triune
+triungulin
+triunification
+triunion
+triunitarian
+triunity
+triunsaturated
+triurid
+Triuridaceae
+Triuridales
+Triuris
+trivalence
+trivalency
+trivalent
+trivalerin
+trivalve
+trivalvular
+trivant
+trivantly
+trivariant
+triverbal
+triverbial
+trivet
+trivetwise
+trivia
+trivial
+trivialism
+trivialist
+triviality
+trivialize
+trivially
+trivialness
+trivirga
+trivirgate
+trivium
+trivoltine
+trivvet
+triweekly
+Trix
+Trixie
+Trixy
+trizoic
+trizomal
+trizonal
+trizone
+Trizonia
+Troad
+troat
+troca
+trocaical
+trocar
+Trochaic
+trochaic
+trochaicality
+trochal
+trochalopod
+Trochalopoda
+trochalopodous
+trochanter
+trochanteric
+trochanterion
+trochantin
+trochantinian
+trochart
+trochate
+troche
+trocheameter
+trochee
+trocheeize
+trochelminth
+Trochelminthes
+trochi
+trochid
+Trochidae
+trochiferous
+trochiform
+Trochila
+Trochili
+trochili
+trochilic
+trochilics
+trochilidae
+trochilidine
+trochilidist
+trochiline
+trochilopodous
+Trochilus
+trochilus
+troching
+trochiscation
+trochiscus
+trochite
+trochitic
+Trochius
+trochlea
+trochlear
+trochleariform
+trochlearis
+trochleary
+trochleate
+trochleiform
+trochocephalia
+trochocephalic
+trochocephalus
+trochocephaly
+Trochodendraceae
+trochodendraceous
+Trochodendron
+trochoid
+trochoidal
+trochoidally
+trochoides
+trochometer
+trochophore
+Trochosphaera
+Trochosphaerida
+trochosphere
+trochospherical
+Trochozoa
+trochozoic
+trochozoon
+Trochus
+trochus
+trock
+troco
+troctolite
+trod
+trodden
+trode
+troegerite
+Troezenian
+troft
+trog
+trogger
+troggin
+troglodytal
+troglodyte
+Troglodytes
+troglodytic
+troglodytical
+Troglodytidae
+Troglodytinae
+troglodytish
+troglodytism
+trogon
+Trogones
+Trogonidae
+Trogoniformes
+trogonoid
+trogs
+trogue
+Troiades
+Troic
+troika
+troilite
+Trojan
+troke
+troker
+troll
+trolldom
+trolleite
+troller
+trolley
+trolleyer
+trolleyful
+trolleyman
+trollflower
+trollimog
+trolling
+Trollius
+trollman
+trollol
+trollop
+Trollopean
+Trollopeanism
+trollopish
+trollops
+trollopy
+trolly
+tromba
+trombe
+trombiculid
+trombidiasis
+Trombidiidae
+Trombidium
+trombone
+trombonist
+trombony
+trommel
+tromometer
+tromometric
+tromometrical
+tromometry
+tromp
+trompe
+trompil
+trompillo
+tromple
+tron
+trona
+tronador
+tronage
+tronc
+trondhjemite
+trone
+troner
+troolie
+troop
+trooper
+trooperess
+troopfowl
+troopship
+troopwise
+troostite
+troostitic
+troot
+tropacocaine
+tropaeolaceae
+tropaeolaceous
+tropaeolin
+Tropaeolum
+tropaion
+tropal
+troparia
+troparion
+tropary
+tropate
+trope
+tropeic
+tropeine
+troper
+tropesis
+trophaea
+trophaeum
+trophal
+trophallactic
+trophallaxis
+trophectoderm
+trophedema
+trophema
+trophesial
+trophesy
+trophi
+trophic
+trophical
+trophically
+trophicity
+trophied
+Trophis
+trophism
+trophobiont
+trophobiosis
+trophobiotic
+trophoblast
+trophoblastic
+trophochromatin
+trophocyte
+trophoderm
+trophodisc
+trophodynamic
+trophodynamics
+trophogenesis
+trophogenic
+trophogeny
+trophology
+trophonema
+trophoneurosis
+trophoneurotic
+Trophonian
+trophonucleus
+trophopathy
+trophophore
+trophophorous
+trophophyte
+trophoplasm
+trophoplasmatic
+trophoplasmic
+trophoplast
+trophosomal
+trophosome
+trophosperm
+trophosphere
+trophospongia
+trophospongial
+trophospongium
+trophospore
+trophotaxis
+trophotherapy
+trophothylax
+trophotropic
+trophotropism
+trophozoite
+trophozooid
+trophy
+trophyless
+trophywort
+tropic
+tropical
+Tropicalia
+Tropicalian
+tropicality
+tropicalization
+tropicalize
+tropically
+tropicopolitan
+tropidine
+Tropidoleptus
+tropine
+tropism
+tropismatic
+tropist
+tropistic
+tropocaine
+tropologic
+tropological
+tropologically
+tropologize
+tropology
+tropometer
+tropopause
+tropophil
+tropophilous
+tropophyte
+tropophytic
+troposphere
+tropostereoscope
+tropoyl
+troptometer
+tropyl
+trostera
+trot
+trotcozy
+troth
+trothful
+trothless
+trothlike
+trothplight
+trotlet
+trotline
+trotol
+trotter
+trottie
+trottles
+trottoir
+trottoired
+trotty
+trotyl
+troubadour
+troubadourish
+troubadourism
+troubadourist
+trouble
+troubledly
+troubledness
+troublemaker
+troublemaking
+troublement
+troubleproof
+troubler
+troublesome
+troublesomely
+troublesomeness
+troubling
+troublingly
+troublous
+troublously
+troublousness
+troubly
+trough
+troughful
+troughing
+troughlike
+troughster
+troughway
+troughwise
+troughy
+trounce
+trouncer
+troupand
+troupe
+trouper
+troupial
+trouse
+trouser
+trouserdom
+trousered
+trouserettes
+trouserian
+trousering
+trouserless
+trousers
+trousseau
+trousseaux
+trout
+troutbird
+trouter
+troutflower
+troutful
+troutiness
+troutless
+troutlet
+troutlike
+trouty
+trouvere
+trouveur
+trove
+troveless
+trover
+trow
+trowel
+trowelbeak
+troweler
+trowelful
+trowelman
+trowing
+trowlesworthite
+trowman
+trowth
+Troy
+troy
+Troynovant
+Troytown
+truancy
+truandise
+truant
+truantcy
+truantism
+truantlike
+truantly
+truantness
+truantry
+truantship
+trub
+trubu
+truce
+trucebreaker
+trucebreaking
+truceless
+trucemaker
+trucemaking
+trucial
+trucidation
+truck
+truckage
+trucker
+truckful
+trucking
+truckle
+truckler
+trucklike
+truckling
+trucklingly
+truckload
+truckman
+truckmaster
+trucks
+truckster
+truckway
+truculence
+truculency
+truculent
+truculental
+truculently
+truculentness
+truddo
+trudellite
+trudge
+trudgen
+trudger
+Trudy
+true
+trueborn
+truebred
+truehearted
+trueheartedly
+trueheartedness
+truelike
+truelove
+trueness
+truepenny
+truer
+truff
+truffle
+truffled
+trufflelike
+truffler
+trufflesque
+trug
+truish
+truism
+truismatic
+truistic
+truistical
+trull
+Trullan
+truller
+trullization
+trullo
+truly
+trumbash
+trummel
+trump
+trumper
+trumperiness
+trumpery
+trumpet
+trumpetbush
+trumpeter
+trumpeting
+trumpetless
+trumpetlike
+trumpetry
+trumpetweed
+trumpetwood
+trumpety
+trumph
+trumpie
+trumpless
+trumplike
+trun
+truncage
+truncal
+truncate
+truncated
+Truncatella
+Truncatellidae
+truncately
+truncation
+truncator
+truncatorotund
+truncatosinuate
+truncature
+trunch
+trunched
+truncheon
+truncheoned
+truncher
+trunchman
+trundle
+trundlehead
+trundler
+trundleshot
+trundletail
+trundling
+trunk
+trunkback
+trunked
+trunkfish
+trunkful
+trunking
+trunkless
+trunkmaker
+trunknose
+trunkway
+trunkwork
+trunnel
+trunnion
+trunnioned
+trunnionless
+trush
+trusion
+truss
+trussed
+trussell
+trusser
+trussing
+trussmaker
+trussmaking
+trusswork
+trust
+trustability
+trustable
+trustableness
+trustably
+trustee
+trusteeism
+trusteeship
+trusten
+truster
+trustful
+trustfully
+trustfulness
+trustification
+trustify
+trustihood
+trustily
+trustiness
+trusting
+trustingly
+trustingness
+trustle
+trustless
+trustlessly
+trustlessness
+trustman
+trustmonger
+trustwoman
+trustworthily
+trustworthiness
+trustworthy
+trusty
+truth
+truthable
+truthful
+truthfully
+truthfulness
+truthify
+truthiness
+truthless
+truthlessly
+truthlessness
+truthlike
+truthlikeness
+truthsman
+truthteller
+truthtelling
+truthy
+Trutta
+truttaceous
+truvat
+truxillic
+truxilline
+try
+trygon
+Trygonidae
+tryhouse
+Trying
+trying
+tryingly
+tryingness
+tryma
+tryout
+tryp
+trypa
+trypan
+trypaneid
+Trypaneidae
+trypanocidal
+trypanocide
+trypanolysin
+trypanolysis
+trypanolytic
+Trypanosoma
+trypanosoma
+trypanosomacidal
+trypanosomacide
+trypanosomal
+trypanosomatic
+Trypanosomatidae
+trypanosomatosis
+trypanosomatous
+trypanosome
+trypanosomiasis
+trypanosomic
+Tryparsamide
+Trypeta
+trypetid
+Trypetidae
+Tryphena
+Tryphosa
+trypiate
+trypograph
+trypographic
+trypsin
+trypsinize
+trypsinogen
+tryptase
+tryptic
+tryptogen
+tryptone
+tryptonize
+tryptophan
+trysail
+tryst
+tryster
+trysting
+tryt
+tryworks
+tsadik
+tsamba
+tsantsa
+tsar
+tsardom
+tsarevitch
+tsarina
+tsaritza
+tsarship
+tsatlee
+Tsattine
+tscharik
+tscheffkinite
+Tscherkess
+tsere
+tsessebe
+tsetse
+Tshi
+tsia
+Tsiltaden
+Tsimshian
+tsine
+tsingtauite
+tsiology
+Tsoneca
+Tsonecan
+tst
+tsuba
+tsubo
+Tsuga
+Tsuma
+tsumebite
+tsun
+tsunami
+tsungtu
+Tsutsutsi
+tu
+tua
+Tualati
+Tuamotu
+Tuamotuan
+Tuan
+tuan
+Tuareg
+tuarn
+tuart
+tuatara
+tuatera
+tuath
+tub
+Tuba
+tuba
+tubae
+tubage
+tubal
+tubaphone
+tubar
+tubate
+tubatoxin
+Tubatulabal
+tubba
+tubbable
+tubbal
+tubbeck
+tubber
+tubbie
+tubbiness
+tubbing
+tubbish
+tubboe
+tubby
+tube
+tubeflower
+tubeform
+tubeful
+tubehead
+tubehearted
+tubeless
+tubelet
+tubelike
+tubemaker
+tubemaking
+tubeman
+tuber
+Tuberaceae
+tuberaceous
+Tuberales
+tuberation
+tubercle
+tubercled
+tuberclelike
+tubercula
+tubercular
+Tubercularia
+Tuberculariaceae
+tuberculariaceous
+tubercularization
+tubercularize
+tubercularly
+tubercularness
+tuberculate
+tuberculated
+tuberculatedly
+tuberculately
+tuberculation
+tuberculatogibbous
+tuberculatonodose
+tuberculatoradiate
+tuberculatospinous
+tubercule
+tuberculed
+tuberculid
+tuberculide
+tuberculiferous
+tuberculiform
+tuberculin
+tuberculinic
+tuberculinization
+tuberculinize
+tuberculization
+tuberculize
+tuberculocele
+tuberculocidin
+tuberculoderma
+tuberculoid
+tuberculoma
+tuberculomania
+tuberculomata
+tuberculophobia
+tuberculoprotein
+tuberculose
+tuberculosectorial
+tuberculosed
+tuberculosis
+tuberculotherapist
+tuberculotherapy
+tuberculotoxin
+tuberculotrophic
+tuberculous
+tuberculously
+tuberculousness
+tuberculum
+tuberiferous
+tuberiform
+tuberin
+tuberization
+tuberize
+tuberless
+tuberoid
+tuberose
+tuberosity
+tuberous
+tuberously
+tuberousness
+tubesmith
+tubework
+tubeworks
+tubfish
+tubful
+tubicen
+tubicinate
+tubicination
+Tubicola
+Tubicolae
+tubicolar
+tubicolous
+tubicorn
+tubicornous
+tubifacient
+tubifer
+tubiferous
+Tubifex
+Tubificidae
+Tubiflorales
+tubiflorous
+tubiform
+tubig
+tubik
+tubilingual
+Tubinares
+tubinarial
+tubinarine
+tubing
+Tubingen
+tubiparous
+Tubipora
+tubipore
+tubiporid
+Tubiporidae
+tubiporoid
+tubiporous
+tublet
+tublike
+tubmaker
+tubmaking
+tubman
+tuboabdominal
+tubocurarine
+tubolabellate
+tuboligamentous
+tuboovarial
+tuboovarian
+tuboperitoneal
+tuborrhea
+tubotympanal
+tubovaginal
+tubular
+Tubularia
+tubularia
+Tubulariae
+tubularian
+Tubularida
+tubularidan
+Tubulariidae
+tubularity
+tubularly
+tubulate
+tubulated
+tubulation
+tubulator
+tubulature
+tubule
+tubulet
+tubuli
+tubulibranch
+tubulibranchian
+Tubulibranchiata
+tubulibranchiate
+Tubulidentata
+tubulidentate
+Tubulifera
+tubuliferan
+tubuliferous
+tubulifloral
+tubuliflorous
+tubuliform
+Tubulipora
+tubulipore
+tubuliporid
+Tubuliporidae
+tubuliporoid
+tubulization
+tubulodermoid
+tubuloracemose
+tubulosaccular
+tubulose
+tubulostriato
+tubulous
+tubulously
+tubulousness
+tubulure
+tubulus
+tubwoman
+Tucana
+Tucanae
+tucandera
+Tucano
+tuchit
+tuchun
+tuchunate
+tuchunism
+tuchunize
+tuck
+Tuckahoe
+tuckahoe
+tucker
+tuckermanity
+tucket
+tucking
+tuckner
+tuckshop
+tucktoo
+tucky
+tucum
+tucuma
+tucuman
+Tucuna
+tudel
+Tudesque
+Tudor
+Tudoresque
+tue
+tueiron
+Tuesday
+tufa
+tufaceous
+tufalike
+tufan
+tuff
+tuffaceous
+tuffet
+tuffing
+tuft
+tuftaffeta
+tufted
+tufter
+tufthunter
+tufthunting
+tuftily
+tufting
+tuftlet
+tufty
+tug
+tugboat
+tugboatman
+tugger
+tuggery
+tugging
+tuggingly
+tughra
+tugless
+tuglike
+tugman
+tugrik
+tugui
+tugurium
+tui
+tuik
+tuille
+tuillette
+tuilyie
+tuism
+tuition
+tuitional
+tuitionary
+tuitive
+tuke
+tukra
+Tukuler
+Tukulor
+tula
+Tulalip
+tulare
+tularemia
+tulasi
+Tulbaghia
+tulchan
+tulchin
+tule
+tuliac
+tulip
+Tulipa
+tulipflower
+tulipiferous
+tulipist
+tuliplike
+tulipomania
+tulipomaniac
+tulipwood
+tulipy
+tulisan
+Tulkepaia
+tulle
+Tullian
+tullibee
+Tulostoma
+tulsi
+Tulu
+tulwar
+tum
+tumasha
+tumatakuru
+tumatukuru
+tumbak
+tumbester
+tumble
+tumblebug
+tumbled
+tumbledung
+tumbler
+tumblerful
+tumblerlike
+tumblerwise
+tumbleweed
+tumblification
+tumbling
+tumblingly
+tumbly
+Tumboa
+tumbrel
+tume
+tumefacient
+tumefaction
+tumefy
+tumescence
+tumescent
+tumid
+tumidity
+tumidly
+tumidness
+Tumion
+tummals
+tummel
+tummer
+tummock
+tummy
+tumor
+tumored
+tumorlike
+tumorous
+tump
+tumpline
+tumtum
+tumular
+tumulary
+tumulate
+tumulation
+tumuli
+tumulose
+tumulosity
+tumulous
+tumult
+tumultuarily
+tumultuariness
+tumultuary
+tumultuate
+tumultuation
+tumultuous
+tumultuously
+tumultuousness
+tumulus
+Tumupasa
+tun
+Tuna
+tuna
+tunable
+tunableness
+tunably
+tunbellied
+tunbelly
+tunca
+tund
+tundagslatta
+tunder
+tundish
+tundra
+tundun
+tune
+Tunebo
+tuned
+tuneful
+tunefully
+tunefulness
+tuneless
+tunelessly
+tunelessness
+tunemaker
+tunemaking
+tuner
+tunesome
+tunester
+tunful
+tung
+Tunga
+Tungan
+tungate
+tungo
+tungstate
+tungsten
+tungstenic
+tungsteniferous
+tungstenite
+tungstic
+tungstite
+tungstosilicate
+tungstosilicic
+Tungus
+Tungusian
+Tungusic
+tunhoof
+tunic
+Tunica
+Tunican
+tunicary
+Tunicata
+tunicate
+tunicated
+tunicin
+tunicked
+tunicle
+tunicless
+tuniness
+tuning
+tunish
+Tunisian
+tunist
+tunk
+Tunker
+tunket
+tunlike
+tunmoot
+tunna
+tunnel
+tunneled
+tunneler
+tunneling
+tunnelist
+tunnelite
+tunnellike
+tunnelly
+tunnelmaker
+tunnelmaking
+tunnelman
+tunnelway
+tunner
+tunnery
+Tunnit
+tunnland
+tunnor
+tunny
+tuno
+tunu
+tuny
+tup
+Tupaia
+Tupaiidae
+tupakihi
+tupanship
+tupara
+tupek
+tupelo
+Tupi
+Tupian
+tupik
+Tupinamba
+Tupinaqui
+tupman
+tuppence
+tuppenny
+Tupperian
+Tupperish
+Tupperism
+Tupperize
+tupuna
+tuque
+tur
+turacin
+Turacus
+Turanian
+Turanianism
+Turanism
+turanose
+turb
+turban
+turbaned
+turbanesque
+turbanette
+turbanless
+turbanlike
+turbantop
+turbanwise
+turbary
+turbeh
+Turbellaria
+turbellarian
+turbellariform
+turbescency
+turbid
+turbidimeter
+turbidimetric
+turbidimetry
+turbidity
+turbidly
+turbidness
+turbinaceous
+turbinage
+turbinal
+turbinate
+turbinated
+turbination
+turbinatoconcave
+turbinatocylindrical
+turbinatoglobose
+turbinatostipitate
+turbine
+turbinectomy
+turbined
+turbinelike
+Turbinella
+Turbinellidae
+turbinelloid
+turbiner
+turbines
+Turbinidae
+turbiniform
+turbinoid
+turbinotome
+turbinotomy
+turbit
+turbith
+turbitteen
+Turbo
+turbo
+turboalternator
+turboblower
+turbocompressor
+turbodynamo
+turboexciter
+turbofan
+turbogenerator
+turbomachine
+turbomotor
+turbopump
+turbosupercharge
+turbosupercharger
+turbot
+turbotlike
+turboventilator
+turbulence
+turbulency
+turbulent
+turbulently
+turbulentness
+Turcian
+Turcic
+Turcification
+Turcism
+Turcize
+Turco
+turco
+Turcoman
+Turcophilism
+turcopole
+turcopolier
+turd
+Turdetan
+Turdidae
+turdiform
+Turdinae
+turdine
+turdoid
+Turdus
+tureen
+tureenful
+turf
+turfage
+turfdom
+turfed
+turfen
+turfiness
+turfing
+turfite
+turfless
+turflike
+turfman
+turfwise
+turfy
+turgency
+turgent
+turgently
+turgesce
+turgescence
+turgescency
+turgescent
+turgescible
+turgid
+turgidity
+turgidly
+turgidness
+turgite
+turgoid
+turgor
+turgy
+Turi
+turicata
+turio
+turion
+turioniferous
+turjaite
+turjite
+Turk
+turk
+Turkana
+Turkdom
+Turkeer
+turken
+Turkery
+Turkess
+Turkey
+turkey
+turkeyback
+turkeyberry
+turkeybush
+Turkeydom
+turkeyfoot
+Turkeyism
+turkeylike
+Turki
+Turkic
+Turkicize
+Turkification
+Turkify
+turkis
+Turkish
+Turkishly
+Turkishness
+Turkism
+Turkize
+turkle
+Turklike
+Turkman
+Turkmen
+Turkmenian
+Turkologist
+Turkology
+Turkoman
+Turkomania
+Turkomanic
+Turkomanize
+Turkophil
+Turkophile
+Turkophilia
+Turkophilism
+Turkophobe
+Turkophobist
+turlough
+Turlupin
+turm
+turma
+turment
+turmeric
+turmit
+turmoil
+turmoiler
+turn
+turnable
+turnabout
+turnagain
+turnaround
+turnaway
+turnback
+turnbout
+turnbuckle
+turncap
+turncoat
+turncoatism
+turncock
+turndown
+turndun
+turned
+turnel
+turner
+Turnera
+Turneraceae
+turneraceous
+Turneresque
+Turnerian
+Turnerism
+turnerite
+turnery
+turney
+turngate
+turnhall
+Turnhalle
+Turnices
+Turnicidae
+turnicine
+Turnicomorphae
+turnicomorphic
+turning
+turningness
+turnip
+turniplike
+turnipweed
+turnipwise
+turnipwood
+turnipy
+Turnix
+turnix
+turnkey
+turnoff
+turnout
+turnover
+turnpike
+turnpiker
+turnpin
+turnplate
+turnplow
+turnrow
+turns
+turnscrew
+turnsheet
+turnskin
+turnsole
+turnspit
+turnstile
+turnstone
+turntable
+turntail
+turnup
+turnwrest
+turnwrist
+Turonian
+turp
+turpantineweed
+turpentine
+turpentineweed
+turpentinic
+turpeth
+turpethin
+turpid
+turpidly
+turpitude
+turps
+turquoise
+turquoiseberry
+turquoiselike
+turr
+turret
+turreted
+turrethead
+turretlike
+turrical
+turricle
+turricula
+turriculae
+turricular
+turriculate
+turriferous
+turriform
+turrigerous
+Turrilepas
+turrilite
+Turrilites
+turriliticone
+Turrilitidae
+Turritella
+turritella
+turritellid
+Turritellidae
+turritelloid
+turse
+Tursenoi
+Tursha
+tursio
+Tursiops
+Turtan
+turtle
+turtleback
+turtlebloom
+turtledom
+turtledove
+turtlehead
+turtleize
+turtlelike
+turtler
+turtlet
+turtling
+turtosa
+tururi
+turus
+Turveydrop
+Turveydropdom
+Turveydropian
+turwar
+Tusayan
+Tuscan
+Tuscanism
+Tuscanize
+Tuscanlike
+Tuscany
+Tuscarora
+tusche
+Tusculan
+Tush
+tush
+tushed
+Tushepaw
+tusher
+tushery
+tusk
+tuskar
+tusked
+Tuskegee
+tusker
+tuskish
+tuskless
+tusklike
+tuskwise
+tusky
+tussah
+tussal
+tusser
+tussicular
+Tussilago
+tussis
+tussive
+tussle
+tussock
+tussocked
+tussocker
+tussocky
+tussore
+tussur
+tut
+tutania
+tutball
+tute
+tutee
+tutela
+tutelage
+tutelar
+tutelary
+Tutelo
+tutenag
+tuth
+tutin
+tutiorism
+tutiorist
+tutly
+tutman
+tutor
+tutorage
+tutorer
+tutoress
+tutorhood
+tutorial
+tutorially
+tutoriate
+tutorism
+tutorization
+tutorize
+tutorless
+tutorly
+tutorship
+tutory
+tutoyer
+tutress
+tutrice
+tutrix
+tuts
+tutsan
+tutster
+tutti
+tuttiman
+tutty
+tutu
+tutulus
+Tututni
+tutwork
+tutworker
+tutworkman
+tuwi
+tux
+tuxedo
+tuyere
+Tuyuneiri
+tuza
+Tuzla
+tuzzle
+twa
+Twaddell
+twaddle
+twaddledom
+twaddleize
+twaddlement
+twaddlemonger
+twaddler
+twaddlesome
+twaddling
+twaddlingly
+twaddly
+twaddy
+twae
+twaesome
+twafauld
+twagger
+twain
+twaite
+twal
+twale
+twalpenny
+twalpennyworth
+twalt
+Twana
+twang
+twanger
+twanginess
+twangle
+twangler
+twangy
+twank
+twanker
+twanking
+twankingly
+twankle
+twanky
+twant
+twarly
+twas
+twasome
+twat
+twatchel
+twatterlight
+twattle
+twattler
+twattling
+tway
+twayblade
+twazzy
+tweag
+tweak
+tweaker
+tweaky
+twee
+tweed
+tweeded
+tweedle
+tweedledee
+tweedledum
+tweedy
+tweeg
+tweel
+tween
+tweenlight
+tweeny
+tweesh
+tweesht
+tweest
+tweet
+tweeter
+tweeze
+tweezer
+tweezers
+tweil
+twelfhynde
+twelfhyndeman
+twelfth
+twelfthly
+Twelfthtide
+twelve
+twelvefold
+twelvehynde
+twelvehyndeman
+twelvemo
+twelvemonth
+twelvepence
+twelvepenny
+twelvescore
+twentieth
+twentiethly
+twenty
+twentyfold
+twentymo
+twere
+twerp
+Twi
+twibil
+twibilled
+twice
+twicer
+twicet
+twichild
+twick
+twiddle
+twiddler
+twiddling
+twiddly
+twifoil
+twifold
+twifoldly
+twig
+twigful
+twigged
+twiggen
+twigger
+twiggy
+twigless
+twiglet
+twiglike
+twigsome
+twigwithy
+twilight
+twilightless
+twilightlike
+twilighty
+twilit
+twill
+twilled
+twiller
+twilling
+twilly
+twilt
+twin
+twinable
+twinberry
+twinborn
+twindle
+twine
+twineable
+twinebush
+twineless
+twinelike
+twinemaker
+twinemaking
+twiner
+twinflower
+twinfold
+twinge
+twingle
+twinhood
+twiningly
+twinism
+twink
+twinkle
+twinkledum
+twinkleproof
+twinkler
+twinkles
+twinkless
+twinkling
+twinklingly
+twinkly
+twinleaf
+twinlike
+twinling
+twinly
+twinned
+twinner
+twinness
+twinning
+twinship
+twinsomeness
+twinter
+twiny
+twire
+twirk
+twirl
+twirler
+twirligig
+twirly
+twiscar
+twisel
+twist
+twistable
+twisted
+twistedly
+twistened
+twister
+twisterer
+twistical
+twistification
+twistily
+twistiness
+twisting
+twistingly
+twistiways
+twistiwise
+twistle
+twistless
+twisty
+twit
+twitch
+twitchel
+twitcheling
+twitcher
+twitchet
+twitchety
+twitchfire
+twitchily
+twitchiness
+twitchingly
+twitchy
+twite
+twitlark
+twitten
+twitter
+twitteration
+twitterboned
+twitterer
+twittering
+twitteringly
+twitterly
+twittery
+twittingly
+twitty
+twixt
+twixtbrain
+twizzened
+twizzle
+two
+twodecker
+twofold
+twofoldly
+twofoldness
+twoling
+twoness
+twopence
+twopenny
+twosome
+twyblade
+twyhynde
+Tybalt
+Tyburn
+Tyburnian
+Tyche
+tychism
+tychite
+Tychonian
+Tychonic
+tychoparthenogenesis
+tychopotamic
+tycoon
+tycoonate
+tyddyn
+tydie
+tye
+tyee
+tyg
+Tyigh
+tying
+tyke
+tyken
+tykhana
+tyking
+tylarus
+tyleberry
+Tylenchus
+Tyler
+Tylerism
+Tylerite
+Tylerize
+tylion
+tyloma
+tylopod
+Tylopoda
+tylopodous
+Tylosaurus
+tylose
+tylosis
+tylosteresis
+Tylostoma
+Tylostomaceae
+tylostylar
+tylostyle
+tylostylote
+tylostylus
+Tylosurus
+tylotate
+tylote
+tylotic
+tylotoxea
+tylotoxeate
+tylotus
+tylus
+tymbalon
+tymp
+tympan
+tympana
+tympanal
+tympanectomy
+tympani
+tympanic
+tympanichord
+tympanichordal
+tympanicity
+tympaniform
+tympaning
+tympanism
+tympanist
+tympanites
+tympanitic
+tympanitis
+tympanocervical
+tympanohyal
+tympanomalleal
+tympanomandibular
+tympanomastoid
+tympanomaxillary
+tympanon
+tympanoperiotic
+tympanosis
+tympanosquamosal
+tympanostapedial
+tympanotemporal
+tympanotomy
+Tympanuchus
+tympanum
+tympany
+tynd
+Tyndallization
+Tyndallize
+tyndallmeter
+Tynwald
+typal
+typarchical
+type
+typecast
+Typees
+typeholder
+typer
+typescript
+typeset
+typesetter
+typesetting
+typewrite
+typewriter
+typewriting
+Typha
+Typhaceae
+typhaceous
+typhemia
+typhia
+typhic
+typhinia
+typhization
+typhlatonia
+typhlatony
+typhlectasis
+typhlectomy
+typhlenteritis
+typhlitic
+typhlitis
+typhloalbuminuria
+typhlocele
+typhloempyema
+typhloenteritis
+typhlohepatitis
+typhlolexia
+typhlolithiasis
+typhlology
+typhlomegaly
+Typhlomolge
+typhlon
+typhlopexia
+typhlopexy
+typhlophile
+typhlopid
+Typhlopidae
+Typhlops
+typhloptosis
+typhlosis
+typhlosolar
+typhlosole
+typhlostenosis
+typhlostomy
+typhlotomy
+typhobacillosis
+Typhoean
+typhoemia
+typhogenic
+typhoid
+typhoidal
+typhoidin
+typhoidlike
+typholysin
+typhomalaria
+typhomalarial
+typhomania
+typhonia
+Typhonian
+Typhonic
+typhonic
+typhoon
+typhoonish
+typhopneumonia
+typhose
+typhosepsis
+typhosis
+typhotoxine
+typhous
+Typhula
+typhus
+typic
+typica
+typical
+typicality
+typically
+typicalness
+typicon
+typicum
+typification
+typifier
+typify
+typist
+typo
+typobar
+typocosmy
+typographer
+typographia
+typographic
+typographical
+typographically
+typographist
+typography
+typolithographic
+typolithography
+typologic
+typological
+typologically
+typologist
+typology
+typomania
+typometry
+typonym
+typonymal
+typonymic
+typonymous
+typophile
+typorama
+typoscript
+typotelegraph
+typotelegraphy
+typothere
+Typotheria
+Typotheriidae
+typothetae
+typp
+typtological
+typtologist
+typtology
+typy
+tyramine
+tyranness
+Tyranni
+tyrannial
+tyrannic
+tyrannical
+tyrannically
+tyrannicalness
+tyrannicidal
+tyrannicide
+tyrannicly
+Tyrannidae
+Tyrannides
+Tyranninae
+tyrannine
+tyrannism
+tyrannize
+tyrannizer
+tyrannizing
+tyrannizingly
+tyrannoid
+tyrannophobia
+tyrannosaur
+Tyrannosaurus
+tyrannous
+tyrannously
+tyrannousness
+Tyrannus
+tyranny
+tyrant
+tyrantcraft
+tyrantlike
+tyrantship
+tyre
+tyremesis
+Tyrian
+tyriasis
+tyro
+tyrocidin
+tyrocidine
+tyroglyphid
+Tyroglyphidae
+Tyroglyphus
+Tyrolean
+Tyrolese
+Tyrolienne
+tyrolite
+tyrology
+tyroma
+tyromancy
+tyromatous
+tyrone
+tyronic
+tyronism
+tyrosinase
+tyrosine
+tyrosinuria
+tyrosyl
+tyrotoxicon
+tyrotoxine
+Tyrr
+Tyrrhene
+Tyrrheni
+Tyrrhenian
+Tyrsenoi
+Tyrtaean
+tysonite
+tyste
+tyt
+Tyto
+Tytonidae
+Tzaam
+Tzapotec
+tzaritza
+Tzendal
+Tzental
+tzolkin
+tzontle
+Tzotzil
+Tzutuhil
+U
+u
+uang
+Uaraycu
+Uarekena
+Uaupe
+uayeb
+Ubbenite
+Ubbonite
+uberant
+uberous
+uberously
+uberousness
+uberty
+ubi
+ubication
+ubiety
+Ubii
+Ubiquarian
+ubiquarian
+ubiquious
+Ubiquist
+ubiquit
+Ubiquitarian
+ubiquitarian
+Ubiquitarianism
+ubiquitariness
+ubiquitary
+Ubiquitism
+Ubiquitist
+ubiquitous
+ubiquitously
+ubiquitousness
+ubiquity
+ubussu
+Uca
+Ucal
+Ucayale
+Uchean
+Uchee
+uckia
+Ud
+udal
+udaler
+udaller
+udalman
+udasi
+udder
+uddered
+udderful
+udderless
+udderlike
+udell
+Udi
+Udic
+Udish
+udo
+Udolphoish
+udometer
+udometric
+udometry
+udomograph
+Uds
+Ueueteotl
+ug
+Ugandan
+Ugarono
+ugh
+uglification
+uglifier
+uglify
+uglily
+ugliness
+uglisome
+ugly
+Ugrian
+Ugric
+Ugroid
+ugsome
+ugsomely
+ugsomeness
+uhlan
+uhllo
+uhtensang
+uhtsong
+Uigur
+Uigurian
+Uiguric
+uily
+uinal
+Uinta
+uintaite
+uintathere
+Uintatheriidae
+Uintatherium
+uintjie
+Uirina
+Uitotan
+uitspan
+uji
+ukase
+uke
+ukiyoye
+Ukrainer
+Ukrainian
+ukulele
+ula
+ulatrophia
+ulcer
+ulcerable
+ulcerate
+ulceration
+ulcerative
+ulcered
+ulceromembranous
+ulcerous
+ulcerously
+ulcerousness
+ulcery
+ulcuscle
+ulcuscule
+ule
+ulema
+ulemorrhagia
+ulerythema
+uletic
+Ulex
+ulex
+ulexine
+ulexite
+Ulidia
+Ulidian
+uliginose
+uliginous
+ulitis
+ull
+ulla
+ullage
+ullaged
+ullagone
+uller
+ulling
+ullmannite
+ulluco
+Ulmaceae
+ulmaceous
+Ulmaria
+ulmic
+ulmin
+ulminic
+ulmo
+ulmous
+Ulmus
+ulna
+ulnad
+ulnae
+ulnar
+ulnare
+ulnaria
+ulnocarpal
+ulnocondylar
+ulnometacarpal
+ulnoradial
+uloborid
+Uloboridae
+Uloborus
+ulocarcinoma
+uloid
+Ulonata
+uloncus
+Ulophocinae
+ulorrhagia
+ulorrhagy
+ulorrhea
+Ulothrix
+Ulotrichaceae
+ulotrichaceous
+Ulotrichales
+ulotrichan
+Ulotriches
+Ulotrichi
+ulotrichous
+ulotrichy
+ulrichite
+ulster
+ulstered
+ulsterette
+Ulsterian
+ulstering
+Ulsterite
+Ulsterman
+ulterior
+ulteriorly
+ultima
+ultimacy
+ultimata
+ultimate
+ultimately
+ultimateness
+ultimation
+ultimatum
+ultimity
+ultimo
+ultimobranchial
+ultimogenitary
+ultimogeniture
+ultimum
+Ultonian
+ultra
+ultrabasic
+ultrabasite
+ultrabelieving
+ultrabenevolent
+ultrabrachycephalic
+ultrabrachycephaly
+ultrabrilliant
+ultracentenarian
+ultracentenarianism
+ultracentralizer
+ultracentrifuge
+ultraceremonious
+ultrachurchism
+ultracivil
+ultracomplex
+ultraconcomitant
+ultracondenser
+ultraconfident
+ultraconscientious
+ultraconservatism
+ultraconservative
+ultracordial
+ultracosmopolitan
+ultracredulous
+ultracrepidarian
+ultracrepidarianism
+ultracrepidate
+ultracritical
+ultradandyism
+ultradeclamatory
+ultrademocratic
+ultradespotic
+ultradignified
+ultradiscipline
+ultradolichocephalic
+ultradolichocephaly
+ultradolichocranial
+ultraeducationist
+ultraeligible
+ultraelliptic
+ultraemphasis
+ultraenergetic
+ultraenforcement
+ultraenthusiasm
+ultraenthusiastic
+ultraepiscopal
+ultraevangelical
+ultraexcessive
+ultraexclusive
+ultraexpeditious
+ultrafantastic
+ultrafashionable
+ultrafastidious
+ultrafederalist
+ultrafeudal
+ultrafidian
+ultrafidianism
+ultrafilter
+ultrafilterability
+ultrafilterable
+ultrafiltrate
+ultrafiltration
+ultraformal
+ultrafrivolous
+ultragallant
+ultragaseous
+ultragenteel
+ultragood
+ultragrave
+ultraheroic
+ultrahonorable
+ultrahuman
+ultraimperialism
+ultraimperialist
+ultraimpersonal
+ultrainclusive
+ultraindifferent
+ultraindulgent
+ultraingenious
+ultrainsistent
+ultraintimate
+ultrainvolved
+ultraism
+ultraist
+ultraistic
+ultralaborious
+ultralegality
+ultralenient
+ultraliberal
+ultraliberalism
+ultralogical
+ultraloyal
+ultraluxurious
+ultramarine
+ultramaternal
+ultramaximal
+ultramelancholy
+ultramicrochemical
+ultramicrochemist
+ultramicrochemistry
+ultramicrometer
+ultramicron
+ultramicroscope
+ultramicroscopic
+ultramicroscopical
+ultramicroscopy
+ultraminute
+ultramoderate
+ultramodern
+ultramodernism
+ultramodernist
+ultramodernistic
+ultramodest
+ultramontane
+ultramontanism
+ultramontanist
+ultramorose
+ultramulish
+ultramundane
+ultranational
+ultranationalism
+ultranationalist
+ultranatural
+ultranegligent
+ultranice
+ultranonsensical
+ultraobscure
+ultraobstinate
+ultraofficious
+ultraoptimistic
+ultraornate
+ultraorthodox
+ultraorthodoxy
+ultraoutrageous
+ultrapapist
+ultraparallel
+ultraperfect
+ultrapersuasive
+ultraphotomicrograph
+ultrapious
+ultraplanetary
+ultraplausible
+ultrapopish
+ultraproud
+ultraprudent
+ultraradical
+ultraradicalism
+ultrarapid
+ultrareactionary
+ultrared
+ultrarefined
+ultrarefinement
+ultrareligious
+ultraremuneration
+ultrarepublican
+ultrarevolutionary
+ultrarevolutionist
+ultraritualism
+ultraromantic
+ultraroyalism
+ultraroyalist
+ultrasanguine
+ultrascholastic
+ultraselect
+ultraservile
+ultrasevere
+ultrashrewd
+ultrasimian
+ultrasolemn
+ultrasonic
+ultrasonics
+ultraspartan
+ultraspecialization
+ultraspiritualism
+ultrasplendid
+ultrastandardization
+ultrastellar
+ultrasterile
+ultrastrenuous
+ultrastrict
+ultrasubtle
+ultrasystematic
+ultratechnical
+ultratense
+ultraterrene
+ultraterrestrial
+ultratotal
+ultratrivial
+ultratropical
+ultraugly
+ultrauncommon
+ultraurgent
+ultravicious
+ultraviolent
+ultraviolet
+ultravirtuous
+ultravirus
+ultravisible
+ultrawealthy
+ultrawise
+ultrayoung
+ultrazealous
+ultrazodiacal
+ultroneous
+ultroneously
+ultroneousness
+ulu
+Ulua
+ulua
+uluhi
+ululant
+ululate
+ululation
+ululative
+ululatory
+ululu
+Ulva
+Ulvaceae
+ulvaceous
+Ulvales
+Ulvan
+Ulyssean
+Ulysses
+um
+umangite
+Umatilla
+Umaua
+umbeclad
+umbel
+umbeled
+umbella
+Umbellales
+umbellar
+umbellate
+umbellated
+umbellately
+umbellet
+umbellic
+umbellifer
+Umbelliferae
+umbelliferone
+umbelliferous
+umbelliflorous
+umbelliform
+umbelloid
+Umbellula
+Umbellularia
+umbellulate
+umbellule
+Umbellulidae
+umbelluliferous
+umbelwort
+umber
+umbethink
+umbilectomy
+umbilic
+umbilical
+umbilically
+umbilicar
+Umbilicaria
+umbilicate
+umbilicated
+umbilication
+umbilici
+umbiliciform
+umbilicus
+umbiliform
+umbilroot
+umble
+umbo
+umbolateral
+umbonal
+umbonate
+umbonated
+umbonation
+umbone
+umbones
+umbonial
+umbonic
+umbonulate
+umbonule
+Umbra
+umbra
+umbracious
+umbraciousness
+umbraculate
+umbraculiferous
+umbraculiform
+umbraculum
+umbrae
+umbrage
+umbrageous
+umbrageously
+umbrageousness
+umbral
+umbrally
+umbratile
+umbrel
+umbrella
+umbrellaed
+umbrellaless
+umbrellalike
+umbrellawise
+umbrellawort
+umbrette
+Umbrian
+Umbriel
+umbriferous
+umbriferously
+umbriferousness
+umbril
+umbrine
+umbrose
+umbrosity
+umbrous
+Umbundu
+ume
+umiak
+umiri
+umlaut
+ump
+umph
+umpirage
+umpire
+umpirer
+umpireship
+umpiress
+umpirism
+Umpqua
+umpteen
+umpteenth
+umptekite
+umptieth
+umpty
+umquhile
+umu
+un
+Una
+unabandoned
+unabased
+unabasedly
+unabashable
+unabashed
+unabashedly
+unabatable
+unabated
+unabatedly
+unabating
+unabatingly
+unabbreviated
+unabetted
+unabettedness
+unabhorred
+unabiding
+unabidingly
+unabidingness
+unability
+unabject
+unabjured
+unable
+unableness
+unably
+unabolishable
+unabolished
+unabraded
+unabrased
+unabridgable
+unabridged
+unabrogated
+unabrupt
+unabsent
+unabsolute
+unabsolvable
+unabsolved
+unabsolvedness
+unabsorb
+unabsorbable
+unabsorbed
+unabsorbent
+unabstract
+unabsurd
+unabundance
+unabundant
+unabundantly
+unabused
+unacademic
+unacademical
+unaccelerated
+unaccent
+unaccented
+unaccentuated
+unaccept
+unacceptability
+unacceptable
+unacceptableness
+unacceptably
+unacceptance
+unacceptant
+unaccepted
+unaccessibility
+unaccessible
+unaccessibleness
+unaccessibly
+unaccessional
+unaccessory
+unaccidental
+unaccidentally
+unaccidented
+unacclimated
+unacclimation
+unacclimatization
+unacclimatized
+unaccommodable
+unaccommodated
+unaccommodatedness
+unaccommodating
+unaccommodatingly
+unaccommodatingness
+unaccompanable
+unaccompanied
+unaccompanying
+unaccomplishable
+unaccomplished
+unaccomplishedness
+unaccord
+unaccordable
+unaccordance
+unaccordant
+unaccorded
+unaccording
+unaccordingly
+unaccostable
+unaccosted
+unaccountability
+unaccountable
+unaccountableness
+unaccountably
+unaccounted
+unaccoutered
+unaccoutred
+unaccreditated
+unaccredited
+unaccrued
+unaccumulable
+unaccumulate
+unaccumulated
+unaccumulation
+unaccuracy
+unaccurate
+unaccurately
+unaccurateness
+unaccursed
+unaccusable
+unaccusably
+unaccuse
+unaccusing
+unaccustom
+unaccustomed
+unaccustomedly
+unaccustomedness
+unachievable
+unachieved
+unaching
+unacidulated
+unacknowledged
+unacknowledgedness
+unacknowledging
+unacknowledgment
+unacoustic
+unacquaint
+unacquaintable
+unacquaintance
+unacquainted
+unacquaintedly
+unacquaintedness
+unacquiescent
+unacquirable
+unacquirableness
+unacquirably
+unacquired
+unacquit
+unacquittable
+unacquitted
+unacquittedness
+unact
+unactability
+unactable
+unacted
+unacting
+unactinic
+unaction
+unactivated
+unactive
+unactively
+unactiveness
+unactivity
+unactorlike
+unactual
+unactuality
+unactually
+unactuated
+unacute
+unacutely
+unadapt
+unadaptability
+unadaptable
+unadaptableness
+unadaptably
+unadapted
+unadaptedly
+unadaptedness
+unadaptive
+unadd
+unaddable
+unadded
+unaddicted
+unaddictedness
+unadditional
+unaddress
+unaddressed
+unadequate
+unadequately
+unadequateness
+unadherence
+unadherent
+unadherently
+unadhesive
+unadjacent
+unadjacently
+unadjectived
+unadjourned
+unadjournment
+unadjudged
+unadjust
+unadjustably
+unadjusted
+unadjustment
+unadministered
+unadmirable
+unadmire
+unadmired
+unadmiring
+unadmissible
+unadmissibly
+unadmission
+unadmittable
+unadmittableness
+unadmittably
+unadmitted
+unadmittedly
+unadmitting
+unadmonished
+unadopt
+unadoptable
+unadoptably
+unadopted
+unadoption
+unadorable
+unadoration
+unadored
+unadoring
+unadorn
+unadornable
+unadorned
+unadornedly
+unadornedness
+unadornment
+unadult
+unadulterate
+unadulterated
+unadulteratedly
+unadulteratedness
+unadulterately
+unadulterous
+unadulterously
+unadvanced
+unadvancedly
+unadvancedness
+unadvancement
+unadvancing
+unadvantaged
+unadvantageous
+unadventured
+unadventuring
+unadventurous
+unadventurously
+unadverse
+unadversely
+unadverseness
+unadvertency
+unadvertised
+unadvertisement
+unadvertising
+unadvisability
+unadvisable
+unadvisableness
+unadvisably
+unadvised
+unadvisedly
+unadvisedness
+unadvocated
+unaerated
+unaesthetic
+unaesthetical
+unafeard
+unafeared
+unaffable
+unaffably
+unaffected
+unaffectedly
+unaffectedness
+unaffecting
+unaffectionate
+unaffectionately
+unaffectioned
+unaffianced
+unaffied
+unaffiliated
+unaffiliation
+unaffirmation
+unaffirmed
+unaffixed
+unafflicted
+unafflictedly
+unafflicting
+unaffliction
+unaffordable
+unafforded
+unaffranchised
+unaffrighted
+unaffrightedly
+unaffronted
+unafire
+unafloat
+unaflow
+unafraid
+unaged
+unaggravated
+unaggravating
+unaggregated
+unaggression
+unaggressive
+unaggressively
+unaggressiveness
+unaghast
+unagile
+unagility
+unaging
+unagitated
+unagitatedly
+unagitatedness
+unagitation
+unagonize
+unagrarian
+unagreeable
+unagreeableness
+unagreeably
+unagreed
+unagreeing
+unagreement
+unagricultural
+unaidable
+unaided
+unaidedly
+unaiding
+unailing
+unaimed
+unaiming
+unaired
+unaisled
+Unakhotana
+unakin
+unakite
+unal
+Unalachtigo
+unalarm
+unalarmed
+unalarming
+Unalaska
+unalcoholized
+unaldermanly
+unalert
+unalertly
+unalertness
+unalgebraical
+unalienable
+unalienableness
+unalienably
+unalienated
+unalignable
+unaligned
+unalike
+unalimentary
+unalist
+unalive
+unallayable
+unallayably
+unallayed
+unalleged
+unallegorical
+unalleviably
+unalleviated
+unalleviation
+unalliable
+unallied
+unalliedly
+unalliedness
+unallotment
+unallotted
+unallow
+unallowable
+unallowed
+unallowedly
+unallowing
+unalloyed
+unallurable
+unallured
+unalluring
+unalluringly
+unalmsed
+unalone
+unaloud
+unalphabeted
+unalphabetic
+unalphabetical
+unalterability
+unalterable
+unalterableness
+unalterably
+unalteration
+unaltered
+unaltering
+unalternated
+unamalgamable
+unamalgamated
+unamalgamating
+unamassed
+unamazed
+unamazedly
+unambiguity
+unambiguous
+unambiguously
+unambiguousness
+unambition
+unambitious
+unambitiously
+unambitiousness
+unambrosial
+unambush
+unamenability
+unamenable
+unamenableness
+unamenably
+unamend
+unamendable
+unamended
+unamendedly
+unamending
+unamendment
+unamerced
+Unami
+unamiability
+unamiable
+unamiableness
+unamiably
+unamicable
+unamicably
+unamiss
+unamo
+unamortization
+unamortized
+unample
+unamplifiable
+unamplified
+unamply
+unamputated
+unamusable
+unamusably
+unamused
+unamusement
+unamusing
+unamusingly
+unamusive
+unanalogical
+unanalogous
+unanalogously
+unanalogousness
+unanalytic
+unanalytical
+unanalyzable
+unanalyzed
+unanalyzing
+unanatomizable
+unanatomized
+unancestored
+unancestried
+unanchor
+unanchored
+unanchylosed
+unancient
+unaneled
+unangelic
+unangelical
+unangrily
+unangry
+unangular
+unanimalized
+unanimate
+unanimated
+unanimatedly
+unanimatedness
+unanimately
+unanimism
+unanimist
+unanimistic
+unanimistically
+unanimity
+unanimous
+unanimously
+unanimousness
+unannealed
+unannex
+unannexed
+unannexedly
+unannexedness
+unannihilable
+unannihilated
+unannotated
+unannounced
+unannoyed
+unannoying
+unannullable
+unannulled
+unanointed
+unanswerability
+unanswerable
+unanswerableness
+unanswerably
+unanswered
+unanswering
+unantagonistic
+unantagonizable
+unantagonized
+unantagonizing
+unanticipated
+unanticipating
+unanticipatingly
+unanticipation
+unanticipative
+unantiquated
+unantiquatedness
+unantique
+unantiquity
+unanxiety
+unanxious
+unanxiously
+unanxiousness
+unapart
+unapocryphal
+unapologetic
+unapologizing
+unapostatized
+unapostolic
+unapostolical
+unapostolically
+unapostrophized
+unappalled
+unappareled
+unapparent
+unapparently
+unapparentness
+unappealable
+unappealableness
+unappealably
+unappealed
+unappealing
+unappeasable
+unappeasableness
+unappeasably
+unappeased
+unappeasedly
+unappeasedness
+unappendaged
+unapperceived
+unappertaining
+unappetizing
+unapplauded
+unapplauding
+unapplausive
+unappliable
+unappliableness
+unappliably
+unapplianced
+unapplicable
+unapplicableness
+unapplicably
+unapplied
+unapplying
+unappoint
+unappointable
+unappointableness
+unappointed
+unapportioned
+unapposite
+unappositely
+unappraised
+unappreciable
+unappreciableness
+unappreciably
+unappreciated
+unappreciating
+unappreciation
+unappreciative
+unappreciatively
+unappreciativeness
+unapprehendable
+unapprehendableness
+unapprehendably
+unapprehended
+unapprehending
+unapprehensible
+unapprehensibleness
+unapprehension
+unapprehensive
+unapprehensively
+unapprehensiveness
+unapprenticed
+unapprised
+unapprisedly
+unapprisedness
+unapproachability
+unapproachable
+unapproachableness
+unapproached
+unapproaching
+unapprobation
+unappropriable
+unappropriate
+unappropriated
+unappropriately
+unappropriateness
+unappropriation
+unapprovable
+unapprovableness
+unapprovably
+unapproved
+unapproving
+unapprovingly
+unapproximate
+unapproximately
+unaproned
+unapropos
+unapt
+unaptitude
+unaptly
+unaptness
+unarbitrarily
+unarbitrariness
+unarbitrary
+unarbitrated
+unarch
+unarchdeacon
+unarched
+unarchitectural
+unarduous
+unarguable
+unarguableness
+unarguably
+unargued
+unarguing
+unargumentative
+unargumentatively
+unarisen
+unarising
+unaristocratic
+unaristocratically
+unarithmetical
+unarithmetically
+unark
+unarm
+unarmed
+unarmedly
+unarmedness
+unarmored
+unarmorial
+unaromatized
+unarousable
+unaroused
+unarousing
+unarraignable
+unarraigned
+unarranged
+unarray
+unarrayed
+unarrestable
+unarrested
+unarresting
+unarrival
+unarrived
+unarriving
+unarrogance
+unarrogant
+unarrogating
+unarted
+unartful
+unartfully
+unartfulness
+unarticled
+unarticulate
+unarticulated
+unartificial
+unartificiality
+unartificially
+unartistic
+unartistical
+unartistically
+unartistlike
+unary
+unascendable
+unascendableness
+unascended
+unascertainable
+unascertainableness
+unascertainably
+unascertained
+unashamed
+unashamedly
+unashamedness
+unasinous
+unaskable
+unasked
+unasking
+unasleep
+unaspersed
+unasphalted
+unaspirated
+unaspiring
+unaspiringly
+unaspiringness
+unassailable
+unassailableness
+unassailably
+unassailed
+unassailing
+unassassinated
+unassaultable
+unassaulted
+unassayed
+unassaying
+unassembled
+unassented
+unassenting
+unasserted
+unassertive
+unassertiveness
+unassessable
+unassessableness
+unassessed
+unassibilated
+unassiduous
+unassignable
+unassignably
+unassigned
+unassimilable
+unassimilated
+unassimilating
+unassimilative
+unassisted
+unassisting
+unassociable
+unassociably
+unassociated
+unassociative
+unassociativeness
+unassoiled
+unassorted
+unassuageable
+unassuaged
+unassuaging
+unassuetude
+unassumable
+unassumed
+unassuming
+unassumingly
+unassumingness
+unassured
+unassuredly
+unassuredness
+unassuring
+unasterisk
+unastonish
+unastonished
+unastonishment
+unastray
+unathirst
+unathletically
+unatmospheric
+unatonable
+unatoned
+unatoning
+unattach
+unattachable
+unattached
+unattackable
+unattackableness
+unattackably
+unattacked
+unattainability
+unattainable
+unattainableness
+unattainably
+unattained
+unattaining
+unattainment
+unattaint
+unattainted
+unattaintedly
+unattempered
+unattemptable
+unattempted
+unattempting
+unattendance
+unattendant
+unattended
+unattentive
+unattenuated
+unattested
+unattestedness
+unattire
+unattired
+unattractable
+unattractableness
+unattracted
+unattracting
+unattractive
+unattractively
+unattractiveness
+unattributable
+unattributed
+unattuned
+unau
+unauctioned
+unaudible
+unaudibleness
+unaudibly
+unaudienced
+unaudited
+unaugmentable
+unaugmented
+unauspicious
+unauspiciously
+unauspiciousness
+unaustere
+unauthentic
+unauthentical
+unauthentically
+unauthenticated
+unauthenticity
+unauthorish
+unauthoritative
+unauthoritatively
+unauthoritativeness
+unauthoritied
+unauthoritiveness
+unauthorizable
+unauthorize
+unauthorized
+unauthorizedly
+unauthorizedness
+unautomatic
+unautumnal
+unavailability
+unavailable
+unavailableness
+unavailably
+unavailed
+unavailful
+unavailing
+unavailingly
+unavengeable
+unavenged
+unavenging
+unavenued
+unaveraged
+unaverred
+unaverted
+unavertible
+unavertibleness
+unavertibly
+unavian
+unavoidable
+unavoidableness
+unavoidably
+unavoidal
+unavoided
+unavoiding
+unavouchable
+unavouchableness
+unavouchably
+unavouched
+unavowable
+unavowableness
+unavowably
+unavowed
+unavowedly
+unawakable
+unawakableness
+unawake
+unawaked
+unawakened
+unawakenedness
+unawakening
+unawaking
+unawardable
+unawardableness
+unawardably
+unawarded
+unaware
+unawared
+unawaredly
+unawareness
+unawares
+unaway
+unawed
+unawful
+unawfully
+unawkward
+unawned
+unaxled
+unazotized
+unbackboarded
+unbacked
+unbackward
+unbadged
+unbaffled
+unbaffling
+unbag
+unbagged
+unbailable
+unbailableness
+unbailed
+unbain
+unbait
+unbaited
+unbaized
+unbaked
+unbalance
+unbalanceable
+unbalanceably
+unbalanced
+unbalancement
+unbalancing
+unbalconied
+unbale
+unbalked
+unballast
+unballasted
+unballoted
+unbandage
+unbandaged
+unbanded
+unbanished
+unbank
+unbankable
+unbankableness
+unbankably
+unbanked
+unbankrupt
+unbannered
+unbaptize
+unbaptized
+unbar
+unbarb
+unbarbarize
+unbarbarous
+unbarbed
+unbarbered
+unbare
+unbargained
+unbark
+unbarking
+unbaronet
+unbarrable
+unbarred
+unbarrel
+unbarreled
+unbarren
+unbarrenness
+unbarricade
+unbarricaded
+unbarricadoed
+unbase
+unbased
+unbasedness
+unbashful
+unbashfully
+unbashfulness
+unbasket
+unbastardized
+unbaste
+unbasted
+unbastilled
+unbastinadoed
+unbated
+unbathed
+unbating
+unbatted
+unbatten
+unbatterable
+unbattered
+unbattling
+unbay
+unbe
+unbeached
+unbeaconed
+unbeaded
+unbear
+unbearable
+unbearableness
+unbearably
+unbeard
+unbearded
+unbearing
+unbeast
+unbeatable
+unbeatableness
+unbeatably
+unbeaten
+unbeaued
+unbeauteous
+unbeauteously
+unbeauteousness
+unbeautified
+unbeautiful
+unbeautifully
+unbeautifulness
+unbeautify
+unbeavered
+unbeclogged
+unbeclouded
+unbecome
+unbecoming
+unbecomingly
+unbecomingness
+unbed
+unbedabbled
+unbedaggled
+unbedashed
+unbedaubed
+unbedded
+unbedecked
+unbedewed
+unbedimmed
+unbedinned
+unbedizened
+unbedraggled
+unbefit
+unbefitting
+unbefittingly
+unbefittingness
+unbefool
+unbefriend
+unbefriended
+unbefringed
+unbeget
+unbeggar
+unbegged
+unbegilt
+unbeginning
+unbeginningly
+unbeginningness
+unbegirded
+unbegirt
+unbegot
+unbegotten
+unbegottenly
+unbegottenness
+unbegreased
+unbegrimed
+unbegrudged
+unbeguile
+unbeguiled
+unbeguileful
+unbegun
+unbehaving
+unbeheaded
+unbeheld
+unbeholdable
+unbeholden
+unbeholdenness
+unbeholding
+unbehoveful
+unbehoving
+unbeing
+unbejuggled
+unbeknown
+unbeknownst
+unbelied
+unbelief
+unbeliefful
+unbelieffulness
+unbelievability
+unbelievable
+unbelievableness
+unbelievably
+unbelieve
+unbelieved
+unbeliever
+unbelieving
+unbelievingly
+unbelievingness
+unbell
+unbellicose
+unbelligerent
+unbelonging
+unbeloved
+unbelt
+unbemoaned
+unbemourned
+unbench
+unbend
+unbendable
+unbendableness
+unbendably
+unbended
+unbending
+unbendingly
+unbendingness
+unbendsome
+unbeneficed
+unbeneficent
+unbeneficial
+unbenefitable
+unbenefited
+unbenefiting
+unbenetted
+unbenevolence
+unbenevolent
+unbenevolently
+unbenight
+unbenighted
+unbenign
+unbenignant
+unbenignantly
+unbenignity
+unbenignly
+unbent
+unbenumb
+unbenumbed
+unbequeathable
+unbequeathed
+unbereaved
+unbereft
+unberouged
+unberth
+unberufen
+unbeseem
+unbeseeming
+unbeseemingly
+unbeseemingness
+unbeseemly
+unbeset
+unbesieged
+unbesmeared
+unbesmirched
+unbesmutted
+unbesot
+unbesought
+unbespeak
+unbespoke
+unbespoken
+unbesprinkled
+unbestarred
+unbestowed
+unbet
+unbeteared
+unbethink
+unbethought
+unbetide
+unbetoken
+unbetray
+unbetrayed
+unbetraying
+unbetrothed
+unbetterable
+unbettered
+unbeveled
+unbewailed
+unbewailing
+unbewilder
+unbewildered
+unbewilled
+unbewitch
+unbewitched
+unbewitching
+unbewrayed
+unbewritten
+unbias
+unbiasable
+unbiased
+unbiasedly
+unbiasedness
+unbibulous
+unbickered
+unbickering
+unbid
+unbidable
+unbiddable
+unbidden
+unbigged
+unbigoted
+unbilled
+unbillet
+unbilleted
+unbind
+unbindable
+unbinding
+unbiographical
+unbiological
+unbirdlike
+unbirdlimed
+unbirdly
+unbirthday
+unbishop
+unbishoply
+unbit
+unbiting
+unbitt
+unbitted
+unbitten
+unbitter
+unblacked
+unblackened
+unblade
+unblamable
+unblamableness
+unblamably
+unblamed
+unblaming
+unblanched
+unblanketed
+unblasphemed
+unblasted
+unblazoned
+unbleached
+unbleaching
+unbled
+unbleeding
+unblemishable
+unblemished
+unblemishedness
+unblemishing
+unblenched
+unblenching
+unblenchingly
+unblendable
+unblended
+unblent
+unbless
+unblessed
+unblessedness
+unblest
+unblighted
+unblightedly
+unblightedness
+unblind
+unblindfold
+unblinking
+unblinkingly
+unbliss
+unblissful
+unblistered
+unblithe
+unblithely
+unblock
+unblockaded
+unblocked
+unblooded
+unbloodied
+unbloodily
+unbloodiness
+unbloody
+unbloom
+unbloomed
+unblooming
+unblossomed
+unblossoming
+unblotted
+unbloused
+unblown
+unblued
+unbluestockingish
+unbluffed
+unbluffing
+unblunder
+unblundered
+unblundering
+unblunted
+unblurred
+unblush
+unblushing
+unblushingly
+unblushingness
+unboarded
+unboasted
+unboastful
+unboastfully
+unboasting
+unboat
+unbodied
+unbodiliness
+unbodily
+unboding
+unbodkined
+unbody
+unbodylike
+unbog
+unboggy
+unbohemianize
+unboiled
+unboisterous
+unbokel
+unbold
+unbolden
+unboldly
+unboldness
+unbolled
+unbolster
+unbolstered
+unbolt
+unbolted
+unbombast
+unbondable
+unbondableness
+unbonded
+unbone
+unboned
+unbonnet
+unbonneted
+unbonny
+unbooked
+unbookish
+unbooklearned
+unboot
+unbooted
+unboraxed
+unborder
+unbordered
+unbored
+unboring
+unborn
+unborne
+unborough
+unborrowed
+unborrowing
+unbosom
+unbosomer
+unbossed
+unbotanical
+unbothered
+unbothering
+unbottle
+unbottom
+unbottomed
+unbought
+unbound
+unboundable
+unboundableness
+unboundably
+unbounded
+unboundedly
+unboundedness
+unboundless
+unbounteous
+unbountiful
+unbountifully
+unbountifulness
+unbow
+unbowable
+unbowdlerized
+unbowed
+unbowel
+unboweled
+unbowered
+unbowing
+unbowingness
+unbowled
+unbowsome
+unbox
+unboxed
+unboy
+unboyish
+unboylike
+unbrace
+unbraced
+unbracedness
+unbracelet
+unbraceleted
+unbracing
+unbragged
+unbragging
+unbraid
+unbraided
+unbrailed
+unbrained
+unbran
+unbranched
+unbranching
+unbrand
+unbranded
+unbrandied
+unbrave
+unbraved
+unbravely
+unbraze
+unbreachable
+unbreached
+unbreaded
+unbreakable
+unbreakableness
+unbreakably
+unbreakfasted
+unbreaking
+unbreast
+unbreath
+unbreathable
+unbreathableness
+unbreathed
+unbreathing
+unbred
+unbreech
+unbreeched
+unbreezy
+unbrent
+unbrewed
+unbribable
+unbribableness
+unbribably
+unbribed
+unbribing
+unbrick
+unbridegroomlike
+unbridgeable
+unbridged
+unbridle
+unbridled
+unbridledly
+unbridledness
+unbridling
+unbrief
+unbriefed
+unbriefly
+unbright
+unbrightened
+unbrilliant
+unbrimming
+unbrined
+unbrittle
+unbroached
+unbroad
+unbroadcasted
+unbroidered
+unbroiled
+unbroke
+unbroken
+unbrokenly
+unbrokenness
+unbronzed
+unbrooch
+unbrooded
+unbrookable
+unbrookably
+unbrothered
+unbrotherlike
+unbrotherliness
+unbrotherly
+unbrought
+unbrown
+unbrowned
+unbruised
+unbrushed
+unbrutalize
+unbrutalized
+unbrute
+unbrutelike
+unbrutify
+unbrutize
+unbuckle
+unbuckramed
+unbud
+unbudded
+unbudgeability
+unbudgeable
+unbudgeableness
+unbudgeably
+unbudged
+unbudgeted
+unbudging
+unbuffed
+unbuffered
+unbuffeted
+unbuild
+unbuilded
+unbuilt
+unbulky
+unbulled
+unbulletined
+unbumped
+unbumptious
+unbunched
+unbundle
+unbundled
+unbung
+unbungling
+unbuoyant
+unbuoyed
+unburden
+unburdened
+unburdenment
+unburdensome
+unburdensomeness
+unburgessed
+unburiable
+unburial
+unburied
+unburlesqued
+unburly
+unburn
+unburnable
+unburned
+unburning
+unburnished
+unburnt
+unburrow
+unburrowed
+unburst
+unburstable
+unburstableness
+unburthen
+unbury
+unbush
+unbusied
+unbusily
+unbusiness
+unbusinesslike
+unbusk
+unbuskin
+unbuskined
+unbustling
+unbusy
+unbutchered
+unbutcherlike
+unbuttered
+unbutton
+unbuttoned
+unbuttonment
+unbuttressed
+unbuxom
+unbuxomly
+unbuxomness
+unbuyable
+unbuyableness
+unbuying
+unca
+uncabined
+uncabled
+uncadenced
+uncage
+uncaged
+uncake
+uncalcareous
+uncalcified
+uncalcined
+uncalculable
+uncalculableness
+uncalculably
+uncalculated
+uncalculating
+uncalculatingly
+uncalendered
+uncalk
+uncalked
+uncall
+uncalled
+uncallow
+uncallower
+uncalm
+uncalmed
+uncalmly
+uncalumniated
+uncambered
+uncamerated
+uncamouflaged
+uncanceled
+uncancellable
+uncancelled
+uncandid
+uncandidly
+uncandidness
+uncandied
+uncandor
+uncaned
+uncankered
+uncanned
+uncannily
+uncanniness
+uncanny
+uncanonic
+uncanonical
+uncanonically
+uncanonicalness
+uncanonize
+uncanonized
+uncanopied
+uncantoned
+uncantonized
+uncanvassably
+uncanvassed
+uncap
+uncapable
+uncapableness
+uncapably
+uncapacious
+uncapacitate
+uncaparisoned
+uncapitalized
+uncapped
+uncapper
+uncapsizable
+uncapsized
+uncaptained
+uncaptioned
+uncaptious
+uncaptiously
+uncaptivate
+uncaptivated
+uncaptivating
+uncaptived
+uncapturable
+uncaptured
+uncarbonated
+uncarboned
+uncarbureted
+uncarded
+uncardinal
+uncardinally
+uncareful
+uncarefully
+uncarefulness
+uncaressed
+uncargoed
+Uncaria
+uncaricatured
+uncaring
+uncarnate
+uncarnivorous
+uncaroled
+uncarpentered
+uncarpeted
+uncarriageable
+uncarried
+uncart
+uncarted
+uncartooned
+uncarved
+uncase
+uncased
+uncasemated
+uncask
+uncasked
+uncasketed
+uncasque
+uncassock
+uncast
+uncaste
+uncastigated
+uncastle
+uncastled
+uncastrated
+uncasual
+uncatalogued
+uncatchable
+uncate
+uncatechised
+uncatechisedness
+uncatechized
+uncatechizedness
+uncategorized
+uncathedraled
+uncatholcity
+uncatholic
+uncatholical
+uncatholicalness
+uncatholicize
+uncatholicly
+uncaucusable
+uncaught
+uncausatively
+uncaused
+uncauterized
+uncautious
+uncautiously
+uncautiousness
+uncavalier
+uncavalierly
+uncave
+unceasable
+unceased
+unceasing
+unceasingly
+unceasingness
+unceded
+unceiled
+unceilinged
+uncelebrated
+uncelebrating
+uncelestial
+uncelestialized
+uncellar
+uncement
+uncemented
+uncementing
+uncensorable
+uncensored
+uncensorious
+uncensoriously
+uncensoriousness
+uncensurable
+uncensured
+uncensuring
+uncenter
+uncentered
+uncentral
+uncentrality
+uncentrally
+uncentred
+uncentury
+uncereclothed
+unceremented
+unceremonial
+unceremonious
+unceremoniously
+unceremoniousness
+uncertain
+uncertainly
+uncertainness
+uncertainty
+uncertifiable
+uncertifiableness
+uncertificated
+uncertified
+uncertifying
+uncertitude
+uncessant
+uncessantly
+uncessantness
+unchafed
+unchain
+unchainable
+unchained
+unchair
+unchaired
+unchalked
+unchallengeable
+unchallengeableness
+unchallengeably
+unchallenged
+unchallenging
+unchambered
+unchamfered
+unchampioned
+unchance
+unchancellor
+unchancy
+unchange
+unchangeability
+unchangeable
+unchangeableness
+unchangeably
+unchanged
+unchangedness
+unchangeful
+unchangefulness
+unchanging
+unchangingly
+unchangingness
+unchanneled
+unchannelled
+unchanted
+unchaperoned
+unchaplain
+unchapleted
+unchapter
+unchaptered
+uncharacter
+uncharactered
+uncharacteristic
+uncharacteristically
+uncharacterized
+uncharge
+unchargeable
+uncharged
+uncharging
+uncharily
+unchariness
+unchariot
+uncharitable
+uncharitableness
+uncharitably
+uncharity
+uncharm
+uncharmable
+uncharmed
+uncharming
+uncharnel
+uncharred
+uncharted
+unchartered
+unchary
+unchased
+unchaste
+unchastely
+unchastened
+unchasteness
+unchastisable
+unchastised
+unchastising
+unchastity
+unchatteled
+unchauffeured
+unchawed
+uncheat
+uncheated
+uncheating
+uncheck
+uncheckable
+unchecked
+uncheckered
+uncheerable
+uncheered
+uncheerful
+uncheerfully
+uncheerfulness
+uncheerily
+uncheeriness
+uncheering
+uncheery
+unchemical
+unchemically
+uncherished
+uncherishing
+unchested
+unchevroned
+unchewable
+unchewableness
+unchewed
+unchid
+unchidden
+unchided
+unchiding
+unchidingly
+unchild
+unchildish
+unchildishly
+unchildishness
+unchildlike
+unchilled
+unchiming
+unchinked
+unchipped
+unchiseled
+unchiselled
+unchivalric
+unchivalrous
+unchivalrously
+unchivalrousness
+unchivalry
+unchloridized
+unchoicely
+unchokable
+unchoked
+uncholeric
+unchoosable
+unchopped
+unchoral
+unchorded
+unchosen
+unchrisom
+unchristen
+unchristened
+unchristian
+unchristianity
+unchristianize
+unchristianized
+unchristianlike
+unchristianly
+unchristianness
+unchronicled
+unchronological
+unchronologically
+unchurch
+unchurched
+unchurchlike
+unchurchly
+unchurn
+unci
+uncia
+uncial
+uncialize
+uncially
+uncicatrized
+unciferous
+unciform
+unciliated
+uncinal
+Uncinaria
+uncinariasis
+uncinariatic
+Uncinata
+uncinate
+uncinated
+uncinatum
+uncinch
+uncinct
+uncinctured
+uncini
+Uncinula
+uncinus
+uncipher
+uncircular
+uncircularized
+uncirculated
+uncircumcised
+uncircumcisedness
+uncircumcision
+uncircumlocutory
+uncircumscribable
+uncircumscribed
+uncircumscribedness
+uncircumscript
+uncircumscriptible
+uncircumscription
+uncircumspect
+uncircumspection
+uncircumspectly
+uncircumspectness
+uncircumstanced
+uncircumstantial
+uncirostrate
+uncite
+uncited
+uncitied
+uncitizen
+uncitizenlike
+uncitizenly
+uncity
+uncivic
+uncivil
+uncivilish
+uncivility
+uncivilizable
+uncivilization
+uncivilize
+uncivilized
+uncivilizedly
+uncivilizedness
+uncivilly
+uncivilness
+unclad
+unclaimed
+unclaiming
+unclamorous
+unclamp
+unclamped
+unclarified
+unclarifying
+unclarity
+unclashing
+unclasp
+unclasped
+unclassable
+unclassableness
+unclassably
+unclassed
+unclassible
+unclassical
+unclassically
+unclassifiable
+unclassifiableness
+unclassification
+unclassified
+unclassify
+unclassifying
+unclawed
+unclay
+unclayed
+uncle
+unclead
+unclean
+uncleanable
+uncleaned
+uncleanlily
+uncleanliness
+uncleanly
+uncleanness
+uncleansable
+uncleanse
+uncleansed
+uncleansedness
+unclear
+uncleared
+unclearing
+uncleavable
+uncleave
+uncledom
+uncleft
+unclehood
+unclement
+unclemently
+unclementness
+unclench
+unclergy
+unclergyable
+unclerical
+unclericalize
+unclerically
+unclericalness
+unclerklike
+unclerkly
+uncleship
+unclever
+uncleverly
+uncleverness
+unclew
+unclick
+uncliented
+unclify
+unclimaxed
+unclimb
+unclimbable
+unclimbableness
+unclimbably
+unclimbed
+unclimbing
+unclinch
+uncling
+unclinical
+unclip
+unclipped
+unclipper
+uncloak
+uncloakable
+uncloaked
+unclog
+unclogged
+uncloister
+uncloistered
+uncloistral
+unclosable
+unclose
+unclosed
+uncloseted
+unclothe
+unclothed
+unclothedly
+unclothedness
+unclotted
+uncloud
+unclouded
+uncloudedly
+uncloudedness
+uncloudy
+unclout
+uncloven
+uncloyable
+uncloyed
+uncloying
+unclub
+unclubbable
+unclubby
+unclustered
+unclustering
+unclutch
+unclutchable
+unclutched
+unclutter
+uncluttered
+unco
+uncoach
+uncoachable
+uncoachableness
+uncoached
+uncoacted
+uncoagulable
+uncoagulated
+uncoagulating
+uncoat
+uncoated
+uncoatedness
+uncoaxable
+uncoaxed
+uncoaxing
+uncock
+uncocked
+uncockneyfy
+uncocted
+uncodded
+uncoddled
+uncoded
+uncodified
+uncoerced
+uncoffer
+uncoffin
+uncoffined
+uncoffle
+uncogent
+uncogged
+uncogitable
+uncognizable
+uncognizant
+uncognized
+uncognoscibility
+uncognoscible
+uncoguidism
+uncoherent
+uncoherently
+uncoherentness
+uncohesive
+uncoif
+uncoifed
+uncoil
+uncoiled
+uncoin
+uncoined
+uncoked
+uncoking
+uncollapsed
+uncollapsible
+uncollar
+uncollared
+uncollated
+uncollatedness
+uncollected
+uncollectedly
+uncollectedness
+uncollectible
+uncollectibleness
+uncollectibly
+uncolleged
+uncollegian
+uncollegiate
+uncolloquial
+uncolloquially
+uncolonellike
+uncolonial
+uncolonize
+uncolonized
+uncolorable
+uncolorably
+uncolored
+uncoloredly
+uncoloredness
+uncoloured
+uncolouredly
+uncolouredness
+uncolt
+uncoly
+uncombable
+uncombatable
+uncombated
+uncombed
+uncombinable
+uncombinableness
+uncombinably
+uncombine
+uncombined
+uncombining
+uncombiningness
+uncombustible
+uncome
+uncomelily
+uncomeliness
+uncomely
+uncomfort
+uncomfortable
+uncomfortableness
+uncomfortably
+uncomforted
+uncomforting
+uncomfy
+uncomic
+uncommanded
+uncommandedness
+uncommanderlike
+uncommemorated
+uncommenced
+uncommendable
+uncommendableness
+uncommendably
+uncommended
+uncommensurability
+uncommensurable
+uncommensurableness
+uncommensurate
+uncommented
+uncommenting
+uncommerciable
+uncommercial
+uncommercially
+uncommercialness
+uncommingled
+uncomminuted
+uncommiserated
+uncommiserating
+uncommissioned
+uncommitted
+uncommitting
+uncommixed
+uncommodious
+uncommodiously
+uncommodiousness
+uncommon
+uncommonable
+uncommonly
+uncommonness
+uncommonplace
+uncommunicable
+uncommunicableness
+uncommunicably
+uncommunicated
+uncommunicating
+uncommunicative
+uncommunicatively
+uncommunicativeness
+uncommutable
+uncommutative
+uncommuted
+uncompact
+uncompacted
+Uncompahgre
+uncompahgrite
+uncompaniable
+uncompanied
+uncompanioned
+uncomparable
+uncomparably
+uncompared
+uncompass
+uncompassable
+uncompassed
+uncompassion
+uncompassionate
+uncompassionated
+uncompassionately
+uncompassionateness
+uncompassionating
+uncompassioned
+uncompatible
+uncompatibly
+uncompellable
+uncompelled
+uncompelling
+uncompensable
+uncompensated
+uncompetent
+uncompetitive
+uncompiled
+uncomplacent
+uncomplained
+uncomplaining
+uncomplainingly
+uncomplainingness
+uncomplaint
+uncomplaisance
+uncomplaisant
+uncomplaisantly
+uncomplemental
+uncompletable
+uncomplete
+uncompleted
+uncompletely
+uncompleteness
+uncomplex
+uncompliability
+uncompliable
+uncompliableness
+uncompliance
+uncompliant
+uncomplicated
+uncomplimentary
+uncomplimented
+uncomplimenting
+uncomplying
+uncomposable
+uncomposeable
+uncomposed
+uncompoundable
+uncompounded
+uncompoundedly
+uncompoundedness
+uncompounding
+uncomprehended
+uncomprehending
+uncomprehendingly
+uncomprehendingness
+uncomprehensible
+uncomprehension
+uncomprehensive
+uncomprehensively
+uncomprehensiveness
+uncompressed
+uncompressible
+uncomprised
+uncomprising
+uncomprisingly
+uncompromised
+uncompromising
+uncompromisingly
+uncompromisingness
+uncompulsive
+uncompulsory
+uncomputable
+uncomputableness
+uncomputably
+uncomputed
+uncomraded
+unconcatenated
+unconcatenating
+unconcealable
+unconcealableness
+unconcealably
+unconcealed
+unconcealing
+unconcealingly
+unconcealment
+unconceded
+unconceited
+unconceivable
+unconceivableness
+unconceivably
+unconceived
+unconceiving
+unconcern
+unconcerned
+unconcernedly
+unconcernedness
+unconcerning
+unconcernment
+unconcertable
+unconcerted
+unconcertedly
+unconcertedness
+unconcessible
+unconciliable
+unconciliated
+unconciliatedness
+unconciliating
+unconciliatory
+unconcludable
+unconcluded
+unconcluding
+unconcludingness
+unconclusive
+unconclusively
+unconclusiveness
+unconcocted
+unconcordant
+unconcrete
+unconcreted
+unconcurrent
+unconcurring
+uncondemnable
+uncondemned
+uncondensable
+uncondensableness
+uncondensed
+uncondensing
+uncondescending
+uncondescension
+uncondition
+unconditional
+unconditionality
+unconditionally
+unconditionalness
+unconditionate
+unconditionated
+unconditionately
+unconditioned
+unconditionedly
+unconditionedness
+uncondoled
+uncondoling
+unconducing
+unconducive
+unconduciveness
+unconducted
+unconductive
+unconductiveness
+unconfected
+unconfederated
+unconferred
+unconfess
+unconfessed
+unconfessing
+unconfided
+unconfidence
+unconfident
+unconfidential
+unconfidentialness
+unconfidently
+unconfiding
+unconfinable
+unconfine
+unconfined
+unconfinedly
+unconfinedness
+unconfinement
+unconfining
+unconfirm
+unconfirmative
+unconfirmed
+unconfirming
+unconfiscable
+unconfiscated
+unconflicting
+unconflictingly
+unconflictingness
+unconformability
+unconformable
+unconformableness
+unconformably
+unconformed
+unconformedly
+unconforming
+unconformist
+unconformity
+unconfound
+unconfounded
+unconfoundedly
+unconfrontable
+unconfronted
+unconfusable
+unconfusably
+unconfused
+unconfusedly
+unconfutable
+unconfuted
+unconfuting
+uncongeal
+uncongealable
+uncongealed
+uncongenial
+uncongeniality
+uncongenially
+uncongested
+unconglobated
+unconglomerated
+unconglutinated
+uncongratulate
+uncongratulated
+uncongratulating
+uncongregated
+uncongregational
+uncongressional
+uncongruous
+unconjecturable
+unconjectured
+unconjoined
+unconjugal
+unconjugated
+unconjunctive
+unconjured
+unconnected
+unconnectedly
+unconnectedness
+unconned
+unconnived
+unconniving
+unconquerable
+unconquerableness
+unconquerably
+unconquered
+unconscienced
+unconscient
+unconscientious
+unconscientiously
+unconscientiousness
+unconscionable
+unconscionableness
+unconscionably
+unconscious
+unconsciously
+unconsciousness
+unconsecrate
+unconsecrated
+unconsecratedly
+unconsecratedness
+unconsecration
+unconsecutive
+unconsent
+unconsentaneous
+unconsented
+unconsenting
+unconsequential
+unconsequentially
+unconsequentialness
+unconservable
+unconservative
+unconserved
+unconserving
+unconsiderable
+unconsiderate
+unconsiderately
+unconsiderateness
+unconsidered
+unconsideredly
+unconsideredness
+unconsidering
+unconsideringly
+unconsignable
+unconsigned
+unconsistent
+unconsociable
+unconsociated
+unconsolable
+unconsolably
+unconsolatory
+unconsoled
+unconsolidated
+unconsolidating
+unconsolidation
+unconsoling
+unconsonancy
+unconsonant
+unconsonantly
+unconsonous
+unconspicuous
+unconspicuously
+unconspicuousness
+unconspired
+unconspiring
+unconspiringly
+unconspiringness
+unconstancy
+unconstant
+unconstantly
+unconstantness
+unconstellated
+unconstipated
+unconstituted
+unconstitutional
+unconstitutionalism
+unconstitutionality
+unconstitutionally
+unconstrainable
+unconstrained
+unconstrainedly
+unconstrainedness
+unconstraining
+unconstraint
+unconstricted
+unconstruable
+unconstructed
+unconstructive
+unconstructural
+unconstrued
+unconsular
+unconsult
+unconsultable
+unconsulted
+unconsulting
+unconsumable
+unconsumed
+unconsuming
+unconsummate
+unconsummated
+unconsumptive
+uncontagious
+uncontainable
+uncontainableness
+uncontainably
+uncontained
+uncontaminable
+uncontaminate
+uncontaminated
+uncontemned
+uncontemnedly
+uncontemplated
+uncontemporaneous
+uncontemporary
+uncontemptuous
+uncontended
+uncontending
+uncontent
+uncontentable
+uncontented
+uncontentedly
+uncontentedness
+uncontenting
+uncontentingness
+uncontentious
+uncontentiously
+uncontentiousness
+uncontestable
+uncontestableness
+uncontestably
+uncontested
+uncontestedly
+uncontestedness
+uncontinence
+uncontinent
+uncontinental
+uncontinented
+uncontinently
+uncontinual
+uncontinued
+uncontinuous
+uncontorted
+uncontract
+uncontracted
+uncontractedness
+uncontractile
+uncontradictable
+uncontradictableness
+uncontradictably
+uncontradicted
+uncontradictedly
+uncontradictious
+uncontradictory
+uncontrastable
+uncontrasted
+uncontrasting
+uncontributed
+uncontributing
+uncontributory
+uncontrite
+uncontrived
+uncontriving
+uncontrol
+uncontrollability
+uncontrollable
+uncontrollableness
+uncontrollably
+uncontrolled
+uncontrolledly
+uncontrolledness
+uncontrolling
+uncontroversial
+uncontroversially
+uncontrovertable
+uncontrovertableness
+uncontrovertably
+uncontroverted
+uncontrovertedly
+uncontrovertible
+uncontrovertibleness
+uncontrovertibly
+unconvenable
+unconvened
+unconvenience
+unconvenient
+unconveniently
+unconventional
+unconventionalism
+unconventionality
+unconventionalize
+unconventionally
+unconventioned
+unconversable
+unconversableness
+unconversably
+unconversant
+unconversational
+unconversion
+unconvert
+unconverted
+unconvertedly
+unconvertedness
+unconvertibility
+unconvertible
+unconveyable
+unconveyed
+unconvicted
+unconvicting
+unconvince
+unconvinced
+unconvincedly
+unconvincedness
+unconvincibility
+unconvincible
+unconvincing
+unconvincingly
+unconvincingness
+unconvoluted
+unconvoyed
+unconvulsed
+uncookable
+uncooked
+uncooled
+uncoop
+uncooped
+uncoopered
+uncooping
+uncope
+uncopiable
+uncopied
+uncopious
+uncopyrighted
+uncoquettish
+uncoquettishly
+uncord
+uncorded
+uncordial
+uncordiality
+uncordially
+uncording
+uncore
+uncored
+uncork
+uncorked
+uncorker
+uncorking
+uncorned
+uncorner
+uncoronated
+uncoroneted
+uncorporal
+uncorpulent
+uncorrect
+uncorrectable
+uncorrected
+uncorrectible
+uncorrectly
+uncorrectness
+uncorrelated
+uncorrespondency
+uncorrespondent
+uncorresponding
+uncorrigible
+uncorrigibleness
+uncorrigibly
+uncorroborated
+uncorroded
+uncorrugated
+uncorrupt
+uncorrupted
+uncorruptedly
+uncorruptedness
+uncorruptibility
+uncorruptible
+uncorruptibleness
+uncorruptibly
+uncorrupting
+uncorruption
+uncorruptive
+uncorruptly
+uncorruptness
+uncorseted
+uncosseted
+uncost
+uncostliness
+uncostly
+uncostumed
+uncottoned
+uncouch
+uncouched
+uncouching
+uncounselable
+uncounseled
+uncounsellable
+uncounselled
+uncountable
+uncountableness
+uncountably
+uncounted
+uncountenanced
+uncounteracted
+uncounterbalanced
+uncounterfeit
+uncounterfeited
+uncountermandable
+uncountermanded
+uncountervailed
+uncountess
+uncountrified
+uncouple
+uncoupled
+uncoupler
+uncourageous
+uncoursed
+uncourted
+uncourteous
+uncourteously
+uncourteousness
+uncourtierlike
+uncourting
+uncourtlike
+uncourtliness
+uncourtly
+uncous
+uncousinly
+uncouth
+uncouthie
+uncouthly
+uncouthness
+uncouthsome
+uncovenant
+uncovenanted
+uncover
+uncoverable
+uncovered
+uncoveredly
+uncoveted
+uncoveting
+uncovetingly
+uncovetous
+uncowed
+uncowl
+uncoy
+uncracked
+uncradled
+uncraftily
+uncraftiness
+uncrafty
+uncram
+uncramp
+uncramped
+uncrampedness
+uncranked
+uncrannied
+uncrated
+uncravatted
+uncraven
+uncraving
+uncravingly
+uncrazed
+uncream
+uncreased
+uncreatability
+uncreatable
+uncreatableness
+uncreate
+uncreated
+uncreatedness
+uncreating
+uncreation
+uncreative
+uncreativeness
+uncreaturely
+uncredentialed
+uncredentialled
+uncredibility
+uncredible
+uncredibly
+uncreditable
+uncreditableness
+uncreditably
+uncredited
+uncrediting
+uncredulous
+uncreeping
+uncreosoted
+uncrest
+uncrested
+uncrevassed
+uncrib
+uncried
+uncrime
+uncriminal
+uncriminally
+uncrinkle
+uncrinkled
+uncrinkling
+uncrippled
+uncrisp
+uncritical
+uncritically
+uncriticisable
+uncriticised
+uncriticising
+uncriticisingly
+uncriticism
+uncriticizable
+uncriticized
+uncriticizing
+uncriticizingly
+uncrochety
+uncrook
+uncrooked
+uncrooking
+uncropped
+uncropt
+uncross
+uncrossable
+uncrossableness
+uncrossed
+uncrossexaminable
+uncrossexamined
+uncrossly
+uncrowded
+uncrown
+uncrowned
+uncrowning
+uncrucified
+uncrudded
+uncrude
+uncruel
+uncrumbled
+uncrumple
+uncrumpling
+uncrushable
+uncrushed
+uncrusted
+uncrying
+uncrystaled
+uncrystalled
+uncrystalline
+uncrystallizability
+uncrystallizable
+uncrystallized
+unction
+unctional
+unctioneer
+unctionless
+unctious
+unctiousness
+unctorium
+unctuose
+unctuosity
+unctuous
+unctuously
+unctuousness
+uncubbed
+uncubic
+uncuckold
+uncuckolded
+uncudgelled
+uncuffed
+uncular
+unculled
+uncultivability
+uncultivable
+uncultivate
+uncultivated
+uncultivation
+unculturable
+unculture
+uncultured
+uncumber
+uncumbered
+uncumbrous
+uncunning
+uncunningly
+uncunningness
+uncupped
+uncurable
+uncurableness
+uncurably
+uncurb
+uncurbable
+uncurbed
+uncurbedly
+uncurbing
+uncurd
+uncurdled
+uncurdling
+uncured
+uncurious
+uncuriously
+uncurl
+uncurled
+uncurling
+uncurrent
+uncurrently
+uncurrentness
+uncurricularized
+uncurried
+uncurse
+uncursed
+uncursing
+uncurst
+uncurtailed
+uncurtain
+uncurtained
+uncus
+uncushioned
+uncusped
+uncustomable
+uncustomarily
+uncustomariness
+uncustomary
+uncustomed
+uncut
+uncuth
+uncuticulate
+uncuttable
+uncynical
+uncynically
+uncypress
+undabbled
+undaggled
+undaily
+undaintiness
+undainty
+undallying
+undam
+undamageable
+undamaged
+undamaging
+undamasked
+undammed
+undamming
+undamn
+undamped
+undancing
+undandiacal
+undandled
+undangered
+undangerous
+undangerousness
+undared
+undaring
+undark
+undarken
+undarkened
+undarned
+undashed
+undatable
+undate
+undateable
+undated
+undatedness
+undaub
+undaubed
+undaughter
+undaughterliness
+undaughterly
+undauntable
+undaunted
+undauntedly
+undauntedness
+undaunting
+undawned
+undawning
+undazed
+undazing
+undazzle
+undazzled
+undazzling
+unde
+undead
+undeadened
+undeaf
+undealable
+undealt
+undean
+undear
+undebarred
+undebased
+undebatable
+undebated
+undebating
+undebauched
+undebilitated
+undebilitating
+undecagon
+undecanaphthene
+undecane
+undecatoic
+undecayable
+undecayableness
+undecayed
+undecayedness
+undecaying
+undeceased
+undeceitful
+undeceivable
+undeceivableness
+undeceivably
+undeceive
+undeceived
+undeceiver
+undeceiving
+undecency
+undecennary
+undecennial
+undecent
+undecently
+undeception
+undeceptious
+undeceptitious
+undeceptive
+undecidable
+undecide
+undecided
+undecidedly
+undecidedness
+undeciding
+undecimal
+undeciman
+undecimole
+undecipher
+undecipherability
+undecipherable
+undecipherably
+undeciphered
+undecision
+undecisive
+undecisively
+undecisiveness
+undeck
+undecked
+undeclaimed
+undeclaiming
+undeclamatory
+undeclarable
+undeclare
+undeclared
+undeclinable
+undeclinableness
+undeclinably
+undeclined
+undeclining
+undecocted
+undecoic
+undecolic
+undecomposable
+undecomposed
+undecompounded
+undecorated
+undecorative
+undecorous
+undecorously
+undecorousness
+undecorticated
+undecoyed
+undecreased
+undecreasing
+undecree
+undecreed
+undecried
+undecyl
+undecylenic
+undecylic
+undedicate
+undedicated
+undeducible
+undeducted
+undeeded
+undeemed
+undeemous
+undeemously
+undeep
+undefaceable
+undefaced
+undefalcated
+undefamed
+undefaming
+undefatigable
+undefaulted
+undefaulting
+undefeasible
+undefeat
+undefeatable
+undefeated
+undefeatedly
+undefeatedness
+undefecated
+undefectible
+undefective
+undefectiveness
+undefendable
+undefendableness
+undefendably
+undefended
+undefending
+undefense
+undefensed
+undefensible
+undeferential
+undeferentially
+undeferred
+undefiant
+undeficient
+undefied
+undefilable
+undefiled
+undefiledly
+undefiledness
+undefinable
+undefinableness
+undefinably
+undefine
+undefined
+undefinedly
+undefinedness
+undeflected
+undeflowered
+undeformed
+undeformedness
+undefrauded
+undefrayed
+undeft
+undegeneracy
+undegenerate
+undegenerated
+undegenerating
+undegraded
+undegrading
+undeification
+undeified
+undeify
+undeistical
+undejected
+undelated
+undelayable
+undelayed
+undelayedly
+undelaying
+undelayingly
+undelectable
+undelectably
+undelegated
+undeleted
+undeliberate
+undeliberated
+undeliberately
+undeliberateness
+undeliberating
+undeliberatingly
+undeliberative
+undeliberativeness
+undelible
+undelicious
+undelight
+undelighted
+undelightful
+undelightfully
+undelightfulness
+undelighting
+undelightsome
+undelimited
+undelineated
+undeliverable
+undeliverableness
+undelivered
+undelivery
+undeludable
+undelude
+undeluded
+undeluding
+undeluged
+undelusive
+undelusively
+undelve
+undelved
+undelylene
+undemagnetizable
+undemanded
+undemised
+undemocratic
+undemocratically
+undemocratize
+undemolishable
+undemolished
+undemonstrable
+undemonstrably
+undemonstratable
+undemonstrated
+undemonstrative
+undemonstratively
+undemonstrativeness
+undemure
+undemurring
+unden
+undeniable
+undeniableness
+undeniably
+undenied
+undeniedly
+undenizened
+undenominated
+undenominational
+undenominationalism
+undenominationalist
+undenominationalize
+undenominationally
+undenoted
+undenounced
+undenuded
+undepartableness
+undepartably
+undeparted
+undeparting
+undependable
+undependableness
+undependably
+undependent
+undepending
+undephlegmated
+undepicted
+undepleted
+undeplored
+undeported
+undeposable
+undeposed
+undeposited
+undepraved
+undepravedness
+undeprecated
+undepreciated
+undepressed
+undepressible
+undepressing
+undeprivable
+undeprived
+undepurated
+undeputed
+under
+underabyss
+underaccident
+underaccommodated
+underact
+underacted
+underacting
+underaction
+underactor
+underadjustment
+underadmiral
+underadventurer
+underage
+underagency
+underagent
+underagitation
+underaid
+underaim
+underair
+underalderman
+underanged
+underarch
+underargue
+underarm
+underaverage
+underback
+underbailiff
+underbake
+underbalance
+underballast
+underbank
+underbarber
+underbarring
+underbasal
+underbeadle
+underbeak
+underbeam
+underbear
+underbearer
+underbearing
+underbeat
+underbeaten
+underbed
+underbelly
+underbeveling
+underbid
+underbidder
+underbill
+underbillow
+underbishop
+underbishopric
+underbit
+underbite
+underbitted
+underbitten
+underboard
+underboated
+underbodice
+underbody
+underboil
+underboom
+underborn
+underborne
+underbottom
+underbough
+underbought
+underbound
+underbowed
+underbowser
+underbox
+underboy
+underbrace
+underbraced
+underbranch
+underbreath
+underbreathing
+underbred
+underbreeding
+underbrew
+underbridge
+underbrigadier
+underbright
+underbrim
+underbrush
+underbubble
+underbud
+underbuild
+underbuilder
+underbuilding
+underbuoy
+underburn
+underburned
+underburnt
+underbursar
+underbury
+underbush
+underbutler
+underbuy
+undercanopy
+undercanvass
+undercap
+undercapitaled
+undercapitalization
+undercapitalize
+undercaptain
+undercarder
+undercarriage
+undercarry
+undercarter
+undercarve
+undercarved
+undercase
+undercasing
+undercast
+undercause
+underceiling
+undercellar
+undercellarer
+underchamber
+underchamberlain
+underchancellor
+underchanter
+underchap
+undercharge
+undercharged
+underchief
+underchime
+underchin
+underchord
+underchurched
+undercircle
+undercitizen
+underclad
+underclass
+underclassman
+underclay
+underclearer
+underclerk
+underclerkship
+undercliff
+underclift
+undercloak
+undercloth
+underclothe
+underclothed
+underclothes
+underclothing
+underclub
+underclutch
+undercoachman
+undercoat
+undercoated
+undercoater
+undercoating
+undercollector
+undercolor
+undercolored
+undercoloring
+undercommander
+undercomment
+undercompounded
+underconcerned
+undercondition
+underconsciousness
+underconstable
+underconsume
+underconsumption
+undercook
+undercool
+undercooper
+undercorrect
+undercountenance
+undercourse
+undercourtier
+undercover
+undercovering
+undercovert
+undercrawl
+undercreep
+undercrest
+undercrier
+undercroft
+undercrop
+undercrust
+undercry
+undercrypt
+undercup
+undercurl
+undercurrent
+undercurve
+undercut
+undercutter
+undercutting
+underdauber
+underdeacon
+underdead
+underdebauchee
+underdeck
+underdepth
+underdevelop
+underdevelopment
+underdevil
+underdialogue
+underdig
+underdip
+underdish
+underdistinction
+underdistributor
+underditch
+underdive
+underdo
+underdoctor
+underdoer
+underdog
+underdoing
+underdone
+underdose
+underdot
+underdown
+underdraft
+underdrag
+underdrain
+underdrainage
+underdrainer
+underdraught
+underdraw
+underdrawers
+underdrawn
+underdress
+underdressed
+underdrift
+underdrive
+underdriven
+underdrudgery
+underdrumming
+underdry
+underdunged
+underearth
+undereat
+undereaten
+underedge
+undereducated
+underemployment
+underengraver
+underenter
+underer
+underescheator
+underestimate
+underestimation
+underexcited
+underexercise
+underexpose
+underexposure
+undereye
+underface
+underfaction
+underfactor
+underfaculty
+underfalconer
+underfall
+underfarmer
+underfeathering
+underfeature
+underfed
+underfeed
+underfeeder
+underfeeling
+underfeet
+underfellow
+underfiend
+underfill
+underfilling
+underfinance
+underfind
+underfire
+underfitting
+underflame
+underflannel
+underfleece
+underflood
+underfloor
+underflooring
+underflow
+underfold
+underfolded
+underfong
+underfoot
+underfootage
+underfootman
+underforebody
+underform
+underfortify
+underframe
+underframework
+underframing
+underfreight
+underfrequency
+underfringe
+underfrock
+underfur
+underfurnish
+underfurnisher
+underfurrow
+undergabble
+undergamekeeper
+undergaoler
+undergarb
+undergardener
+undergarment
+undergarnish
+undergauge
+undergear
+undergeneral
+undergentleman
+undergird
+undergirder
+undergirding
+undergirdle
+undergirth
+underglaze
+undergloom
+underglow
+undergnaw
+undergo
+undergod
+undergoer
+undergoing
+undergore
+undergoverness
+undergovernment
+undergovernor
+undergown
+undergrad
+undergrade
+undergraduate
+undergraduatedom
+undergraduateness
+undergraduateship
+undergraduatish
+undergraduette
+undergraining
+undergrass
+undergreen
+undergrieve
+undergroan
+underground
+undergrounder
+undergroundling
+undergrove
+undergrow
+undergrowl
+undergrown
+undergrowth
+undergrub
+underguard
+underguardian
+undergunner
+underhabit
+underhammer
+underhand
+underhanded
+underhandedly
+underhandedness
+underhang
+underhanging
+underhangman
+underhatch
+underhead
+underheat
+underheaven
+underhelp
+underhew
+underhid
+underhill
+underhint
+underhistory
+underhive
+underhold
+underhole
+underhonest
+underhorse
+underhorsed
+underhousemaid
+underhum
+underhung
+underided
+underinstrument
+underisive
+underissue
+underivable
+underivative
+underived
+underivedly
+underivedness
+underjacket
+underjailer
+underjanitor
+underjaw
+underjawed
+underjobbing
+underjudge
+underjungle
+underkeel
+underkeeper
+underkind
+underking
+underkingdom
+underlaborer
+underlaid
+underlain
+underland
+underlanguaged
+underlap
+underlapper
+underlash
+underlaundress
+underlawyer
+underlay
+underlayer
+underlaying
+underleaf
+underlease
+underleather
+underlegate
+underlessee
+underlet
+underletter
+underlevel
+underlever
+underlid
+underlie
+underlier
+underlieutenant
+underlife
+underlift
+underlight
+underliking
+underlimbed
+underlimit
+underline
+underlineation
+underlineman
+underlinement
+underlinen
+underliner
+underling
+underlining
+underlip
+underlive
+underload
+underlock
+underlodging
+underloft
+underlook
+underlooker
+underlout
+underlunged
+underly
+underlye
+underlying
+undermade
+undermaid
+undermaker
+underman
+undermanager
+undermanned
+undermanning
+undermark
+undermarshal
+undermarshalman
+undermasted
+undermaster
+undermatch
+undermatched
+undermate
+undermath
+undermeal
+undermeaning
+undermeasure
+undermediator
+undermelody
+undermentioned
+undermiller
+undermimic
+underminable
+undermine
+underminer
+undermining
+underminingly
+underminister
+underministry
+undermist
+undermoated
+undermoney
+undermoral
+undermost
+undermotion
+undermount
+undermountain
+undermusic
+undermuslin
+undern
+undername
+undernatural
+underneath
+underness
+underniceness
+undernote
+undernoted
+undernourish
+undernourished
+undernourishment
+undernsong
+underntide
+underntime
+undernurse
+undernutrition
+underoccupied
+underofficer
+underofficered
+underofficial
+underogating
+underogatory
+underopinion
+underorb
+underorganization
+underorseman
+underoverlooker
+underoxidize
+underpacking
+underpaid
+underpain
+underpainting
+underpan
+underpants
+underparticipation
+underpartner
+underpass
+underpassion
+underpay
+underpayment
+underpeep
+underpeer
+underpen
+underpeopled
+underpetticoat
+underpetticoated
+underpick
+underpier
+underpilaster
+underpile
+underpin
+underpinner
+underpinning
+underpitch
+underpitched
+underplain
+underplan
+underplant
+underplate
+underplay
+underplot
+underplotter
+underply
+underpoint
+underpole
+underpopulate
+underpopulation
+underporch
+underporter
+underpose
+underpossessor
+underpot
+underpower
+underpraise
+underprefect
+underprentice
+underpresence
+underpresser
+underpressure
+underprice
+underpriest
+underprincipal
+underprint
+underprior
+underprivileged
+underprize
+underproduce
+underproduction
+underproductive
+underproficient
+underprompt
+underprompter
+underproof
+underprop
+underproportion
+underproportioned
+underproposition
+underpropped
+underpropper
+underpropping
+underprospect
+underpry
+underpuke
+underqualified
+underqueen
+underquote
+underranger
+underrate
+underratement
+underrating
+underreach
+underread
+underreader
+underrealize
+underrealm
+underream
+underreamer
+underreceiver
+underreckon
+underrecompense
+underregion
+underregistration
+underrent
+underrented
+underrenting
+underrepresent
+underrepresentation
+underrespected
+underriddle
+underriding
+underrigged
+underring
+underripe
+underripened
+underriver
+underroarer
+underroast
+underrobe
+underrogue
+underroll
+underroller
+underroof
+underroom
+underroot
+underrooted
+underrower
+underrule
+underruler
+underrun
+underrunning
+undersacristan
+undersailed
+undersally
+undersap
+undersatisfaction
+undersaturate
+undersaturation
+undersavior
+undersaw
+undersawyer
+underscale
+underscheme
+underschool
+underscoop
+underscore
+underscribe
+underscript
+underscrub
+underscrupulous
+undersea
+underseam
+underseaman
+undersearch
+underseas
+underseated
+undersecretary
+undersecretaryship
+undersect
+undersee
+underseeded
+underseedman
+undersell
+underseller
+underselling
+undersense
+undersequence
+underservant
+underserve
+underservice
+underset
+undersetter
+undersetting
+undersettle
+undersettler
+undersettling
+undersexton
+undershapen
+undersharp
+undersheathing
+undershepherd
+undersheriff
+undersheriffry
+undersheriffship
+undersheriffwick
+undershield
+undershine
+undershining
+undershire
+undershirt
+undershoe
+undershoot
+undershore
+undershorten
+undershot
+undershrievalty
+undershrieve
+undershrievery
+undershrub
+undershrubbiness
+undershrubby
+undershunter
+undershut
+underside
+undersight
+undersighted
+undersign
+undersignalman
+undersigner
+undersill
+undersinging
+undersitter
+undersize
+undersized
+underskin
+underskirt
+undersky
+undersleep
+undersleeve
+underslip
+underslope
+undersluice
+underslung
+undersneer
+undersociety
+undersoil
+undersole
+undersomething
+undersong
+undersorcerer
+undersort
+undersoul
+undersound
+undersovereign
+undersow
+underspar
+undersparred
+underspecies
+underspecified
+underspend
+undersphere
+underspin
+underspinner
+undersplice
+underspore
+underspread
+underspring
+undersprout
+underspurleather
+undersquare
+understaff
+understage
+understain
+understairs
+understamp
+understand
+understandability
+understandable
+understandableness
+understandably
+understander
+understanding
+understandingly
+understandingness
+understate
+understatement
+understay
+understeer
+understem
+understep
+understeward
+understewardship
+understimulus
+understock
+understocking
+understood
+understory
+understrain
+understrap
+understrapper
+understrapping
+understratum
+understream
+understress
+understrew
+understride
+understriding
+understrife
+understrike
+understring
+understroke
+understrung
+understudy
+understuff
+understuffing
+undersuck
+undersuggestion
+undersuit
+undersupply
+undersupport
+undersurface
+underswain
+underswamp
+undersward
+underswearer
+undersweat
+undersweep
+underswell
+undertakable
+undertake
+undertakement
+undertaker
+undertakerish
+undertakerlike
+undertakerly
+undertakery
+undertaking
+undertakingly
+undertalk
+undertapster
+undertaxed
+underteacher
+underteamed
+underteller
+undertenancy
+undertenant
+undertenter
+undertenure
+underterrestrial
+undertest
+underthane
+underthaw
+underthief
+underthing
+underthink
+underthirst
+underthought
+underthroating
+underthrob
+underthrust
+undertide
+undertided
+undertie
+undertime
+undertimed
+undertint
+undertitle
+undertone
+undertoned
+undertook
+undertow
+undertrader
+undertrained
+undertread
+undertreasurer
+undertreat
+undertribe
+undertrick
+undertrodden
+undertruck
+undertrump
+undertruss
+undertub
+undertune
+undertunic
+underturf
+underturn
+underturnkey
+undertutor
+undertwig
+undertype
+undertyrant
+underusher
+undervaluation
+undervalue
+undervaluement
+undervaluer
+undervaluing
+undervaluinglike
+undervaluingly
+undervalve
+undervassal
+undervaulted
+undervaulting
+undervegetation
+underventilation
+underverse
+undervest
+undervicar
+underviewer
+undervillain
+undervinedresser
+undervitalized
+undervocabularied
+undervoice
+undervoltage
+underwage
+underwaist
+underwaistcoat
+underwalk
+underward
+underwarden
+underwarmth
+underwarp
+underwash
+underwatch
+underwatcher
+underwater
+underwave
+underway
+underweapon
+underwear
+underweft
+underweigh
+underweight
+underweighted
+underwent
+underwheel
+underwhistle
+underwind
+underwing
+underwit
+underwitch
+underwitted
+underwood
+underwooded
+underwork
+underworker
+underworking
+underworkman
+underworld
+underwrap
+underwrite
+underwriter
+underwriting
+underwrought
+underyield
+underyoke
+underzeal
+underzealot
+undescendable
+undescended
+undescendible
+undescribable
+undescribably
+undescribed
+undescried
+undescript
+undescriptive
+undescrying
+undesert
+undeserted
+undeserting
+undeserve
+undeserved
+undeservedly
+undeservedness
+undeserver
+undeserving
+undeservingly
+undeservingness
+undesign
+undesignated
+undesigned
+undesignedly
+undesignedness
+undesigning
+undesigningly
+undesigningness
+undesirability
+undesirable
+undesirableness
+undesirably
+undesire
+undesired
+undesiredly
+undesiring
+undesirous
+undesirously
+undesirousness
+undesisting
+undespaired
+undespairing
+undespairingly
+undespatched
+undespised
+undespising
+undespoiled
+undespondent
+undespondently
+undesponding
+undespotic
+undestined
+undestroyable
+undestroyed
+undestructible
+undestructive
+undetachable
+undetached
+undetailed
+undetainable
+undetained
+undetectable
+undetected
+undetectible
+undeteriorated
+undeteriorating
+undeterminable
+undeterminate
+undetermination
+undetermined
+undetermining
+undeterred
+undeterring
+undetested
+undetesting
+undethronable
+undethroned
+undetracting
+undetractingly
+undetrimental
+undevelopable
+undeveloped
+undeveloping
+undeviated
+undeviating
+undeviatingly
+undevil
+undevious
+undeviously
+undevisable
+undevised
+undevoted
+undevotion
+undevotional
+undevoured
+undevout
+undevoutly
+undevoutness
+undewed
+undewy
+undexterous
+undexterously
+undextrous
+undextrously
+undiademed
+undiagnosable
+undiagnosed
+undialed
+undialyzed
+undiametric
+undiamonded
+undiapered
+undiaphanous
+undiatonic
+undichotomous
+undictated
+undid
+undidactic
+undies
+undieted
+undifferenced
+undifferent
+undifferential
+undifferentiated
+undifficult
+undiffident
+undiffracted
+undiffused
+undiffusible
+undiffusive
+undig
+undigenous
+undigest
+undigestable
+undigested
+undigestible
+undigesting
+undigestion
+undigged
+undight
+undighted
+undigitated
+undignified
+undignifiedly
+undignifiedness
+undignify
+undiked
+undilapidated
+undilatable
+undilated
+undilatory
+undiligent
+undiligently
+undilute
+undiluted
+undilution
+undiluvial
+undim
+undimensioned
+undimerous
+undimidiate
+undiminishable
+undiminishableness
+undiminishably
+undiminished
+undiminishing
+undiminutive
+undimmed
+undimpled
+Undine
+undine
+undined
+undinted
+undiocesed
+undiphthongize
+undiplomaed
+undiplomatic
+undipped
+undirect
+undirected
+undirectional
+undirectly
+undirectness
+undirk
+undisabled
+undisadvantageous
+undisagreeable
+undisappearing
+undisappointable
+undisappointed
+undisappointing
+undisarmed
+undisastrous
+undisbanded
+undisbarred
+undisburdened
+undisbursed
+undiscardable
+undiscarded
+undiscerned
+undiscernedly
+undiscernible
+undiscernibleness
+undiscernibly
+undiscerning
+undiscerningly
+undischargeable
+undischarged
+undiscipled
+undisciplinable
+undiscipline
+undisciplined
+undisciplinedness
+undisclaimed
+undisclosed
+undiscolored
+undiscomfitable
+undiscomfited
+undiscomposed
+undisconcerted
+undisconnected
+undiscontinued
+undiscordant
+undiscording
+undiscounted
+undiscourageable
+undiscouraged
+undiscouraging
+undiscoursed
+undiscoverable
+undiscoverableness
+undiscoverably
+undiscovered
+undiscreditable
+undiscredited
+undiscreet
+undiscreetly
+undiscreetness
+undiscretion
+undiscriminated
+undiscriminating
+undiscriminatingly
+undiscriminatingness
+undiscriminative
+undiscursive
+undiscussable
+undiscussed
+undisdained
+undisdaining
+undiseased
+undisestablished
+undisfigured
+undisfranchised
+undisfulfilled
+undisgorged
+undisgraced
+undisguisable
+undisguise
+undisguised
+undisguisedly
+undisguisedness
+undisgusted
+undisheartened
+undished
+undisheveled
+undishonored
+undisillusioned
+undisinfected
+undisinheritable
+undisinherited
+undisintegrated
+undisinterested
+undisjoined
+undisjointed
+undisliked
+undislocated
+undislodgeable
+undislodged
+undismantled
+undismay
+undismayable
+undismayed
+undismayedly
+undismembered
+undismissed
+undismounted
+undisobedient
+undisobeyed
+undisobliging
+undisordered
+undisorderly
+undisorganized
+undisowned
+undisowning
+undisparaged
+undisparity
+undispassionate
+undispatchable
+undispatched
+undispatching
+undispellable
+undispelled
+undispensable
+undispensed
+undispensing
+undispersed
+undispersing
+undisplaced
+undisplanted
+undisplay
+undisplayable
+undisplayed
+undisplaying
+undispleased
+undispose
+undisposed
+undisposedness
+undisprivacied
+undisprovable
+undisproved
+undisproving
+undisputable
+undisputableness
+undisputably
+undisputatious
+undisputatiously
+undisputed
+undisputedly
+undisputedness
+undisputing
+undisqualifiable
+undisqualified
+undisquieted
+undisreputable
+undisrobed
+undisrupted
+undissected
+undissembled
+undissembledness
+undissembling
+undissemblingly
+undisseminated
+undissenting
+undissevered
+undissimulated
+undissipated
+undissociated
+undissoluble
+undissolute
+undissolvable
+undissolved
+undissolving
+undissonant
+undissuadable
+undissuadably
+undissuade
+undistanced
+undistant
+undistantly
+undistasted
+undistasteful
+undistempered
+undistend
+undistended
+undistilled
+undistinct
+undistinctive
+undistinctly
+undistinctness
+undistinguish
+undistinguishable
+undistinguishableness
+undistinguishably
+undistinguished
+undistinguishing
+undistinguishingly
+undistorted
+undistorting
+undistracted
+undistractedly
+undistractedness
+undistracting
+undistractingly
+undistrained
+undistraught
+undistress
+undistressed
+undistributed
+undistrusted
+undistrustful
+undisturbable
+undisturbance
+undisturbed
+undisturbedly
+undisturbedness
+undisturbing
+undisturbingly
+unditched
+undithyrambic
+undittoed
+undiuretic
+undiurnal
+undivable
+undivergent
+undiverging
+undiverse
+undiversified
+undiverted
+undivertible
+undivertibly
+undiverting
+undivested
+undivestedly
+undividable
+undividableness
+undividably
+undivided
+undividedly
+undividedness
+undividing
+undivinable
+undivined
+undivinelike
+undivinely
+undivining
+undivisible
+undivisive
+undivorceable
+undivorced
+undivorcedness
+undivorcing
+undivulged
+undivulging
+undizened
+undizzied
+undo
+undoable
+undock
+undocked
+undoctor
+undoctored
+undoctrinal
+undoctrined
+undocumentary
+undocumented
+undocumentedness
+undodged
+undoer
+undoffed
+undog
+undogmatic
+undogmatical
+undoing
+undoingness
+undolled
+undolorous
+undomed
+undomestic
+undomesticate
+undomesticated
+undomestication
+undomicilable
+undomiciled
+undominated
+undomineering
+undominical
+undominoed
+undon
+undonated
+undonating
+undone
+undoneness
+undonkey
+undonnish
+undoomed
+undoped
+undormant
+undose
+undosed
+undoting
+undotted
+undouble
+undoubled
+undoubtable
+undoubtableness
+undoubtably
+undoubted
+undoubtedly
+undoubtedness
+undoubtful
+undoubtfully
+undoubtfulness
+undoubting
+undoubtingly
+undoubtingness
+undouched
+undoughty
+undovelike
+undoweled
+undowered
+undowned
+undowny
+undrab
+undraftable
+undrafted
+undrag
+undragoned
+undragooned
+undrainable
+undrained
+undramatic
+undramatical
+undramatically
+undramatizable
+undramatized
+undrape
+undraped
+undraperied
+undraw
+undrawable
+undrawn
+undreaded
+undreadful
+undreadfully
+undreading
+undreamed
+undreaming
+undreamlike
+undreamt
+undreamy
+undredged
+undreggy
+undrenched
+undress
+undressed
+undried
+undrillable
+undrilled
+undrinkable
+undrinkableness
+undrinkably
+undrinking
+undripping
+undrivable
+undrivableness
+undriven
+undronelike
+undrooping
+undropped
+undropsical
+undrossy
+undrowned
+undrubbed
+undrugged
+undrunk
+undrunken
+undry
+undryable
+undrying
+undualize
+undub
+undubbed
+undubitable
+undubitably
+unducal
+unduchess
+undue
+unduelling
+undueness
+undug
+unduke
+undulant
+undular
+undularly
+undulatance
+undulate
+undulated
+undulately
+undulating
+undulatingly
+undulation
+undulationist
+undulative
+undulatory
+undull
+undulled
+undullness
+unduloid
+undulose
+undulous
+unduly
+undumped
+unduncelike
+undunged
+undupable
+unduped
+unduplicability
+unduplicable
+unduplicity
+undurable
+undurableness
+undurably
+undust
+undusted
+unduteous
+undutiable
+undutiful
+undutifully
+undutifulness
+unduty
+undwarfed
+undwelt
+undwindling
+undy
+undye
+undyeable
+undyed
+undying
+undyingly
+undyingness
+uneager
+uneagerly
+uneagerness
+uneagled
+unearly
+unearned
+unearnest
+unearth
+unearthed
+unearthliness
+unearthly
+unease
+uneaseful
+uneasefulness
+uneasily
+uneasiness
+uneastern
+uneasy
+uneatable
+uneatableness
+uneaten
+uneath
+uneating
+unebbed
+unebbing
+unebriate
+uneccentric
+unecclesiastical
+unechoed
+unechoing
+uneclectic
+uneclipsed
+uneconomic
+uneconomical
+uneconomically
+uneconomicalness
+uneconomizing
+unecstatic
+unedge
+unedged
+unedible
+unedibleness
+unedibly
+unedified
+unedifying
+uneditable
+unedited
+uneducable
+uneducableness
+uneducably
+uneducate
+uneducated
+uneducatedly
+uneducatedness
+uneducative
+uneduced
+uneffaceable
+uneffaceably
+uneffaced
+uneffected
+uneffectible
+uneffective
+uneffectless
+uneffectual
+uneffectually
+uneffectualness
+uneffectuated
+uneffeminate
+uneffeminated
+uneffervescent
+uneffete
+unefficacious
+unefficient
+uneffigiated
+uneffused
+uneffusing
+uneffusive
+unegoist
+unegoistical
+unegoistically
+unegregious
+unejaculated
+unejected
+unelaborate
+unelaborated
+unelaborately
+unelaborateness
+unelapsed
+unelastic
+unelasticity
+unelated
+unelating
+unelbowed
+unelderly
+unelect
+unelectable
+unelected
+unelective
+unelectric
+unelectrical
+unelectrified
+unelectrify
+unelectrifying
+unelectrized
+unelectronic
+uneleemosynary
+unelegant
+unelegantly
+unelegantness
+unelemental
+unelementary
+unelevated
+unelicited
+unelided
+unelidible
+uneligibility
+uneligible
+uneligibly
+uneliminated
+unelongated
+uneloped
+uneloping
+uneloquent
+uneloquently
+unelucidated
+unelucidating
+uneluded
+unelusive
+unemaciated
+unemancipable
+unemancipated
+unemasculated
+unembalmed
+unembanked
+unembarrassed
+unembarrassedly
+unembarrassedness
+unembarrassing
+unembarrassment
+unembased
+unembattled
+unembayed
+unembellished
+unembezzled
+unembittered
+unemblazoned
+unembodied
+unembodiment
+unembossed
+unembowelled
+unembowered
+unembraceable
+unembraced
+unembroidered
+unembroiled
+unembryonic
+unemendable
+unemended
+unemerged
+unemerging
+unemigrating
+uneminent
+uneminently
+unemitted
+unemolumentary
+unemolumented
+unemotional
+unemotionalism
+unemotionally
+unemotionalness
+unemotioned
+unempaneled
+unemphatic
+unemphatical
+unemphatically
+unempirical
+unempirically
+unemploy
+unemployability
+unemployable
+unemployableness
+unemployably
+unemployed
+unemployment
+unempoisoned
+unempowered
+unempt
+unemptiable
+unemptied
+unempty
+unemulative
+unemulous
+unemulsified
+unenabled
+unenacted
+unenameled
+unenamored
+unencamped
+unenchafed
+unenchant
+unenchanted
+unencircled
+unenclosed
+unencompassed
+unencored
+unencounterable
+unencountered
+unencouraged
+unencouraging
+unencroached
+unencroaching
+unencumber
+unencumbered
+unencumberedly
+unencumberedness
+unencumbering
+unencysted
+unendable
+unendamaged
+unendangered
+unendeared
+unendeavored
+unended
+unending
+unendingly
+unendingness
+unendorsable
+unendorsed
+unendowed
+unendowing
+unendued
+unendurability
+unendurable
+unendurably
+unendured
+unenduring
+unenduringly
+unenergetic
+unenergized
+unenervated
+unenfeebled
+unenfiladed
+unenforceable
+unenforced
+unenforcedly
+unenforcedness
+unenforcibility
+unenfranchised
+unengaged
+unengaging
+unengendered
+unengineered
+unenglish
+unengraved
+unengraven
+unengrossed
+unenhanced
+unenjoined
+unenjoyable
+unenjoyed
+unenjoying
+unenjoyingly
+unenkindled
+unenlarged
+unenlightened
+unenlightening
+unenlisted
+unenlivened
+unenlivening
+unennobled
+unennobling
+unenounced
+unenquired
+unenquiring
+unenraged
+unenraptured
+unenrichable
+unenrichableness
+unenriched
+unenriching
+unenrobed
+unenrolled
+unenshrined
+unenslave
+unenslaved
+unensnared
+unensouled
+unensured
+unentailed
+unentangle
+unentangleable
+unentangled
+unentanglement
+unentangler
+unenterable
+unentered
+unentering
+unenterprise
+unenterprised
+unenterprising
+unenterprisingly
+unenterprisingness
+unentertainable
+unentertained
+unentertaining
+unentertainingly
+unentertainingness
+unenthralled
+unenthralling
+unenthroned
+unenthusiasm
+unenthusiastic
+unenthusiastically
+unenticed
+unenticing
+unentire
+unentitled
+unentombed
+unentomological
+unentrance
+unentranced
+unentrapped
+unentreated
+unentreating
+unentrenched
+unentwined
+unenumerable
+unenumerated
+unenveloped
+unenvenomed
+unenviable
+unenviably
+unenvied
+unenviedly
+unenvious
+unenviously
+unenvironed
+unenvying
+unenwoven
+unepauleted
+unephemeral
+unepic
+unepicurean
+unepigrammatic
+unepilogued
+unepiscopal
+unepiscopally
+unepistolary
+unepitaphed
+unepithelial
+unepitomized
+unequable
+unequableness
+unequably
+unequal
+unequalable
+unequaled
+unequality
+unequalize
+unequalized
+unequally
+unequalness
+unequated
+unequatorial
+unequestrian
+unequiangular
+unequiaxed
+unequilateral
+unequilibrated
+unequine
+unequipped
+unequitable
+unequitableness
+unequitably
+unequivalent
+unequivalve
+unequivalved
+unequivocal
+unequivocally
+unequivocalness
+uneradicable
+uneradicated
+unerasable
+unerased
+unerasing
+unerect
+unerected
+unermined
+uneroded
+unerrable
+unerrableness
+unerrably
+unerrancy
+unerrant
+unerratic
+unerring
+unerringly
+unerringness
+unerroneous
+unerroneously
+unerudite
+unerupted
+uneruptive
+unescaladed
+unescalloped
+unescapable
+unescapableness
+unescapably
+unescaped
+unescheated
+uneschewable
+uneschewably
+uneschewed
+Unesco
+unescorted
+unescutcheoned
+unesoteric
+unespied
+unespousable
+unespoused
+unessayed
+unessence
+unessential
+unessentially
+unessentialness
+unestablish
+unestablishable
+unestablished
+unestablishment
+unesteemed
+unestimable
+unestimableness
+unestimably
+unestimated
+unestopped
+unestranged
+unetched
+uneternal
+uneternized
+unethereal
+unethic
+unethical
+unethically
+unethicalness
+unethnological
+unethylated
+unetymological
+unetymologizable
+uneucharistical
+uneugenic
+uneulogized
+uneuphemistical
+uneuphonic
+uneuphonious
+uneuphoniously
+uneuphoniousness
+unevacuated
+unevadable
+unevaded
+unevaluated
+unevanescent
+unevangelic
+unevangelical
+unevangelized
+unevaporate
+unevaporated
+unevasive
+uneven
+unevenly
+unevenness
+uneventful
+uneventfully
+uneventfulness
+uneverted
+unevicted
+unevidenced
+unevident
+unevidential
+unevil
+unevinced
+unevirated
+uneviscerated
+unevitable
+unevitably
+unevokable
+unevoked
+unevolutionary
+unevolved
+unexacerbated
+unexact
+unexacted
+unexactedly
+unexacting
+unexactingly
+unexactly
+unexactness
+unexaggerable
+unexaggerated
+unexaggerating
+unexalted
+unexaminable
+unexamined
+unexamining
+unexampled
+unexampledness
+unexasperated
+unexasperating
+unexcavated
+unexceedable
+unexceeded
+unexcelled
+unexcellent
+unexcelling
+unexceptable
+unexcepted
+unexcepting
+unexceptionability
+unexceptionable
+unexceptionableness
+unexceptionably
+unexceptional
+unexceptionally
+unexceptionalness
+unexceptive
+unexcerpted
+unexcessive
+unexchangeable
+unexchangeableness
+unexchanged
+unexcised
+unexcitability
+unexcitable
+unexcited
+unexciting
+unexclaiming
+unexcludable
+unexcluded
+unexcluding
+unexclusive
+unexclusively
+unexclusiveness
+unexcogitable
+unexcogitated
+unexcommunicated
+unexcoriated
+unexcorticated
+unexcrescent
+unexcreted
+unexcruciating
+unexculpable
+unexculpably
+unexculpated
+unexcursive
+unexcusable
+unexcusableness
+unexcusably
+unexcused
+unexcusedly
+unexcusedness
+unexcusing
+unexecrated
+unexecutable
+unexecuted
+unexecuting
+unexecutorial
+unexemplary
+unexemplifiable
+unexemplified
+unexempt
+unexempted
+unexemptible
+unexempting
+unexercisable
+unexercise
+unexercised
+unexerted
+unexhalable
+unexhaled
+unexhausted
+unexhaustedly
+unexhaustedness
+unexhaustible
+unexhaustibleness
+unexhaustibly
+unexhaustion
+unexhaustive
+unexhaustiveness
+unexhibitable
+unexhibitableness
+unexhibited
+unexhilarated
+unexhilarating
+unexhorted
+unexhumed
+unexigent
+unexilable
+unexiled
+unexistence
+unexistent
+unexisting
+unexonerable
+unexonerated
+unexorable
+unexorableness
+unexorbitant
+unexorcisable
+unexorcisably
+unexorcised
+unexotic
+unexpandable
+unexpanded
+unexpanding
+unexpansive
+unexpectable
+unexpectant
+unexpected
+unexpectedly
+unexpectedness
+unexpecting
+unexpectingly
+unexpectorated
+unexpedient
+unexpeditated
+unexpedited
+unexpeditious
+unexpelled
+unexpendable
+unexpended
+unexpensive
+unexpensively
+unexpensiveness
+unexperience
+unexperienced
+unexperiencedness
+unexperient
+unexperiential
+unexperimental
+unexperimented
+unexpert
+unexpertly
+unexpertness
+unexpiable
+unexpiated
+unexpired
+unexpiring
+unexplainable
+unexplainableness
+unexplainably
+unexplained
+unexplainedly
+unexplainedness
+unexplaining
+unexplanatory
+unexplicable
+unexplicableness
+unexplicably
+unexplicated
+unexplicit
+unexplicitly
+unexplicitness
+unexploded
+unexploitation
+unexploited
+unexplorable
+unexplorative
+unexplored
+unexplosive
+unexportable
+unexported
+unexporting
+unexposable
+unexposed
+unexpostulating
+unexpoundable
+unexpounded
+unexpress
+unexpressable
+unexpressableness
+unexpressably
+unexpressed
+unexpressedly
+unexpressible
+unexpressibleness
+unexpressibly
+unexpressive
+unexpressively
+unexpressiveness
+unexpressly
+unexpropriable
+unexpropriated
+unexpugnable
+unexpunged
+unexpurgated
+unexpurgatedly
+unexpurgatedness
+unextended
+unextendedly
+unextendedness
+unextendible
+unextensible
+unextenuable
+unextenuated
+unextenuating
+unexterminable
+unexterminated
+unexternal
+unexternality
+unexterritoriality
+unextinct
+unextinctness
+unextinguishable
+unextinguishableness
+unextinguishably
+unextinguished
+unextirpated
+unextolled
+unextortable
+unextorted
+unextractable
+unextracted
+unextradited
+unextraneous
+unextraordinary
+unextravagance
+unextravagant
+unextravagating
+unextravasated
+unextreme
+unextricable
+unextricated
+unextrinsic
+unextruded
+unexuberant
+unexuded
+unexultant
+uneye
+uneyeable
+uneyed
+unfabled
+unfabling
+unfabricated
+unfabulous
+unfacaded
+unface
+unfaceable
+unfaced
+unfaceted
+unfacetious
+unfacile
+unfacilitated
+unfact
+unfactional
+unfactious
+unfactitious
+unfactorable
+unfactored
+unfactual
+unfadable
+unfaded
+unfading
+unfadingly
+unfadingness
+unfagged
+unfagoted
+unfailable
+unfailableness
+unfailably
+unfailed
+unfailing
+unfailingly
+unfailingness
+unfain
+unfaint
+unfainting
+unfaintly
+unfair
+unfairly
+unfairminded
+unfairness
+unfairylike
+unfaith
+unfaithful
+unfaithfully
+unfaithfulness
+unfaked
+unfallacious
+unfallaciously
+unfallen
+unfallenness
+unfallible
+unfallibleness
+unfallibly
+unfalling
+unfallowed
+unfalse
+unfalsifiable
+unfalsified
+unfalsifiedness
+unfalsity
+unfaltering
+unfalteringly
+unfamed
+unfamiliar
+unfamiliarity
+unfamiliarized
+unfamiliarly
+unfanatical
+unfanciable
+unfancied
+unfanciful
+unfancy
+unfanged
+unfanned
+unfantastic
+unfantastical
+unfantastically
+unfar
+unfarced
+unfarcical
+unfarewelled
+unfarmed
+unfarming
+unfarrowed
+unfarsighted
+unfasciated
+unfascinate
+unfascinated
+unfascinating
+unfashion
+unfashionable
+unfashionableness
+unfashionably
+unfashioned
+unfast
+unfasten
+unfastenable
+unfastened
+unfastener
+unfastidious
+unfastidiously
+unfastidiousness
+unfasting
+unfather
+unfathered
+unfatherlike
+unfatherliness
+unfatherly
+unfathomability
+unfathomable
+unfathomableness
+unfathomably
+unfathomed
+unfatigue
+unfatigueable
+unfatigued
+unfatiguing
+unfattable
+unfatted
+unfatten
+unfauceted
+unfaultfinding
+unfaulty
+unfavorable
+unfavorableness
+unfavorably
+unfavored
+unfavoring
+unfavorite
+unfawning
+unfealty
+unfeared
+unfearful
+unfearfully
+unfearing
+unfearingly
+unfeary
+unfeasable
+unfeasableness
+unfeasably
+unfeasibility
+unfeasible
+unfeasibleness
+unfeasibly
+unfeasted
+unfeather
+unfeathered
+unfeatured
+unfecund
+unfecundated
+unfed
+unfederal
+unfederated
+unfeeble
+unfeed
+unfeedable
+unfeeding
+unfeeing
+unfeelable
+unfeeling
+unfeelingly
+unfeelingness
+unfeignable
+unfeignableness
+unfeignably
+unfeigned
+unfeignedly
+unfeignedness
+unfeigning
+unfeigningly
+unfeigningness
+unfele
+unfelicitated
+unfelicitating
+unfelicitous
+unfelicitously
+unfelicitousness
+unfeline
+unfellable
+unfelled
+unfellied
+unfellow
+unfellowed
+unfellowlike
+unfellowly
+unfellowshiped
+unfelon
+unfelonious
+unfeloniously
+unfelony
+unfelt
+unfelted
+unfemale
+unfeminine
+unfemininely
+unfeminineness
+unfemininity
+unfeminist
+unfeminize
+unfence
+unfenced
+unfendered
+unfenestrated
+unfeoffed
+unfermentable
+unfermentableness
+unfermentably
+unfermented
+unfermenting
+unfernlike
+unferocious
+unferreted
+unferried
+unfertile
+unfertileness
+unfertility
+unfertilizable
+unfertilized
+unfervent
+unfervid
+unfester
+unfestered
+unfestival
+unfestive
+unfestively
+unfestooned
+unfetchable
+unfetched
+unfeted
+unfetter
+unfettered
+unfettled
+unfeudal
+unfeudalize
+unfeudalized
+unfeued
+unfevered
+unfeverish
+unfew
+unfibbed
+unfibbing
+unfiber
+unfibered
+unfibrous
+unfickle
+unfictitious
+unfidelity
+unfidgeting
+unfielded
+unfiend
+unfiendlike
+unfierce
+unfiery
+unfight
+unfightable
+unfighting
+unfigurable
+unfigurative
+unfigured
+unfilamentous
+unfilched
+unfile
+unfiled
+unfilial
+unfilially
+unfilialness
+unfill
+unfillable
+unfilled
+unfilleted
+unfilling
+unfilm
+unfilmed
+unfiltered
+unfiltrated
+unfinable
+unfinancial
+unfine
+unfined
+unfinessed
+unfingered
+unfinical
+unfinish
+unfinishable
+unfinished
+unfinishedly
+unfinishedness
+unfinite
+unfired
+unfireproof
+unfiring
+unfirm
+unfirmamented
+unfirmly
+unfirmness
+unfiscal
+unfishable
+unfished
+unfishing
+unfishlike
+unfissile
+unfistulous
+unfit
+unfitly
+unfitness
+unfittable
+unfitted
+unfittedness
+unfitten
+unfitting
+unfittingly
+unfittingness
+unfitty
+unfix
+unfixable
+unfixated
+unfixed
+unfixedness
+unfixing
+unfixity
+unflag
+unflagged
+unflagging
+unflaggingly
+unflaggingness
+unflagitious
+unflagrant
+unflaky
+unflamboyant
+unflaming
+unflanged
+unflank
+unflanked
+unflapping
+unflashing
+unflat
+unflated
+unflattened
+unflatterable
+unflattered
+unflattering
+unflatteringly
+unflaunted
+unflavored
+unflawed
+unflayed
+unflead
+unflecked
+unfledge
+unfledged
+unfledgedness
+unfleece
+unfleeced
+unfleeing
+unfleeting
+unflesh
+unfleshed
+unfleshliness
+unfleshly
+unfleshy
+unfletched
+unflexed
+unflexible
+unflexibleness
+unflexibly
+unflickering
+unflickeringly
+unflighty
+unflinching
+unflinchingly
+unflinchingness
+unflintify
+unflippant
+unflirtatious
+unflitched
+unfloatable
+unfloating
+unflock
+unfloggable
+unflogged
+unflooded
+unfloor
+unfloored
+unflorid
+unflossy
+unflounced
+unfloured
+unflourished
+unflourishing
+unflouted
+unflower
+unflowered
+unflowing
+unflown
+unfluctuating
+unfluent
+unfluid
+unfluked
+unflunked
+unfluorescent
+unflurried
+unflush
+unflushed
+unflustered
+unfluted
+unflutterable
+unfluttered
+unfluttering
+unfluvial
+unfluxile
+unflying
+unfoaled
+unfoaming
+unfocused
+unfoggy
+unfoilable
+unfoiled
+unfoisted
+unfold
+unfoldable
+unfolded
+unfolder
+unfolding
+unfoldment
+unfoldure
+unfoliaged
+unfoliated
+unfollowable
+unfollowed
+unfollowing
+unfomented
+unfond
+unfondled
+unfondness
+unfoodful
+unfool
+unfoolable
+unfooled
+unfooling
+unfoolish
+unfooted
+unfootsore
+unfoppish
+unforaged
+unforbade
+unforbearance
+unforbearing
+unforbid
+unforbidden
+unforbiddenly
+unforbiddenness
+unforbidding
+unforceable
+unforced
+unforcedly
+unforcedness
+unforceful
+unforcible
+unforcibleness
+unforcibly
+unfordable
+unfordableness
+unforded
+unforeboded
+unforeboding
+unforecasted
+unforegone
+unforeign
+unforeknowable
+unforeknown
+unforensic
+unforeordained
+unforesee
+unforeseeable
+unforeseeableness
+unforeseeably
+unforeseeing
+unforeseeingly
+unforeseen
+unforeseenly
+unforeseenness
+unforeshortened
+unforest
+unforestallable
+unforestalled
+unforested
+unforetellable
+unforethought
+unforethoughtful
+unforetold
+unforewarned
+unforewarnedness
+unforfeit
+unforfeitable
+unforfeited
+unforgeability
+unforgeable
+unforged
+unforget
+unforgetful
+unforgettable
+unforgettableness
+unforgettably
+unforgetting
+unforgettingly
+unforgivable
+unforgivableness
+unforgivably
+unforgiven
+unforgiveness
+unforgiver
+unforgiving
+unforgivingly
+unforgivingness
+unforgone
+unforgot
+unforgotten
+unfork
+unforked
+unforkedness
+unforlorn
+unform
+unformal
+unformality
+unformalized
+unformally
+unformalness
+unformative
+unformed
+unformidable
+unformulable
+unformularizable
+unformularize
+unformulated
+unformulistic
+unforsaken
+unforsaking
+unforsook
+unforsworn
+unforthright
+unfortifiable
+unfortified
+unfortify
+unfortuitous
+unfortunate
+unfortunately
+unfortunateness
+unfortune
+unforward
+unforwarded
+unfossiliferous
+unfossilized
+unfostered
+unfought
+unfoughten
+unfoul
+unfoulable
+unfouled
+unfound
+unfounded
+unfoundedly
+unfoundedness
+unfoundered
+unfountained
+unfowllike
+unfoxy
+unfractured
+unfragrance
+unfragrant
+unfragrantly
+unfrail
+unframable
+unframableness
+unframably
+unframe
+unframed
+unfranchised
+unfrank
+unfrankable
+unfranked
+unfrankly
+unfrankness
+unfraternal
+unfraternizing
+unfraudulent
+unfraught
+unfrayed
+unfreckled
+unfree
+unfreed
+unfreedom
+unfreehold
+unfreely
+unfreeman
+unfreeness
+unfreezable
+unfreeze
+unfreezing
+unfreighted
+unfrenchified
+unfrenzied
+unfrequency
+unfrequent
+unfrequented
+unfrequentedness
+unfrequently
+unfrequentness
+unfret
+unfretful
+unfretting
+unfriable
+unfriarlike
+unfricative
+unfrictioned
+unfried
+unfriend
+unfriended
+unfriendedness
+unfriending
+unfriendlike
+unfriendlily
+unfriendliness
+unfriendly
+unfriendship
+unfrighted
+unfrightenable
+unfrightened
+unfrightenedness
+unfrightful
+unfrigid
+unfrill
+unfrilled
+unfringe
+unfringed
+unfrisky
+unfrivolous
+unfrizz
+unfrizzled
+unfrizzy
+unfrock
+unfrocked
+unfroglike
+unfrolicsome
+unfronted
+unfrost
+unfrosted
+unfrosty
+unfrounced
+unfroward
+unfrowardly
+unfrowning
+unfroze
+unfrozen
+unfructed
+unfructified
+unfructify
+unfructuous
+unfructuously
+unfrugal
+unfrugally
+unfrugalness
+unfruitful
+unfruitfully
+unfruitfulness
+unfruity
+unfrustrable
+unfrustrably
+unfrustratable
+unfrustrated
+unfrutuosity
+unfuddled
+unfueled
+unfulfill
+unfulfillable
+unfulfilled
+unfulfilling
+unfulfillment
+unfull
+unfulled
+unfully
+unfulminated
+unfulsome
+unfumbled
+unfumbling
+unfumed
+unfumigated
+unfunctional
+unfundamental
+unfunded
+unfunnily
+unfunniness
+unfunny
+unfur
+unfurbelowed
+unfurbished
+unfurcate
+unfurious
+unfurl
+unfurlable
+unfurnish
+unfurnished
+unfurnishedness
+unfurnitured
+unfurred
+unfurrow
+unfurrowable
+unfurrowed
+unfurthersome
+unfused
+unfusible
+unfusibleness
+unfusibly
+unfussed
+unfussing
+unfussy
+unfutile
+unfuturistic
+ungabled
+ungag
+ungaged
+ungagged
+ungain
+ungainable
+ungained
+ungainful
+ungainfully
+ungainfulness
+ungaining
+ungainlike
+ungainliness
+ungainly
+ungainness
+ungainsaid
+ungainsayable
+ungainsayably
+ungainsaying
+ungainsome
+ungainsomely
+ungaite
+ungallant
+ungallantly
+ungallantness
+ungalling
+ungalvanized
+ungamboling
+ungamelike
+unganged
+ungangrened
+ungarbed
+ungarbled
+ungardened
+ungargled
+ungarland
+ungarlanded
+ungarment
+ungarmented
+ungarnered
+ungarnish
+ungarnished
+ungaro
+ungarrisoned
+ungarter
+ungartered
+ungashed
+ungassed
+ungastric
+ungathered
+ungaudy
+ungauged
+ungauntlet
+ungauntleted
+ungazetted
+ungazing
+ungear
+ungeared
+ungelatinizable
+ungelatinized
+ungelded
+ungelt
+ungeminated
+ungenerable
+ungeneral
+ungeneraled
+ungeneralized
+ungenerate
+ungenerated
+ungenerative
+ungeneric
+ungenerical
+ungenerosity
+ungenerous
+ungenerously
+ungenerousness
+ungenial
+ungeniality
+ungenially
+ungenialness
+ungenitured
+ungenius
+ungenteel
+ungenteelly
+ungenteelness
+ungentile
+ungentility
+ungentilize
+ungentle
+ungentled
+ungentleman
+ungentlemanize
+ungentlemanlike
+ungentlemanlikeness
+ungentlemanliness
+ungentlemanly
+ungentleness
+ungentlewomanlike
+ungently
+ungenuine
+ungenuinely
+ungenuineness
+ungeodetical
+ungeographic
+ungeographical
+ungeographically
+ungeological
+ungeometric
+ungeometrical
+ungeometrically
+ungeometricalness
+ungerminated
+ungerminating
+ungermlike
+ungerontic
+ungesting
+ungesturing
+unget
+ungettable
+unghostlike
+unghostly
+ungiant
+ungibbet
+ungiddy
+ungifted
+ungiftedness
+ungild
+ungilded
+ungill
+ungilt
+ungingled
+unginned
+ungird
+ungirded
+ungirdle
+ungirdled
+ungirlish
+ungirt
+ungirth
+ungirthed
+ungive
+ungiveable
+ungiven
+ungiving
+ungka
+unglaciated
+unglad
+ungladden
+ungladdened
+ungladly
+ungladness
+ungladsome
+unglamorous
+unglandular
+unglassed
+unglaze
+unglazed
+ungleaned
+unglee
+ungleeful
+unglimpsed
+unglistening
+unglittering
+ungloating
+unglobe
+unglobular
+ungloom
+ungloomed
+ungloomy
+unglorified
+unglorify
+unglorifying
+unglorious
+ungloriously
+ungloriousness
+unglory
+unglosed
+ungloss
+unglossaried
+unglossed
+unglossily
+unglossiness
+unglossy
+unglove
+ungloved
+unglowing
+unglozed
+unglue
+unglued
+unglutinate
+unglutted
+ungluttonous
+ungnarred
+ungnaw
+ungnawn
+ungnostic
+ungoaded
+ungoatlike
+ungod
+ungoddess
+ungodlike
+ungodlily
+ungodliness
+ungodly
+ungodmothered
+ungold
+ungolden
+ungone
+ungood
+ungoodliness
+ungoodly
+ungored
+ungorge
+ungorged
+ungorgeous
+ungospel
+ungospelized
+ungospelled
+ungospellike
+ungossiping
+ungot
+ungothic
+ungotten
+ungouged
+ungouty
+ungovernable
+ungovernableness
+ungovernably
+ungoverned
+ungovernedness
+ungoverning
+ungown
+ungowned
+ungrace
+ungraced
+ungraceful
+ungracefully
+ungracefulness
+ungracious
+ungraciously
+ungraciousness
+ungradated
+ungraded
+ungradual
+ungradually
+ungraduated
+ungraduating
+ungraft
+ungrafted
+ungrain
+ungrainable
+ungrained
+ungrammar
+ungrammared
+ungrammatic
+ungrammatical
+ungrammatically
+ungrammaticalness
+ungrammaticism
+ungrand
+ungrantable
+ungranted
+ungranulated
+ungraphic
+ungraphitized
+ungrapple
+ungrappled
+ungrappler
+ungrasp
+ungraspable
+ungrasped
+ungrasping
+ungrassed
+ungrassy
+ungrated
+ungrateful
+ungratefully
+ungratefulness
+ungratifiable
+ungratified
+ungratifying
+ungrating
+ungrave
+ungraved
+ungraveled
+ungravelly
+ungravely
+ungraven
+ungrayed
+ungrazed
+ungreased
+ungreat
+ungreatly
+ungreatness
+ungreeable
+ungreedy
+ungreen
+ungreenable
+ungreened
+ungreeted
+ungregarious
+ungrieve
+ungrieved
+ungrieving
+ungrilled
+ungrimed
+ungrindable
+ungrip
+ungripe
+ungrizzled
+ungroaning
+ungroined
+ungroomed
+ungrooved
+ungropeable
+ungross
+ungrotesque
+unground
+ungroundable
+ungroundably
+ungrounded
+ungroundedly
+ungroundedness
+ungroupable
+ungrouped
+ungrow
+ungrowing
+ungrown
+ungrubbed
+ungrudged
+ungrudging
+ungrudgingly
+ungrudgingness
+ungruesome
+ungruff
+ungrumbling
+ungual
+unguaranteed
+unguard
+unguardable
+unguarded
+unguardedly
+unguardedness
+ungueal
+unguent
+unguentaria
+unguentarium
+unguentary
+unguentiferous
+unguentous
+unguentum
+unguerdoned
+ungues
+unguessable
+unguessableness
+unguessed
+unguical
+unguicorn
+unguicular
+Unguiculata
+unguiculate
+unguiculated
+unguidable
+unguidableness
+unguidably
+unguided
+unguidedly
+unguiferous
+unguiform
+unguiled
+unguileful
+unguilefully
+unguilefulness
+unguillotined
+unguiltily
+unguiltiness
+unguilty
+unguinal
+unguinous
+unguirostral
+unguis
+ungula
+ungulae
+ungular
+Ungulata
+ungulate
+ungulated
+unguled
+unguligrade
+ungull
+ungulous
+ungulp
+ungum
+ungummed
+ungushing
+ungutted
+unguttural
+unguyed
+unguzzled
+ungymnastic
+ungypsylike
+ungyve
+ungyved
+unhabit
+unhabitable
+unhabitableness
+unhabited
+unhabitual
+unhabitually
+unhabituate
+unhabituated
+unhacked
+unhackled
+unhackneyed
+unhackneyedness
+unhad
+unhaft
+unhafted
+unhaggled
+unhaggling
+unhailable
+unhailed
+unhair
+unhaired
+unhairer
+unhairily
+unhairiness
+unhairing
+unhairy
+unhallooed
+unhallow
+unhallowed
+unhallowedness
+unhaloed
+unhalsed
+unhalted
+unhalter
+unhaltered
+unhalting
+unhalved
+unhammered
+unhamper
+unhampered
+unhand
+unhandcuff
+unhandcuffed
+unhandicapped
+unhandily
+unhandiness
+unhandled
+unhandseled
+unhandsome
+unhandsomely
+unhandsomeness
+unhandy
+unhang
+unhanged
+unhap
+unhappen
+unhappily
+unhappiness
+unhappy
+unharangued
+unharassed
+unharbor
+unharbored
+unhard
+unharden
+unhardenable
+unhardened
+unhardihood
+unhardily
+unhardiness
+unhardness
+unhardy
+unharked
+unharmable
+unharmed
+unharmful
+unharmfully
+unharming
+unharmonic
+unharmonical
+unharmonious
+unharmoniously
+unharmoniousness
+unharmonize
+unharmonized
+unharmony
+unharness
+unharnessed
+unharped
+unharried
+unharrowed
+unharsh
+unharvested
+unhashed
+unhasp
+unhasped
+unhaste
+unhasted
+unhastened
+unhastily
+unhastiness
+unhasting
+unhasty
+unhat
+unhatchability
+unhatchable
+unhatched
+unhatcheled
+unhate
+unhated
+unhateful
+unhating
+unhatingly
+unhatted
+unhauled
+unhaunt
+unhaunted
+unhave
+unhawked
+unhayed
+unhazarded
+unhazarding
+unhazardous
+unhazardousness
+unhazed
+unhead
+unheaded
+unheader
+unheady
+unheal
+unhealable
+unhealableness
+unhealably
+unhealed
+unhealing
+unhealth
+unhealthful
+unhealthfully
+unhealthfulness
+unhealthily
+unhealthiness
+unhealthsome
+unhealthsomeness
+unhealthy
+unheaped
+unhearable
+unheard
+unhearing
+unhearsed
+unheart
+unhearten
+unheartsome
+unhearty
+unheatable
+unheated
+unheathen
+unheaved
+unheaven
+unheavenly
+unheavily
+unheaviness
+unheavy
+unhectored
+unhedge
+unhedged
+unheed
+unheeded
+unheededly
+unheedful
+unheedfully
+unheedfulness
+unheeding
+unheedingly
+unheedy
+unheeled
+unheelpieced
+unhefted
+unheightened
+unheired
+unheld
+unhele
+unheler
+unhelm
+unhelmed
+unhelmet
+unhelmeted
+unhelpable
+unhelpableness
+unhelped
+unhelpful
+unhelpfully
+unhelpfulness
+unhelping
+unhelved
+unhemmed
+unheppen
+unheralded
+unheraldic
+unherd
+unherded
+unhereditary
+unheretical
+unheritable
+unhermetic
+unhero
+unheroic
+unheroical
+unheroically
+unheroism
+unheroize
+unherolike
+unhesitant
+unhesitating
+unhesitatingly
+unhesitatingness
+unheuristic
+unhewable
+unhewed
+unhewn
+unhex
+unhid
+unhidable
+unhidableness
+unhidably
+unhidated
+unhidden
+unhide
+unhidebound
+unhideous
+unhieratic
+unhigh
+unhilarious
+unhinderable
+unhinderably
+unhindered
+unhindering
+unhinge
+unhingement
+unhinted
+unhipped
+unhired
+unhissed
+unhistoric
+unhistorical
+unhistorically
+unhistory
+unhistrionic
+unhit
+unhitch
+unhitched
+unhittable
+unhive
+unhoard
+unhoarded
+unhoarding
+unhoary
+unhoaxed
+unhobble
+unhocked
+unhoed
+unhogged
+unhoist
+unhoisted
+unhold
+unholiday
+unholily
+unholiness
+unhollow
+unhollowed
+unholy
+unhome
+unhomelike
+unhomelikeness
+unhomeliness
+unhomely
+unhomish
+unhomogeneity
+unhomogeneous
+unhomogeneously
+unhomologous
+unhoned
+unhonest
+unhonestly
+unhoneyed
+unhonied
+unhonorable
+unhonorably
+unhonored
+unhonoured
+unhood
+unhooded
+unhoodwink
+unhoodwinked
+unhoofed
+unhook
+unhooked
+unhoop
+unhooped
+unhooper
+unhooted
+unhoped
+unhopedly
+unhopedness
+unhopeful
+unhopefully
+unhopefulness
+unhoping
+unhopingly
+unhopped
+unhoppled
+unhorizoned
+unhorizontal
+unhorned
+unhorny
+unhoroscopic
+unhorse
+unhose
+unhosed
+unhospitable
+unhospitableness
+unhospitably
+unhostile
+unhostilely
+unhostileness
+unhostility
+unhot
+unhoundlike
+unhouse
+unhoused
+unhouseled
+unhouselike
+unhousewifely
+unhuddle
+unhugged
+unhull
+unhulled
+unhuman
+unhumanize
+unhumanized
+unhumanly
+unhumanness
+unhumble
+unhumbled
+unhumbledness
+unhumbleness
+unhumbly
+unhumbugged
+unhumid
+unhumiliated
+unhumored
+unhumorous
+unhumorously
+unhumorousness
+unhumoured
+unhung
+unhuntable
+unhunted
+unhurdled
+unhurled
+unhurried
+unhurriedly
+unhurriedness
+unhurrying
+unhurryingly
+unhurt
+unhurted
+unhurtful
+unhurtfully
+unhurtfulness
+unhurting
+unhusbanded
+unhusbandly
+unhushable
+unhushed
+unhushing
+unhusk
+unhusked
+unhustled
+unhustling
+unhutched
+unhuzzaed
+unhydraulic
+unhydrolyzed
+unhygienic
+unhygienically
+unhygrometric
+unhymeneal
+unhymned
+unhyphenated
+unhyphened
+unhypnotic
+unhypnotizable
+unhypnotize
+unhypocritical
+unhypocritically
+unhypothecated
+unhypothetical
+unhysterical
+uniambic
+uniambically
+uniangulate
+uniarticular
+uniarticulate
+Uniat
+uniat
+Uniate
+uniate
+uniauriculate
+uniauriculated
+uniaxal
+uniaxally
+uniaxial
+uniaxially
+unibasal
+unibivalent
+unible
+unibracteate
+unibracteolate
+unibranchiate
+unicalcarate
+unicameral
+unicameralism
+unicameralist
+unicamerate
+unicapsular
+unicarinate
+unicarinated
+unice
+uniced
+unicell
+unicellate
+unicelled
+unicellular
+unicellularity
+unicentral
+unichord
+uniciliate
+unicism
+unicist
+unicity
+uniclinal
+unicolor
+unicolorate
+unicolored
+unicolorous
+uniconstant
+unicorn
+unicorneal
+unicornic
+unicornlike
+unicornous
+unicornuted
+unicostate
+unicotyledonous
+unicum
+unicursal
+unicursality
+unicursally
+unicuspid
+unicuspidate
+unicycle
+unicyclist
+unidactyl
+unidactyle
+unidactylous
+unideaed
+unideal
+unidealism
+unidealist
+unidealistic
+unidealized
+unidentate
+unidentated
+unidenticulate
+unidentifiable
+unidentifiableness
+unidentifiably
+unidentified
+unidentifiedly
+unidentifying
+unideographic
+unidextral
+unidextrality
+unidigitate
+unidimensional
+unidiomatic
+unidiomatically
+unidirect
+unidirected
+unidirection
+unidirectional
+unidle
+unidleness
+unidly
+unidolatrous
+unidolized
+unidyllic
+unie
+uniembryonate
+uniequivalent
+uniface
+unifaced
+unifacial
+unifactorial
+unifarious
+unifiable
+unific
+unification
+unificationist
+unificator
+unified
+unifiedly
+unifiedness
+unifier
+unifilar
+uniflagellate
+unifloral
+uniflorate
+uniflorous
+uniflow
+uniflowered
+unifocal
+unifoliar
+unifoliate
+unifoliolate
+Unifolium
+uniform
+uniformal
+uniformalization
+uniformalize
+uniformally
+uniformation
+uniformed
+uniformist
+uniformitarian
+uniformitarianism
+uniformity
+uniformization
+uniformize
+uniformless
+uniformly
+uniformness
+unify
+unigenesis
+unigenetic
+unigenist
+unigenistic
+unigenital
+unigeniture
+unigenous
+uniglandular
+uniglobular
+unignitable
+unignited
+unignitible
+unignominious
+unignorant
+unignored
+unigravida
+uniguttulate
+unijugate
+unijugous
+unilabiate
+unilabiated
+unilamellar
+unilamellate
+unilaminar
+unilaminate
+unilateral
+unilateralism
+unilateralist
+unilaterality
+unilateralization
+unilateralize
+unilaterally
+unilinear
+unilingual
+unilingualism
+uniliteral
+unilludedly
+unillumed
+unilluminated
+unilluminating
+unillumination
+unillumined
+unillusioned
+unillusory
+unillustrated
+unillustrative
+unillustrious
+unilobal
+unilobar
+unilobate
+unilobe
+unilobed
+unilobular
+unilocular
+unilocularity
+uniloculate
+unimacular
+unimaged
+unimaginable
+unimaginableness
+unimaginably
+unimaginary
+unimaginative
+unimaginatively
+unimaginativeness
+unimagine
+unimagined
+unimanual
+unimbanked
+unimbellished
+unimbezzled
+unimbibed
+unimbibing
+unimbittered
+unimbodied
+unimboldened
+unimbordered
+unimbosomed
+unimbowed
+unimbowered
+unimbroiled
+unimbrowned
+unimbrued
+unimbued
+unimedial
+unimitable
+unimitableness
+unimitably
+unimitated
+unimitating
+unimitative
+unimmaculate
+unimmanent
+unimmediate
+unimmerged
+unimmergible
+unimmersed
+unimmigrating
+unimmolated
+unimmortal
+unimmortalize
+unimmortalized
+unimmovable
+unimmured
+unimodal
+unimodality
+unimodular
+unimolecular
+unimolecularity
+unimpair
+unimpairable
+unimpaired
+unimpartable
+unimparted
+unimpartial
+unimpassionate
+unimpassioned
+unimpassionedly
+unimpassionedness
+unimpatient
+unimpawned
+unimpeachability
+unimpeachable
+unimpeachableness
+unimpeachably
+unimpeached
+unimpearled
+unimped
+unimpeded
+unimpededly
+unimpedible
+unimpedness
+unimpelled
+unimpenetrable
+unimperative
+unimperial
+unimperialistic
+unimperious
+unimpertinent
+unimpinging
+unimplanted
+unimplicable
+unimplicate
+unimplicated
+unimplicit
+unimplicitly
+unimplied
+unimplorable
+unimplored
+unimpoisoned
+unimportance
+unimportant
+unimportantly
+unimported
+unimporting
+unimportunate
+unimportunately
+unimportuned
+unimposed
+unimposedly
+unimposing
+unimpostrous
+unimpounded
+unimpoverished
+unimpowered
+unimprecated
+unimpregnable
+unimpregnate
+unimpregnated
+unimpressed
+unimpressibility
+unimpressible
+unimpressibleness
+unimpressibly
+unimpressionability
+unimpressionable
+unimpressive
+unimpressively
+unimpressiveness
+unimprinted
+unimprison
+unimprisonable
+unimprisoned
+unimpropriated
+unimprovable
+unimprovableness
+unimprovably
+unimproved
+unimprovedly
+unimprovedness
+unimprovement
+unimproving
+unimprovised
+unimpugnable
+unimpugned
+unimpulsive
+unimpurpled
+unimputable
+unimputed
+unimucronate
+unimultiplex
+unimuscular
+uninaugurated
+unincantoned
+unincarcerated
+unincarnate
+unincarnated
+unincensed
+uninchoative
+unincidental
+unincised
+unincisive
+unincited
+uninclinable
+uninclined
+uninclining
+uninclosed
+uninclosedness
+unincludable
+unincluded
+uninclusive
+uninclusiveness
+uninconvenienced
+unincorporate
+unincorporated
+unincorporatedly
+unincorporatedness
+unincreasable
+unincreased
+unincreasing
+unincubated
+uninculcated
+unincumbered
+unindebted
+unindebtedly
+unindebtedness
+unindemnified
+unindentable
+unindented
+unindentured
+unindexed
+unindicable
+unindicated
+unindicative
+unindictable
+unindicted
+unindifference
+unindifferency
+unindifferent
+unindifferently
+unindigent
+unindignant
+unindividual
+unindividualize
+unindividualized
+unindividuated
+unindorsed
+uninduced
+uninductive
+unindulged
+unindulgent
+unindulgently
+unindurated
+unindustrial
+unindustrialized
+unindustrious
+unindustriously
+unindwellable
+uninebriated
+uninebriating
+uninervate
+uninerved
+uninfallibility
+uninfallible
+uninfatuated
+uninfectable
+uninfected
+uninfectious
+uninfectiousness
+uninfeft
+uninferred
+uninfested
+uninfiltrated
+uninfinite
+uninfiniteness
+uninfixed
+uninflamed
+uninflammability
+uninflammable
+uninflated
+uninflected
+uninflectedness
+uninflicted
+uninfluenceable
+uninfluenced
+uninfluencing
+uninfluencive
+uninfluential
+uninfluentiality
+uninfolded
+uninformed
+uninforming
+uninfracted
+uninfringeable
+uninfringed
+uninfringible
+uninfuriated
+uninfused
+uningenious
+uningeniously
+uningeniousness
+uningenuity
+uningenuous
+uningenuously
+uningenuousness
+uningested
+uningrafted
+uningrained
+uninhabitability
+uninhabitable
+uninhabitableness
+uninhabitably
+uninhabited
+uninhabitedness
+uninhaled
+uninheritability
+uninheritable
+uninherited
+uninhibited
+uninhibitive
+uninhumed
+uninimical
+uniniquitous
+uninitialed
+uninitialled
+uninitiate
+uninitiated
+uninitiatedness
+uninitiation
+uninjectable
+uninjected
+uninjurable
+uninjured
+uninjuredness
+uninjuring
+uninjurious
+uninjuriously
+uninjuriousness
+uninked
+uninlaid
+uninn
+uninnate
+uninnocence
+uninnocent
+uninnocently
+uninnocuous
+uninnovating
+uninoculable
+uninoculated
+uninodal
+uninominal
+uninquired
+uninquiring
+uninquisitive
+uninquisitively
+uninquisitiveness
+uninquisitorial
+uninsane
+uninsatiable
+uninscribed
+uninserted
+uninshrined
+uninsinuated
+uninsistent
+uninsolvent
+uninspected
+uninspirable
+uninspired
+uninspiring
+uninspiringly
+uninspirited
+uninspissated
+uninstalled
+uninstanced
+uninstated
+uninstigated
+uninstilled
+uninstituted
+uninstructed
+uninstructedly
+uninstructedness
+uninstructible
+uninstructing
+uninstructive
+uninstructively
+uninstructiveness
+uninstrumental
+uninsular
+uninsulate
+uninsulated
+uninsultable
+uninsulted
+uninsulting
+uninsurability
+uninsurable
+uninsured
+unintegrated
+unintellective
+unintellectual
+unintellectualism
+unintellectuality
+unintellectually
+unintelligence
+unintelligent
+unintelligently
+unintelligentsia
+unintelligibility
+unintelligible
+unintelligibleness
+unintelligibly
+unintended
+unintendedly
+unintensive
+unintent
+unintentional
+unintentionality
+unintentionally
+unintentionalness
+unintently
+unintentness
+unintercalated
+unintercepted
+uninterchangeable
+uninterdicted
+uninterested
+uninterestedly
+uninterestedness
+uninteresting
+uninterestingly
+uninterestingness
+uninterferedwith
+uninterjected
+uninterlaced
+uninterlarded
+uninterleave
+uninterleaved
+uninterlined
+uninterlinked
+uninterlocked
+unintermarrying
+unintermediate
+unintermingled
+unintermission
+unintermissive
+unintermitted
+unintermittedly
+unintermittedness
+unintermittent
+unintermitting
+unintermittingly
+unintermittingness
+unintermixed
+uninternational
+uninterpleaded
+uninterpolated
+uninterposed
+uninterposing
+uninterpretable
+uninterpreted
+uninterred
+uninterrogable
+uninterrogated
+uninterrupted
+uninterruptedly
+uninterruptedness
+uninterruptible
+uninterruptibleness
+uninterrupting
+uninterruption
+unintersected
+uninterspersed
+unintervening
+uninterviewed
+unintervolved
+uninterwoven
+uninthroned
+unintimate
+unintimated
+unintimidated
+unintitled
+unintombed
+unintoned
+unintoxicated
+unintoxicatedness
+unintoxicating
+unintrenchable
+unintrenched
+unintricate
+unintrigued
+unintriguing
+unintroduced
+unintroducible
+unintroitive
+unintromitted
+unintrospective
+unintruded
+unintruding
+unintrusive
+unintrusively
+unintrusted
+unintuitive
+unintwined
+uninuclear
+uninucleate
+uninucleated
+uninundated
+uninured
+uninurned
+uninvadable
+uninvaded
+uninvaginated
+uninvalidated
+uninveighing
+uninveigled
+uninvented
+uninventful
+uninventibleness
+uninventive
+uninventively
+uninventiveness
+uninverted
+uninvested
+uninvestigable
+uninvestigated
+uninvestigating
+uninvestigative
+uninvidious
+uninvidiously
+uninvigorated
+uninvincible
+uninvite
+uninvited
+uninvitedly
+uninviting
+uninvoiced
+uninvoked
+uninvolved
+uninweaved
+uninwoven
+uninwrapped
+uninwreathed
+Unio
+unio
+uniocular
+unioid
+Uniola
+union
+unioned
+unionic
+unionid
+Unionidae
+unioniform
+unionism
+unionist
+unionistic
+unionization
+unionize
+unionoid
+unioval
+uniovular
+uniovulate
+unipara
+uniparental
+uniparient
+uniparous
+unipartite
+uniped
+unipeltate
+uniperiodic
+unipersonal
+unipersonalist
+unipersonality
+unipetalous
+uniphase
+uniphaser
+uniphonous
+uniplanar
+uniplicate
+unipod
+unipolar
+unipolarity
+uniporous
+unipotence
+unipotent
+unipotential
+unipulse
+uniquantic
+unique
+uniquely
+uniqueness
+uniquity
+uniradial
+uniradiate
+uniradiated
+uniradical
+uniramose
+uniramous
+unirascible
+unireme
+unirenic
+unirhyme
+uniridescent
+unironed
+unironical
+unirradiated
+unirrigated
+unirritable
+unirritant
+unirritated
+unirritatedly
+unirritating
+unisepalous
+uniseptate
+uniserial
+uniserially
+uniseriate
+uniseriately
+uniserrate
+uniserrulate
+unisexed
+unisexual
+unisexuality
+unisexually
+unisilicate
+unisoil
+unisolable
+unisolate
+unisolated
+unisomeric
+unisometrical
+unisomorphic
+unison
+unisonal
+unisonally
+unisonance
+unisonant
+unisonous
+unisotropic
+unisparker
+unispiculate
+unispinose
+unispiral
+unissuable
+unissued
+unistylist
+unisulcate
+unit
+unitage
+unital
+unitalicized
+Unitarian
+unitarian
+Unitarianism
+Unitarianize
+unitarily
+unitariness
+unitarism
+unitarist
+unitary
+unite
+uniteability
+uniteable
+uniteably
+united
+unitedly
+unitedness
+unitemized
+unitentacular
+uniter
+uniting
+unitingly
+unition
+unitism
+unitistic
+unitive
+unitively
+unitiveness
+unitize
+unitooth
+unitrivalent
+unitrope
+unituberculate
+unitude
+unity
+uniunguiculate
+uniungulate
+univalence
+univalency
+univalent
+univalvate
+univalve
+univalvular
+univariant
+univerbal
+universal
+universalia
+Universalian
+Universalism
+universalism
+Universalist
+universalist
+Universalistic
+universalistic
+universality
+universalization
+universalize
+universalizer
+universally
+universalness
+universanimous
+universe
+universeful
+universitarian
+universitarianism
+universitary
+universitize
+university
+universityless
+universitylike
+universityship
+universological
+universologist
+universology
+univied
+univocability
+univocacy
+univocal
+univocalized
+univocally
+univocity
+univoltine
+univorous
+unjacketed
+unjaded
+unjagged
+unjailed
+unjam
+unjapanned
+unjarred
+unjarring
+unjaundiced
+unjaunty
+unjealous
+unjealoused
+unjellied
+unjesting
+unjesuited
+unjesuitical
+unjesuitically
+unjewel
+unjeweled
+unjewelled
+Unjewish
+unjilted
+unjocose
+unjocund
+unjogged
+unjogging
+unjoin
+unjoinable
+unjoint
+unjointed
+unjointedness
+unjointured
+unjoking
+unjokingly
+unjolly
+unjolted
+unjostled
+unjournalized
+unjovial
+unjovially
+unjoyed
+unjoyful
+unjoyfully
+unjoyfulness
+unjoyous
+unjoyously
+unjoyousness
+unjudgable
+unjudge
+unjudged
+unjudgelike
+unjudging
+unjudicable
+unjudicial
+unjudicially
+unjudicious
+unjudiciously
+unjudiciousness
+unjuggled
+unjuiced
+unjuicy
+unjumbled
+unjumpable
+unjust
+unjustice
+unjusticiable
+unjustifiable
+unjustifiableness
+unjustifiably
+unjustified
+unjustifiedly
+unjustifiedness
+unjustify
+unjustled
+unjustly
+unjustness
+unjuvenile
+unkaiserlike
+unkamed
+unked
+unkeeled
+unkembed
+unkempt
+unkemptly
+unkemptness
+unken
+unkenned
+unkennedness
+unkennel
+unkenneled
+unkenning
+unkensome
+unkept
+unkerchiefed
+unket
+unkey
+unkeyed
+unkicked
+unkid
+unkill
+unkillability
+unkillable
+unkilled
+unkilling
+unkilned
+unkin
+unkind
+unkindhearted
+unkindled
+unkindledness
+unkindlily
+unkindliness
+unkindling
+unkindly
+unkindness
+unkindred
+unkindredly
+unking
+unkingdom
+unkinged
+unkinger
+unkinglike
+unkingly
+unkink
+unkinlike
+unkirk
+unkiss
+unkissed
+unkist
+unknave
+unkneaded
+unkneeling
+unknelled
+unknew
+unknight
+unknighted
+unknightlike
+unknit
+unknittable
+unknitted
+unknitting
+unknocked
+unknocking
+unknot
+unknotted
+unknotty
+unknow
+unknowability
+unknowable
+unknowableness
+unknowably
+unknowing
+unknowingly
+unknowingness
+unknowledgeable
+unknown
+unknownly
+unknownness
+unknownst
+unkodaked
+unkoshered
+unlabeled
+unlabialize
+unlabiate
+unlaborable
+unlabored
+unlaboring
+unlaborious
+unlaboriously
+unlaboriousness
+unlace
+unlaced
+unlacerated
+unlackeyed
+unlacquered
+unlade
+unladen
+unladled
+unladyfied
+unladylike
+unlagging
+unlaid
+unlame
+unlamed
+unlamented
+unlampooned
+unlanced
+unland
+unlanded
+unlandmarked
+unlanguaged
+unlanguid
+unlanguishing
+unlanterned
+unlap
+unlapped
+unlapsed
+unlapsing
+unlarded
+unlarge
+unlash
+unlashed
+unlasher
+unlassoed
+unlasting
+unlatch
+unlath
+unlathed
+unlathered
+unlatinized
+unlatticed
+unlaudable
+unlaudableness
+unlaudably
+unlauded
+unlaugh
+unlaughing
+unlaunched
+unlaundered
+unlaureled
+unlaved
+unlaving
+unlavish
+unlavished
+unlaw
+unlawed
+unlawful
+unlawfully
+unlawfulness
+unlawlearned
+unlawlike
+unlawly
+unlawyered
+unlawyerlike
+unlay
+unlayable
+unleached
+unlead
+unleaded
+unleaderly
+unleaf
+unleafed
+unleagued
+unleaguer
+unleakable
+unleaky
+unleal
+unlean
+unleared
+unlearn
+unlearnability
+unlearnable
+unlearnableness
+unlearned
+unlearnedly
+unlearnedness
+unlearning
+unlearnt
+unleasable
+unleased
+unleash
+unleashed
+unleathered
+unleave
+unleaved
+unleavenable
+unleavened
+unlectured
+unled
+unleft
+unlegacied
+unlegal
+unlegalized
+unlegally
+unlegalness
+unlegate
+unlegislative
+unleisured
+unleisuredness
+unleisurely
+unlenient
+unlensed
+unlent
+unless
+unlessened
+unlessoned
+unlet
+unlettable
+unletted
+unlettered
+unletteredly
+unletteredness
+unlettering
+unletterlike
+unlevel
+unleveled
+unlevelly
+unlevelness
+unlevied
+unlevigated
+unlexicographical
+unliability
+unliable
+unlibeled
+unliberal
+unliberalized
+unliberated
+unlibidinous
+unlicensed
+unlicentiated
+unlicentious
+unlichened
+unlickable
+unlicked
+unlid
+unlidded
+unlie
+unlifelike
+unliftable
+unlifted
+unlifting
+unligable
+unligatured
+unlight
+unlighted
+unlightedly
+unlightedness
+unlightened
+unlignified
+unlikable
+unlikableness
+unlikably
+unlike
+unlikeable
+unlikeableness
+unlikeably
+unliked
+unlikelihood
+unlikeliness
+unlikely
+unliken
+unlikeness
+unliking
+unlimb
+unlimber
+unlime
+unlimed
+unlimitable
+unlimitableness
+unlimitably
+unlimited
+unlimitedly
+unlimitedness
+unlimitless
+unlimned
+unlimp
+unline
+unlineal
+unlined
+unlingering
+unlink
+unlinked
+unlionlike
+unliquefiable
+unliquefied
+unliquid
+unliquidatable
+unliquidated
+unliquidating
+unliquidation
+unliquored
+unlisping
+unlist
+unlisted
+unlistened
+unlistening
+unlisty
+unlit
+unliteral
+unliterally
+unliteralness
+unliterary
+unliterate
+unlitigated
+unlitten
+unlittered
+unliturgical
+unliturgize
+unlivable
+unlivableness
+unlivably
+unlive
+unliveable
+unliveableness
+unliveably
+unliveliness
+unlively
+unliveried
+unlivery
+unliving
+unlizardlike
+unload
+unloaded
+unloaden
+unloader
+unloafing
+unloanably
+unloaned
+unloaning
+unloath
+unloathed
+unloathful
+unloathly
+unloathsome
+unlobed
+unlocal
+unlocalizable
+unlocalize
+unlocalized
+unlocally
+unlocated
+unlock
+unlockable
+unlocked
+unlocker
+unlocking
+unlocomotive
+unlodge
+unlodged
+unlofty
+unlogged
+unlogic
+unlogical
+unlogically
+unlogicalness
+unlonely
+unlook
+unlooked
+unloop
+unlooped
+unloosable
+unloosably
+unloose
+unloosen
+unloosening
+unloosing
+unlooted
+unlopped
+unloquacious
+unlord
+unlorded
+unlordly
+unlosable
+unlosableness
+unlost
+unlotted
+unlousy
+unlovable
+unlovableness
+unlovably
+unlove
+unloveable
+unloveableness
+unloveably
+unloved
+unlovelily
+unloveliness
+unlovely
+unloverlike
+unloverly
+unloving
+unlovingly
+unlovingness
+unlowered
+unlowly
+unloyal
+unloyally
+unloyalty
+unlubricated
+unlucent
+unlucid
+unluck
+unluckful
+unluckily
+unluckiness
+unlucky
+unlucrative
+unludicrous
+unluffed
+unlugged
+unlugubrious
+unluminous
+unlumped
+unlunar
+unlured
+unlust
+unlustily
+unlustiness
+unlustrous
+unlusty
+unlute
+unluted
+unluxated
+unluxuriant
+unluxurious
+unlycanthropize
+unlying
+unlyrical
+unlyrically
+unmacadamized
+unmacerated
+unmachinable
+unmackly
+unmad
+unmadded
+unmaddened
+unmade
+unmagic
+unmagical
+unmagisterial
+unmagistratelike
+unmagnanimous
+unmagnetic
+unmagnetical
+unmagnetized
+unmagnified
+unmagnify
+unmaid
+unmaidenlike
+unmaidenliness
+unmaidenly
+unmail
+unmailable
+unmailableness
+unmailed
+unmaimable
+unmaimed
+unmaintainable
+unmaintained
+unmajestic
+unmakable
+unmake
+unmaker
+unmalevolent
+unmalicious
+unmalignant
+unmaligned
+unmalleability
+unmalleable
+unmalleableness
+unmalled
+unmaltable
+unmalted
+unmammalian
+unmammonized
+unman
+unmanacle
+unmanacled
+unmanageable
+unmanageableness
+unmanageably
+unmanaged
+unmancipated
+unmandated
+unmanducated
+unmaned
+unmaneged
+unmanful
+unmanfully
+unmangled
+unmaniable
+unmaniac
+unmaniacal
+unmanicured
+unmanifest
+unmanifested
+unmanipulatable
+unmanipulated
+unmanlike
+unmanlily
+unmanliness
+unmanly
+unmanned
+unmanner
+unmannered
+unmanneredly
+unmannerliness
+unmannerly
+unmannish
+unmanored
+unmantle
+unmantled
+unmanufacturable
+unmanufactured
+unmanumissible
+unmanumitted
+unmanurable
+unmanured
+unmappable
+unmapped
+unmarbled
+unmarch
+unmarching
+unmarginal
+unmarginated
+unmarine
+unmaritime
+unmarkable
+unmarked
+unmarketable
+unmarketed
+unmarled
+unmarred
+unmarriable
+unmarriageability
+unmarriageable
+unmarried
+unmarring
+unmarry
+unmarrying
+unmarshaled
+unmartial
+unmartyr
+unmartyred
+unmarvelous
+unmasculine
+unmashed
+unmask
+unmasked
+unmasker
+unmasking
+unmasquerade
+unmassacred
+unmassed
+unmast
+unmaster
+unmasterable
+unmastered
+unmasterful
+unmasticable
+unmasticated
+unmatchable
+unmatchableness
+unmatchably
+unmatched
+unmatchedness
+unmate
+unmated
+unmaterial
+unmaterialistic
+unmateriate
+unmaternal
+unmathematical
+unmathematically
+unmating
+unmatriculated
+unmatrimonial
+unmatronlike
+unmatted
+unmature
+unmatured
+unmaturely
+unmatureness
+unmaturing
+unmaturity
+unmauled
+unmaze
+unmeaning
+unmeaningly
+unmeaningness
+unmeant
+unmeasurable
+unmeasurableness
+unmeasurably
+unmeasured
+unmeasuredly
+unmeasuredness
+unmeated
+unmechanic
+unmechanical
+unmechanically
+unmechanistic
+unmechanize
+unmechanized
+unmedaled
+unmedalled
+unmeddle
+unmeddled
+unmeddlesome
+unmeddling
+unmeddlingly
+unmeddlingness
+unmediaeval
+unmediated
+unmediatized
+unmedicable
+unmedical
+unmedicated
+unmedicative
+unmedicinable
+unmedicinal
+unmeditated
+unmeditative
+unmediumistic
+unmedullated
+unmeek
+unmeekly
+unmeekness
+unmeet
+unmeetable
+unmeetly
+unmeetness
+unmelancholy
+unmeliorated
+unmellow
+unmellowed
+unmelodic
+unmelodious
+unmelodiously
+unmelodiousness
+unmelodized
+unmelodramatic
+unmeltable
+unmeltableness
+unmeltably
+unmelted
+unmeltedness
+unmelting
+unmember
+unmemoired
+unmemorable
+unmemorialized
+unmemoried
+unmemorized
+unmenaced
+unmenacing
+unmendable
+unmendableness
+unmendably
+unmendacious
+unmended
+unmenial
+unmenseful
+unmenstruating
+unmensurable
+unmental
+unmentionability
+unmentionable
+unmentionableness
+unmentionables
+unmentionably
+unmentioned
+unmercantile
+unmercenariness
+unmercenary
+unmercerized
+unmerchantable
+unmerchantlike
+unmerchantly
+unmerciful
+unmercifully
+unmercifulness
+unmercurial
+unmeretricious
+unmerge
+unmerged
+unmeridional
+unmerited
+unmeritedly
+unmeritedness
+unmeriting
+unmeritorious
+unmeritoriously
+unmeritoriousness
+unmerry
+unmesh
+unmesmeric
+unmesmerize
+unmesmerized
+unmet
+unmetaled
+unmetalized
+unmetalled
+unmetallic
+unmetallurgical
+unmetamorphosed
+unmetaphorical
+unmetaphysic
+unmetaphysical
+unmeted
+unmeteorological
+unmetered
+unmethodical
+unmethodically
+unmethodicalness
+unmethodized
+unmethodizing
+unmethylated
+unmeticulous
+unmetric
+unmetrical
+unmetrically
+unmetricalness
+unmetropolitan
+unmettle
+unmew
+unmewed
+unmicaceous
+unmicrobic
+unmicroscopic
+unmidwifed
+unmighty
+unmigrating
+unmildewed
+unmilitant
+unmilitarily
+unmilitariness
+unmilitaristic
+unmilitarized
+unmilitary
+unmilked
+unmilled
+unmillinered
+unmilted
+unmimicked
+unminable
+unminced
+unmincing
+unmind
+unminded
+unmindful
+unmindfully
+unmindfulness
+unminding
+unmined
+unmineralized
+unmingle
+unmingleable
+unmingled
+unmingling
+unminimized
+unminished
+unminister
+unministered
+unministerial
+unministerially
+unminted
+unminuted
+unmiracled
+unmiraculous
+unmiraculously
+unmired
+unmirrored
+unmirthful
+unmirthfully
+unmirthfulness
+unmiry
+unmisanthropic
+unmiscarrying
+unmischievous
+unmiscible
+unmisconceivable
+unmiserly
+unmisgiving
+unmisgivingly
+unmisguided
+unmisinterpretable
+unmisled
+unmissable
+unmissed
+unmissionary
+unmissionized
+unmist
+unmistakable
+unmistakableness
+unmistakably
+unmistakedly
+unmistaken
+unmistakingly
+unmistressed
+unmistrusted
+unmistrustful
+unmistrusting
+unmisunderstandable
+unmisunderstanding
+unmisunderstood
+unmiter
+unmitigable
+unmitigated
+unmitigatedly
+unmitigatedness
+unmitigative
+unmittened
+unmix
+unmixable
+unmixableness
+unmixed
+unmixedly
+unmixedness
+unmoaned
+unmoated
+unmobbed
+unmobilized
+unmocked
+unmocking
+unmockingly
+unmodel
+unmodeled
+unmodelled
+unmoderate
+unmoderately
+unmoderateness
+unmoderating
+unmodern
+unmodernity
+unmodernize
+unmodernized
+unmodest
+unmodifiable
+unmodifiableness
+unmodifiably
+unmodified
+unmodifiedness
+unmodish
+unmodulated
+unmoiled
+unmoist
+unmoisten
+unmold
+unmoldable
+unmolded
+unmoldered
+unmoldering
+unmoldy
+unmolested
+unmolestedly
+unmolesting
+unmollifiable
+unmollifiably
+unmollified
+unmollifying
+unmolten
+unmomentary
+unmomentous
+unmomentously
+unmonarch
+unmonarchical
+unmonastic
+unmonetary
+unmoneyed
+unmonistic
+unmonitored
+unmonkish
+unmonkly
+unmonopolize
+unmonopolized
+unmonopolizing
+unmonotonous
+unmonumented
+unmoor
+unmoored
+unmooted
+unmopped
+unmoral
+unmoralist
+unmorality
+unmoralize
+unmoralized
+unmoralizing
+unmorally
+unmoralness
+unmorbid
+unmordanted
+unmoribund
+unmorose
+unmorphological
+unmortal
+unmortared
+unmortgage
+unmortgageable
+unmortgaged
+unmortified
+unmortifiedly
+unmortifiedness
+unmortise
+unmortised
+unmossed
+unmothered
+unmotherly
+unmotionable
+unmotivated
+unmotivatedly
+unmotivatedness
+unmotived
+unmotorized
+unmottled
+unmounded
+unmount
+unmountable
+unmountainous
+unmounted
+unmounting
+unmourned
+unmournful
+unmourning
+unmouthable
+unmouthed
+unmouthpieced
+unmovability
+unmovable
+unmovableness
+unmovably
+unmoved
+unmovedly
+unmoving
+unmovingly
+unmovingness
+unmowed
+unmown
+unmucilaged
+unmudded
+unmuddied
+unmuddle
+unmuddled
+unmuddy
+unmuffle
+unmuffled
+unmulcted
+unmulish
+unmulled
+unmullioned
+unmultipliable
+unmultiplied
+unmultipliedly
+unmultiply
+unmummied
+unmummify
+unmunched
+unmundane
+unmundified
+unmunicipalized
+unmunificent
+unmunitioned
+unmurmured
+unmurmuring
+unmurmuringly
+unmurmurous
+unmuscled
+unmuscular
+unmusical
+unmusicality
+unmusically
+unmusicalness
+unmusicianly
+unmusked
+unmussed
+unmusted
+unmusterable
+unmustered
+unmutated
+unmutation
+unmuted
+unmutilated
+unmutinous
+unmuttered
+unmutual
+unmutualized
+unmuzzle
+unmuzzled
+unmuzzling
+unmyelinated
+unmysterious
+unmysteriously
+unmystery
+unmystical
+unmysticize
+unmystified
+unmythical
+unnabbed
+unnagged
+unnagging
+unnail
+unnailed
+unnaked
+unnamability
+unnamable
+unnamableness
+unnamably
+unname
+unnameability
+unnameable
+unnameableness
+unnameably
+unnamed
+unnapkined
+unnapped
+unnarcotic
+unnarrated
+unnarrow
+unnation
+unnational
+unnationalized
+unnative
+unnatural
+unnaturalism
+unnaturalist
+unnaturalistic
+unnaturality
+unnaturalizable
+unnaturalize
+unnaturalized
+unnaturally
+unnaturalness
+unnature
+unnautical
+unnavigability
+unnavigable
+unnavigableness
+unnavigably
+unnavigated
+unneaped
+unnearable
+unneared
+unnearly
+unnearness
+unneat
+unneatly
+unneatness
+unnebulous
+unnecessarily
+unnecessariness
+unnecessary
+unnecessitated
+unnecessitating
+unnecessity
+unneeded
+unneedful
+unneedfully
+unneedfulness
+unneedy
+unnefarious
+unnegated
+unneglected
+unnegligent
+unnegotiable
+unnegotiableness
+unnegotiably
+unnegotiated
+unnegro
+unneighbored
+unneighborlike
+unneighborliness
+unneighborly
+unnephritic
+unnerve
+unnerved
+unnervous
+unnest
+unnestle
+unnestled
+unneth
+unnethe
+unnethes
+unnethis
+unnetted
+unnettled
+unneurotic
+unneutral
+unneutralized
+unneutrally
+unnew
+unnewly
+unnewness
+unnibbed
+unnibbied
+unnice
+unnicely
+unniceness
+unniched
+unnicked
+unnickeled
+unnickelled
+unnicknamed
+unniggard
+unniggardly
+unnigh
+unnimbed
+unnimble
+unnimbleness
+unnimbly
+unnipped
+unnitrogenized
+unnobilitated
+unnobility
+unnoble
+unnobleness
+unnobly
+unnoised
+unnomadic
+unnominated
+unnonsensical
+unnoosed
+unnormal
+unnorthern
+unnose
+unnosed
+unnotable
+unnotched
+unnoted
+unnoteworthy
+unnoticeable
+unnoticeableness
+unnoticeably
+unnoticed
+unnoticing
+unnotified
+unnotify
+unnoting
+unnourishable
+unnourished
+unnourishing
+unnovel
+unnovercal
+unnucleated
+unnullified
+unnumberable
+unnumberableness
+unnumberably
+unnumbered
+unnumberedness
+unnumerical
+unnumerous
+unnurtured
+unnutritious
+unnutritive
+unnuzzled
+unnymphlike
+unoared
+unobdurate
+unobedience
+unobedient
+unobediently
+unobese
+unobeyed
+unobeying
+unobjected
+unobjectionable
+unobjectionableness
+unobjectionably
+unobjectional
+unobjective
+unobligated
+unobligatory
+unobliged
+unobliging
+unobligingly
+unobligingness
+unobliterable
+unobliterated
+unoblivious
+unobnoxious
+unobscene
+unobscure
+unobscured
+unobsequious
+unobsequiously
+unobsequiousness
+unobservable
+unobservance
+unobservant
+unobservantly
+unobservantness
+unobserved
+unobservedly
+unobserving
+unobservingly
+unobsessed
+unobsolete
+unobstinate
+unobstruct
+unobstructed
+unobstructedly
+unobstructedness
+unobstructive
+unobstruent
+unobtainable
+unobtainableness
+unobtainably
+unobtained
+unobtruded
+unobtruding
+unobtrusive
+unobtrusively
+unobtrusiveness
+unobtunded
+unobumbrated
+unobverted
+unobviated
+unobvious
+unoccasional
+unoccasioned
+unoccidental
+unoccluded
+unoccupancy
+unoccupation
+unoccupied
+unoccupiedly
+unoccupiedness
+unoccurring
+unoceanic
+unocular
+unode
+unodious
+unodoriferous
+unoecumenic
+unoecumenical
+unoffendable
+unoffended
+unoffendedly
+unoffender
+unoffending
+unoffendingly
+unoffensive
+unoffensively
+unoffensiveness
+unoffered
+unofficed
+unofficered
+unofficerlike
+unofficial
+unofficialdom
+unofficially
+unofficialness
+unofficiating
+unofficinal
+unofficious
+unofficiously
+unofficiousness
+unoffset
+unoften
+unogled
+unoil
+unoiled
+unoiling
+unoily
+unold
+unomened
+unominous
+unomitted
+unomnipotent
+unomniscient
+Unona
+unonerous
+unontological
+unopaque
+unoped
+unopen
+unopenable
+unopened
+unopening
+unopenly
+unopenness
+unoperably
+unoperated
+unoperatic
+unoperating
+unoperative
+unoperculate
+unoperculated
+unopined
+unopinionated
+unoppignorated
+unopportune
+unopportunely
+unopportuneness
+unopposable
+unopposed
+unopposedly
+unopposedness
+unopposite
+unoppressed
+unoppressive
+unoppressively
+unoppressiveness
+unopprobrious
+unoppugned
+unopulence
+unopulent
+unoratorial
+unoratorical
+unorbed
+unorbital
+unorchestrated
+unordain
+unordainable
+unordained
+unorder
+unorderable
+unordered
+unorderly
+unordinarily
+unordinariness
+unordinary
+unordinate
+unordinately
+unordinateness
+unordnanced
+unorganic
+unorganical
+unorganically
+unorganicalness
+unorganizable
+unorganized
+unorganizedly
+unorganizedness
+unoriental
+unorientalness
+unoriented
+unoriginal
+unoriginality
+unoriginally
+unoriginalness
+unoriginate
+unoriginated
+unoriginatedness
+unoriginately
+unoriginateness
+unorigination
+unoriginative
+unoriginatively
+unoriginativeness
+unorn
+unornamental
+unornamentally
+unornamentalness
+unornamented
+unornate
+unornithological
+unornly
+unorphaned
+unorthodox
+unorthodoxically
+unorthodoxly
+unorthodoxness
+unorthodoxy
+unorthographical
+unorthographically
+unoscillating
+unosculated
+unossified
+unostensible
+unostentation
+unostentatious
+unostentatiously
+unostentatiousness
+unoutgrown
+unoutlawed
+unoutraged
+unoutspeakable
+unoutspoken
+unoutworn
+unoverclouded
+unovercome
+unoverdone
+unoverdrawn
+unoverflowing
+unoverhauled
+unoverleaped
+unoverlooked
+unoverpaid
+unoverpowered
+unoverruled
+unovert
+unovertaken
+unoverthrown
+unovervalued
+unoverwhelmed
+unowed
+unowing
+unown
+unowned
+unoxidable
+unoxidated
+unoxidizable
+unoxidized
+unoxygenated
+unoxygenized
+unpacable
+unpaced
+unpacifiable
+unpacific
+unpacified
+unpacifiedly
+unpacifiedness
+unpacifist
+unpack
+unpacked
+unpacker
+unpadded
+unpadlocked
+unpagan
+unpaganize
+unpaged
+unpaginal
+unpaid
+unpained
+unpainful
+unpaining
+unpainstaking
+unpaint
+unpaintability
+unpaintable
+unpaintableness
+unpaintably
+unpainted
+unpaintedly
+unpaintedness
+unpaired
+unpalatability
+unpalatable
+unpalatableness
+unpalatably
+unpalatal
+unpalatial
+unpale
+unpaled
+unpalisaded
+unpalisadoed
+unpalled
+unpalliable
+unpalliated
+unpalpable
+unpalped
+unpalpitating
+unpalsied
+unpampered
+unpanegyrized
+unpanel
+unpaneled
+unpanelled
+unpanged
+unpanniered
+unpanoplied
+unpantheistic
+unpanting
+unpapal
+unpapaverous
+unpaper
+unpapered
+unparaded
+unparadise
+unparadox
+unparagoned
+unparagonized
+unparagraphed
+unparallel
+unparallelable
+unparalleled
+unparalleledly
+unparalleledness
+unparallelness
+unparalyzed
+unparaphrased
+unparasitical
+unparcel
+unparceled
+unparceling
+unparcelled
+unparcelling
+unparch
+unparched
+unparching
+unpardon
+unpardonable
+unpardonableness
+unpardonably
+unpardoned
+unpardonedness
+unpardoning
+unpared
+unparented
+unparfit
+unpargeted
+unpark
+unparked
+unparking
+unparliamentary
+unparliamented
+unparodied
+unparrel
+unparriable
+unparried
+unparroted
+unparrying
+unparsed
+unparsimonious
+unparsonic
+unparsonical
+unpartable
+unpartableness
+unpartably
+unpartaken
+unpartaking
+unparted
+unpartial
+unpartiality
+unpartially
+unpartialness
+unparticipant
+unparticipated
+unparticipating
+unparticipative
+unparticular
+unparticularized
+unparticularizing
+unpartisan
+unpartitioned
+unpartizan
+unpartnered
+unpartook
+unparty
+unpass
+unpassable
+unpassableness
+unpassably
+unpassed
+unpassing
+unpassionate
+unpassionately
+unpassionateness
+unpassioned
+unpassive
+unpaste
+unpasted
+unpasteurized
+unpasting
+unpastor
+unpastoral
+unpastured
+unpatched
+unpatent
+unpatentable
+unpatented
+unpaternal
+unpathed
+unpathetic
+unpathwayed
+unpatient
+unpatiently
+unpatientness
+unpatriarchal
+unpatrician
+unpatriotic
+unpatriotically
+unpatriotism
+unpatristic
+unpatrolled
+unpatronizable
+unpatronized
+unpatronizing
+unpatted
+unpatterned
+unpaunch
+unpaunched
+unpauperized
+unpausing
+unpausingly
+unpave
+unpaved
+unpavilioned
+unpaving
+unpawed
+unpawn
+unpawned
+unpayable
+unpayableness
+unpayably
+unpaying
+unpayment
+unpeace
+unpeaceable
+unpeaceableness
+unpeaceably
+unpeaceful
+unpeacefully
+unpeacefulness
+unpealed
+unpearled
+unpebbled
+unpeccable
+unpecked
+unpecuniarily
+unpedagogical
+unpedantic
+unpeddled
+unpedestal
+unpedigreed
+unpeel
+unpeelable
+unpeelableness
+unpeeled
+unpeerable
+unpeered
+unpeg
+unpejorative
+unpelagic
+unpelted
+unpen
+unpenal
+unpenalized
+unpenanced
+unpenciled
+unpencilled
+unpenetrable
+unpenetrated
+unpenetrating
+unpenitent
+unpenitently
+unpenitentness
+unpenned
+unpennied
+unpennoned
+unpensionable
+unpensionableness
+unpensioned
+unpensioning
+unpent
+unpenurious
+unpeople
+unpeopled
+unpeopling
+unperceived
+unperceivedly
+unperceptible
+unperceptibly
+unperceptive
+unperch
+unperched
+unpercipient
+unpercolated
+unpercussed
+unperfect
+unperfected
+unperfectedly
+unperfectedness
+unperfectly
+unperfectness
+unperfidious
+unperflated
+unperforate
+unperforated
+unperformable
+unperformance
+unperformed
+unperforming
+unperfumed
+unperilous
+unperiodic
+unperiodical
+unperiphrased
+unperishable
+unperishableness
+unperishably
+unperished
+unperishing
+unperjured
+unpermanency
+unpermanent
+unpermanently
+unpermeable
+unpermeated
+unpermissible
+unpermissive
+unpermitted
+unpermitting
+unpermixed
+unpernicious
+unperpendicular
+unperpetrated
+unperpetuated
+unperplex
+unperplexed
+unperplexing
+unpersecuted
+unpersecutive
+unperseverance
+unpersevering
+unperseveringly
+unperseveringness
+unpersonable
+unpersonableness
+unpersonal
+unpersonality
+unpersonified
+unpersonify
+unperspicuous
+unperspirable
+unperspiring
+unpersuadable
+unpersuadableness
+unpersuadably
+unpersuaded
+unpersuadedness
+unpersuasibleness
+unpersuasion
+unpersuasive
+unpersuasively
+unpersuasiveness
+unpertaining
+unpertinent
+unpertinently
+unperturbed
+unperturbedly
+unperturbedness
+unperuked
+unperused
+unpervaded
+unperverse
+unpervert
+unperverted
+unpervious
+unpessimistic
+unpestered
+unpestilential
+unpetal
+unpetitioned
+unpetrified
+unpetrify
+unpetticoated
+unpetulant
+unpharasaic
+unpharasaical
+unphased
+unphenomenal
+unphilanthropic
+unphilanthropically
+unphilological
+unphilosophic
+unphilosophically
+unphilosophicalness
+unphilosophize
+unphilosophized
+unphilosophy
+unphlegmatic
+unphonetic
+unphoneticness
+unphonographed
+unphosphatized
+unphotographed
+unphrasable
+unphrasableness
+unphrased
+unphrenological
+unphysical
+unphysically
+unphysicianlike
+unphysicked
+unphysiological
+unpicaresque
+unpick
+unpickable
+unpicked
+unpicketed
+unpickled
+unpictorial
+unpictorially
+unpicturability
+unpicturable
+unpictured
+unpicturesque
+unpicturesquely
+unpicturesqueness
+unpiece
+unpieced
+unpierceable
+unpierced
+unpiercing
+unpiety
+unpigmented
+unpile
+unpiled
+unpilfered
+unpilgrimlike
+unpillaged
+unpillared
+unpilled
+unpilloried
+unpillowed
+unpiloted
+unpimpled
+unpin
+unpinched
+unpining
+unpinion
+unpinioned
+unpinked
+unpinned
+unpious
+unpiped
+unpiqued
+unpirated
+unpitched
+unpiteous
+unpiteously
+unpiteousness
+unpitiable
+unpitiably
+unpitied
+unpitiedly
+unpitiedness
+unpitiful
+unpitifully
+unpitifulness
+unpitted
+unpitying
+unpityingly
+unpityingness
+unplacable
+unplacably
+unplacated
+unplace
+unplaced
+unplacid
+unplagiarized
+unplagued
+unplaid
+unplain
+unplained
+unplainly
+unplainness
+unplait
+unplaited
+unplan
+unplaned
+unplanished
+unplank
+unplanked
+unplanned
+unplannedly
+unplannedness
+unplant
+unplantable
+unplanted
+unplantlike
+unplashed
+unplaster
+unplastered
+unplastic
+unplat
+unplated
+unplatted
+unplausible
+unplausibleness
+unplausibly
+unplayable
+unplayed
+unplayful
+unplaying
+unpleached
+unpleadable
+unpleaded
+unpleading
+unpleasable
+unpleasant
+unpleasantish
+unpleasantly
+unpleasantness
+unpleasantry
+unpleased
+unpleasing
+unpleasingly
+unpleasingness
+unpleasurable
+unpleasurably
+unpleasure
+unpleat
+unpleated
+unplebeian
+unpledged
+unplenished
+unplenteous
+unplentiful
+unplentifulness
+unpliable
+unpliableness
+unpliably
+unpliancy
+unpliant
+unpliantly
+unplied
+unplighted
+unplodding
+unplotted
+unplotting
+unplough
+unploughed
+unplow
+unplowed
+unplucked
+unplug
+unplugged
+unplugging
+unplumb
+unplumbed
+unplume
+unplumed
+unplummeted
+unplump
+unplundered
+unplunge
+unplunged
+unplutocratic
+unplutocratically
+unpoached
+unpocket
+unpocketed
+unpodded
+unpoetic
+unpoetically
+unpoeticalness
+unpoeticized
+unpoetize
+unpoetized
+unpoignard
+unpointed
+unpointing
+unpoise
+unpoised
+unpoison
+unpoisonable
+unpoisoned
+unpoisonous
+unpolarizable
+unpolarized
+unpoled
+unpolemical
+unpolemically
+unpoliced
+unpolicied
+unpolish
+unpolishable
+unpolished
+unpolishedness
+unpolite
+unpolitely
+unpoliteness
+unpolitic
+unpolitical
+unpolitically
+unpoliticly
+unpollarded
+unpolled
+unpollutable
+unpolluted
+unpollutedly
+unpolluting
+unpolymerized
+unpompous
+unpondered
+unpontifical
+unpooled
+unpope
+unpopular
+unpopularity
+unpopularize
+unpopularly
+unpopularness
+unpopulate
+unpopulated
+unpopulous
+unpopulousness
+unporous
+unportable
+unportended
+unportentous
+unportioned
+unportly
+unportmanteaued
+unportraited
+unportrayable
+unportrayed
+unportuous
+unposed
+unposing
+unpositive
+unpossessable
+unpossessed
+unpossessedness
+unpossessing
+unpossibility
+unpossible
+unpossibleness
+unpossibly
+unposted
+unpostered
+unposthumous
+unpostmarked
+unpostponable
+unpostponed
+unpostulated
+unpot
+unpotted
+unpouched
+unpoulticed
+unpounced
+unpounded
+unpoured
+unpowdered
+unpower
+unpowerful
+unpowerfulness
+unpracticability
+unpracticable
+unpracticableness
+unpracticably
+unpractical
+unpracticality
+unpractically
+unpracticalness
+unpractice
+unpracticed
+unpragmatical
+unpraisable
+unpraise
+unpraised
+unpraiseful
+unpraiseworthy
+unpranked
+unpray
+unprayable
+unprayed
+unprayerful
+unpraying
+unpreach
+unpreached
+unpreaching
+unprecarious
+unprecautioned
+unpreceded
+unprecedented
+unprecedentedly
+unprecedentedness
+unprecedential
+unprecedently
+unprecious
+unprecipitate
+unprecipitated
+unprecise
+unprecisely
+unpreciseness
+unprecluded
+unprecludible
+unprecocious
+unpredacious
+unpredestinated
+unpredestined
+unpredicable
+unpredicated
+unpredict
+unpredictable
+unpredictableness
+unpredictably
+unpredicted
+unpredictedness
+unpredicting
+unpredisposed
+unpredisposing
+unpreened
+unprefaced
+unpreferable
+unpreferred
+unprefigured
+unprefined
+unprefixed
+unpregnant
+unprejudged
+unprejudicated
+unprejudice
+unprejudiced
+unprejudicedly
+unprejudicedness
+unprejudiciable
+unprejudicial
+unprejudicially
+unprejudicialness
+unprelatic
+unprelatical
+unpreluded
+unpremature
+unpremeditate
+unpremeditated
+unpremeditatedly
+unpremeditatedness
+unpremeditately
+unpremeditation
+unpremonished
+unpremonstrated
+unprenominated
+unprenticed
+unpreoccupied
+unpreordained
+unpreparation
+unprepare
+unprepared
+unpreparedly
+unpreparedness
+unpreparing
+unpreponderated
+unpreponderating
+unprepossessedly
+unprepossessing
+unprepossessingly
+unprepossessingness
+unpreposterous
+unpresaged
+unpresageful
+unpresaging
+unpresbyterated
+unprescient
+unprescinded
+unprescribed
+unpresentability
+unpresentable
+unpresentableness
+unpresentably
+unpresented
+unpreservable
+unpreserved
+unpresidential
+unpresiding
+unpressed
+unpresumable
+unpresumed
+unpresuming
+unpresumingness
+unpresumptuous
+unpresumptuously
+unpresupposed
+unpretended
+unpretending
+unpretendingly
+unpretendingness
+unpretentious
+unpretentiously
+unpretentiousness
+unpretermitted
+unpreternatural
+unprettiness
+unpretty
+unprevailing
+unprevalent
+unprevaricating
+unpreventable
+unpreventableness
+unpreventably
+unprevented
+unpreventible
+unpreventive
+unpriceably
+unpriced
+unpricked
+unprickled
+unprickly
+unpriest
+unpriestlike
+unpriestly
+unpriggish
+unprim
+unprime
+unprimed
+unprimitive
+unprimmed
+unprince
+unprincelike
+unprinceliness
+unprincely
+unprincess
+unprincipal
+unprinciple
+unprincipled
+unprincipledly
+unprincipledness
+unprint
+unprintable
+unprintableness
+unprintably
+unprinted
+unpriority
+unprismatic
+unprison
+unprisonable
+unprisoned
+unprivate
+unprivileged
+unprizable
+unprized
+unprobated
+unprobationary
+unprobed
+unprobity
+unproblematic
+unproblematical
+unprocessed
+unproclaimed
+unprocrastinated
+unprocreant
+unprocreated
+unproctored
+unprocurable
+unprocurableness
+unprocure
+unprocured
+unproded
+unproduceable
+unproduceableness
+unproduceably
+unproduced
+unproducedness
+unproducible
+unproducibleness
+unproducibly
+unproductive
+unproductively
+unproductiveness
+unproductivity
+unprofanable
+unprofane
+unprofaned
+unprofessed
+unprofessing
+unprofessional
+unprofessionalism
+unprofessionally
+unprofessorial
+unproffered
+unproficiency
+unproficient
+unproficiently
+unprofit
+unprofitable
+unprofitableness
+unprofitably
+unprofited
+unprofiteering
+unprofiting
+unprofound
+unprofuse
+unprofusely
+unprofuseness
+unprognosticated
+unprogressed
+unprogressive
+unprogressively
+unprogressiveness
+unprohibited
+unprohibitedness
+unprohibitive
+unprojected
+unprojecting
+unproliferous
+unprolific
+unprolix
+unprologued
+unprolonged
+unpromiscuous
+unpromise
+unpromised
+unpromising
+unpromisingly
+unpromisingness
+unpromotable
+unpromoted
+unprompted
+unpromptly
+unpromulgated
+unpronounce
+unpronounceable
+unpronounced
+unpronouncing
+unproofread
+unprop
+unpropagated
+unpropelled
+unpropense
+unproper
+unproperly
+unproperness
+unpropertied
+unprophesiable
+unprophesied
+unprophetic
+unprophetical
+unprophetically
+unprophetlike
+unpropitiable
+unpropitiated
+unpropitiatedness
+unpropitiatory
+unpropitious
+unpropitiously
+unpropitiousness
+unproportion
+unproportionable
+unproportionableness
+unproportionably
+unproportional
+unproportionality
+unproportionally
+unproportionate
+unproportionately
+unproportionateness
+unproportioned
+unproportionedly
+unproportionedness
+unproposed
+unproposing
+unpropounded
+unpropped
+unpropriety
+unprorogued
+unprosaic
+unproscribable
+unproscribed
+unprosecutable
+unprosecuted
+unprosecuting
+unproselyte
+unproselyted
+unprosodic
+unprospected
+unprospective
+unprosperably
+unprospered
+unprosperity
+unprosperous
+unprosperously
+unprosperousness
+unprostitute
+unprostituted
+unprostrated
+unprotectable
+unprotected
+unprotectedly
+unprotectedness
+unprotective
+unprotestant
+unprotestantize
+unprotested
+unprotesting
+unprotruded
+unprotruding
+unprotrusive
+unproud
+unprovability
+unprovable
+unprovableness
+unprovably
+unproved
+unprovedness
+unproven
+unproverbial
+unprovidable
+unprovide
+unprovided
+unprovidedly
+unprovidedness
+unprovidenced
+unprovident
+unprovidential
+unprovidently
+unprovincial
+unproving
+unprovision
+unprovisioned
+unprovocative
+unprovokable
+unprovoke
+unprovoked
+unprovokedly
+unprovokedness
+unprovoking
+unproximity
+unprudence
+unprudent
+unprudently
+unpruned
+unprying
+unpsychic
+unpsychological
+unpublic
+unpublicity
+unpublishable
+unpublishableness
+unpublishably
+unpublished
+unpucker
+unpuckered
+unpuddled
+unpuffed
+unpuffing
+unpugilistic
+unpugnacious
+unpulled
+unpulleyed
+unpulped
+unpulverable
+unpulverize
+unpulverized
+unpulvinate
+unpulvinated
+unpumicated
+unpummeled
+unpummelled
+unpumpable
+unpumped
+unpunched
+unpunctated
+unpunctilious
+unpunctual
+unpunctuality
+unpunctually
+unpunctuated
+unpunctuating
+unpunishable
+unpunishably
+unpunished
+unpunishedly
+unpunishedness
+unpunishing
+unpunishingly
+unpurchasable
+unpurchased
+unpure
+unpurely
+unpureness
+unpurgeable
+unpurged
+unpurifiable
+unpurified
+unpurifying
+unpuritan
+unpurled
+unpurloined
+unpurpled
+unpurported
+unpurposed
+unpurposelike
+unpurposely
+unpurposing
+unpurse
+unpursed
+unpursuable
+unpursued
+unpursuing
+unpurveyed
+unpushed
+unput
+unputrefiable
+unputrefied
+unputrid
+unputtied
+unpuzzle
+unquadded
+unquaffed
+unquailed
+unquailing
+unquailingly
+unquakerlike
+unquakerly
+unquaking
+unqualifiable
+unqualification
+unqualified
+unqualifiedly
+unqualifiedness
+unqualify
+unqualifying
+unqualifyingly
+unqualitied
+unquality
+unquantified
+unquantitative
+unquarantined
+unquarreled
+unquarreling
+unquarrelled
+unquarrelling
+unquarrelsome
+unquarried
+unquartered
+unquashed
+unquayed
+unqueen
+unqueened
+unqueening
+unqueenlike
+unqueenly
+unquellable
+unquelled
+unquenchable
+unquenchableness
+unquenchably
+unquenched
+unqueried
+unquested
+unquestionability
+unquestionable
+unquestionableness
+unquestionably
+unquestionate
+unquestioned
+unquestionedly
+unquestionedness
+unquestioning
+unquestioningly
+unquestioningness
+unquibbled
+unquibbling
+unquick
+unquickened
+unquickly
+unquicksilvered
+unquiescence
+unquiescent
+unquiescently
+unquiet
+unquietable
+unquieted
+unquieting
+unquietly
+unquietness
+unquietude
+unquilleted
+unquilted
+unquit
+unquittable
+unquitted
+unquivered
+unquivering
+unquizzable
+unquizzed
+unquotable
+unquote
+unquoted
+unrabbeted
+unrabbinical
+unraced
+unrack
+unracked
+unracking
+unradiated
+unradical
+unradicalize
+unraffled
+unraftered
+unraided
+unrailed
+unrailroaded
+unrailwayed
+unrainy
+unraised
+unrake
+unraked
+unraking
+unrallied
+unram
+unrambling
+unramified
+unrammed
+unramped
+unranched
+unrancid
+unrancored
+unrandom
+unrank
+unranked
+unransacked
+unransomable
+unransomed
+unrapacious
+unraped
+unraptured
+unrare
+unrarefied
+unrash
+unrasped
+unratable
+unrated
+unratified
+unrational
+unrattled
+unravaged
+unravel
+unravelable
+unraveled
+unraveler
+unraveling
+unravellable
+unravelled
+unraveller
+unravelling
+unravelment
+unraving
+unravished
+unravishing
+unray
+unrayed
+unrazed
+unrazored
+unreachable
+unreachably
+unreached
+unreactive
+unread
+unreadability
+unreadable
+unreadableness
+unreadably
+unreadily
+unreadiness
+unready
+unreal
+unrealism
+unrealist
+unrealistic
+unreality
+unrealizable
+unrealize
+unrealized
+unrealizing
+unreally
+unrealmed
+unrealness
+unreaped
+unreared
+unreason
+unreasonability
+unreasonable
+unreasonableness
+unreasonably
+unreasoned
+unreasoning
+unreasoningly
+unreassuring
+unreassuringly
+unreave
+unreaving
+unrebated
+unrebel
+unrebellious
+unrebuffable
+unrebuffably
+unrebuilt
+unrebukable
+unrebukably
+unrebuked
+unrebuttable
+unrebuttableness
+unrebutted
+unrecallable
+unrecallably
+unrecalled
+unrecalling
+unrecantable
+unrecanted
+unrecaptured
+unreceding
+unreceipted
+unreceivable
+unreceived
+unreceiving
+unrecent
+unreceptant
+unreceptive
+unreceptivity
+unreciprocal
+unreciprocated
+unrecited
+unrecked
+unrecking
+unreckingness
+unreckon
+unreckonable
+unreckoned
+unreclaimable
+unreclaimably
+unreclaimed
+unreclaimedness
+unreclaiming
+unreclined
+unreclining
+unrecognition
+unrecognizable
+unrecognizableness
+unrecognizably
+unrecognized
+unrecognizing
+unrecognizingly
+unrecoined
+unrecollected
+unrecommendable
+unrecompensable
+unrecompensed
+unreconcilable
+unreconcilableness
+unreconcilably
+unreconciled
+unrecondite
+unreconnoitered
+unreconsidered
+unreconstructed
+unrecordable
+unrecorded
+unrecordedness
+unrecording
+unrecountable
+unrecounted
+unrecoverable
+unrecoverableness
+unrecoverably
+unrecovered
+unrecreant
+unrecreated
+unrecreating
+unrecriminative
+unrecruitable
+unrecruited
+unrectangular
+unrectifiable
+unrectifiably
+unrectified
+unrecumbent
+unrecuperated
+unrecurrent
+unrecurring
+unrecusant
+unred
+unredacted
+unredeemable
+unredeemableness
+unredeemably
+unredeemed
+unredeemedly
+unredeemedness
+unredeeming
+unredressable
+unredressed
+unreduceable
+unreduced
+unreducible
+unreducibleness
+unreducibly
+unreduct
+unreefed
+unreel
+unreelable
+unreeled
+unreeling
+unreeve
+unreeving
+unreferenced
+unreferred
+unrefilled
+unrefine
+unrefined
+unrefinedly
+unrefinedness
+unrefinement
+unrefining
+unrefitted
+unreflected
+unreflecting
+unreflectingly
+unreflectingness
+unreflective
+unreflectively
+unreformable
+unreformed
+unreformedness
+unreforming
+unrefracted
+unrefracting
+unrefrainable
+unrefrained
+unrefraining
+unrefreshed
+unrefreshful
+unrefreshing
+unrefreshingly
+unrefrigerated
+unrefulgent
+unrefunded
+unrefunding
+unrefusable
+unrefusably
+unrefused
+unrefusing
+unrefusingly
+unrefutable
+unrefuted
+unrefuting
+unregainable
+unregained
+unregal
+unregaled
+unregality
+unregally
+unregard
+unregardable
+unregardant
+unregarded
+unregardedly
+unregardful
+unregeneracy
+unregenerate
+unregenerately
+unregenerateness
+unregenerating
+unregeneration
+unregimented
+unregistered
+unregressive
+unregretful
+unregretfully
+unregretfulness
+unregrettable
+unregretted
+unregretting
+unregular
+unregulated
+unregulative
+unregurgitated
+unrehabilitated
+unrehearsable
+unrehearsed
+unrehearsing
+unreigning
+unreimbodied
+unrein
+unreined
+unreinstated
+unreiterable
+unreiterated
+unrejectable
+unrejoiced
+unrejoicing
+unrejuvenated
+unrelapsing
+unrelated
+unrelatedness
+unrelating
+unrelational
+unrelative
+unrelatively
+unrelaxable
+unrelaxed
+unrelaxing
+unrelaxingly
+unreleasable
+unreleased
+unreleasing
+unrelegated
+unrelentance
+unrelented
+unrelenting
+unrelentingly
+unrelentingness
+unrelentor
+unrelevant
+unreliability
+unreliable
+unreliableness
+unreliably
+unreliance
+unrelievable
+unrelievableness
+unrelieved
+unrelievedly
+unreligion
+unreligioned
+unreligious
+unreligiously
+unreligiousness
+unrelinquishable
+unrelinquishably
+unrelinquished
+unrelinquishing
+unrelishable
+unrelished
+unrelishing
+unreluctant
+unreluctantly
+unremaining
+unremanded
+unremarkable
+unremarked
+unremarried
+unremediable
+unremedied
+unremember
+unrememberable
+unremembered
+unremembering
+unremembrance
+unreminded
+unremissible
+unremittable
+unremitted
+unremittedly
+unremittent
+unremittently
+unremitting
+unremittingly
+unremittingness
+unremonstrant
+unremonstrated
+unremonstrating
+unremorseful
+unremorsefully
+unremote
+unremotely
+unremounted
+unremovable
+unremovableness
+unremovably
+unremoved
+unremunerated
+unremunerating
+unremunerative
+unremuneratively
+unremunerativeness
+unrenderable
+unrendered
+unrenewable
+unrenewed
+unrenounceable
+unrenounced
+unrenouncing
+unrenovated
+unrenowned
+unrenownedly
+unrenownedness
+unrent
+unrentable
+unrented
+unreorganized
+unrepaid
+unrepair
+unrepairable
+unrepaired
+unrepartable
+unreparted
+unrepealability
+unrepealable
+unrepealableness
+unrepealably
+unrepealed
+unrepeatable
+unrepeated
+unrepellable
+unrepelled
+unrepellent
+unrepent
+unrepentable
+unrepentance
+unrepentant
+unrepentantly
+unrepentantness
+unrepented
+unrepenting
+unrepentingly
+unrepentingness
+unrepetitive
+unrepined
+unrepining
+unrepiningly
+unrepiqued
+unreplaceable
+unreplaced
+unreplenished
+unrepleviable
+unreplevined
+unrepliable
+unrepliably
+unreplied
+unreplying
+unreportable
+unreported
+unreportedly
+unreportedness
+unrepose
+unreposed
+unreposeful
+unreposefulness
+unreposing
+unrepossessed
+unreprehended
+unrepresentable
+unrepresentation
+unrepresentative
+unrepresented
+unrepresentedness
+unrepressed
+unrepressible
+unreprievable
+unreprievably
+unreprieved
+unreprimanded
+unreprinted
+unreproachable
+unreproachableness
+unreproachably
+unreproached
+unreproachful
+unreproachfully
+unreproaching
+unreproachingly
+unreprobated
+unreproducible
+unreprovable
+unreprovableness
+unreprovably
+unreproved
+unreprovedly
+unreprovedness
+unreproving
+unrepublican
+unrepudiable
+unrepudiated
+unrepugnant
+unrepulsable
+unrepulsed
+unrepulsing
+unrepulsive
+unreputable
+unreputed
+unrequalified
+unrequested
+unrequickened
+unrequired
+unrequisite
+unrequitable
+unrequital
+unrequited
+unrequitedly
+unrequitedness
+unrequitement
+unrequiter
+unrequiting
+unrescinded
+unrescued
+unresemblant
+unresembling
+unresented
+unresentful
+unresenting
+unreserve
+unreserved
+unreservedly
+unreservedness
+unresifted
+unresigned
+unresistable
+unresistably
+unresistance
+unresistant
+unresistantly
+unresisted
+unresistedly
+unresistedness
+unresistible
+unresistibleness
+unresistibly
+unresisting
+unresistingly
+unresistingness
+unresolute
+unresolvable
+unresolve
+unresolved
+unresolvedly
+unresolvedness
+unresolving
+unresonant
+unresounded
+unresounding
+unresourceful
+unresourcefulness
+unrespect
+unrespectability
+unrespectable
+unrespected
+unrespectful
+unrespectfully
+unrespectfulness
+unrespective
+unrespectively
+unrespectiveness
+unrespirable
+unrespired
+unrespited
+unresplendent
+unresponding
+unresponsible
+unresponsibleness
+unresponsive
+unresponsively
+unresponsiveness
+unrest
+unrestable
+unrested
+unrestful
+unrestfully
+unrestfulness
+unresting
+unrestingly
+unrestingness
+unrestorable
+unrestored
+unrestrainable
+unrestrainably
+unrestrained
+unrestrainedly
+unrestrainedness
+unrestraint
+unrestrictable
+unrestricted
+unrestrictedly
+unrestrictedness
+unrestrictive
+unresty
+unresultive
+unresumed
+unresumptive
+unretainable
+unretained
+unretaliated
+unretaliating
+unretardable
+unretarded
+unretentive
+unreticent
+unretinued
+unretired
+unretiring
+unretorted
+unretouched
+unretractable
+unretracted
+unretreating
+unretrenchable
+unretrenched
+unretrievable
+unretrieved
+unretrievingly
+unretted
+unreturnable
+unreturnably
+unreturned
+unreturning
+unreturningly
+unrevealable
+unrevealed
+unrevealedness
+unrevealing
+unrevealingly
+unrevelationize
+unrevenged
+unrevengeful
+unrevengefulness
+unrevenging
+unrevengingly
+unrevenue
+unrevenued
+unreverberated
+unrevered
+unreverence
+unreverenced
+unreverend
+unreverendly
+unreverent
+unreverential
+unreverently
+unreverentness
+unreversable
+unreversed
+unreversible
+unreverted
+unrevertible
+unreverting
+unrevested
+unrevetted
+unreviewable
+unreviewed
+unreviled
+unrevised
+unrevivable
+unrevived
+unrevocable
+unrevocableness
+unrevocably
+unrevoked
+unrevolted
+unrevolting
+unrevolutionary
+unrevolutionized
+unrevolved
+unrevolving
+unrewardable
+unrewarded
+unrewardedly
+unrewarding
+unreworded
+unrhetorical
+unrhetorically
+unrhetoricalness
+unrhyme
+unrhymed
+unrhythmic
+unrhythmical
+unrhythmically
+unribbed
+unribboned
+unrich
+unriched
+unricht
+unricked
+unrid
+unridable
+unridableness
+unridably
+unridden
+unriddle
+unriddleable
+unriddled
+unriddler
+unriddling
+unride
+unridely
+unridered
+unridged
+unridiculed
+unridiculous
+unrife
+unriffled
+unrifled
+unrifted
+unrig
+unrigged
+unrigging
+unright
+unrightable
+unrighted
+unrighteous
+unrighteously
+unrighteousness
+unrightful
+unrightfully
+unrightfulness
+unrightly
+unrightwise
+unrigid
+unrigorous
+unrimpled
+unrind
+unring
+unringable
+unringed
+unringing
+unrinsed
+unrioted
+unrioting
+unriotous
+unrip
+unripe
+unriped
+unripely
+unripened
+unripeness
+unripening
+unrippable
+unripped
+unripping
+unrippled
+unrippling
+unripplingly
+unrisen
+unrising
+unriskable
+unrisked
+unrisky
+unritual
+unritualistic
+unrivalable
+unrivaled
+unrivaledly
+unrivaledness
+unrived
+unriven
+unrivet
+unriveted
+unriveting
+unroaded
+unroadworthy
+unroaming
+unroast
+unroasted
+unrobbed
+unrobe
+unrobed
+unrobust
+unrocked
+unrococo
+unrodded
+unroiled
+unroll
+unrollable
+unrolled
+unroller
+unrolling
+unrollment
+unromantic
+unromantical
+unromantically
+unromanticalness
+unromanticized
+unroof
+unroofed
+unroofing
+unroomy
+unroost
+unroosted
+unroosting
+unroot
+unrooted
+unrooting
+unrope
+unroped
+unrosed
+unrosined
+unrostrated
+unrotated
+unrotating
+unroted
+unrotted
+unrotten
+unrotund
+unrouged
+unrough
+unroughened
+unround
+unrounded
+unrounding
+unrousable
+unroused
+unroutable
+unrouted
+unrove
+unroved
+unroving
+unrow
+unrowed
+unroweled
+unroyal
+unroyalist
+unroyalized
+unroyally
+unroyalness
+Unrra
+unrubbed
+unrubbish
+unrubified
+unrubrical
+unrubricated
+unruddered
+unruddled
+unrueful
+unruffable
+unruffed
+unruffle
+unruffled
+unruffling
+unrugged
+unruinable
+unruinated
+unruined
+unrulable
+unrulableness
+unrule
+unruled
+unruledly
+unruledness
+unruleful
+unrulily
+unruliness
+unruly
+unruminated
+unruminating
+unruminatingly
+unrummaged
+unrumored
+unrumple
+unrumpled
+unrun
+unrung
+unruptured
+unrural
+unrushed
+Unrussian
+unrust
+unrusted
+unrustic
+unrusticated
+unrustling
+unruth
+unsabbatical
+unsabered
+unsabled
+unsabred
+unsaccharic
+unsacerdotal
+unsacerdotally
+unsack
+unsacked
+unsacramental
+unsacramentally
+unsacramentarian
+unsacred
+unsacredly
+unsacrificeable
+unsacrificeably
+unsacrificed
+unsacrificial
+unsacrificing
+unsacrilegious
+unsad
+unsadden
+unsaddened
+unsaddle
+unsaddled
+unsaddling
+unsafe
+unsafeguarded
+unsafely
+unsafeness
+unsafety
+unsagacious
+unsage
+unsagging
+unsaid
+unsailable
+unsailed
+unsailorlike
+unsaint
+unsainted
+unsaintlike
+unsaintly
+unsalability
+unsalable
+unsalableness
+unsalably
+unsalaried
+unsalesmanlike
+unsaline
+unsalivated
+unsallying
+unsalmonlike
+unsalt
+unsaltable
+unsaltatory
+unsalted
+unsalubrious
+unsalutary
+unsaluted
+unsaluting
+unsalvability
+unsalvable
+unsalvableness
+unsalvaged
+unsalved
+unsampled
+unsanctification
+unsanctified
+unsanctifiedly
+unsanctifiedness
+unsanctify
+unsanctifying
+unsanctimonious
+unsanctimoniously
+unsanctimoniousness
+unsanction
+unsanctionable
+unsanctioned
+unsanctioning
+unsanctitude
+unsanctity
+unsanctuaried
+unsandaled
+unsanded
+unsane
+unsanguinary
+unsanguine
+unsanguinely
+unsanguineness
+unsanguineous
+unsanguineously
+unsanitariness
+unsanitary
+unsanitated
+unsanitation
+unsanity
+unsaponifiable
+unsaponified
+unsapped
+unsappy
+unsarcastic
+unsardonic
+unsartorial
+unsash
+unsashed
+unsatable
+unsatanic
+unsated
+unsatedly
+unsatedness
+unsatiability
+unsatiable
+unsatiableness
+unsatiably
+unsatiate
+unsatiated
+unsatiating
+unsatin
+unsatire
+unsatirical
+unsatirically
+unsatirize
+unsatirized
+unsatisfaction
+unsatisfactorily
+unsatisfactoriness
+unsatisfactory
+unsatisfiable
+unsatisfiableness
+unsatisfiably
+unsatisfied
+unsatisfiedly
+unsatisfiedness
+unsatisfying
+unsatisfyingly
+unsatisfyingness
+unsaturable
+unsaturated
+unsaturatedly
+unsaturatedness
+unsaturation
+unsatyrlike
+unsauced
+unsaurian
+unsavable
+unsaveable
+unsaved
+unsaving
+unsavored
+unsavoredly
+unsavoredness
+unsavorily
+unsavoriness
+unsavory
+unsawed
+unsawn
+unsay
+unsayability
+unsayable
+unscabbard
+unscabbarded
+unscabbed
+unscaffolded
+unscalable
+unscalableness
+unscalably
+unscale
+unscaled
+unscaledness
+unscalloped
+unscaly
+unscamped
+unscandalize
+unscandalized
+unscandalous
+unscannable
+unscanned
+unscanted
+unscanty
+unscarb
+unscarce
+unscared
+unscarfed
+unscarified
+unscarred
+unscathed
+unscathedly
+unscathedness
+unscattered
+unscavengered
+unscenic
+unscent
+unscented
+unscepter
+unsceptered
+unsceptical
+unsceptre
+unsceptred
+unscheduled
+unschematic
+unschematized
+unscholar
+unscholarlike
+unscholarly
+unscholastic
+unschool
+unschooled
+unschooledly
+unschooledness
+unscienced
+unscientific
+unscientifical
+unscientifically
+unscintillating
+unscioned
+unscissored
+unscoffed
+unscoffing
+unscolded
+unsconced
+unscooped
+unscorched
+unscored
+unscorified
+unscoring
+unscorned
+unscornful
+unscornfully
+unscornfulness
+unscotch
+unscotched
+unscottify
+unscoured
+unscourged
+unscowling
+unscramble
+unscrambling
+unscraped
+unscratchable
+unscratched
+unscratching
+unscratchingly
+unscrawled
+unscreen
+unscreenable
+unscreenably
+unscreened
+unscrew
+unscrewable
+unscrewed
+unscrewing
+unscribal
+unscribbled
+unscribed
+unscrimped
+unscriptural
+unscripturally
+unscripturalness
+unscrubbed
+unscrupled
+unscrupulosity
+unscrupulous
+unscrupulously
+unscrupulousness
+unscrutable
+unscrutinized
+unscrutinizing
+unscrutinizingly
+unsculptural
+unsculptured
+unscummed
+unscutcheoned
+unseafaring
+unseal
+unsealable
+unsealed
+unsealer
+unsealing
+unseam
+unseamanlike
+unseamanship
+unseamed
+unseaming
+unsearchable
+unsearchableness
+unsearchably
+unsearched
+unsearcherlike
+unsearching
+unseared
+unseason
+unseasonable
+unseasonableness
+unseasonably
+unseasoned
+unseat
+unseated
+unseaworthiness
+unseaworthy
+unseceding
+unsecluded
+unseclusive
+unseconded
+unsecrecy
+unsecret
+unsecretarylike
+unsecreted
+unsecreting
+unsecretly
+unsecretness
+unsectarian
+unsectarianism
+unsectarianize
+unsectional
+unsecular
+unsecularize
+unsecularized
+unsecure
+unsecured
+unsecuredly
+unsecuredness
+unsecurely
+unsecureness
+unsecurity
+unsedate
+unsedentary
+unseditious
+unseduce
+unseduced
+unseducible
+unseductive
+unsedulous
+unsee
+unseeable
+unseeded
+unseeing
+unseeingly
+unseeking
+unseeming
+unseemingly
+unseemlily
+unseemliness
+unseemly
+unseen
+unseethed
+unsegmented
+unsegregable
+unsegregated
+unsegregatedness
+unseignorial
+unseismic
+unseizable
+unseized
+unseldom
+unselect
+unselected
+unselecting
+unselective
+unself
+unselfish
+unselfishly
+unselfishness
+unselflike
+unselfness
+unselling
+unsenatorial
+unsenescent
+unsensational
+unsense
+unsensed
+unsensibility
+unsensible
+unsensibleness
+unsensibly
+unsensitive
+unsensitize
+unsensitized
+unsensory
+unsensual
+unsensualize
+unsensualized
+unsensually
+unsensuous
+unsensuousness
+unsent
+unsentenced
+unsententious
+unsentient
+unsentimental
+unsentimentalist
+unsentimentality
+unsentimentalize
+unsentimentally
+unsentineled
+unsentinelled
+unseparable
+unseparableness
+unseparably
+unseparate
+unseparated
+unseptate
+unseptated
+unsepulcher
+unsepulchered
+unsepulchral
+unsepulchre
+unsepulchred
+unsepultured
+unsequenced
+unsequential
+unsequestered
+unseraphical
+unserenaded
+unserene
+unserflike
+unserious
+unseriousness
+unserrated
+unserried
+unservable
+unserved
+unserviceability
+unserviceable
+unserviceableness
+unserviceably
+unservicelike
+unservile
+unsesquipedalian
+unset
+unsetting
+unsettle
+unsettleable
+unsettled
+unsettledness
+unsettlement
+unsettling
+unseverable
+unseverableness
+unsevere
+unsevered
+unseveredly
+unseveredness
+unsew
+unsewed
+unsewered
+unsewing
+unsewn
+unsex
+unsexed
+unsexing
+unsexlike
+unsexual
+unshackle
+unshackled
+unshackling
+unshade
+unshaded
+unshadow
+unshadowable
+unshadowed
+unshady
+unshafted
+unshakable
+unshakably
+unshakeable
+unshakeably
+unshaken
+unshakenly
+unshakenness
+unshaking
+unshakingness
+unshaled
+unshamable
+unshamableness
+unshamably
+unshameable
+unshameableness
+unshameably
+unshamed
+unshamefaced
+unshamefacedness
+unshameful
+unshamefully
+unshamefulness
+unshammed
+unshanked
+unshapable
+unshape
+unshapeable
+unshaped
+unshapedness
+unshapeliness
+unshapely
+unshapen
+unshapenly
+unshapenness
+unsharable
+unshared
+unsharedness
+unsharing
+unsharp
+unsharped
+unsharpen
+unsharpened
+unsharpening
+unsharping
+unshattered
+unshavable
+unshaveable
+unshaved
+unshavedly
+unshavedness
+unshaven
+unshavenly
+unshavenness
+unshawl
+unsheaf
+unsheared
+unsheathe
+unsheathed
+unsheathing
+unshed
+unsheet
+unsheeted
+unsheeting
+unshell
+unshelled
+unshelling
+unshelterable
+unsheltered
+unsheltering
+unshelve
+unshepherded
+unshepherding
+unsheriff
+unshewed
+unshieldable
+unshielded
+unshielding
+unshiftable
+unshifted
+unshiftiness
+unshifting
+unshifty
+unshimmering
+unshingled
+unshining
+unship
+unshiplike
+unshipment
+unshipped
+unshipping
+unshipshape
+unshipwrecked
+unshirking
+unshirted
+unshivered
+unshivering
+unshockable
+unshocked
+unshod
+unshodden
+unshoe
+unshoed
+unshoeing
+unshop
+unshore
+unshored
+unshorn
+unshort
+unshortened
+unshot
+unshotted
+unshoulder
+unshouted
+unshouting
+unshoved
+unshoveled
+unshowable
+unshowed
+unshowmanlike
+unshown
+unshowy
+unshredded
+unshrew
+unshrewd
+unshrewish
+unshrill
+unshrine
+unshrined
+unshrinement
+unshrink
+unshrinkability
+unshrinkable
+unshrinking
+unshrinkingly
+unshrived
+unshriveled
+unshrivelled
+unshriven
+unshroud
+unshrouded
+unshrubbed
+unshrugging
+unshrunk
+unshrunken
+unshuddering
+unshuffle
+unshuffled
+unshunnable
+unshunned
+unshunted
+unshut
+unshutter
+unshuttered
+unshy
+unshyly
+unshyness
+unsibilant
+unsiccated
+unsick
+unsickened
+unsicker
+unsickerly
+unsickerness
+unsickled
+unsickly
+unsided
+unsiding
+unsiege
+unsifted
+unsighing
+unsight
+unsightable
+unsighted
+unsighting
+unsightliness
+unsightly
+unsigmatic
+unsignable
+unsignaled
+unsignalized
+unsignalled
+unsignatured
+unsigned
+unsigneted
+unsignificancy
+unsignificant
+unsignificantly
+unsignificative
+unsignified
+unsignifying
+unsilenceable
+unsilenceably
+unsilenced
+unsilent
+unsilentious
+unsilently
+unsilicified
+unsilly
+unsilvered
+unsimilar
+unsimilarity
+unsimilarly
+unsimple
+unsimplicity
+unsimplified
+unsimplify
+unsimulated
+unsimultaneous
+unsin
+unsincere
+unsincerely
+unsincereness
+unsincerity
+unsinew
+unsinewed
+unsinewing
+unsinewy
+unsinful
+unsinfully
+unsinfulness
+unsing
+unsingability
+unsingable
+unsingableness
+unsinged
+unsingle
+unsingled
+unsingleness
+unsingular
+unsinister
+unsinkability
+unsinkable
+unsinking
+unsinnable
+unsinning
+unsinningness
+unsiphon
+unsipped
+unsister
+unsistered
+unsisterliness
+unsisterly
+unsizable
+unsizableness
+unsizeable
+unsizeableness
+unsized
+unskaithd
+unskeptical
+unsketchable
+unsketched
+unskewed
+unskewered
+unskilful
+unskilfully
+unskilled
+unskilledly
+unskilledness
+unskillful
+unskillfully
+unskillfulness
+unskimmed
+unskin
+unskinned
+unskirted
+unslack
+unslacked
+unslackened
+unslackening
+unslacking
+unslagged
+unslain
+unslakable
+unslakeable
+unslaked
+unslammed
+unslandered
+unslanderous
+unslapped
+unslashed
+unslate
+unslated
+unslating
+unslaughtered
+unslave
+unslayable
+unsleaved
+unsleek
+unsleepably
+unsleeping
+unsleepingly
+unsleepy
+unsleeve
+unsleeved
+unslender
+unslept
+unsliced
+unsliding
+unslighted
+unsling
+unslip
+unslipped
+unslippery
+unslipping
+unslit
+unslockened
+unsloped
+unslopped
+unslot
+unslothful
+unslothfully
+unslothfulness
+unslotted
+unsloughed
+unsloughing
+unslow
+unsluggish
+unsluice
+unsluiced
+unslumbering
+unslumberous
+unslumbrous
+unslung
+unslurred
+unsly
+unsmacked
+unsmart
+unsmartly
+unsmartness
+unsmeared
+unsmelled
+unsmelling
+unsmelted
+unsmiled
+unsmiling
+unsmilingly
+unsmilingness
+unsmirched
+unsmirking
+unsmitten
+unsmokable
+unsmokeable
+unsmoked
+unsmokified
+unsmoking
+unsmoky
+unsmooth
+unsmoothed
+unsmoothly
+unsmoothness
+unsmote
+unsmotherable
+unsmothered
+unsmudged
+unsmuggled
+unsmutched
+unsmutted
+unsmutty
+unsnaffled
+unsnagged
+unsnaggled
+unsnaky
+unsnap
+unsnapped
+unsnare
+unsnared
+unsnarl
+unsnatch
+unsnatched
+unsneck
+unsneering
+unsnib
+unsnipped
+unsnobbish
+unsnoring
+unsnouted
+unsnow
+unsnubbable
+unsnubbed
+unsnuffed
+unsoaked
+unsoaped
+unsoarable
+unsober
+unsoberly
+unsoberness
+unsobriety
+unsociability
+unsociable
+unsociableness
+unsociably
+unsocial
+unsocialism
+unsocialistic
+unsociality
+unsocializable
+unsocialized
+unsocially
+unsocialness
+unsociological
+unsocket
+unsodden
+unsoft
+unsoftened
+unsoftening
+unsoggy
+unsoil
+unsoiled
+unsoiledness
+unsolaced
+unsolacing
+unsolar
+unsold
+unsolder
+unsoldered
+unsoldering
+unsoldier
+unsoldiered
+unsoldierlike
+unsoldierly
+unsole
+unsoled
+unsolemn
+unsolemness
+unsolemnize
+unsolemnized
+unsolemnly
+unsolicitated
+unsolicited
+unsolicitedly
+unsolicitous
+unsolicitously
+unsolicitousness
+unsolid
+unsolidarity
+unsolidifiable
+unsolidified
+unsolidity
+unsolidly
+unsolidness
+unsolitary
+unsolubility
+unsoluble
+unsolvable
+unsolvableness
+unsolvably
+unsolved
+unsomatic
+unsomber
+unsombre
+unsome
+unson
+unsonable
+unsonant
+unsonlike
+unsonneted
+unsonorous
+unsonsy
+unsoothable
+unsoothed
+unsoothfast
+unsoothing
+unsooty
+unsophistical
+unsophistically
+unsophisticate
+unsophisticated
+unsophisticatedly
+unsophisticatedness
+unsophistication
+unsophomoric
+unsordid
+unsore
+unsorrowed
+unsorrowing
+unsorry
+unsort
+unsortable
+unsorted
+unsorting
+unsotted
+unsought
+unsoul
+unsoulful
+unsoulfully
+unsoulish
+unsound
+unsoundable
+unsoundableness
+unsounded
+unsounding
+unsoundly
+unsoundness
+unsour
+unsoured
+unsoused
+unsovereign
+unsowed
+unsown
+unspaced
+unspacious
+unspaded
+unspan
+unspangled
+unspanked
+unspanned
+unspar
+unsparable
+unspared
+unsparing
+unsparingly
+unsparingness
+unsparkling
+unsparred
+unsparse
+unspatial
+unspatiality
+unspattered
+unspawned
+unspayed
+unspeak
+unspeakability
+unspeakable
+unspeakableness
+unspeakably
+unspeaking
+unspeared
+unspecialized
+unspecializing
+unspecific
+unspecified
+unspecifiedly
+unspecious
+unspecked
+unspeckled
+unspectacled
+unspectacular
+unspectacularly
+unspecterlike
+unspectrelike
+unspeculating
+unspeculative
+unspeculatively
+unsped
+unspeed
+unspeedy
+unspeered
+unspell
+unspellable
+unspelled
+unspelt
+unspendable
+unspending
+unspent
+unspewed
+unsphere
+unsphered
+unsphering
+unspiable
+unspiced
+unspicy
+unspied
+unspike
+unspillable
+unspin
+unspinsterlike
+unspinsterlikeness
+unspiral
+unspired
+unspirit
+unspirited
+unspiritedly
+unspiriting
+unspiritual
+unspirituality
+unspiritualize
+unspiritualized
+unspiritually
+unspiritualness
+unspissated
+unspit
+unspited
+unspiteful
+unspitted
+unsplashed
+unsplattered
+unsplayed
+unspleened
+unspleenish
+unspleenishly
+unsplendid
+unspliced
+unsplinted
+unsplintered
+unsplit
+unspoil
+unspoilable
+unspoilableness
+unspoilably
+unspoiled
+unspoken
+unspokenly
+unsponged
+unspongy
+unsponsored
+unspontaneous
+unspontaneously
+unspookish
+unsported
+unsportful
+unsporting
+unsportive
+unsportsmanlike
+unsportsmanly
+unspot
+unspotlighted
+unspottable
+unspotted
+unspottedly
+unspottedness
+unspoused
+unspouselike
+unspouted
+unsprained
+unsprayed
+unspread
+unsprightliness
+unsprightly
+unspring
+unspringing
+unspringlike
+unsprinkled
+unsprinklered
+unsprouted
+unsproutful
+unsprouting
+unspruced
+unsprung
+unspun
+unspurned
+unspurred
+unspying
+unsquandered
+unsquarable
+unsquare
+unsquared
+unsquashed
+unsqueamish
+unsqueezable
+unsqueezed
+unsquelched
+unsquinting
+unsquire
+unsquired
+unsquirelike
+unsquirted
+unstabbed
+unstability
+unstable
+unstabled
+unstableness
+unstablished
+unstably
+unstack
+unstacked
+unstacker
+unstaffed
+unstaged
+unstaggered
+unstaggering
+unstagnating
+unstagy
+unstaid
+unstaidly
+unstaidness
+unstain
+unstainable
+unstainableness
+unstained
+unstainedly
+unstainedness
+unstaled
+unstalked
+unstalled
+unstammering
+unstamped
+unstampeded
+unstanch
+unstanchable
+unstandard
+unstandardized
+unstanzaic
+unstar
+unstarch
+unstarched
+unstarlike
+unstarred
+unstarted
+unstarting
+unstartled
+unstarved
+unstatable
+unstate
+unstateable
+unstated
+unstately
+unstatesmanlike
+unstatic
+unstating
+unstation
+unstationary
+unstationed
+unstatistic
+unstatistical
+unstatued
+unstatuesque
+unstatutable
+unstatutably
+unstaunch
+unstaunchable
+unstaunched
+unstavable
+unstaveable
+unstaved
+unstayable
+unstayed
+unstayedness
+unstaying
+unsteadfast
+unsteadfastly
+unsteadfastness
+unsteadied
+unsteadily
+unsteadiness
+unsteady
+unsteadying
+unstealthy
+unsteamed
+unsteaming
+unsteck
+unstecked
+unsteel
+unsteeled
+unsteep
+unsteeped
+unsteepled
+unsteered
+unstemmable
+unstemmed
+unstentorian
+unstep
+unstercorated
+unstereotyped
+unsterile
+unsterilized
+unstern
+unstethoscoped
+unstewardlike
+unstewed
+unstick
+unsticking
+unstickingness
+unsticky
+unstiffen
+unstiffened
+unstifled
+unstigmatized
+unstill
+unstilled
+unstillness
+unstilted
+unstimulated
+unstimulating
+unsting
+unstinged
+unstinging
+unstinted
+unstintedly
+unstinting
+unstintingly
+unstippled
+unstipulated
+unstirrable
+unstirred
+unstirring
+unstitch
+unstitched
+unstitching
+unstock
+unstocked
+unstocking
+unstockinged
+unstoic
+unstoical
+unstoically
+unstoicize
+unstoked
+unstoken
+unstolen
+unstonable
+unstone
+unstoned
+unstoniness
+unstony
+unstooping
+unstop
+unstoppable
+unstopped
+unstopper
+unstoppered
+unstopple
+unstore
+unstored
+unstoried
+unstormed
+unstormy
+unstout
+unstoved
+unstow
+unstowed
+unstraddled
+unstrafed
+unstraight
+unstraightened
+unstraightforward
+unstraightness
+unstrain
+unstrained
+unstraitened
+unstrand
+unstranded
+unstrange
+unstrangered
+unstrangled
+unstrangulable
+unstrap
+unstrapped
+unstrategic
+unstrategically
+unstratified
+unstraying
+unstreaked
+unstrength
+unstrengthen
+unstrengthened
+unstrenuous
+unstressed
+unstressedly
+unstressedness
+unstretch
+unstretched
+unstrewed
+unstrewn
+unstriated
+unstricken
+unstrictured
+unstridulous
+unstrike
+unstriking
+unstring
+unstringed
+unstringing
+unstrip
+unstriped
+unstripped
+unstriving
+unstroked
+unstrong
+unstructural
+unstruggling
+unstrung
+unstubbed
+unstubborn
+unstuccoed
+unstuck
+unstudded
+unstudied
+unstudious
+unstuff
+unstuffed
+unstuffing
+unstultified
+unstumbling
+unstung
+unstunned
+unstunted
+unstupefied
+unstupid
+unstuttered
+unstuttering
+unsty
+unstyled
+unstylish
+unstylishly
+unstylishness
+unsubdivided
+unsubduable
+unsubduableness
+unsubduably
+unsubducted
+unsubdued
+unsubduedly
+unsubduedness
+unsubject
+unsubjectable
+unsubjected
+unsubjectedness
+unsubjection
+unsubjective
+unsubjectlike
+unsubjugate
+unsubjugated
+unsublimable
+unsublimated
+unsublimed
+unsubmerged
+unsubmergible
+unsubmerging
+unsubmission
+unsubmissive
+unsubmissively
+unsubmissiveness
+unsubmitted
+unsubmitting
+unsubordinate
+unsubordinated
+unsuborned
+unsubpoenaed
+unsubscribed
+unsubscribing
+unsubservient
+unsubsided
+unsubsidiary
+unsubsiding
+unsubsidized
+unsubstanced
+unsubstantial
+unsubstantiality
+unsubstantialize
+unsubstantially
+unsubstantialness
+unsubstantiate
+unsubstantiated
+unsubstantiation
+unsubstituted
+unsubtle
+unsubtleness
+unsubtlety
+unsubtly
+unsubtracted
+unsubventioned
+unsubventionized
+unsubversive
+unsubvertable
+unsubverted
+unsubvertive
+unsucceedable
+unsucceeded
+unsucceeding
+unsuccess
+unsuccessful
+unsuccessfully
+unsuccessfulness
+unsuccessive
+unsuccessively
+unsuccessiveness
+unsuccinct
+unsuccorable
+unsuccored
+unsucculent
+unsuccumbing
+unsucked
+unsuckled
+unsued
+unsufferable
+unsufferableness
+unsufferably
+unsuffered
+unsuffering
+unsufficed
+unsufficience
+unsufficiency
+unsufficient
+unsufficiently
+unsufficing
+unsufficingness
+unsufflated
+unsuffocate
+unsuffocated
+unsuffocative
+unsuffused
+unsugared
+unsugary
+unsuggested
+unsuggestedness
+unsuggestive
+unsuggestiveness
+unsuit
+unsuitability
+unsuitable
+unsuitableness
+unsuitably
+unsuited
+unsuiting
+unsulky
+unsullen
+unsulliable
+unsullied
+unsulliedly
+unsulliedness
+unsulphonated
+unsulphureous
+unsulphurized
+unsultry
+unsummable
+unsummarized
+unsummed
+unsummered
+unsummerlike
+unsummerly
+unsummonable
+unsummoned
+unsumptuary
+unsumptuous
+unsun
+unsunburned
+unsundered
+unsung
+unsunk
+unsunken
+unsunned
+unsunny
+unsuperable
+unsuperannuated
+unsupercilious
+unsuperficial
+unsuperfluous
+unsuperior
+unsuperlative
+unsupernatural
+unsupernaturalize
+unsupernaturalized
+unsuperscribed
+unsuperseded
+unsuperstitious
+unsupervised
+unsupervisedly
+unsupped
+unsupplantable
+unsupplanted
+unsupple
+unsuppled
+unsupplemented
+unsuppliable
+unsupplicated
+unsupplied
+unsupportable
+unsupportableness
+unsupportably
+unsupported
+unsupportedly
+unsupportedness
+unsupporting
+unsupposable
+unsupposed
+unsuppressed
+unsuppressible
+unsuppressibly
+unsuppurated
+unsuppurative
+unsupreme
+unsurcharge
+unsurcharged
+unsure
+unsurfaced
+unsurfeited
+unsurfeiting
+unsurgical
+unsurging
+unsurmised
+unsurmising
+unsurmountable
+unsurmountableness
+unsurmountably
+unsurmounted
+unsurnamed
+unsurpassable
+unsurpassableness
+unsurpassably
+unsurpassed
+unsurplice
+unsurpliced
+unsurprised
+unsurprising
+unsurrendered
+unsurrendering
+unsurrounded
+unsurveyable
+unsurveyed
+unsurvived
+unsurviving
+unsusceptibility
+unsusceptible
+unsusceptibleness
+unsusceptibly
+unsusceptive
+unsuspectable
+unsuspectably
+unsuspected
+unsuspectedly
+unsuspectedness
+unsuspectful
+unsuspectfulness
+unsuspectible
+unsuspecting
+unsuspectingly
+unsuspectingness
+unsuspective
+unsuspended
+unsuspicion
+unsuspicious
+unsuspiciously
+unsuspiciousness
+unsustainable
+unsustained
+unsustaining
+unsutured
+unswabbed
+unswaddle
+unswaddled
+unswaddling
+unswallowable
+unswallowed
+unswanlike
+unswapped
+unswarming
+unswathable
+unswathe
+unswathed
+unswathing
+unswayable
+unswayed
+unswayedness
+unswaying
+unswear
+unswearing
+unsweat
+unsweated
+unsweating
+unsweepable
+unsweet
+unsweeten
+unsweetened
+unsweetenedness
+unsweetly
+unsweetness
+unswell
+unswelled
+unswelling
+unsweltered
+unswept
+unswervable
+unswerved
+unswerving
+unswervingly
+unswilled
+unswing
+unswingled
+unswitched
+unswivel
+unswollen
+unswooning
+unsworn
+unswung
+unsyllabic
+unsyllabled
+unsyllogistical
+unsymbolic
+unsymbolical
+unsymbolically
+unsymbolicalness
+unsymbolized
+unsymmetrical
+unsymmetrically
+unsymmetricalness
+unsymmetrized
+unsymmetry
+unsympathetic
+unsympathetically
+unsympathizability
+unsympathizable
+unsympathized
+unsympathizing
+unsympathizingly
+unsympathy
+unsymphonious
+unsymptomatic
+unsynchronized
+unsynchronous
+unsyncopated
+unsyndicated
+unsynonymous
+unsyntactical
+unsynthetic
+unsyringed
+unsystematic
+unsystematical
+unsystematically
+unsystematized
+unsystematizedly
+unsystematizing
+unsystemizable
+untabernacled
+untabled
+untabulated
+untack
+untacked
+untacking
+untackle
+untackled
+untactful
+untactfully
+untactfulness
+untagged
+untailed
+untailorlike
+untailorly
+untaint
+untaintable
+untainted
+untaintedly
+untaintedness
+untainting
+untakable
+untakableness
+untakeable
+untakeableness
+untaken
+untaking
+untalented
+untalkative
+untalked
+untalking
+untall
+untallied
+untallowed
+untamable
+untamableness
+untame
+untamed
+untamedly
+untamedness
+untamely
+untameness
+untampered
+untangential
+untangibility
+untangible
+untangibleness
+untangibly
+untangle
+untangled
+untangling
+untanned
+untantalized
+untantalizing
+untap
+untaped
+untapered
+untapering
+untapestried
+untappable
+untapped
+untar
+untarnishable
+untarnished
+untarred
+untarried
+untarrying
+untartarized
+untasked
+untasseled
+untastable
+untaste
+untasteable
+untasted
+untasteful
+untastefully
+untastefulness
+untasting
+untasty
+untattered
+untattooed
+untaught
+untaughtness
+untaunted
+untaut
+untautological
+untawdry
+untawed
+untax
+untaxable
+untaxed
+untaxing
+unteach
+unteachable
+unteachableness
+unteachably
+unteacherlike
+unteaching
+unteam
+unteamed
+unteaming
+untearable
+unteased
+unteasled
+untechnical
+untechnicalize
+untechnically
+untedded
+untedious
+unteem
+unteeming
+unteethed
+untelegraphed
+untell
+untellable
+untellably
+untelling
+untemper
+untemperamental
+untemperate
+untemperately
+untemperateness
+untempered
+untempering
+untempested
+untempestuous
+untempled
+untemporal
+untemporary
+untemporizing
+untemptability
+untemptable
+untemptably
+untempted
+untemptible
+untemptibly
+untempting
+untemptingly
+untemptingness
+untenability
+untenable
+untenableness
+untenably
+untenacious
+untenacity
+untenant
+untenantable
+untenantableness
+untenanted
+untended
+untender
+untendered
+untenderly
+untenderness
+untenible
+untenibleness
+untenibly
+untense
+untent
+untentaculate
+untented
+untentered
+untenty
+unterminable
+unterminableness
+unterminably
+unterminated
+unterminating
+unterraced
+unterrestrial
+unterrible
+unterribly
+unterrifiable
+unterrific
+unterrified
+unterrifying
+unterrorized
+untessellated
+untestable
+untestamentary
+untested
+untestifying
+untether
+untethered
+untethering
+untewed
+untextual
+unthank
+unthanked
+unthankful
+unthankfully
+unthankfulness
+unthanking
+unthatch
+unthatched
+unthaw
+unthawed
+unthawing
+untheatric
+untheatrical
+untheatrically
+untheistic
+unthematic
+untheological
+untheologically
+untheologize
+untheoretic
+untheoretical
+untheorizable
+untherapeutical
+unthick
+unthicken
+unthickened
+unthievish
+unthink
+unthinkability
+unthinkable
+unthinkableness
+unthinkably
+unthinker
+unthinking
+unthinkingly
+unthinkingness
+unthinned
+unthinning
+unthirsting
+unthirsty
+unthistle
+untholeable
+untholeably
+unthorn
+unthorny
+unthorough
+unthought
+unthoughted
+unthoughtedly
+unthoughtful
+unthoughtfully
+unthoughtfulness
+unthoughtlike
+unthrall
+unthralled
+unthrashed
+unthread
+unthreadable
+unthreaded
+unthreading
+unthreatened
+unthreatening
+unthreshed
+unthrid
+unthridden
+unthrift
+unthriftihood
+unthriftily
+unthriftiness
+unthriftlike
+unthrifty
+unthrilled
+unthrilling
+unthriven
+unthriving
+unthrivingly
+unthrivingness
+unthrob
+unthrone
+unthroned
+unthronged
+unthroning
+unthrottled
+unthrowable
+unthrown
+unthrushlike
+unthrust
+unthumbed
+unthumped
+unthundered
+unthwacked
+unthwarted
+untiaraed
+unticketed
+untickled
+untidal
+untidily
+untidiness
+untidy
+untie
+untied
+untight
+untighten
+untightness
+until
+untile
+untiled
+untill
+untillable
+untilled
+untilling
+untilt
+untilted
+untilting
+untimbered
+untimed
+untimedness
+untimeliness
+untimely
+untimeous
+untimeously
+untimesome
+untimorous
+untin
+untinct
+untinctured
+untine
+untinged
+untinkered
+untinned
+untinseled
+untinted
+untippable
+untipped
+untippled
+untipt
+untirability
+untirable
+untire
+untired
+untiredly
+untiring
+untiringly
+untissued
+untithability
+untithable
+untithed
+untitled
+untittering
+untitular
+unto
+untoadying
+untoasted
+untogaed
+untoggle
+untoggler
+untoiled
+untoileted
+untoiling
+untold
+untolerable
+untolerableness
+untolerably
+untolerated
+untomb
+untombed
+untonality
+untone
+untoned
+untongued
+untonsured
+untooled
+untooth
+untoothed
+untoothsome
+untoothsomeness
+untop
+untopographical
+untopped
+untopping
+untormented
+untorn
+untorpedoed
+untorpid
+untorrid
+untortuous
+untorture
+untortured
+untossed
+untotaled
+untotalled
+untottering
+untouch
+untouchability
+untouchable
+untouchableness
+untouchably
+untouched
+untouchedness
+untouching
+untough
+untoured
+untouristed
+untoward
+untowardliness
+untowardly
+untowardness
+untowered
+untown
+untownlike
+untrace
+untraceable
+untraceableness
+untraceably
+untraced
+untraceried
+untracked
+untractability
+untractable
+untractableness
+untractably
+untractarian
+untractible
+untractibleness
+untradeable
+untraded
+untradesmanlike
+untrading
+untraditional
+untraduced
+untraffickable
+untrafficked
+untragic
+untragical
+untrailed
+untrain
+untrainable
+untrained
+untrainedly
+untrainedness
+untraitored
+untraitorous
+untrammed
+untrammeled
+untrammeledness
+untramped
+untrampled
+untrance
+untranquil
+untranquilized
+untranquillize
+untranquillized
+untransacted
+untranscended
+untranscendental
+untranscribable
+untranscribed
+untransferable
+untransferred
+untransfigured
+untransfixed
+untransformable
+untransformed
+untransforming
+untransfused
+untransfusible
+untransgressed
+untransient
+untransitable
+untransitive
+untransitory
+untranslatability
+untranslatable
+untranslatableness
+untranslatably
+untranslated
+untransmigrated
+untransmissible
+untransmitted
+untransmutable
+untransmuted
+untransparent
+untranspassable
+untranspired
+untranspiring
+untransplanted
+untransportable
+untransported
+untransposed
+untransubstantiated
+untrappable
+untrapped
+untrashed
+untravelable
+untraveled
+untraveling
+untravellable
+untravelling
+untraversable
+untraversed
+untravestied
+untreacherous
+untread
+untreadable
+untreading
+untreasonable
+untreasure
+untreasured
+untreatable
+untreatableness
+untreatably
+untreated
+untreed
+untrekked
+untrellised
+untrembling
+untremblingly
+untremendous
+untremulous
+untrenched
+untrepanned
+untrespassed
+untrespassing
+untress
+untressed
+untriable
+untribal
+untributary
+untriced
+untrickable
+untricked
+untried
+untrifling
+untrig
+untrigonometrical
+untrill
+untrim
+untrimmable
+untrimmed
+untrimmedness
+untrinitarian
+untripe
+untrippable
+untripped
+untripping
+untrite
+untriturated
+untriumphable
+untriumphant
+untriumphed
+untrochaic
+untrod
+untrodden
+untroddenness
+untrolled
+untrophied
+untropical
+untrotted
+untroublable
+untrouble
+untroubled
+untroubledly
+untroubledness
+untroublesome
+untroublesomeness
+untrounced
+untrowed
+untruant
+untruck
+untruckled
+untruckling
+untrue
+untrueness
+untruism
+untruly
+untrumped
+untrumpeted
+untrumping
+untrundled
+untrunked
+untruss
+untrussed
+untrusser
+untrussing
+untrust
+untrustably
+untrusted
+untrustful
+untrustiness
+untrusting
+untrustworthily
+untrustworthiness
+untrustworthy
+untrusty
+untruth
+untruther
+untruthful
+untruthfully
+untruthfulness
+untrying
+untubbed
+untuck
+untucked
+untuckered
+untucking
+untufted
+untugged
+untumbled
+untumefied
+untumid
+untumultuous
+untunable
+untunableness
+untunably
+untune
+untuneable
+untuneableness
+untuneably
+untuned
+untuneful
+untunefully
+untunefulness
+untuning
+untunneled
+untupped
+unturbaned
+unturbid
+unturbulent
+unturf
+unturfed
+unturgid
+unturn
+unturnable
+unturned
+unturning
+unturpentined
+unturreted
+untusked
+untutelar
+untutored
+untutoredly
+untutoredness
+untwilled
+untwinable
+untwine
+untwineable
+untwined
+untwining
+untwinkling
+untwinned
+untwirl
+untwirled
+untwirling
+untwist
+untwisted
+untwister
+untwisting
+untwitched
+untying
+untypical
+untypically
+untyrannic
+untyrannical
+untyrantlike
+untz
+unubiquitous
+unugly
+unulcerated
+unultra
+unumpired
+ununanimity
+ununanimous
+ununanimously
+ununderstandable
+ununderstandably
+ununderstanding
+ununderstood
+unundertaken
+unundulatory
+Unungun
+ununifiable
+ununified
+ununiform
+ununiformed
+ununiformity
+ununiformly
+ununiformness
+ununitable
+ununitableness
+ununitably
+ununited
+ununiting
+ununiversity
+ununiversitylike
+unupbraiding
+unupbraidingly
+unupholstered
+unupright
+unuprightly
+unuprightness
+unupset
+unupsettable
+unurban
+unurbane
+unurged
+unurgent
+unurging
+unurn
+unurned
+unusable
+unusableness
+unusably
+unuse
+unused
+unusedness
+unuseful
+unusefully
+unusefulness
+unushered
+unusual
+unusuality
+unusually
+unusualness
+unusurious
+unusurped
+unusurping
+unutilizable
+unutterability
+unutterable
+unutterableness
+unutterably
+unuttered
+unuxorial
+unuxorious
+unvacant
+unvaccinated
+unvacillating
+unvailable
+unvain
+unvaleted
+unvaletudinary
+unvaliant
+unvalid
+unvalidated
+unvalidating
+unvalidity
+unvalidly
+unvalidness
+unvalorous
+unvaluable
+unvaluableness
+unvaluably
+unvalue
+unvalued
+unvamped
+unvanishing
+unvanquishable
+unvanquished
+unvantaged
+unvaporized
+unvariable
+unvariableness
+unvariably
+unvariant
+unvaried
+unvariedly
+unvariegated
+unvarnished
+unvarnishedly
+unvarnishedness
+unvarying
+unvaryingly
+unvaryingness
+unvascular
+unvassal
+unvatted
+unvaulted
+unvaulting
+unvaunted
+unvaunting
+unvauntingly
+unveering
+unveil
+unveiled
+unveiledly
+unveiledness
+unveiler
+unveiling
+unveilment
+unveined
+unvelvety
+unvendable
+unvendableness
+unvended
+unvendible
+unvendibleness
+unveneered
+unvenerable
+unvenerated
+unvenereal
+unvenged
+unveniable
+unvenial
+unvenom
+unvenomed
+unvenomous
+unventable
+unvented
+unventilated
+unventured
+unventurous
+unvenued
+unveracious
+unveracity
+unverbalized
+unverdant
+unverdured
+unveridical
+unverifiable
+unverifiableness
+unverifiably
+unverified
+unverifiedness
+unveritable
+unverity
+unvermiculated
+unverminous
+unvernicular
+unversatile
+unversed
+unversedly
+unversedness
+unversified
+unvertical
+unvessel
+unvesseled
+unvest
+unvested
+unvetoed
+unvexed
+unviable
+unvibrated
+unvibrating
+unvicar
+unvicarious
+unvicariously
+unvicious
+unvictimized
+unvictorious
+unvictualed
+unvictualled
+unviewable
+unviewed
+unvigilant
+unvigorous
+unvigorously
+unvilified
+unvillaged
+unvindicated
+unvindictive
+unvindictively
+unvindictiveness
+unvinous
+unvintaged
+unviolable
+unviolated
+unviolenced
+unviolent
+unviolined
+unvirgin
+unvirginal
+unvirginlike
+unvirile
+unvirility
+unvirtue
+unvirtuous
+unvirtuously
+unvirtuousness
+unvirulent
+unvisible
+unvisibleness
+unvisibly
+unvision
+unvisionary
+unvisioned
+unvisitable
+unvisited
+unvisor
+unvisored
+unvisualized
+unvital
+unvitalized
+unvitalness
+unvitiated
+unvitiatedly
+unvitiatedness
+unvitrescibility
+unvitrescible
+unvitrifiable
+unvitrified
+unvitriolized
+unvituperated
+unvivacious
+unvivid
+unvivified
+unvizard
+unvizarded
+unvocal
+unvocalized
+unvociferous
+unvoice
+unvoiced
+unvoiceful
+unvoicing
+unvoidable
+unvoided
+unvolatile
+unvolatilize
+unvolatilized
+unvolcanic
+unvolitioned
+unvoluminous
+unvoluntarily
+unvoluntariness
+unvoluntary
+unvolunteering
+unvoluptuous
+unvomited
+unvoracious
+unvote
+unvoted
+unvoting
+unvouched
+unvouchedly
+unvouchedness
+unvouchsafed
+unvowed
+unvoweled
+unvoyageable
+unvoyaging
+unvulcanized
+unvulgar
+unvulgarize
+unvulgarized
+unvulgarly
+unvulnerable
+unwadable
+unwadded
+unwadeable
+unwaded
+unwading
+unwafted
+unwaged
+unwagered
+unwaggable
+unwaggably
+unwagged
+unwailed
+unwailing
+unwainscoted
+unwaited
+unwaiting
+unwaked
+unwakeful
+unwakefulness
+unwakened
+unwakening
+unwaking
+unwalkable
+unwalked
+unwalking
+unwall
+unwalled
+unwallet
+unwallowed
+unwan
+unwandered
+unwandering
+unwaning
+unwanted
+unwanton
+unwarbled
+unware
+unwarely
+unwareness
+unwarily
+unwariness
+unwarlike
+unwarlikeness
+unwarm
+unwarmable
+unwarmed
+unwarming
+unwarn
+unwarned
+unwarnedly
+unwarnedness
+unwarnished
+unwarp
+unwarpable
+unwarped
+unwarping
+unwarrant
+unwarrantability
+unwarrantable
+unwarrantableness
+unwarrantably
+unwarranted
+unwarrantedly
+unwarrantedness
+unwary
+unwashable
+unwashed
+unwashedness
+unwassailing
+unwastable
+unwasted
+unwasteful
+unwastefully
+unwasting
+unwastingly
+unwatchable
+unwatched
+unwatchful
+unwatchfully
+unwatchfulness
+unwatching
+unwater
+unwatered
+unwaterlike
+unwatermarked
+unwatery
+unwattled
+unwaved
+unwaverable
+unwavered
+unwavering
+unwaveringly
+unwaving
+unwax
+unwaxed
+unwayed
+unwayward
+unweaken
+unweakened
+unweal
+unwealsomeness
+unwealthy
+unweaned
+unweapon
+unweaponed
+unwearable
+unweariability
+unweariable
+unweariableness
+unweariably
+unwearied
+unweariedly
+unweariedness
+unwearily
+unweariness
+unwearing
+unwearisome
+unwearisomeness
+unweary
+unwearying
+unwearyingly
+unweathered
+unweatherly
+unweatherwise
+unweave
+unweaving
+unweb
+unwebbed
+unwebbing
+unwed
+unwedded
+unweddedly
+unweddedness
+unwedge
+unwedgeable
+unwedged
+unweeded
+unweel
+unweelness
+unweened
+unweeping
+unweeting
+unweetingly
+unweft
+unweighable
+unweighed
+unweighing
+unweight
+unweighted
+unweighty
+unwelcome
+unwelcomed
+unwelcomely
+unwelcomeness
+unweld
+unweldable
+unwelded
+unwell
+unwellness
+unwelted
+unwept
+unwestern
+unwesternized
+unwet
+unwettable
+unwetted
+unwheedled
+unwheel
+unwheeled
+unwhelmed
+unwhelped
+unwhetted
+unwhig
+unwhiglike
+unwhimsical
+unwhining
+unwhip
+unwhipped
+unwhirled
+unwhisked
+unwhiskered
+unwhisperable
+unwhispered
+unwhispering
+unwhistled
+unwhite
+unwhited
+unwhitened
+unwhitewashed
+unwholesome
+unwholesomely
+unwholesomeness
+unwidened
+unwidowed
+unwield
+unwieldable
+unwieldily
+unwieldiness
+unwieldly
+unwieldy
+unwifed
+unwifelike
+unwifely
+unwig
+unwigged
+unwild
+unwilily
+unwiliness
+unwill
+unwilled
+unwillful
+unwillfully
+unwillfulness
+unwilling
+unwillingly
+unwillingness
+unwilted
+unwilting
+unwily
+unwincing
+unwincingly
+unwind
+unwindable
+unwinding
+unwindingly
+unwindowed
+unwindy
+unwingable
+unwinged
+unwinking
+unwinkingly
+unwinnable
+unwinning
+unwinnowed
+unwinsome
+unwinter
+unwintry
+unwiped
+unwire
+unwired
+unwisdom
+unwise
+unwisely
+unwiseness
+unwish
+unwished
+unwishful
+unwishing
+unwist
+unwistful
+unwitch
+unwitched
+unwithdrawable
+unwithdrawing
+unwithdrawn
+unwitherable
+unwithered
+unwithering
+unwithheld
+unwithholden
+unwithholding
+unwithstanding
+unwithstood
+unwitless
+unwitnessed
+unwitted
+unwittily
+unwitting
+unwittingly
+unwittingness
+unwitty
+unwive
+unwived
+unwoeful
+unwoful
+unwoman
+unwomanish
+unwomanize
+unwomanized
+unwomanlike
+unwomanliness
+unwomanly
+unwomb
+unwon
+unwonder
+unwonderful
+unwondering
+unwonted
+unwontedly
+unwontedness
+unwooded
+unwooed
+unwoof
+unwooly
+unwordable
+unwordably
+unwordily
+unwordy
+unwork
+unworkability
+unworkable
+unworkableness
+unworkably
+unworked
+unworkedness
+unworker
+unworking
+unworkmanlike
+unworkmanly
+unworld
+unworldliness
+unworldly
+unwormed
+unwormy
+unworn
+unworried
+unworriedly
+unworriedness
+unworshiped
+unworshipful
+unworshiping
+unworshipped
+unworshipping
+unworth
+unworthily
+unworthiness
+unworthy
+unwotting
+unwound
+unwoundable
+unwoundableness
+unwounded
+unwoven
+unwrangling
+unwrap
+unwrapped
+unwrapper
+unwrapping
+unwrathful
+unwrathfully
+unwreaked
+unwreathe
+unwreathed
+unwreathing
+unwrecked
+unwrench
+unwrenched
+unwrested
+unwrestedly
+unwresting
+unwrestled
+unwretched
+unwriggled
+unwrinkle
+unwrinkleable
+unwrinkled
+unwrit
+unwritable
+unwrite
+unwriteable
+unwriting
+unwritten
+unwronged
+unwrongful
+unwrought
+unwrung
+unyachtsmanlike
+unyeaned
+unyearned
+unyearning
+unyielded
+unyielding
+unyieldingly
+unyieldingness
+unyoke
+unyoked
+unyoking
+unyoung
+unyouthful
+unyouthfully
+unze
+unzealous
+unzealously
+unzealousness
+unzen
+unzephyrlike
+unzone
+unzoned
+up
+upaisle
+upaithric
+upalley
+upalong
+upanishadic
+upapurana
+uparch
+uparching
+uparise
+uparm
+uparna
+upas
+upattic
+upavenue
+upbank
+upbar
+upbay
+upbear
+upbearer
+upbeat
+upbelch
+upbelt
+upbend
+upbid
+upbind
+upblacken
+upblast
+upblaze
+upblow
+upboil
+upbolster
+upbolt
+upboost
+upborne
+upbotch
+upboulevard
+upbound
+upbrace
+upbraid
+upbraider
+upbraiding
+upbraidingly
+upbray
+upbreak
+upbred
+upbreed
+upbreeze
+upbrighten
+upbrim
+upbring
+upbristle
+upbroken
+upbrook
+upbrought
+upbrow
+upbubble
+upbuild
+upbuilder
+upbulging
+upbuoy
+upbuoyance
+upburn
+upburst
+upbuy
+upcall
+upcanal
+upcanyon
+upcarry
+upcast
+upcatch
+upcaught
+upchamber
+upchannel
+upchariot
+upchimney
+upchoke
+upchuck
+upcity
+upclimb
+upclose
+upcloser
+upcoast
+upcock
+upcoil
+upcolumn
+upcome
+upcoming
+upconjure
+upcountry
+upcourse
+upcover
+upcrane
+upcrawl
+upcreek
+upcreep
+upcrop
+upcrowd
+upcry
+upcurl
+upcurrent
+upcurve
+upcushion
+upcut
+updart
+update
+updeck
+updelve
+updive
+updo
+updome
+updraft
+updrag
+updraw
+updrink
+updry
+upeat
+upend
+upeygan
+upfeed
+upfield
+upfill
+upfingered
+upflame
+upflare
+upflash
+upflee
+upflicker
+upfling
+upfloat
+upflood
+upflow
+upflower
+upflung
+upfly
+upfold
+upfollow
+upframe
+upfurl
+upgale
+upgang
+upgape
+upgather
+upgaze
+upget
+upgird
+upgirt
+upgive
+upglean
+upglide
+upgo
+upgorge
+upgrade
+upgrave
+upgrow
+upgrowth
+upgully
+upgush
+uphand
+uphang
+upharbor
+upharrow
+uphasp
+upheal
+upheap
+uphearted
+upheaval
+upheavalist
+upheave
+upheaven
+upheld
+uphelm
+uphelya
+upher
+uphill
+uphillward
+uphoard
+uphoist
+uphold
+upholden
+upholder
+upholster
+upholstered
+upholsterer
+upholsteress
+upholsterous
+upholstery
+upholsterydom
+upholstress
+uphung
+uphurl
+upisland
+upjerk
+upjet
+upkeep
+upkindle
+upknell
+upknit
+upla
+upladder
+uplaid
+uplake
+upland
+uplander
+uplandish
+uplane
+uplay
+uplead
+upleap
+upleg
+uplick
+uplift
+upliftable
+uplifted
+upliftedly
+upliftedness
+uplifter
+uplifting
+upliftingly
+upliftingness
+upliftitis
+upliftment
+uplight
+uplimb
+uplimber
+upline
+uplock
+uplong
+uplook
+uplooker
+uploom
+uploop
+uplying
+upmaking
+upmast
+upmix
+upmost
+upmount
+upmountain
+upmove
+upness
+upo
+upon
+uppard
+uppent
+upper
+upperch
+uppercut
+upperer
+upperest
+upperhandism
+uppermore
+uppermost
+uppers
+uppertendom
+uppile
+upping
+uppish
+uppishly
+uppishness
+uppity
+upplough
+upplow
+uppluck
+uppoint
+uppoise
+uppop
+uppour
+uppowoc
+upprick
+upprop
+uppuff
+uppull
+uppush
+upquiver
+upraisal
+upraise
+upraiser
+upreach
+uprear
+uprein
+uprend
+uprender
+uprest
+uprestore
+uprid
+upridge
+upright
+uprighteous
+uprighteously
+uprighteousness
+uprighting
+uprightish
+uprightly
+uprightness
+uprights
+uprip
+uprisal
+uprise
+uprisement
+uprisen
+upriser
+uprising
+uprist
+uprive
+upriver
+uproad
+uproar
+uproariness
+uproarious
+uproariously
+uproariousness
+uproom
+uproot
+uprootal
+uprooter
+uprose
+uprouse
+uproute
+uprun
+uprush
+upsaddle
+upscale
+upscrew
+upscuddle
+upseal
+upseek
+upseize
+upsend
+upset
+upsetment
+upsettable
+upsettal
+upsetted
+upsetter
+upsetting
+upsettingly
+upsey
+upshaft
+upshear
+upsheath
+upshoot
+upshore
+upshot
+upshoulder
+upshove
+upshut
+upside
+upsides
+upsighted
+upsiloid
+upsilon
+upsilonism
+upsit
+upsitten
+upsitting
+upslant
+upslip
+upslope
+upsmite
+upsnatch
+upsoak
+upsoar
+upsolve
+upspeak
+upspear
+upspeed
+upspew
+upspin
+upspire
+upsplash
+upspout
+upspread
+upspring
+upsprinkle
+upsprout
+upspurt
+upstaff
+upstage
+upstair
+upstairs
+upstamp
+upstand
+upstander
+upstanding
+upstare
+upstart
+upstartism
+upstartle
+upstartness
+upstate
+upstater
+upstaunch
+upstay
+upsteal
+upsteam
+upstem
+upstep
+upstick
+upstir
+upstraight
+upstream
+upstreamward
+upstreet
+upstretch
+upstrike
+upstrive
+upstroke
+upstruggle
+upsuck
+upsun
+upsup
+upsurge
+upsurgence
+upswallow
+upswarm
+upsway
+upsweep
+upswell
+upswing
+uptable
+uptake
+uptaker
+uptear
+uptemper
+uptend
+upthrow
+upthrust
+upthunder
+uptide
+uptie
+uptill
+uptilt
+uptorn
+uptoss
+uptower
+uptown
+uptowner
+uptrace
+uptrack
+uptrail
+uptrain
+uptree
+uptrend
+uptrill
+uptrunk
+uptruss
+uptube
+uptuck
+upturn
+uptwined
+uptwist
+Upupa
+Upupidae
+upupoid
+upvalley
+upvomit
+upwaft
+upwall
+upward
+upwardly
+upwardness
+upwards
+upwarp
+upwax
+upway
+upways
+upwell
+upwent
+upwheel
+upwhelm
+upwhir
+upwhirl
+upwind
+upwith
+upwork
+upwound
+upwrap
+upwreathe
+upwrench
+upwring
+upwrought
+upyard
+upyoke
+ur
+ura
+urachal
+urachovesical
+urachus
+uracil
+uraemic
+uraeus
+Uragoga
+Ural
+ural
+urali
+Uralian
+Uralic
+uraline
+uralite
+uralitic
+uralitization
+uralitize
+uralium
+uramido
+uramil
+uramilic
+uramino
+Uran
+uran
+uranalysis
+uranate
+Urania
+Uranian
+uranic
+Uranicentric
+uranidine
+uraniferous
+uraniid
+Uraniidae
+uranin
+uranine
+uraninite
+uranion
+uraniscochasma
+uraniscoplasty
+uraniscoraphy
+uraniscorrhaphy
+uranism
+uranist
+uranite
+uranitic
+uranium
+uranocircite
+uranographer
+uranographic
+uranographical
+uranographist
+uranography
+uranolatry
+uranolite
+uranological
+uranology
+uranometria
+uranometrical
+uranometry
+uranophane
+uranophotography
+uranoplastic
+uranoplasty
+uranoplegia
+uranorrhaphia
+uranorrhaphy
+uranoschisis
+uranoschism
+uranoscope
+uranoscopia
+uranoscopic
+Uranoscopidae
+Uranoscopus
+uranoscopy
+uranospathite
+uranosphaerite
+uranospinite
+uranostaphyloplasty
+uranostaphylorrhaphy
+uranotantalite
+uranothallite
+uranothorite
+uranotil
+uranous
+Uranus
+uranyl
+uranylic
+urao
+urare
+urari
+Urartaean
+Urartic
+urase
+urataemia
+urate
+uratemia
+uratic
+uratoma
+uratosis
+uraturia
+urazine
+urazole
+urbacity
+urbainite
+Urban
+urban
+urbane
+urbanely
+urbaneness
+urbanism
+Urbanist
+urbanist
+urbanite
+urbanity
+urbanization
+urbanize
+urbarial
+urbian
+urbic
+Urbicolae
+urbicolous
+urbification
+urbify
+urbinate
+urceiform
+urceolar
+urceolate
+urceole
+urceoli
+Urceolina
+urceolus
+urceus
+urchin
+urchiness
+urchinlike
+urchinly
+urd
+urde
+urdee
+Urdu
+ure
+urea
+ureal
+ureameter
+ureametry
+urease
+urechitin
+urechitoxin
+uredema
+Uredinales
+uredine
+Uredineae
+uredineal
+uredineous
+uredinia
+uredinial
+Urediniopsis
+urediniospore
+urediniosporic
+uredinium
+uredinoid
+uredinologist
+uredinology
+uredinous
+Uredo
+uredo
+uredosorus
+uredospore
+uredosporic
+uredosporiferous
+uredosporous
+uredostage
+ureic
+ureid
+ureide
+ureido
+uremia
+uremic
+Urena
+urent
+ureometer
+ureometry
+ureosecretory
+uresis
+uretal
+ureter
+ureteral
+ureteralgia
+uretercystoscope
+ureterectasia
+ureterectasis
+ureterectomy
+ureteric
+ureteritis
+ureterocele
+ureterocervical
+ureterocolostomy
+ureterocystanastomosis
+ureterocystoscope
+ureterocystostomy
+ureterodialysis
+ureteroenteric
+ureteroenterostomy
+ureterogenital
+ureterogram
+ureterograph
+ureterography
+ureterointestinal
+ureterolith
+ureterolithiasis
+ureterolithic
+ureterolithotomy
+ureterolysis
+ureteronephrectomy
+ureterophlegma
+ureteroplasty
+ureteroproctostomy
+ureteropyelitis
+ureteropyelogram
+ureteropyelography
+ureteropyelonephritis
+ureteropyelostomy
+ureteropyosis
+ureteroradiography
+ureterorectostomy
+ureterorrhagia
+ureterorrhaphy
+ureterosalpingostomy
+ureterosigmoidostomy
+ureterostegnosis
+ureterostenoma
+ureterostenosis
+ureterostoma
+ureterostomy
+ureterotomy
+ureterouteral
+ureterovaginal
+ureterovesical
+urethan
+urethane
+urethra
+urethrae
+urethragraph
+urethral
+urethralgia
+urethrameter
+urethrascope
+urethratome
+urethratresia
+urethrectomy
+urethremphraxis
+urethreurynter
+urethrism
+urethritic
+urethritis
+urethroblennorrhea
+urethrobulbar
+urethrocele
+urethrocystitis
+urethrogenital
+urethrogram
+urethrograph
+urethrometer
+urethropenile
+urethroperineal
+urethrophyma
+urethroplastic
+urethroplasty
+urethroprostatic
+urethrorectal
+urethrorrhagia
+urethrorrhaphy
+urethrorrhea
+urethrorrhoea
+urethroscope
+urethroscopic
+urethroscopical
+urethroscopy
+urethrosexual
+urethrospasm
+urethrostaxis
+urethrostenosis
+urethrostomy
+urethrotome
+urethrotomic
+urethrotomy
+urethrovaginal
+urethrovesical
+urethylan
+uretic
+ureylene
+urf
+urfirnis
+urge
+urgence
+urgency
+urgent
+urgently
+urgentness
+urger
+Urginea
+urging
+urgingly
+Urgonian
+urheen
+Uri
+Uria
+Uriah
+urial
+Urian
+uric
+uricacidemia
+uricaciduria
+uricaemia
+uricaemic
+uricemia
+uricemic
+uricolysis
+uricolytic
+uridrosis
+Uriel
+urinaemia
+urinal
+urinalist
+urinalysis
+urinant
+urinarium
+urinary
+urinate
+urination
+urinative
+urinator
+urine
+urinemia
+uriniferous
+uriniparous
+urinocryoscopy
+urinogenital
+urinogenitary
+urinogenous
+urinologist
+urinology
+urinomancy
+urinometer
+urinometric
+urinometry
+urinoscopic
+urinoscopist
+urinoscopy
+urinose
+urinosexual
+urinous
+urinousness
+urite
+urlar
+urled
+urling
+urluch
+urman
+urn
+urna
+urnae
+urnal
+urnflower
+urnful
+urning
+urningism
+urnism
+urnlike
+urnmaker
+Uro
+uroacidimeter
+uroazotometer
+urobenzoic
+urobilin
+urobilinemia
+urobilinogen
+urobilinogenuria
+urobilinuria
+urocanic
+urocele
+Urocerata
+urocerid
+Uroceridae
+urochloralic
+urochord
+Urochorda
+urochordal
+urochordate
+urochrome
+urochromogen
+Urocoptidae
+Urocoptis
+urocyanogen
+Urocyon
+urocyst
+urocystic
+Urocystis
+urocystitis
+urodaeum
+Urodela
+urodelan
+urodele
+urodelous
+urodialysis
+urodynia
+uroedema
+uroerythrin
+urofuscohematin
+urogaster
+urogastric
+urogenic
+urogenital
+urogenitary
+urogenous
+uroglaucin
+Uroglena
+urogram
+urography
+urogravimeter
+urohematin
+urohyal
+urolagnia
+uroleucic
+uroleucinic
+urolith
+urolithiasis
+urolithic
+urolithology
+urologic
+urological
+urologist
+urology
+urolutein
+urolytic
+uromancy
+uromantia
+uromantist
+Uromastix
+uromelanin
+uromelus
+uromere
+uromeric
+urometer
+Uromyces
+Uromycladium
+uronephrosis
+uronic
+uronology
+uropatagium
+Uropeltidae
+urophanic
+urophanous
+urophein
+Urophlyctis
+urophthisis
+uroplania
+uropod
+uropodal
+uropodous
+uropoetic
+uropoiesis
+uropoietic
+uroporphyrin
+uropsile
+Uropsilus
+uroptysis
+Uropygi
+uropygial
+uropygium
+uropyloric
+urorosein
+urorrhagia
+urorrhea
+urorubin
+urosaccharometry
+urosacral
+uroschesis
+uroscopic
+uroscopist
+uroscopy
+urosepsis
+uroseptic
+urosis
+urosomatic
+urosome
+urosomite
+urosomitic
+urostea
+urostealith
+urostegal
+urostege
+urostegite
+urosteon
+urosternite
+urosthene
+urosthenic
+urostylar
+urostyle
+urotoxia
+urotoxic
+urotoxicity
+urotoxin
+urotoxy
+uroxanate
+uroxanic
+uroxanthin
+uroxin
+urradhus
+urrhodin
+urrhodinic
+Urs
+Ursa
+ursal
+ursicidal
+ursicide
+Ursid
+Ursidae
+ursiform
+ursigram
+ursine
+ursoid
+ursolic
+urson
+ursone
+ursuk
+Ursula
+Ursuline
+Ursus
+Urtica
+urtica
+Urticaceae
+urticaceous
+Urticales
+urticant
+urticaria
+urticarial
+urticarious
+Urticastrum
+urticate
+urticating
+urtication
+urticose
+urtite
+Uru
+urubu
+urucu
+urucuri
+Uruguayan
+uruisg
+Urukuena
+urunday
+urus
+urushi
+urushic
+urushinic
+urushiol
+urushiye
+urva
+us
+usability
+usable
+usableness
+usage
+usager
+usance
+usar
+usara
+usaron
+usation
+use
+used
+usedly
+usedness
+usednt
+usee
+useful
+usefullish
+usefully
+usefulness
+usehold
+useless
+uselessly
+uselessness
+usent
+user
+ush
+ushabti
+ushabtiu
+Ushak
+Usheen
+usher
+usherance
+usherdom
+usherer
+usheress
+usherette
+Usherian
+usherian
+usherism
+usherless
+ushership
+usings
+Usipetes
+usitate
+usitative
+Uskara
+Uskok
+Usnea
+usnea
+Usneaceae
+usneaceous
+usneoid
+usnic
+usninic
+Uspanteca
+usque
+usquebaugh
+usself
+ussels
+usselven
+ussingite
+ust
+Ustarana
+uster
+Ustilaginaceae
+ustilaginaceous
+Ustilaginales
+ustilagineous
+Ustilaginoidea
+Ustilago
+ustion
+ustorious
+ustulate
+ustulation
+Ustulina
+usual
+usualism
+usually
+usualness
+usuary
+usucapient
+usucapion
+usucapionary
+usucapt
+usucaptable
+usucaption
+usucaptor
+usufruct
+usufructuary
+Usun
+usure
+usurer
+usurerlike
+usuress
+usurious
+usuriously
+usuriousness
+usurp
+usurpation
+usurpative
+usurpatively
+usurpatory
+usurpature
+usurpedly
+usurper
+usurpership
+usurping
+usurpingly
+usurpment
+usurpor
+usurpress
+usury
+usward
+uswards
+ut
+Uta
+uta
+Utah
+Utahan
+utahite
+utai
+utas
+utch
+utchy
+Ute
+utees
+utensil
+uteralgia
+uterectomy
+uteri
+uterine
+uteritis
+uteroabdominal
+uterocele
+uterocervical
+uterocystotomy
+uterofixation
+uterogestation
+uterogram
+uterography
+uterointestinal
+uterolith
+uterology
+uteromania
+uterometer
+uteroovarian
+uteroparietal
+uteropelvic
+uteroperitoneal
+uteropexia
+uteropexy
+uteroplacental
+uteroplasty
+uterosacral
+uterosclerosis
+uteroscope
+uterotomy
+uterotonic
+uterotubal
+uterovaginal
+uteroventral
+uterovesical
+uterus
+utfangenethef
+utfangethef
+utfangthef
+utfangthief
+utick
+utile
+utilitarian
+utilitarianism
+utilitarianist
+utilitarianize
+utilitarianly
+utility
+utilizable
+utilization
+utilize
+utilizer
+utinam
+utmost
+utmostness
+Utopia
+utopia
+Utopian
+utopian
+utopianism
+utopianist
+Utopianize
+Utopianizer
+utopianizer
+utopiast
+utopism
+utopist
+utopistic
+utopographer
+Utraquism
+utraquist
+utraquistic
+Utrecht
+utricle
+utricul
+utricular
+Utricularia
+Utriculariaceae
+utriculate
+utriculiferous
+utriculiform
+utriculitis
+utriculoid
+utriculoplastic
+utriculoplasty
+utriculosaccular
+utriculose
+utriculus
+utriform
+utrubi
+utrum
+utsuk
+utter
+utterability
+utterable
+utterableness
+utterance
+utterancy
+utterer
+utterless
+utterly
+uttermost
+utterness
+utu
+utum
+uturuncu
+uva
+uval
+uvalha
+uvanite
+uvarovite
+uvate
+uvea
+uveal
+uveitic
+uveitis
+Uvella
+uveous
+uvic
+uvid
+uviol
+uvitic
+uvitinic
+uvito
+uvitonic
+uvrou
+uvula
+uvulae
+uvular
+Uvularia
+uvularly
+uvulitis
+uvuloptosis
+uvulotome
+uvulotomy
+uvver
+uxorial
+uxoriality
+uxorially
+uxoricidal
+uxoricide
+uxorious
+uxoriously
+uxoriousness
+uzan
+uzara
+uzarin
+uzaron
+Uzbak
+Uzbeg
+Uzbek
+V
+v
+vaagmer
+vaalite
+Vaalpens
+vacabond
+vacancy
+vacant
+vacanthearted
+vacantheartedness
+vacantly
+vacantness
+vacantry
+vacatable
+vacate
+vacation
+vacational
+vacationer
+vacationist
+vacationless
+vacatur
+Vaccaria
+vaccary
+vaccenic
+vaccicide
+vaccigenous
+vaccina
+vaccinable
+vaccinal
+vaccinate
+vaccination
+vaccinationist
+vaccinator
+vaccinatory
+vaccine
+vaccinee
+vaccinella
+vaccinia
+Vacciniaceae
+vacciniaceous
+vaccinial
+vaccinifer
+vacciniform
+vacciniola
+vaccinist
+Vaccinium
+vaccinium
+vaccinization
+vaccinogenic
+vaccinogenous
+vaccinoid
+vaccinophobia
+vaccinotherapy
+vache
+Vachellia
+vachette
+vacillancy
+vacillant
+vacillate
+vacillating
+vacillatingly
+vacillation
+vacillator
+vacillatory
+vacoa
+vacona
+vacoua
+vacouf
+vacual
+vacuate
+vacuation
+vacuefy
+vacuist
+vacuity
+vacuolar
+vacuolary
+vacuolate
+vacuolated
+vacuolation
+vacuole
+vacuolization
+vacuome
+vacuometer
+vacuous
+vacuously
+vacuousness
+vacuum
+vacuuma
+vacuumize
+vade
+Vadim
+vadimonium
+vadimony
+vadium
+vadose
+vady
+vag
+vagabond
+vagabondage
+vagabondager
+vagabondia
+vagabondish
+vagabondism
+vagabondismus
+vagabondize
+vagabondizer
+vagabondry
+vagal
+vagarian
+vagarious
+vagariously
+vagarish
+vagarisome
+vagarist
+vagaristic
+vagarity
+vagary
+vagas
+vage
+vagiform
+vagile
+vagina
+vaginal
+vaginalectomy
+vaginaless
+vaginalitis
+vaginant
+vaginate
+vaginated
+vaginectomy
+vaginervose
+Vaginicola
+vaginicoline
+vaginicolous
+vaginiferous
+vaginipennate
+vaginismus
+vaginitis
+vaginoabdominal
+vaginocele
+vaginodynia
+vaginofixation
+vaginolabial
+vaginometer
+vaginomycosis
+vaginoperineal
+vaginoperitoneal
+vaginopexy
+vaginoplasty
+vaginoscope
+vaginoscopy
+vaginotome
+vaginotomy
+vaginovesical
+vaginovulvar
+vaginula
+vaginulate
+vaginule
+vagitus
+Vagnera
+vagoaccessorius
+vagodepressor
+vagoglossopharyngeal
+vagogram
+vagolysis
+vagosympathetic
+vagotomize
+vagotomy
+vagotonia
+vagotonic
+vagotropic
+vagotropism
+vagrance
+vagrancy
+vagrant
+vagrantism
+vagrantize
+vagrantlike
+vagrantly
+vagrantness
+vagrate
+vagrom
+vague
+vaguely
+vagueness
+vaguish
+vaguity
+vagulous
+vagus
+vahine
+Vai
+Vaidic
+vail
+vailable
+vain
+vainful
+vainglorious
+vaingloriously
+vaingloriousness
+vainglory
+vainly
+vainness
+vair
+vairagi
+vaire
+vairy
+Vaishnava
+Vaishnavism
+vaivode
+vajra
+vajrasana
+vakass
+vakia
+vakil
+vakkaliga
+Val
+valance
+valanced
+valanche
+valbellite
+vale
+valediction
+valedictorian
+valedictorily
+valedictory
+valence
+Valencia
+Valencian
+valencianite
+Valenciennes
+valency
+valent
+Valentide
+Valentin
+Valentine
+valentine
+Valentinian
+Valentinianism
+valentinite
+valeral
+valeraldehyde
+valeramide
+valerate
+Valeria
+valerian
+Valeriana
+Valerianaceae
+valerianaceous
+Valerianales
+valerianate
+Valerianella
+Valerianoides
+valeric
+Valerie
+valerin
+valerolactone
+valerone
+valeryl
+valerylene
+valet
+valeta
+valetage
+valetdom
+valethood
+valetism
+valetry
+valetudinarian
+valetudinarianism
+valetudinariness
+valetudinarist
+valetudinarium
+valetudinary
+valeur
+valeward
+valgoid
+valgus
+valhall
+Valhalla
+Vali
+vali
+valiance
+valiancy
+valiant
+valiantly
+valiantness
+valid
+validate
+validation
+validatory
+validification
+validity
+validly
+validness
+valine
+valise
+valiseful
+valiship
+Valkyr
+Valkyria
+Valkyrian
+Valkyrie
+vall
+vallancy
+vallar
+vallary
+vallate
+vallated
+vallation
+vallecula
+vallecular
+valleculate
+vallevarite
+valley
+valleyful
+valleyite
+valleylet
+valleylike
+valleyward
+valleywise
+vallicula
+vallicular
+vallidom
+vallis
+Valliscaulian
+Vallisneria
+Vallisneriaceae
+vallisneriaceous
+Vallombrosan
+Vallota
+vallum
+Valmy
+Valois
+valonia
+Valoniaceae
+valoniaceous
+valor
+valorization
+valorize
+valorous
+valorously
+valorousness
+Valsa
+Valsaceae
+Valsalvan
+valse
+valsoid
+valuable
+valuableness
+valuably
+valuate
+valuation
+valuational
+valuator
+value
+valued
+valueless
+valuelessness
+valuer
+valuta
+valva
+valval
+Valvata
+valvate
+Valvatidae
+valve
+valved
+valveless
+valvelet
+valvelike
+valveman
+valviferous
+valviform
+valvotomy
+valvula
+valvular
+valvulate
+valvule
+valvulitis
+valvulotome
+valvulotomy
+valyl
+valylene
+vambrace
+vambraced
+vamfont
+vammazsa
+vamoose
+vamp
+vamped
+vamper
+vamphorn
+vampire
+vampireproof
+vampiric
+vampirish
+vampirism
+vampirize
+vamplate
+vampproof
+Vampyrella
+Vampyrellidae
+Vampyrum
+Van
+van
+vanadate
+vanadiate
+vanadic
+vanadiferous
+vanadinite
+vanadium
+vanadosilicate
+vanadous
+vanadyl
+Vanaheim
+vanaprastha
+Vance
+vancourier
+Vancouveria
+Vanda
+Vandal
+Vandalic
+vandalish
+vandalism
+vandalistic
+vandalization
+vandalize
+vandalroot
+Vandemonian
+Vandemonianism
+Vandiemenian
+Vandyke
+vane
+vaned
+vaneless
+vanelike
+Vanellus
+Vanessa
+vanessian
+vanfoss
+vang
+vangee
+vangeli
+vanglo
+vanguard
+Vanguardist
+Vangueria
+vanilla
+vanillal
+vanillaldehyde
+vanillate
+vanille
+vanillery
+vanillic
+vanillin
+vanillinic
+vanillism
+vanilloes
+vanillon
+vanilloyl
+vanillyl
+Vanir
+vanish
+vanisher
+vanishing
+vanishingly
+vanishment
+Vanist
+vanitarianism
+vanitied
+vanity
+vanjarrah
+vanman
+vanmost
+Vannai
+vanner
+vannerman
+vannet
+Vannic
+vanquish
+vanquishable
+vanquisher
+vanquishment
+vansire
+vantage
+vantageless
+vantbrace
+vantbrass
+vanward
+vapid
+vapidism
+vapidity
+vapidly
+vapidness
+vapocauterization
+vapographic
+vapography
+vapor
+vaporability
+vaporable
+vaporarium
+vaporary
+vaporate
+vapored
+vaporer
+vaporescence
+vaporescent
+vaporiferous
+vaporiferousness
+vaporific
+vaporiform
+vaporimeter
+vaporing
+vaporingly
+vaporish
+vaporishness
+vaporium
+vaporizable
+vaporization
+vaporize
+vaporizer
+vaporless
+vaporlike
+vaporograph
+vaporographic
+vaporose
+vaporoseness
+vaporosity
+vaporous
+vaporously
+vaporousness
+vaportight
+vapory
+vapulary
+vapulate
+vapulation
+vapulatory
+vara
+varahan
+varan
+Varanger
+Varangi
+Varangian
+varanid
+Varanidae
+Varanoid
+Varanus
+Varda
+vardapet
+vardy
+vare
+varec
+vareheaded
+vareuse
+vargueno
+vari
+variability
+variable
+variableness
+variably
+Variag
+variance
+variancy
+variant
+variate
+variation
+variational
+variationist
+variatious
+variative
+variatively
+variator
+varical
+varicated
+varication
+varicella
+varicellar
+varicellate
+varicellation
+varicelliform
+varicelloid
+varicellous
+varices
+variciform
+varicoblepharon
+varicocele
+varicoid
+varicolored
+varicolorous
+varicose
+varicosed
+varicoseness
+varicosis
+varicosity
+varicotomy
+varicula
+varied
+variedly
+variegate
+variegated
+variegation
+variegator
+varier
+varietal
+varietally
+varietism
+varietist
+variety
+variform
+variformed
+variformity
+variformly
+varigradation
+variocoupler
+variola
+variolar
+Variolaria
+variolate
+variolation
+variole
+variolic
+varioliform
+variolite
+variolitic
+variolitization
+variolization
+varioloid
+variolous
+variolovaccine
+variolovaccinia
+variometer
+variorum
+variotinted
+various
+variously
+variousness
+variscite
+varisse
+varix
+varlet
+varletaille
+varletess
+varletry
+varletto
+varment
+varna
+varnashrama
+varnish
+varnished
+varnisher
+varnishing
+varnishlike
+varnishment
+varnishy
+varnpliktige
+varnsingite
+Varolian
+Varronia
+Varronian
+varsha
+varsity
+Varsovian
+varsoviana
+Varuna
+varus
+varve
+varved
+vary
+varyingly
+vas
+Vasa
+vasa
+vasal
+Vascons
+vascular
+vascularity
+vascularization
+vascularize
+vascularly
+vasculated
+vasculature
+vasculiferous
+vasculiform
+vasculitis
+vasculogenesis
+vasculolymphatic
+vasculomotor
+vasculose
+vasculum
+vase
+vasectomize
+vasectomy
+vaseful
+vaselet
+vaselike
+Vaseline
+vasemaker
+vasemaking
+vasewise
+vasework
+vashegyite
+vasicentric
+vasicine
+vasifactive
+vasiferous
+vasiform
+vasoconstricting
+vasoconstriction
+vasoconstrictive
+vasoconstrictor
+vasocorona
+vasodentinal
+vasodentine
+vasodilatation
+vasodilatin
+vasodilating
+vasodilation
+vasodilator
+vasoepididymostomy
+vasofactive
+vasoformative
+vasoganglion
+vasohypertonic
+vasohypotonic
+vasoinhibitor
+vasoinhibitory
+vasoligation
+vasoligature
+vasomotion
+vasomotor
+vasomotorial
+vasomotoric
+vasomotory
+vasoneurosis
+vasoparesis
+vasopressor
+vasopuncture
+vasoreflex
+vasorrhaphy
+vasosection
+vasospasm
+vasospastic
+vasostimulant
+vasostomy
+vasotomy
+vasotonic
+vasotribe
+vasotripsy
+vasotrophic
+vasovesiculectomy
+vasquine
+vassal
+vassalage
+vassaldom
+vassaless
+vassalic
+vassalism
+vassality
+vassalize
+vassalless
+vassalry
+vassalship
+Vassos
+vast
+vastate
+vastation
+vastidity
+vastily
+vastiness
+vastitude
+vastity
+vastly
+vastness
+vasty
+vasu
+Vasudeva
+Vasundhara
+vat
+Vateria
+vatful
+vatic
+vatically
+Vatican
+vaticanal
+vaticanic
+vaticanical
+Vaticanism
+Vaticanist
+Vaticanization
+Vaticanize
+vaticide
+vaticinal
+vaticinant
+vaticinate
+vaticination
+vaticinator
+vaticinatory
+vaticinatress
+vaticinatrix
+vatmaker
+vatmaking
+vatman
+Vatteluttu
+vatter
+vau
+Vaucheria
+Vaucheriaceae
+vaucheriaceous
+vaudeville
+vaudevillian
+vaudevillist
+Vaudism
+Vaudois
+vaudy
+Vaughn
+vaugnerite
+vault
+vaulted
+vaultedly
+vaulter
+vaulting
+vaultlike
+vaulty
+vaunt
+vauntage
+vaunted
+vaunter
+vauntery
+vauntful
+vauntiness
+vaunting
+vauntingly
+vauntmure
+vaunty
+vauquelinite
+Vauxhall
+Vauxhallian
+vauxite
+vavasor
+vavasory
+vaward
+Vayu
+Vazimba
+Veadar
+veal
+vealer
+vealiness
+veallike
+vealskin
+vealy
+vectigal
+vection
+vectis
+vectograph
+vectographic
+vector
+vectorial
+vectorially
+vecture
+Veda
+Vedaic
+Vedaism
+Vedalia
+vedana
+Vedanga
+Vedanta
+Vedantic
+Vedantism
+Vedantist
+Vedda
+Veddoid
+vedette
+Vedic
+vedika
+Vediovis
+Vedism
+Vedist
+vedro
+Veduis
+veduis
+vee
+veen
+veep
+veer
+veerable
+veeringly
+veery
+Vega
+vegasite
+vegeculture
+vegetability
+vegetable
+vegetablelike
+vegetablewise
+vegetablize
+vegetably
+vegetal
+vegetalcule
+vegetality
+vegetant
+vegetarian
+vegetarianism
+vegetate
+vegetation
+vegetational
+vegetationless
+vegetative
+vegetatively
+vegetativeness
+vegete
+vegeteness
+vegetism
+vegetive
+vegetivorous
+vegetoalkali
+vegetoalkaline
+vegetoalkaloid
+vegetoanimal
+vegetobituminous
+vegetocarbonaceous
+vegetomineral
+vehemence
+vehemency
+vehement
+vehemently
+vehicle
+vehicular
+vehicularly
+vehiculary
+vehiculate
+vehiculation
+vehiculatory
+Vehmic
+vei
+veigle
+veil
+veiled
+veiledly
+veiledness
+veiler
+veiling
+veilless
+veillike
+veilmaker
+veilmaking
+Veiltail
+veily
+vein
+veinage
+veinal
+veinbanding
+veined
+veiner
+veinery
+veininess
+veining
+veinless
+veinlet
+veinous
+veinstone
+veinstuff
+veinule
+veinulet
+veinwise
+veinwork
+veiny
+Vejoces
+vejoces
+Vejovis
+Vejoz
+vela
+velal
+velamen
+velamentous
+velamentum
+velar
+velardenite
+velaric
+velarium
+velarize
+velary
+velate
+velated
+velation
+velatura
+Velchanos
+veldcraft
+veldman
+veldschoen
+veldt
+veldtschoen
+Velella
+velellidous
+velic
+veliferous
+veliform
+veliger
+veligerous
+Velika
+velitation
+vell
+vellala
+velleda
+velleity
+vellicate
+vellication
+vellicative
+vellinch
+vellon
+vellosine
+Vellozia
+Velloziaceae
+velloziaceous
+vellum
+vellumy
+velo
+velociman
+velocimeter
+velocious
+velociously
+velocipedal
+velocipede
+velocipedean
+velocipedic
+velocitous
+velocity
+velodrome
+velometer
+velours
+veloutine
+velte
+velum
+velumen
+velure
+Velutina
+velutinous
+velveret
+velvet
+velvetbreast
+velveted
+velveteen
+velveteened
+velvetiness
+velveting
+velvetleaf
+velvetlike
+velvetry
+velvetseed
+velvetweed
+velvetwork
+velvety
+venada
+venal
+venality
+venalization
+venalize
+venally
+venalness
+Venantes
+venanzite
+venatic
+venatical
+venatically
+venation
+venational
+venator
+venatorial
+venatorious
+venatory
+vencola
+Vend
+vend
+vendace
+Vendean
+vendee
+vender
+vendetta
+vendettist
+vendibility
+vendible
+vendibleness
+vendibly
+vendicate
+Vendidad
+vending
+venditate
+venditation
+vendition
+venditor
+vendor
+vendue
+Vened
+Venedotian
+veneer
+veneerer
+veneering
+venefical
+veneficious
+veneficness
+veneficous
+venenate
+venenation
+venene
+veneniferous
+venenific
+venenosalivary
+venenous
+venenousness
+venepuncture
+venerability
+venerable
+venerableness
+venerably
+Veneracea
+veneracean
+veneraceous
+veneral
+Veneralia
+venerance
+venerant
+venerate
+veneration
+venerational
+venerative
+veneratively
+venerativeness
+venerator
+venereal
+venerealness
+venereologist
+venereology
+venerer
+Veneres
+venerial
+Veneridae
+veneriform
+venery
+venesect
+venesection
+venesector
+venesia
+Venetes
+Veneti
+Venetian
+Venetianed
+Venetic
+venezolano
+Venezuelan
+vengeable
+vengeance
+vengeant
+vengeful
+vengefully
+vengefulness
+vengeously
+venger
+venial
+veniality
+venially
+venialness
+Venice
+venie
+venin
+veniplex
+venipuncture
+venireman
+venison
+venisonivorous
+venisonlike
+venisuture
+Venite
+Venizelist
+Venkata
+vennel
+venner
+venoatrial
+venoauricular
+venom
+venomed
+venomer
+venomization
+venomize
+venomly
+venomness
+venomosalivary
+venomous
+venomously
+venomousness
+venomproof
+venomsome
+venomy
+venosal
+venosclerosis
+venose
+venosinal
+venosity
+venostasis
+venous
+venously
+venousness
+vent
+ventage
+ventail
+venter
+Ventersdorp
+venthole
+ventiduct
+ventifact
+ventil
+ventilable
+ventilagin
+ventilate
+ventilating
+ventilation
+ventilative
+ventilator
+ventilatory
+ventless
+ventometer
+ventose
+ventoseness
+ventosity
+ventpiece
+ventrad
+ventral
+ventrally
+ventralmost
+ventralward
+ventric
+ventricle
+ventricolumna
+ventricolumnar
+ventricornu
+ventricornual
+ventricose
+ventricoseness
+ventricosity
+ventricous
+ventricular
+ventricularis
+ventriculite
+Ventriculites
+ventriculitic
+Ventriculitidae
+ventriculogram
+ventriculography
+ventriculoscopy
+ventriculose
+ventriculous
+ventriculus
+ventricumbent
+ventriduct
+ventrifixation
+ventrilateral
+ventrilocution
+ventriloqual
+ventriloqually
+ventriloque
+ventriloquial
+ventriloquially
+ventriloquism
+ventriloquist
+ventriloquistic
+ventriloquize
+ventriloquous
+ventriloquously
+ventriloquy
+ventrimesal
+ventrimeson
+ventrine
+ventripotency
+ventripotent
+ventripotential
+ventripyramid
+ventroaxial
+ventroaxillary
+ventrocaudal
+ventrocystorrhaphy
+ventrodorsad
+ventrodorsal
+ventrodorsally
+ventrofixation
+ventrohysteropexy
+ventroinguinal
+ventrolateral
+ventrolaterally
+ventromedial
+ventromedian
+ventromesal
+ventromesial
+ventromyel
+ventroposterior
+ventroptosia
+ventroptosis
+ventroscopy
+ventrose
+ventrosity
+ventrosuspension
+ventrotomy
+venture
+venturer
+venturesome
+venturesomely
+venturesomeness
+Venturia
+venturine
+venturous
+venturously
+venturousness
+venue
+venula
+venular
+venule
+venulose
+Venus
+Venusian
+venust
+Venutian
+venville
+Veps
+Vepse
+Vepsish
+vera
+veracious
+veraciously
+veraciousness
+veracity
+veranda
+verandaed
+verascope
+veratral
+veratralbine
+veratraldehyde
+veratrate
+veratria
+veratric
+veratridine
+veratrine
+veratrinize
+veratrize
+veratroidine
+veratrole
+veratroyl
+Veratrum
+veratryl
+veratrylidene
+verb
+verbal
+verbalism
+verbalist
+verbality
+verbalization
+verbalize
+verbalizer
+verbally
+verbarian
+verbarium
+verbasco
+verbascose
+Verbascum
+verbate
+verbatim
+verbena
+Verbenaceae
+verbenaceous
+verbenalike
+verbenalin
+Verbenarius
+verbenate
+verbene
+verbenone
+verberate
+verberation
+verberative
+Verbesina
+verbiage
+verbicide
+verbiculture
+verbid
+verbification
+verbify
+verbigerate
+verbigeration
+verbigerative
+verbile
+verbless
+verbolatry
+verbomania
+verbomaniac
+verbomotor
+verbose
+verbosely
+verboseness
+verbosity
+verbous
+verby
+verchok
+verd
+verdancy
+verdant
+verdantly
+verdantness
+verdea
+verdelho
+verderer
+verderership
+verdet
+verdict
+verdigris
+verdigrisy
+verdin
+verditer
+verdoy
+verdugoship
+verdun
+verdure
+verdured
+verdureless
+verdurous
+verdurousness
+verecund
+verecundity
+verecundness
+verek
+veretilliform
+Veretillum
+veretillum
+verge
+vergeboard
+vergence
+vergency
+vergent
+vergentness
+verger
+vergeress
+vergerism
+vergerless
+vergership
+vergery
+vergi
+vergiform
+Vergilianism
+verglas
+vergobret
+veri
+veridic
+veridical
+veridicality
+veridically
+veridicalness
+veridicous
+veridity
+verifiability
+verifiable
+verifiableness
+verifiably
+verificate
+verification
+verificative
+verificatory
+verifier
+verify
+verily
+verine
+verisimilar
+verisimilarly
+verisimilitude
+verisimilitudinous
+verisimility
+verism
+verist
+veristic
+veritability
+veritable
+veritableness
+veritably
+verite
+veritism
+veritist
+veritistic
+verity
+verjuice
+vermeil
+vermeologist
+vermeology
+Vermes
+vermetid
+Vermetidae
+vermetidae
+Vermetus
+vermian
+vermicelli
+vermicidal
+vermicide
+vermicious
+vermicle
+vermicular
+Vermicularia
+vermicularly
+vermiculate
+vermiculated
+vermiculation
+vermicule
+vermiculite
+vermiculose
+vermiculosity
+vermiculous
+vermiform
+Vermiformia
+vermiformis
+vermiformity
+vermiformous
+vermifugal
+vermifuge
+vermifugous
+vermigerous
+vermigrade
+Vermilingues
+Vermilinguia
+vermilinguial
+vermilion
+vermilionette
+vermilionize
+vermin
+verminal
+verminate
+vermination
+verminer
+verminicidal
+verminicide
+verminiferous
+verminlike
+verminly
+verminosis
+verminous
+verminously
+verminousness
+verminproof
+verminy
+vermiparous
+vermiparousness
+vermis
+vermivorous
+vermivorousness
+vermix
+Vermont
+Vermonter
+Vermontese
+vermorel
+vermouth
+Vern
+vernacle
+vernacular
+vernacularism
+vernacularist
+vernacularity
+vernacularization
+vernacularize
+vernacularly
+vernacularness
+vernaculate
+vernal
+vernality
+vernalization
+vernalize
+vernally
+vernant
+vernation
+vernicose
+vernier
+vernile
+vernility
+vernin
+vernine
+vernition
+Vernon
+Vernonia
+vernoniaceous
+Vernonieae
+vernonin
+Verona
+Veronal
+veronalism
+Veronese
+Veronica
+Veronicella
+Veronicellidae
+Verpa
+verre
+verrel
+verriculate
+verriculated
+verricule
+verruca
+verrucano
+Verrucaria
+Verrucariaceae
+verrucariaceous
+verrucarioid
+verrucated
+verruciferous
+verruciform
+verrucose
+verrucoseness
+verrucosis
+verrucosity
+verrucous
+verruculose
+verruga
+versability
+versable
+versableness
+versal
+versant
+versate
+versatile
+versatilely
+versatileness
+versatility
+versation
+versative
+verse
+versecraft
+versed
+verseless
+verselet
+versemaker
+versemaking
+verseman
+versemanship
+versemonger
+versemongering
+versemongery
+verser
+versesmith
+verset
+versette
+verseward
+versewright
+versicle
+versicler
+versicolor
+versicolorate
+versicolored
+versicolorous
+versicular
+versicule
+versifiable
+versifiaster
+versification
+versificator
+versificatory
+versificatrix
+versifier
+versiform
+versify
+versiloquy
+versine
+version
+versional
+versioner
+versionist
+versionize
+versipel
+verso
+versor
+verst
+versta
+versual
+versus
+vert
+vertebra
+vertebrae
+vertebral
+vertebraless
+vertebrally
+Vertebraria
+vertebrarium
+vertebrarterial
+Vertebrata
+vertebrate
+vertebrated
+vertebration
+vertebre
+vertebrectomy
+vertebriform
+vertebroarterial
+vertebrobasilar
+vertebrochondral
+vertebrocostal
+vertebrodymus
+vertebrofemoral
+vertebroiliac
+vertebromammary
+vertebrosacral
+vertebrosternal
+vertex
+vertibility
+vertible
+vertibleness
+vertical
+verticalism
+verticality
+vertically
+verticalness
+vertices
+verticil
+verticillary
+verticillaster
+verticillastrate
+verticillate
+verticillated
+verticillately
+verticillation
+verticilliaceous
+verticilliose
+Verticillium
+verticillus
+verticity
+verticomental
+verticordious
+vertiginate
+vertigines
+vertiginous
+vertigo
+vertilinear
+vertimeter
+Vertumnus
+Verulamian
+veruled
+verumontanum
+vervain
+vervainlike
+verve
+vervecine
+vervel
+verveled
+vervelle
+vervenia
+vervet
+very
+Vesalian
+vesania
+vesanic
+vesbite
+vesicae
+vesical
+vesicant
+vesicate
+vesication
+vesicatory
+vesicle
+vesicoabdominal
+vesicocavernous
+vesicocele
+vesicocervical
+vesicoclysis
+vesicofixation
+vesicointestinal
+vesicoprostatic
+vesicopubic
+vesicorectal
+vesicosigmoid
+vesicospinal
+vesicotomy
+vesicovaginal
+vesicular
+Vesicularia
+vesicularly
+vesiculary
+vesiculase
+Vesiculata
+Vesiculatae
+vesiculate
+vesiculation
+vesicule
+vesiculectomy
+vesiculiferous
+vesiculiform
+vesiculigerous
+vesiculitis
+vesiculobronchial
+vesiculocavernous
+vesiculopustular
+vesiculose
+vesiculotomy
+vesiculotubular
+vesiculotympanic
+vesiculotympanitic
+vesiculous
+vesiculus
+vesicupapular
+veskit
+Vespa
+vespacide
+vespal
+vesper
+vesperal
+vesperian
+vespering
+vespers
+vespertide
+vespertilian
+Vespertilio
+vespertilio
+Vespertiliones
+vespertilionid
+Vespertilionidae
+Vespertilioninae
+vespertilionine
+vespertinal
+vespertine
+vespery
+vespiary
+vespid
+Vespidae
+vespiform
+Vespina
+vespine
+vespoid
+Vespoidea
+vessel
+vesseled
+vesselful
+vessignon
+vest
+Vesta
+vestal
+Vestalia
+vestalia
+vestalship
+Vestas
+vestee
+vester
+vestiarian
+vestiarium
+vestiary
+vestibula
+vestibular
+vestibulary
+vestibulate
+vestibule
+vestibuled
+vestibulospinal
+vestibulum
+vestige
+vestigial
+vestigially
+Vestigian
+vestigiary
+vestigium
+vestiment
+vestimental
+vestimentary
+vesting
+Vestini
+Vestinian
+vestiture
+vestlet
+vestment
+vestmental
+vestmented
+vestral
+vestralization
+vestrical
+vestrification
+vestrify
+vestry
+vestrydom
+vestryhood
+vestryish
+vestryism
+vestryize
+vestryman
+vestrymanly
+vestrymanship
+vestuary
+vestural
+vesture
+vesturer
+Vesuvian
+vesuvian
+vesuvianite
+vesuviate
+vesuvite
+vesuvius
+veszelyite
+vet
+veta
+vetanda
+vetch
+vetchling
+vetchy
+veteran
+veterancy
+veteraness
+veteranize
+veterinarian
+veterinarianism
+veterinary
+vetitive
+vetivene
+vetivenol
+vetiver
+Vetiveria
+vetiveria
+vetivert
+vetkousie
+veto
+vetoer
+vetoism
+vetoist
+vetoistic
+vetoistical
+vetust
+vetusty
+veuglaire
+veuve
+vex
+vexable
+vexation
+vexatious
+vexatiously
+vexatiousness
+vexatory
+vexed
+vexedly
+vexedness
+vexer
+vexful
+vexil
+vexillar
+vexillarious
+vexillary
+vexillate
+vexillation
+vexillum
+vexingly
+vexingness
+vext
+via
+viability
+viable
+viaduct
+viaggiatory
+viagram
+viagraph
+viajaca
+vial
+vialful
+vialmaker
+vialmaking
+vialogue
+viameter
+viand
+viander
+viatic
+viatica
+viatical
+viaticum
+viatometer
+viator
+viatorial
+viatorially
+vibetoite
+vibex
+vibgyor
+vibix
+vibracular
+vibracularium
+vibraculoid
+vibraculum
+vibrance
+vibrancy
+vibrant
+vibrantly
+vibraphone
+vibrate
+vibratile
+vibratility
+vibrating
+vibratingly
+vibration
+vibrational
+vibrationless
+vibratiuncle
+vibratiunculation
+vibrative
+vibrato
+vibrator
+vibratory
+Vibrio
+vibrioid
+vibrion
+vibrionic
+vibrissa
+vibrissae
+vibrissal
+vibrograph
+vibromassage
+vibrometer
+vibromotive
+vibronic
+vibrophone
+vibroscope
+vibroscopic
+vibrotherapeutics
+viburnic
+viburnin
+Viburnum
+Vic
+vicar
+vicarage
+vicarate
+vicaress
+vicarial
+vicarian
+vicarianism
+vicariate
+vicariateship
+vicarious
+vicariously
+vicariousness
+vicarly
+vicarship
+Vice
+vice
+vicecomes
+vicecomital
+vicegeral
+vicegerency
+vicegerent
+vicegerentship
+viceless
+vicelike
+vicenary
+vicennial
+viceregal
+viceregally
+vicereine
+viceroy
+viceroyal
+viceroyalty
+viceroydom
+viceroyship
+vicety
+viceversally
+Vichyite
+vichyssoise
+Vicia
+vicianin
+vicianose
+vicilin
+vicinage
+vicinal
+vicine
+vicinity
+viciosity
+vicious
+viciously
+viciousness
+vicissitous
+vicissitude
+vicissitudinary
+vicissitudinous
+vicissitudinousness
+Vick
+Vicki
+Vickie
+Vicky
+vicoite
+vicontiel
+victim
+victimhood
+victimizable
+victimization
+victimize
+victimizer
+victless
+Victor
+victor
+victordom
+victorfish
+Victoria
+Victorian
+Victorianism
+Victorianize
+Victorianly
+victoriate
+victoriatus
+victorine
+victorious
+victoriously
+victoriousness
+victorium
+victory
+victoryless
+victress
+victrix
+Victrola
+victrola
+victual
+victualage
+victualer
+victualing
+victuallership
+victualless
+victualry
+victuals
+vicuna
+Viddhal
+viddui
+videndum
+video
+videogenic
+vidette
+Vidhyanath
+Vidian
+vidonia
+vidry
+Vidua
+viduage
+vidual
+vidually
+viduate
+viduated
+viduation
+Viduinae
+viduine
+viduity
+viduous
+vidya
+vie
+vielle
+Vienna
+Viennese
+vier
+vierling
+viertel
+viertelein
+Vietminh
+Vietnamese
+view
+viewable
+viewably
+viewer
+viewiness
+viewless
+viewlessly
+viewly
+viewpoint
+viewsome
+viewster
+viewworthy
+viewy
+vifda
+viga
+vigentennial
+vigesimal
+vigesimation
+vigia
+vigil
+vigilance
+vigilancy
+vigilant
+vigilante
+vigilantism
+vigilantly
+vigilantness
+vigilate
+vigilation
+vigintiangular
+vigneron
+vignette
+vignetter
+vignettist
+vignin
+vigonia
+vigor
+vigorist
+vigorless
+vigorous
+vigorously
+vigorousness
+vihara
+vihuela
+vijao
+Vijay
+viking
+vikingism
+vikinglike
+vikingship
+vila
+vilayet
+vile
+vilehearted
+Vilela
+vilely
+vileness
+Vilhelm
+Vili
+vilicate
+vilification
+vilifier
+vilify
+vilifyingly
+vilipend
+vilipender
+vilipenditory
+vility
+vill
+villa
+villadom
+villaette
+village
+villageful
+villagehood
+villageless
+villagelet
+villagelike
+villageous
+villager
+villageress
+villagery
+villaget
+villageward
+villagey
+villagism
+villain
+villainage
+villaindom
+villainess
+villainist
+villainous
+villainously
+villainousness
+villainproof
+villainy
+villakin
+villaless
+villalike
+villanage
+villanella
+villanelle
+villanette
+villanous
+villanously
+Villanova
+Villanovan
+villar
+villate
+villatic
+ville
+villein
+villeinage
+villeiness
+villeinhold
+villenage
+villiaumite
+villiferous
+villiform
+villiplacental
+Villiplacentalia
+villitis
+villoid
+villose
+villosity
+villous
+villously
+villus
+vim
+vimana
+vimen
+vimful
+Viminal
+viminal
+vimineous
+vina
+vinaceous
+vinaconic
+vinage
+vinagron
+vinaigrette
+vinaigretted
+vinaigrier
+vinaigrous
+vinal
+Vinalia
+vinasse
+vinata
+Vince
+Vincent
+vincent
+Vincentian
+Vincenzo
+Vincetoxicum
+vincetoxin
+vincibility
+vincible
+vincibleness
+vincibly
+vincular
+vinculate
+vinculation
+vinculum
+Vindelici
+vindemial
+vindemiate
+vindemiation
+vindemiatory
+Vindemiatrix
+vindex
+vindhyan
+vindicability
+vindicable
+vindicableness
+vindicably
+vindicate
+vindication
+vindicative
+vindicatively
+vindicativeness
+vindicator
+vindicatorily
+vindicatorship
+vindicatory
+vindicatress
+vindictive
+vindictively
+vindictiveness
+vindictivolence
+vindresser
+vine
+vinea
+vineal
+vineatic
+vined
+vinegar
+vinegarer
+vinegarette
+vinegarish
+vinegarist
+vinegarroon
+vinegarweed
+vinegary
+vinegerone
+vinegrower
+vineity
+vineland
+vineless
+vinelet
+vinelike
+viner
+vinery
+vinestalk
+vinewise
+vineyard
+Vineyarder
+vineyarding
+vineyardist
+vingerhoed
+Vingolf
+vinhatico
+vinic
+vinicultural
+viniculture
+viniculturist
+vinifera
+viniferous
+vinification
+vinificator
+Vinland
+vinny
+vino
+vinoacetous
+Vinod
+vinolence
+vinolent
+vinologist
+vinology
+vinometer
+vinomethylic
+vinose
+vinosity
+vinosulphureous
+vinous
+vinously
+vinousness
+vinquish
+vint
+vinta
+vintage
+vintager
+vintaging
+vintem
+vintener
+vintlite
+vintner
+vintneress
+vintnership
+vintnery
+vintress
+vintry
+viny
+vinyl
+vinylbenzene
+vinylene
+vinylic
+vinylidene
+viol
+viola
+violability
+violable
+violableness
+violably
+Violaceae
+violacean
+violaceous
+violaceously
+violal
+Violales
+violanin
+violaquercitrin
+violate
+violater
+violation
+violational
+violative
+violator
+violatory
+violature
+violence
+violent
+violently
+violentness
+violer
+violescent
+violet
+violetish
+violetlike
+violette
+violetwise
+violety
+violin
+violina
+violine
+violinette
+violinist
+violinistic
+violinlike
+violinmaker
+violinmaking
+violist
+violmaker
+violmaking
+violon
+violoncellist
+violoncello
+violone
+violotta
+violuric
+viosterol
+Vip
+viper
+Vipera
+viperan
+viperess
+viperfish
+viperian
+viperid
+Viperidae
+viperiform
+Viperina
+Viperinae
+viperine
+viperish
+viperishly
+viperlike
+viperling
+viperoid
+Viperoidea
+viperous
+viperously
+viperousness
+vipery
+vipolitic
+vipresident
+viqueen
+Vira
+viragin
+viraginian
+viraginity
+viraginous
+virago
+viragoish
+viragolike
+viragoship
+viral
+Virales
+Virbius
+vire
+virelay
+viremia
+viremic
+virent
+vireo
+vireonine
+virescence
+virescent
+virga
+virgal
+virgate
+virgated
+virgater
+virgation
+virgilia
+Virgilism
+virgin
+virginal
+Virginale
+virginalist
+virginality
+virginally
+virgineous
+virginhead
+Virginia
+Virginian
+Virginid
+virginitis
+virginity
+virginityship
+virginium
+virginlike
+virginly
+virginship
+Virgo
+virgula
+virgular
+Virgularia
+virgularian
+Virgulariidae
+virgulate
+virgule
+virgultum
+virial
+viricide
+virid
+viridene
+viridescence
+viridescent
+viridian
+viridigenous
+viridine
+viridite
+viridity
+virific
+virify
+virile
+virilely
+virileness
+virilescence
+virilescent
+virilify
+viriliously
+virilism
+virilist
+virility
+viripotent
+viritrate
+virl
+virole
+viroled
+virological
+virologist
+virology
+viron
+virose
+virosis
+virous
+virtu
+virtual
+virtualism
+virtualist
+virtuality
+virtualize
+virtually
+virtue
+virtued
+virtuefy
+virtuelessness
+virtueproof
+virtuless
+virtuosa
+virtuose
+virtuosi
+virtuosic
+virtuosity
+virtuoso
+virtuosoship
+virtuous
+virtuouslike
+virtuously
+virtuousness
+virucidal
+virucide
+viruela
+virulence
+virulency
+virulent
+virulented
+virulently
+virulentness
+viruliferous
+virus
+viruscidal
+viruscide
+virusemic
+vis
+visa
+visage
+visaged
+visagraph
+visarga
+Visaya
+Visayan
+viscacha
+viscera
+visceral
+visceralgia
+viscerally
+viscerate
+visceration
+visceripericardial
+visceroinhibitory
+visceromotor
+visceroparietal
+visceroperitioneal
+visceropleural
+visceroptosis
+visceroptotic
+viscerosensory
+visceroskeletal
+viscerosomatic
+viscerotomy
+viscerotonia
+viscerotonic
+viscerotrophic
+viscerotropic
+viscerous
+viscid
+viscidity
+viscidize
+viscidly
+viscidness
+viscidulous
+viscin
+viscoidal
+viscolize
+viscometer
+viscometrical
+viscometrically
+viscometry
+viscontal
+viscoscope
+viscose
+viscosimeter
+viscosimetry
+viscosity
+viscount
+viscountcy
+viscountess
+viscountship
+viscounty
+viscous
+viscously
+viscousness
+viscus
+vise
+viseman
+Vishal
+Vishnavite
+Vishnu
+Vishnuism
+Vishnuite
+Vishnuvite
+visibility
+visibilize
+visible
+visibleness
+visibly
+visie
+Visigoth
+Visigothic
+visile
+vision
+visional
+visionally
+visionarily
+visionariness
+visionary
+visioned
+visioner
+visionic
+visionist
+visionize
+visionless
+visionlike
+visionmonger
+visionproof
+visit
+visita
+visitable
+Visitandine
+visitant
+visitation
+visitational
+visitative
+visitator
+visitatorial
+visite
+visitee
+visiter
+visiting
+visitment
+visitor
+visitoress
+visitorial
+visitorship
+visitress
+visitrix
+visive
+visne
+vison
+visor
+visorless
+visorlike
+vista
+vistaed
+vistal
+vistaless
+vistamente
+Vistlik
+visto
+Vistulian
+visual
+visualist
+visuality
+visualization
+visualize
+visualizer
+visually
+visuoauditory
+visuokinesthetic
+visuometer
+visuopsychic
+visuosensory
+vita
+Vitaceae
+Vitaglass
+vital
+vitalic
+vitalism
+vitalist
+vitalistic
+vitalistically
+vitality
+vitalization
+vitalize
+vitalizer
+vitalizing
+vitalizingly
+Vitallium
+vitally
+vitalness
+vitals
+vitamer
+vitameric
+vitamin
+vitaminic
+vitaminize
+vitaminology
+vitapath
+vitapathy
+vitaphone
+vitascope
+vitascopic
+vitasti
+vitativeness
+vitellarian
+vitellarium
+vitellary
+vitellicle
+vitelliferous
+vitelligenous
+vitelligerous
+vitellin
+vitelline
+vitellogene
+vitellogenous
+vitellose
+vitellus
+viterbite
+Viti
+vitiable
+vitiate
+vitiated
+vitiation
+vitiator
+viticetum
+viticulose
+viticultural
+viticulture
+viticulturer
+viticulturist
+vitiferous
+vitiliginous
+vitiligo
+vitiligoidea
+vitiosity
+Vitis
+vitium
+vitochemic
+vitochemical
+vitrage
+vitrail
+vitrailed
+vitrailist
+vitrain
+vitraux
+vitreal
+vitrean
+vitrella
+vitremyte
+vitreodentinal
+vitreodentine
+vitreoelectric
+vitreosity
+vitreous
+vitreouslike
+vitreously
+vitreousness
+vitrescence
+vitrescency
+vitrescent
+vitrescibility
+vitrescible
+vitreum
+vitric
+vitrics
+vitrifaction
+vitrifacture
+vitrifiability
+vitrifiable
+vitrification
+vitriform
+vitrify
+Vitrina
+vitrine
+vitrinoid
+vitriol
+vitriolate
+vitriolation
+vitriolic
+vitrioline
+vitriolizable
+vitriolization
+vitriolize
+vitriolizer
+vitrite
+vitrobasalt
+vitrophyre
+vitrophyric
+vitrotype
+vitrous
+Vitruvian
+Vitruvianism
+vitta
+vittate
+vitular
+vituline
+vituperable
+vituperate
+vituperation
+vituperative
+vituperatively
+vituperator
+vituperatory
+vituperious
+viuva
+viva
+vivacious
+vivaciously
+vivaciousness
+vivacity
+vivandiere
+vivarium
+vivary
+vivax
+vive
+Vivek
+vively
+vivency
+viver
+Viverridae
+viverriform
+Viverrinae
+viverrine
+vivers
+vives
+vivianite
+vivicremation
+vivid
+vividialysis
+vividiffusion
+vividissection
+vividity
+vividly
+vividness
+vivific
+vivificate
+vivification
+vivificative
+vivificator
+vivifier
+vivify
+viviparism
+viviparity
+viviparous
+viviparously
+viviparousness
+vivipary
+viviperfuse
+vivisect
+vivisection
+vivisectional
+vivisectionally
+vivisectionist
+vivisective
+vivisector
+vivisectorium
+vivisepulture
+vixen
+vixenish
+vixenishly
+vixenishness
+vixenlike
+vixenly
+vizard
+vizarded
+vizardless
+vizardlike
+vizardmonger
+vizier
+vizierate
+viziercraft
+vizierial
+viziership
+vizircraft
+Vlach
+Vladimir
+Vladislav
+vlei
+voar
+vocability
+vocable
+vocably
+vocabular
+vocabularian
+vocabularied
+vocabulary
+vocabulation
+vocabulist
+vocal
+vocalic
+vocalion
+vocalise
+vocalism
+vocalist
+vocalistic
+vocality
+vocalization
+vocalize
+vocalizer
+vocaller
+vocally
+vocalness
+vocate
+vocation
+vocational
+vocationalism
+vocationalization
+vocationalize
+vocationally
+vocative
+vocatively
+Vochysiaceae
+vochysiaceous
+vocicultural
+vociferance
+vociferant
+vociferate
+vociferation
+vociferative
+vociferator
+vociferize
+vociferosity
+vociferous
+vociferously
+vociferousness
+vocification
+vocimotor
+vocular
+vocule
+Vod
+vodka
+voe
+voet
+voeten
+Voetian
+vog
+vogesite
+voglite
+vogue
+voguey
+voguish
+Vogul
+voice
+voiced
+voiceful
+voicefulness
+voiceless
+voicelessly
+voicelessness
+voicelet
+voicelike
+voicer
+voicing
+void
+voidable
+voidableness
+voidance
+voided
+voidee
+voider
+voiding
+voidless
+voidly
+voidness
+voile
+voiturette
+voivode
+voivodeship
+vol
+volable
+volage
+Volans
+volant
+volantly
+Volapuk
+Volapuker
+Volapukism
+Volapukist
+volar
+volata
+volatic
+volatile
+volatilely
+volatileness
+volatility
+volatilizable
+volatilization
+volatilize
+volatilizer
+volation
+volational
+volborthite
+Volcae
+volcan
+Volcanalia
+volcanian
+volcanic
+volcanically
+volcanicity
+volcanism
+volcanist
+volcanite
+volcanity
+volcanization
+volcanize
+volcano
+volcanoism
+volcanological
+volcanologist
+volcanologize
+volcanology
+Volcanus
+vole
+volemitol
+volency
+volent
+volently
+volery
+volet
+volhynite
+volipresence
+volipresent
+volitant
+volitate
+volitation
+volitational
+volitiency
+volitient
+volition
+volitional
+volitionalist
+volitionality
+volitionally
+volitionary
+volitionate
+volitionless
+volitive
+volitorial
+Volkerwanderung
+volley
+volleyball
+volleyer
+volleying
+volleyingly
+volost
+volplane
+volplanist
+Volsci
+Volscian
+volsella
+volsellum
+Volstead
+Volsteadism
+volt
+Volta
+voltaelectric
+voltaelectricity
+voltaelectrometer
+voltaelectrometric
+voltage
+voltagraphy
+voltaic
+Voltairian
+Voltairianize
+Voltairish
+Voltairism
+voltaism
+voltaite
+voltameter
+voltametric
+voltammeter
+voltaplast
+voltatype
+voltinism
+voltivity
+voltize
+voltmeter
+voltzite
+volubilate
+volubility
+voluble
+volubleness
+volubly
+volucrine
+volume
+volumed
+volumenometer
+volumenometry
+volumescope
+volumeter
+volumetric
+volumetrical
+volumetrically
+volumetry
+volumette
+voluminal
+voluminosity
+voluminous
+voluminously
+voluminousness
+volumist
+volumometer
+volumometrical
+volumometry
+voluntariate
+voluntarily
+voluntariness
+voluntarism
+voluntarist
+voluntaristic
+voluntarity
+voluntary
+voluntaryism
+voluntaryist
+voluntative
+volunteer
+volunteerism
+volunteerly
+volunteership
+volupt
+voluptary
+voluptas
+voluptuarian
+voluptuary
+voluptuate
+voluptuosity
+voluptuous
+voluptuously
+voluptuousness
+volupty
+Voluspa
+voluta
+volutate
+volutation
+volute
+voluted
+Volutidae
+volutiform
+volutin
+volution
+volutoid
+volva
+volvate
+volvelle
+volvent
+Volvocaceae
+volvocaceous
+volvulus
+vomer
+vomerine
+vomerobasilar
+vomeronasal
+vomeropalatine
+vomica
+vomicine
+vomit
+vomitable
+vomiter
+vomiting
+vomitingly
+vomition
+vomitive
+vomitiveness
+vomito
+vomitory
+vomiture
+vomiturition
+vomitus
+vomitwort
+vondsira
+vonsenite
+voodoo
+voodooism
+voodooist
+voodooistic
+voracious
+voraciously
+voraciousness
+voracity
+voraginous
+vorago
+vorant
+vorhand
+vorlooper
+vorondreo
+vorpal
+vortex
+vortical
+vortically
+vorticel
+Vorticella
+vorticellid
+Vorticellidae
+vortices
+vorticial
+vorticiform
+vorticism
+vorticist
+vorticity
+vorticose
+vorticosely
+vorticular
+vorticularly
+vortiginous
+Vortumnus
+Vosgian
+vota
+votable
+votal
+votally
+votaress
+votarist
+votary
+votation
+Vote
+vote
+voteen
+voteless
+voter
+voting
+Votish
+votive
+votively
+votiveness
+votometer
+votress
+Votyak
+vouch
+vouchable
+vouchee
+voucher
+voucheress
+vouchment
+vouchsafe
+vouchsafement
+vouge
+Vougeot
+Vouli
+voussoir
+vow
+vowed
+vowel
+vowelish
+vowelism
+vowelist
+vowelization
+vowelize
+vowelless
+vowellessness
+vowellike
+vowely
+vower
+vowess
+vowless
+vowmaker
+vowmaking
+voyage
+voyageable
+voyager
+voyance
+voyeur
+voyeurism
+vraic
+vraicker
+vraicking
+vrbaite
+vriddhi
+vrother
+Vu
+vug
+vuggy
+Vulcan
+Vulcanalia
+Vulcanalial
+Vulcanalian
+Vulcanian
+Vulcanic
+vulcanicity
+vulcanism
+vulcanist
+vulcanite
+vulcanizable
+vulcanizate
+vulcanization
+vulcanize
+vulcanizer
+vulcanological
+vulcanologist
+vulcanology
+vulgar
+vulgare
+vulgarian
+vulgarish
+vulgarism
+vulgarist
+vulgarity
+vulgarization
+vulgarize
+vulgarizer
+vulgarlike
+vulgarly
+vulgarness
+vulgarwise
+Vulgate
+vulgate
+vulgus
+vuln
+vulnerability
+vulnerable
+vulnerableness
+vulnerably
+vulnerary
+vulnerate
+vulneration
+vulnerative
+vulnerose
+vulnific
+vulnose
+Vulpecula
+vulpecular
+Vulpeculid
+Vulpes
+vulpic
+vulpicidal
+vulpicide
+vulpicidism
+Vulpinae
+vulpine
+vulpinism
+vulpinite
+vulsella
+vulsellum
+vulsinite
+Vultur
+vulture
+vulturelike
+vulturewise
+Vulturidae
+Vulturinae
+vulturine
+vulturish
+vulturism
+vulturn
+vulturous
+vulva
+vulval
+vulvar
+vulvate
+vulviform
+vulvitis
+vulvocrural
+vulvouterine
+vulvovaginal
+vulvovaginitis
+vum
+vying
+vyingly
+W
+w
+Wa
+wa
+Waac
+waag
+waapa
+waar
+Waasi
+wab
+wabber
+wabble
+wabbly
+wabby
+wabe
+Wabena
+wabeno
+Wabi
+wabster
+Wabuma
+Wabunga
+Wac
+wacago
+wace
+Wachaga
+Wachenheimer
+wachna
+Wachuset
+wack
+wacke
+wacken
+wacker
+wackiness
+wacky
+Waco
+wad
+waddent
+wadder
+wadding
+waddler
+waddlesome
+waddling
+waddlingly
+waddly
+waddy
+waddywood
+Wade
+wade
+wadeable
+wader
+wadi
+wading
+wadingly
+wadlike
+wadmaker
+wadmaking
+wadmal
+wadmeal
+wadna
+wadset
+wadsetter
+wae
+waeg
+waer
+waesome
+waesuck
+Waf
+Wafd
+Wafdist
+wafer
+waferer
+waferish
+wafermaker
+wafermaking
+waferwoman
+waferwork
+wafery
+waff
+waffle
+wafflike
+waffly
+waft
+waftage
+wafter
+wafture
+wafty
+wag
+Waganda
+waganging
+wagaun
+wagbeard
+wage
+waged
+wagedom
+wageless
+wagelessness
+wagenboom
+Wagener
+wager
+wagerer
+wagering
+wages
+wagesman
+wagework
+wageworker
+wageworking
+waggable
+waggably
+waggel
+wagger
+waggery
+waggie
+waggish
+waggishly
+waggishness
+waggle
+waggling
+wagglingly
+waggly
+Waggumbura
+waggy
+waglike
+wagling
+Wagneresque
+Wagnerian
+Wagneriana
+Wagnerianism
+Wagnerism
+Wagnerist
+Wagnerite
+wagnerite
+Wagnerize
+Wagogo
+Wagoma
+wagon
+wagonable
+wagonage
+wagoner
+wagoness
+wagonette
+wagonful
+wagonload
+wagonmaker
+wagonmaking
+wagonman
+wagonry
+wagonsmith
+wagonway
+wagonwayman
+wagonwork
+wagonwright
+wagsome
+wagtail
+Waguha
+wagwag
+wagwants
+Wagweno
+wagwit
+wah
+Wahabi
+Wahabiism
+Wahabit
+Wahabitism
+wahahe
+Wahehe
+Wahima
+wahine
+Wahlenbergia
+wahoo
+wahpekute
+Wahpeton
+waiata
+Waibling
+Waicuri
+Waicurian
+waif
+Waiguli
+Waiilatpuan
+waik
+waikly
+waikness
+wail
+Wailaki
+wailer
+wailful
+wailfully
+wailingly
+wailsome
+waily
+wain
+wainage
+wainbote
+wainer
+wainful
+wainman
+wainrope
+wainscot
+wainscoting
+wainwright
+waipiro
+wairch
+waird
+wairepo
+wairsh
+waise
+waist
+waistband
+waistcloth
+waistcoat
+waistcoated
+waistcoateer
+waistcoathole
+waistcoating
+waistcoatless
+waisted
+waister
+waisting
+waistless
+waistline
+wait
+waiter
+waiterage
+waiterdom
+waiterhood
+waitering
+waiterlike
+waitership
+waiting
+waitingly
+waitress
+waivatua
+waive
+waiver
+waivery
+waivod
+Waiwai
+waiwode
+wajang
+waka
+Wakamba
+wakan
+Wakashan
+wake
+wakeel
+wakeful
+wakefully
+wakefulness
+wakeless
+waken
+wakener
+wakening
+waker
+wakes
+waketime
+wakf
+Wakhi
+wakif
+wakiki
+waking
+wakingly
+wakiup
+wakken
+wakon
+wakonda
+Wakore
+Wakwafi
+waky
+Walach
+Walachian
+walahee
+Walapai
+Walchia
+Waldenses
+Waldensian
+waldflute
+waldgrave
+waldgravine
+Waldheimia
+waldhorn
+waldmeister
+Waldsteinia
+wale
+waled
+walepiece
+Waler
+waler
+walewort
+wali
+waling
+walk
+walkable
+walkaway
+walker
+walking
+walkist
+walkmill
+walkmiller
+walkout
+walkover
+walkrife
+walkside
+walksman
+walkway
+walkyrie
+wall
+wallaba
+wallaby
+Wallach
+wallah
+wallaroo
+Wallawalla
+wallbird
+wallboard
+walled
+waller
+Wallerian
+wallet
+walletful
+walleye
+walleyed
+wallflower
+wallful
+wallhick
+walling
+wallise
+wallless
+wallman
+Wallon
+Wallonian
+Walloon
+walloon
+wallop
+walloper
+walloping
+wallow
+wallower
+wallowish
+wallowishly
+wallowishness
+wallpaper
+wallpapering
+wallpiece
+Wallsend
+wallwise
+wallwork
+wallwort
+wally
+walnut
+Walpapi
+Walpolean
+Walpurgis
+walpurgite
+walrus
+walsh
+Walt
+walt
+Walter
+walter
+walth
+Waltonian
+waltz
+waltzer
+waltzlike
+walycoat
+wamara
+wambais
+wamble
+wambliness
+wambling
+wamblingly
+wambly
+Wambuba
+Wambugu
+Wambutti
+wame
+wamefou
+wamel
+wammikin
+wamp
+Wampanoag
+wampee
+wample
+wampum
+wampumpeag
+wampus
+wamus
+wan
+Wanapum
+wanchancy
+wand
+wander
+wanderable
+wanderer
+wandering
+wanderingly
+wanderingness
+Wanderjahr
+wanderlust
+wanderluster
+wanderlustful
+wanderoo
+wandery
+wanderyear
+wandflower
+wandle
+wandlike
+wandoo
+Wandorobo
+wandsman
+wandy
+wane
+Waneatta
+waned
+waneless
+wang
+wanga
+wangala
+wangan
+Wangara
+wangateur
+wanghee
+wangle
+wangler
+Wangoni
+wangrace
+wangtooth
+wanhope
+wanhorn
+wanigan
+waning
+wankapin
+wankle
+wankliness
+wankly
+wanle
+wanly
+wanner
+wanness
+wannish
+wanny
+wanrufe
+wansonsy
+want
+wantage
+wanter
+wantful
+wanthill
+wanthrift
+wanting
+wantingly
+wantingness
+wantless
+wantlessness
+wanton
+wantoner
+wantonlike
+wantonly
+wantonness
+wantwit
+wanty
+wanwordy
+wanworth
+wany
+Wanyakyusa
+Wanyamwezi
+Wanyasa
+Wanyoro
+wap
+wapacut
+Wapato
+wapatoo
+wapentake
+Wapisiana
+wapiti
+Wapogoro
+Wapokomo
+wapp
+Wappato
+wappenschaw
+wappenschawing
+wapper
+wapping
+Wappinger
+Wappo
+war
+warabi
+waratah
+warble
+warbled
+warblelike
+warbler
+warblerlike
+warblet
+warbling
+warblingly
+warbly
+warch
+warcraft
+ward
+wardable
+wardage
+wardapet
+warday
+warded
+Warden
+warden
+wardency
+wardenry
+wardenship
+warder
+warderer
+wardership
+wardholding
+warding
+wardite
+wardless
+wardlike
+wardmaid
+wardman
+wardmote
+wardress
+wardrobe
+wardrober
+wardroom
+wardship
+wardsmaid
+wardsman
+wardswoman
+wardwite
+wardwoman
+ware
+Waregga
+warehou
+warehouse
+warehouseage
+warehoused
+warehouseful
+warehouseman
+warehouser
+wareless
+waremaker
+waremaking
+wareman
+wareroom
+warf
+warfare
+warfarer
+warfaring
+warful
+warily
+wariness
+Waring
+waringin
+warish
+warison
+wark
+warkamoowee
+warl
+warless
+warlessly
+warlike
+warlikely
+warlikeness
+warlock
+warluck
+warly
+warm
+warmable
+warman
+warmed
+warmedly
+warmer
+warmful
+warmhearted
+warmheartedly
+warmheartedness
+warmhouse
+warming
+warmish
+warmly
+warmness
+warmonger
+warmongering
+warmouth
+warmth
+warmthless
+warmus
+warn
+warnel
+warner
+warning
+warningly
+warningproof
+warnish
+warnoth
+warnt
+Warori
+warp
+warpable
+warpage
+warped
+warper
+warping
+warplane
+warple
+warplike
+warproof
+warpwise
+warragal
+warrambool
+warran
+warrand
+warrandice
+warrant
+warrantable
+warrantableness
+warrantably
+warranted
+warrantee
+warranter
+warrantise
+warrantless
+warrantor
+warranty
+warratau
+Warrau
+warree
+Warren
+warren
+warrener
+warrenlike
+warrer
+Warri
+warrin
+warrior
+warrioress
+warriorhood
+warriorism
+warriorlike
+warriorship
+warriorwise
+warrok
+Warsaw
+warsaw
+warse
+warsel
+warship
+warsle
+warsler
+warst
+wart
+warted
+wartern
+wartflower
+warth
+wartime
+wartless
+wartlet
+wartlike
+wartproof
+wartweed
+wartwort
+warty
+wartyback
+Warua
+Warundi
+warve
+warwards
+Warwick
+warwickite
+warwolf
+warworn
+wary
+was
+wasabi
+Wasagara
+Wasandawi
+Wasango
+Wasat
+Wasatch
+Wasco
+wase
+Wasegua
+wasel
+wash
+washability
+washable
+washableness
+Washaki
+washaway
+washbasin
+washbasket
+washboard
+washbowl
+washbrew
+washcloth
+washday
+washdish
+washdown
+washed
+washen
+washer
+washerless
+washerman
+washerwife
+washerwoman
+washery
+washeryman
+washhand
+washhouse
+washin
+washiness
+washing
+Washington
+Washingtonia
+Washingtonian
+Washingtoniana
+Washita
+washland
+washmaid
+washman
+Washo
+Washoan
+washoff
+washout
+washpot
+washproof
+washrag
+washroad
+washroom
+washshed
+washstand
+washtail
+washtray
+washtrough
+washtub
+washway
+washwoman
+washwork
+washy
+Wasir
+wasnt
+Wasoga
+Wasp
+wasp
+waspen
+wasphood
+waspily
+waspish
+waspishly
+waspishness
+wasplike
+waspling
+waspnesting
+waspy
+wassail
+wassailer
+wassailous
+wassailry
+wassie
+wast
+wastable
+wastage
+waste
+wastebasket
+wasteboard
+wasted
+wasteful
+wastefully
+wastefulness
+wastel
+wasteland
+wastelbread
+wasteless
+wasteman
+wastement
+wasteness
+wastepaper
+wasteproof
+waster
+wasterful
+wasterfully
+wasterfulness
+wastethrift
+wasteword
+wasteyard
+wasting
+wastingly
+wastingness
+wastland
+wastrel
+wastrife
+wasty
+Wasukuma
+Waswahili
+Wat
+wat
+Watala
+watap
+watch
+watchable
+watchboat
+watchcase
+watchcry
+watchdog
+watched
+watcher
+watchfree
+watchful
+watchfully
+watchfulness
+watchglassful
+watchhouse
+watching
+watchingly
+watchkeeper
+watchless
+watchlessness
+watchmaker
+watchmaking
+watchman
+watchmanly
+watchmanship
+watchmate
+watchment
+watchout
+watchtower
+watchwise
+watchwoman
+watchword
+watchwork
+water
+waterage
+waterbailage
+waterbelly
+Waterberg
+waterboard
+waterbok
+waterbosh
+waterbrain
+waterchat
+watercup
+waterdoe
+waterdrop
+watered
+waterer
+waterfall
+waterfinder
+waterflood
+waterfowl
+waterfront
+waterhead
+waterhorse
+waterie
+waterily
+wateriness
+watering
+wateringly
+wateringman
+waterish
+waterishly
+waterishness
+Waterlander
+Waterlandian
+waterleave
+waterless
+waterlessly
+waterlessness
+waterlike
+waterline
+waterlog
+waterlogged
+waterloggedness
+waterlogger
+waterlogging
+Waterloo
+waterman
+watermanship
+watermark
+watermaster
+watermelon
+watermonger
+waterphone
+waterpot
+waterproof
+waterproofer
+waterproofing
+waterproofness
+waterquake
+waterscape
+watershed
+watershoot
+waterside
+watersider
+waterskin
+watersmeet
+waterspout
+waterstead
+watertight
+watertightal
+watertightness
+waterward
+waterwards
+waterway
+waterweed
+waterwise
+waterwoman
+waterwood
+waterwork
+waterworker
+waterworm
+waterworn
+waterwort
+watery
+wath
+wathstead
+Watsonia
+watt
+wattage
+wattape
+wattle
+wattlebird
+wattled
+wattless
+wattlework
+wattling
+wattman
+wattmeter
+Watusi
+wauble
+wauch
+wauchle
+waucht
+wauf
+waugh
+waughy
+wauken
+waukit
+waukrife
+waul
+waumle
+wauner
+wauns
+waup
+waur
+Waura
+wauregan
+wauve
+wavable
+wavably
+Wave
+wave
+waved
+waveless
+wavelessly
+wavelessness
+wavelet
+wavelike
+wavellite
+wavemark
+wavement
+wavemeter
+waveproof
+waver
+waverable
+waverer
+wavering
+waveringly
+waveringness
+waverous
+wavery
+waveson
+waveward
+wavewise
+wavey
+wavicle
+wavily
+waviness
+waving
+wavingly
+Wavira
+wavy
+waw
+wawa
+wawah
+wawaskeesh
+wax
+waxberry
+waxbill
+waxbird
+waxbush
+waxchandler
+waxchandlery
+waxen
+waxer
+waxflower
+Waxhaw
+waxhearted
+waxily
+waxiness
+waxing
+waxingly
+waxlike
+waxmaker
+waxmaking
+waxman
+waxweed
+waxwing
+waxwork
+waxworker
+waxworking
+waxy
+way
+wayaka
+wayang
+Wayao
+wayback
+wayberry
+waybill
+waybird
+waybook
+waybread
+waybung
+wayfare
+wayfarer
+wayfaring
+wayfaringly
+wayfellow
+waygang
+waygate
+waygoing
+waygone
+waygoose
+wayhouse
+waying
+waylaid
+waylaidlessness
+waylay
+waylayer
+wayleave
+wayless
+waymaker
+wayman
+waymark
+waymate
+Wayne
+waypost
+ways
+wayside
+waysider
+waysliding
+waythorn
+wayward
+waywarden
+waywardly
+waywardness
+waywiser
+waywode
+waywodeship
+wayworn
+waywort
+wayzgoose
+Wazir
+we
+Wea
+weak
+weakbrained
+weaken
+weakener
+weakening
+weakfish
+weakhanded
+weakhearted
+weakheartedly
+weakheartedness
+weakish
+weakishly
+weakishness
+weakliness
+weakling
+weakly
+weakmouthed
+weakness
+weaky
+weal
+weald
+Wealden
+wealdsman
+wealth
+wealthily
+wealthiness
+wealthless
+wealthmaker
+wealthmaking
+wealthmonger
+Wealthy
+wealthy
+weam
+wean
+weanable
+weanedness
+weanel
+weaner
+weanling
+Weanoc
+weanyer
+Weapemeoc
+weapon
+weaponed
+weaponeer
+weaponless
+weaponmaker
+weaponmaking
+weaponproof
+weaponry
+weaponshaw
+weaponshow
+weaponshowing
+weaponsmith
+weaponsmithy
+wear
+wearability
+wearable
+wearer
+weariable
+weariableness
+wearied
+weariedly
+weariedness
+wearier
+weariful
+wearifully
+wearifulness
+weariless
+wearilessly
+wearily
+weariness
+wearing
+wearingly
+wearish
+wearishly
+wearishness
+wearisome
+wearisomely
+wearisomeness
+wearproof
+weary
+wearying
+wearyingly
+weasand
+weasel
+weaselfish
+weasellike
+weaselly
+weaselship
+weaselskin
+weaselsnout
+weaselwise
+weaser
+weason
+weather
+weatherboard
+weatherboarding
+weatherbreak
+weathercock
+weathercockish
+weathercockism
+weathercocky
+weathered
+weatherer
+weatherfish
+weatherglass
+weathergleam
+weatherhead
+weatherheaded
+weathering
+weatherliness
+weatherly
+weathermaker
+weathermaking
+weatherman
+weathermost
+weatherology
+weatherproof
+weatherproofed
+weatherproofing
+weatherproofness
+weatherward
+weatherworn
+weathery
+weavable
+weave
+weaveable
+weaved
+weavement
+weaver
+weaverbird
+weaveress
+weaving
+weazen
+weazened
+weazeny
+web
+webbed
+webber
+webbing
+webby
+weber
+Weberian
+webeye
+webfoot
+webfooter
+webless
+weblike
+webmaker
+webmaking
+webster
+Websterian
+websterite
+webwork
+webworm
+wecht
+wed
+wedana
+wedbed
+wedbedrip
+wedded
+weddedly
+weddedness
+wedder
+wedding
+weddinger
+wede
+wedge
+wedgeable
+wedgebill
+wedged
+wedgelike
+wedger
+wedgewise
+Wedgie
+wedging
+Wedgwood
+wedgy
+wedlock
+Wednesday
+wedset
+wee
+weeble
+weed
+weeda
+weedable
+weedage
+weeded
+weeder
+weedery
+weedful
+weedhook
+weediness
+weedingtime
+weedish
+weedless
+weedlike
+weedling
+weedow
+weedproof
+weedy
+week
+weekday
+weekend
+weekender
+weekly
+weekwam
+weel
+weelfard
+weelfaured
+weemen
+ween
+weendigo
+weeness
+weening
+weenong
+weeny
+weep
+weepable
+weeper
+weepered
+weepful
+weeping
+weepingly
+weeps
+weepy
+weesh
+weeshy
+weet
+weetbird
+weetless
+weever
+weevil
+weeviled
+weevillike
+weevilproof
+weevily
+weewow
+weeze
+weft
+weftage
+wefted
+wefty
+Wega
+wegenerian
+wegotism
+wehrlite
+Wei
+weibyeite
+weichselwood
+Weierstrassian
+Weigela
+weigelite
+weigh
+weighable
+weighage
+weighbar
+weighbauk
+weighbridge
+weighbridgeman
+weighed
+weigher
+weighership
+weighhouse
+weighin
+weighing
+weighman
+weighment
+weighshaft
+weight
+weightchaser
+weighted
+weightedly
+weightedness
+weightily
+weightiness
+weighting
+weightless
+weightlessly
+weightlessness
+weightometer
+weighty
+weinbergerite
+Weinmannia
+weinschenkite
+weir
+weirangle
+weird
+weirdful
+weirdish
+weirdless
+weirdlessness
+weirdlike
+weirdliness
+weirdly
+weirdness
+weirdsome
+weirdward
+weirdwoman
+weiring
+weisbachite
+weiselbergite
+weism
+Weismannian
+Weismannism
+weissite
+Weissnichtwo
+Weitspekan
+wejack
+weka
+wekau
+wekeen
+weki
+welcome
+welcomeless
+welcomely
+welcomeness
+welcomer
+welcoming
+welcomingly
+weld
+weldability
+weldable
+welder
+welding
+weldless
+weldment
+weldor
+Welf
+welfare
+welfaring
+Welfic
+welk
+welkin
+welkinlike
+well
+wellat
+wellaway
+wellborn
+wellcurb
+wellhead
+wellhole
+welling
+wellington
+Wellingtonia
+wellish
+wellmaker
+wellmaking
+wellman
+wellnear
+wellness
+wellring
+Wellsian
+wellside
+wellsite
+wellspring
+wellstead
+wellstrand
+welly
+wellyard
+wels
+Welsh
+welsh
+welsher
+Welshery
+Welshism
+Welshland
+Welshlike
+Welshman
+Welshness
+Welshry
+Welshwoman
+Welshy
+welsium
+welt
+welted
+welter
+welterweight
+welting
+Welwitschia
+wem
+wemless
+wen
+wench
+wencher
+wenchless
+wenchlike
+Wenchow
+Wenchowese
+Wend
+wend
+wende
+Wendell
+Wendi
+Wendic
+Wendish
+Wendy
+wene
+Wenlock
+Wenlockian
+wennebergite
+wennish
+wenny
+Wenonah
+Wenrohronon
+went
+wentletrap
+wenzel
+wept
+wer
+Werchowinci
+were
+werebear
+werecalf
+werefolk
+werefox
+werehyena
+werejaguar
+wereleopard
+werent
+weretiger
+werewolf
+werewolfish
+werewolfism
+werf
+wergil
+weri
+Werner
+Wernerian
+Wernerism
+wernerite
+werowance
+wert
+Werther
+Wertherian
+Wertherism
+wervel
+Wes
+wese
+weskit
+Wesleyan
+Wesleyanism
+Wesleyism
+wesselton
+Wessexman
+west
+westaway
+westbound
+weste
+wester
+westering
+westerliness
+westerly
+westermost
+western
+westerner
+westernism
+westernization
+westernize
+westernly
+westernmost
+westerwards
+westfalite
+westing
+westland
+Westlander
+westlandways
+westmost
+westness
+Westphalian
+Westralian
+Westralianism
+westward
+westwardly
+westwardmost
+westwards
+westy
+wet
+weta
+wetback
+wetbird
+wetched
+wetchet
+wether
+wetherhog
+wetherteg
+wetly
+wetness
+wettability
+wettable
+wetted
+wetter
+wetting
+wettish
+Wetumpka
+weve
+wevet
+Wewenoc
+wey
+Wezen
+Wezn
+wha
+whabby
+whack
+whacker
+whacking
+whacky
+whafabout
+whale
+whaleback
+whalebacker
+whalebird
+whaleboat
+whalebone
+whaleboned
+whaledom
+whalehead
+whalelike
+whaleman
+whaler
+whaleroad
+whalery
+whaleship
+whaling
+whalish
+whally
+whalm
+whalp
+whaly
+wham
+whamble
+whame
+whammle
+whamp
+whampee
+whample
+whan
+whand
+whang
+whangable
+whangam
+whangdoodle
+whangee
+whanghee
+whank
+whap
+whappet
+whapuka
+whapukee
+whapuku
+whar
+whare
+whareer
+wharf
+wharfage
+wharfhead
+wharfholder
+wharfing
+wharfinger
+wharfland
+wharfless
+wharfman
+wharfmaster
+wharfrae
+wharfside
+wharl
+wharp
+wharry
+whart
+wharve
+whase
+whasle
+what
+whata
+whatabouts
+whatever
+whatkin
+whatlike
+whatna
+whatness
+whatnot
+whatreck
+whats
+whatso
+whatsoeer
+whatsoever
+whatsomever
+whatten
+whau
+whauk
+whaup
+whaur
+whauve
+wheal
+whealworm
+whealy
+wheam
+wheat
+wheatbird
+wheatear
+wheateared
+wheaten
+wheatgrower
+wheatland
+wheatless
+wheatlike
+wheatstalk
+wheatworm
+wheaty
+whedder
+whee
+wheedle
+wheedler
+wheedlesome
+wheedling
+wheedlingly
+wheel
+wheelage
+wheelband
+wheelbarrow
+wheelbarrowful
+wheelbird
+wheelbox
+wheeldom
+wheeled
+wheeler
+wheelery
+wheelhouse
+wheeling
+wheelingly
+wheelless
+wheellike
+wheelmaker
+wheelmaking
+wheelman
+wheelrace
+wheelroad
+wheelsman
+wheelsmith
+wheelspin
+wheelswarf
+wheelway
+wheelwise
+wheelwork
+wheelwright
+wheelwrighting
+wheely
+wheem
+wheen
+wheencat
+wheenge
+wheep
+wheeple
+wheer
+wheerikins
+wheesht
+wheetle
+wheeze
+wheezer
+wheezily
+wheeziness
+wheezingly
+wheezle
+wheezy
+wheft
+whein
+whekau
+wheki
+whelk
+whelked
+whelker
+whelklike
+whelky
+whelm
+whelp
+whelphood
+whelpish
+whelpless
+whelpling
+whelve
+whemmel
+when
+whenabouts
+whenas
+whence
+whenceeer
+whenceforth
+whenceforward
+whencesoeer
+whencesoever
+whencever
+wheneer
+whenever
+whenness
+whenso
+whensoever
+whensomever
+where
+whereabout
+whereabouts
+whereafter
+whereanent
+whereas
+whereat
+whereaway
+whereby
+whereer
+wherefor
+wherefore
+wherefrom
+wherein
+whereinsoever
+whereinto
+whereness
+whereof
+whereon
+whereout
+whereover
+whereso
+wheresoeer
+wheresoever
+wheresomever
+wherethrough
+wheretill
+whereto
+wheretoever
+wheretosoever
+whereunder
+whereuntil
+whereunto
+whereup
+whereupon
+wherever
+wherewith
+wherewithal
+wherret
+wherrit
+wherry
+wherryman
+whet
+whether
+whetile
+whetrock
+whetstone
+whetter
+whew
+whewellite
+whewer
+whewl
+whewt
+whey
+wheybeard
+wheyey
+wheyeyness
+wheyface
+wheyfaced
+wheyish
+wheyishness
+wheylike
+wheyness
+whiba
+which
+whichever
+whichsoever
+whichway
+whichways
+whick
+whicken
+whicker
+whid
+whidah
+whidder
+whiff
+whiffenpoof
+whiffer
+whiffet
+whiffle
+whiffler
+whifflery
+whiffletree
+whiffling
+whifflingly
+whiffy
+whift
+Whig
+whig
+Whiggamore
+whiggamore
+Whiggarchy
+Whiggery
+Whiggess
+Whiggification
+Whiggify
+Whiggish
+Whiggishly
+Whiggishness
+Whiggism
+Whiglet
+Whigling
+whigmaleerie
+whigship
+whikerby
+while
+whileen
+whilere
+whiles
+whilie
+whilk
+Whilkut
+whill
+whillaballoo
+whillaloo
+whillilew
+whilly
+whillywha
+whilock
+whilom
+whils
+whilst
+whilter
+whim
+whimberry
+whimble
+whimbrel
+whimling
+whimmy
+whimper
+whimperer
+whimpering
+whimperingly
+whimsey
+whimsic
+whimsical
+whimsicality
+whimsically
+whimsicalness
+whimsied
+whimstone
+whimwham
+whin
+whinberry
+whinchacker
+whinchat
+whincheck
+whincow
+whindle
+whine
+whiner
+whinestone
+whing
+whinge
+whinger
+whininess
+whiningly
+whinnel
+whinner
+whinnock
+whinny
+whinstone
+whiny
+whinyard
+whip
+whipbelly
+whipbird
+whipcat
+whipcord
+whipcordy
+whipcrack
+whipcracker
+whipcraft
+whipgraft
+whipjack
+whipking
+whiplash
+whiplike
+whipmaker
+whipmaking
+whipman
+whipmanship
+whipmaster
+whippa
+whippable
+whipparee
+whipped
+whipper
+whippersnapper
+whippertail
+whippet
+whippeter
+whippiness
+whipping
+whippingly
+whippletree
+whippoorwill
+whippost
+whippowill
+whippy
+whipsaw
+whipsawyer
+whipship
+whipsocket
+whipstaff
+whipstalk
+whipstall
+whipster
+whipstick
+whipstitch
+whipstock
+whipt
+whiptail
+whiptree
+whipwise
+whipworm
+whir
+whirken
+whirl
+whirlabout
+whirlblast
+whirlbone
+whirlbrain
+whirled
+whirler
+whirley
+whirlgig
+whirlicane
+whirligig
+whirlimagig
+whirling
+whirlingly
+whirlmagee
+whirlpool
+whirlpuff
+whirlwig
+whirlwind
+whirlwindish
+whirlwindy
+whirly
+whirlygigum
+whirret
+whirrey
+whirroo
+whirry
+whirtle
+whish
+whisk
+whisker
+whiskerage
+whiskerando
+whiskerandoed
+whiskered
+whiskerer
+whiskerette
+whiskerless
+whiskerlike
+whiskery
+whiskey
+whiskful
+whiskied
+whiskified
+whisking
+whiskingly
+whisky
+whiskyfied
+whiskylike
+whisp
+whisper
+whisperable
+whisperation
+whispered
+whisperer
+whisperhood
+whispering
+whisperingly
+whisperingness
+whisperless
+whisperous
+whisperously
+whisperproof
+whispery
+whissle
+Whisson
+whist
+whister
+whisterpoop
+whistle
+whistlebelly
+whistlefish
+whistlelike
+whistler
+Whistlerian
+whistlerism
+whistlewing
+whistlewood
+whistlike
+whistling
+whistlingly
+whistly
+whistness
+Whistonian
+Whit
+whit
+white
+whiteback
+whitebait
+whitebark
+whitebeard
+whitebelly
+whitebill
+whitebird
+whiteblaze
+whiteblow
+whitebottle
+Whiteboy
+Whiteboyism
+whitecap
+whitecapper
+Whitechapel
+whitecoat
+whitecomb
+whitecorn
+whitecup
+whited
+whiteface
+Whitefieldian
+Whitefieldism
+Whitefieldite
+whitefish
+whitefisher
+whitefishery
+Whitefoot
+whitefoot
+whitefootism
+whitehanded
+whitehass
+whitehawse
+whitehead
+whiteheart
+whitehearted
+whitelike
+whitely
+whiten
+whitener
+whiteness
+whitening
+whitenose
+whitepot
+whiteroot
+whiterump
+whites
+whitesark
+whiteseam
+whiteshank
+whiteside
+whitesmith
+whitestone
+whitetail
+whitethorn
+whitethroat
+whitetip
+whitetop
+whitevein
+whitewall
+whitewards
+whiteware
+whitewash
+whitewasher
+whiteweed
+whitewing
+whitewood
+whiteworm
+whitewort
+whitfinch
+whither
+whitherso
+whithersoever
+whitherto
+whitherward
+whiting
+whitish
+whitishness
+whitleather
+Whitleyism
+whitling
+whitlow
+whitlowwort
+Whitmanese
+Whitmanesque
+Whitmanism
+Whitmanize
+Whitmonday
+whitneyite
+whitrack
+whits
+whitster
+Whitsun
+Whitsunday
+Whitsuntide
+whittaw
+whitten
+whittener
+whitter
+whitterick
+whittle
+whittler
+whittling
+whittret
+whittrick
+whity
+whiz
+whizgig
+whizzer
+whizzerman
+whizziness
+whizzing
+whizzingly
+whizzle
+who
+whoa
+whodunit
+whoever
+whole
+wholehearted
+wholeheartedly
+wholeheartedness
+wholeness
+wholesale
+wholesalely
+wholesaleness
+wholesaler
+wholesome
+wholesomely
+wholesomeness
+wholewise
+wholly
+whom
+whomble
+whomever
+whomso
+whomsoever
+whone
+whoo
+whoof
+whoop
+whoopee
+whooper
+whooping
+whoopingly
+whooplike
+whoops
+whoosh
+whop
+whopper
+whopping
+whorage
+whore
+whoredom
+whorelike
+whoremaster
+whoremasterly
+whoremastery
+whoremonger
+whoremonging
+whoreship
+whoreson
+whorish
+whorishly
+whorishness
+whorl
+whorled
+whorlflower
+whorly
+whorlywort
+whort
+whortle
+whortleberry
+whose
+whosen
+whosesoever
+whosever
+whosomever
+whosumdever
+whud
+whuff
+whuffle
+whulk
+whulter
+whummle
+whun
+whunstane
+whup
+whush
+whuskie
+whussle
+whute
+whuther
+whutter
+whuttering
+whuz
+why
+whyever
+whyfor
+whyness
+whyo
+wi
+wice
+Wichita
+wicht
+wichtisite
+wichtje
+wick
+wickawee
+wicked
+wickedish
+wickedlike
+wickedly
+wickedness
+wicken
+wicker
+wickerby
+wickerware
+wickerwork
+wickerworked
+wickerworker
+wicket
+wicketkeep
+wicketkeeper
+wicketkeeping
+wicketwork
+wicking
+wickiup
+wickless
+wickup
+wicky
+wicopy
+wid
+widbin
+widdendream
+widder
+widdershins
+widdifow
+widdle
+widdy
+wide
+widegab
+widehearted
+widely
+widemouthed
+widen
+widener
+wideness
+widespread
+widespreadedly
+widespreadly
+widespreadness
+widewhere
+widework
+widgeon
+widish
+widow
+widowed
+widower
+widowered
+widowerhood
+widowership
+widowery
+widowhood
+widowish
+widowlike
+widowly
+widowman
+widowy
+width
+widthless
+widthway
+widthways
+widthwise
+widu
+wield
+wieldable
+wielder
+wieldiness
+wieldy
+wiener
+wienerwurst
+wienie
+wierangle
+wiesenboden
+wife
+wifecarl
+wifedom
+wifehood
+wifeism
+wifekin
+wifeless
+wifelessness
+wifelet
+wifelike
+wifeling
+wifelkin
+wifely
+wifeship
+wifeward
+wifie
+wifiekie
+wifish
+wifock
+wig
+wigan
+wigdom
+wigful
+wigged
+wiggen
+wigger
+wiggery
+wigging
+wiggish
+wiggishness
+wiggism
+wiggle
+wiggler
+wiggly
+wiggy
+wight
+wightly
+wightness
+wigless
+wiglet
+wiglike
+wigmaker
+wigmaking
+wigtail
+wigwag
+wigwagger
+wigwam
+wiikite
+Wikeno
+Wikstroemia
+Wilbur
+Wilburite
+wild
+wildbore
+wildcat
+wildcatter
+wildcatting
+wildebeest
+wilded
+wilder
+wilderedly
+wildering
+wilderment
+wilderness
+wildfire
+wildfowl
+wildgrave
+wilding
+wildish
+wildishly
+wildishness
+wildlife
+wildlike
+wildling
+wildly
+wildness
+wildsome
+wildwind
+wile
+wileful
+wileless
+wileproof
+Wilfred
+wilga
+wilgers
+Wilhelm
+Wilhelmina
+Wilhelmine
+wilily
+wiliness
+wilk
+wilkeite
+wilkin
+Wilkinson
+Will
+will
+willable
+willawa
+willed
+willedness
+willemite
+willer
+willet
+willey
+willeyer
+willful
+willfully
+willfulness
+William
+williamsite
+Williamsonia
+Williamsoniaceae
+Willie
+willie
+willier
+willies
+willing
+willinghearted
+willinghood
+willingly
+willingness
+williwaw
+willmaker
+willmaking
+willness
+willock
+willow
+willowbiter
+willowed
+willower
+willowish
+willowlike
+willowware
+willowweed
+willowworm
+willowwort
+willowy
+Willugbaeya
+Willy
+willy
+willyard
+willyart
+willyer
+Wilmer
+wilsome
+wilsomely
+wilsomeness
+Wilson
+Wilsonian
+wilt
+wilter
+Wilton
+wiltproof
+Wiltshire
+wily
+wim
+wimberry
+wimble
+wimblelike
+wimbrel
+wime
+wimick
+wimple
+wimpleless
+wimplelike
+Win
+win
+winberry
+wince
+wincer
+wincey
+winch
+wincher
+Winchester
+winchman
+wincing
+wincingly
+Wind
+wind
+windable
+windage
+windbag
+windbagged
+windbaggery
+windball
+windberry
+windbibber
+windbore
+windbracing
+windbreak
+Windbreaker
+windbreaker
+windbroach
+windclothes
+windcuffer
+winddog
+winded
+windedly
+windedness
+winder
+windermost
+Windesheimer
+windfall
+windfallen
+windfanner
+windfirm
+windfish
+windflaw
+windflower
+windgall
+windgalled
+windhole
+windhover
+windigo
+windily
+windiness
+winding
+windingly
+windingness
+windjammer
+windjamming
+windlass
+windlasser
+windle
+windles
+windless
+windlessly
+windlessness
+windlestrae
+windlestraw
+windlike
+windlin
+windling
+windmill
+windmilly
+windock
+windore
+window
+windowful
+windowless
+windowlessness
+windowlet
+windowlight
+windowlike
+windowmaker
+windowmaking
+windowman
+windowpane
+windowpeeper
+windowshut
+windowward
+windowwards
+windowwise
+windowy
+windpipe
+windplayer
+windproof
+windring
+windroad
+windroot
+windrow
+windrower
+windscreen
+windshield
+windshock
+Windsor
+windsorite
+windstorm
+windsucker
+windtight
+windup
+windward
+windwardly
+windwardmost
+windwardness
+windwards
+windway
+windwayward
+windwaywardly
+windy
+wine
+wineball
+wineberry
+winebibber
+winebibbery
+winebibbing
+Winebrennerian
+wineconner
+wined
+wineglass
+wineglassful
+winegrower
+winegrowing
+winehouse
+wineless
+winelike
+winemay
+winepot
+winer
+winery
+Winesap
+wineshop
+wineskin
+winesop
+winetaster
+winetree
+winevat
+Winfred
+winful
+wing
+wingable
+wingbeat
+wingcut
+winged
+wingedly
+wingedness
+winger
+wingfish
+winghanded
+wingle
+wingless
+winglessness
+winglet
+winglike
+wingman
+wingmanship
+wingpiece
+wingpost
+wingseed
+wingspread
+wingstem
+wingy
+Winifred
+winish
+wink
+winkel
+winkelman
+winker
+winkered
+winking
+winkingly
+winkle
+winklehawk
+winklehole
+winklet
+winly
+winna
+winnable
+winnard
+Winnebago
+Winnecowet
+winnel
+winnelstrae
+winner
+Winnie
+winning
+winningly
+winningness
+winnings
+winninish
+Winnipesaukee
+winnle
+winnonish
+winnow
+winnower
+winnowing
+winnowingly
+Winona
+winrace
+winrow
+winsome
+winsomely
+winsomeness
+Winston
+wint
+winter
+Winteraceae
+winterage
+Winteranaceae
+winterberry
+winterbloom
+winterbourne
+winterdykes
+wintered
+winterer
+winterfeed
+wintergreen
+winterhain
+wintering
+winterish
+winterishly
+winterishness
+winterization
+winterize
+winterkill
+winterkilling
+winterless
+winterlike
+winterliness
+winterling
+winterly
+winterproof
+wintersome
+wintertide
+wintertime
+winterward
+winterwards
+winterweed
+wintle
+wintrify
+wintrily
+wintriness
+wintrish
+wintrous
+wintry
+Wintun
+winy
+winze
+winzeman
+wipe
+wiper
+wippen
+wips
+wir
+wirable
+wirble
+wird
+wire
+wirebar
+wirebird
+wired
+wiredancer
+wiredancing
+wiredraw
+wiredrawer
+wiredrawn
+wirehair
+wireless
+wirelessly
+wirelessness
+wirelike
+wiremaker
+wiremaking
+wireman
+wiremonger
+Wirephoto
+wirepull
+wirepuller
+wirepulling
+wirer
+wiresmith
+wirespun
+wiretail
+wireway
+wireweed
+wirework
+wireworker
+wireworking
+wireworks
+wireworm
+wirily
+wiriness
+wiring
+wirl
+wirling
+Wiros
+wirr
+wirra
+wirrah
+wirrasthru
+wiry
+wis
+Wisconsinite
+wisdom
+wisdomful
+wisdomless
+wisdomproof
+wisdomship
+wise
+wiseacre
+wiseacred
+wiseacredness
+wiseacredom
+wiseacreish
+wiseacreishness
+wiseacreism
+wisecrack
+wisecracker
+wisecrackery
+wisehead
+wisehearted
+wiseheartedly
+wiseheimer
+wiselike
+wiseling
+wisely
+wiseman
+wisen
+wiseness
+wisenheimer
+wisent
+wiser
+wiseweed
+wisewoman
+wish
+wisha
+wishable
+wishbone
+wished
+wishedly
+wisher
+wishful
+wishfully
+wishfulness
+wishing
+wishingly
+wishless
+wishly
+wishmay
+wishness
+Wishoskan
+Wishram
+wisht
+wishtonwish
+Wisigothic
+wisket
+wiskinky
+wisp
+wispish
+wisplike
+wispy
+wiss
+wisse
+wissel
+wist
+Wistaria
+wistaria
+wiste
+wistened
+Wisteria
+wisteria
+wistful
+wistfully
+wistfulness
+wistit
+wistiti
+wistless
+wistlessness
+wistonwish
+wit
+witan
+Witbooi
+witch
+witchbells
+witchcraft
+witched
+witchedly
+witchen
+witchering
+witchery
+witchet
+witchetty
+witchhood
+witching
+witchingly
+witchleaf
+witchlike
+witchman
+witchmonger
+witchuck
+witchweed
+witchwife
+witchwoman
+witchwood
+witchwork
+witchy
+witcraft
+wite
+witeless
+witenagemot
+witepenny
+witess
+witful
+with
+withal
+withamite
+Withania
+withdraught
+withdraw
+withdrawable
+withdrawal
+withdrawer
+withdrawing
+withdrawingness
+withdrawment
+withdrawn
+withdrawnness
+withe
+withen
+wither
+witherband
+withered
+witheredly
+witheredness
+witherer
+withergloom
+withering
+witheringly
+witherite
+witherly
+withernam
+withers
+withershins
+withertip
+witherwards
+witherweight
+withery
+withewood
+withheld
+withhold
+withholdable
+withholdal
+withholder
+withholdment
+within
+withindoors
+withinside
+withinsides
+withinward
+withinwards
+withness
+witholden
+without
+withoutdoors
+withouten
+withoutforth
+withoutside
+withoutwards
+withsave
+withstand
+withstander
+withstandingness
+withstay
+withstood
+withstrain
+withvine
+withwind
+withy
+withypot
+withywind
+witjar
+witless
+witlessly
+witlessness
+witlet
+witling
+witloof
+witmonger
+witness
+witnessable
+witnessdom
+witnesser
+witney
+witneyer
+Witoto
+witship
+wittal
+wittawer
+witteboom
+witted
+witter
+wittering
+witticaster
+wittichenite
+witticism
+witticize
+wittified
+wittily
+wittiness
+witting
+wittingly
+wittol
+wittolly
+witty
+Witumki
+witwall
+witzchoura
+wive
+wiver
+wivern
+Wiyat
+Wiyot
+wiz
+wizard
+wizardess
+wizardism
+wizardlike
+wizardly
+wizardry
+wizardship
+wizen
+wizened
+wizenedness
+wizier
+wizzen
+wloka
+wo
+woad
+woader
+woadman
+woadwaxen
+woady
+woak
+woald
+woan
+wob
+wobbegong
+wobble
+wobbler
+wobbliness
+wobbling
+wobblingly
+wobbly
+wobster
+wocheinite
+Wochua
+wod
+woddie
+wode
+Wodenism
+wodge
+wodgy
+woe
+woebegone
+woebegoneness
+woebegonish
+woeful
+woefully
+woefulness
+woehlerite
+woesome
+woevine
+woeworn
+woffler
+woft
+wog
+wogiet
+Wogulian
+woibe
+wokas
+woke
+wokowi
+wold
+woldlike
+woldsman
+woldy
+Wolf
+wolf
+wolfachite
+wolfberry
+wolfdom
+wolfen
+wolfer
+Wolffia
+Wolffian
+Wolffianism
+Wolfgang
+wolfhood
+wolfhound
+Wolfian
+wolfish
+wolfishly
+wolfishness
+wolfkin
+wolfless
+wolflike
+wolfling
+wolfram
+wolframate
+wolframic
+wolframine
+wolframinium
+wolframite
+wolfsbane
+wolfsbergite
+wolfskin
+wolfward
+wolfwards
+wollastonite
+wollomai
+wollop
+Wolof
+wolter
+wolve
+wolveboon
+wolver
+wolverine
+woman
+womanbody
+womandom
+womanfolk
+womanfully
+womanhead
+womanhearted
+womanhood
+womanhouse
+womanish
+womanishly
+womanishness
+womanism
+womanist
+womanity
+womanization
+womanize
+womanizer
+womankind
+womanless
+womanlike
+womanliness
+womanly
+womanmuckle
+womanness
+womanpost
+womanproof
+womanship
+womanways
+womanwise
+womb
+wombat
+wombed
+womble
+wombstone
+womby
+womenfolk
+womenfolks
+womenkind
+womera
+wommerala
+won
+wonder
+wonderberry
+wonderbright
+wondercraft
+wonderer
+wonderful
+wonderfully
+wonderfulness
+wondering
+wonderingly
+wonderland
+wonderlandish
+wonderless
+wonderment
+wondermonger
+wondermongering
+wondersmith
+wondersome
+wonderstrong
+wonderwell
+wonderwork
+wonderworthy
+wondrous
+wondrously
+wondrousness
+wone
+wonegan
+wong
+wonga
+Wongara
+wongen
+wongshy
+wongsky
+woning
+wonky
+wonna
+wonned
+wonner
+wonning
+wonnot
+wont
+wonted
+wontedly
+wontedness
+wonting
+woo
+wooable
+wood
+woodagate
+woodbark
+woodbin
+woodbind
+woodbine
+woodbined
+woodbound
+woodburytype
+woodbush
+woodchat
+woodchuck
+woodcock
+woodcockize
+woodcracker
+woodcraft
+woodcrafter
+woodcraftiness
+woodcraftsman
+woodcrafty
+woodcut
+woodcutter
+woodcutting
+wooded
+wooden
+woodendite
+woodenhead
+woodenheaded
+woodenheadedness
+woodenly
+woodenness
+woodenware
+woodenweary
+woodeny
+woodfish
+woodgeld
+woodgrub
+woodhack
+woodhacker
+woodhole
+woodhorse
+woodhouse
+woodhung
+woodine
+woodiness
+wooding
+woodish
+woodjobber
+woodkern
+woodknacker
+woodland
+woodlander
+woodless
+woodlessness
+woodlet
+woodlike
+woodlocked
+woodly
+woodman
+woodmancraft
+woodmanship
+woodmonger
+woodmote
+woodness
+woodpeck
+woodpecker
+woodpenny
+woodpile
+woodprint
+woodranger
+woodreeve
+woodrick
+woodrock
+woodroof
+woodrow
+woodrowel
+Woodruff
+woodruff
+woodsere
+woodshed
+woodshop
+Woodsia
+woodside
+woodsilver
+woodskin
+woodsman
+woodspite
+woodstone
+woodsy
+woodwall
+woodward
+Woodwardia
+woodwardship
+woodware
+woodwax
+woodwaxen
+woodwise
+woodwork
+woodworker
+woodworking
+woodworm
+woodwose
+woodwright
+Woody
+woody
+woodyard
+wooer
+woof
+woofed
+woofell
+woofer
+woofy
+woohoo
+wooing
+wooingly
+wool
+woold
+woolder
+woolding
+wooled
+woolen
+woolenet
+woolenization
+woolenize
+wooler
+woolert
+woolfell
+woolgatherer
+woolgathering
+woolgrower
+woolgrowing
+woolhead
+wooliness
+woollike
+woolly
+woollyhead
+woollyish
+woolman
+woolpack
+woolpress
+woolsack
+woolsey
+woolshearer
+woolshearing
+woolshears
+woolshed
+woolskin
+woolsorter
+woolsorting
+woolsower
+woolstock
+woolulose
+Woolwa
+woolwasher
+woolweed
+woolwheel
+woolwinder
+woolwork
+woolworker
+woolworking
+woom
+woomer
+woomerang
+woon
+woons
+woorali
+woorari
+woosh
+wootz
+woozle
+woozy
+wop
+woppish
+wops
+worble
+worcester
+word
+wordable
+wordably
+wordage
+wordbook
+wordbuilding
+wordcraft
+wordcraftsman
+worded
+Worden
+worder
+wordily
+wordiness
+wording
+wordish
+wordishly
+wordishness
+wordle
+wordless
+wordlessly
+wordlessness
+wordlike
+wordlorist
+wordmaker
+wordmaking
+wordman
+wordmanship
+wordmonger
+wordmongering
+wordmongery
+wordplay
+wordsman
+wordsmanship
+wordsmith
+wordspite
+wordster
+Wordsworthian
+Wordsworthianism
+wordy
+wore
+work
+workability
+workable
+workableness
+workaday
+workaway
+workbag
+workbasket
+workbench
+workbook
+workbox
+workbrittle
+workday
+worked
+worker
+workfellow
+workfolk
+workfolks
+workgirl
+workhand
+workhouse
+workhoused
+working
+workingly
+workingman
+workingwoman
+workless
+worklessness
+workloom
+workman
+workmanlike
+workmanlikeness
+workmanliness
+workmanly
+workmanship
+workmaster
+workmistress
+workout
+workpan
+workpeople
+workpiece
+workplace
+workroom
+works
+workship
+workshop
+worksome
+workstand
+worktable
+worktime
+workways
+workwise
+workwoman
+workwomanlike
+workwomanly
+worky
+workyard
+world
+worlded
+worldful
+worldish
+worldless
+worldlet
+worldlike
+worldlily
+worldliness
+worldling
+worldly
+worldmaker
+worldmaking
+worldproof
+worldquake
+worldward
+worldwards
+worldway
+worldy
+worm
+wormed
+wormer
+wormhole
+wormholed
+wormhood
+Wormian
+wormil
+worming
+wormless
+wormlike
+wormling
+wormproof
+wormroot
+wormseed
+wormship
+wormweed
+wormwood
+wormy
+worn
+wornil
+wornness
+worral
+worriable
+worricow
+worried
+worriedly
+worriedness
+worrier
+worriless
+worriment
+worrisome
+worrisomely
+worrisomeness
+worrit
+worriter
+worry
+worrying
+worryingly
+worryproof
+worrywart
+worse
+worsement
+worsen
+worseness
+worsening
+worser
+worserment
+worset
+worship
+worshipability
+worshipable
+worshiper
+worshipful
+worshipfully
+worshipfulness
+worshipingly
+worshipless
+worshipworth
+worshipworthy
+worst
+worsted
+wort
+worth
+worthful
+worthfulness
+worthiest
+worthily
+worthiness
+worthless
+worthlessly
+worthlessness
+worthship
+worthward
+worthy
+wosbird
+wot
+wote
+wots
+wottest
+wotteth
+woubit
+wouch
+wouf
+wough
+would
+wouldest
+wouldnt
+wouldst
+wound
+woundability
+woundable
+woundableness
+wounded
+woundedly
+wounder
+woundily
+wounding
+woundingly
+woundless
+wounds
+woundwort
+woundworth
+woundy
+wourali
+wourari
+wournil
+wove
+woven
+Wovoka
+wow
+wowser
+wowserdom
+wowserian
+wowserish
+wowserism
+wowsery
+wowt
+woy
+Woyaway
+wrack
+wracker
+wrackful
+Wraf
+wraggle
+wrainbolt
+wrainstaff
+wrainstave
+wraith
+wraithe
+wraithlike
+wraithy
+wraitly
+wramp
+wran
+wrang
+wrangle
+wrangler
+wranglership
+wranglesome
+wranglingly
+wrannock
+wranny
+wrap
+wrappage
+wrapped
+wrapper
+wrapperer
+wrappering
+wrapping
+wraprascal
+wrasse
+wrastle
+wrastler
+wrath
+wrathful
+wrathfully
+wrathfulness
+wrathily
+wrathiness
+wrathlike
+wrathy
+wraw
+wrawl
+wrawler
+wraxle
+wreak
+wreakful
+wreakless
+wreat
+wreath
+wreathage
+wreathe
+wreathed
+wreathen
+wreather
+wreathingly
+wreathless
+wreathlet
+wreathlike
+wreathmaker
+wreathmaking
+wreathwise
+wreathwork
+wreathwort
+wreathy
+wreck
+wreckage
+wrecker
+wreckfish
+wreckful
+wrecking
+wrecky
+Wren
+wren
+wrench
+wrenched
+wrencher
+wrenchingly
+wrenlet
+wrenlike
+wrentail
+wrest
+wrestable
+wrester
+wresting
+wrestingly
+wrestle
+wrestler
+wrestlerlike
+wrestling
+wretch
+wretched
+wretchedly
+wretchedness
+wretchless
+wretchlessly
+wretchlessness
+wretchock
+wricht
+wrick
+wride
+wried
+wrier
+wriest
+wrig
+wriggle
+wriggler
+wrigglesome
+wrigglingly
+wriggly
+wright
+wrightine
+wring
+wringbolt
+wringer
+wringman
+wringstaff
+wrinkle
+wrinkleable
+wrinkled
+wrinkledness
+wrinkledy
+wrinkleful
+wrinkleless
+wrinkleproof
+wrinklet
+wrinkly
+wrist
+wristband
+wristbone
+wristed
+wrister
+wristfall
+wristikin
+wristlet
+wristlock
+wristwork
+writ
+writability
+writable
+writation
+writative
+write
+writeable
+writee
+writer
+writeress
+writerling
+writership
+writh
+writhe
+writhed
+writhedly
+writhedness
+writhen
+writheneck
+writher
+writhing
+writhingly
+writhy
+writing
+writinger
+writmaker
+writmaking
+writproof
+written
+writter
+wrive
+wrizzled
+wro
+wrocht
+wroke
+wroken
+wrong
+wrongdoer
+wrongdoing
+wronged
+wronger
+wrongful
+wrongfully
+wrongfulness
+wronghead
+wrongheaded
+wrongheadedly
+wrongheadedness
+wronghearted
+wrongheartedly
+wrongheartedness
+wrongish
+wrongless
+wronglessly
+wrongly
+wrongness
+wrongous
+wrongously
+wrongousness
+wrongwise
+Wronskian
+wrossle
+wrote
+wroth
+wrothful
+wrothfully
+wrothily
+wrothiness
+wrothly
+wrothsome
+wrothy
+wrought
+wrox
+wrung
+wrungness
+wry
+wrybill
+wryly
+wrymouth
+wryneck
+wryness
+wrytail
+Wu
+Wuchereria
+wud
+wuddie
+wudge
+wudu
+wugg
+wulfenite
+wulk
+wull
+wullawins
+wullcat
+Wullie
+wulliwa
+wumble
+wumman
+wummel
+wun
+Wundtian
+wungee
+wunna
+wunner
+wunsome
+wup
+wur
+wurley
+wurmal
+Wurmian
+wurrus
+wurset
+wurtzilite
+wurtzite
+Wurzburger
+wurzel
+wush
+wusp
+wuss
+wusser
+wust
+wut
+wuther
+wuzu
+wuzzer
+wuzzle
+wuzzy
+wy
+Wyandot
+Wyandotte
+Wycliffian
+Wycliffism
+Wycliffist
+Wycliffite
+wyde
+wye
+Wyethia
+wyke
+Wykehamical
+Wykehamist
+wyle
+wyliecoat
+wymote
+wyn
+wynd
+wyne
+wynkernel
+wynn
+Wyomingite
+wyomingite
+wype
+wyson
+wyss
+wyve
+wyver
+X
+x
+xanthaline
+xanthamic
+xanthamide
+xanthane
+xanthate
+xanthation
+xanthein
+xanthelasma
+xanthelasmic
+xanthelasmoidea
+xanthene
+Xanthian
+xanthic
+xanthide
+Xanthidium
+xanthin
+xanthine
+xanthinuria
+xanthione
+Xanthisma
+xanthite
+Xanthium
+xanthiuria
+xanthocarpous
+Xanthocephalus
+Xanthoceras
+Xanthochroi
+xanthochroia
+Xanthochroic
+xanthochroid
+xanthochroism
+xanthochromia
+xanthochromic
+xanthochroous
+xanthocobaltic
+xanthocone
+xanthoconite
+xanthocreatinine
+xanthocyanopsia
+xanthocyanopsy
+xanthocyanopy
+xanthoderm
+xanthoderma
+xanthodont
+xanthodontous
+xanthogen
+xanthogenamic
+xanthogenamide
+xanthogenate
+xanthogenic
+xantholeucophore
+xanthoma
+xanthomata
+xanthomatosis
+xanthomatous
+Xanthomelanoi
+xanthomelanous
+xanthometer
+Xanthomonas
+xanthomyeloma
+xanthone
+xanthophane
+xanthophore
+xanthophose
+Xanthophyceae
+xanthophyll
+xanthophyllite
+xanthophyllous
+Xanthopia
+xanthopia
+xanthopicrin
+xanthopicrite
+xanthoproteic
+xanthoprotein
+xanthoproteinic
+xanthopsia
+xanthopsin
+xanthopsydracia
+xanthopterin
+xanthopurpurin
+xanthorhamnin
+Xanthorrhiza
+Xanthorrhoea
+xanthorrhoea
+xanthosiderite
+xanthosis
+Xanthosoma
+xanthospermous
+xanthotic
+Xanthoura
+xanthous
+Xanthoxalis
+xanthoxenite
+xanthoxylin
+xanthuria
+xanthydrol
+xanthyl
+xarque
+Xaverian
+xebec
+Xema
+xenacanthine
+Xenacanthini
+xenagogue
+xenagogy
+Xenarchi
+Xenarthra
+xenarthral
+xenarthrous
+xenelasia
+xenelasy
+xenia
+xenial
+xenian
+Xenicidae
+Xenicus
+xenium
+xenobiosis
+xenoblast
+Xenocratean
+Xenocratic
+xenocryst
+xenodochium
+xenogamous
+xenogamy
+xenogenesis
+xenogenetic
+xenogenic
+xenogenous
+xenogeny
+xenolite
+xenolith
+xenolithic
+xenomania
+xenomaniac
+Xenomi
+Xenomorpha
+xenomorphic
+xenomorphosis
+xenon
+xenoparasite
+xenoparasitism
+xenopeltid
+Xenopeltidae
+Xenophanean
+xenophile
+xenophilism
+xenophobe
+xenophobia
+xenophobian
+xenophobism
+xenophoby
+Xenophonic
+Xenophontean
+Xenophontian
+Xenophontic
+Xenophontine
+Xenophora
+xenophoran
+Xenophoridae
+xenophthalmia
+xenophya
+xenopodid
+Xenopodidae
+xenopodoid
+Xenopsylla
+xenopteran
+Xenopteri
+xenopterygian
+Xenopterygii
+Xenopus
+Xenorhynchus
+Xenos
+xenosaurid
+Xenosauridae
+xenosauroid
+Xenosaurus
+xenotime
+Xenurus
+xenyl
+xenylamine
+xerafin
+xeransis
+Xeranthemum
+xeranthemum
+xerantic
+xerarch
+xerasia
+Xeres
+xeric
+xerically
+xeriff
+xerocline
+xeroderma
+xerodermatic
+xerodermatous
+xerodermia
+xerodermic
+xerogel
+xerography
+xeroma
+xeromata
+xeromenia
+xeromorph
+xeromorphic
+xeromorphous
+xeromorphy
+xeromyron
+xeromyrum
+xeronate
+xeronic
+xerophagia
+xerophagy
+xerophil
+xerophile
+xerophilous
+xerophily
+xerophobous
+xerophthalmia
+xerophthalmos
+xerophthalmy
+Xerophyllum
+xerophyte
+xerophytic
+xerophytically
+xerophytism
+xeroprinting
+xerosis
+xerostoma
+xerostomia
+xerotes
+xerotherm
+xerotic
+xerotocia
+xerotripsis
+Xerus
+xi
+Xicak
+Xicaque
+Ximenia
+Xina
+Xinca
+Xipe
+Xiphias
+xiphias
+xiphihumeralis
+xiphiid
+Xiphiidae
+xiphiiform
+xiphioid
+xiphiplastra
+xiphiplastral
+xiphiplastron
+xiphisterna
+xiphisternal
+xiphisternum
+Xiphisura
+xiphisuran
+Xiphiura
+Xiphius
+xiphocostal
+Xiphodon
+Xiphodontidae
+xiphodynia
+xiphoid
+xiphoidal
+xiphoidian
+xiphopagic
+xiphopagous
+xiphopagus
+xiphophyllous
+xiphosterna
+xiphosternum
+Xiphosura
+xiphosuran
+xiphosure
+Xiphosuridae
+xiphosurous
+Xiphosurus
+xiphuous
+Xiphura
+Xiphydria
+xiphydriid
+Xiphydriidae
+Xiraxara
+Xmas
+xoana
+xoanon
+Xosa
+xurel
+xyla
+xylan
+Xylaria
+Xylariaceae
+xylate
+Xyleborus
+xylem
+xylene
+xylenol
+xylenyl
+xyletic
+Xylia
+xylic
+xylidic
+xylidine
+Xylina
+xylindein
+xylinid
+xylite
+xylitol
+xylitone
+xylobalsamum
+xylocarp
+xylocarpous
+Xylocopa
+xylocopid
+Xylocopidae
+xylogen
+xyloglyphy
+xylograph
+xylographer
+xylographic
+xylographical
+xylographically
+xylography
+xyloid
+xyloidin
+xylol
+xylology
+xyloma
+xylomancy
+xylometer
+xylon
+xylonic
+Xylonite
+xylonitrile
+Xylophaga
+xylophagan
+xylophage
+xylophagid
+Xylophagidae
+xylophagous
+Xylophagus
+xylophilous
+xylophone
+xylophonic
+xylophonist
+Xylopia
+xyloplastic
+xylopyrography
+xyloquinone
+xylorcin
+xylorcinol
+xylose
+xyloside
+Xylosma
+xylostroma
+xylostromata
+xylostromatoid
+xylotile
+xylotomist
+xylotomous
+xylotomy
+Xylotrya
+xylotypographic
+xylotypography
+xyloyl
+xylyl
+xylylene
+xylylic
+xyphoid
+Xyrichthys
+xyrid
+Xyridaceae
+xyridaceous
+Xyridales
+Xyris
+xyst
+xyster
+xysti
+xystos
+xystum
+xystus
+Y
+y
+ya
+yaba
+yabber
+yabbi
+yabble
+yabby
+yabu
+yacal
+yacca
+yachan
+yacht
+yachtdom
+yachter
+yachting
+yachtist
+yachtman
+yachtmanship
+yachtsman
+yachtsmanlike
+yachtsmanship
+yachtswoman
+yachty
+yad
+Yadava
+yade
+yaff
+yaffingale
+yaffle
+yagger
+yaghourt
+yagi
+Yagnob
+yagourundi
+Yagua
+yagua
+yaguarundi
+yaguaza
+yah
+yahan
+Yahgan
+Yahganan
+Yahoo
+yahoo
+Yahoodom
+Yahooish
+Yahooism
+Yahuna
+Yahuskin
+Yahweh
+Yahwism
+Yahwist
+Yahwistic
+yair
+yaird
+yaje
+yajeine
+yajenine
+Yajna
+Yajnavalkya
+yajnopavita
+yak
+Yaka
+Yakala
+yakalo
+yakamik
+Yakan
+yakattalo
+Yakima
+yakin
+yakka
+yakman
+Yakona
+Yakonan
+Yakut
+Yakutat
+yalb
+Yale
+yale
+Yalensian
+yali
+yalla
+yallaer
+yallow
+yam
+Yamacraw
+Yamamadi
+yamamai
+yamanai
+yamaskite
+Yamassee
+Yamato
+Yamel
+yamen
+Yameo
+yamilke
+yammadji
+yammer
+yamp
+yampa
+yamph
+yamshik
+yamstchik
+yan
+Yana
+Yanan
+yancopin
+yander
+yang
+yangtao
+yank
+Yankee
+Yankeedom
+Yankeefy
+Yankeeism
+Yankeeist
+Yankeeize
+Yankeeland
+Yankeeness
+yanking
+Yankton
+Yanktonai
+yanky
+Yannigan
+Yao
+yaoort
+yaourti
+yap
+yapa
+yaply
+Yapman
+yapness
+yapok
+yapp
+yapped
+yapper
+yappiness
+yapping
+yappingly
+yappish
+yappy
+yapster
+Yaqui
+Yaquina
+yar
+yarak
+yaray
+yarb
+Yarborough
+yard
+yardage
+yardang
+yardarm
+yarder
+yardful
+yarding
+yardkeep
+yardland
+yardman
+yardmaster
+yardsman
+yardstick
+yardwand
+yare
+yareta
+yark
+Yarkand
+yarke
+yarl
+yarly
+yarm
+yarn
+yarnen
+yarner
+yarnwindle
+yarpha
+yarr
+yarraman
+yarran
+yarringle
+yarrow
+yarth
+yarthen
+Yaru
+Yarura
+Yaruran
+Yaruro
+yarwhelp
+yarwhip
+yas
+yashiro
+yashmak
+Yasht
+Yasna
+yat
+yataghan
+yatalite
+yate
+yati
+Yatigan
+yatter
+Yatvyag
+Yauapery
+yaud
+yauld
+yaupon
+yautia
+yava
+Yavapai
+yaw
+yawl
+yawler
+yawlsman
+yawmeter
+yawn
+yawner
+yawney
+yawnful
+yawnfully
+yawnily
+yawniness
+yawning
+yawningly
+yawnproof
+yawnups
+yawny
+yawp
+yawper
+yawroot
+yaws
+yawweed
+yawy
+yaxche
+yaya
+Yazdegerdian
+Yazoo
+ycie
+yday
+ye
+yea
+yeah
+yealing
+yean
+yeanling
+year
+yeara
+yearbird
+yearbook
+yeard
+yearday
+yearful
+yearling
+yearlong
+yearly
+yearn
+yearnful
+yearnfully
+yearnfulness
+yearning
+yearnling
+yearock
+yearth
+yeast
+yeastily
+yeastiness
+yeasting
+yeastlike
+yeasty
+yeat
+yeather
+yed
+yede
+yee
+yeel
+yeelaman
+yees
+yegg
+yeggman
+yeguita
+yeld
+yeldrin
+yeldrock
+yelk
+yell
+yeller
+yelling
+yelloch
+yellow
+yellowammer
+yellowback
+yellowbelly
+yellowberry
+yellowbill
+yellowbird
+yellowcrown
+yellowcup
+yellowfin
+yellowfish
+yellowhammer
+yellowhead
+yellowing
+yellowish
+yellowishness
+Yellowknife
+yellowlegs
+yellowly
+yellowness
+yellowroot
+yellowrump
+yellows
+yellowseed
+yellowshank
+yellowshanks
+yellowshins
+yellowtail
+yellowthorn
+yellowthroat
+yellowtop
+yellowware
+yellowweed
+yellowwood
+yellowwort
+yellowy
+yelm
+yelmer
+yelp
+yelper
+yelt
+Yemen
+Yemeni
+Yemenic
+Yemenite
+yen
+yender
+Yengee
+Yengeese
+yeni
+Yenisei
+Yeniseian
+yenite
+yentnite
+yeo
+yeoman
+yeomaness
+yeomanette
+yeomanhood
+yeomanlike
+yeomanly
+yeomanry
+yeomanwise
+yeorling
+yeowoman
+yep
+yer
+Yerava
+Yeraver
+yerb
+yerba
+yercum
+yerd
+yere
+yerga
+yerk
+yern
+yerth
+yes
+yese
+Yeshibah
+Yeshiva
+yeso
+yesso
+yest
+yester
+yesterday
+yestereve
+yestereven
+yesterevening
+yestermorn
+yestermorning
+yestern
+yesternight
+yesternoon
+yesterweek
+yesteryear
+yestreen
+yesty
+yet
+yeta
+yetapa
+yeth
+yether
+yetlin
+yeuk
+yeukieness
+yeuky
+yeven
+yew
+yex
+yez
+Yezdi
+Yezidi
+yezzy
+ygapo
+Yid
+Yiddish
+Yiddisher
+Yiddishism
+Yiddishist
+yield
+yieldable
+yieldableness
+yieldance
+yielden
+yielder
+yielding
+yieldingly
+yieldingness
+yieldy
+yigh
+Yikirgaulit
+Yildun
+yill
+yilt
+Yin
+yin
+yince
+yinst
+yip
+yird
+yirk
+yirm
+yirmilik
+yirn
+yirr
+yirth
+yis
+yite
+ym
+yn
+ynambu
+yo
+yobi
+yocco
+yochel
+yock
+yockel
+yodel
+yodeler
+yodelist
+yodh
+yoe
+yoga
+yogasana
+yogh
+yoghurt
+yogi
+yogin
+yogism
+yogist
+yogoite
+yohimbe
+yohimbi
+yohimbine
+yohimbinization
+yohimbinize
+yoi
+yoick
+yoicks
+yojan
+yojana
+Yojuane
+yok
+yoke
+yokeable
+yokeableness
+yokeage
+yokefellow
+yokel
+yokeldom
+yokeless
+yokelish
+yokelism
+yokelry
+yokemate
+yokemating
+yoker
+yokewise
+yokewood
+yoking
+Yokuts
+yoky
+yolden
+Yoldia
+yoldring
+yolk
+yolked
+yolkiness
+yolkless
+yolky
+yom
+yomer
+Yomud
+yon
+yoncopin
+yond
+yonder
+Yonkalla
+yonner
+yonside
+yont
+yook
+yoop
+yor
+yore
+yoretime
+york
+Yorker
+yorker
+Yorkish
+Yorkist
+Yorkshire
+Yorkshireism
+Yorkshireman
+Yoruba
+Yoruban
+yot
+yotacism
+yotacize
+yote
+you
+youd
+youden
+youdendrift
+youdith
+youff
+youl
+young
+youngberry
+younger
+younghearted
+youngish
+younglet
+youngling
+youngly
+youngness
+youngster
+youngun
+younker
+youp
+your
+yourn
+yours
+yoursel
+yourself
+yourselves
+youse
+youth
+youthen
+youthful
+youthfullity
+youthfully
+youthfulness
+youthhead
+youthheid
+youthhood
+youthily
+youthless
+youthlessness
+youthlike
+youthlikeness
+youthsome
+youthtide
+youthwort
+youthy
+youve
+youward
+youwards
+youze
+yoven
+yow
+yowie
+yowl
+yowler
+yowley
+yowlring
+yowt
+yox
+yoy
+yperite
+Yponomeuta
+Yponomeutid
+Yponomeutidae
+ypsiliform
+ypsiloid
+Ypurinan
+Yquem
+yr
+ytterbia
+ytterbic
+ytterbium
+yttria
+yttrialite
+yttric
+yttriferous
+yttrious
+yttrium
+yttrocerite
+yttrocolumbite
+yttrocrasite
+yttrofluorite
+yttrogummite
+yttrotantalite
+Yuan
+yuan
+Yuapin
+yuca
+Yucatec
+Yucatecan
+Yucateco
+Yucca
+yucca
+Yuchi
+yuck
+yuckel
+yucker
+yuckle
+yucky
+Yuechi
+yuft
+Yuga
+yugada
+Yugoslav
+Yugoslavian
+Yugoslavic
+yuh
+Yuit
+Yukaghir
+Yuki
+Yukian
+yukkel
+yulan
+yule
+yuleblock
+yuletide
+Yuma
+Yuman
+yummy
+Yun
+Yunca
+Yuncan
+yungan
+Yunnanese
+Yurak
+Yurok
+yurt
+yurta
+Yurucare
+Yurucarean
+Yurucari
+Yurujure
+Yuruk
+Yuruna
+Yurupary
+yus
+yusdrum
+Yustaga
+yutu
+yuzlik
+yuzluk
+Yvonne
+Z
+z
+za
+Zabaean
+zabaglione
+Zabaism
+Zaberma
+zabeta
+Zabian
+Zabism
+zabra
+zabti
+zabtie
+zac
+zacate
+Zacatec
+Zacateco
+zacaton
+Zach
+Zachariah
+zachun
+zad
+Zadokite
+zadruga
+zaffar
+zaffer
+zafree
+zag
+zagged
+Zaglossus
+zaibatsu
+zain
+Zaitha
+zak
+zakkeu
+Zaklohpakap
+zalambdodont
+Zalambdodonta
+Zalophus
+zaman
+zamang
+zamarra
+zamarro
+Zambal
+Zambezian
+zambo
+zamboorak
+Zamenis
+Zamia
+Zamiaceae
+Zamicrus
+zamindar
+zamindari
+zamorin
+zamouse
+Zan
+Zanclidae
+Zanclodon
+Zanclodontidae
+Zande
+zander
+zandmole
+zanella
+Zaniah
+Zannichellia
+Zannichelliaceae
+Zanonia
+zant
+zante
+Zantedeschia
+zantewood
+Zanthorrhiza
+Zanthoxylaceae
+Zanthoxylum
+zanthoxylum
+Zantiot
+zantiote
+zany
+zanyish
+zanyism
+zanyship
+Zanzalian
+zanze
+Zanzibari
+Zapara
+Zaparan
+Zaparo
+Zaparoan
+zapas
+zapatero
+zaphara
+Zaphetic
+zaphrentid
+Zaphrentidae
+Zaphrentis
+zaphrentoid
+Zapodidae
+Zapodinae
+Zaporogian
+Zaporogue
+zapota
+Zapotec
+Zapotecan
+Zapoteco
+zaptiah
+zaptieh
+Zaptoeca
+zapupe
+Zapus
+zaqqum
+Zaque
+zar
+zarabanda
+Zaramo
+Zarathustrian
+Zarathustrianism
+Zarathustrism
+zaratite
+Zardushti
+zareba
+Zarema
+zarf
+zarnich
+zarp
+zarzuela
+zat
+zati
+zattare
+Zaurak
+Zauschneria
+Zavijava
+zax
+zayat
+zayin
+Zea
+zeal
+Zealander
+zealful
+zealless
+zeallessness
+zealot
+zealotic
+zealotical
+zealotism
+zealotist
+zealotry
+zealous
+zealously
+zealousness
+zealousy
+zealproof
+zebra
+zebraic
+zebralike
+zebrass
+zebrawood
+Zebrina
+zebrine
+zebrinny
+zebroid
+zebrula
+zebrule
+zebu
+zebub
+Zebulunite
+zeburro
+zecchini
+zecchino
+zechin
+Zechstein
+zed
+zedoary
+zee
+zeed
+Zeelander
+Zeguha
+zehner
+Zeidae
+zein
+zeism
+zeist
+Zeke
+zel
+Zelanian
+zelator
+zelatrice
+zelatrix
+Zelkova
+Zeltinger
+zemeism
+zemi
+zemimdari
+zemindar
+zemmi
+zemni
+zemstroist
+zemstvo
+Zen
+Zenaga
+Zenaida
+Zenaidinae
+Zenaidura
+zenana
+Zend
+Zendic
+zendician
+zendik
+zendikite
+Zenelophon
+zenick
+zenith
+zenithal
+zenithward
+zenithwards
+Zenobia
+zenocentric
+zenographic
+zenographical
+zenography
+Zenonian
+Zenonic
+zenu
+Zeoidei
+zeolite
+zeolitic
+zeolitization
+zeolitize
+zeoscope
+Zep
+zepharovichite
+zephyr
+Zephyranthes
+zephyrean
+zephyrless
+zephyrlike
+zephyrous
+zephyrus
+zephyry
+Zeppelin
+zeppelin
+zequin
+zer
+zerda
+Zerma
+zermahbub
+zero
+zeroaxial
+zeroize
+zerumbet
+zest
+zestful
+zestfully
+zestfulness
+zesty
+zeta
+zetacism
+zetetic
+Zeuctocoelomata
+zeuctocoelomatic
+zeuctocoelomic
+Zeuglodon
+zeuglodon
+zeuglodont
+Zeuglodonta
+Zeuglodontia
+Zeuglodontidae
+zeuglodontoid
+zeugma
+zeugmatic
+zeugmatically
+Zeugobranchia
+Zeugobranchiata
+zeunerite
+Zeus
+Zeuxian
+Zeuzera
+zeuzerian
+Zeuzeridae
+Zhmud
+ziamet
+ziara
+ziarat
+zibeline
+zibet
+zibethone
+zibetone
+zibetum
+ziega
+zieger
+zietrisikite
+ziffs
+zig
+ziganka
+ziggurat
+zigzag
+zigzagged
+zigzaggedly
+zigzaggedness
+zigzagger
+zigzaggery
+zigzaggy
+zigzagwise
+zihar
+zikurat
+Zilla
+zillah
+zimarra
+zimb
+zimbabwe
+zimbalon
+zimbaloon
+zimbi
+zimentwater
+zimme
+Zimmerwaldian
+Zimmerwaldist
+zimmi
+zimmis
+zimocca
+zinc
+Zincalo
+zincate
+zincic
+zincide
+zinciferous
+zincification
+zincify
+zincing
+zincite
+zincize
+zincke
+zincky
+zinco
+zincograph
+zincographer
+zincographic
+zincographical
+zincography
+zincotype
+zincous
+zincum
+zincuret
+zinfandel
+zing
+zingaresca
+zingel
+zingerone
+Zingiber
+Zingiberaceae
+zingiberaceous
+zingiberene
+zingiberol
+zingiberone
+zink
+zinkenite
+Zinnia
+zinnwaldite
+zinsang
+zinyamunga
+Zinzar
+Zinziberaceae
+zinziberaceous
+Zion
+Zionism
+Zionist
+Zionistic
+Zionite
+Zionless
+Zionward
+zip
+Zipa
+ziphian
+Ziphiidae
+Ziphiinae
+ziphioid
+Ziphius
+Zipper
+zipper
+zipping
+zippingly
+zippy
+Zips
+zira
+zirai
+Zirak
+Zirbanit
+zircite
+zircofluoride
+zircon
+zirconate
+zirconia
+zirconian
+zirconic
+zirconiferous
+zirconifluoride
+zirconium
+zirconofluoride
+zirconoid
+zirconyl
+Zirian
+Zirianian
+zirkelite
+zither
+zitherist
+Zizania
+Zizia
+Zizyphus
+zizz
+zloty
+Zmudz
+zo
+Zoa
+zoa
+zoacum
+Zoanthacea
+zoanthacean
+Zoantharia
+zoantharian
+zoanthid
+Zoanthidae
+Zoanthidea
+zoanthodeme
+zoanthodemic
+zoanthoid
+zoanthropy
+Zoanthus
+Zoarces
+zoarcidae
+zoaria
+zoarial
+Zoarite
+zoarium
+zobo
+zobtenite
+zocco
+zoccolo
+zodiac
+zodiacal
+zodiophilous
+zoea
+zoeaform
+zoeal
+zoeform
+zoehemera
+zoehemerae
+zoetic
+zoetrope
+zoetropic
+zogan
+zogo
+Zohak
+Zoharist
+Zoharite
+zoiatria
+zoiatrics
+zoic
+zoid
+zoidiophilous
+zoidogamous
+Zoilean
+Zoilism
+Zoilist
+zoisite
+zoisitization
+zoism
+zoist
+zoistic
+zokor
+Zolaesque
+Zolaism
+Zolaist
+Zolaistic
+Zolaize
+zoll
+zolle
+Zollernia
+zollpfund
+zolotink
+zolotnik
+zombi
+zombie
+zombiism
+zomotherapeutic
+zomotherapy
+zonal
+zonality
+zonally
+zonar
+Zonaria
+zonary
+zonate
+zonated
+zonation
+zone
+zoned
+zoneless
+zonelet
+zonelike
+zonesthesia
+Zongora
+zonic
+zoniferous
+zoning
+zonite
+Zonites
+zonitid
+Zonitidae
+Zonitoides
+zonochlorite
+zonociliate
+zonoid
+zonolimnetic
+zonoplacental
+Zonoplacentalia
+zonoskeleton
+Zonotrichia
+Zonta
+Zontian
+zonular
+zonule
+zonulet
+zonure
+zonurid
+Zonuridae
+zonuroid
+Zonurus
+zoo
+zoobenthos
+zooblast
+zoocarp
+zoocecidium
+zoochemical
+zoochemistry
+zoochemy
+Zoochlorella
+zoochore
+zoocoenocyte
+zoocultural
+zooculture
+zoocurrent
+zoocyst
+zoocystic
+zoocytial
+zoocytium
+zoodendria
+zoodendrium
+zoodynamic
+zoodynamics
+zooecia
+zooecial
+zooecium
+zooerastia
+zooerythrin
+zoofulvin
+zoogamete
+zoogamous
+zoogamy
+zoogene
+zoogenesis
+zoogenic
+zoogenous
+zoogeny
+zoogeographer
+zoogeographic
+zoogeographical
+zoogeographically
+zoogeography
+zoogeological
+zoogeologist
+zoogeology
+zoogloea
+zoogloeal
+zoogloeic
+zoogonic
+zoogonidium
+zoogonous
+zoogony
+zoograft
+zoografting
+zoographer
+zoographic
+zoographical
+zoographically
+zoographist
+zoography
+zooid
+zooidal
+zooidiophilous
+zooks
+zoolater
+zoolatria
+zoolatrous
+zoolatry
+zoolite
+zoolith
+zoolithic
+zoolitic
+zoologer
+zoologic
+zoological
+zoologically
+zoologicoarchaeologist
+zoologicobotanical
+zoologist
+zoologize
+zoology
+zoom
+zoomagnetic
+zoomagnetism
+zoomancy
+zoomania
+zoomantic
+zoomantist
+Zoomastigina
+Zoomastigoda
+zoomechanical
+zoomechanics
+zoomelanin
+zoometric
+zoometry
+zoomimetic
+zoomimic
+zoomorph
+zoomorphic
+zoomorphism
+zoomorphize
+zoomorphy
+zoon
+zoonal
+zoonerythrin
+zoonic
+zoonist
+zoonite
+zoonitic
+zoonomia
+zoonomic
+zoonomical
+zoonomist
+zoonomy
+zoonosis
+zoonosologist
+zoonosology
+zoonotic
+zoons
+zoonule
+zoopaleontology
+zoopantheon
+zooparasite
+zooparasitic
+zoopathological
+zoopathologist
+zoopathology
+zoopathy
+zooperal
+zooperist
+zoopery
+Zoophaga
+zoophagan
+Zoophagineae
+zoophagous
+zoopharmacological
+zoopharmacy
+zoophile
+zoophilia
+zoophilic
+zoophilism
+zoophilist
+zoophilite
+zoophilitic
+zoophilous
+zoophily
+zoophobia
+zoophobous
+zoophoric
+zoophorus
+zoophysical
+zoophysics
+zoophysiology
+Zoophyta
+zoophytal
+zoophyte
+zoophytic
+zoophytical
+zoophytish
+zoophytography
+zoophytoid
+zoophytological
+zoophytologist
+zoophytology
+zooplankton
+zooplanktonic
+zooplastic
+zooplasty
+zoopraxiscope
+zoopsia
+zoopsychological
+zoopsychologist
+zoopsychology
+zooscopic
+zooscopy
+zoosis
+zoosmosis
+zoosperm
+zoospermatic
+zoospermia
+zoospermium
+zoosphere
+zoosporange
+zoosporangia
+zoosporangial
+zoosporangiophore
+zoosporangium
+zoospore
+zoosporic
+zoosporiferous
+zoosporocyst
+zoosporous
+zootaxy
+zootechnic
+zootechnics
+zootechny
+zooter
+zoothecia
+zoothecial
+zoothecium
+zootheism
+zootheist
+zootheistic
+zootherapy
+zoothome
+zootic
+Zootoca
+zootomic
+zootomical
+zootomically
+zootomist
+zootomy
+zoototemism
+zootoxin
+zootrophic
+zootrophy
+zootype
+zootypic
+zooxanthella
+zooxanthellae
+zooxanthin
+zoozoo
+zopilote
+Zoque
+Zoquean
+Zoraptera
+zorgite
+zoril
+zorilla
+Zorillinae
+zorillo
+Zoroastrian
+Zoroastrianism
+Zoroastrism
+Zorotypus
+zorrillo
+zorro
+Zosma
+zoster
+Zostera
+Zosteraceae
+zosteriform
+Zosteropinae
+Zosterops
+Zouave
+zounds
+zowie
+Zoysia
+Zubeneschamali
+zuccarino
+zucchetto
+zucchini
+zudda
+zugtierlast
+zugtierlaster
+zuisin
+Zuleika
+Zulhijjah
+Zulinde
+Zulkadah
+Zulu
+Zuludom
+Zuluize
+zumatic
+zumbooruk
+Zuni
+Zunian
+zunyite
+zupanate
+Zutugil
+zuurveldt
+zuza
+zwanziger
+Zwieback
+zwieback
+Zwinglian
+Zwinglianism
+Zwinglianist
+zwitter
+zwitterion
+zwitterionic
+zyga
+zygadenine
+Zygadenus
+Zygaena
+zygaenid
+Zygaenidae
+zygal
+zygantra
+zygantrum
+zygapophyseal
+zygapophysis
+zygion
+zygite
+Zygnema
+Zygnemaceae
+Zygnemales
+Zygnemataceae
+zygnemataceous
+Zygnematales
+zygobranch
+Zygobranchia
+Zygobranchiata
+zygobranchiate
+Zygocactus
+zygodactyl
+Zygodactylae
+Zygodactyli
+zygodactylic
+zygodactylism
+zygodactylous
+zygodont
+zygolabialis
+zygoma
+zygomata
+zygomatic
+zygomaticoauricular
+zygomaticoauricularis
+zygomaticofacial
+zygomaticofrontal
+zygomaticomaxillary
+zygomaticoorbital
+zygomaticosphenoid
+zygomaticotemporal
+zygomaticum
+zygomaticus
+zygomaxillare
+zygomaxillary
+zygomorphic
+zygomorphism
+zygomorphous
+zygomycete
+Zygomycetes
+zygomycetous
+zygon
+zygoneure
+zygophore
+zygophoric
+Zygophyceae
+zygophyceous
+Zygophyllaceae
+zygophyllaceous
+Zygophyllum
+zygophyte
+zygopleural
+Zygoptera
+Zygopteraceae
+zygopteran
+zygopterid
+Zygopterides
+Zygopteris
+zygopteron
+zygopterous
+Zygosaccharomyces
+zygose
+zygosis
+zygosperm
+zygosphenal
+zygosphene
+zygosphere
+zygosporange
+zygosporangium
+zygospore
+zygosporic
+zygosporophore
+zygostyle
+zygotactic
+zygotaxis
+zygote
+zygotene
+zygotic
+zygotoblast
+zygotoid
+zygotomere
+zygous
+zygozoospore
+zymase
+zyme
+zymic
+zymin
+zymite
+zymogen
+zymogene
+zymogenesis
+zymogenic
+zymogenous
+zymoid
+zymologic
+zymological
+zymologist
+zymology
+zymolyis
+zymolysis
+zymolytic
+zymome
+zymometer
+zymomin
+zymophore
+zymophoric
+zymophosphate
+zymophyte
+zymoplastic
+zymoscope
+zymosimeter
+zymosis
+zymosterol
+zymosthenic
+zymotechnic
+zymotechnical
+zymotechnics
+zymotechny
+zymotic
+zymotically
+zymotize
+zymotoxic
+zymurgy
+Zyrenian
+Zyrian
+Zyryan
+zythem
+Zythia
+zythum
+Zyzomys
+Zyzzogeton
diff --git a/vespalib/src/tests/host_name/.gitignore b/vespalib/src/tests/host_name/.gitignore
new file mode 100644
index 00000000000..2a99fbea5e9
--- /dev/null
+++ b/vespalib/src/tests/host_name/.gitignore
@@ -0,0 +1 @@
+vespalib_host_name_test_app
diff --git a/vespalib/src/tests/host_name/CMakeLists.txt b/vespalib/src/tests/host_name/CMakeLists.txt
new file mode 100644
index 00000000000..79c2657b839
--- /dev/null
+++ b/vespalib/src/tests/host_name/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_host_name_test_app
+ SOURCES
+ host_name_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_host_name_test_app COMMAND vespalib_host_name_test_app)
diff --git a/vespalib/src/tests/host_name/FILES b/vespalib/src/tests/host_name/FILES
new file mode 100644
index 00000000000..c50f9ecf0be
--- /dev/null
+++ b/vespalib/src/tests/host_name/FILES
@@ -0,0 +1 @@
+host_name_test.cpp
diff --git a/vespalib/src/tests/host_name/host_name_test.cpp b/vespalib/src/tests/host_name/host_name_test.cpp
new file mode 100644
index 00000000000..7e1a92c17a7
--- /dev/null
+++ b/vespalib/src/tests/host_name/host_name_test.cpp
@@ -0,0 +1,18 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/host_name.h>
+#include <vespa/vespalib/util/slaveproc.h>
+
+using namespace vespalib;
+
+vespalib::string run_cmd(const vespalib::string &cmd) {
+ std::string out;
+ ASSERT_TRUE(SlaveProc::run(cmd.c_str(), out));
+ return out;
+}
+
+TEST("require that host name can be obtained") {
+ EXPECT_EQUAL(run_cmd("hostname"), HostName::get());
+}
+
+TEST_MAIN_WITH_PROCESS_PROXY() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/io/fileutil/.gitignore b/vespalib/src/tests/io/fileutil/.gitignore
new file mode 100644
index 00000000000..5c3f8a57921
--- /dev/null
+++ b/vespalib/src/tests/io/fileutil/.gitignore
@@ -0,0 +1,9 @@
+.depend
+Makefile
+fileutil_test
+mydir
+myfile
+myotherdir
+targetfile
+/linkeddir
+vespalib_fileutil_test_app
diff --git a/vespalib/src/tests/io/fileutil/CMakeLists.txt b/vespalib/src/tests/io/fileutil/CMakeLists.txt
new file mode 100644
index 00000000000..2b6af2f2dce
--- /dev/null
+++ b/vespalib/src/tests/io/fileutil/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_fileutil_test_app
+ SOURCES
+ fileutiltest.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_fileutil_test_app COMMAND vespalib_fileutil_test_app)
diff --git a/vespalib/src/tests/io/fileutil/DESC b/vespalib/src/tests/io/fileutil/DESC
new file mode 100644
index 00000000000..b3a05049161
--- /dev/null
+++ b/vespalib/src/tests/io/fileutil/DESC
@@ -0,0 +1 @@
+File utilities test
diff --git a/vespalib/src/tests/io/fileutil/FILES b/vespalib/src/tests/io/fileutil/FILES
new file mode 100644
index 00000000000..99d2eae90c6
--- /dev/null
+++ b/vespalib/src/tests/io/fileutil/FILES
@@ -0,0 +1 @@
+fileutiltest.cpp
diff --git a/vespalib/src/tests/io/fileutil/fileutiltest.cpp b/vespalib/src/tests/io/fileutil/fileutiltest.cpp
new file mode 100644
index 00000000000..4dbb8e0756d
--- /dev/null
+++ b/vespalib/src/tests/io/fileutil/fileutiltest.cpp
@@ -0,0 +1,686 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("fileutil_test");
+#include <vespa/vespalib/io/fileutil.h>
+#include <vespa/vespalib/testkit/testapp.h>
+#include <iostream>
+#include <vector>
+
+namespace vespalib {
+
+class Test : public vespalib::TestApp
+{
+public:
+ void testOpen();
+ void testIsOpen();
+ void testStat();
+ void testResize();
+ void testDirFunctions();
+ void testUnlink();
+ void testRename();
+ void testCopy();
+ void testCopyConstructorAndAssignmentOperator();
+ void testLazyFile();
+ void testSymlink();
+ void testReadAll();
+ int Main();
+};
+
+int
+Test::Main()
+{
+ TEST_INIT("fileutil_test");
+ srandom(1);
+ std::cerr << "testOpen\n";
+ testOpen();
+ std::cerr << "testIsOpen\n";
+ testIsOpen();
+ std::cerr << "testStat\n";
+ testStat();
+ std::cerr << "testResize\n";
+ testResize();
+ std::cerr << "testDirFunctions\n";
+ testDirFunctions();
+ std::cerr << "testUnlink\n";
+ testUnlink();
+ std::cerr << "testRename\n";
+ testRename();
+ std::cerr << "testCopy\n";
+ testCopy();
+ std::cerr << "testCopyConstructorAndAssignmentOperator\n";
+ testCopyConstructorAndAssignmentOperator();
+ std::cerr << "testLazyFile\n";
+ testLazyFile();
+ std::cerr << "testSymlink\n";
+ testSymlink();
+ std::cerr << "testReadAll\n";
+ testReadAll();
+ TEST_DONE();
+}
+
+void
+Test::testOpen()
+{
+ // Opening non-existing file for reading should fail.
+ try{
+ unlink("myfile"); // Just in case
+ File f("myfile");
+ f.open(File::READONLY);
+ TEST_FATAL("Opening non-existing file for reading should fail.");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::NOT_FOUND, e.getType());
+ }
+ // Opening non-existing file for writing without CREATE flag fails
+ try{
+ File f("myfile");
+ f.open(0);
+ TEST_FATAL("Opening non-existing file without CREATE flag should fail.");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::NOT_FOUND, e.getType());
+ }
+ // Opening file in non-existing subdir should fail.
+ try{
+ rmdir("mydir", true); // Just in case
+ File f("mydir/myfile");
+ f.open(File::CREATE);
+ TEST_FATAL("Opening non-existing file for reading should fail.");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::NOT_FOUND, e.getType());
+ }
+ // Opening file for reading in non-existing subdir should not create
+ // subdir.
+ try{
+ File f("mydir/myfile");
+ f.open(File::READONLY, true);
+ TEST_FATAL("Read only parameter doesn't work with auto-generate");
+ } catch (IllegalArgumentException& e) {
+ }
+ // Opening file in non-existing subdir without auto-generating
+ // directories should not work.
+ try{
+ File f("mydir/myfile");
+ f.open(File::CREATE, false);
+ TEST_FATAL("Need to autogenerate directories for this to work");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::NOT_FOUND, e.getType());
+ ASSERT_TRUE(!fileExists("mydir"));
+ }
+ // Opening file in non-existing subdir works with auto-generate
+ {
+ File f("mydir/myfile");
+ f.open(File::CREATE, true);
+ ASSERT_TRUE(fileExists("mydir/myfile"));
+ f.unlink();
+ }
+ // Opening file in existing subdir works with auto-generate
+ {
+ File f("mydir/myfile");
+ f.open(File::CREATE, false);
+ ASSERT_TRUE(fileExists("mydir/myfile"));
+ f.unlink();
+ }
+ // Opening with direct IO support works.
+ {
+ File f("mydir/myfile");
+ f.open(File::CREATE | File::DIRECTIO, false);
+ ASSERT_TRUE(fileExists("mydir/myfile"));
+ if (!f.isOpenWithDirectIO()) {
+ std::cerr << "This platform does not support direct IO\n";
+ }
+ }
+ // Opening plain file works
+ {
+ File f("myfile");
+ f.open(File::CREATE, false);
+ ASSERT_TRUE(fileExists("myfile"));
+ }
+ // Opening directory does not work.
+ try{
+ File f("mydir");
+ f.open(File::CREATE, false);
+ TEST_FATAL("Can't open directory for reading");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::ILLEGAL_PATH, e.getType());
+ }
+ // Test opening already open file
+ {
+ std::unique_ptr<File> f(new File("myfile"));
+ f->open(File::CREATE, false);
+ f->closeFileWhenDestructed(false);
+ File f2(f->getFileDescriptor(), "myfile");
+ f.reset();
+ ASSERT_TRUE(f2.isOpen());
+ f2.write(" ", 1, 0);
+ }
+ // Test reopening file in same object
+ {
+ File f("myfile");
+ f.open(File::CREATE, false);
+ f.write("a", 1, 0);
+ f.close();
+ f.open(File::CREATE, false);
+ std::vector<char> vec(10);
+ size_t read = f.read(&vec[0], 10, 0);
+ EXPECT_EQUAL(1u, read);
+ EXPECT_EQUAL('a', vec[0]);
+ f.write("b", 1, 0);
+ }
+}
+
+void
+Test::testIsOpen()
+{
+ File f("myfile");
+ ASSERT_TRUE(!f.isOpen());
+ f.open(File::CREATE, false);
+ ASSERT_TRUE(f.isOpen());
+ f.close();
+ ASSERT_TRUE(!f.isOpen());
+}
+
+void
+Test::testStat()
+{
+ unlink("myfile");
+ rmdir("mydir", true);
+ EXPECT_EQUAL(false, fileExists("myfile"));
+ EXPECT_EQUAL(false, fileExists("mydir"));
+ mkdir("mydir");
+ FileInfo::UP info = stat("myfile");
+ ASSERT_TRUE(info.get() == 0);
+ File f("myfile");
+ f.open(File::CREATE, false);
+ f.write("foobar", 6, 0);
+
+ info = stat("myfile");
+ ASSERT_TRUE(info.get() != 0);
+ FileInfo info2 = f.stat();
+ EXPECT_EQUAL(*info, info2);
+ EXPECT_EQUAL(6, info->_size);
+ EXPECT_EQUAL(true, info->_plainfile);
+ EXPECT_EQUAL(false, info->_directory);
+
+ EXPECT_EQUAL(6, f.getFileSize());
+ f.close();
+ EXPECT_EQUAL(6, getFileSize("myfile"));
+
+ EXPECT_EQUAL(true, isDirectory("mydir"));
+ EXPECT_EQUAL(false, isDirectory("myfile"));
+ EXPECT_EQUAL(false, isPlainFile("mydir"));
+ EXPECT_EQUAL(true, isPlainFile("myfile"));
+ EXPECT_EQUAL(true, fileExists("myfile"));
+ EXPECT_EQUAL(true, fileExists("mydir"));
+}
+
+void
+Test::testResize()
+{
+ unlink("myfile");
+ File f("myfile");
+ f.open(File::CREATE, false);
+ f.write("foobar", 6, 0);
+ EXPECT_EQUAL(6, f.getFileSize());
+ f.resize(10);
+ EXPECT_EQUAL(10, f.getFileSize());
+ std::vector<char> vec(20, ' ');
+ size_t read = f.read(&vec[0], 20, 0);
+ EXPECT_EQUAL(10u, read);
+ EXPECT_EQUAL(std::string("foobar"), std::string(&vec[0], 6));
+ f.resize(3);
+ EXPECT_EQUAL(3, f.getFileSize());
+ read = f.read(&vec[0], 20, 0);
+ EXPECT_EQUAL(3u, read);
+ EXPECT_EQUAL(std::string("foo"), std::string(&vec[0], 3));
+}
+
+void
+Test::testDirFunctions()
+{
+ rmdir("mydir", true);
+ ASSERT_TRUE(!fileExists("mydir"));
+ // Cannot create recursive without recursive option
+ try{
+ mkdir("mydir/otherdir", false);
+ TEST_FATAL("Should not work without recursive option set");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::NOT_FOUND, e.getType());
+ }
+ // Works with recursive option
+ {
+ ASSERT_TRUE(mkdir("mydir/otherdir"));
+ ASSERT_TRUE(!mkdir("mydir/otherdir"));
+ // Test chdir / getCurrentDirectory
+ chdir("mydir");
+ std::string currDir = getCurrentDirectory();
+ std::string::size_type pos = currDir.rfind('/');
+ ASSERT_TRUE(pos != std::string::npos);
+ EXPECT_EQUAL("mydir", currDir.substr(pos + 1));
+ EXPECT_EQUAL('/', currDir[0]);
+ chdir("..");
+ currDir = getCurrentDirectory();
+ pos = currDir.rfind('/');
+ EXPECT_EQUAL("fileutil", currDir.substr(pos + 1));
+ }
+ // rmdir fails with content
+ try{
+ ASSERT_TRUE(mkdir("mydir/otherdir/evenmorestuff"));
+ rmdir("mydir");
+ TEST_FATAL("Should not work without recursive option set");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::DIRECTORY_HAVE_CONTENT, e.getType());
+ }
+ // Works with recursive option
+ {
+ ASSERT_TRUE(rmdir("mydir", true));
+ ASSERT_TRUE(!fileExists("mydir"));
+ ASSERT_TRUE(!rmdir("mydir", true));
+ }
+ // Doesn't work on file
+ try{
+ {
+ File f("myfile");
+ f.open(File::CREATE);
+ f.write("foo", 3, 0);
+ }
+ rmdir("myfile");
+ TEST_FATAL("Should have failed to run rmdir on file.");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::ILLEGAL_PATH, e.getType());
+ }
+
+ // mkdir works when a path component is a symlink which points to
+ // another directory and the final path component does not exist.
+ {
+ rmdir("mydir", true);
+ rmdir("otherdir", true);
+ unlink("linkeddir"); // symlink if exists
+ mkdir("otherdir/stuff");
+ symlink("otherdir", "linkeddir");
+ // Should now be able to resolve through symlink and create dir
+ // at the appropriate (linked) location.
+ ASSERT_TRUE(mkdir("linkeddir/stuff/fluff"));
+ }
+
+ // mkdir works when the final path component is a symlink which points
+ // to another directory (causing OS mkdir to fail since something already
+ // exists at the location).
+ {
+ rmdir("mydir", true);
+ rmdir("otherdir", true);
+ unlink("linkeddir"); // symlink if exists
+ mkdir("otherdir/stuff");
+ symlink("otherdir", "linkeddir");
+ // Should now be able to resolve through symlink and create dir
+ // at the appropriate (linked) location.
+ ASSERT_FALSE(mkdir("linkeddir"));
+ }
+}
+
+void
+Test::testUnlink()
+{
+ // Fails on directory
+ try{
+ mkdir("mydir");
+ unlink("mydir");
+ TEST_FATAL("Should work on directories.");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::ILLEGAL_PATH, e.getType());
+ }
+ // Works for file
+ {
+ {
+ File f("myfile");
+ f.open(File::CREATE);
+ f.write("foo", 3, 0);
+ }
+ ASSERT_TRUE(fileExists("myfile"));
+ ASSERT_TRUE(unlink("myfile"));
+ ASSERT_TRUE(!fileExists("myfile"));
+ ASSERT_TRUE(!unlink("myfile"));
+ }
+}
+
+void
+Test::testRename()
+{
+ rmdir("mydir", true);
+ File f("myfile");
+ f.open(File::CREATE | File::TRUNC);
+ f.write("Hello World!\n", 13, 0);
+ f.close();
+ // Renaming to non-existing dir doesn't work
+ try{
+ rename("myfile", "mydir/otherfile");
+ TEST_FATAL("This shouldn't work when mydir doesn't exist");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::NOT_FOUND, e.getType());
+ }
+ // Renaming to non-existing dir works if autocreating dirs
+ {
+ ASSERT_TRUE(rename("myfile", "mydir/otherfile", true, true));
+ ASSERT_TRUE(!fileExists("myfile"));
+ ASSERT_TRUE(fileExists("mydir/otherfile"));
+
+ File f2("mydir/otherfile");
+ f2.open(File::READONLY);
+ std::vector<char> vec(20, ' ');
+ size_t read = f2.read(&vec[0], 20, 0);
+ EXPECT_EQUAL(13u, read);
+ EXPECT_EQUAL(std::string("Hello World!\n"), std::string(&vec[0], 13));
+ }
+ // Renaming non-existing returns false
+ ASSERT_TRUE(!rename("myfile", "mydir/otherfile", true));
+ // Rename to overwrite works
+ {
+ f.open(File::CREATE | File::TRUNC);
+ f.write("Bah\n", 4, 0);
+ f.close();
+ ASSERT_TRUE(rename("myfile", "mydir/otherfile", true, true));
+
+ File f2("mydir/otherfile");
+ f2.open(File::READONLY);
+ std::vector<char> vec(20, ' ');
+ size_t read = f2.read(&vec[0], 20, 0);
+ EXPECT_EQUAL(4u, read);
+ EXPECT_EQUAL(std::string("Bah\n"), std::string(&vec[0], 4));
+ }
+ // Overwriting directory fails (does not put inside dir)
+ try{
+ mkdir("mydir");
+ f.open(File::CREATE | File::TRUNC);
+ f.write("Bah\n", 4, 0);
+ f.close();
+ ASSERT_TRUE(rename("myfile", "mydir"));
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::ILLEGAL_PATH, e.getType());
+ }
+ // Moving directory works
+ {
+ ASSERT_TRUE(isDirectory("mydir"));
+ rmdir("myotherdir", true);
+ ASSERT_TRUE(rename("mydir", "myotherdir"));
+ ASSERT_TRUE(isDirectory("myotherdir"));
+ ASSERT_TRUE(!isDirectory("mydir"));
+ ASSERT_TRUE(!rename("mydir", "myotherdir"));
+ }
+ // Overwriting directory fails
+ try{
+ File f2("mydir/yetanotherfile");
+ f2.open(File::CREATE, true);
+ f2.write("foo", 3, 0);
+ f2.open(File::READONLY);
+ f2.close();
+ rename("mydir", "myotherdir");
+ TEST_FATAL("Should fail trying to overwrite directory");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_TRUE((IoException::DIRECTORY_HAVE_CONTENT == e.getType()) ||
+ (IoException::ALREADY_EXISTS == e.getType()));
+ }
+}
+
+void
+Test::testCopy()
+{
+ rmdir("mydir", true);
+ File f("myfile");
+ f.open(File::CREATE | File::TRUNC);
+
+ MallocAutoPtr buffer = getAlignedBuffer(5000);
+ memset(buffer.get(), 0, 5000);
+ strncpy(static_cast<char*>(buffer.get()), "Hello World!\n", 13);
+ f.write(buffer.get(), 4096, 0);
+ f.close();
+ std::cerr << "Simple copy\n";
+ // Simple copy works (512b dividable file)
+ copy("myfile", "targetfile");
+ ASSERT_TRUE(system("diff myfile targetfile") == 0);
+ std::cerr << "Overwriting\n";
+ // Overwriting works (may not be able to use direct IO writing on all
+ // systems, so will always use cached IO)
+ {
+ f.open(File::CREATE | File::TRUNC);
+ f.write("Bah\n", 4, 0);
+ f.close();
+
+ ASSERT_TRUE(system("diff myfile targetfile > /dev/null") != 0);
+ copy("myfile", "targetfile");
+ ASSERT_TRUE(system("diff myfile targetfile > /dev/null") == 0);
+ }
+ // Fails if target is directory
+ try{
+ mkdir("mydir");
+ copy("myfile", "mydir");
+ TEST_FATAL("Should fail trying to overwrite directory");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::ILLEGAL_PATH, e.getType());
+ }
+ // Fails if source is directory
+ try{
+ mkdir("mydir");
+ copy("mydir", "myfile");
+ TEST_FATAL("Should fail trying to copy directory");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::ILLEGAL_PATH, e.getType());
+ }
+}
+
+void
+Test::testCopyConstructorAndAssignmentOperator()
+{
+ // Copy file not opened.
+ {
+ File f("myfile");
+ File f2(f);
+ EXPECT_EQUAL(f.getFilename(), f2.getFilename());
+ }
+ // Copy file opened
+ {
+ File f("myfile");
+ f.open(File::CREATE);
+ File f2(f);
+ EXPECT_EQUAL(f.getFilename(), f2.getFilename());
+ ASSERT_TRUE(f2.isOpen());
+ ASSERT_TRUE(!f.isOpen());
+ }
+ // Assign file opened to another file opened
+ {
+ File f("myfile");
+ f.open(File::CREATE);
+ int fd = f.getFileDescriptor();
+ File f2("targetfile");
+ f2.open(File::CREATE);
+ f = f2;
+ EXPECT_EQUAL(std::string("targetfile"), f2.getFilename());
+ EXPECT_EQUAL(f.getFilename(), f2.getFilename());
+ ASSERT_TRUE(!f2.isOpen());
+ ASSERT_TRUE(f.isOpen());
+ try{
+ File f3(fd, "myfile");
+ f3.closeFileWhenDestructed(false); // Already closed
+ f3.write("foo", 3, 0);
+ TEST_FATAL("This file descriptor should have been closed");
+ } catch (IoException& e) {
+ //std::cerr << e.what() << "\n";
+ EXPECT_EQUAL(IoException::INTERNAL_FAILURE, e.getType());
+ }
+ }
+}
+
+void
+Test::testLazyFile()
+{
+ // Copy constructor
+ {
+ LazyFile file("myfile", File::CREATE, true);
+ LazyFile file2(file);
+ EXPECT_EQUAL(file.getFlags(), file2.getFlags());
+ EXPECT_EQUAL(file.autoCreateDirectories(), file2.autoCreateDirectories());
+ }
+ // Assignment
+ {
+ LazyFile file("myfile", File::CREATE, true);
+ LazyFile file2("targetfile", File::READONLY);
+ file = file2;
+ EXPECT_EQUAL(file.getFlags(), file2.getFlags());
+ EXPECT_EQUAL(file.autoCreateDirectories(), file2.autoCreateDirectories());
+ }
+ // Lazily write
+ {
+ LazyFile file("myfile", File::CREATE, true);
+ file.write("foo", 3, 0);
+ }
+ // Lazy stat
+ {
+ LazyFile file("myfile", File::CREATE, true);
+ EXPECT_EQUAL(3, file.getFileSize());
+ file.close();
+
+ LazyFile file2("myfile", File::CREATE, true);
+ FileInfo info = file2.stat();
+ EXPECT_EQUAL(3, info._size);
+ EXPECT_EQUAL(true, info._plainfile);
+ }
+
+ // Lazy read
+ {
+ LazyFile file("myfile", File::CREATE, true);
+ std::vector<char> buf(10, ' ');
+ EXPECT_EQUAL(3u, file.read(&buf[0], 10, 0));
+ EXPECT_EQUAL(std::string("foo"), std::string(&buf[0], 3));
+ }
+ // Lazy resize
+ {
+ LazyFile file("myfile", File::CREATE, true);
+ file.resize(5);
+ EXPECT_EQUAL(5, file.getFileSize());
+ }
+ // Lazy get file descriptor
+ {
+ LazyFile file("myfile", File::CREATE, true);
+ int fd = file.getFileDescriptor();
+ ASSERT_TRUE(fd != -1);
+ }
+}
+
+void
+Test::testSymlink()
+{
+ // Target exists
+ {
+ rmdir("mydir", true);
+ mkdir("mydir");
+
+ File f("mydir/myfile");
+ f.open(File::CREATE | File::TRUNC);
+ f.write("Hello World!\n", 13, 0);
+ f.close();
+
+ symlink("myfile", "mydir/linkyfile");
+ EXPECT_TRUE(fileExists("mydir/linkyfile"));
+
+ File f2("mydir/linkyfile");
+ f2.open(File::READONLY);
+ std::vector<char> vec(20, ' ');
+ size_t read = f2.read(&vec[0], 20, 0);
+ EXPECT_EQUAL(13u, read);
+ EXPECT_EQUAL(std::string("Hello World!\n"), std::string(&vec[0], 13));
+ }
+
+ // POSIX symlink() fails
+ {
+ rmdir("mydir", true);
+ mkdir("mydir/a", true);
+ mkdir("mydir/b");
+ try {
+ // Link already exists
+ symlink("a", "mydir/b");
+ TEST_FATAL("Exception not thrown on already existing link");
+ } catch (IoException& e) {
+ EXPECT_EQUAL(IoException::ALREADY_EXISTS, e.getType());
+ }
+ }
+
+ {
+ rmdir("mydir", true);
+ mkdir("mydir");
+
+ File f("mydir/myfile");
+ f.open(File::CREATE | File::TRUNC);
+ f.write("Hello World!\n", 13, 0);
+ f.close();
+ }
+
+ // readLink success
+ {
+ symlink("myfile", "mydir/linkyfile");
+ EXPECT_EQUAL("myfile", readLink("mydir/linkyfile"));
+ }
+ // readLink failure
+ {
+ try {
+ readLink("no/such/link");
+ } catch (IoException& e) {
+ EXPECT_EQUAL(IoException::NOT_FOUND, e.getType());
+ }
+ }
+}
+
+void
+Test::testReadAll()
+{
+ // Write text into a file.
+ unlink("myfile");
+ File fileForWriting("myfile");
+ fileForWriting.open(File::CREATE);
+ vespalib::string text = "This is some text. ";
+ fileForWriting.write(text.data(), text.size(), 0);
+ fileForWriting.close();
+
+ // Read contents of file, and verify it's identical.
+ File file("myfile");
+ file.open(File::READONLY);
+ vespalib::string content = file.readAll();
+ file.close();
+ ASSERT_EQUAL(content, text);
+
+ // Write lots of text into file.
+ off_t offset = 0;
+ fileForWriting.open(File::TRUNC);
+ while (offset < 10000) {
+ offset += fileForWriting.write(text.data(), text.size(), offset);
+ }
+ fileForWriting.close();
+
+ // Read it all and verify.
+ file.open(File::READONLY);
+ content = file.readAll();
+ file.close();
+ ASSERT_EQUAL(offset, static_cast<off_t>(content.size()));
+
+ vespalib::string chunk;
+ for (offset = 0; offset < 10000; offset += text.size()) {
+ chunk.assign(content.begin() + offset, text.size());
+ ASSERT_EQUAL(text, chunk);
+ }
+}
+
+} // vespalib
+
+TEST_APPHOOK(vespalib::Test)
+
diff --git a/vespalib/src/tests/left_right_heap/.gitignore b/vespalib/src/tests/left_right_heap/.gitignore
new file mode 100644
index 00000000000..eb882eefb22
--- /dev/null
+++ b/vespalib/src/tests/left_right_heap/.gitignore
@@ -0,0 +1,3 @@
+/left_right_heap_bench
+vespalib_left_right_heap_test_app
+vespalib_left_right_heap_bench_app
diff --git a/vespalib/src/tests/left_right_heap/CMakeLists.txt b/vespalib/src/tests/left_right_heap/CMakeLists.txt
new file mode 100644
index 00000000000..2681cfae637
--- /dev/null
+++ b/vespalib/src/tests/left_right_heap/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_left_right_heap_test_app
+ SOURCES
+ left_right_heap_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_left_right_heap_test_app COMMAND vespalib_left_right_heap_test_app)
+vespa_add_executable(vespalib_left_right_heap_bench_app
+ SOURCES
+ left_right_heap_bench.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_left_right_heap_bench_app COMMAND vespalib_left_right_heap_bench_app BENCHMARK)
diff --git a/vespalib/src/tests/left_right_heap/FILES b/vespalib/src/tests/left_right_heap/FILES
new file mode 100644
index 00000000000..dee371c815c
--- /dev/null
+++ b/vespalib/src/tests/left_right_heap/FILES
@@ -0,0 +1 @@
+left_right_heap_test.cpp
diff --git a/vespalib/src/tests/left_right_heap/left_right_heap_bench.cpp b/vespalib/src/tests/left_right_heap/left_right_heap_bench.cpp
new file mode 100644
index 00000000000..114786bf2eb
--- /dev/null
+++ b/vespalib/src/tests/left_right_heap/left_right_heap_bench.cpp
@@ -0,0 +1,358 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/left_right_heap.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/inline.h>
+#include <stdlib.h>
+#include <algorithm>
+#include <vector>
+#include <memory>
+
+using namespace vespalib;
+
+template <typename H> struct IsRight { enum { VALUE = 0 }; };
+template <> struct IsRight<RightHeap> { enum { VALUE = 1 }; };
+template <> struct IsRight<RightArrayHeap> { enum { VALUE = 1 }; };
+
+template <typename H> struct Name { static const char *value() { return "<unknown>"; } };
+template <> struct Name<LeftHeap> { static const char *value() { return "LeftHeap"; } };
+template <> struct Name<RightHeap> { static const char *value() { return "RightHeap"; } };
+template <> struct Name<LeftArrayHeap> { static const char *value() { return "LeftArrayHeap"; } };
+template <> struct Name<RightArrayHeap> { static const char *value() { return "RightArrayHeap"; } };
+template <> struct Name<LeftStdHeap> { static const char *value() { return "LeftStdHeap"; } };
+
+struct MyCmp {
+ const uint32_t *values;
+ MyCmp(uint32_t *v) : values(v) {}
+ bool operator()(const uint16_t &a, const uint16_t &b) const {
+ return (values[a] < values[b]);
+ }
+};
+
+struct MyInvCmp {
+ const uint32_t *values;
+ MyInvCmp(uint32_t *v) : values(v) {}
+ bool operator()(const uint16_t &a, const uint16_t &b) const {
+ return (values[b] < values[a]);
+ }
+};
+
+struct Timer {
+ double minTime;
+ FastOS_Time timer;
+ Timer() : minTime(1.0e10), timer() {}
+ void start() { timer.SetNow(); }
+ void stop() {
+ double ms = timer.MilliSecsToNow();
+ minTime = std::min(minTime, ms);
+ }
+};
+
+struct Data16 {
+ std::less<uint16_t> cmp;
+ size_t size;
+ std::vector<uint16_t> data;
+ Data16(size_t s) : cmp(), size(s), data() {}
+ static const char *name() { return "uint16_t"; }
+ void init(bool inv) {
+ data.resize(size);
+ srandom(42);
+ for (size_t i = 0; i < size; ++i) {
+ if (inv) {
+ data[size - i - 1] = random();
+ } else {
+ data[i] = random();
+ }
+ }
+ ASSERT_EQUAL(size, data.size());
+ }
+};
+
+struct Data32p {
+ MyCmp cmp;
+ size_t size;
+ std::vector<uint32_t> values;
+ std::vector<uint16_t> data;
+ Data32p(size_t s) : cmp(0), size(s), values(), data() {}
+ static const char *name() { return "uint32_t[uint16_t]"; }
+ void init(bool inv) {
+ values.resize(size);
+ data.resize(size);
+ srandom(42);
+ for (size_t i = 0; i < size; ++i) {
+ if (inv) {
+ values[size - i - 1] = random();
+ data[size - i - 1] = (size - i - 1);
+ } else {
+ values[i] = random();
+ data[i] = i;
+ }
+ }
+ ASSERT_EQUAL(size, values.size());
+ ASSERT_EQUAL(size, data.size());
+ cmp = MyCmp(&values[0]);
+ }
+};
+
+template <typename T, typename C>
+bool verifyOrder(T *begin, T *end, const C &cmp, bool inv) {
+ size_t len = (end - begin);
+ for (size_t i = 0; i < len; ++i) {
+ if ((i + 1) < len) {
+ bool failed = inv
+ ? cmp(begin[i], begin[i + 1])
+ : cmp(begin[i + 1], begin[i]);
+ if (failed) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T, typename C> void std_push_loop(T *begin, T *end, C cmp) noinline__;
+template <typename T, typename C> void std_push_loop(T *begin, T *end, C cmp) {
+ for (T *pos = begin; pos != end; ++pos) {
+ std::push_heap(begin, (pos + 1), cmp);
+ }
+}
+
+template <typename T, typename C> void std_pop_loop(T *begin, T *end, C cmp) noinline__;
+template <typename T, typename C> void std_pop_loop(T *begin, T *end, C cmp) {
+ for (T *pos = end; pos != begin; --pos) {
+ std::pop_heap(begin, pos, cmp);
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename H>
+struct Loops {
+ template <typename T, typename C> static void push(T *begin, T *end, C cmp) noinline__;
+ template <typename T, typename C> static void pop(T *begin, T *end, C cmp) noinline__;
+ template <typename T, typename C, bool ADJUST> static void fiddle(T *begin, T *end, C cmp, T *first, T *last) noinline__;
+ template <typename T, typename C> static void fiddle(T *begin, T *end, C cmp, T *first, T *last, bool adjust) {
+ if (adjust) {
+ fiddle<T,C,true>(begin, end, cmp, first, last);
+ } else {
+ fiddle<T,C,false>(begin, end, cmp, first, last);
+ }
+ }
+};
+
+template <typename H>
+template <typename T, typename C>
+void Loops<H>::push(T *begin, T *end, C cmp) {
+ if (IsRight<H>::VALUE) {
+ for (T *pos = end; pos != begin; --pos) {
+ H::template push((pos - 1), end, cmp);
+ }
+ } else {
+ for (T *pos = begin; pos != end; ++pos) {
+ H::template push(begin, (pos + 1), cmp);
+ }
+ }
+}
+
+template <typename H>
+template <typename T, typename C>
+void Loops<H>::pop(T *begin, T *end, C cmp) {
+ if (IsRight<H>::VALUE) {
+ for (T *pos = begin; pos != end; ++pos) {
+ H::template pop(pos, end, cmp);
+ }
+ } else {
+ for (T *pos = end; pos != begin; --pos) {
+ H::template pop(begin, pos, cmp);
+ }
+ }
+}
+
+template <typename H>
+template <typename T, typename C, bool ADJUST>
+void Loops<H>::fiddle(T *begin, T *end, C cmp, T *first, T *last) {
+ while (first != last) {
+ if (ADJUST) {
+ H::template front(begin, end) = *first++;
+ H::template adjust(begin, end, cmp);
+ } else {
+ H::template pop(begin, end, cmp);
+ if (IsRight<H>::VALUE) {
+ *begin = *first++;
+ } else {
+ *(end - 1) = *first++;
+ }
+ H::template push(begin, end, cmp);
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+struct Benchmark {
+ typedef std::unique_ptr<Benchmark> UP;
+ virtual ~Benchmark() {}
+ virtual std::string legend() const = 0;
+ virtual double fiddle(size_t heapSize, size_t cnt, size_t loop, bool adjust) = 0;
+ virtual std::pair<double, double> sort(size_t maxHeapSize, size_t loop) = 0;
+ virtual void runSortBench(size_t maxHeapSize, size_t loop) = 0;
+ virtual void runFiddleBench(size_t heapSize, size_t cnt, size_t loop, bool adjust) = 0;
+};
+
+template <typename H, typename D>
+struct BenchmarkHD : Benchmark {
+ virtual std::string legend() const {
+ return make_string("[%s, %s]", Name<H>::value(), D::name());
+ }
+ virtual double fiddle(size_t heapSize, size_t cnt, size_t loop, bool adjust) {
+ Timer t;
+ for (size_t i = 0; i < loop; ++i) {
+ D d(cnt * 2);
+ d.init(false);
+ ASSERT_LESS((heapSize + cnt), d.data.size());
+ Loops<H>::push(&d.data[0], &d.data[heapSize], d.cmp);
+ t.start(); Loops<H>::fiddle(&d.data[0], &d.data[heapSize], d.cmp, &d.data[cnt], &d.data[cnt * 2], adjust); t.stop();
+ }
+ return t.minTime;
+ }
+ virtual std::pair<double, double> sort(size_t maxHeapSize, size_t loop) {
+ Timer t1;
+ Timer t2;
+ for (size_t i = 0; i < loop; ++i) {
+ D d(maxHeapSize);
+ d.init(IsRight<H>::VALUE);
+ t1.start(); Loops<H>::push(&*d.data.begin(), &*d.data.end(), d.cmp); t1.stop();
+ t2.start(); Loops<H>::pop(&*d.data.begin(), &*d.data.end(), d.cmp); t2.stop();
+ EXPECT_TRUE(verifyOrder(&*d.data.begin(), &*d.data.end(), d.cmp, !IsRight<H>::VALUE));
+ }
+ return std::make_pair(t1.minTime, t2.minTime);
+ }
+ virtual void runSortBench(size_t maxHeapSize, size_t loop) {
+ std::pair<double, double> t = sort(maxHeapSize, loop);
+ fprintf(stderr, " sort bench (size=%zu): %g ms [%g ms (push) %g ms (pop)]\n",
+ maxHeapSize, (t.first + t.second), t.first, t.second);
+ }
+ virtual void runFiddleBench(size_t heapSize, size_t cnt, size_t loop, bool adjust) {
+ double t = fiddle(heapSize, cnt, loop, adjust);
+ fprintf(stderr, " fiddle bench (size=%zu, cnt=%zu, use adjust='%s'): %g ms\n",
+ heapSize, cnt, adjust? "yes":"no", t);
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+TEST_FFF("benchmark std heap with direct uint16_t values", Timer, Timer, Data16(5000)) {
+ std::greater<int> cmp;
+ for (size_t l = 0; l < 1000; ++l) {
+ f3.init(false);
+ f1.start(); std_push_loop(&*f3.data.begin(), &*f3.data.end(), cmp); f1.stop();
+ f2.start(); std_pop_loop(&*f3.data.begin(), &*f3.data.end(), cmp); f2.stop();
+ EXPECT_TRUE(verifyOrder(&*f3.data.begin(), &*f3.data.end(), cmp, false));
+ }
+ fprintf(stderr, "STD HEAP 16: %g ms [%g ms (push) %g ms (pop)]\n",
+ f1.minTime + f2.minTime, f1.minTime, f2.minTime);
+}
+
+TEST_FFF("benchmark std heap with indirect uint32_t values", Timer, Timer, Data32p(5000)) {
+ for (size_t l = 0; l < 1000; ++l) {
+ f3.init(false);
+ MyInvCmp cmp(&f3.values[0]);
+ f1.start(); std_push_loop(&*f3.data.begin(), &*f3.data.end(), cmp); f1.stop();
+ f2.start(); std_pop_loop(&*f3.data.begin(), &*f3.data.end(), cmp); f2.stop();
+ EXPECT_TRUE(verifyOrder(&*f3.data.begin(), &*f3.data.end(), cmp, false));
+ }
+ fprintf(stderr, "STD HEAP 32p: %g ms [%g ms (push) %g ms (pop)]\n",
+ f1.minTime + f2.minTime, f1.minTime, f2.minTime);
+}
+
+//-----------------------------------------------------------------------------
+
+struct BenchmarkFactory {
+ enum DataType {
+ DATA_16 = 0,
+ DATA_32p = 1,
+ DATA_CNT = 2
+ };
+ enum HeapType {
+ HEAP_LEFT = 0,
+ HEAP_RIGHT = 1,
+ HEAP_ARRAY_LEFT = 2,
+ HEAP_ARRAY_RIGHT = 3,
+ HEAP_STD_LEFT = 4,
+ HEAP_CNT = 5,
+ };
+ template <typename H>
+ static Benchmark::UP create(DataType d) {
+ switch (d) {
+ case DATA_16: return Benchmark::UP(new BenchmarkHD<H, Data16>());
+ case DATA_32p: return Benchmark::UP(new BenchmarkHD<H, Data32p>());
+ default: TEST_FATAL("undefined data type requested"); return Benchmark::UP();
+ }
+ }
+ static Benchmark::UP create(HeapType h, DataType d) {
+ switch(h) {
+ case HEAP_LEFT: return create<LeftHeap>(d);
+ case HEAP_RIGHT: return create<RightHeap>(d);
+ case HEAP_ARRAY_LEFT: return create<LeftArrayHeap>(d);
+ case HEAP_ARRAY_RIGHT: return create<RightArrayHeap>(d);
+ case HEAP_STD_LEFT: return create<LeftStdHeap>(d);
+ default: TEST_FATAL("undefined heap type requested"); return Benchmark::UP();
+ }
+ }
+};
+
+void findFiddleLimit(Benchmark &a, Benchmark &b, size_t min, size_t max, bool adjust) {
+ fprintf(stderr, "looking for the fiddle limit for %s(A) and %s(B) in the range [%zu, %zu]... (use adjust = '%s')\n",
+ a.legend().c_str(), b.legend().c_str(), min, max, adjust? "yes":"no");
+ double a_min = a.fiddle(min, 10000, 1000, adjust);
+ double a_max = a.fiddle(max, 10000, 1000, adjust);
+ double b_min = b.fiddle(min, 10000, 1000, adjust);
+ double b_max = b.fiddle(max, 10000, 1000, adjust);
+ fprintf(stderr, " A: [%g, %g], B: [%g, %g]\n", a_min, a_max, b_min, b_max);
+ if ((a_min < b_min) == (a_max < b_max)) {
+ fprintf(stderr, " NO FIDDLE LIMIT FOUND\n");
+ }
+ while (min < max) {
+ size_t x = (min + max) / 2;
+ double a_x = a.fiddle(x, 10000, 1000, adjust);
+ double b_x = b.fiddle(x, 10000, 1000, adjust);
+ fprintf(stderr, " A@%zu: %g, B@%zu: %g\n", x, a_x, x, b_x);
+ if ((a_x < b_x) == (a_min < b_min)) {
+ min = (x + 1);
+ } else {
+ max = (x - 1);
+ }
+ }
+}
+
+TEST("find fiddle limits") {
+ { // WAND future heap usecase
+ Benchmark::UP b = BenchmarkFactory::create(BenchmarkFactory::HEAP_ARRAY_LEFT, BenchmarkFactory::DATA_32p);
+ Benchmark::UP a = BenchmarkFactory::create(BenchmarkFactory::HEAP_LEFT, BenchmarkFactory::DATA_32p);
+ findFiddleLimit(*a, *b, 8, 1024, false);
+ }
+ { // WAND past heap usecase
+ Benchmark::UP b = BenchmarkFactory::create(BenchmarkFactory::HEAP_ARRAY_RIGHT, BenchmarkFactory::DATA_16);
+ Benchmark::UP a = BenchmarkFactory::create(BenchmarkFactory::HEAP_RIGHT, BenchmarkFactory::DATA_16);
+ findFiddleLimit(*a, *b, 8, 1024, false);
+ }
+}
+
+TEST("benchmark") {
+ for (int d = 0; d < BenchmarkFactory::DATA_CNT; ++d) {
+ for (int h = 0; h < BenchmarkFactory::HEAP_CNT; ++h) {
+ Benchmark::UP benchmark = BenchmarkFactory::create(BenchmarkFactory::HeapType(h), BenchmarkFactory::DataType(d));
+ fprintf(stderr, "%s:\n", benchmark->legend().c_str());
+ benchmark->runSortBench(5000, 1000);
+ benchmark->runFiddleBench(300, 10000, 1000, false);
+ benchmark->runFiddleBench(300, 10000, 1000, true);
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/left_right_heap/left_right_heap_test.cpp b/vespalib/src/tests/left_right_heap/left_right_heap_test.cpp
new file mode 100644
index 00000000000..f06d0534ef6
--- /dev/null
+++ b/vespalib/src/tests/left_right_heap/left_right_heap_test.cpp
@@ -0,0 +1,271 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/left_right_heap.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <stdlib.h>
+#include <algorithm>
+#include <vector>
+
+using namespace vespalib;
+
+//-----------------------------------------------------------------------------
+
+typedef std::unique_ptr<int> int_up;
+
+template <typename T> T wrap(int value);
+template <> int wrap<int>(int value) { return value; }
+template <> int_up wrap<int_up>(int value) { return int_up(new int(value)); }
+
+int unwrap(const int &value) { return value; }
+int unwrap(const int_up &value) { return *value; }
+
+// verbose types needed to avoid warning
+
+struct CmpInt {
+ bool operator()(const int &a, const int &b) const {
+ return (a < b);
+ }
+};
+
+struct CmpIntUp {
+ bool operator()(const int_up &a, const int_up &b) const {
+ return (*a < *b);
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+template <typename Heap> struct IsRight { enum { VALUE = 0 }; };
+template <> struct IsRight<RightHeap> { enum { VALUE = 1 }; };
+template <> struct IsRight<RightArrayHeap> { enum { VALUE = 1 }; };
+
+bool operator==(const std::vector<int_up> &a,
+ const std::vector<int> &b)
+{
+ if (a.size() != b.size()) {
+ return false;
+ }
+ for (size_t i = 0; i < a.size(); ++i) {
+ if (*a[i] != b[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+size_t _G_InputSize = 1000;
+
+struct Input {
+ size_t n;
+ std::vector<int> data;
+ Input() : n(_G_InputSize), data() {
+ srandom(42);
+ for (size_t i = 0; i < n; ++i) {
+ data.push_back(random());
+ }
+ ASSERT_EQUAL(n, data.size());
+ }
+};
+
+
+template <typename Heap, typename Value = int, typename Cmp = CmpInt>
+struct Setup {
+ typedef Setup<Heap, int_up, CmpIntUp> IUP;
+ Input &input;
+ std::vector<Value> data;
+ Cmp cmp;
+ size_t limit;
+ Setup(Input &i) : input(i), data(), cmp(), limit(0) {}
+
+ static void dumpData(Value *begin, Value *end) {
+ int n = 10;
+ while ((end - begin) > n) {
+ for (int i = 0; i < n; ++i) {
+ fprintf(stderr, "%d, ", unwrap(*begin++));
+ }
+ fprintf(stderr, "\n");
+ }
+ while ((end - begin) > 0) {
+ fprintf(stderr, "%d, ", unwrap(*begin++));
+ }
+ fprintf(stderr, "\n");
+ }
+
+ static int peek_at(Value *begin, Value *end, size_t idx) {
+ if (&Heap::template front(begin, end) == begin) {
+ return unwrap(*(begin + idx)); // normal order
+ } else {
+ return unwrap(*(end - 1 - idx)); // inverted order
+ }
+ }
+
+ static void checkHeap(Value *begin, Value *end) {
+ size_t len = (end - begin);
+ for (size_t i = 0; i < len; ++i) {
+ size_t child1 = (2 * i) + 1;
+ size_t child2 = (2 * i) + 2;
+ if (child1 < len) {
+ if(!EXPECT_LESS_EQUAL(peek_at(begin, end, i),
+ peek_at(begin, end, child1)))
+ {
+ dumpData(begin, end);
+ TEST_FATAL("forced unwind (see previous failure)");
+ }
+ }
+ if (child2 < len) {
+ if (!EXPECT_LESS_EQUAL(peek_at(begin, end, i),
+ peek_at(begin, end, child2)))
+ {
+ dumpData(begin, end);
+ TEST_FATAL("forced unwind (see previous failure)");
+ }
+ }
+ }
+ }
+
+ void push() {
+ if (IsRight<Heap>::VALUE) {
+ ASSERT_GREATER(limit, 0u);
+ Heap::push(&data[--limit], &data[data.size()], cmp);
+ } else {
+ ASSERT_LESS(limit, data.size());
+ Heap::push(&data[0], &data[++limit], cmp);
+ }
+ }
+ void push(int value) {
+ if (IsRight<Heap>::VALUE) {
+ data[limit - 1] = wrap<Value>(value);
+ } else {
+ data[limit] = wrap<Value>(value);
+ }
+ push();
+ }
+ Value &front() {
+ if (IsRight<Heap>::VALUE) {
+ return Heap::front(&data[limit], &data[data.size()]);
+ } else {
+ return Heap::front(&data[0], &data[limit]);
+ }
+ }
+ void adjust() {
+ if (IsRight<Heap>::VALUE) {
+ Heap::adjust(&data[limit], &data[data.size()], cmp);
+ } else {
+ Heap::adjust(&data[0], &data[limit], cmp);
+ }
+ }
+ int pop() {
+ if (IsRight<Heap>::VALUE) {
+ ASSERT_LESS(limit, data.size());
+ Heap::pop(&data[limit++], &data[data.size()], cmp);
+ return unwrap(data[limit - 1]);
+ } else {
+ ASSERT_GREATER(limit, 0u);
+ Heap::pop(&data[0], &data[limit--], cmp);
+ return unwrap(data[limit]);
+ }
+ }
+ void check() {
+ if (IsRight<Heap>::VALUE) {
+ checkHeap(&data[limit], &data[data.size()]);
+ } else {
+ checkHeap(&data[0], &data[limit]);
+ }
+ }
+ void init() {
+ data.clear();
+ for (size_t i = 0; i < input.data.size(); ++i) {
+ data.push_back(wrap<Value>(input.data[i]));
+ }
+ if (IsRight<Heap>::VALUE) {
+ limit = data.size();
+ } else {
+ limit = 0;
+ }
+ }
+ void testBasic() {
+ init();
+ push(100);
+ EXPECT_EQUAL(100, unwrap(front()));
+ adjust();
+ EXPECT_EQUAL(100, unwrap(front()));
+ push(50);
+ EXPECT_EQUAL(50, unwrap(front()));
+ adjust();
+ EXPECT_EQUAL(50, unwrap(front()));
+ push(200);
+ push(175);
+ EXPECT_EQUAL(50, unwrap(front()));
+ front() = wrap<Value>(150);
+ adjust();
+ EXPECT_EQUAL(100, unwrap(front()));
+ EXPECT_EQUAL(100, pop());
+ EXPECT_EQUAL(150, pop());
+ EXPECT_EQUAL(175, pop());
+ EXPECT_EQUAL(200, pop());
+ }
+ void testSort() {
+ init();
+ for (size_t i = 0; i < input.n; ++i) {
+ push();
+ adjust(); // has no effect here
+ check();
+ }
+ for (size_t i = 0; i < input.n; ++i) {
+ adjust(); // has no effect here
+ pop();
+ check();
+ }
+ std::vector<int> ref = input.data;
+ EXPECT_FALSE(data == ref);
+ if (IsRight<Heap>::VALUE) {
+ std::sort(ref.begin(), ref.end(), std::less<int>());
+ } else {
+ std::sort(ref.begin(), ref.end(), std::greater<int>());
+ }
+ if (!EXPECT_TRUE(data == ref)) {
+ if (data.size() == ref.size()) {
+ for (size_t i = 0; i < ref.size(); ++i) {
+ if (unwrap(data[i]) != ref[i]) {
+ fprintf(stderr, "data[%zu] != %d, ref[%zu] = %d\n",
+ i, unwrap(data[i]), i, ref[i]);
+ }
+ }
+ } else {
+ fprintf(stderr, "sizes differ: %zu, %zu\n", data.size(), ref.size());
+ }
+ TEST_FATAL("forced unwind (see previous failure)");
+ }
+ }
+ void test() {
+ testBasic();
+ testSort();
+ }
+};
+
+TEST("require correct heap tags") {
+ LeftHeap::require_left_heap();
+ RightHeap::require_right_heap();
+ LeftArrayHeap::require_left_heap();
+ RightArrayHeap::require_right_heap();
+ LeftStdHeap::require_left_heap();
+}
+
+TEST_FF("verify left heap invariants and sorting", Input, Setup<LeftHeap>(f1)) { f2.test(); }
+TEST_FF("verify right heap invariants and sorting", Input, Setup<RightHeap>(f1)) { f2.test(); }
+TEST_FF("verify left array heap invariants and sorting", Input, Setup<LeftArrayHeap>(f1)) { f2.test(); }
+TEST_FF("verify right array heap invariants and sorting", Input, Setup<RightArrayHeap>(f1)) { f2.test(); }
+TEST_FF("verify left std heap invariants and sorting", Input, Setup<LeftStdHeap>(f1)) { f2.test(); }
+
+TEST_FF("verify [move only] left heap invariants and sorting", Input, Setup<LeftHeap>::IUP(f1)) { f2.test(); }
+TEST_FF("verify [move only] right heap invariants and sorting", Input, Setup<RightHeap>::IUP(f1)) { f2.test(); }
+TEST_FF("verify [move only] left array heap invariants and sorting", Input, Setup<LeftArrayHeap>::IUP(f1)) { f2.test(); }
+TEST_FF("verify [move only] right array heap invariants and sorting", Input, Setup<RightArrayHeap>::IUP(f1)) { f2.test(); }
+TEST_FF("verify [move only] left std heap invariants and sorting", Input, Setup<LeftStdHeap>::IUP(f1)) { f2.test(); }
+
+TEST_MAIN() {
+ // Would be nice to have access to arguments.....
+ _G_InputSize = 1000; // strtoul(_argv[1], NULL, 0);
+ TEST_RUN_ALL();
+}
diff --git a/vespalib/src/tests/linkedptr/.gitignore b/vespalib/src/tests/linkedptr/.gitignore
new file mode 100644
index 00000000000..ca9a6b595b2
--- /dev/null
+++ b/vespalib/src/tests/linkedptr/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+linkedptr_test
+vespalib_linkedptr_test_app
diff --git a/vespalib/src/tests/linkedptr/CMakeLists.txt b/vespalib/src/tests/linkedptr/CMakeLists.txt
new file mode 100644
index 00000000000..c907417e432
--- /dev/null
+++ b/vespalib/src/tests/linkedptr/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_linkedptr_test_app
+ SOURCES
+ linkedptr_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_linkedptr_test_app COMMAND vespalib_linkedptr_test_app)
diff --git a/vespalib/src/tests/linkedptr/DESC b/vespalib/src/tests/linkedptr/DESC
new file mode 100644
index 00000000000..fed98e9b552
--- /dev/null
+++ b/vespalib/src/tests/linkedptr/DESC
@@ -0,0 +1 @@
+Unit test for the LinkedPtr class.
diff --git a/vespalib/src/tests/linkedptr/FILES b/vespalib/src/tests/linkedptr/FILES
new file mode 100644
index 00000000000..0a10d16f5bc
--- /dev/null
+++ b/vespalib/src/tests/linkedptr/FILES
@@ -0,0 +1 @@
+linkedptr.cpp
diff --git a/vespalib/src/tests/linkedptr/linkedptr_test.cpp b/vespalib/src/tests/linkedptr/linkedptr_test.cpp
new file mode 100644
index 00000000000..df3cf4aa0e6
--- /dev/null
+++ b/vespalib/src/tests/linkedptr/linkedptr_test.cpp
@@ -0,0 +1,233 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("linkedptr_test");
+#include <vespa/vespalib/util/linkedptr.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using vespalib::LinkedPtr;
+
+
+class Test : public vespalib::TestApp
+{
+public:
+ void testEmpty();
+ void testSimple();
+ void testCopy();
+ void testReset();
+ void testAccess();
+ void testRelease();
+ void testEqual();
+ int Main();
+};
+
+
+struct Data
+{
+ int ctorCnt;
+ int dtorCnt;
+ Data() : ctorCnt(0), dtorCnt(0) {}
+};
+
+
+class DataRef
+{
+private:
+ Data &_d;
+ DataRef(const DataRef &);
+ DataRef &operator=(const DataRef &);
+public:
+ DataRef(Data &d) : _d(d) { ++d.ctorCnt; }
+ ~DataRef() { ++_d.dtorCnt; }
+ int getCtorCnt() const { return _d.ctorCnt; }
+ int getDtorCnt() const { return _d.dtorCnt; }
+};
+typedef LinkedPtr<DataRef> PT;
+
+PT copyPT(const PT &pt) { return pt; }
+
+void
+Test::testEmpty()
+{
+ PT pt1;
+ PT pt2(NULL);
+ EXPECT_TRUE(pt1.get() == NULL);
+ EXPECT_TRUE(pt2.get() == NULL);
+}
+
+void
+Test::testRelease()
+{
+ {
+ PT p(NULL);
+ EXPECT_TRUE(p.release() == NULL);
+ }
+ {
+ Data data;
+ PT p(new DataRef(data));
+ std::unique_ptr<DataRef> ap(p.release());
+ EXPECT_TRUE(ap.get() != NULL);
+ EXPECT_TRUE(p.release() == NULL);
+ }
+ {
+ Data data;
+ PT p(new DataRef(data));
+ PT p2(p);
+ EXPECT_TRUE(p.release() == NULL);
+ EXPECT_TRUE(p2.release() == NULL);
+ EXPECT_TRUE(p.get() != NULL);
+ EXPECT_TRUE(p2.get() != NULL);
+ }
+}
+
+
+void
+Test::testSimple()
+{
+ Data data;
+ {
+ PT pt1(new DataRef(data));
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 0);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 1);
+}
+
+
+void
+Test::testCopy()
+{
+ Data data;
+ {
+ PT pt3;
+ {
+ PT pt1(new DataRef(data));
+ PT pt2(pt1);
+ EXPECT_TRUE(pt1.get() == pt2.get());
+ EXPECT_TRUE(pt3.get() == NULL);
+ pt3 = pt1;
+ EXPECT_TRUE(pt3.get() == pt1.get());
+ {
+ PT pt4;
+ PT pt5 = pt1;
+ EXPECT_TRUE(pt4.get() == NULL);
+ EXPECT_TRUE(pt5.get() == pt1.get());
+ pt4 = pt5;
+ EXPECT_TRUE(pt4.get() == pt1.get());
+ {
+ PT pt6 = copyPT(pt3);
+ PT pt7;
+ EXPECT_TRUE(pt6.get() == pt1.get());
+ EXPECT_TRUE(pt7.get() == NULL);
+ pt7 = copyPT(pt5);
+ EXPECT_TRUE(pt7.get() == pt1.get());
+ {
+ PT pt8 = pt1;
+ EXPECT_TRUE(pt8.get() == pt1.get());
+ pt8 = pt8;
+ EXPECT_TRUE(pt8.get() == pt1.get());
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 0);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 0);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 0);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 0);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 0);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 1);
+}
+
+
+void
+Test::testReset()
+{
+ Data data;
+ {
+ PT pt1(new DataRef(data));
+ EXPECT_EQUAL(data.ctorCnt, 1);
+ EXPECT_EQUAL(data.dtorCnt, 0);
+ pt1.reset(new DataRef(data));
+ EXPECT_EQUAL(data.ctorCnt, 2);
+ EXPECT_EQUAL(data.dtorCnt, 1);
+ pt1.reset();
+ EXPECT_EQUAL(data.ctorCnt, 2);
+ EXPECT_EQUAL(data.dtorCnt, 2);
+ pt1.reset(new DataRef(data));
+ EXPECT_EQUAL(data.ctorCnt, 3);
+ EXPECT_EQUAL(data.dtorCnt, 2);
+ {
+ PT pt2(pt1);
+ pt1.reset(new DataRef(data));
+ EXPECT_EQUAL(data.ctorCnt, 4);
+ EXPECT_EQUAL(data.dtorCnt, 2);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 4);
+ EXPECT_EQUAL(data.dtorCnt, 3);
+ }
+ EXPECT_EQUAL(data.ctorCnt, 4);
+ EXPECT_EQUAL(data.dtorCnt, 4);
+}
+
+
+void
+Test::testAccess()
+{
+ Data data;
+ {
+ PT pt1(new DataRef(data));
+ EXPECT_EQUAL(pt1->getCtorCnt(), 1);
+ EXPECT_EQUAL((*pt1).getDtorCnt(), 0);
+ }
+}
+
+class A {
+ int _v;
+public:
+ A(int v) : _v(v) {}
+ bool operator == (const A & rhs) const { return _v == rhs._v; }
+};
+typedef LinkedPtr<A> ALP;
+
+void
+Test::testEqual()
+{
+ ALP a(new A(1));
+ ALP a2(new A(1));
+ ALP b(new A(2));
+ ALP c;
+ EXPECT_TRUE(a == a);
+ EXPECT_TRUE(a2 == a2);
+ EXPECT_TRUE(a == a2);
+ EXPECT_TRUE(a2 == a);
+ EXPECT_TRUE(b == b);
+ EXPECT_TRUE(c == c);
+ EXPECT_FALSE(a == b);
+ EXPECT_FALSE(b == c);
+ EXPECT_FALSE(a == c);
+ EXPECT_FALSE(c == a);
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("linkedptr_test");
+ testEmpty();
+ testSimple();
+ testCopy();
+ testEqual();
+ testReset();
+ testAccess();
+ testRelease();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/make_fixture_macros/.gitignore b/vespalib/src/tests/make_fixture_macros/.gitignore
new file mode 100644
index 00000000000..f0ed33b2eea
--- /dev/null
+++ b/vespalib/src/tests/make_fixture_macros/.gitignore
@@ -0,0 +1,2 @@
+/macros.tmp
+vespalib_make_fixture_macros_test_app
diff --git a/vespalib/src/tests/make_fixture_macros/CMakeLists.txt b/vespalib/src/tests/make_fixture_macros/CMakeLists.txt
new file mode 100644
index 00000000000..3ef3d15e6c5
--- /dev/null
+++ b/vespalib/src/tests/make_fixture_macros/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_make_fixture_macros_test_app
+ SOURCES
+ make_fixture_macros_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_make_fixture_macros_test_app COMMAND vespalib_make_fixture_macros_test_app)
diff --git a/vespalib/src/tests/make_fixture_macros/FILES b/vespalib/src/tests/make_fixture_macros/FILES
new file mode 100644
index 00000000000..0af18af5a8b
--- /dev/null
+++ b/vespalib/src/tests/make_fixture_macros/FILES
@@ -0,0 +1 @@
+make_fixture_macros_test.cpp
diff --git a/vespalib/src/tests/make_fixture_macros/make_fixture_macros_test.cpp b/vespalib/src/tests/make_fixture_macros/make_fixture_macros_test.cpp
new file mode 100644
index 00000000000..3c2b9455fe8
--- /dev/null
+++ b/vespalib/src/tests/make_fixture_macros/make_fixture_macros_test.cpp
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/slaveproc.h>
+
+using namespace vespalib;
+
+bool runPrint(const char *cmd) {
+ std::string out;
+ bool res = SlaveProc::run(cmd, out);
+ fprintf(stderr, "%s", out.c_str());
+ return res;
+}
+
+TEST("make fixture macros") {
+ EXPECT_FALSE(runPrint("../../apps/make_fixture_macros/vespalib_make_fixture_macros_app"));
+ EXPECT_TRUE(runPrint("../../apps/make_fixture_macros/vespalib_make_fixture_macros_app 9 > macros.tmp"));
+ EXPECT_TRUE(runPrint("diff -u ../../vespa/vespalib/testkit/generated_fixture_macros.h macros.tmp"));
+}
+
+TEST_MAIN_WITH_PROCESS_PROXY() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/memory/.gitignore b/vespalib/src/tests/memory/.gitignore
new file mode 100644
index 00000000000..99f0954792a
--- /dev/null
+++ b/vespalib/src/tests/memory/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+memory_test
+vespalib_memory_test_app
diff --git a/vespalib/src/tests/memory/CMakeLists.txt b/vespalib/src/tests/memory/CMakeLists.txt
new file mode 100644
index 00000000000..f2521f000f0
--- /dev/null
+++ b/vespalib/src/tests/memory/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_memory_test_app
+ SOURCES
+ memory_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_memory_test_app COMMAND vespalib_memory_test_app)
diff --git a/vespalib/src/tests/memory/DESC b/vespalib/src/tests/memory/DESC
new file mode 100644
index 00000000000..1fc0b7c745d
--- /dev/null
+++ b/vespalib/src/tests/memory/DESC
@@ -0,0 +1 @@
+memory test. Take a look at memory.cpp for details.
diff --git a/vespalib/src/tests/memory/FILES b/vespalib/src/tests/memory/FILES
new file mode 100644
index 00000000000..16422d07c7b
--- /dev/null
+++ b/vespalib/src/tests/memory/FILES
@@ -0,0 +1 @@
+memory.cpp
diff --git a/vespalib/src/tests/memory/memory_test.cpp b/vespalib/src/tests/memory/memory_test.cpp
new file mode 100644
index 00000000000..c9b0634f3bc
--- /dev/null
+++ b/vespalib/src/tests/memory/memory_test.cpp
@@ -0,0 +1,164 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("memory_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/memory.h>
+
+using namespace vespalib;
+
+class B
+{
+public:
+ virtual ~B() { }
+ virtual B * clone() const { return new B(*this); }
+};
+
+class A : public B
+{
+public:
+ virtual ~A() { }
+ virtual A * clone() const { return new A(*this); }
+};
+
+class Test : public TestApp
+{
+public:
+ int Main();
+};
+
+B* fn(auto_arr<B> param) { return param.get(); }
+auto_arr<B> fn(B *param) { auto_arr<B> bb(param); return bb; }
+
+int
+Test::Main()
+{
+ TEST_INIT("memory_test");
+ {
+ B* p = new B[5];
+ auto_arr<B> apb(p);
+ EXPECT_TRUE(apb.get() == p);
+ EXPECT_TRUE(fn(apb) == p);
+ EXPECT_TRUE(apb.get() == nullptr);
+ }
+ {
+ A* p = new A[5];
+ auto_arr<A> apa(p);
+ EXPECT_TRUE(apa.get() == p);
+ auto_arr<A> apb = apa;
+ EXPECT_TRUE(apa.get() == nullptr);
+ EXPECT_TRUE(apb.get() == p);
+ A& ref = apb[2];
+ EXPECT_TRUE(&ref == (p+2));
+ }
+ {
+ B* p = new B[5];
+ auto_arr<B> apb = fn(p);
+ EXPECT_TRUE(apb.get() == p);
+ }
+ {
+ MallocAutoPtr a(malloc(30));
+ EXPECT_TRUE(a.get() != nullptr);
+ void * tmp = a.get();
+ MallocAutoPtr b(a);
+ EXPECT_TRUE(tmp == b.get());
+ EXPECT_TRUE(a.get() == nullptr);
+ MallocAutoPtr c;
+ c = b;
+ EXPECT_TRUE(b.get() == nullptr);
+ EXPECT_TRUE(tmp == c.get());
+ MallocAutoPtr d(malloc(30));
+ EXPECT_TRUE(d.get() != nullptr);
+ tmp = c.get();
+ d = c;
+ EXPECT_TRUE(tmp == d.get());
+ EXPECT_TRUE(c.get() == nullptr);
+ }
+ {
+
+ MallocPtr a(100);
+ EXPECT_TRUE(a.size() == 100);
+ EXPECT_TRUE(a.get() != nullptr);
+ memset(a.get(), 17, a.size());
+ MallocPtr b(a);
+ EXPECT_TRUE(a.size() == 100);
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(b.size() == 100);
+ EXPECT_TRUE(b.get() != nullptr);
+ EXPECT_TRUE(a.get() != b.get());
+ EXPECT_TRUE(memcmp(a.get(), b.get(), a.size()) == 0);
+ void * tmp = a.get();
+ a = b;
+ EXPECT_TRUE(a.size() == 100);
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(a.get() != tmp);
+ EXPECT_TRUE(memcmp(a.get(), b.get(), a.size()) == 0);
+ MallocPtr d = std::move(b);
+ EXPECT_TRUE(d.size() == 100);
+ EXPECT_TRUE(d.get() != nullptr);
+ EXPECT_TRUE(b.size() == 0);
+ EXPECT_TRUE(b.get() == nullptr);
+ MallocPtr c;
+ c.realloc(89);
+ EXPECT_EQUAL(c.size(), 89u);
+ c.realloc(0);
+ EXPECT_EQUAL(c.size(), 0u);
+ EXPECT_TRUE(c == nullptr);
+
+ }
+ {
+ CloneablePtr<B> a(new A());
+ EXPECT_TRUE(a.get() != nullptr);
+ CloneablePtr<B> b(a);
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(b.get() != nullptr);
+ EXPECT_TRUE(b.get() != a.get());
+ CloneablePtr<B> c;
+ c = a;
+ EXPECT_TRUE(a.get() != nullptr);
+ EXPECT_TRUE(c.get() != nullptr);
+ EXPECT_TRUE(c.get() != a.get());
+
+ b = CloneablePtr<B>(new B());
+ EXPECT_TRUE(dynamic_cast<B*>(b.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(b.get()) == nullptr);
+ EXPECT_TRUE(dynamic_cast<B*>(a.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(a.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<B*>(c.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(c.get()) != nullptr);
+ c = b;
+ EXPECT_TRUE(dynamic_cast<B*>(c.get()) != nullptr);
+ EXPECT_TRUE(dynamic_cast<A*>(c.get()) == nullptr);
+ }
+ {
+ CloneablePtr<B> null;
+ if (null) {
+ EXPECT_TRUE(false);
+ } else {
+ EXPECT_FALSE(bool(null));
+ EXPECT_TRUE(!null);
+ }
+ }
+ {
+ CloneablePtr<B> notNull(new A());
+ if (notNull) {
+ EXPECT_TRUE(bool(notNull));
+ EXPECT_FALSE(!notNull);
+ } else {
+ EXPECT_TRUE(false);
+ }
+ }
+ {
+ int a[3];
+ int b[4] = {0,1,2,3};
+ int c[4] = {0,1,2};
+ int d[] = {0,1,2,3,4};
+ EXPECT_EQUAL(VESPA_NELEMS(a), 3u);
+ EXPECT_EQUAL(VESPA_NELEMS(b), 4u);
+ EXPECT_EQUAL(VESPA_NELEMS(c), 4u);
+ EXPECT_EQUAL(VESPA_NELEMS(d), 5u);
+ }
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/net/socket/.gitignore b/vespalib/src/tests/net/socket/.gitignore
new file mode 100644
index 00000000000..8af3a1f3ffb
--- /dev/null
+++ b/vespalib/src/tests/net/socket/.gitignore
@@ -0,0 +1,5 @@
+/socket_server
+/socket_client
+vespalib_socket_test_app
+vespalib_socket_client_app
+vespalib_socket_server_app
diff --git a/vespalib/src/tests/net/socket/CMakeLists.txt b/vespalib/src/tests/net/socket/CMakeLists.txt
new file mode 100644
index 00000000000..16fce4a2453
--- /dev/null
+++ b/vespalib/src/tests/net/socket/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_socket_test_app
+ SOURCES
+ socket_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_socket_test_app COMMAND vespalib_socket_test_app)
+vespa_add_executable(vespalib_socket_server_app
+ SOURCES
+ socket_server.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_executable(vespalib_socket_client_app
+ SOURCES
+ socket_client.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/net/socket/socket_client.cpp b/vespalib/src/tests/net/socket/socket_client.cpp
new file mode 100644
index 00000000000..c46b4989954
--- /dev/null
+++ b/vespalib/src/tests/net/socket/socket_client.cpp
@@ -0,0 +1,66 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/net/socket_address.h>
+#include <vespa/vespalib/net/server_socket.h>
+#include <vespa/vespalib/net/socket.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/host_name.h>
+#include <thread>
+#include <functional>
+#include <chrono>
+
+using namespace vespalib;
+
+vespalib::string read_msg(Socket &socket) {
+ vespalib::string msg;
+ for (;;) {
+ char c;
+ ssize_t ret = socket.read(&c, 1);
+ if (ret != 1) {
+ fprintf(stderr, "error during read message\n");
+ return msg;
+ }
+ if (c == '\n') {
+ return msg;
+ }
+ msg.append(c);
+ }
+}
+
+void write_msg(Socket &socket, const vespalib::string &msg) {
+ for (size_t i = 0; i < msg.size(); ++i) {
+ ssize_t ret = socket.write(&msg[i], 1);
+ if (ret != 1) {
+ fprintf(stderr, "error during write message\n");
+ return;
+ }
+ }
+}
+
+int main(int argc, char **argv) {
+ if (argc != 3) {
+ fprintf(stderr, "usage: %s <host> <port>\n", argv[0]);
+ return 1;
+ }
+ vespalib::string host(argv[1]);
+ int port = atoi(argv[2]);
+ fprintf(stderr, "running socket test client at host %s\n", HostName::get().c_str());
+ fprintf(stderr, "trying to connect to host %s at port %d\n", host.c_str(), port);
+ auto list = SocketAddress::resolve(port, host.c_str());
+ if (list.size() > 0) {
+ fprintf(stderr, "all remote addresses:\n");
+ for (const auto &addr: list) {
+ fprintf(stderr, " %s\n", addr.spec().c_str());
+ }
+ }
+ Socket::UP socket = Socket::connect(host, port);
+ if (!socket->valid()) {
+ fprintf(stderr, "connect failed\n");
+ return 1;
+ }
+ fprintf(stderr, "connected to: %s (local address: %s)\n",
+ socket->peer_address().spec().c_str(), socket->address().spec().c_str());
+ write_msg(*socket, "hello from client\n");
+ fprintf(stderr, "message from server: '%s'\n", read_msg(*socket).c_str());
+ return 0;
+}
diff --git a/vespalib/src/tests/net/socket/socket_server.cpp b/vespalib/src/tests/net/socket/socket_server.cpp
new file mode 100644
index 00000000000..b4d3881097f
--- /dev/null
+++ b/vespalib/src/tests/net/socket/socket_server.cpp
@@ -0,0 +1,72 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/net/socket_address.h>
+#include <vespa/vespalib/net/server_socket.h>
+#include <vespa/vespalib/net/socket.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/signalhandler.h>
+#include <vespa/vespalib/util/host_name.h>
+#include <thread>
+#include <functional>
+#include <chrono>
+
+using namespace vespalib;
+
+vespalib::string read_msg(Socket &socket) {
+ vespalib::string msg;
+ for (;;) {
+ char c;
+ ssize_t ret = socket.read(&c, 1);
+ if (ret != 1) {
+ fprintf(stderr, "error during read message\n");
+ return msg;
+ }
+ if (c == '\n') {
+ return msg;
+ }
+ msg.append(c);
+ }
+}
+
+void write_msg(Socket &socket, const vespalib::string &msg) {
+ for (size_t i = 0; i < msg.size(); ++i) {
+ ssize_t ret = socket.write(&msg[i], 1);
+ if (ret != 1) {
+ fprintf(stderr, "error during write message\n");
+ return;
+ }
+ }
+}
+
+int main(int, char **) {
+ ServerSocket::UP server = ServerSocket::listen(0);
+ if (!server->valid()) {
+ fprintf(stderr, "listen failed, exiting\n");
+ return 1;
+ }
+ fprintf(stderr, "running socket test server at host %s\n", HostName::get().c_str());
+ auto list = SocketAddress::resolve(0);
+ if (list.size() > 0) {
+ fprintf(stderr, "all local addresses:\n");
+ for (const auto &addr: list) {
+ fprintf(stderr, " %s\n", addr.spec().c_str());
+ }
+ }
+ fprintf(stderr, "listening to %s\n", server->address().spec().c_str());
+ fprintf(stderr, "client command: env $(make ldl) ./socket_client %s %d\n",
+ HostName::get().c_str(), server->address().port());
+ fprintf(stderr, "use ^C (SIGINT) to exit\n");
+ SignalHandler::INT.hook();
+ while (!SignalHandler::INT.check()) {
+ Socket::UP socket = server->accept();
+ if (socket->valid()) {
+ fprintf(stderr, "got connection from: %s (local address: %s)\n",
+ socket->peer_address().spec().c_str(), socket->address().spec().c_str());
+ fprintf(stderr, "message from client: '%s'\n", read_msg(*socket).c_str());
+ write_msg(*socket, "hello from server\n");
+ } else {
+ fprintf(stderr, "(got invalid socket from accept)\n");
+ }
+ }
+ return 0;
+}
diff --git a/vespalib/src/tests/net/socket/socket_test.cpp b/vespalib/src/tests/net/socket/socket_test.cpp
new file mode 100644
index 00000000000..f14f7b13475
--- /dev/null
+++ b/vespalib/src/tests/net/socket/socket_test.cpp
@@ -0,0 +1,91 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/net/socket_address.h>
+#include <vespa/vespalib/net/server_socket.h>
+#include <vespa/vespalib/net/socket.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <thread>
+#include <functional>
+#include <chrono>
+
+using namespace vespalib;
+
+vespalib::string read_bytes(Socket &socket, size_t wanted_bytes) {
+ char tmp[64];
+ vespalib::string result;
+ while (result.size() < wanted_bytes) {
+ size_t read_size = std::min(sizeof(tmp), wanted_bytes - result.size());
+ size_t read_result = socket.read(tmp, read_size);
+ if (read_result <= 0) {
+ return result;
+ }
+ result.append(tmp, read_result);
+ }
+ return result;
+}
+
+void verify_socket_io(bool is_server, Socket &socket) {
+ vespalib::string server_message = "hello, this is the server speaking";
+ vespalib::string client_message = "please pick up, I need to talk to you";
+ if(is_server) {
+ socket.write(server_message.data(), server_message.size());
+ vespalib::string read = read_bytes(socket, client_message.size());
+ EXPECT_EQUAL(client_message, read);
+ } else {
+ socket.write(client_message.data(), client_message.size());
+ vespalib::string read = read_bytes(socket, server_message.size());
+ EXPECT_EQUAL(server_message, read);
+ }
+}
+
+Socket::UP connect_sockets(bool is_server, ServerSocket &server_socket) {
+ if (is_server) {
+ return server_socket.accept();
+ } else {
+ return Socket::connect("localhost", server_socket.address().port());
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("my local address") {
+ auto list = SocketAddress::resolve(4080);
+ fprintf(stderr, "resolve(4080):\n");
+ for (const auto &addr: list) {
+ fprintf(stderr, " %s\n", addr.spec().c_str());
+ }
+}
+
+TEST("yahoo.com address") {
+ auto list = SocketAddress::resolve(80, "yahoo.com");
+ fprintf(stderr, "resolve(80, 'yahoo.com'):\n");
+ for (const auto &addr: list) {
+ fprintf(stderr, " %s\n", addr.spec().c_str());
+ }
+}
+
+struct ServerWrapper {
+ ServerSocket::UP server = ServerSocket::listen(0);
+};
+
+TEST_MT_F("require that basic socket io works", 2, ServerWrapper) {
+ bool is_server = (thread_id == 0);
+ Socket::UP socket = connect_sockets(is_server, *f1.server);
+ TEST_DO(verify_socket_io(is_server, *socket));
+}
+
+TEST_MT_F("require that server accept can be interrupted", 2, ServerWrapper) {
+ bool is_server = (thread_id == 0);
+ if (is_server) {
+ fprintf(stderr, "--> calling accept\n");
+ Socket::UP socket = f1.server->accept();
+ fprintf(stderr, "<-- accept returned\n");
+ EXPECT_TRUE(!socket->valid());
+ } else {
+ std::this_thread::sleep_for(std::chrono::milliseconds(500));
+ fprintf(stderr, "--- closing server socket\n");
+ f1.server->shutdown();
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/objects/nbostream/.gitignore b/vespalib/src/tests/objects/nbostream/.gitignore
new file mode 100644
index 00000000000..b99fc671d70
--- /dev/null
+++ b/vespalib/src/tests/objects/nbostream/.gitignore
@@ -0,0 +1 @@
+vespalib_nbostream_test_app
diff --git a/vespalib/src/tests/objects/nbostream/CMakeLists.txt b/vespalib/src/tests/objects/nbostream/CMakeLists.txt
new file mode 100644
index 00000000000..63be798a751
--- /dev/null
+++ b/vespalib/src/tests/objects/nbostream/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_nbostream_test_app
+ SOURCES
+ nbostream_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_nbostream_test_app COMMAND vespalib_nbostream_test_app)
diff --git a/vespalib/src/tests/objects/nbostream/FILES b/vespalib/src/tests/objects/nbostream/FILES
new file mode 100644
index 00000000000..f4bf7a20446
--- /dev/null
+++ b/vespalib/src/tests/objects/nbostream/FILES
@@ -0,0 +1 @@
+nbostream_test.cpp
diff --git a/vespalib/src/tests/objects/nbostream/nbostream_test.cpp b/vespalib/src/tests/objects/nbostream/nbostream_test.cpp
new file mode 100644
index 00000000000..9089ebc3e3a
--- /dev/null
+++ b/vespalib/src/tests/objects/nbostream/nbostream_test.cpp
@@ -0,0 +1,267 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/objects/nbostream.h>
+#include <vespa/vespalib/test/insertion_operators.h>
+#include <iostream>
+
+using vespalib::nbostream;
+using ExpBuffer = std::vector<uint8_t>;
+
+namespace std
+{
+
+bool operator==(const std::vector<uint8_t> &exp, const nbostream &stream)
+{
+ return ((exp.size() == stream.size()) &&
+ (memcmp(&exp[0], stream.peek(), exp.size()) == 0));
+}
+
+std::ostream &operator<<(std::ostream &out, const std::vector<uint8_t> &rhs)
+{
+ out << vespalib::HexDump(&rhs[0], rhs.size());
+ return out;
+}
+
+template <typename T, typename U>
+std::ostream &operator<<(std::ostream &out, const std::pair<T, U> &rhs)
+{
+ out << "{ " << rhs.first << ", " << rhs.second << " }";
+ return out;
+}
+
+
+template <typename T>
+std::ostream &
+operator<<(std::ostream &os, const vespalib::Array<T> &set)
+{
+ os << "{";
+ bool first = true;
+ for (const auto &entry : set) {
+ if (!first) {
+ os << ",";
+ }
+ os << entry;
+ first = false;
+ }
+ os << "}";
+ return os;
+}
+
+
+} // namespace std
+
+struct Fixture
+{
+ nbostream _stream;
+
+ template <typename T>
+ void
+ assertSerialize(const ExpBuffer &exp, const T &val)
+ {
+ _stream << val;
+ EXPECT_EQUAL(exp, _stream);
+ T checkVal = T();
+ _stream >> checkVal;
+ EXPECT_EQUAL(val, checkVal);
+ }
+};
+
+
+TEST_F("test serializing 64-bit signed integers", Fixture)
+{
+ int64_t val = 0x0123456789ABCDEF;
+ f.assertSerialize({ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, val);
+}
+
+
+TEST_F("test serializing 64-bit unsigned integers", Fixture)
+{
+ uint64_t val = 0x0123456789ABCDEF;
+ f.assertSerialize({ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, val);
+}
+
+
+TEST_F("test serializing 32-bit signed integers", Fixture)
+{
+ int32_t val = 0x01234567;
+ f.assertSerialize({ 0x01, 0x23, 0x45, 0x67 }, val);
+}
+
+
+TEST_F("test serializing 32-bit unsigned integers", Fixture)
+{
+ uint32_t val = 0x01234567;
+ f.assertSerialize({ 0x01, 0x23, 0x45, 0x67 }, val);
+}
+
+TEST_F("test serializing 16-bit signed integers", Fixture)
+{
+ int16_t val = 0x0123;
+ f.assertSerialize({ 0x01, 0x23 }, val);
+}
+
+
+TEST_F("test serializing 16-bit unsigned integers", Fixture)
+{
+ uint16_t val = 0x0123;
+ f.assertSerialize({ 0x01, 0x23 }, val);
+}
+
+TEST_F("test serializing 8-bit signed integers", Fixture)
+{
+ int8_t val = 0x23;
+ f.assertSerialize({ 0x23 }, val);
+}
+
+
+TEST_F("test serializing 8-bit unsigned integers", Fixture)
+{
+ uint8_t val = 0x23;
+ f.assertSerialize({ 0x23 }, val);
+}
+
+TEST_F("test serializing char", Fixture)
+{
+ char val('A');
+ f.assertSerialize({ 0x41 }, val);
+}
+
+TEST_F("test serializing bool", Fixture)
+{
+ bool myfalse = false;
+ bool mytrue = true;
+ ExpBuffer exp({ 0x00, 0x01 });
+ f._stream << myfalse << mytrue;
+ EXPECT_EQUAL(exp, f._stream);
+ bool checkFalse = true;
+ bool checkTrue = false;
+ f._stream >> checkFalse >> checkTrue;
+ EXPECT_FALSE(checkFalse);
+ EXPECT_TRUE(checkTrue);
+}
+
+TEST_F("test serializing double", Fixture)
+{
+ double val = 1.5;
+ f.assertSerialize({ 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, val);
+}
+
+
+TEST_F("test serializing float", Fixture)
+{
+ float val = -1.5;
+ f.assertSerialize({ 0xBF, 0xC0, 0x00, 0x00 }, val);
+}
+
+TEST_F("Test serializing c string", Fixture)
+{
+ const char *cstr = "Hello";
+ ExpBuffer exp({ 0x00, 0x00, 0x00, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f });
+ f._stream << cstr;
+ EXPECT_EQUAL(exp, f._stream);
+}
+
+TEST_F("Test serializing stringref", Fixture)
+{
+ vespalib::stringref val("Hello");
+ ExpBuffer exp({ 0x00, 0x00, 0x00, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f });
+ f._stream << val;
+ EXPECT_EQUAL(exp, f._stream);
+}
+
+TEST_F("Test serializing std::string", Fixture)
+{
+ std::string val("Hello");
+ ExpBuffer exp({ 0x00, 0x00, 0x00, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f });
+ f.assertSerialize(exp, val);
+}
+
+TEST_F("Test serializing vespalib::string", Fixture)
+{
+ vespalib::string val("Hello");
+ ExpBuffer exp({ 0x00, 0x00, 0x00, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f });
+ f.assertSerialize(exp, val);
+}
+
+TEST_F("Test serializing vespalib::Array", Fixture)
+{
+ vespalib::Array<int16_t> val;
+ val.resize(2);
+ val[0] = 0x0123;
+ val[1] = 0x4567;
+ ExpBuffer exp({ 0x00, 0x00, 0x00, 0x02, 0x01, 0x23, 0x45, 0x67 });
+ f.assertSerialize(exp, val);
+}
+
+TEST_F("Test serializing std::vector", Fixture)
+{
+ std::vector<int16_t> val({ 0x0123, 0x4567 });
+ ExpBuffer exp({ 0x00, 0x00, 0x00, 0x02, 0x01, 0x23, 0x45, 0x67 });
+ f.assertSerialize(exp, val);
+}
+
+TEST_F("Test serializing std::pair", Fixture)
+{
+ std::pair<int16_t, int16_t> val({ 0x0123, 0x4567 });
+ ExpBuffer exp({ 0x01, 0x23, 0x45, 0x67 });
+ f.assertSerialize(exp, val);
+}
+
+TEST_F("Test saveVector", Fixture)
+{
+ std::vector<int16_t> val({ 0x0123, 0x4567 });
+ val.reserve(16);
+ ExpBuffer exp({ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x01, 0x23, 0x45, 0x67 });
+ f._stream.saveVector(val);
+ EXPECT_EQUAL(exp, f._stream);
+ std::vector<int16_t> checkVal;
+ f._stream.restoreVector(checkVal);
+ EXPECT_EQUAL(val, checkVal);
+ EXPECT_EQUAL(val.capacity(), checkVal.capacity());
+}
+
+
+TEST_F("Test write", Fixture)
+{
+ f._stream.write("Hello", 5);
+ ExpBuffer exp({ 0x48, 0x65, 0x6c, 0x6c, 0x6f });
+ EXPECT_EQUAL(exp, f._stream);
+ EXPECT_EQUAL(5u, f._stream.size());
+ ExpBuffer rval(5);
+ f._stream.read(&rval[0], 5);
+ EXPECT_EQUAL(exp, rval);
+}
+
+
+TEST_F("Test putInt1_4", Fixture)
+{
+ f._stream.putInt1_4Bytes(5);
+ EXPECT_EQUAL(ExpBuffer({ 0x05 }), f._stream);
+ uint32_t checkInt = f._stream.getInt1_4Bytes();
+ EXPECT_EQUAL(5u, checkInt);
+ EXPECT_EQUAL(0u, f._stream.size());
+ f._stream.clear();
+ f._stream.putInt1_4Bytes(1000);
+ EXPECT_EQUAL(ExpBuffer({ 0x80, 0x00, 0x03, 0xe8 }), f._stream);
+ checkInt = f._stream.getInt1_4Bytes();
+ EXPECT_EQUAL(1000u, checkInt);
+ EXPECT_EQUAL(0u, f._stream.size());
+}
+
+
+TEST_F("Test writeSmallString", Fixture)
+{
+ f._stream.writeSmallString("Hello");
+ ExpBuffer exp({ 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f });
+ EXPECT_EQUAL(exp, f._stream);
+ vespalib::string checkString;
+ f._stream.readSmallString(checkString);
+ EXPECT_EQUAL("Hello", checkString);
+ EXPECT_EQUAL(0u, f._stream.size());
+}
+
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/optimized/.gitignore b/vespalib/src/tests/optimized/.gitignore
new file mode 100644
index 00000000000..a9fe45dae65
--- /dev/null
+++ b/vespalib/src/tests/optimized/.gitignore
@@ -0,0 +1 @@
+vespalib_optimized_test_app
diff --git a/vespalib/src/tests/optimized/CMakeLists.txt b/vespalib/src/tests/optimized/CMakeLists.txt
new file mode 100644
index 00000000000..627a3ceb77c
--- /dev/null
+++ b/vespalib/src/tests/optimized/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_optimized_test_app
+ SOURCES
+ optimized_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_optimized_test_app COMMAND vespalib_optimized_test_app)
diff --git a/vespalib/src/tests/optimized/DESC b/vespalib/src/tests/optimized/DESC
new file mode 100644
index 00000000000..6e779e1f14b
--- /dev/null
+++ b/vespalib/src/tests/optimized/DESC
@@ -0,0 +1 @@
+cpu special instructions test. Take a look at optimized_test.cpp for details.
diff --git a/vespalib/src/tests/optimized/FILES b/vespalib/src/tests/optimized/FILES
new file mode 100644
index 00000000000..737e0d26970
--- /dev/null
+++ b/vespalib/src/tests/optimized/FILES
@@ -0,0 +1 @@
+optimized_test.cpp
diff --git a/vespalib/src/tests/optimized/optimized_test.cpp b/vespalib/src/tests/optimized/optimized_test.cpp
new file mode 100644
index 00000000000..8edb4879091
--- /dev/null
+++ b/vespalib/src/tests/optimized/optimized_test.cpp
@@ -0,0 +1,75 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("optimized_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/optimized.h>
+
+using namespace vespalib;
+
+class Test : public vespalib::TestApp
+{
+private:
+ template<typename T>
+ void testMsbIdx();
+ template<typename T>
+ void testLsbIdx();
+public:
+ int Main();
+};
+
+template<typename T>
+void Test::testMsbIdx()
+{
+ EXPECT_EQUAL(Optimized::msbIdx(T(0)), 0);
+ EXPECT_EQUAL(Optimized::msbIdx(T(1)), 0);
+ EXPECT_EQUAL(Optimized::msbIdx(T(-1)), int(sizeof(T)*8 - 1));
+ T v(static_cast<T>(-1));
+ for (size_t i(0); i < sizeof(T); i++) {
+ for (size_t j(0); j < 8; j++) {
+ EXPECT_EQUAL(Optimized::msbIdx(v), int(sizeof(T)*8 - (i*8+j) - 1));
+ v = v >> 1;
+ }
+ }
+}
+
+template<typename T>
+void Test::testLsbIdx()
+{
+ EXPECT_EQUAL(Optimized::lsbIdx(T(0)), 0);
+ EXPECT_EQUAL(Optimized::lsbIdx(T(1)), 0);
+ EXPECT_EQUAL(Optimized::lsbIdx(T(T(1)<<(sizeof(T)*8 - 1))), int(sizeof(T)*8 - 1));
+ EXPECT_EQUAL(Optimized::lsbIdx(T(-1)), 0);
+ T v(static_cast<T>(-1));
+ for (size_t i(0); i < sizeof(T); i++) {
+ for (size_t j(0); j < 8; j++) {
+ EXPECT_EQUAL(Optimized::lsbIdx(v), int(i*8+j));
+ v = v << 1;
+ }
+ }
+}
+
+int Test::Main()
+{
+ TEST_INIT("optimized_test");
+
+ testMsbIdx<uint32_t>();
+ testMsbIdx<uint64_t>();
+
+ TEST_FLUSH();
+ testLsbIdx<uint32_t>();
+ testLsbIdx<uint64_t>();
+
+ TEST_FLUSH();
+ EXPECT_EQUAL(Optimized::popCount(0u), 0);
+ EXPECT_EQUAL(Optimized::popCount(1u), 1);
+ EXPECT_EQUAL(Optimized::popCount(uint32_t(-1)), 32);
+ EXPECT_EQUAL(Optimized::popCount(0ul), 0);
+ EXPECT_EQUAL(Optimized::popCount(1ul), 1);
+ EXPECT_EQUAL(Optimized::popCount(uint64_t(-1l)), 64);
+
+ TEST_FLUSH();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/placement-delete/.gitignore b/vespalib/src/tests/placement-delete/.gitignore
new file mode 100644
index 00000000000..fbf1f708fc0
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/.gitignore
@@ -0,0 +1,7 @@
+.depend
+Makefile
+fail
+hello
+placement-delete_test
+undef
+vespalib_placement-delete_test_app
diff --git a/vespalib/src/tests/placement-delete/CMakeLists.txt b/vespalib/src/tests/placement-delete/CMakeLists.txt
new file mode 100644
index 00000000000..289d5331a14
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_placement-delete_test_app
+ SOURCES
+ placement-delete.cpp
+ DEPENDS
+ vespalib
+)
+
+vespa_add_test(
+ NAME vespalib_placement-delete_test_app
+ NO_VALGRIND COMMAND vespalib_placement-delete_test_app
+ ENVIRONMENT "CXX_PROG=g++"
+)
diff --git a/vespalib/src/tests/placement-delete/DESC b/vespalib/src/tests/placement-delete/DESC
new file mode 100644
index 00000000000..49ef1e5fb3c
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/DESC
@@ -0,0 +1,4 @@
+This test checks whether gcc generates code to invoke placement delete
+when a templated placement new throws an exception. We expect this
+test to fail until gcc has been fixed to handle templated placement
+new correctly.
diff --git a/vespalib/src/tests/placement-delete/FILES b/vespalib/src/tests/placement-delete/FILES
new file mode 100644
index 00000000000..6214cb9fb02
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/FILES
@@ -0,0 +1,4 @@
+placement-delete.cpp
+hello.cpp
+fail.cpp
+undef.cpp
diff --git a/vespalib/src/tests/placement-delete/fail.cpp b/vespalib/src/tests/placement-delete/fail.cpp
new file mode 100644
index 00000000000..b6df97df6d4
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/fail.cpp
@@ -0,0 +1,2 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+This should not compile with any version of gcc...
diff --git a/vespalib/src/tests/placement-delete/hello.cpp b/vespalib/src/tests/placement-delete/hello.cpp
new file mode 100644
index 00000000000..aeab3a27762
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/hello.cpp
@@ -0,0 +1,7 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <stdio.h>
+
+int main () {
+ fprintf(stdout, "Hello World!\n");
+ return 0;
+}
diff --git a/vespalib/src/tests/placement-delete/placement-delete.cpp b/vespalib/src/tests/placement-delete/placement-delete.cpp
new file mode 100644
index 00000000000..0d1cb200110
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/placement-delete.cpp
@@ -0,0 +1,29 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/slaveproc.h>
+#include <vespa/vespalib/util/stringfmt.h>
+
+using namespace vespalib;
+
+bool checkCompile(const std::string &base) {
+ std::string out;
+ std::string gcc = getenv("CXX_PROG"); // TODO: override from environment
+ std::string cmd = make_string("%s -o %s %s.cpp 2>&1", gcc.c_str(), base.c_str(), base.c_str());
+ bool ok = SlaveProc::run(cmd.c_str(), out);
+ fprintf(stderr, "CMD: %s\n(compile output follows...)\n%s\n", cmd.c_str(), out.c_str());
+ return ok;
+}
+
+TEST("require that valid test program can be compiled") {
+ EXPECT_EQUAL(checkCompile("hello"), true);
+}
+
+TEST("require that bogus test program can not be compiled") {
+ EXPECT_EQUAL(checkCompile("fail"), false);
+}
+
+TEST("require that templated placement delete is instantiated resulting in a compile error") {
+ EXPECT_EQUAL(checkCompile("undef"), false);
+}
+
+TEST_MAIN_WITH_PROCESS_PROXY() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/placement-delete/undef.cpp b/vespalib/src/tests/placement-delete/undef.cpp
new file mode 100644
index 00000000000..c6ba20534f8
--- /dev/null
+++ b/vespalib/src/tests/placement-delete/undef.cpp
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+// This is a compile-time test which should fail because undef<T>
+// cannot be instantiated
+
+#include <stdlib.h>
+
+template <class T> class undef;
+
+struct A {
+ A() { throw 1; }
+};
+
+template<typename T> class Pool { };
+
+template<typename T>
+inline void *operator new(size_t size,Pool<T>& pool)
+{
+ return malloc(size);
+}
+
+template<typename T>
+inline void operator delete(void *p,Pool<T>& pool)
+{
+ undef<T> t;
+ free(p);
+}
+
+int main ()
+{
+ Pool<int> pool;
+ new (pool) A();
+ return 0;
+}
diff --git a/vespalib/src/tests/printable/.gitignore b/vespalib/src/tests/printable/.gitignore
new file mode 100644
index 00000000000..e001a281449
--- /dev/null
+++ b/vespalib/src/tests/printable/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+printabletest
+vespalib_printabletest_app
diff --git a/vespalib/src/tests/printable/CMakeLists.txt b/vespalib/src/tests/printable/CMakeLists.txt
new file mode 100644
index 00000000000..3aedbe7c011
--- /dev/null
+++ b/vespalib/src/tests/printable/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_printabletest_app
+ SOURCES
+ printabletest.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_printabletest_app COMMAND vespalib_printabletest_app)
diff --git a/vespalib/src/tests/printable/DESC b/vespalib/src/tests/printable/DESC
new file mode 100644
index 00000000000..a31bafc527f
--- /dev/null
+++ b/vespalib/src/tests/printable/DESC
@@ -0,0 +1 @@
+Unit test for the Printable class
diff --git a/vespalib/src/tests/printable/FILES b/vespalib/src/tests/printable/FILES
new file mode 100644
index 00000000000..a3f259414b5
--- /dev/null
+++ b/vespalib/src/tests/printable/FILES
@@ -0,0 +1 @@
+printabletest.cpp
diff --git a/vespalib/src/tests/printable/printabletest.cpp b/vespalib/src/tests/printable/printabletest.cpp
new file mode 100644
index 00000000000..638060ebf49
--- /dev/null
+++ b/vespalib/src/tests/printable/printabletest.cpp
@@ -0,0 +1,153 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/printable.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+struct Foo : public vespalib::Printable {
+ int val;
+ std::string other;
+
+ Foo(int v, std::string o) : val(v), other(o) {}
+
+ virtual void print(std::ostream& out, bool verbose = false,
+ const std::string& indent = "") const
+ {
+ out << "Foo(val = " << val;
+ if (verbose) {
+ out << ", other:\n" << indent << " " << other;
+ } else {
+ out << ", other size " << other.size();
+ }
+ out << ")";
+ }
+};
+
+struct Bar : public Foo {
+ int i;
+
+ Bar(int j, int v, std::string o) : Foo(v, o), i(j) {}
+
+ virtual void print(std::ostream& out, bool verbose = false,
+ const std::string& indent = "") const
+ {
+ out << "Bar(" << i << ")";
+ if (verbose) {
+ out << " : ";
+ Foo::print(out, verbose, indent + " ");
+ }
+ }
+};
+
+struct AsciiFoo : public vespalib::AsciiPrintable {
+ int val;
+
+ AsciiFoo(int v) : val(v) {}
+
+ virtual void print(vespalib::asciistream& out,
+ const PrintProperties& p) const
+ {
+ if (p.verbose()) {
+ out << "AsciiFoo(" << val << ")";
+ } else {
+ out << val;
+ }
+ }
+};
+
+struct AsciiBar : public vespalib::AsciiPrintable {
+ AsciiFoo _foo;
+
+ AsciiBar(int v) : _foo(v) {}
+
+ virtual void print(vespalib::asciistream& out,
+ const PrintProperties& p) const
+ {
+ if (p.verbose()) {
+ out << "AsciiBar() {"
+ << "\n" << p.indent(1);
+ _foo.print(out, p.indentedCopy());
+ out << "\n" << p.indent() << "}";
+ } else {
+ out << _foo;
+ }
+ }
+};
+
+class Test : public vespalib::TestApp
+{
+public:
+ void testSimple();
+ void testAsciiVariant();
+ int Main();
+};
+
+void
+Test::testSimple()
+{
+ Foo foo(3, "myval");
+ Bar bar(7, 3, "otherval");
+
+ EXPECT_EQUAL("Foo(val = 3, other size 5)", foo.toString());
+ EXPECT_EQUAL("Foo(val = 3, other size 5)", foo.toString(false, " "));
+ EXPECT_EQUAL("Foo(val = 3, other:\n"
+ " myval)", foo.toString(true));
+ EXPECT_EQUAL("Foo(val = 3, other:\n"
+ " myval)", foo.toString(true, " "));
+
+ std::ostringstream ost;
+ ost << foo;
+ EXPECT_EQUAL("Foo(val = 3, other size 5)", ost.str());
+
+ EXPECT_EQUAL("Bar(7)", bar.toString());
+ EXPECT_EQUAL("Bar(7)", bar.toString(false, " "));
+ EXPECT_EQUAL("Bar(7) : Foo(val = 3, other:\n"
+ " otherval)", bar.toString(true));
+ EXPECT_EQUAL("Bar(7) : Foo(val = 3, other:\n"
+ " otherval)", bar.toString(true, " "));
+}
+
+void
+Test::testAsciiVariant()
+{
+ AsciiFoo foo(19);
+
+ EXPECT_EQUAL("19", foo.toString());
+ EXPECT_EQUAL("AsciiFoo(19)",
+ foo.toString(vespalib::AsciiPrintable::VERBOSE));
+ {
+ vespalib::asciistream as;
+ as << foo;
+ EXPECT_EQUAL("19", as.str());
+
+ std::ostringstream ost;
+ ost << foo;
+ EXPECT_EQUAL("19", ost.str());
+ }
+
+ AsciiBar bar(3);
+ EXPECT_EQUAL("3", bar.toString());
+ EXPECT_EQUAL("AsciiBar() {\n"
+ " AsciiFoo(3)\n"
+ "}", bar.toString(vespalib::AsciiPrintable::VERBOSE));
+ {
+ vespalib::asciistream as;
+ as << bar;
+ EXPECT_EQUAL("3", as.str());
+
+ std::ostringstream ost;
+ ost << bar;
+ EXPECT_EQUAL("3", ost.str());
+ }
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("printabletest");
+ testSimple();
+ testAsciiVariant();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/priority_queue/.gitignore b/vespalib/src/tests/priority_queue/.gitignore
new file mode 100644
index 00000000000..7e902652509
--- /dev/null
+++ b/vespalib/src/tests/priority_queue/.gitignore
@@ -0,0 +1 @@
+vespalib_priority_queue_test_app
diff --git a/vespalib/src/tests/priority_queue/CMakeLists.txt b/vespalib/src/tests/priority_queue/CMakeLists.txt
new file mode 100644
index 00000000000..cd564bab0a1
--- /dev/null
+++ b/vespalib/src/tests/priority_queue/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_priority_queue_test_app
+ SOURCES
+ priority_queue_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_priority_queue_test_app COMMAND vespalib_priority_queue_test_app)
diff --git a/vespalib/src/tests/priority_queue/DESC b/vespalib/src/tests/priority_queue/DESC
new file mode 100644
index 00000000000..23ea3c779f5
--- /dev/null
+++ b/vespalib/src/tests/priority_queue/DESC
@@ -0,0 +1 @@
+priority_queue test. Take a look at priority_queue.cpp for details.
diff --git a/vespalib/src/tests/priority_queue/FILES b/vespalib/src/tests/priority_queue/FILES
new file mode 100644
index 00000000000..b5330f1a28a
--- /dev/null
+++ b/vespalib/src/tests/priority_queue/FILES
@@ -0,0 +1 @@
+priority_queue.cpp
diff --git a/vespalib/src/tests/priority_queue/priority_queue_test.cpp b/vespalib/src/tests/priority_queue/priority_queue_test.cpp
new file mode 100644
index 00000000000..fd37215db1c
--- /dev/null
+++ b/vespalib/src/tests/priority_queue/priority_queue_test.cpp
@@ -0,0 +1,191 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("priority_queue_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/priority_queue.h>
+
+using namespace vespalib;
+
+TEST("require that default priority order works") {
+ PriorityQueue<int> queue;
+ EXPECT_EQUAL(true, queue.empty());
+ EXPECT_EQUAL(0u, queue.size());
+ queue.push(5);
+ queue.push(3);
+ queue.push(7);
+ queue.push(10);
+ queue.push(2);
+ EXPECT_EQUAL(false, queue.empty());
+ EXPECT_EQUAL(5u, queue.size());
+ EXPECT_EQUAL(2, queue.front());
+ queue.front() = 6;
+ queue.adjust();
+ EXPECT_EQUAL(3, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(5, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(6, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(7, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(10, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(true, queue.empty());
+ EXPECT_EQUAL(0u, queue.size());
+}
+
+TEST("require that priority order can be specified") {
+ PriorityQueue<int, std::greater<int> > queue;
+ EXPECT_EQUAL(true, queue.empty());
+ EXPECT_EQUAL(0u, queue.size());
+ queue.push(5);
+ queue.push(3);
+ queue.push(7);
+ queue.push(10);
+ queue.push(2);
+ EXPECT_EQUAL(false, queue.empty());
+ EXPECT_EQUAL(5u, queue.size());
+ EXPECT_EQUAL(10, queue.front());
+ queue.front() = 6;
+ queue.adjust();
+ EXPECT_EQUAL(7, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(6, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(5, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(3, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(2, queue.front());
+ queue.pop_front();
+ EXPECT_EQUAL(true, queue.empty());
+ EXPECT_EQUAL(0u, queue.size());
+}
+
+TEST("require that a random item can be accessed and removed") {
+ size_t n = 100;
+ PriorityQueue<int> queue;
+ std::vector<int> seen(100, 0);
+ for (size_t i = 0; i < n; ++i) {
+ queue.push(i);
+ }
+ EXPECT_EQUAL(n, queue.size());
+ for (size_t i = 0; i < n; ++i) {
+ ++seen[queue.any()];
+ queue.pop_any();
+ }
+ EXPECT_TRUE(queue.empty());
+ for (size_t i = 0; i < n; ++i) {
+ EXPECT_EQUAL(1, seen[i]);
+ }
+}
+
+struct MyCmp {
+ int *ref;
+ MyCmp(int *r) : ref(r) {}
+ bool operator()(const int &a, const int &b) {
+ return (ref[a] < ref[b]);
+ }
+};
+
+TEST("require that the comparator can have state") {
+ std::vector<int> ref(5);
+ PriorityQueue<int, MyCmp> queue(MyCmp(&ref.front()));
+ ref[3] = 1;
+ ref[2] = 2;
+ ref[0] = 3;
+ ref[4] = 4;
+ ref[1] = 5;
+ queue.push(0);
+ queue.push(1);
+ queue.push(2);
+ queue.push(3);
+ queue.push(4);
+ ASSERT_EQUAL(5u, queue.size());
+ EXPECT_EQUAL(3, queue.front()); queue.pop_front();
+ EXPECT_EQUAL(2, queue.front()); queue.pop_front();
+ EXPECT_EQUAL(0, queue.front()); queue.pop_front();
+ EXPECT_EQUAL(4, queue.front()); queue.pop_front();
+ EXPECT_EQUAL(1, queue.front()); queue.pop_front();
+}
+
+TEST("require that the heap algorithm can be changed") {
+ PriorityQueue<int, std::less<int>, LeftArrayHeap> queue;
+ for (int i = 99; i >= 0; --i) {
+ queue.push(i);
+ }
+ EXPECT_EQUAL(0, queue.front());
+ ASSERT_EQUAL(100u, queue.size());
+ for (int i = 0; i < 100; ++i) {
+ EXPECT_EQUAL(queue.front(), queue.any());
+ EXPECT_EQUAL(i, queue.front()); queue.pop_front();
+ }
+}
+
+typedef std::unique_ptr<int> int_up;
+int_up wrap(int value) { return int_up(new int(value)); }
+struct CmpIntUp {
+ bool operator()(const int_up &a, const int_up &b) const {
+ return (*a < *b);
+ }
+};
+
+TEST("require that priority queue works with move-only objects") {
+ PriorityQueue<int_up, CmpIntUp> queue;
+ queue.push(wrap(5));
+ queue.push(wrap(3));
+ queue.push(wrap(7));
+ queue.push(wrap(10));
+ queue.push(wrap(2));
+ std::vector<int_up> stash;
+ stash.push_back(std::move(queue.front())); queue.pop_front();
+ stash.push_back(std::move(queue.front())); queue.pop_front();
+ stash.push_back(std::move(queue.front())); queue.pop_front();
+ stash.push_back(std::move(queue.front())); queue.pop_front();
+ stash.push_back(std::move(queue.front())); queue.pop_front();
+ ASSERT_EQUAL(5u, stash.size());
+ EXPECT_EQUAL(2, *stash[0]);
+ EXPECT_EQUAL(3, *stash[1]);
+ EXPECT_EQUAL(5, *stash[2]);
+ EXPECT_EQUAL(7, *stash[3]);
+ EXPECT_EQUAL(10, *stash[4]);
+}
+
+struct MyItem {
+ int value;
+ int *ref;
+ MyItem(int v, int &r) : value(v), ref(&r) {}
+ MyItem(const MyItem &) = delete;
+ MyItem &operator=(const MyItem &) = delete;
+ MyItem(MyItem &&rhs) : value(rhs.value), ref(rhs.ref) { rhs.ref = 0; }
+ MyItem &operator=(MyItem &&rhs) {
+ value = rhs.value;
+ ref = rhs.ref;
+ rhs.ref = 0;
+ return *this;
+ }
+ ~MyItem() {
+ if (ref != 0) {
+ ++(*ref);
+ }
+ }
+ bool operator<(const MyItem &rhs) const { return (value < rhs.value); }
+};
+
+TEST("require that pop'ed elements are destructed") {
+ PriorityQueue<MyItem> queue;
+ int cnt = 0;
+ queue.push(MyItem(5, cnt));
+ queue.push(MyItem(7, cnt));
+ queue.push(MyItem(3, cnt));
+ EXPECT_EQUAL(0, cnt);
+ queue.pop_front();
+ EXPECT_EQUAL(1, cnt);
+ queue.pop_any();
+ EXPECT_EQUAL(2, cnt);
+ queue.pop_front();
+ EXPECT_EQUAL(3, cnt);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/random/.gitignore b/vespalib/src/tests/random/.gitignore
new file mode 100644
index 00000000000..9ced3097198
--- /dev/null
+++ b/vespalib/src/tests/random/.gitignore
@@ -0,0 +1,6 @@
+.depend
+Makefile
+Tr.class
+random_test
+vespalib_friendfinder_test_app
+vespalib_random_test_app
diff --git a/vespalib/src/tests/random/CMakeLists.txt b/vespalib/src/tests/random/CMakeLists.txt
new file mode 100644
index 00000000000..52c25dbdf07
--- /dev/null
+++ b/vespalib/src/tests/random/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_random_test_app
+ SOURCES
+ random_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_random_test_app COMMAND vespalib_random_test_app)
+vespa_add_executable(vespalib_friendfinder_test_app
+ SOURCES
+ friendfinder.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/random/DESC b/vespalib/src/tests/random/DESC
new file mode 100644
index 00000000000..d537e371951
--- /dev/null
+++ b/vespalib/src/tests/random/DESC
@@ -0,0 +1 @@
+random test. Take a look at random.cpp for details.
diff --git a/vespalib/src/tests/random/FILES b/vespalib/src/tests/random/FILES
new file mode 100644
index 00000000000..cf5d85ad45a
--- /dev/null
+++ b/vespalib/src/tests/random/FILES
@@ -0,0 +1 @@
+random.cpp
diff --git a/vespalib/src/tests/random/Tr.java b/vespalib/src/tests/random/Tr.java
new file mode 100644
index 00000000000..cda6a5b0861
--- /dev/null
+++ b/vespalib/src/tests/random/Tr.java
@@ -0,0 +1,13 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+import java.util.*;
+
+class Tr
+{
+ public static void main(String[] args) {
+ Random rng = new Random(1);
+ for (int i=0; i<10; i++) {
+ double d = rng.nextDouble();
+ System.out.println("double["+i+"] = "+d);
+ }
+ }
+}
diff --git a/vespalib/src/tests/random/friendfinder.cpp b/vespalib/src/tests/random/friendfinder.cpp
new file mode 100644
index 00000000000..3a8070ccf2c
--- /dev/null
+++ b/vespalib/src/tests/random/friendfinder.cpp
@@ -0,0 +1,58 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/random.h>
+#include <math.h>
+#include <stdio.h>
+#include <vespa/vespalib/stllike/string.h>
+
+int main(int argc, char **argv)
+{
+ vespalib::RandomGen rnd(1);
+
+ double logmean = log(1000.0);
+ double lstddev = log(2.0);
+
+ if (argc > 2) {
+ lstddev = log(strtod(argv[--argc], NULL));
+ logmean = log(strtod(argv[--argc], NULL));
+ } else if (argc > 1) {
+ logmean = log(strtod(argv[--argc], NULL));
+ }
+
+ fprintf(stderr, "100 typical friendlist sizes: ");
+ for (int i = 0; i < 100; ++i) {
+ int32_t want = (uint32_t)exp(rnd.nextNormal(logmean, lstddev));
+ fprintf(stderr, " %u", want);
+ }
+ fprintf(stderr, "\n");
+
+ uint32_t person = 0;
+ while (!feof(stdin)) {
+ ++person;
+ std::vector<vespalib::string> friends;
+ int32_t want = (uint32_t)exp(rnd.nextNormal(logmean, lstddev));
+ if (want < 17) want = (uint32_t)(exp(logmean)+0.99);
+ if (want < 1) want = 1;
+
+ printf("me: %u friends:", person);
+ while (want > 0) {
+ char line[100];
+ if (fgets(line, 100, stdin) == NULL) {
+ break;
+ }
+ if (rnd.nextUint32() % 42 == 17) {
+ vespalib::string s(line);
+ s.chomp();
+ friends.push_back(s);
+ --want;
+ }
+ }
+ while (!friends.empty()) {
+ printf(" %s", friends.back().c_str());
+ friends.pop_back();
+ }
+ printf("\n");
+ fflush(stdout);
+ }
+}
+
diff --git a/vespalib/src/tests/random/random_test.cpp b/vespalib/src/tests/random/random_test.cpp
new file mode 100644
index 00000000000..0c8d24abc11
--- /dev/null
+++ b/vespalib/src/tests/random/random_test.cpp
@@ -0,0 +1,166 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("random_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/random.h>
+
+using namespace vespalib;
+
+
+class Test : public vespalib::TestApp
+{
+public:
+ int getFive() { return 5; }
+ void testJavaCompatibility();
+ void testFloatingPoint();
+ void testNormalDistribution();
+ int Main();
+};
+
+bool eqD(double a, double b) {
+ if (a == b) return true;
+ printf("is %f approx equal to %f ?\n", a, b);
+ if ((a + 1.0e-9) > b && b > (a - 1.0e-9)) return true;
+ return false;
+}
+
+void
+Test::testJavaCompatibility()
+{
+ RandomGen rnd(1);
+
+ EXPECT_TRUE(rnd.nextInt32() == -1155869325);
+ EXPECT_TRUE(rnd.nextInt32() == 431529176);
+ EXPECT_TRUE(rnd.nextInt32() == 1761283695);
+ EXPECT_TRUE(rnd.nextInt32() == 1749940626);
+ EXPECT_TRUE(rnd.nextInt32() == 892128508);
+ EXPECT_TRUE(rnd.nextInt32() == 155629808);
+ EXPECT_TRUE(rnd.nextInt32() == 1429008869);
+ EXPECT_TRUE(rnd.nextInt32() == -1465154083);
+ EXPECT_TRUE(rnd.nextInt32() == -138487339);
+ EXPECT_TRUE(rnd.nextInt32() == -1242363800);
+ EXPECT_TRUE(rnd.nextInt32() == 26273138);
+ EXPECT_TRUE(rnd.nextInt32() == 655996946);
+
+ rnd.setSeed(1);
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.7308781907032909));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.41008081149220166));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.20771484130971707));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.3327170559595112));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.9677559094241207));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.006117182265761301));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.9637047970232077));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.9398653887819098));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.9471949176631939));
+ EXPECT_TRUE(eqD(rnd.nextDouble(), 0.9370821488959696));
+
+ RandomGen rnd2(-1);
+ EXPECT_TRUE(rnd2.nextInt32() == 1155099827);
+ EXPECT_TRUE(rnd2.nextInt32() == 1887904451);
+ EXPECT_TRUE(rnd2.nextInt32() == 52699159);
+
+ rnd2.setSeed(-1);
+ EXPECT_TRUE(rnd2.nextInt32() == 1155099827);
+ EXPECT_TRUE(rnd2.nextInt32() == 1887904451);
+ EXPECT_TRUE(rnd2.nextInt32() == 52699159);
+}
+
+void
+Test::testFloatingPoint()
+{
+ RandomGen rnd;
+
+ int buckets[100];
+ for (int b = 0; b < 100; b++) {
+ buckets[b] = 0;
+ }
+ for (int i = 0; i < 100000; i++) {
+ double foo = rnd.nextDouble() * 100.0;
+ int b = (int)foo;
+ EXPECT_TRUE(b >= 0);
+ EXPECT_TRUE(b < 100);
+ if (b >= 0 && b < 100) ++buckets[b];
+ }
+ for (int b = 0; b < 100; b++) {
+ // note that it's *possible* for this to fail:
+ EXPECT_TRUE(buckets[b] > 800);
+ EXPECT_TRUE(buckets[b] < 1200);
+ // printf("bucket[%d] = %d\n", b, buckets[b]);
+ }
+}
+
+void
+Test::testNormalDistribution()
+{
+ RandomGen rnd;
+
+ int buckets[101];
+ for (int b = 0; b < 101; b++) {
+ buckets[b] = 0;
+ }
+
+ const int sum = 10000000;
+ int oor = 0;
+ for (int i = 0; i < sum; i++) {
+ double foo = rnd.nextNormal(50, 13);
+ int idx = (int)(foo+0.5);
+ if (foo < 0) {
+ ++oor;
+ idx = 0;
+ }
+ if (foo > 100) {
+ ++oor;
+ idx = 100;
+ }
+ buckets[idx]++;
+ }
+ EXPECT_TRUE(oor < 0.001 * sum);
+ printf("out of range of normal distribution: %d / %d\n", oor, sum);
+
+ printf("histogram in form:\nbucket\tnum\n>>> begin >>>\n");
+ for (int b = 0; b < 101; b++) {
+ printf("%d\t%d\n", b, buckets[b]);
+ }
+ printf("<<< end histogram <<<\n");
+
+ EXPECT_TRUE(buckets[50] > buckets[45]);
+ EXPECT_TRUE(buckets[45] > buckets[40]);
+ EXPECT_TRUE(buckets[40] > buckets[35]);
+ EXPECT_TRUE(buckets[35] > buckets[30]);
+ EXPECT_TRUE(buckets[30] > buckets[25]);
+ EXPECT_TRUE(buckets[25] > buckets[20]);
+ EXPECT_TRUE(buckets[20] > buckets[15]);
+ EXPECT_TRUE(buckets[15] > buckets[10]);
+ EXPECT_TRUE(buckets[10] > buckets[5]);
+ EXPECT_TRUE(buckets[5] > buckets[1]);
+
+ EXPECT_TRUE(buckets[50] > buckets[55]);
+ EXPECT_TRUE(buckets[55] > buckets[60]);
+ EXPECT_TRUE(buckets[60] > buckets[65]);
+ EXPECT_TRUE(buckets[65] > buckets[70]);
+ EXPECT_TRUE(buckets[70] > buckets[75]);
+ EXPECT_TRUE(buckets[75] > buckets[80]);
+ EXPECT_TRUE(buckets[80] > buckets[85]);
+ EXPECT_TRUE(buckets[85] > buckets[90]);
+ EXPECT_TRUE(buckets[90] > buckets[95]);
+ EXPECT_TRUE(buckets[95] > buckets[99]);
+
+ // not too fat tails:
+ EXPECT_TRUE(buckets[10] > buckets[0]);
+ EXPECT_TRUE(buckets[90] > buckets[100]);
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("random_test");
+ testJavaCompatibility();
+ TEST_FLUSH();
+ testFloatingPoint();
+ TEST_FLUSH();
+ testNormalDistribution();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/referencecounter/.gitignore b/vespalib/src/tests/referencecounter/.gitignore
new file mode 100644
index 00000000000..7c753a29fab
--- /dev/null
+++ b/vespalib/src/tests/referencecounter/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+referencecounter_test
+vespalib_referencecounter_test_app
diff --git a/vespalib/src/tests/referencecounter/CMakeLists.txt b/vespalib/src/tests/referencecounter/CMakeLists.txt
new file mode 100644
index 00000000000..4a259f9a4d3
--- /dev/null
+++ b/vespalib/src/tests/referencecounter/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_referencecounter_test_app
+ SOURCES
+ referencecounter_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_referencecounter_test_app COMMAND vespalib_referencecounter_test_app)
diff --git a/vespalib/src/tests/referencecounter/DESC b/vespalib/src/tests/referencecounter/DESC
new file mode 100644
index 00000000000..02cd2640474
--- /dev/null
+++ b/vespalib/src/tests/referencecounter/DESC
@@ -0,0 +1 @@
+referencecounter test. Take a look at referencecounter.cpp for details.
diff --git a/vespalib/src/tests/referencecounter/FILES b/vespalib/src/tests/referencecounter/FILES
new file mode 100644
index 00000000000..1a7fbcaed46
--- /dev/null
+++ b/vespalib/src/tests/referencecounter/FILES
@@ -0,0 +1 @@
+referencecounter.cpp
diff --git a/vespalib/src/tests/referencecounter/referencecounter_test.cpp b/vespalib/src/tests/referencecounter/referencecounter_test.cpp
new file mode 100644
index 00000000000..6f510f1f2a5
--- /dev/null
+++ b/vespalib/src/tests/referencecounter/referencecounter_test.cpp
@@ -0,0 +1,57 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("referencecounter_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/referencecounter.h>
+
+struct Data
+{
+ int ctorCnt;
+ int dtorCnt;
+ Data() : ctorCnt(0), dtorCnt(0) {}
+};
+
+class DataRef : public vespalib::ReferenceCounter
+{
+private:
+ Data &_d;
+ DataRef(const DataRef &);
+ DataRef &operator=(const DataRef &);
+public:
+ DataRef(Data &d) : _d(d) { ++d.ctorCnt; }
+ ~DataRef() { ++_d.dtorCnt; }
+ int getCtorCnt() const { return _d.ctorCnt; }
+ int getDtorCnt() const { return _d.dtorCnt; }
+};
+
+using namespace vespalib;
+
+TEST_SETUP(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("referencecounter_test");
+
+ Data data;
+ {
+ DataRef *pt1 = new DataRef(data);
+
+ EXPECT_TRUE(pt1->refCount() == 1);
+
+ DataRef *pt2 = pt1;
+ pt2->addRef();
+
+ EXPECT_TRUE(pt1->refCount() == 2);
+
+ EXPECT_TRUE(data.ctorCnt == 1);
+ EXPECT_TRUE(data.dtorCnt == 0);
+ pt1->subRef();
+ EXPECT_TRUE(pt1->refCount() == 1);
+ pt2->subRef();
+ }
+ EXPECT_TRUE(data.ctorCnt == 1);
+ EXPECT_TRUE(data.dtorCnt == 1);
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/regex/.gitignore b/vespalib/src/tests/regex/.gitignore
new file mode 100644
index 00000000000..47c65067630
--- /dev/null
+++ b/vespalib/src/tests/regex/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+regex_test
+vespalib_regex_test_app
diff --git a/vespalib/src/tests/regex/CMakeLists.txt b/vespalib/src/tests/regex/CMakeLists.txt
new file mode 100644
index 00000000000..a1fcc2c5bdf
--- /dev/null
+++ b/vespalib/src/tests/regex/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_regex_test_app
+ SOURCES
+ regex.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_regex_test_app COMMAND vespalib_regex_test_app)
diff --git a/vespalib/src/tests/regex/DESC b/vespalib/src/tests/regex/DESC
new file mode 100644
index 00000000000..dee3f1700f3
--- /dev/null
+++ b/vespalib/src/tests/regex/DESC
@@ -0,0 +1 @@
+regex test. Take a look at regex.cpp for details.
diff --git a/vespalib/src/tests/regex/FILES b/vespalib/src/tests/regex/FILES
new file mode 100644
index 00000000000..62223684cbd
--- /dev/null
+++ b/vespalib/src/tests/regex/FILES
@@ -0,0 +1 @@
+regex.cpp
diff --git a/vespalib/src/tests/regex/regex.cpp b/vespalib/src/tests/regex/regex.cpp
new file mode 100644
index 00000000000..dbcb8c27c6f
--- /dev/null
+++ b/vespalib/src/tests/regex/regex.cpp
@@ -0,0 +1,128 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+#include <vespa/vespalib/util/regexp.h>
+#include <vespa/vespalib/util/exception.h>
+
+using namespace vespalib;
+
+TEST("require that empty expression works as expected") {
+ Regexp empty("");
+ EXPECT_TRUE(empty.match(""));
+ EXPECT_TRUE(empty.match("foo"));
+ EXPECT_TRUE(empty.match("bar"));
+}
+
+TEST("require that substring expression works as expected") {
+ Regexp re("foo");
+ EXPECT_TRUE(re.match("foo"));
+ EXPECT_TRUE(re.match("afoob"));
+ EXPECT_TRUE(re.match("foo foo"));
+ EXPECT_FALSE(re.match("bar"));
+ EXPECT_FALSE(re.match("fobaroo"));
+}
+
+TEST("require that it is default case sentive") {
+ Regexp re("foo");
+ EXPECT_TRUE(re.match("foo"));
+ EXPECT_FALSE(re.match("fOo"));
+}
+
+TEST("require that it is case insentive") {
+ Regexp re("foo", Regexp::Flags().enableICASE());
+ EXPECT_TRUE(re.match("foo"));
+ EXPECT_TRUE(re.match("fOo"));
+}
+
+TEST("require that invalid expression fails compilation") {
+ try {
+ Regexp bad("[unbalanced");
+ EXPECT_TRUE(false);
+ } catch (Exception& e) {
+ EXPECT_TRUE(true);
+ fprintf(stderr, "got: %s\n", e.getMessage().c_str());
+ }
+}
+
+TEST("require that replace works") {
+ Regexp rep("foo");
+ EXPECT_EQUAL(vespalib::string(""), rep.replace("", "bc"));
+ EXPECT_EQUAL(vespalib::string("a"), rep.replace("a", "bc"));
+ EXPECT_EQUAL(vespalib::string("bc"), rep.replace("foo", "bc"));
+ EXPECT_EQUAL(vespalib::string("abc"), rep.replace("afoo", "bc"));
+ EXPECT_EQUAL(vespalib::string("abcd"), rep.replace("afood", "bc"));
+ EXPECT_EQUAL(vespalib::string("abcdbc"), rep.replace("afoodfoo", "bc"));
+ EXPECT_EQUAL(vespalib::string("abcdbcbc"), rep.replace("afoodfoofoo", "bc"));
+}
+
+TEST("require that prefix detection works") {
+ EXPECT_EQUAL("", Regexp::get_prefix(""));
+ EXPECT_EQUAL("", Regexp::get_prefix("foo"));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo"));
+ EXPECT_EQUAL("", Regexp::get_prefix("^foo|bar"));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo$"));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo[a-z]"));
+ EXPECT_EQUAL("fo", Regexp::get_prefix("^foo{0,1}"));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo."));
+ EXPECT_EQUAL("fo", Regexp::get_prefix("^foo*"));
+ EXPECT_EQUAL("fo", Regexp::get_prefix("^foo?"));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo+"));
+}
+
+TEST("require that prefix detection sometimes underestimates the prefix size") {
+ EXPECT_EQUAL("", Regexp::get_prefix("^^foo"));
+ EXPECT_EQUAL("", Regexp::get_prefix("^foo(bar|baz)"));
+ EXPECT_EQUAL("fo", Regexp::get_prefix("^foo{1,2}"));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo\\."));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo(bar)"));
+ EXPECT_EQUAL("", Regexp::get_prefix("(^foo)"));
+ EXPECT_EQUAL("", Regexp::get_prefix("^(foo)"));
+ EXPECT_EQUAL("foo", Regexp::get_prefix("^foo[a]"));
+ EXPECT_EQUAL("", Regexp::get_prefix("^foo|^foobar"));
+}
+
+const vespalib::string special("^|()[]{}.*?+\\$");
+
+struct ExprFixture {
+ std::vector<vespalib::string> expressions;
+ ExprFixture() {
+ expressions.push_back(special);
+ for (char c: special) {
+ expressions.push_back(vespalib::string(&c, 1));
+ }
+ expressions.push_back("abc");
+ expressions.push_back("[:digit:]");
+ }
+};
+
+TEST_F("require that regexp can be made from prefix string", ExprFixture()) {
+ for (vespalib::string str: f1.expressions) {
+ Regexp re(Regexp::make_from_prefix(str));
+ EXPECT_TRUE(re.match(str));
+ EXPECT_TRUE(re.match(str + "foo"));
+ EXPECT_FALSE(re.match("foo" + str));
+ EXPECT_FALSE(re.match("foo" + str + "bar"));
+ }
+}
+
+TEST_F("require that regexp can be made from suffix string", ExprFixture()) {
+ for (vespalib::string str: f1.expressions) {
+ Regexp re(Regexp::make_from_suffix(str));
+ EXPECT_TRUE(re.match(str));
+ EXPECT_FALSE(re.match(str + "foo"));
+ EXPECT_TRUE(re.match("foo" + str));
+ EXPECT_FALSE(re.match("foo" + str + "bar"));
+ }
+}
+
+TEST_F("require that regexp can be made from substring string", ExprFixture()) {
+ for (vespalib::string str: f1.expressions) {
+ Regexp re(Regexp::make_from_substring(str));
+ EXPECT_TRUE(re.match(str));
+ EXPECT_TRUE(re.match(str + "foo"));
+ EXPECT_TRUE(re.match("foo" + str));
+ EXPECT_TRUE(re.match("foo" + str + "bar"));
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/rendezvous/.gitignore b/vespalib/src/tests/rendezvous/.gitignore
new file mode 100644
index 00000000000..6705aa9998e
--- /dev/null
+++ b/vespalib/src/tests/rendezvous/.gitignore
@@ -0,0 +1 @@
+vespalib_rendezvous_test_app
diff --git a/vespalib/src/tests/rendezvous/CMakeLists.txt b/vespalib/src/tests/rendezvous/CMakeLists.txt
new file mode 100644
index 00000000000..f99ff6ab175
--- /dev/null
+++ b/vespalib/src/tests/rendezvous/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_rendezvous_test_app
+ SOURCES
+ rendezvous_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_rendezvous_test_app COMMAND vespalib_rendezvous_test_app)
diff --git a/vespalib/src/tests/rendezvous/FILES b/vespalib/src/tests/rendezvous/FILES
new file mode 100644
index 00000000000..900f67d7d89
--- /dev/null
+++ b/vespalib/src/tests/rendezvous/FILES
@@ -0,0 +1 @@
+rendezvous_test.cpp
diff --git a/vespalib/src/tests/rendezvous/rendezvous_test.cpp b/vespalib/src/tests/rendezvous/rendezvous_test.cpp
new file mode 100644
index 00000000000..4e8ff50397e
--- /dev/null
+++ b/vespalib/src/tests/rendezvous/rendezvous_test.cpp
@@ -0,0 +1,85 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/rendezvous.h>
+#include <utility>
+
+using namespace vespalib;
+
+struct Value {
+ size_t value;
+ Value() : value(42) {}
+};
+
+template <typename T>
+struct Empty : Rendezvous<int, T> {
+ Empty(size_t n) : Rendezvous<int, T>(n) {}
+ virtual void mingle() {}
+ T meet() { return this->rendezvous(0); }
+};
+
+struct Add : Rendezvous<int, std::pair<int, int> > {
+ Add(size_t n) : Rendezvous<int, std::pair<int, int> >(n) {}
+ virtual void mingle() {
+ int sum = 0;
+ for (size_t i = 0; i < size(); ++i) {
+ sum += in(i);
+ }
+ for (size_t i = 0; i < size(); ++i) {
+ out(i) = std::make_pair(sum, in(0));
+ }
+ }
+};
+
+TEST("require that creating an empty rendezvous will fail") {
+ EXPECT_EXCEPTION(Add(0), IllegalArgumentException, "");
+}
+
+TEST_F("require that a single thread can mingle with itself within a rendezvous", Add(1)) {
+ EXPECT_EQUAL(10, f1.rendezvous(10).first);
+ EXPECT_EQUAL(20, f1.rendezvous(20).first);
+ EXPECT_EQUAL(30, f1.rendezvous(30).first);
+}
+
+TEST_MT_F("require that rendezvous can mingle multiple threads", 10, Add(num_threads)) {
+ EXPECT_EQUAL(45, f1.rendezvous(thread_id).first);
+}
+
+typedef Empty<Value> Empty1;
+typedef Empty<size_t> Empty2;
+TEST_MT_FF("require that unset rendezvous outputs are default constructed", 10, Empty1(num_threads), Empty2(num_threads)) {
+ EXPECT_EQUAL(42u, f1.meet().value);
+ EXPECT_EQUAL(0u, f2.meet());
+}
+
+TEST_MT_FF("require that mingle is not called until all threads are present", 3, Add(num_threads),
+ CountDownLatch(num_threads - 1))
+{
+ if (thread_id == 0) {
+ EXPECT_FALSE(f2.await(20));
+ EXPECT_EQUAL(3, f1.rendezvous(thread_id).first);
+ EXPECT_TRUE(f2.await(25000));
+ } else {
+ EXPECT_EQUAL(3, f1.rendezvous(thread_id).first);
+ f2.countDown();
+ }
+}
+
+TEST_MT_F("require that rendezvous can be used multiple times", 10, Add(num_threads)) {
+ EXPECT_EQUAL(45, f1.rendezvous(thread_id).first);
+ EXPECT_EQUAL(45, f1.rendezvous(thread_id).first);
+ EXPECT_EQUAL(45, f1.rendezvous(thread_id).first);
+ EXPECT_EQUAL(45, f1.rendezvous(thread_id).first);
+ EXPECT_EQUAL(45, f1.rendezvous(thread_id).first);
+}
+
+TEST_MT_FF("require that rendezvous can be run with additional threads", 100, Add(10), CountDownLatch(10)) {
+ std::pair<int, int> res = f1.rendezvous(thread_id);
+ TEST_BARRIER();
+ if (size_t(res.second) == thread_id) {
+ EXPECT_EQUAL(4950, f1.rendezvous(res.first).first);
+ f2.countDown();
+ }
+ EXPECT_TRUE(f2.await(25000));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/runnable_pair/.gitignore b/vespalib/src/tests/runnable_pair/.gitignore
new file mode 100644
index 00000000000..d5ea132e389
--- /dev/null
+++ b/vespalib/src/tests/runnable_pair/.gitignore
@@ -0,0 +1 @@
+vespalib_runnable_pair_test_app
diff --git a/vespalib/src/tests/runnable_pair/CMakeLists.txt b/vespalib/src/tests/runnable_pair/CMakeLists.txt
new file mode 100644
index 00000000000..15374cd7993
--- /dev/null
+++ b/vespalib/src/tests/runnable_pair/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_runnable_pair_test_app
+ SOURCES
+ runnable_pair_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_runnable_pair_test_app COMMAND vespalib_runnable_pair_test_app)
diff --git a/vespalib/src/tests/runnable_pair/FILES b/vespalib/src/tests/runnable_pair/FILES
new file mode 100644
index 00000000000..42c0ee819df
--- /dev/null
+++ b/vespalib/src/tests/runnable_pair/FILES
@@ -0,0 +1 @@
+runnable_pair_test.cpp
diff --git a/vespalib/src/tests/runnable_pair/runnable_pair_test.cpp b/vespalib/src/tests/runnable_pair/runnable_pair_test.cpp
new file mode 100644
index 00000000000..c2ba5b3dc91
--- /dev/null
+++ b/vespalib/src/tests/runnable_pair/runnable_pair_test.cpp
@@ -0,0 +1,30 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/runnable_pair.h>
+
+using namespace vespalib;
+
+struct Add : public Runnable {
+ int &val;
+ Add(int &v) : val(v) {}
+ virtual void run() { val += 10; }
+};
+
+struct Mul : public Runnable {
+ int &val;
+ Mul(int &v) : val(v) {}
+ virtual void run() { val *= 10; }
+};
+
+TEST("require that runnable pair runs runnables in order") {
+ int value = 0;
+ Add add(value);
+ Mul mul(value);
+ RunnablePair pair(add, mul);
+ EXPECT_EQUAL(0, value);
+ pair.run();
+ EXPECT_EQUAL(100, value);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/rwlock/.gitignore b/vespalib/src/tests/rwlock/.gitignore
new file mode 100644
index 00000000000..3ba74c11b14
--- /dev/null
+++ b/vespalib/src/tests/rwlock/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+rwlock_test
+vespalib_rwlock_test_app
diff --git a/vespalib/src/tests/rwlock/CMakeLists.txt b/vespalib/src/tests/rwlock/CMakeLists.txt
new file mode 100644
index 00000000000..bc769c78c3d
--- /dev/null
+++ b/vespalib/src/tests/rwlock/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_rwlock_test_app
+ SOURCES
+ rwlock_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_rwlock_test_app COMMAND vespalib_rwlock_test_app)
diff --git a/vespalib/src/tests/rwlock/DESC b/vespalib/src/tests/rwlock/DESC
new file mode 100644
index 00000000000..c7ab74fdc6e
--- /dev/null
+++ b/vespalib/src/tests/rwlock/DESC
@@ -0,0 +1 @@
+rwlock test. Take a look at rwlock.cpp for details.
diff --git a/vespalib/src/tests/rwlock/FILES b/vespalib/src/tests/rwlock/FILES
new file mode 100644
index 00000000000..60b69a08e68
--- /dev/null
+++ b/vespalib/src/tests/rwlock/FILES
@@ -0,0 +1 @@
+rwlock.cpp
diff --git a/vespalib/src/tests/rwlock/rwlock_test.cpp b/vespalib/src/tests/rwlock/rwlock_test.cpp
new file mode 100644
index 00000000000..b4e5bd1f98f
--- /dev/null
+++ b/vespalib/src/tests/rwlock/rwlock_test.cpp
@@ -0,0 +1,80 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("rwlock_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/rwlock.h>
+
+using namespace vespalib;
+
+class RWLockTest : public TestApp
+{
+public:
+ int Main();
+ static RWLockReader rbvReader(RWLock & lock) { RWLockReader r(lock); return r; }
+ static RWLockWriter rbvWriter(RWLock & lock) { RWLockWriter r(lock); return r; }
+};
+
+
+int
+RWLockTest::Main()
+{
+ TEST_INIT("rwlock_test");
+
+ RWLock lock;
+ EXPECT_TRUE(lock._givenLocks == 0);
+ {
+ EXPECT_TRUE(lock._givenLocks == 0);
+ RWLockReader r1(lock);
+ EXPECT_TRUE(lock._givenLocks == 1);
+ RWLockReader r2(lock);
+ EXPECT_TRUE(lock._givenLocks == 2);
+ RWLockReader r3(lock);
+ EXPECT_TRUE(lock._givenLocks == 3);
+ }
+ EXPECT_TRUE(lock._givenLocks == 0);
+ {
+ EXPECT_TRUE(lock._givenLocks == 0);
+ RWLockWriter w(lock);
+ EXPECT_TRUE(lock._givenLocks == -1);
+ }
+ EXPECT_TRUE(lock._givenLocks == 0);
+ {
+ RWLockReader rbv(rbvReader(lock));
+ EXPECT_TRUE(lock._givenLocks == 1);
+ RWLockReader copy(rbv);
+ EXPECT_TRUE(lock._givenLocks == 1);
+ RWLockReader copy2(copy);
+ EXPECT_TRUE(lock._givenLocks == 1);
+ }
+ EXPECT_TRUE(lock._givenLocks == 0);
+ {
+ RWLock lock2;
+ RWLockReader copy(rbvReader(lock));
+ EXPECT_TRUE(lock._givenLocks == 1);
+ RWLockReader copy2(rbvReader(lock2));
+ EXPECT_TRUE(lock._givenLocks == 1);
+ EXPECT_TRUE(lock2._givenLocks == 1);
+ RWLockReader rbv(rbvReader(lock));
+ EXPECT_TRUE(lock._givenLocks == 2);
+ copy=rbv;
+ EXPECT_TRUE(lock._givenLocks == 1);
+ copy2=copy;
+ EXPECT_TRUE(lock2._givenLocks == 0);
+ EXPECT_TRUE(lock._givenLocks == 1);
+ }
+ EXPECT_TRUE(lock._givenLocks == 0);
+ {
+ RWLockWriter rbv(rbvWriter(lock));
+ EXPECT_TRUE(lock._givenLocks == -1);
+ RWLockWriter copy(rbv);
+ EXPECT_TRUE(lock._givenLocks == -1);
+ RWLockWriter copy2(copy);
+ EXPECT_TRUE(lock._givenLocks == -1);
+ }
+ EXPECT_TRUE(lock._givenLocks == 0);
+
+ TEST_DONE();
+}
+
+TEST_APPHOOK(RWLockTest)
diff --git a/vespalib/src/tests/sha1/.gitignore b/vespalib/src/tests/sha1/.gitignore
new file mode 100644
index 00000000000..482fabd3247
--- /dev/null
+++ b/vespalib/src/tests/sha1/.gitignore
@@ -0,0 +1 @@
+vespalib_sha1_test_app
diff --git a/vespalib/src/tests/sha1/CMakeLists.txt b/vespalib/src/tests/sha1/CMakeLists.txt
new file mode 100644
index 00000000000..17f2fd40072
--- /dev/null
+++ b/vespalib/src/tests/sha1/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_sha1_test_app
+ SOURCES
+ sha1_test.cpp
+ rfc_sha1.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_sha1_test_app COMMAND vespalib_sha1_test_app)
diff --git a/vespalib/src/tests/sha1/FILES b/vespalib/src/tests/sha1/FILES
new file mode 100644
index 00000000000..bf07d3ff3ee
--- /dev/null
+++ b/vespalib/src/tests/sha1/FILES
@@ -0,0 +1 @@
+sha1_test.cpp
diff --git a/vespalib/src/tests/sha1/rfc_sha1.cpp b/vespalib/src/tests/sha1/rfc_sha1.cpp
new file mode 100644
index 00000000000..f0f2acde060
--- /dev/null
+++ b/vespalib/src/tests/sha1/rfc_sha1.cpp
@@ -0,0 +1,355 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/* Copied from RFC 3174, Licensed under the Internet Society RFC License */
+
+/*
+ Modifications:
+ - renamed file from "sha1.c" to "rfc_sha1.cpp"
+ - include "rfc_sha1.h" instead of "sha1.h"
+*/
+
+/*
+ * sha1.c
+ *
+ * Description:
+ * This file implements the Secure Hashing Algorithm 1 as
+ * defined in FIPS PUB 180-1 published April 17, 1995.
+ *
+ * The SHA-1, produces a 160-bit message digest for a given
+ * data stream. It should take about 2**n steps to find a
+ * message with the same digest as a given message and
+ * 2**(n/2) to find any two messages with the same digest,
+ * when n is the digest size in bits. Therefore, this
+ * algorithm can serve as a means of providing a
+ * "fingerprint" for a message.
+ *
+ * Portability Issues:
+ * SHA-1 is defined in terms of 32-bit "words". This code
+ * uses <stdint.h> (included via "sha1.h" to define 32 and 8
+ * bit unsigned integer types. If your C compiler does not
+ * support 32 bit unsigned integers, this code is not
+ * appropriate.
+ *
+ * Caveats:
+ * SHA-1 is designed to work with messages less than 2^64 bits
+ * long. Although SHA-1 allows a message digest to be generated
+ * for messages of any number of bits less than 2^64, this
+ * implementation only works with messages with a length that is
+ * a multiple of the size of an 8-bit character.
+ *
+ */
+#include <vespa/fastos/fastos.h>
+#include "rfc_sha1.h"
+/*
+ * Define the SHA1 circular left shift macro
+ */
+#define SHA1CircularShift(bits,word) \
+ (((word) << (bits)) | ((word) >> (32-(bits))))
+/* Local Function Prototyptes */
+void SHA1PadMessage(SHA1Context *);
+void SHA1ProcessMessageBlock(SHA1Context *);
+/*
+ * SHA1Reset
+ *
+ * Description:
+ * This function will initialize the SHA1Context in preparation
+ * for computing a new SHA1 message digest.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to reset.
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int SHA1Reset(SHA1Context *context)
+{
+ if (!context)
+ {
+ return shaNull;
+ }
+ context->Length_Low = 0;
+ context->Length_High = 0;
+ context->Message_Block_Index = 0;
+ context->Intermediate_Hash[0] = 0x67452301;
+ context->Intermediate_Hash[1] = 0xEFCDAB89;
+ context->Intermediate_Hash[2] = 0x98BADCFE;
+ context->Intermediate_Hash[3] = 0x10325476;
+ context->Intermediate_Hash[4] = 0xC3D2E1F0;
+ context->Computed = 0;
+ context->Corrupted = 0;
+ return shaSuccess;
+}
+/*
+ * SHA1Result
+ *
+ * Description:
+ * This function will return the 160-bit message digest into the
+ * Message_Digest array provided by the caller.
+ * NOTE: The first octet of hash is stored in the 0th element,
+ * the last octet of hash in the 19th element.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to use to calculate the SHA-1 hash.
+ * Message_Digest: [out]
+ * Where the digest is returned.
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int SHA1Result( SHA1Context *context,
+ uint8_t Message_Digest[SHA1HashSize])
+{
+ int i;
+ if (!context || !Message_Digest)
+ {
+ return shaNull;
+ }
+ if (context->Corrupted)
+ {
+ return context->Corrupted;
+ }
+ if (!context->Computed)
+ {
+ SHA1PadMessage(context);
+ for(i=0; i<64; ++i)
+ {
+ /* message may be sensitive, clear it out */
+ context->Message_Block[i] = 0;
+ }
+ context->Length_Low = 0; /* and clear length */
+ context->Length_High = 0;
+ context->Computed = 1;
+ }
+ for(i = 0; i < SHA1HashSize; ++i)
+ {
+ Message_Digest[i] = context->Intermediate_Hash[i>>2]
+ >> 8 * ( 3 - ( i & 0x03 ) );
+ }
+ return shaSuccess;
+}
+/*
+ * SHA1Input
+ *
+ * Description:
+ * This function accepts an array of octets as the next portion
+ * of the message.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The SHA context to update
+ * message_array: [in]
+ * An array of characters representing the next portion of
+ * the message.
+ * length: [in]
+ * The length of the message in message_array
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int SHA1Input( SHA1Context *context,
+ const uint8_t *message_array,
+ unsigned length)
+{
+ if (!length)
+ {
+ return shaSuccess;
+ }
+ if (!context || !message_array)
+ {
+ return shaNull;
+ }
+ if (context->Computed)
+ {
+ context->Corrupted = shaStateError;
+ return shaStateError;
+ }
+ if (context->Corrupted)
+ {
+ return context->Corrupted;
+ }
+ while(length-- && !context->Corrupted)
+ {
+ context->Message_Block[context->Message_Block_Index++] =
+ (*message_array & 0xFF);
+ context->Length_Low += 8;
+ if (context->Length_Low == 0)
+ {
+ context->Length_High++;
+ if (context->Length_High == 0)
+ {
+ /* Message is too long */
+ context->Corrupted = 1;
+ }
+ }
+ if (context->Message_Block_Index == 64)
+ {
+ SHA1ProcessMessageBlock(context);
+ }
+ message_array++;
+ }
+ return shaSuccess;
+}
+/*
+ * SHA1ProcessMessageBlock
+ *
+ * Description:
+ * This function will process the next 512 bits of the message
+ * stored in the Message_Block array.
+ *
+ * Parameters:
+ * None.
+ *
+ * Returns:
+ * Nothing.
+ *
+ * Comments:
+ * Many of the variable names in this code, especially the
+ * single character names, were used because those were the
+ * names used in the publication.
+ *
+ *
+ */
+void SHA1ProcessMessageBlock(SHA1Context *context)
+{
+ const uint32_t K[] = { /* Constants defined in SHA-1 */
+ 0x5A827999,
+ 0x6ED9EBA1,
+ 0x8F1BBCDC,
+ 0xCA62C1D6
+ };
+ int t; /* Loop counter */
+ uint32_t temp; /* Temporary word value */
+ uint32_t W[80]; /* Word sequence */
+ uint32_t A, B, C, D, E; /* Word buffers */
+ /*
+ * Initialize the first 16 words in the array W
+ */
+ for(t = 0; t < 16; t++)
+ {
+ W[t] = context->Message_Block[t * 4] << 24;
+ W[t] |= context->Message_Block[t * 4 + 1] << 16;
+ W[t] |= context->Message_Block[t * 4 + 2] << 8;
+ W[t] |= context->Message_Block[t * 4 + 3];
+ }
+ for(t = 16; t < 80; t++)
+ {
+ W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
+ }
+ A = context->Intermediate_Hash[0];
+ B = context->Intermediate_Hash[1];
+ C = context->Intermediate_Hash[2];
+ D = context->Intermediate_Hash[3];
+ E = context->Intermediate_Hash[4];
+ for(t = 0; t < 20; t++)
+ {
+ temp = SHA1CircularShift(5,A) +
+ ((B & C) | ((~B) & D)) + E + W[t] + K[0];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+ for(t = 20; t < 40; t++)
+ {
+ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+ for(t = 40; t < 60; t++)
+ {
+ temp = SHA1CircularShift(5,A) +
+ ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+ for(t = 60; t < 80; t++)
+ {
+ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+ context->Intermediate_Hash[0] += A;
+ context->Intermediate_Hash[1] += B;
+ context->Intermediate_Hash[2] += C;
+ context->Intermediate_Hash[3] += D;
+ context->Intermediate_Hash[4] += E;
+ context->Message_Block_Index = 0;
+}
+/*
+ * SHA1PadMessage
+ *
+ * Description:
+ * According to the standard, the message must be padded to an even
+ * 512 bits. The first padding bit must be a '1'. The last 64
+ * bits represent the length of the original message. All bits in
+ * between should be 0. This function will pad the message
+ * according to those rules by filling the Message_Block array
+ * accordingly. It will also call the ProcessMessageBlock function
+ * provided appropriately. When it returns, it can be assumed that
+ * the message digest has been computed.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to pad
+ * ProcessMessageBlock: [in]
+ * The appropriate SHA*ProcessMessageBlock function
+ * Returns:
+ * Nothing.
+ *
+ */
+void SHA1PadMessage(SHA1Context *context)
+{
+ /*
+ * Check to see if the current message block is too small to hold
+ * the initial padding bits and length. If so, we will pad the
+ * block, process it, and then continue padding into a second
+ * block.
+ */
+ if (context->Message_Block_Index > 55)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0x80;
+ while(context->Message_Block_Index < 64)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0;
+ }
+ SHA1ProcessMessageBlock(context);
+ while(context->Message_Block_Index < 56)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0;
+ }
+ }
+ else
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0x80;
+ while(context->Message_Block_Index < 56)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0;
+ }
+ }
+ /*
+ * Store the message length as the last 8 octets
+ */
+ context->Message_Block[56] = context->Length_High >> 24;
+ context->Message_Block[57] = context->Length_High >> 16;
+ context->Message_Block[58] = context->Length_High >> 8;
+ context->Message_Block[59] = context->Length_High;
+ context->Message_Block[60] = context->Length_Low >> 24;
+ context->Message_Block[61] = context->Length_Low >> 16;
+ context->Message_Block[62] = context->Length_Low >> 8;
+ context->Message_Block[63] = context->Length_Low;
+ SHA1ProcessMessageBlock(context);
+}
diff --git a/vespalib/src/tests/sha1/rfc_sha1.h b/vespalib/src/tests/sha1/rfc_sha1.h
new file mode 100644
index 00000000000..a5e21eb1d1c
--- /dev/null
+++ b/vespalib/src/tests/sha1/rfc_sha1.h
@@ -0,0 +1,71 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/* Copied from RFC 3174, Licensed under the Internet Society RFC License */
+
+/*
+ Modifications:
+ - renamed file from "sha1.h" to "rfc_sha1.h"
+ - include "fastos/fastos.h" instead of <stdint.h>
+ - use 'uint32_t' instead of 'int_least16_t'
+*/
+
+/*
+ * sha1.h
+ *
+ * Description:
+ * This is the header file for code which implements the Secure
+ * Hashing Algorithm 1 as defined in FIPS PUB 180-1 published
+ * April 17, 1995.
+ *
+ * Many of the variable names in this code, especially the
+ * single character names, were used because those were the names
+ * used in the publication.
+ *
+ * Please read the file sha1.c for more information.
+ *
+ */
+#pragma once
+/*
+ * If you do not have the ISO standard stdint.h header file, then you
+ * must typdef the following:
+ * name meaning
+ * uint32_t unsigned 32 bit integer
+ * uint8_t unsigned 8 bit integer (i.e., unsigned char)
+ *
+ */
+#include <vespa/fastos/fastos.h>
+
+#ifndef _SHA_enum_
+#define _SHA_enum_
+enum
+{
+ shaSuccess = 0,
+ shaNull, /* Null pointer parameter */
+ shaInputTooLong, /* input data too long */
+ shaStateError /* called Input after Result */
+};
+#endif
+#define SHA1HashSize 20
+/*
+ * This structure will hold context information for the SHA-1
+ * hashing operation
+ */
+typedef struct SHA1Context
+{
+ uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */
+ uint32_t Length_Low; /* Message length in bits */
+ uint32_t Length_High; /* Message length in bits */
+ /* Index into message block array */
+ uint32_t Message_Block_Index;
+ uint8_t Message_Block[64]; /* 512-bit message blocks */
+ int Computed; /* Is the digest computed? */
+ int Corrupted; /* Is the message digest corrupted? */
+} SHA1Context;
+/*
+ * Function Prototypes
+ */
+int SHA1Reset( SHA1Context *);
+int SHA1Input( SHA1Context *,
+ const uint8_t *,
+ unsigned int);
+int SHA1Result( SHA1Context *,
+ uint8_t Message_Digest[SHA1HashSize]);
diff --git a/vespalib/src/tests/sha1/sha1_test.cpp b/vespalib/src/tests/sha1/sha1_test.cpp
new file mode 100644
index 00000000000..897619d1f24
--- /dev/null
+++ b/vespalib/src/tests/sha1/sha1_test.cpp
@@ -0,0 +1,103 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include "rfc_sha1.h"
+#include <vespa/vespalib/util/sha1.h>
+#include <vespa/vespalib/stllike/string.h>
+
+using namespace vespalib;
+
+struct Digest {
+ char buf[20];
+ Digest() {
+ for (size_t i = 0; i < 20; ++i) {
+ buf[i] = ((rand() >> 12) & 0xff);
+ }
+ }
+ vespalib::string as_string() const {
+ const char *sym = "0123456789ABCDEF";
+ vespalib::string res;
+ for (size_t i = 0; i < 20; ++i) {
+ res.append(sym[(buf[i] >> 4) & 0xf]);
+ res.append(sym[buf[i] & 0xf]);
+ }
+ return ("0x" + res);
+ }
+ bool operator==(const Digest &rhs) const {
+ for (size_t i = 0; i < 20; ++i) {
+ if (buf[i] != rhs.buf[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+};
+
+std::ostream &operator <<(std::ostream &out, const Digest &digest) {
+ out << digest.as_string();
+ return out;
+}
+
+Digest digest(const char *data, size_t size) {
+ Digest result;
+ Sha1::hash(data, size, result.buf, 20);
+ return result;
+}
+
+Digest rfc_digest(const char *data, size_t size) {
+ Digest result;
+ SHA1Context ctx;
+ SHA1Reset(&ctx);
+ SHA1Input(&ctx, (const uint8_t *)data, size);
+ SHA1Result(&ctx, (unsigned char *)result.buf);
+ return result;
+}
+
+struct Data {
+ char buf[5000];
+ Data() {
+ srand(42);
+ for (size_t i = 0; i < sizeof(buf); ++i) {
+ buf[i] = ((rand() >> 12) & 0xff);
+ }
+ }
+ size_t max() const { return sizeof(buf); }
+ Digest inc_digest(std::initializer_list<size_t> chunks) const {
+ Digest result;
+ Sha1 sha;
+ uint32_t ofs = 0;
+ for (auto chunk: chunks) {
+ ASSERT_LESS_EQUAL(ofs + chunk, max());
+ sha.process(buf + ofs, chunk);
+ ofs += chunk;
+ }
+ ASSERT_EQUAL(ofs, max());
+ sha.get_digest(result.buf);
+ return result;
+ }
+};
+
+TEST("require that reference implementation passes SHA1 smoke test") {
+ EXPECT_EQUAL("0xA9993E364706816ABA3E25717850C26C9CD0D89D", rfc_digest("abc", 3).as_string());
+}
+
+TEST("require that production implementation passes SHA1 smoke test") {
+ EXPECT_EQUAL("0xA9993E364706816ABA3E25717850C26C9CD0D89D", digest("abc", 3).as_string());
+}
+
+TEST_F("require that random data hashes to the same as reference implementation", Data()) {
+ for (size_t size = 0; size <= f1.max(); ++size) {
+ EXPECT_EQUAL(rfc_digest(f1.buf, size), digest(f1.buf, size));
+ }
+}
+
+TEST_F("require that incremental and all-in-one hashing produces the same result", Data()) {
+ EXPECT_EQUAL(digest(f1.buf, f1.max()),
+ f1.inc_digest({ 1000, 1000, 1000, 1000, 1000 }));
+ EXPECT_EQUAL(digest(f1.buf, f1.max()),
+ f1.inc_digest({ 10, 10, 10, 10, 10, 10, 4, 64, 64, 64, 128, 75, 75, 2500, 1966 }));
+ EXPECT_EQUAL(digest(f1.buf, f1.max()),
+ f1.inc_digest({ 64, 64, 128, 256, 10, 10, 10, 10, 10, 10, 10, 100, 4318 }));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/sharedptr/.gitignore b/vespalib/src/tests/sharedptr/.gitignore
new file mode 100644
index 00000000000..d6ea42f40fb
--- /dev/null
+++ b/vespalib/src/tests/sharedptr/.gitignore
@@ -0,0 +1,5 @@
+.depend
+Makefile
+ptrholder_test
+sharedptr_test
+vespalib_ptrholder_test_app
diff --git a/vespalib/src/tests/sharedptr/CMakeLists.txt b/vespalib/src/tests/sharedptr/CMakeLists.txt
new file mode 100644
index 00000000000..78684d3ad51
--- /dev/null
+++ b/vespalib/src/tests/sharedptr/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_ptrholder_test_app
+ SOURCES
+ ptrholder.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_ptrholder_test_app COMMAND vespalib_ptrholder_test_app)
diff --git a/vespalib/src/tests/sharedptr/DESC b/vespalib/src/tests/sharedptr/DESC
new file mode 100644
index 00000000000..5129ce86f79
--- /dev/null
+++ b/vespalib/src/tests/sharedptr/DESC
@@ -0,0 +1 @@
+Unit tests for the SharedPtr and PtrHolder classes.
diff --git a/vespalib/src/tests/sharedptr/FILES b/vespalib/src/tests/sharedptr/FILES
new file mode 100644
index 00000000000..89a2ce9cf56
--- /dev/null
+++ b/vespalib/src/tests/sharedptr/FILES
@@ -0,0 +1,2 @@
+sharedptr.cpp
+ptrholder.cpp
diff --git a/vespalib/src/tests/sharedptr/ptrholder.cpp b/vespalib/src/tests/sharedptr/ptrholder.cpp
new file mode 100644
index 00000000000..1f73efb141d
--- /dev/null
+++ b/vespalib/src/tests/sharedptr/ptrholder.cpp
@@ -0,0 +1,101 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("ptrholder_test");
+#include <vespa/vespalib/util/ptrholder.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using vespalib::PtrHolder;
+
+
+class Test : public vespalib::TestApp
+{
+public:
+ void testEmpty();
+ void testSimple();
+ int Main();
+};
+
+
+struct Data
+{
+ int ctorCnt;
+ int dtorCnt;
+ Data() : ctorCnt(0), dtorCnt(0) {}
+};
+
+
+class DataRef
+{
+private:
+ Data &_d;
+ DataRef(const DataRef &);
+ DataRef &operator=(const DataRef &);
+public:
+ DataRef(Data &d) : _d(d) { ++d.ctorCnt; }
+ ~DataRef() { ++_d.dtorCnt; }
+ int getCtorCnt() const { return _d.ctorCnt; }
+ int getDtorCnt() const { return _d.dtorCnt; }
+};
+typedef std::shared_ptr<DataRef> PT;
+typedef PtrHolder<DataRef> HOLD;
+
+
+void
+Test::testEmpty()
+{
+ HOLD hold;
+ EXPECT_TRUE(hold.get().get() == NULL);
+ EXPECT_TRUE(!hold.hasValue());
+ EXPECT_TRUE(!hold.hasNewValue());
+ EXPECT_TRUE(!hold.latch());
+ EXPECT_TRUE(hold.get().get() == NULL);
+ EXPECT_TRUE(!hold.hasValue());
+ EXPECT_TRUE(!hold.hasNewValue());
+ hold.set(NULL);
+ EXPECT_TRUE(!hold.hasValue());
+ EXPECT_TRUE(!hold.hasNewValue());
+}
+
+
+void
+Test::testSimple()
+{
+ Data data;
+ HOLD hold;
+ {
+ hold.set(new DataRef(data));
+ EXPECT_TRUE(hold.hasValue());
+ EXPECT_TRUE(!hold.hasNewValue());
+ EXPECT_TRUE(!hold.latch());
+ PT pt1(hold.get());
+ EXPECT_TRUE(pt1.get() == hold.get().get());
+ hold.set(new DataRef(data));
+ EXPECT_TRUE(pt1.get() == hold.get().get());
+ EXPECT_TRUE(hold.hasValue());
+ EXPECT_TRUE(hold.hasNewValue());
+ EXPECT_TRUE(hold.latch());
+ EXPECT_TRUE(hold.hasValue());
+ EXPECT_TRUE(!hold.hasNewValue());
+ EXPECT_TRUE(pt1.get() != hold.get().get());
+ EXPECT_TRUE(data.ctorCnt == 2);
+ EXPECT_TRUE(data.dtorCnt == 0);
+ }
+ EXPECT_TRUE(data.ctorCnt == 2);
+ EXPECT_TRUE(data.dtorCnt == 1);
+ hold.clear();
+ EXPECT_TRUE(data.ctorCnt == 2);
+ EXPECT_TRUE(data.dtorCnt == 2);
+}
+
+
+int
+Test::Main()
+{
+ TEST_INIT("ptrholder_test");
+ testEmpty();
+ testSimple();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/signalhandler/.gitignore b/vespalib/src/tests/signalhandler/.gitignore
new file mode 100644
index 00000000000..a83ef5b3648
--- /dev/null
+++ b/vespalib/src/tests/signalhandler/.gitignore
@@ -0,0 +1,6 @@
+.depend
+Makefile
+signalhandler_test
+victim
+vespalib_signalhandler_test_app
+vespalib_victim_app
diff --git a/vespalib/src/tests/signalhandler/CMakeLists.txt b/vespalib/src/tests/signalhandler/CMakeLists.txt
new file mode 100644
index 00000000000..20339d16ebe
--- /dev/null
+++ b/vespalib/src/tests/signalhandler/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_signalhandler_test_app
+ SOURCES
+ signalhandler_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_signalhandler_test_app NO_VALGRIND COMMAND vespalib_signalhandler_test_app)
+vespa_add_executable(vespalib_victim_app
+ SOURCES
+ victim.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/signalhandler/DESC b/vespalib/src/tests/signalhandler/DESC
new file mode 100644
index 00000000000..72cddf8a8f2
--- /dev/null
+++ b/vespalib/src/tests/signalhandler/DESC
@@ -0,0 +1 @@
+signalhandler test. Take a look at signalhandler.cpp for details.
diff --git a/vespalib/src/tests/signalhandler/FILES b/vespalib/src/tests/signalhandler/FILES
new file mode 100644
index 00000000000..85c709cf5ac
--- /dev/null
+++ b/vespalib/src/tests/signalhandler/FILES
@@ -0,0 +1,2 @@
+signalhandler.cpp
+victim.cpp
diff --git a/vespalib/src/tests/signalhandler/signalhandler_test.cpp b/vespalib/src/tests/signalhandler/signalhandler_test.cpp
new file mode 100644
index 00000000000..2aa0445a339
--- /dev/null
+++ b/vespalib/src/tests/signalhandler/signalhandler_test.cpp
@@ -0,0 +1,35 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("signalhandler_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/signalhandler.h>
+
+using namespace vespalib;
+
+TEST_SETUP(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("signalhandler_test");
+ EXPECT_TRUE(!SignalHandler::INT.check());
+ EXPECT_TRUE(!SignalHandler::TERM.check());
+ SignalHandler::INT.ignore();
+ EXPECT_TRUE(!SignalHandler::INT.check());
+ EXPECT_TRUE(!SignalHandler::TERM.check());
+ SignalHandler::TERM.hook();
+ EXPECT_TRUE(!SignalHandler::INT.check());
+ EXPECT_TRUE(!SignalHandler::TERM.check());
+ kill(getpid(), SIGINT);
+ EXPECT_TRUE(!SignalHandler::INT.check());
+ EXPECT_TRUE(!SignalHandler::TERM.check());
+ kill(getpid(), SIGTERM);
+ EXPECT_TRUE(!SignalHandler::INT.check());
+ EXPECT_TRUE(SignalHandler::TERM.check());
+ SignalHandler::TERM.clear();
+ EXPECT_TRUE(!SignalHandler::INT.check());
+ EXPECT_TRUE(!SignalHandler::TERM.check());
+ EXPECT_EQUAL(0, system("res=`./vespalib_victim_app`; test \"$res\" = \"GOT TERM\""));
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/signalhandler/victim.cpp b/vespalib/src/tests/signalhandler/victim.cpp
new file mode 100644
index 00000000000..fe42489006c
--- /dev/null
+++ b/vespalib/src/tests/signalhandler/victim.cpp
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/signalhandler.h>
+
+using vespalib::SignalHandler;
+
+int main(int argc, char **argv) {
+ (void) argc;
+ (void) argv;
+ SignalHandler::TERM.hook();
+ kill(getpid(), SIGTERM);
+ if (SignalHandler::TERM.check()) {
+ fprintf(stdout, "GOT TERM\n");
+ fflush(stdout);
+ }
+ SignalHandler::TERM.unhook();
+ kill(getpid(), SIGTERM);
+ fprintf(stdout, "SURVIVED TERM\n");
+ fflush(stdout);
+ return 0;
+}
diff --git a/vespalib/src/tests/simple_thread_bundle/.gitignore b/vespalib/src/tests/simple_thread_bundle/.gitignore
new file mode 100644
index 00000000000..506e8775b63
--- /dev/null
+++ b/vespalib/src/tests/simple_thread_bundle/.gitignore
@@ -0,0 +1,2 @@
+vespalib_simple_thread_bundle_test_app
+vespalib_threading_speed_test_app
diff --git a/vespalib/src/tests/simple_thread_bundle/CMakeLists.txt b/vespalib/src/tests/simple_thread_bundle/CMakeLists.txt
new file mode 100644
index 00000000000..7f3fbd9e014
--- /dev/null
+++ b/vespalib/src/tests/simple_thread_bundle/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_simple_thread_bundle_test_app
+ SOURCES
+ simple_thread_bundle_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_simple_thread_bundle_test_app COMMAND vespalib_simple_thread_bundle_test_app)
+vespa_add_executable(vespalib_threading_speed_test_app
+ SOURCES
+ threading_speed_test.cpp
+ DEPENDS
+ vespalib
+)
+#vespa_add_test(NAME vespalib_threading_speed_test_app COMMAND vespalib_threading_speed_test_app)
diff --git a/vespalib/src/tests/simple_thread_bundle/FILES b/vespalib/src/tests/simple_thread_bundle/FILES
new file mode 100644
index 00000000000..30283546a27
--- /dev/null
+++ b/vespalib/src/tests/simple_thread_bundle/FILES
@@ -0,0 +1 @@
+simple_thread_bundle_test.cpp
diff --git a/vespalib/src/tests/simple_thread_bundle/simple_thread_bundle_test.cpp b/vespalib/src/tests/simple_thread_bundle/simple_thread_bundle_test.cpp
new file mode 100644
index 00000000000..937f2c2bbd5
--- /dev/null
+++ b/vespalib/src/tests/simple_thread_bundle/simple_thread_bundle_test.cpp
@@ -0,0 +1,191 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/simple_thread_bundle.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/util/box.h>
+#include <vespa/vespalib/util/sync.h>
+
+using namespace vespalib;
+using namespace vespalib::fixed_thread_bundle;
+
+struct Cnt : Runnable {
+ size_t x;
+ Cnt() : x(0) {}
+ virtual void run() { ++x; }
+};
+
+struct State {
+ std::vector<Cnt> cnts;
+ State(size_t n) : cnts(n) {}
+ std::vector<Runnable*> getTargets(size_t n) {
+ ASSERT_LESS_EQUAL(n, cnts.size());
+ std::vector<Runnable*> targets;
+ for (size_t i = 0; i < n; ++i) {
+ targets.push_back(&cnts[i]);
+ }
+ return targets;
+ }
+ bool check(const std::vector<size_t> &expect) {
+ bool status = true;
+ ASSERT_LESS_EQUAL(expect.size(), cnts.size());
+ for (size_t i = 0; i < expect.size(); ++i) {
+ status &= EXPECT_EQUAL(expect[i], cnts[i].x);
+ }
+ return status;
+ }
+};
+
+struct Blocker : Runnable {
+ Gate start;
+ virtual void run() {
+ start.await();
+ }
+ Gate done; // set externally
+};
+
+TEST_MT_FF("require that signals can be counted and cancelled", 2, Signal, size_t(16000)) {
+ if (thread_id == 0) {
+ for (size_t i = 0; i < f2; ++i) {
+ f1.send();
+ if (i % 128 == 0) { FastOS_Thread::Sleep(1); }
+ }
+ TEST_BARRIER();
+ f1.cancel();
+ } else {
+ size_t localGen = 0;
+ size_t diffSum = 0;
+ while (localGen < f2) {
+ size_t diff = f1.wait(localGen);
+ EXPECT_GREATER(diff, 0u);
+ diffSum += diff;
+ }
+ EXPECT_EQUAL(f2, localGen);
+ EXPECT_EQUAL(f2, diffSum);
+ TEST_BARRIER();
+ EXPECT_EQUAL(0u, f1.wait(localGen));
+ EXPECT_EQUAL(f2 + 1, localGen);
+ }
+}
+
+TEST("require that bundles of size 0 cannot be created") {
+ EXPECT_EXCEPTION(SimpleThreadBundle(0), IllegalArgumentException, "");
+}
+
+TEST_FF("require that bundles with no internal threads work", SimpleThreadBundle(1), State(1)) {
+ f1.run(f2.getTargets(1));
+ f2.check(Box<size_t>().add(1));
+}
+
+TEST_FF("require that bundles can be run without targets", SimpleThreadBundle(1), State(1)) {
+ f1.run(f2.getTargets(0));
+ f2.check(Box<size_t>().add(0));
+}
+
+TEST_FF("require that having too many targets fails", SimpleThreadBundle(1), State(2)) {
+ EXPECT_EXCEPTION(f1.run(f2.getTargets(2)), IllegalArgumentException, "");
+ f2.check(Box<size_t>().add(0).add(0));
+}
+
+TEST_FF("require that bundles with multiple internal threads work", SimpleThreadBundle(3), State(3)) {
+ f1.run(f2.getTargets(3));
+ f2.check(Box<size_t>().add(1).add(1).add(1));
+}
+
+TEST_FF("require that bundles can be used multiple times", SimpleThreadBundle(3), State(3)) {
+ f1.run(f2.getTargets(3));
+ f1.run(f2.getTargets(3));
+ f1.run(f2.getTargets(3));
+ f2.check(Box<size_t>().add(3).add(3).add(3));
+}
+
+TEST_FF("require that bundles can be used with fewer than maximum threads", SimpleThreadBundle(3), State(3)) {
+ f1.run(f2.getTargets(3));
+ f1.run(f2.getTargets(2));
+ f1.run(f2.getTargets(1));
+ f2.check(Box<size_t>().add(3).add(2).add(1));
+}
+
+TEST_MT_FFF("require that bundle run waits for all targets", 2, SimpleThreadBundle(4), State(3), Blocker) {
+ if (thread_id == 0) {
+ std::vector<Runnable*> targets = f2.getTargets(3);
+ targets.push_back(&f3);
+ f1.run(targets);
+ f2.check(Box<size_t>().add(1).add(1).add(1));
+ f3.done.countDown();
+ } else {
+ EXPECT_FALSE(f3.done.await(20));
+ f3.start.countDown();
+ EXPECT_TRUE(f3.done.await(10000));
+ }
+}
+
+TEST("require that all strategies work with variable number of threads and targets") {
+ std::vector<SimpleThreadBundle::Strategy> strategies
+ = make_box(SimpleThreadBundle::USE_SIGNAL_LIST,
+ SimpleThreadBundle::USE_SIGNAL_TREE,
+ SimpleThreadBundle::USE_BROADCAST);
+ for (size_t s = 0; s < strategies.size(); ++s) {
+ for (size_t t = 1; t <= 16; ++t) {
+ State state(t);
+ SimpleThreadBundle threadBundle(t, strategies[s]);
+ for (size_t r = 0; r <= t; ++r) {
+ threadBundle.run(state.getTargets(r));
+ }
+ std::vector<size_t> expect;
+ for (size_t e = 0; e < t; ++e) {
+ expect.push_back(t - e);
+ }
+ if (!state.check(expect)) {
+ fprintf(stderr, "s:%zu, t:%zu\n", s, t);
+ }
+ }
+ }
+}
+
+TEST_F("require that bundle pool gives out bundles", SimpleThreadBundle::Pool(5)) {
+ SimpleThreadBundle::UP b1 = f1.obtain();
+ SimpleThreadBundle::UP b2 = f1.obtain();
+ ASSERT_TRUE(b1.get() != 0);
+ ASSERT_TRUE(b2.get() != 0);
+ EXPECT_EQUAL(5u, b1->size());
+ EXPECT_EQUAL(5u, b2->size());
+ EXPECT_FALSE(b1.get() == b2.get());
+ f1.release(std::move(b1));
+ f1.release(std::move(b2));
+}
+
+TEST_F("require that bundles do not need to be put back on the pool", SimpleThreadBundle::Pool(5)) {
+ SimpleThreadBundle::UP b1 = f1.obtain();
+ ASSERT_TRUE(b1.get() != 0);
+ EXPECT_EQUAL(5u, b1->size());
+}
+
+TEST_F("require that bundle pool reuses bundles", SimpleThreadBundle::Pool(5)) {
+ SimpleThreadBundle::UP bundle = f1.obtain();
+ SimpleThreadBundle *ptr = bundle.get();
+ f1.release(std::move(bundle));
+ bundle = f1.obtain();
+ EXPECT_EQUAL(ptr, bundle.get());
+}
+
+TEST_MT_FF("require that bundle pool works with multiple threads", 32, SimpleThreadBundle::Pool(3),
+ std::vector<SimpleThreadBundle*>(num_threads, 0))
+{
+ SimpleThreadBundle::UP bundle = f1.obtain();
+ ASSERT_TRUE(bundle.get() != 0);
+ EXPECT_EQUAL(3u, bundle->size());
+ f2[thread_id] = bundle.get();
+ TEST_BARRIER();
+ if (thread_id == 0) {
+ for (size_t i = 0; i < num_threads; ++i) {
+ for (size_t j = 0; j < num_threads; ++j) {
+ EXPECT_EQUAL((f2[i] == f2[j]), (i == j));
+ }
+ }
+ }
+ TEST_BARRIER();
+ f1.release(std::move(bundle));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/simple_thread_bundle/threading_speed_test.cpp b/vespalib/src/tests/simple_thread_bundle/threading_speed_test.cpp
new file mode 100644
index 00000000000..417d8b20b56
--- /dev/null
+++ b/vespalib/src/tests/simple_thread_bundle/threading_speed_test.cpp
@@ -0,0 +1,78 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/simple_thread_bundle.h>
+#include <vespa/vespalib/util/box.h>
+
+using namespace vespalib;
+
+uint64_t doWork(uint64_t data) {
+ uint64_t value = data;
+ for (size_t i = 0; i < 1024 * 1024; ++i) {
+ value = (value << 16) + (value >> 8) + (value << 32);
+ }
+ return value;
+}
+
+struct Worker : Runnable {
+ size_t iter;
+ uint64_t input;
+ uint64_t output;
+ Worker() : iter(1), input(0), output(0) {}
+ void init(size_t n, uint64_t i) {
+ iter = n;
+ input = i;
+ }
+ virtual void run() {
+ uint64_t value = input;
+ for (size_t i = 0; i < iter; ++i) {
+ value = doWork(value);
+ }
+ output = value;
+ }
+};
+
+TEST("estimate cost of thread bundle fork/join") {
+ std::vector<SimpleThreadBundle::Strategy> strategy_value
+ = make_box(SimpleThreadBundle::USE_SIGNAL_LIST,
+ SimpleThreadBundle::USE_SIGNAL_TREE,
+ SimpleThreadBundle::USE_BROADCAST);
+ std::vector<std::string> strategy_name
+ = make_box(std::string("USE_SIGNAL_LIST"),
+ std::string("USE_SIGNAL_TREE"),
+ std::string("USE_BROADCAST"));
+ for (size_t strategy = 0; strategy < strategy_value.size(); ++strategy) {
+ for (size_t threads = 1; threads <= 16; ++threads) {
+ SimpleThreadBundle threadBundle(threads, strategy_value[strategy]);
+ std::vector<Worker> workers(threads);
+ std::vector<Runnable*> targets;
+ for (size_t i = 0; i < threads; ++i) {
+ targets.push_back(&workers[i]);
+ }
+ size_t iter = 0x4; // work done per fork
+ size_t fork = 0x1; // number of forks performed
+ for (; iter > 0; iter >>= 1, fork <<= 1) {
+ for (size_t i = 0; i < threads; ++i) {
+ workers[i].init(iter, i);
+ }
+ double minTime = 1000000.0;
+ for (size_t samples = 0; samples < 32; ++samples) {
+ FastOS_Time t;
+ t.SetNow();
+ for (size_t n = 0; n < fork; ++n) {
+ threadBundle.run(targets);
+ }
+ double time = t.MilliSecsToNow();
+ if (time < minTime) {
+ minTime = time;
+ }
+ FastOS_Thread::Sleep(10);
+ }
+ fprintf(stderr, "strategy: %s, threads: %zu, fork: %zu, iter: %zu, time: %g, unit: %g\n",
+ strategy_name[strategy].c_str(), threads, fork, iter, minTime,
+ minTime / (fork * iter));
+ }
+ }
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/slaveproc/.gitignore b/vespalib/src/tests/slaveproc/.gitignore
new file mode 100644
index 00000000000..8851e99df13
--- /dev/null
+++ b/vespalib/src/tests/slaveproc/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+slaveproc_test
+vespalib_slaveproc_test_app
diff --git a/vespalib/src/tests/slaveproc/CMakeLists.txt b/vespalib/src/tests/slaveproc/CMakeLists.txt
new file mode 100644
index 00000000000..7a834bc0962
--- /dev/null
+++ b/vespalib/src/tests/slaveproc/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_slaveproc_test_app
+ SOURCES
+ slaveproc_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_slaveproc_test_app COMMAND vespalib_slaveproc_test_app)
diff --git a/vespalib/src/tests/slaveproc/DESC b/vespalib/src/tests/slaveproc/DESC
new file mode 100644
index 00000000000..42f92a9e42e
--- /dev/null
+++ b/vespalib/src/tests/slaveproc/DESC
@@ -0,0 +1,2 @@
+Test the SlaveProc class, a wrapper for FastOS_Process that simplifies
+writing to stdin and reading from stdout of sub-processes.
diff --git a/vespalib/src/tests/slaveproc/FILES b/vespalib/src/tests/slaveproc/FILES
new file mode 100644
index 00000000000..f2c61607b2d
--- /dev/null
+++ b/vespalib/src/tests/slaveproc/FILES
@@ -0,0 +1 @@
+slaveproc.cpp
diff --git a/vespalib/src/tests/slaveproc/slaveproc_test.cpp b/vespalib/src/tests/slaveproc/slaveproc_test.cpp
new file mode 100644
index 00000000000..95f8021f7d2
--- /dev/null
+++ b/vespalib/src/tests/slaveproc/slaveproc_test.cpp
@@ -0,0 +1,186 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/slaveproc.h>
+
+using vespalib::SlaveProc;
+
+TEST("simple run, ignore output") {
+ EXPECT_TRUE(SlaveProc::run("echo foo"));
+}
+
+TEST("simple run, ignore output, failure") {
+ EXPECT_TRUE(!SlaveProc::run("false"));
+}
+
+TEST("simple run, ignore output, timeout") {
+ EXPECT_TRUE(!SlaveProc::run("sleep 60", 10));
+}
+
+TEST("simple run") {
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run("echo -n foo", out));
+ EXPECT_EQUAL(out, "foo");
+}
+
+TEST("simple run, strip single-line trailing newline") {
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run("echo foo", out));
+ EXPECT_EQUAL(out, "foo");
+}
+
+TEST("simple run, don't strip multi-line output") {
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run("echo -e \"foo\\n\"", out));
+ EXPECT_EQUAL(out, "foo\n\n");
+}
+
+TEST("simple run with input") {
+ std::string in = "bar";
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run(in, "cat", out));
+ EXPECT_EQUAL(out, "bar");
+}
+
+TEST("simple run with input, strip single-line trailing newline") {
+ std::string in = "bar\n";
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run(in, "cat", out));
+ EXPECT_EQUAL(out, "bar");
+}
+
+TEST("simple run with input, don't strip multi-line output") {
+ std::string in = "bar\n\n";
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run(in, "cat", out));
+ EXPECT_EQUAL("bar\n\n", out);
+}
+
+TEST_MT("simple run, partial output due to timeout", 2) {
+ std::string out;
+ std::vector<size_t> timeouts({150, 300, 3000, 6000, 60000});
+ for (size_t timeout: timeouts) {
+ fprintf(stderr, "... verifying partial output with%s input (timeout = %zu)\n",
+ (thread_id == 0) ? "out" : "", timeout);
+ if (thread_id == 0) {
+ out.clear();
+ EXPECT_TRUE(!SlaveProc::run("echo foo; sleep 600; echo bar", out, timeout));
+ } else {
+ out.clear();
+ std::string in = "ignored\n";
+ EXPECT_TRUE(!SlaveProc::run(in, "echo foo; sleep 600; echo bar", out, timeout));
+ }
+ if (out == "foo") {
+ break;
+ }
+ }
+ EXPECT_EQUAL(out, "foo");
+}
+
+TEST("proc failure") {
+ SlaveProc proc("false");
+ // read with length 0 will wait for output
+ EXPECT_TRUE(proc.read(NULL, 0) == 0);
+ EXPECT_TRUE(proc.wait(60000));
+ EXPECT_TRUE(!proc.running());
+ EXPECT_TRUE(proc.failed());
+}
+
+TEST("basic read/write") {
+ int x;
+ int read;
+ char buf[64];
+ SlaveProc proc("cat");
+
+ EXPECT_TRUE(proc.running());
+ EXPECT_TRUE(!proc.failed());
+ EXPECT_TRUE(proc.write("foo", 3));
+ for (x = 0, read = 0; x < 10 && read < 3; ++x) {
+ read += proc.read(buf + read, sizeof(buf) - read);
+ }
+ EXPECT_TRUE(read == 3 && memcmp(buf, "foo", 3) == 0);
+ EXPECT_TRUE(proc.write("bar!", 4));
+ for (x = 0, read = 0; x < 10 && read < 4; ++x) {
+ read += proc.read(buf + read, sizeof(buf) - read);
+ }
+ EXPECT_TRUE(read == 4 && memcmp(buf, "bar!", 4) == 0);
+ EXPECT_TRUE(!proc.eof()); // not eof yet
+ EXPECT_TRUE(proc.close()); // close stdin
+ EXPECT_TRUE(!proc.eof()); // eof not detected yet
+ EXPECT_TRUE(proc.read(buf, sizeof(buf)) == 0);
+ EXPECT_TRUE(proc.eof());
+ EXPECT_TRUE(proc.read(buf, sizeof(buf)) == 0);
+ EXPECT_TRUE(proc.wait(60000));
+ EXPECT_TRUE(!proc.running());
+ EXPECT_TRUE(!proc.failed());
+}
+
+TEST("continuos run, readLine") {
+ std::string str;
+ SlaveProc proc("cat");
+
+ EXPECT_TRUE(proc.running());
+ EXPECT_TRUE(!proc.failed());
+ EXPECT_TRUE(proc.write("foo\n", 4));
+ EXPECT_TRUE(proc.readLine(str));
+ EXPECT_EQUAL(str, "foo");
+ EXPECT_TRUE(proc.write("bar!\n", 5));
+ EXPECT_TRUE(proc.readLine(str));
+ EXPECT_EQUAL(str, "bar!");
+ EXPECT_TRUE(!proc.eof()); // not eof yet
+ EXPECT_TRUE(proc.close()); // close stdin
+ EXPECT_TRUE(!proc.eof()); // eof not detected yet
+ EXPECT_TRUE(!proc.readLine(str));
+ EXPECT_EQUAL(str, "");
+ EXPECT_TRUE(proc.eof());
+ EXPECT_TRUE(!proc.readLine(str));
+ EXPECT_EQUAL(str, "");
+ EXPECT_TRUE(proc.wait(60000));
+ EXPECT_TRUE(!proc.running());
+ EXPECT_TRUE(!proc.failed());
+}
+
+TEST("readLine, eof flushes last line") {
+ std::string str;
+ SlaveProc proc("cat");
+
+ EXPECT_TRUE(proc.running());
+ EXPECT_TRUE(!proc.failed());
+ EXPECT_TRUE(proc.write("foo\n", 4));
+ EXPECT_TRUE(proc.readLine(str));
+ EXPECT_EQUAL(str, "foo");
+ EXPECT_TRUE(proc.write("bar!", 4));
+ EXPECT_TRUE(!proc.eof()); // not eof yet
+ EXPECT_TRUE(proc.close()); // close stdin
+ EXPECT_TRUE(!proc.eof()); // eof not detected yet
+ EXPECT_TRUE(proc.readLine(str));
+ EXPECT_EQUAL(str, "bar!");
+ EXPECT_TRUE(proc.eof());
+ EXPECT_TRUE(!proc.readLine(str));
+ EXPECT_EQUAL(str, "");
+ EXPECT_TRUE(proc.wait(60000));
+ EXPECT_TRUE(!proc.running());
+ EXPECT_TRUE(!proc.failed());
+}
+
+TEST("long continuos run, readLine") {
+ std::string in;
+ std::string out;
+ SlaveProc proc("cat");
+
+ EXPECT_TRUE(proc.running());
+ EXPECT_TRUE(!proc.failed());
+ for (uint32_t i = 0; i < 10000; ++i) {
+ char num[32];
+ sprintf(num, "%d", i);
+ in.assign("long continous run, line ");
+ in.append(num).append("\n");
+ EXPECT_TRUE(proc.write(in.data(), in.length()));
+ in.erase(in.size() - 1, 1);
+ EXPECT_TRUE(proc.readLine(out));
+ EXPECT_EQUAL(in, out);
+ }
+ EXPECT_TRUE(proc.running());
+ EXPECT_TRUE(!proc.failed());
+}
+
+TEST_MAIN_WITH_PROCESS_PROXY() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/slime/.cvsignore b/vespalib/src/tests/slime/.cvsignore
new file mode 100644
index 00000000000..bac7b15abc8
--- /dev/null
+++ b/vespalib/src/tests/slime/.cvsignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+slime_test
diff --git a/vespalib/src/tests/slime/.gitignore b/vespalib/src/tests/slime/.gitignore
new file mode 100644
index 00000000000..0ded808f82c
--- /dev/null
+++ b/vespalib/src/tests/slime/.gitignore
@@ -0,0 +1,9 @@
+*_benchmark
+*_test
+.depend
+Makefile
+vespalib_slime_binary_format_test_app
+vespalib_slime_inject_test_app
+vespalib_slime_json_format_test_app
+vespalib_slime_test_app
+vespalib_json_slime_benchmark_app
diff --git a/vespalib/src/tests/slime/CMakeLists.txt b/vespalib/src/tests/slime/CMakeLists.txt
new file mode 100644
index 00000000000..65d28337928
--- /dev/null
+++ b/vespalib/src/tests/slime/CMakeLists.txt
@@ -0,0 +1,37 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_slime_test_app
+ SOURCES
+ slime_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_slime_test_app COMMAND vespalib_slime_test_app)
+vespa_add_executable(vespalib_slime_inject_test_app
+ SOURCES
+ slime_inject_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_slime_inject_test_app COMMAND vespalib_slime_inject_test_app)
+vespa_add_executable(vespalib_slime_binary_format_test_app
+ SOURCES
+ slime_binary_format_test.cpp
+ type_traits.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_slime_binary_format_test_app COMMAND vespalib_slime_binary_format_test_app)
+vespa_add_executable(vespalib_slime_json_format_test_app
+ SOURCES
+ slime_json_format_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_slime_json_format_test_app COMMAND vespalib_slime_json_format_test_app)
+vespa_add_executable(vespalib_json_slime_benchmark_app
+ SOURCES
+ json_slime_benchmark.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_json_slime_benchmark_app COMMAND vespalib_json_slime_benchmark_app BENCHMARK)
diff --git a/vespalib/src/tests/slime/DESC b/vespalib/src/tests/slime/DESC
new file mode 100644
index 00000000000..48fe1f035d5
--- /dev/null
+++ b/vespalib/src/tests/slime/DESC
@@ -0,0 +1 @@
+slime test. Take a look at slime_test.cpp for details.
diff --git a/vespalib/src/tests/slime/FILES b/vespalib/src/tests/slime/FILES
new file mode 100644
index 00000000000..2c6542104c4
--- /dev/null
+++ b/vespalib/src/tests/slime/FILES
@@ -0,0 +1 @@
+slime.cpp
diff --git a/vespalib/src/tests/slime/json_slime_benchmark.cpp b/vespalib/src/tests/slime/json_slime_benchmark.cpp
new file mode 100644
index 00000000000..c3fc9aae8fa
--- /dev/null
+++ b/vespalib/src/tests/slime/json_slime_benchmark.cpp
@@ -0,0 +1,49 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+using namespace vespalib::slime::convenience;
+
+std::string make_json(const Slime &slime, bool compact) {
+ vespalib::slime::SimpleBuffer buf;
+ vespalib::slime::JsonFormat::encode(slime, buf, compact);
+ return buf.get().make_string();
+}
+
+bool parse_json(const std::string &json, Slime &slime) {
+ size_t size = vespalib::slime::JsonFormat::decode(json, slime);
+ if (size == 0) {
+ fprintf(stderr, "json parsing failed:\n%s", make_json(slime, false).c_str());
+ }
+ return (size > 0);
+}
+
+bool parse_json_bytes(const Memory & json, Slime &slime) {
+ size_t size = vespalib::slime::JsonFormat::decode(json, slime);
+ if (size == 0) {
+ fprintf(stderr, "json parsing failed:\n%s", make_json(slime, false).c_str());
+ }
+ return (size > 0);
+}
+
+
+int main(int argc, char *argv[])
+{
+ size_t numRep(10000);
+ if (argc > 1) {
+ numRep = strtoul(argv[1], 0, 0);
+ }
+ std::ifstream file("large_json.txt");
+ assert(file.is_open());
+ std::stringstream buf;
+ buf << file.rdbuf();
+ std::string str = buf.str();
+ Memory mem(str.c_str(), 18911);
+ for (size_t i(0); i < numRep; i++) {
+ Slime f;
+ assert(parse_json_bytes(mem, f));
+ }
+}
diff --git a/vespalib/src/tests/slime/large_json.txt b/vespalib/src/tests/slime/large_json.txt
new file mode 100644
index 00000000000..acbd6670e03
--- /dev/null
+++ b/vespalib/src/tests/slime/large_json.txt
@@ -0,0 +1 @@
+{"enablecompression":false,"documenttype":[{"id":784855608,"name":"citem","version":0,"headerstruct":-866931193,"bodystruct":-1517522468,"inherits":[{"id":8}],"datatype":[{"id":-1486737430,"type":"ARRAY","array":{"element":{"id":2}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":519906144,"type":"WSET","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":-1245117006,"type":"ARRAY","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":49942803,"type":"ARRAY","array":{"element":{"id":16}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":-866931193,"type":"STRUCT","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"citem.header","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[{"name":"language","id":435363685,"id_v6":546622125,"datatype":2},{"name":"uri","id":933242992,"id_v6":1003424810,"datatype":10},{"name":"status","id":852830761,"id_v6":776881831,"datatype":16},{"name":"docdate","id":1254214243,"id_v6":191720597,"datatype":4},{"name":"id","id":1454403853,"id_v6":844211182,"datatype":2},{"name":"code","id":1047901482,"id_v6":140643780,"datatype":2},{"name":"nameD","id":189858514,"id_v6":943573906,"datatype":2},{"name":"name","id":1160796772,"id_v6":774203930,"datatype":2},{"name":"category","id":2031128480,"id_v6":1625583997,"datatype":-1486737430},{"name":"cleaf","id":123825448,"id_v6":1542272661,"datatype":2},{"name":"genre","id":986714948,"id_v6":1993293790,"datatype":519906144},{"name":"dept","id":924361481,"id_v6":1490255535,"datatype":-1245117006},{"name":"genre_2","id":946709978,"id_v6":1814399280,"datatype":-1245117006},{"name":"genre_3","id":1776972183,"id_v6":1667329762,"datatype":-1245117006},{"name":"genre_4","id":87841772,"id_v6":1937263633,"datatype":-1245117006},{"name":"genre_5","id":1730594227,"id_v6":642452417,"datatype":-1245117006},{"name":"genre_6","id":1985096742,"id_v6":745070661,"datatype":-1245117006},{"name":"genre_7","id":1821037186,"id_v6":1833277503,"datatype":-1245117006},{"name":"genre_8","id":314173745,"id_v6":1083297611,"datatype":-1245117006},{"name":"genre_9","id":515369657,"id_v6":2016702427,"datatype":-1245117006},{"name":"brand","id":617336216,"id_v6":564260180,"datatype":-1486737430},{"name":"brandid","id":189236879,"id_v6":1966511954,"datatype":-1245117006},{"name":"brandid_1","id":1335980143,"id_v6":625630189,"datatype":0},{"name":"brandid_2","id":421828074,"id_v6":949959712,"datatype":0},{"name":"brandid_3","id":758627490,"id_v6":770038559,"datatype":0},{"name":"headlineD","id":1557890747,"id_v6":1724878663,"datatype":2},{"name":"headline","id":1208896334,"id_v6":692109539,"datatype":2},{"name":"descD","id":783486503,"id_v6":956698838,"datatype":2},{"name":"desc","id":1961873118,"id_v6":304006140,"datatype":2},{"name":"keywords","id":1813672906,"id_v6":869818048,"datatype":2},{"name":"storeid","id":1268807769,"id_v6":1344017957,"datatype":2},{"name":"salestart","id":650320347,"id_v6":732455893,"datatype":0},{"name":"saleend","id":907038828,"id_v6":1108574292,"datatype":0},{"name":"taxable","id":1053733100,"id_v6":1554592959,"datatype":16},{"name":"sortprice","id":478160134,"id_v6":251056137,"datatype":0},{"name":"originalprice","id":107373269,"id_v6":571759254,"datatype":0},{"name":"price","id":549824325,"id_v6":205748629,"datatype":0},{"name":"saleprice","id":865780411,"id_v6":331104110,"datatype":0},{"name":"discount","id":647421194,"id_v6":1568080510,"datatype":0},{"name":"discount_rate","id":1180796118,"id_v6":2011504929,"datatype":16},{"name":"imageid","id":1382962736,"id_v6":1249545117,"datatype":2},{"name":"productid","id":1356444670,"id_v6":896711412,"datatype":2},{"name":"personid","id":65404910,"id_v6":185499163,"datatype":2},{"name":"jan","id":1073782152,"id_v6":822355742,"datatype":2},{"name":"isbn","id":1262679987,"id_v6":627012254,"datatype":2},{"name":"model","id":599586840,"id_v6":1647858806,"datatype":2},{"name":"mobile","id":1953588352,"id_v6":1600237090,"datatype":16},{"name":"spec1","id":1713608552,"id_v6":312912941,"datatype":-1245117006},{"name":"spec2","id":1873842345,"id_v6":1459049838,"datatype":-1486737430},{"name":"store","id":1105139843,"id_v6":982164242,"datatype":2},{"name":"storenameD","id":1495377300,"id_v6":1597614722,"datatype":2},{"name":"storename","id":118626920,"id_v6":503053933,"datatype":2},{"name":"payment","id":2018011182,"id_v6":1084359918,"datatype":-1245117006},{"name":"delivery","id":1796657106,"id_v6":1440314023,"datatype":16},{"name":"spcode","id":2035531339,"id_v6":454377724,"datatype":-1486737430},{"name":"sold","id":1238792517,"id_v6":1085301879,"datatype":0},{"name":"pageviews","id":1442382399,"id_v6":758378852,"datatype":0},{"name":"reviews","id":22530911,"id_v6":1468332735,"datatype":0},{"name":"reviewavg","id":1496310789,"id_v6":618913939,"datatype":1},{"name":"affrate","id":2017556583,"id_v6":4976219,"datatype":0},{"name":"attrs","id":716969728,"id_v6":810894309,"datatype":2},{"name":"instock","id":12634285,"id_v6":497056029,"datatype":16},{"name":"tkeys","id":1718965472,"id_v6":938518489,"datatype":2},{"name":"groupid","id":1879962648,"id_v6":1048128619,"datatype":0},{"name":"class","id":557111118,"id_v6":1903599149,"datatype":16},{"name":"score","id":1230231885,"id_v6":1843403014,"datatype":1},{"name":"score2","id":454301483,"id_v6":479145107,"datatype":1},{"name":"idx1","id":1991617707,"id_v6":1173378714,"datatype":-1486737430},{"name":"trace","id":1935383192,"id_v6":915633106,"datatype":2},{"name":"exparea","id":169337027,"id_v6":577601190,"datatype":49942803},{"name":"expdeadline","id":381817403,"id_v6":1640436100,"datatype":0},{"name":"samedayarea","id":1004347803,"id_v6":1724270047,"datatype":49942803},{"name":"samedaydeadline","id":493841321,"id_v6":621285710,"datatype":16},{"name":"best_store","id":643054295,"id_v6":73087446,"datatype":16},{"name":"wallet","id":1163112227,"id_v6":788588345,"datatype":16},{"name":"expdelv","id":2041154762,"id_v6":1129673155,"datatype":16},{"name":"open_date","id":2044783273,"id_v6":658412928,"datatype":0},{"name":"point_ave","id":1976905433,"id_v6":303497577,"datatype":1},{"name":"num_customers","id":2065404982,"id_v6":1710383940,"datatype":0},{"name":"sales_amount","id":1929173809,"id_v6":758299516,"datatype":0},{"name":"condition","id":608242866,"id_v6":331738560,"datatype":16},{"name":"num_term","id":1728564276,"id_v6":210659892,"datatype":16},{"name":"num_dup_term","id":1179047309,"id_v6":474824707,"datatype":16},{"name":"releasedate","id":468943367,"id_v6":1257434843,"datatype":0},{"name":"allowoverdraft","id":671175733,"id_v6":481739305,"datatype":16},{"name":"gs_score","id":1191406364,"id_v6":273781593,"datatype":16},{"name":"on_sale","id":176562759,"id_v6":2078415488,"datatype":16},{"name":"seller","id":796522356,"id_v6":1971781547,"datatype":16},{"name":"rankfeatures","id":1883197392,"id_v6":699950698,"datatype":2},{"name":"summaryfeatures","id":1840337115,"id_v6":1981648971,"datatype":2}]}},{"id":-1517522468,"type":"STRUCT","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"citem.body","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}}],"annotationtype":[],"fieldsets":{"default":{"fields":["desc","headline","idx1","keywords","name","storename","tkeys"]},"exec_desc":{"fields":["headline","idx1","keywords","name","tkeys"]},"[document]":{"fields":["affrate","allowoverdraft","attrs","best_store","brand","brandid","brandid_1","brandid_2","brandid_3","category","class","cleaf","code","condition","delivery","dept","desc","descD","discount","discount_rate","docdate","exparea","expdeadline","expdelv","genre","genre_2","genre_3","genre_4","genre_5","genre_6","genre_7","genre_8","genre_9","groupid","gs_score","headline","headlineD","id","idx1","imageid","instock","isbn","jan","keywords","language","mobile","model","name","nameD","num_customers","num_dup_term","num_term","on_sale","open_date","originalprice","pageviews","payment","personid","point_ave","price","productid","releasedate","reviewavg","reviews","saleend","saleprice","sales_amount","salestart","samedayarea","samedaydeadline","score","score2","seller","sold","sortprice","spcode","spec1","spec2","status","store","storeid","storename","storenameD","taxable","tkeys","trace","uri","wallet"]}}},{"id":-1178662891,"name":"item","version":0,"headerstruct":1938732426,"bodystruct":-1411809761,"inherits":[{"id":8}],"datatype":[{"id":-1486737430,"type":"ARRAY","array":{"element":{"id":2}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":519906144,"type":"WSET","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":-1245117006,"type":"ARRAY","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":49942803,"type":"ARRAY","array":{"element":{"id":16}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}},{"id":1938732426,"type":"STRUCT","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"item.header","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[{"name":"language","id":435363685,"id_v6":546622125,"datatype":2},{"name":"uri","id":933242992,"id_v6":1003424810,"datatype":10},{"name":"status","id":852830761,"id_v6":776881831,"datatype":16},{"name":"docdate","id":1254214243,"id_v6":191720597,"datatype":4},{"name":"id","id":1454403853,"id_v6":844211182,"datatype":2},{"name":"code","id":1047901482,"id_v6":140643780,"datatype":2},{"name":"nameD","id":189858514,"id_v6":943573906,"datatype":2},{"name":"name","id":1160796772,"id_v6":774203930,"datatype":2},{"name":"category","id":2031128480,"id_v6":1625583997,"datatype":-1486737430},{"name":"cleaf","id":123825448,"id_v6":1542272661,"datatype":2},{"name":"genre","id":986714948,"id_v6":1993293790,"datatype":519906144},{"name":"dept","id":924361481,"id_v6":1490255535,"datatype":-1245117006},{"name":"genre_2","id":946709978,"id_v6":1814399280,"datatype":-1245117006},{"name":"genre_3","id":1776972183,"id_v6":1667329762,"datatype":-1245117006},{"name":"genre_4","id":87841772,"id_v6":1937263633,"datatype":-1245117006},{"name":"genre_5","id":1730594227,"id_v6":642452417,"datatype":-1245117006},{"name":"genre_6","id":1985096742,"id_v6":745070661,"datatype":-1245117006},{"name":"genre_7","id":1821037186,"id_v6":1833277503,"datatype":-1245117006},{"name":"genre_8","id":314173745,"id_v6":1083297611,"datatype":-1245117006},{"name":"genre_9","id":515369657,"id_v6":2016702427,"datatype":-1245117006},{"name":"brand","id":617336216,"id_v6":564260180,"datatype":-1486737430},{"name":"brandid","id":189236879,"id_v6":1966511954,"datatype":-1245117006},{"name":"brandid_1","id":1335980143,"id_v6":625630189,"datatype":0},{"name":"brandid_2","id":421828074,"id_v6":949959712,"datatype":0},{"name":"brandid_3","id":758627490,"id_v6":770038559,"datatype":0},{"name":"headlineD","id":1557890747,"id_v6":1724878663,"datatype":2},{"name":"headline","id":1208896334,"id_v6":692109539,"datatype":2},{"name":"descD","id":783486503,"id_v6":956698838,"datatype":2},{"name":"desc","id":1961873118,"id_v6":304006140,"datatype":2},{"name":"keywords","id":1813672906,"id_v6":869818048,"datatype":2},{"name":"storeid","id":1268807769,"id_v6":1344017957,"datatype":2},{"name":"salestart","id":650320347,"id_v6":732455893,"datatype":0},{"name":"saleend","id":907038828,"id_v6":1108574292,"datatype":0},{"name":"taxable","id":1053733100,"id_v6":1554592959,"datatype":16},{"name":"sortprice","id":478160134,"id_v6":251056137,"datatype":0},{"name":"originalprice","id":107373269,"id_v6":571759254,"datatype":0},{"name":"price","id":549824325,"id_v6":205748629,"datatype":0},{"name":"saleprice","id":865780411,"id_v6":331104110,"datatype":0},{"name":"discount","id":647421194,"id_v6":1568080510,"datatype":0},{"name":"discount_rate","id":1180796118,"id_v6":2011504929,"datatype":16},{"name":"imageid","id":1382962736,"id_v6":1249545117,"datatype":2},{"name":"productid","id":1356444670,"id_v6":896711412,"datatype":2},{"name":"personid","id":65404910,"id_v6":185499163,"datatype":2},{"name":"jan","id":1073782152,"id_v6":822355742,"datatype":2},{"name":"isbn","id":1262679987,"id_v6":627012254,"datatype":2},{"name":"model","id":599586840,"id_v6":1647858806,"datatype":2},{"name":"mobile","id":1953588352,"id_v6":1600237090,"datatype":16},{"name":"spec1","id":1713608552,"id_v6":312912941,"datatype":-1245117006},{"name":"spec2","id":1873842345,"id_v6":1459049838,"datatype":-1486737430},{"name":"store","id":1105139843,"id_v6":982164242,"datatype":2},{"name":"storenameD","id":1495377300,"id_v6":1597614722,"datatype":2},{"name":"storename","id":118626920,"id_v6":503053933,"datatype":2},{"name":"payment","id":2018011182,"id_v6":1084359918,"datatype":-1245117006},{"name":"delivery","id":1796657106,"id_v6":1440314023,"datatype":16},{"name":"spcode","id":2035531339,"id_v6":454377724,"datatype":-1486737430},{"name":"sold","id":1238792517,"id_v6":1085301879,"datatype":0},{"name":"pageviews","id":1442382399,"id_v6":758378852,"datatype":0},{"name":"reviews","id":22530911,"id_v6":1468332735,"datatype":0},{"name":"reviewavg","id":1496310789,"id_v6":618913939,"datatype":1},{"name":"affrate","id":2017556583,"id_v6":4976219,"datatype":0},{"name":"attrs","id":716969728,"id_v6":810894309,"datatype":2},{"name":"instock","id":12634285,"id_v6":497056029,"datatype":16},{"name":"tkeys","id":1718965472,"id_v6":938518489,"datatype":2},{"name":"groupid","id":1879962648,"id_v6":1048128619,"datatype":0},{"name":"class","id":557111118,"id_v6":1903599149,"datatype":16},{"name":"score","id":1230231885,"id_v6":1843403014,"datatype":1},{"name":"score2","id":454301483,"id_v6":479145107,"datatype":1},{"name":"idx1","id":1991617707,"id_v6":1173378714,"datatype":-1486737430},{"name":"trace","id":1935383192,"id_v6":915633106,"datatype":2},{"name":"exparea","id":169337027,"id_v6":577601190,"datatype":49942803},{"name":"expdeadline","id":381817403,"id_v6":1640436100,"datatype":0},{"name":"samedayarea","id":1004347803,"id_v6":1724270047,"datatype":49942803},{"name":"samedaydeadline","id":493841321,"id_v6":621285710,"datatype":16},{"name":"best_store","id":643054295,"id_v6":73087446,"datatype":16},{"name":"wallet","id":1163112227,"id_v6":788588345,"datatype":16},{"name":"expdelv","id":2041154762,"id_v6":1129673155,"datatype":16},{"name":"open_date","id":2044783273,"id_v6":658412928,"datatype":0},{"name":"point_ave","id":1976905433,"id_v6":303497577,"datatype":1},{"name":"num_customers","id":2065404982,"id_v6":1710383940,"datatype":0},{"name":"sales_amount","id":1929173809,"id_v6":758299516,"datatype":0},{"name":"condition","id":608242866,"id_v6":331738560,"datatype":16},{"name":"num_term","id":1728564276,"id_v6":210659892,"datatype":16},{"name":"num_dup_term","id":1179047309,"id_v6":474824707,"datatype":16},{"name":"releasedate","id":468943367,"id_v6":1257434843,"datatype":0},{"name":"allowoverdraft","id":671175733,"id_v6":481739305,"datatype":16},{"name":"gs_score","id":1191406364,"id_v6":273781593,"datatype":16},{"name":"on_sale","id":176562759,"id_v6":2078415488,"datatype":16},{"name":"seller","id":796522356,"id_v6":1971781547,"datatype":16},{"name":"rankfeatures","id":1883197392,"id_v6":699950698,"datatype":2},{"name":"summaryfeatures","id":1840337115,"id_v6":1981648971,"datatype":2}]}},{"id":-1411809761,"type":"STRUCT","array":{"element":{"id":0}},"map":{"key":{"id":0},"value":{"id":0}},"wset":{"key":{"id":0},"createifnonexistent":false,"removeifzero":false},"annotationref":{"annotation":{"id":0}},"sstruct":{"name":"item.body","version":0,"compression":{"type":"NONE","level":0,"threshold":95,"minsize":200},"field":[]}}],"annotationtype":[],"fieldsets":{"default":{"fields":["desc","headline","idx1","keywords","name","storename","tkeys"]},"exec_desc":{"fields":["headline","idx1","keywords","name","tkeys"]},"[document]":{"fields":["affrate","allowoverdraft","attrs","best_store","brand","brandid","brandid_1","brandid_2","brandid_3","category","class","cleaf","code","condition","delivery","dept","desc","descD","discount","discount_rate","docdate","exparea","expdeadline","expdelv","genre","genre_2","genre_3","genre_4","genre_5","genre_6","genre_7","genre_8","genre_9","groupid","gs_score","headline","headlineD","id","idx1","imageid","instock","isbn","jan","keywords","language","mobile","model","name","nameD","num_customers","num_dup_term","num_term","on_sale","open_date","originalprice","pageviews","payment","personid","point_ave","price","productid","releasedate","reviewavg","reviews","saleend","saleprice","sales_amount","salestart","samedayarea","samedaydeadline","score","score2","seller","sold","sortprice","spcode","spec1","spec2","status","store","storeid","storename","storenameD","taxable","tkeys","trace","uri","wallet"]}}}]}te(score) < 0.1691945, if (fieldMatch(name).segmentDistance < 9.5000000, 0.0009342, -0.0184468), if (fieldMatch(tkeys) < 0.0783665, if (fieldTermMatch(name,4).firstPosition < 500008.0000000, 0.0752831, if (fieldMatch(name) < 0.2502125, if (fieldMatch(name).significance < 0.2111095, if (elementCompleteness(keywords).completeness < 0.3546365, 0.0392066, -0.0569857), 0.0765190), if (fieldMatch(name).importance < 0.2732690, -0.1545457, 0.0083370))), if (fieldMatch(headline).absoluteProximity < 0.0708335, 0.0189543, if (fieldMatch(name).significantOccurrence < 0.1304820, if (fieldMatch(name).significantOccurrence < 0.1183590, -0.0555223, -0.1872806), 0.0082689)))) + if (elementCompleteness(keywords).completeness < 0.2264955, -0.0014840, if (elementCompleteness(keywords).completeness < 0.2442525, 0.0744971, if (elementCompleteness(name).completeness < 0.2251480, if (fieldMatch(keywords) < 0.1939175, if (fieldMatch(name).significantOccurrence < 0.1464285, -0.0330452, -0.1355962), if (fieldMatch(keywords) < 0.2076725, 0.1343885, if (fieldMatch(keywords) < 0.2894105, -0.0812194, 0.0199283))), if (elementCompleteness(name).queryCompleteness < 0.4903845, if (fieldMatch(name).importance < 0.3139750, 0.0155742, 0.0896682), if (elementCompleteness(keywords).completeness < 0.2794690, 0.0229360, if (fieldMatch(name) < 0.0830015, 0.1293931, 0.0012901)))))) + if (attribute(instock) < 0.5000000, if (fieldMatch(name).significance < 0.8439580, -0.0165343, 0.1433531), if (elementCompleteness(keywords).completeness < 0.2311250, if (attribute(score) < 0.0210720, -0.0089232, if (fieldMatch(headline).weight < 0.2855610, if (fieldMatch(headline).weight < 0.0781250, 0.0033729, 0.0213965), if (fieldMatch(name).importance < 0.3816990, if (fieldMatch(name).significance < 0.4183795, if (elementCompleteness(headline).completeness < 0.4954545, if (fieldTermMatch(headline,2).firstPosition < 500006.0000000, 0.0204395, -0.0896445), -0.0050624), -0.1067589), -0.0016382))), if (elementCompleteness(keywords).completeness < 0.2442525, 0.0633352, 0.0027452)))" \ No newline at end of file
diff --git a/vespalib/src/tests/slime/slime_binary_format_test.cpp b/vespalib/src/tests/slime/slime_binary_format_test.cpp
new file mode 100644
index 00000000000..f35e0637a67
--- /dev/null
+++ b/vespalib/src/tests/slime/slime_binary_format_test.cpp
@@ -0,0 +1,754 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include "type_traits.h"
+#include <vespa/vespalib/util/stringfmt.h>
+
+using namespace vespalib::slime::convenience;
+using namespace vespalib::slime::binary_format;
+using namespace vespalib::slime;
+
+//-----------------------------------------------------------------------------
+
+const uint32_t TYPE_LIMIT = 8; // 3 bits for type
+const uint32_t META_LIMIT = 32; // 5 bits for meta
+const uint32_t MAX_CMPR_SIZE = 10; // 70 bits
+const uint32_t MAX_NUM_SIZE = 8; // int64_t or double
+const uint32_t HEX_COUNT = 25; // bytes per line in hex dump
+
+//-----------------------------------------------------------------------------
+
+struct MemCmp {
+ Memory memory;
+ explicit MemCmp(const Memory &mem) : memory(mem) {}
+ bool operator==(const MemCmp &rhs) const {
+ if (memory.size != rhs.memory.size) {
+ return false;
+ }
+ for (size_t i = 0; i < memory.size; ++i) {
+ if (memory.data[i] != rhs.memory.data[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+};
+
+std::ostream &operator<<(std::ostream &os, const MemCmp &obj) {
+ uint32_t written = 0;
+ os << "size: " << obj.memory.size << "(bytes)" << std::endl;
+ for (size_t i = 0; i < obj.memory.size; ++i, ++written) {
+ if (written > HEX_COUNT) {
+ os << std::endl;
+ written = 0;
+ }
+ os << vespalib::make_string("0x%02x ", obj.memory.data[i] & 0xff);
+ }
+ if (written > 0) {
+ os << std::endl;
+ }
+ return os;
+}
+
+//-----------------------------------------------------------------------------
+
+void verify_cmpr_ulong(uint64_t value, SimpleBuffer expect) {
+ SimpleBuffer buf1;
+ SimpleBuffer buf2;
+ { // use direct low-level encode
+ char tmp[MAX_CMPR_SIZE];
+ uint32_t len = encode_cmpr_ulong(tmp, value);
+ for (size_t i = 0; i < len; ++i) {
+ buf1.add(tmp[i]);
+ }
+ }
+ { // use write API
+ BufferedOutput out(buf2);
+ write_cmpr_ulong(out, value);
+ }
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(buf1.get()));
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(buf2.get()));
+ {
+ BufferedInput input(expect.get());
+ EXPECT_EQUAL(value, read_cmpr_ulong(input));
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(input.getConsumed()));
+ EXPECT_TRUE(!input.failed());
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+void verifyMultiEncode(const Slime & slime, const SimpleBuffer &expect) {
+ size_t cnt = 5;
+ std::vector<SimpleBuffer> buffers(cnt);
+ BinaryFormat::encode(slime, buffers[0]);
+ for (size_t i = 1; i < cnt; ++i) {
+ Slime s;
+ EXPECT_TRUE(BinaryFormat::decode(buffers[i - 1].get(), s));
+ BinaryFormat::encode(s, buffers[i]);
+ EXPECT_EQUAL(expect.get().size, buffers[i].get().size);
+ EXPECT_EQUAL(slime, s);
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+namespace {
+template <typename T>
+void encodeBasic(BufferedOutput &out,
+ const typename TypeTraits<T>::PassType &value);
+
+template <>
+void encodeBasic<BOOL>(BufferedOutput &out, const bool &value)
+{
+ out.writeByte(encode_type_and_meta(BOOL::ID, value ? 1 : 0));
+}
+
+template <> void encodeBasic<LONG>(BufferedOutput &out, const int64_t &value)
+{
+ write_type_and_bytes<false>(out, LONG::ID, encode_zigzag(value));
+}
+
+template <> void encodeBasic<DOUBLE>(BufferedOutput &out, const double &value)
+{
+ write_type_and_bytes<true>(out, DOUBLE::ID, encode_double(value));
+}
+
+template <> void encodeBasic<STRING>(BufferedOutput &out, const Memory &value)
+{
+ write_type_and_size(out, STRING::ID, value.size);
+ out.writeBytes(value.data, value.size);
+}
+
+template <> void encodeBasic<DATA>(BufferedOutput &out, const Memory &value)
+{
+ write_type_and_size(out, DATA::ID, value.size);
+ out.writeBytes(value.data, value.size);
+}
+} // namespace <unnamed>
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+void
+setSlimeValue(Slime& slime, const typename TypeTraits<T>::PassType &value);
+
+template <>
+void
+setSlimeValue<BOOL>(Slime& slime, const TypeTraits<BOOL>::PassType &value) {
+ slime.setBool(value);
+}
+template <>
+void
+setSlimeValue<LONG>(Slime& slime, const TypeTraits<LONG>::PassType &value) {
+ slime.setLong(value);
+}
+template <>
+void
+setSlimeValue<DOUBLE>(Slime& slime, const TypeTraits<DOUBLE>::PassType &value) {
+ slime.setDouble(value);
+}
+template <>
+void
+setSlimeValue<STRING>(Slime& slime, const TypeTraits<STRING>::PassType &value) {
+ slime.setString(value);
+}
+template <>
+void
+setSlimeValue<DATA>(Slime& slime, const TypeTraits<DATA>::PassType &value) {
+ slime.setData(value);
+}
+
+
+template <typename T>
+void verifyBasic(const typename TypeTraits<T>::PassType &value) {
+ Slime slime;
+ setSlimeValue<T>(slime, value);
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ {
+ BufferedOutput out(expect);
+ write_cmpr_ulong(out, 0); // num symbols
+ encodeBasic<T>(out, value);
+ }
+ BinaryFormat::encode(slime, actual);
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(actual.get()));
+ TEST_DO(verifyMultiEncode(slime, expect));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("testZigZagConversion") {
+ EXPECT_EQUAL(0UL, encode_zigzag(0L));
+ EXPECT_EQUAL(0L, decode_zigzag(encode_zigzag(0L)));
+
+ EXPECT_EQUAL(1UL, encode_zigzag(-1L));
+ EXPECT_EQUAL(-1L, decode_zigzag(encode_zigzag(-1L)));
+
+ EXPECT_EQUAL(2UL, encode_zigzag(1L));
+ EXPECT_EQUAL(1L, decode_zigzag(encode_zigzag(1L)));
+
+ EXPECT_EQUAL(3UL, encode_zigzag(-2L));
+ EXPECT_EQUAL(-2L, decode_zigzag(encode_zigzag(-2L)));
+
+ EXPECT_EQUAL(4UL, encode_zigzag(2L));
+ EXPECT_EQUAL(2L, decode_zigzag(encode_zigzag(2L)));
+
+ EXPECT_EQUAL(1999UL, encode_zigzag(-1000L));
+ EXPECT_EQUAL(-1000L, decode_zigzag(encode_zigzag(-1000L)));
+
+ EXPECT_EQUAL(2000UL, encode_zigzag(1000L));
+ EXPECT_EQUAL(1000L, decode_zigzag(encode_zigzag(1000L)));
+
+ EXPECT_EQUAL(0xffffffffffffffffUL,
+ encode_zigzag(0x8000000000000000L));
+ EXPECT_EQUAL(int64_t(0x8000000000000000L),
+ decode_zigzag(encode_zigzag(0x8000000000000000L)));
+
+ EXPECT_EQUAL(0xfffffffffffffffeUL,
+ encode_zigzag(0x7fffffffffffffffL));
+ EXPECT_EQUAL(0x7fffffffffffffffL,
+ decode_zigzag(encode_zigzag(0x7fffffffffffffffL)));
+}
+
+TEST("testDoubleConversion") {
+ EXPECT_EQUAL(0UL, encode_double(0.0));
+ EXPECT_EQUAL(0.0, decode_double(encode_double(0.0)));
+
+ EXPECT_EQUAL(0x8000000000000000UL, encode_double(-0.0));
+ EXPECT_EQUAL(-0.0, decode_double(encode_double(-0.0)));
+
+ EXPECT_EQUAL(0x3ff0000000000000UL, encode_double(1.0));
+ EXPECT_EQUAL(1.0, decode_double(encode_double(1.0)));
+
+ EXPECT_EQUAL(0xbff0000000000000UL, encode_double(-1.0));
+ EXPECT_EQUAL(-1.0, decode_double(encode_double(-1.0)));
+
+ EXPECT_EQUAL(0x4000000000000000UL, encode_double(2.0));
+ EXPECT_EQUAL(2.0, decode_double(encode_double(2.0)));
+
+ EXPECT_EQUAL(0xc000000000000000UL, encode_double(-2.0));
+ EXPECT_EQUAL(-2.0, decode_double(encode_double(-2.0)));
+}
+
+TEST("testTypeAndMetaMangling") {
+ for (uint32_t type = 0; type < TYPE_LIMIT; ++type) {
+ for (uint32_t meta = 0; meta < META_LIMIT; ++meta) {
+ char mangled = encode_type_and_meta(type, meta);
+ EXPECT_EQUAL(type, decode_type(mangled));
+ EXPECT_EQUAL(meta, decode_meta(mangled));
+ }
+ }
+}
+
+TEST("testCmprUlong") {
+ // check min/max values for different byte counts
+ for (uint32_t n = 1; n <= MAX_CMPR_SIZE; ++n) {
+ TEST_STATE(vespalib::make_string("n = %d", n).c_str());
+ uint64_t min = (n == 1) ? 0x00
+ : (1L << ((n - 1) * 7));
+ uint64_t max = (n == MAX_CMPR_SIZE) ? 0xffffffffffffffff
+ : (1L << (n * 7)) - 1;
+ SimpleBuffer expect_min;
+ SimpleBuffer expect_max;
+ for (uint32_t i = 0; i < n; ++i) {
+ if (i + 1 < n) {
+ expect_min.add(0x80);
+ expect_max.add(0xff);
+ } else {
+ if (n == 1) {
+ expect_min.add(0x00);
+ } else {
+ expect_min.add(0x01);
+ }
+ if (n == MAX_CMPR_SIZE) {
+ expect_max.add(0x01);
+ } else {
+ expect_max.add(0x7f);
+ }
+ }
+ }
+ TEST_DO(verify_cmpr_ulong(min, expect_min));
+ TEST_DO(verify_cmpr_ulong(max, expect_max));
+ }
+ // check byte order and data preservation
+ for (int mul = 1; mul <= 15; ++mul) { // 8(i) * 15(mul) = 120 <= 127 = 0x7f
+ TEST_STATE(vespalib::make_string("mul = %d", mul).c_str());
+ SimpleBuffer expect;
+ uint64_t value = 0;
+ for (uint32_t i = 0; i < MAX_CMPR_SIZE - 1; ++i) {
+ value |= (uint64_t(i * mul) << (i * 7));
+ if (i < MAX_CMPR_SIZE - 2) {
+ expect.add(0x80 + (i * mul));
+ } else {
+ expect.add(i * mul);
+ }
+ }
+ TEST_DO(verify_cmpr_ulong(value, expect));
+ }
+}
+
+TEST("testWriteByte") {
+ SimpleBuffer buf;
+ {
+ BufferedOutput out(buf);
+ out.writeByte(0x55);
+ }
+ EXPECT_EQUAL(1u, buf.get().size);
+ EXPECT_EQUAL(0x55, buf.get().data[0]);
+ {
+ BufferedOutput out(buf);
+ out.writeByte(0x66);
+ out.writeByte(0x77);
+ }
+ EXPECT_EQUAL(3u, buf.get().size);
+ EXPECT_EQUAL(0x55, buf.get().data[0]);
+ EXPECT_EQUAL(0x66, buf.get().data[1]);
+ EXPECT_EQUAL(0x77, buf.get().data[2]);
+}
+
+TEST("testWriteBytes") {
+ SimpleBuffer buf;
+ {
+ BufferedOutput out(buf);
+ out.writeBytes(0, 0);
+ }
+ EXPECT_EQUAL(0u, buf.get().size);
+ {
+ BufferedOutput out(buf);
+ char tmp[] = { 0x55 };
+ out.writeBytes(tmp, 1);
+ }
+ EXPECT_EQUAL(1u, buf.get().size);
+ EXPECT_EQUAL(0x55, buf.get().data[0]);
+ {
+ BufferedOutput out(buf);
+ char tmp[] = { 0x66, 0x77 };
+ out.writeBytes(tmp, 2);
+ }
+ EXPECT_EQUAL(3u, buf.get().size);
+ EXPECT_EQUAL(0x55, buf.get().data[0]);
+ EXPECT_EQUAL(0x66, buf.get().data[1]);
+ EXPECT_EQUAL(0x77, buf.get().data[2]);
+}
+
+TEST("testReadByte") {
+ SimpleBuffer buf;
+ buf.add(0x11).add(0x22).add(0x33);
+ {
+ BufferedInput in(buf.get());
+ EXPECT_EQUAL(0u, in.getConsumed().size);
+ EXPECT_EQUAL(0x11, in.getByte());
+ EXPECT_EQUAL(1u, in.getConsumed().size);
+ EXPECT_EQUAL(0x22, in.getByte());
+ EXPECT_EQUAL(2u, in.getConsumed().size);
+ EXPECT_EQUAL(0x33, in.getByte());
+ EXPECT_EQUAL(3u, in.getConsumed().size);
+ EXPECT_TRUE(!in.failed());
+ EXPECT_EQUAL(0u, in.getOffending().size);
+ EXPECT_EQUAL(0x00, in.getByte());
+ EXPECT_TRUE(in.failed());
+ EXPECT_EQUAL(0u, in.getConsumed().size);
+ EXPECT_EQUAL(3u, in.getOffending().size);
+ EXPECT_EQUAL(0x00, in.getByte());
+ EXPECT_EQUAL(0x00, in.getByte());
+ EXPECT_EQUAL(0x00, in.getByte());
+ }
+}
+
+TEST("testReadBytes") {
+ SimpleBuffer buf;
+ buf.add('a').add('b').add('c');
+ {
+ BufferedInput in(buf.get());
+ EXPECT_EQUAL(0u, in.getConsumed().size);
+ EXPECT_EQUAL("ab", in.getBytes(2).make_string());
+ EXPECT_EQUAL(2u, in.getConsumed().size);
+ EXPECT_TRUE(!in.failed());
+ EXPECT_EQUAL(0u, in.getOffending().size);
+ EXPECT_EQUAL(0u, in.getBytes(2).size);
+ EXPECT_TRUE(in.failed());
+ EXPECT_EQUAL(0u, in.getConsumed().size);
+ EXPECT_EQUAL(3u, in.getOffending().size);
+ EXPECT_EQUAL(0u, in.getBytes(2).size);
+ EXPECT_EQUAL(0u, in.getBytes(2).size);
+ EXPECT_EQUAL(0u, in.getBytes(2).size);
+ }
+}
+
+TEST("testTypeAndSize") {
+ for (uint32_t type = 0; type < TYPE_LIMIT; ++type) {
+ for (uint32_t size = 0; size < 500; ++size) {
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ {
+ BufferedOutput expect_out(expect);
+ if ((size + 1) < META_LIMIT) {
+ expect_out.writeByte(encode_type_and_meta(type, size + 1));
+ } else {
+ expect_out.writeByte(type);
+ write_cmpr_ulong(expect_out, size);
+ }
+ }
+ {
+ BufferedOutput actual_out(actual);
+ write_type_and_size(actual_out, type, size);
+ }
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(actual.get()));
+ {
+ BufferedInput input(expect.get());
+ char byte = input.getByte();
+ uint32_t decodedType = decode_type(byte);
+ uint64_t decodedSize = read_size(input, decode_meta(byte));
+ EXPECT_EQUAL(type, decodedType);
+ EXPECT_EQUAL(size, decodedSize);
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(input.getConsumed()));
+ EXPECT_TRUE(!input.failed());
+ }
+ }
+ }
+}
+
+namespace {
+
+uint64_t build_bits(uint32_t type, uint32_t n, uint32_t pre, bool hi,
+ SimpleBuffer &expect)
+{
+ uint64_t value = 0;
+ expect.add(encode_type_and_meta(type, n));
+ for (uint32_t i = 0; i < n; ++i) {
+ char byte = (i < pre) ? 0x00 : (0x11 * (i - pre + 1));
+ expect.add(byte);
+ int shift = hi ? ((7 - i) * 8) : (i * 8);
+ value |= ((uint64_t(byte)&0xff) << shift);
+ }
+ return value;
+}
+
+} // namespace <unnamed>
+
+TEST("testTypeAndBytes") {
+ for (uint32_t type = 0; type < TYPE_LIMIT; ++type) {
+ TEST_STATE(vespalib::make_string("type = %d",
+ type).c_str());
+ for (uint32_t n = 0; n <= MAX_NUM_SIZE; ++n) {
+ TEST_STATE(vespalib::make_string("n = %d",
+ n).c_str());
+ for (uint32_t pre = 0; (pre == 0) || (pre < n); ++pre) {
+ TEST_STATE(vespalib::make_string("pre = %d",
+ pre).c_str());
+ for (int hi = 0; hi < 2; ++hi) {
+ TEST_STATE(vespalib::make_string("hi = %d",
+ hi).c_str());
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ uint64_t bits = build_bits(type, n, pre,
+ (hi != 0), expect);
+ {
+ BufferedOutput out(actual);
+ if (hi != 0) {
+ write_type_and_bytes<true>(out, type, bits);
+ } else {
+ write_type_and_bytes<false>(out, type, bits);
+ }
+ }
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(actual.get()));
+ {
+ BufferedInput input(expect.get());
+ uint32_t size = decode_meta(input.getByte());
+ uint64_t decodedBits;
+ if (hi != 0) {
+ decodedBits = read_bytes<true>(input, size);
+ } else {
+ decodedBits = read_bytes<false>(input, size);
+ }
+ EXPECT_EQUAL(bits, decodedBits);
+ EXPECT_EQUAL(MemCmp(expect.get()),
+ MemCmp(input.getConsumed()));
+ EXPECT_TRUE(!input.failed());
+ }
+ }
+ }
+ }
+ }
+}
+
+TEST("testEmpty") {
+ Slime slime;
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ {
+ BufferedOutput out(expect);
+ write_cmpr_ulong(out, 0); // num symbols
+ out.writeByte(0); // nix
+ }
+ BinaryFormat::encode(slime, actual);
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(actual.get()));
+ TEST_DO(verifyMultiEncode(slime, expect));
+}
+
+TEST("testBasic") {
+ TEST_DO(verifyBasic<BOOL>(false));
+ TEST_DO(verifyBasic<BOOL>(true));
+
+ TEST_DO(verifyBasic<LONG>(0));
+ TEST_DO(verifyBasic<LONG>(123));
+ TEST_DO(verifyBasic<LONG>(-123));
+ TEST_DO(verifyBasic<LONG>(123456));
+ TEST_DO(verifyBasic<LONG>(-123456));
+ TEST_DO(verifyBasic<LONG>(123456789));
+ TEST_DO(verifyBasic<LONG>(-123456789));
+
+ TEST_DO(verifyBasic<DOUBLE>(0.0));
+ TEST_DO(verifyBasic<DOUBLE>(2.5));
+ TEST_DO(verifyBasic<DOUBLE>(-2.5));
+ TEST_DO(verifyBasic<DOUBLE>(-1000.0));
+ TEST_DO(verifyBasic<DOUBLE>(1000.0));
+ TEST_DO(verifyBasic<DOUBLE>(1.0e32));
+ TEST_DO(verifyBasic<DOUBLE>(-1.0e32));
+ TEST_DO(verifyBasic<DOUBLE>(1.0e-32));
+ TEST_DO(verifyBasic<DOUBLE>(-1.0e-32));
+
+ TEST_DO(verifyBasic<STRING>(Memory("foo")));
+ TEST_DO(verifyBasic<STRING>(Memory("bar")));
+ EXPECT_EQUAL(500u, std::string(500, 'x').size());
+ TEST_DO(verifyBasic<STRING>(Memory(std::string(500, 'x'))));
+
+ TEST_DO(verifyBasic<DATA>(Memory("foo")));
+ TEST_DO(verifyBasic<DATA>(Memory("bar")));
+ EXPECT_EQUAL(500u, std::string(500, 'x').size());
+ TEST_DO(verifyBasic<DATA>(Memory(std::string(500, 'x'))));
+}
+
+TEST("testArray") {
+ Slime slime;
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ Cursor &c = slime.setArray();
+ c.addNix();
+ c.addBool(true);
+ c.addLong(5);
+ c.addDouble(3.5);
+ c.addString(Memory("string"));
+ c.addData(Memory("data"));
+ {
+ BufferedOutput out(expect);
+ write_cmpr_ulong(out, 0); // num symbols
+ write_type_and_size(out, ARRAY::ID, 6);
+ out.writeByte(0);
+ encodeBasic<BOOL>(out, true);
+ encodeBasic<LONG>(out, 5);
+ encodeBasic<DOUBLE>(out, 3.5);
+ encodeBasic<STRING>(out, Memory("string"));
+ encodeBasic<DATA>(out, Memory("data"));
+ }
+ BinaryFormat::encode(slime, actual);
+ EXPECT_EQUAL(MemCmp(expect.get()), MemCmp(actual.get()));
+ TEST_DO(verifyMultiEncode(slime, expect));
+}
+
+TEST("testObject") {
+ Slime slime;
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ Cursor &c = slime.setObject();
+ c.setNix("a");
+ c.setBool("b", true);
+ c.setLong("c", 5);
+ c.setDouble("d", 3.5);
+ c.setString("e", Memory("string"));
+ c.setData("f", Memory("data"));
+ {
+ BufferedOutput out(expect);
+ write_cmpr_ulong(out, 6); // num symbols
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("a", 1); // 0
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("b", 1); // 1
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("c", 1); // 2
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("d", 1); // 3
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("e", 1); // 4
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("f", 1); // 5
+ write_type_and_size(out, OBJECT::ID, 6);
+ write_cmpr_ulong(out, 0);
+ out.writeByte(0);
+ write_cmpr_ulong(out, 1);
+ encodeBasic<BOOL>(out, true);
+ write_cmpr_ulong(out, 2);
+ encodeBasic<LONG>(out, 5);
+ write_cmpr_ulong(out, 3);
+ encodeBasic<DOUBLE>(out, 3.5);
+ write_cmpr_ulong(out, 4);
+ encodeBasic<STRING>(out, Memory("string"));
+ write_cmpr_ulong(out, 5);
+ encodeBasic<DATA>(out, Memory("data"));
+ }
+ BinaryFormat::encode(slime, actual);
+ EXPECT_EQUAL(expect.get().size, actual.get().size);
+ TEST_DO(verifyMultiEncode(slime, expect));
+}
+
+TEST("testNesting") {
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ Slime slime;
+ {
+ Cursor &c1 = slime.setObject();
+ {
+ c1.setLong("bar", 10);
+ {
+ Cursor &c2 = c1.setArray("foo");
+ c2.addLong(20); // [0]
+ {
+ Cursor &c3 = c2.addObject(); // [1]
+ c3.setLong("answer", 42);
+ }
+ }
+ }
+ }
+ {
+ BufferedOutput out(expect);
+ write_cmpr_ulong(out, 3); // num symbols
+ write_cmpr_ulong(out, 3);
+ out.writeBytes("bar", 3); // 0
+ write_cmpr_ulong(out, 3);
+ out.writeBytes("foo", 3); // 1
+ write_cmpr_ulong(out, 6);
+ out.writeBytes("answer", 6); // 2
+ write_type_and_size(out, OBJECT::ID, 2);
+ write_cmpr_ulong(out, 0); // bar
+ encodeBasic<LONG>(out, 10);
+ write_cmpr_ulong(out, 1); // foo
+ write_type_and_size(out, ARRAY::ID, 2);
+ encodeBasic<LONG>(out, 20);
+ write_type_and_size(out, OBJECT::ID, 1);
+ write_cmpr_ulong(out, 2); // answer
+ encodeBasic<LONG>(out, 42);
+ }
+ BinaryFormat::encode(slime, actual);
+ EXPECT_EQUAL(expect.get().size, actual.get().size);
+ TEST_DO(verifyMultiEncode(slime, expect));
+}
+
+TEST("testSymbolReuse") {
+ SimpleBuffer expect;
+ SimpleBuffer actual;
+ Slime slime;
+ {
+ Cursor &c1 = slime.setArray();
+ {
+ {
+ Cursor &c2 = c1.addObject();
+ c2.setLong("foo", 10);
+ c2.setLong("bar", 20);
+ }
+ {
+ Cursor &c2 = c1.addObject();
+ c2.setLong("foo", 100);
+ c2.setLong("bar", 200);
+ }
+ }
+ }
+ {
+ BufferedOutput out(expect);
+ write_cmpr_ulong(out, 2); // num symbols
+ write_cmpr_ulong(out, 3);
+ out.writeBytes("foo", 3); // 0
+ write_cmpr_ulong(out, 3);
+ out.writeBytes("bar", 3); // 1
+ write_type_and_size(out, ARRAY::ID, 2);
+ write_type_and_size(out, OBJECT::ID, 2);
+ write_cmpr_ulong(out, 0); // foo
+ encodeBasic<LONG>(out, 10);
+ write_cmpr_ulong(out, 1); // bar
+ encodeBasic<LONG>(out, 20);
+ write_type_and_size(out, OBJECT::ID, 2);
+ write_cmpr_ulong(out, 0); // foo
+ encodeBasic<LONG>(out, 100);
+ write_cmpr_ulong(out, 1); // bar
+ encodeBasic<LONG>(out, 200);
+ }
+ BinaryFormat::encode(slime, actual);
+ EXPECT_EQUAL(expect.get().size, actual.get().size);
+ TEST_DO(verifyMultiEncode(slime, expect));
+}
+
+TEST("testOptionalDecodeOrder") {
+ SimpleBuffer data;
+ {
+ BufferedOutput out(data);
+ write_cmpr_ulong(out, 5); // num symbols
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("d", 1); // 0
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("e", 1); // 1
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("f", 1); // 2
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("b", 1); // 3
+ write_cmpr_ulong(out, 1);
+ out.writeBytes("c", 1); // 4
+ write_type_and_size(out, OBJECT::ID, 5);
+ write_cmpr_ulong(out, 3); // b
+ encodeBasic<BOOL>(out, true);
+ write_cmpr_ulong(out, 1); // e
+ encodeBasic<STRING>(out, Memory("string"));
+ write_cmpr_ulong(out, 0); // d
+ encodeBasic<DOUBLE>(out, 3.5);
+ write_cmpr_ulong(out, 4); // c
+ encodeBasic<LONG>(out, 5);
+ write_cmpr_ulong(out, 2); // f
+ encodeBasic<DATA>(out, Memory("data"));
+ }
+ Slime slime;
+ EXPECT_TRUE(BinaryFormat::decode(data.get(), slime));
+ Cursor &c = slime.get();
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(OBJECT::ID, slime.get().type().getId());
+ EXPECT_EQUAL(5u, c.children());
+ EXPECT_EQUAL(true, c["b"].asBool());
+ EXPECT_EQUAL(5, c["c"].asLong());
+ EXPECT_EQUAL(3.5, c["d"].asDouble());
+ EXPECT_EQUAL(std::string("string"), c["e"].asString().make_string());
+ EXPECT_EQUAL(std::string("data"), c["f"].asData().make_string());
+ EXPECT_TRUE(!c[5].valid()); // not ARRAY
+}
+
+Slime from_json(const vespalib::string &json) {
+ Slime slime;
+ size_t size = vespalib::slime::JsonFormat::decode(json, slime);
+ EXPECT_EQUAL(size, json.size());
+ return slime;
+}
+
+TEST("require that decode_into remaps symbols correctly") {
+ Slime expect = from_json("{a:1,b:2,c:{b:10,x:20,c:30}}");
+ Slime actual = from_json("{a:1,b:2}");
+ Slime inner = from_json("{b:10,x:20,c:30}");
+
+ SimpleBuffer buf;
+ BinaryFormat::encode(inner, buf);
+ BinaryFormat::decode_into(buf.get(), actual, ObjectInserter(actual.get(), "c"));
+ EXPECT_EQUAL(expect, actual);
+ EXPECT_EQUAL(actual.symbols(), 4u);
+}
+
+TEST("require that decode_into without symbol names work") {
+ Slime slime;
+ Slime inner = from_json("{}");
+
+ Symbol my_sym(42);
+ inner.get().setLong(my_sym, 100);
+
+ SimpleBuffer buf;
+ BinaryFormat::encode(inner, buf);
+ BinaryFormat::decode_into(buf.get(), slime, SlimeInserter(slime));
+ EXPECT_EQUAL(slime.symbols(), 0u);
+ EXPECT_EQUAL(slime.get()[my_sym].asLong(), 100);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/slime/slime_inject_test.cpp b/vespalib/src/tests/slime/slime_inject_test.cpp
new file mode 100644
index 00000000000..6c98568e0ed
--- /dev/null
+++ b/vespalib/src/tests/slime/slime_inject_test.cpp
@@ -0,0 +1,179 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include <vespa/vespalib/data/slime/strfmt.h>
+
+using namespace vespalib::slime::convenience;
+
+struct SrcFixture {
+ Slime empty;
+ Slime nix_value;
+ Slime bool_value;
+ Slime long_value;
+ Slime double_value;
+ Slime string_value;
+ Slime data_value;
+ Slime array_value;
+ Slime object_value;
+ SrcFixture() {
+ nix_value.setNix();
+ bool_value.setBool(true);
+ long_value.setLong(10);
+ double_value.setDouble(20.0);
+ string_value.setString("string");
+ data_value.setData("data");
+ Cursor &arr = array_value.setArray();
+ arr.addLong(1);
+ arr.addLong(2);
+ arr.addLong(3);
+ Cursor &obj = object_value.setObject();
+ obj.setLong("a", 1);
+ obj.setLong("b", 2);
+ obj.setLong("c", 3);
+ }
+};
+
+struct DstFixture {
+ Slime slime1;
+ Slime slime2;
+ Slime slime3;
+ Slime slime4;
+ Slime slime5;
+ Slime slime6;
+ Slime slime7;
+ Slime slime8;
+ Slime slime9;
+};
+
+TEST_FF("inject into slime", SrcFixture(), DstFixture()) {
+ EXPECT_TRUE(f1.empty.get().valid()); // explicit nix
+
+ inject(f1.empty.get(), SlimeInserter(f2.slime1));
+ inject(f1.nix_value.get(), SlimeInserter(f2.slime2));
+ inject(f1.bool_value.get(), SlimeInserter(f2.slime3));
+ inject(f1.long_value.get(), SlimeInserter(f2.slime4));
+ inject(f1.double_value.get(), SlimeInserter(f2.slime5));
+ inject(f1.string_value.get(), SlimeInserter(f2.slime6));
+ inject(f1.data_value.get(), SlimeInserter(f2.slime7));
+ inject(f1.array_value.get(), SlimeInserter(f2.slime8));
+ inject(f1.object_value.get(), SlimeInserter(f2.slime9));
+
+ EXPECT_EQUAL(f1.empty.get().toString(), f2.slime1.get().toString());
+ EXPECT_EQUAL(f1.nix_value.get().toString(), f2.slime2.get().toString());
+ EXPECT_EQUAL(f1.bool_value.get().toString(), f2.slime3.get().toString());
+ EXPECT_EQUAL(f1.long_value.get().toString(), f2.slime4.get().toString());
+ EXPECT_EQUAL(f1.double_value.get().toString(), f2.slime5.get().toString());
+ EXPECT_EQUAL(f1.string_value.get().toString(), f2.slime6.get().toString());
+ EXPECT_EQUAL(f1.data_value.get().toString(), f2.slime7.get().toString());
+ EXPECT_EQUAL(f1.array_value.get().toString(), f2.slime8.get().toString());
+ EXPECT_EQUAL(f1.object_value.get(), f2.slime9.get());
+}
+
+TEST_FF("inject into array", SrcFixture(), DstFixture()) {
+ f2.slime1.setArray();
+ inject(f1.empty.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.nix_value.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.bool_value.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.long_value.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.double_value.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.string_value.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.data_value.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.array_value.get(), ArrayInserter(f2.slime1.get()));
+ inject(f1.object_value.get(), ArrayInserter(f2.slime1.get()));
+
+ EXPECT_EQUAL(f1.empty.get().toString(), f2.slime1.get()[0].toString());
+ EXPECT_EQUAL(f1.nix_value.get().toString(), f2.slime1.get()[1].toString());
+ EXPECT_EQUAL(f1.bool_value.get().toString(), f2.slime1.get()[2].toString());
+ EXPECT_EQUAL(f1.long_value.get().toString(), f2.slime1.get()[3].toString());
+ EXPECT_EQUAL(f1.double_value.get().toString(), f2.slime1.get()[4].toString());
+ EXPECT_EQUAL(f1.string_value.get().toString(), f2.slime1.get()[5].toString());
+ EXPECT_EQUAL(f1.data_value.get().toString(), f2.slime1.get()[6].toString());
+ EXPECT_EQUAL(f1.array_value.get().toString(), f2.slime1.get()[7].toString());
+ EXPECT_EQUAL(f1.object_value.get(), f2.slime1.get()[8]);
+}
+
+TEST_FF("inject into object", SrcFixture(), DstFixture()) {
+ f2.slime1.setObject();
+ inject(f1.empty.get(), ObjectInserter(f2.slime1.get(), "a"));
+ inject(f1.nix_value.get(), ObjectInserter(f2.slime1.get(), "b"));
+ inject(f1.bool_value.get(), ObjectInserter(f2.slime1.get(), "c"));
+ inject(f1.long_value.get(), ObjectInserter(f2.slime1.get(), "d"));
+ inject(f1.double_value.get(), ObjectInserter(f2.slime1.get(), "e"));
+ inject(f1.string_value.get(), ObjectInserter(f2.slime1.get(), "f"));
+ inject(f1.data_value.get(), ObjectInserter(f2.slime1.get(), "g"));
+ inject(f1.array_value.get(), ObjectInserter(f2.slime1.get(), "h"));
+ inject(f1.object_value.get(), ObjectInserter(f2.slime1.get(), "i"));
+
+ EXPECT_EQUAL(f1.empty.get().toString(), f2.slime1.get()["a"].toString());
+ EXPECT_EQUAL(f1.nix_value.get().toString(), f2.slime1.get()["b"].toString());
+ EXPECT_EQUAL(f1.bool_value.get().toString(), f2.slime1.get()["c"].toString());
+ EXPECT_EQUAL(f1.long_value.get().toString(), f2.slime1.get()["d"].toString());
+ EXPECT_EQUAL(f1.double_value.get().toString(), f2.slime1.get()["e"].toString());
+ EXPECT_EQUAL(f1.string_value.get().toString(), f2.slime1.get()["f"].toString());
+ EXPECT_EQUAL(f1.data_value.get().toString(), f2.slime1.get()["g"].toString());
+ EXPECT_EQUAL(f1.array_value.get().toString(), f2.slime1.get()["h"].toString());
+ EXPECT_EQUAL(f1.object_value.get(), f2.slime1.get()["i"]);
+}
+
+TEST_FF("invalid injection is ignored", SrcFixture(), DstFixture()) {
+ inject(f1.array_value.get(), SlimeInserter(f2.slime1));
+ EXPECT_EQUAL(3u, f2.slime1.get().entries());
+ inject(f1.long_value.get(), ArrayInserter(f2.slime1.get()));
+ EXPECT_EQUAL(4u, f2.slime1.get().entries());
+ inject(f1.double_value.get(), ArrayInserter(f2.slime1.get()));
+ EXPECT_EQUAL(5u, f2.slime1.get().entries());
+ inject(f1.nix_value.get()["bogus"], ArrayInserter(f2.slime1.get()));
+ EXPECT_EQUAL(5u, f2.slime1.get().entries());
+}
+
+TEST("recursive array inject") {
+ Slime expect;
+ {
+ Cursor &arr = expect.setArray();
+ arr.addLong(1);
+ arr.addLong(2);
+ arr.addLong(3);
+ {
+ Cursor &arr_cpy = arr.addArray();
+ arr_cpy.addLong(1);
+ arr_cpy.addLong(2);
+ arr_cpy.addLong(3);
+ }
+ }
+ Slime data;
+ {
+ Cursor &arr = data.setArray();
+ arr.addLong(1);
+ arr.addLong(2);
+ arr.addLong(3);
+ }
+ inject(data.get(), ArrayInserter(data.get()));
+ EXPECT_EQUAL(expect.toString(), data.toString());
+}
+
+TEST("recursive object inject") {
+ Slime expect;
+ {
+ Cursor &obj = expect.setObject();
+ obj.setLong("a", 1);
+ obj.setLong("b", 2);
+ obj.setLong("c", 3);
+ {
+ Cursor &obj_cpy = obj.setObject("d");
+ obj_cpy.setLong("a", 1);
+ obj_cpy.setLong("b", 2);
+ obj_cpy.setLong("c", 3);
+ }
+ }
+ Slime data;
+ {
+ Cursor &obj = data.setObject();
+ obj.setLong("a", 1);
+ obj.setLong("b", 2);
+ obj.setLong("c", 3);
+ }
+ inject(data.get(), ObjectInserter(data.get(), "d"));
+ EXPECT_EQUAL(expect, data);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/slime/slime_json_format_test.cpp b/vespalib/src/tests/slime/slime_json_format_test.cpp
new file mode 100644
index 00000000000..e04bc8aa325
--- /dev/null
+++ b/vespalib/src/tests/slime/slime_json_format_test.cpp
@@ -0,0 +1,363 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include <iostream>
+#include <fstream>
+
+using namespace vespalib::slime::convenience;
+
+std::string make_json(const Slime &slime, bool compact) {
+ vespalib::slime::SimpleBuffer buf;
+ vespalib::slime::JsonFormat::encode(slime, buf, compact);
+ return buf.get().make_string();
+}
+
+bool parse_json(const std::string &json, Slime &slime) {
+ size_t size = vespalib::slime::JsonFormat::decode(json, slime);
+ if (size == 0) {
+ fprintf(stderr, "json parsing failed:\n%s", make_json(slime, false).c_str());
+ }
+ return (size > 0);
+}
+
+bool parse_json_bytes(const Memory & json, Slime &slime) {
+ size_t size = vespalib::slime::JsonFormat::decode(json, slime);
+ if (size == 0) {
+ fprintf(stderr, "json parsing failed:\n%s", make_json(slime, false).c_str());
+ }
+ return (size > 0);
+}
+
+double json_double(const std::string &str) {
+ Slime slime;
+ if (vespalib::slime::JsonFormat::decode(str, slime) != str.size()) {
+ fprintf(stderr, "json number parsing failed:\n%s", make_json(slime, false).c_str());
+ return 666.0;
+ }
+ return slime.get().asDouble();
+}
+
+int64_t json_long(const std::string &str) {
+ Slime slime;
+ if (vespalib::slime::JsonFormat::decode(str, slime) != str.size()) {
+ fprintf(stderr, "json number parsing failed:\n%s", make_json(slime, false).c_str());
+ return 666;
+ }
+ return slime.get().asLong();
+}
+
+std::string json_string(const std::string &str) {
+ Slime slime;
+ std::string quoted("\"");
+ quoted.append(str);
+ quoted.append("\"");
+ if (vespalib::slime::JsonFormat::decode(quoted, slime) != quoted.size()) {
+ fprintf(stderr, "json string parsing failed:\n%s", make_json(slime, false).c_str());
+ return "<error>";
+ }
+ return slime.get().asString().make_string();
+}
+
+std::string normalize(const std::string &json) {
+ Slime slime;
+ EXPECT_GREATER(vespalib::slime::JsonFormat::decode(json, slime), 0u);
+ return make_json(slime, true);
+}
+
+bool check_valid(const std::string &json) {
+ Slime slime;
+ return (vespalib::slime::JsonFormat::decode(json, slime) > 0);
+}
+
+TEST_F("encode empty", Slime) {
+ EXPECT_EQUAL("null", make_json(f, true));
+ EXPECT_EQUAL("null\n", make_json(f, false));
+}
+
+TEST_F("encode nix", Slime) {
+ f.setNix();
+ EXPECT_EQUAL("null", make_json(f, true));
+ EXPECT_EQUAL("null\n", make_json(f, false));
+}
+
+TEST_F("encode true", Slime) {
+ f.setBool(true);
+ EXPECT_EQUAL("true", make_json(f, true));
+ EXPECT_EQUAL("true\n", make_json(f, false));
+}
+
+TEST_F("encode false", Slime) {
+ f.setBool(false);
+ EXPECT_EQUAL("false", make_json(f, true));
+ EXPECT_EQUAL("false\n", make_json(f, false));
+}
+
+TEST_F("encode long", Slime) {
+ f.setLong(12345);
+ EXPECT_EQUAL("12345", make_json(f, true));
+ EXPECT_EQUAL("12345\n", make_json(f, false));
+}
+
+TEST_F("encode double", Slime) {
+ f.setDouble(0.5);
+ EXPECT_EQUAL("0.5", make_json(f, true));
+ EXPECT_EQUAL("0.5\n", make_json(f, false));
+}
+
+TEST_F("encode double nan", Slime) {
+ f.setDouble(std::numeric_limits<double>::quiet_NaN());
+ EXPECT_EQUAL("null", make_json(f, true));
+ EXPECT_EQUAL("null\n", make_json(f, false));
+}
+
+TEST_F("encode double inf", Slime) {
+ f.setDouble(std::numeric_limits<double>::infinity());
+ EXPECT_EQUAL("null", make_json(f, true));
+ EXPECT_EQUAL("null\n", make_json(f, false));
+}
+
+TEST_F("encode string", Slime) {
+ f.setString("foo");
+ EXPECT_EQUAL("\"foo\"", make_json(f, true));
+ EXPECT_EQUAL("\"foo\"\n", make_json(f, false));
+}
+
+TEST_F("encode data", Slime) {
+ char buf[8];
+ for (int i = 0; i < 8; ++i) {
+ buf[i] = ((i * 2) << 4) | (i * 2 + 1);
+ }
+ f.setData(Memory(buf, 8));
+ EXPECT_EQUAL("\"0x0123456789ABCDEF\"", make_json(f, true));
+ EXPECT_EQUAL("\"0x0123456789ABCDEF\"\n", make_json(f, false));
+}
+
+TEST_F("encode empty array", Slime) {
+ Cursor &c = f.setArray();
+ (void)c;
+ EXPECT_EQUAL("[]", make_json(f, true));
+ EXPECT_EQUAL("[\n"
+ "]\n", make_json(f, false));
+}
+
+TEST_F("encode empty object", Slime) {
+ Cursor &c = f.setObject();
+ (void)c;
+ EXPECT_EQUAL("{}", make_json(f, true));
+ EXPECT_EQUAL("{\n"
+ "}\n", make_json(f, false));
+}
+
+TEST_F("encode array", Slime) {
+ Cursor &c = f.setArray();
+ c.addLong(123);
+ c.addDouble(0.5);
+ c.addString("foo");
+ c.addBool(true);
+ EXPECT_EQUAL("[123,0.5,\"foo\",true]", make_json(f, true));
+ EXPECT_EQUAL("[\n"
+ " 123,\n"
+ " 0.5,\n"
+ " \"foo\",\n"
+ " true\n"
+ "]\n", make_json(f, false));
+}
+
+TEST_F("encode object", Slime) {
+ Cursor &c = f.setObject();
+ c.setLong("a", 10);
+ EXPECT_TRUE(c.valid());
+ c.setLong("b", 20);
+ EXPECT_TRUE(("{\"b\":20,\"a\":10}" == make_json(f, true)) ||
+ ("{\"a\":10,\"b\":20}" == make_json(f, true)));
+ EXPECT_TRUE(("{\n"
+ " \"b\": 20,\n"
+ " \"a\": 10\n"
+ "}\n" == make_json(f, false)) ||
+ ("{\n"
+ " \"a\": 10,\n"
+ " \"b\": 20\n"
+ "}\n" == make_json(f, false)));
+}
+
+TEST_F("encode nesting", Slime) {
+ Cursor &c = f.setObject().setObject("a").setArray("b").addArray();
+ c.addLong(1);
+ c.addLong(2);
+ c.addLong(3);
+ EXPECT_EQUAL("{\"a\":{\"b\":[[1,2,3]]}}", make_json(f, true));
+ EXPECT_EQUAL("{\n"
+ " \"a\": {\n"
+ " \"b\": [\n"
+ " [\n"
+ " 1,\n"
+ " 2,\n"
+ " 3\n"
+ " ]\n"
+ " ]\n"
+ " }\n"
+ "}\n", make_json(f, false));
+}
+
+TEST_F("decode null", Slime) {
+ EXPECT_TRUE(parse_json("null", f));
+ EXPECT_EQUAL(vespalib::slime::NIX::ID, f.get().type().getId());
+}
+
+TEST_F("decode true", Slime) {
+ EXPECT_TRUE(parse_json("true", f));
+ EXPECT_EQUAL(vespalib::slime::BOOL::ID, f.get().type().getId());
+ EXPECT_EQUAL(true, f.get().asBool());
+}
+
+TEST_F("decode false", Slime) {
+ EXPECT_TRUE(parse_json("false", f));
+ EXPECT_EQUAL(vespalib::slime::BOOL::ID, f.get().type().getId());
+ EXPECT_EQUAL(false, f.get().asBool());
+}
+
+TEST("decode number") {
+ EXPECT_EQUAL(0.0, json_double("0"));
+ EXPECT_EQUAL(1.0, json_double("1"));
+ EXPECT_EQUAL(2.0, json_double("2"));
+ EXPECT_EQUAL(3.0, json_double("3"));
+ EXPECT_EQUAL(4.0, json_double("4"));
+ EXPECT_EQUAL(5.0, json_double("5"));
+ EXPECT_EQUAL(6.0, json_double("6"));
+ EXPECT_EQUAL(7.0, json_double("7"));
+ EXPECT_EQUAL(8.0, json_double("8"));
+ EXPECT_EQUAL(9.0, json_double("9"));
+ EXPECT_EQUAL(-9.0, json_double("-9"));
+ EXPECT_EQUAL(5.5, json_double("5.5"));
+ EXPECT_EQUAL(5e7, json_double("5e7"));
+
+ EXPECT_EQUAL(5L, json_long("5"));
+ EXPECT_EQUAL(5L, json_long("5.5"));
+ EXPECT_EQUAL(50000000L, json_long("5e7"));
+ EXPECT_EQUAL(9223372036854775807L, json_long("9223372036854775807"));
+}
+
+TEST("decode string") {
+ EXPECT_EQUAL(std::string("foo"), json_string("foo"));
+ EXPECT_EQUAL(std::string("\""), json_string("\\\""));
+ EXPECT_EQUAL(std::string("\b"), json_string("\\b"));
+ EXPECT_EQUAL(std::string("\f"), json_string("\\f"));
+ EXPECT_EQUAL(std::string("\n"), json_string("\\n"));
+ EXPECT_EQUAL(std::string("\r"), json_string("\\r"));
+ EXPECT_EQUAL(std::string("\t"), json_string("\\t"));
+
+ EXPECT_EQUAL(std::string("A"), json_string("\\u0041"));
+ EXPECT_EQUAL(std::string("\x0f"), json_string("\\u000f"));
+ EXPECT_EQUAL(std::string("\x18"), json_string("\\u0018"));
+ EXPECT_EQUAL(std::string("\x29"), json_string("\\u0029"));
+ EXPECT_EQUAL(std::string("\x3a"), json_string("\\u003a"));
+ EXPECT_EQUAL(std::string("\x4b"), json_string("\\u004b"));
+ EXPECT_EQUAL(std::string("\x5c"), json_string("\\u005c"));
+ EXPECT_EQUAL(std::string("\x6d"), json_string("\\u006d"));
+ EXPECT_EQUAL(std::string("\x7e"), json_string("\\u007e"));
+
+ EXPECT_EQUAL(std::string("\x7f"), json_string("\\u007f"));
+ EXPECT_EQUAL(std::string("\xc2\x80"), json_string("\\u0080"));
+ EXPECT_EQUAL(std::string("\xdf\xbf"), json_string("\\u07ff"));
+ EXPECT_EQUAL(std::string("\xe0\xa0\x80"), json_string("\\u0800"));
+ EXPECT_EQUAL(std::string("\xed\x9f\xbf"), json_string("\\ud7ff"));
+ EXPECT_EQUAL(std::string("\xee\x80\x80"), json_string("\\ue000"));
+ EXPECT_EQUAL(std::string("\xef\xbf\xbf"), json_string("\\uffff"));
+ EXPECT_EQUAL(std::string("\xf0\x90\x80\x80"), json_string("\\ud800\\udc00"));
+ EXPECT_EQUAL(std::string("\xf4\x8f\xbf\xbf"), json_string("\\udbff\\udfff"));
+}
+
+TEST_F("decode empty array", Slime) {
+ EXPECT_TRUE(parse_json("[]", f));
+ EXPECT_EQUAL(vespalib::slime::ARRAY::ID, f.get().type().getId());
+ EXPECT_EQUAL(0u, f.get().children());
+}
+
+TEST_F("decode empty object", Slime) {
+ EXPECT_TRUE(parse_json("{}", f));
+ EXPECT_EQUAL(vespalib::slime::OBJECT::ID, f.get().type().getId());
+ EXPECT_EQUAL(0u, f.get().children());
+}
+
+TEST_F("decode array", Slime) {
+ EXPECT_TRUE(parse_json("[123,0.5,\"foo\",true]", f));
+ EXPECT_EQUAL(vespalib::slime::ARRAY::ID, f.get().type().getId());
+ EXPECT_EQUAL(4u, f.get().children());
+ EXPECT_EQUAL(123.0, f.get()[0].asDouble());
+ EXPECT_EQUAL(0.5, f.get()[1].asDouble());
+ EXPECT_EQUAL(std::string("foo"), f.get()[2].asString().make_string());
+ EXPECT_EQUAL(true, f.get()[3].asBool());
+}
+
+TEST_F("decode object", Slime) {
+ EXPECT_TRUE(parse_json("{\"a\":123,\"b\":0.5,\"c\":\"foo\",\"d\":true}", f));
+ EXPECT_EQUAL(vespalib::slime::OBJECT::ID, f.get().type().getId());
+ EXPECT_EQUAL(4u, f.get().children());
+ EXPECT_EQUAL(123.0, f.get()["a"].asDouble());
+ EXPECT_EQUAL(0.5, f.get()["b"].asDouble());
+ EXPECT_EQUAL(std::string("foo"), f.get()["c"].asString().make_string());
+ EXPECT_EQUAL(true, f.get()["d"].asBool());
+}
+
+TEST_F("decode nesting", Slime) {
+ EXPECT_TRUE(parse_json("{\"a\":{\"b\":[[1,2,3]],\"c\":[[4]]}}", f));
+ EXPECT_EQUAL(1.0, f.get()["a"]["b"][0][0].asDouble());
+ EXPECT_EQUAL(2.0, f.get()["a"]["b"][0][1].asDouble());
+ EXPECT_EQUAL(3.0, f.get()["a"]["b"][0][2].asDouble());
+ EXPECT_EQUAL(4.0, f.get()["a"]["c"][0][0].asDouble());
+}
+
+TEST("decode whitespace") {
+ EXPECT_EQUAL(std::string("true"), normalize("\n\r\t true"));
+ EXPECT_EQUAL(std::string("true"), normalize(" true "));
+ EXPECT_EQUAL(std::string("false"), normalize(" false "));
+ EXPECT_EQUAL(std::string("null"), normalize(" null "));
+ EXPECT_EQUAL(std::string("\"foo\""), normalize(" \"foo\" "));
+ EXPECT_EQUAL(std::string("{}"), normalize(" { } "));
+ EXPECT_EQUAL(std::string("[]"), normalize(" [ ] "));
+ EXPECT_EQUAL(std::string("5"), normalize(" 5 "));
+ EXPECT_EQUAL(std::string("[1]"), normalize(" [ 1 ] "));
+ EXPECT_EQUAL(std::string("[1,2,3]"), normalize(" [ 1 , 2 , 3 ] "));
+ EXPECT_EQUAL(std::string("{\"a\":1}"), normalize(" { \"a\" : 1 } "));
+ EXPECT_EQUAL(normalize("{\"a\":{\"b\":[[1,2,3]],\"c\":[[4]]}}"),
+ normalize(" { \"a\" : { \"b\" : [ [ 1 , 2 , 3 ] ] , \"c\" : [ [ 4 ] ] } } "));
+}
+
+TEST("decode invalid input") {
+ EXPECT_FALSE(check_valid(""));
+ EXPECT_FALSE(check_valid("["));
+ EXPECT_FALSE(check_valid("{"));
+ EXPECT_FALSE(check_valid("]"));
+ EXPECT_FALSE(check_valid("}"));
+ EXPECT_FALSE(check_valid("{]"));
+ EXPECT_FALSE(check_valid("[}"));
+ EXPECT_FALSE(check_valid("+5"));
+ EXPECT_FALSE(check_valid("fals"));
+ EXPECT_FALSE(check_valid("tru"));
+ EXPECT_FALSE(check_valid("nul"));
+ EXPECT_FALSE(check_valid("bar"));
+ EXPECT_FALSE(check_valid("\"bar"));
+ EXPECT_FALSE(check_valid("bar\""));
+ EXPECT_FALSE(check_valid("'bar\""));
+ EXPECT_FALSE(check_valid("\"bar'"));
+ EXPECT_FALSE(check_valid("{\"foo"));
+}
+
+TEST("decode simplified form") {
+ EXPECT_EQUAL(std::string("\"foo\""), normalize("'foo'"));
+ EXPECT_EQUAL(normalize("{\"a\":123,\"b\":0.5,\"c\":\"foo\",\"d\":true}"), normalize("{a:123,b:0.5,c:'foo',d:true}"));
+ EXPECT_EQUAL(normalize("{\"a\":{\"b\":[[1,2,3]],\"c\":[[4]]}}"), normalize("{a:{b:[[1,2,3]],c:[[4]]}}"));
+}
+
+TEST_F("decode bytes not null-terminated", Slime) {
+ std::ifstream file("large_json.txt");
+ ASSERT_TRUE(file.is_open());
+ std::stringstream buf;
+ buf << file.rdbuf();
+ std::string str = buf.str();
+ Memory mem(str.c_str(), 18911);
+ EXPECT_TRUE(parse_json_bytes(mem, f));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/slime/slime_test.cpp b/vespalib/src/tests/slime/slime_test.cpp
new file mode 100644
index 00000000000..efb864d9c72
--- /dev/null
+++ b/vespalib/src/tests/slime/slime_test.cpp
@@ -0,0 +1,365 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("slime_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include <vespa/vespalib/data/slime/strfmt.h>
+
+using namespace vespalib::slime::convenience;
+
+TEST("print sizes") {
+ using vespalib::slime::SymbolTable;
+ using vespalib::slime::Value;
+ using vespalib::slime::NixValue;
+ using vespalib::slime::BasicBoolValue;
+ using vespalib::slime::BasicLongValue;
+ using vespalib::slime::BasicDoubleValue;
+ using vespalib::slime::BasicStringValue;
+ using vespalib::slime::BasicDataValue;
+ using vespalib::slime::ArrayValue;
+ using vespalib::slime::ObjectValue;
+
+ const char *pattern = "size of %s: %5u\n";
+ fprintf(stderr, pattern, "Slime ", sizeof(Slime));
+ fprintf(stderr, pattern, "SymbolTable ", sizeof(SymbolTable));
+ fprintf(stderr, pattern, "Type ", sizeof(Type));
+ fprintf(stderr, pattern, "TypeType<n> ", sizeof(vespalib::slime::BOOL));
+ fprintf(stderr, pattern, "Value ", sizeof(Value));
+ fprintf(stderr, pattern, "NixValue ", sizeof(NixValue));
+ fprintf(stderr, pattern, "BasicBoolValue ", sizeof(BasicBoolValue));
+ fprintf(stderr, pattern, "BasicLongValue ", sizeof(BasicLongValue));
+ fprintf(stderr, pattern, "BasicDoubleValue ", sizeof(BasicDoubleValue));
+ fprintf(stderr, pattern, "BasicStringValue ", sizeof(BasicStringValue));
+ fprintf(stderr, pattern, "BasicDataValue ", sizeof(BasicDataValue));
+ fprintf(stderr, pattern, "ArrayValue ", sizeof(ArrayValue));
+ fprintf(stderr, pattern, "ObjectValue ", sizeof(ObjectValue));
+ EXPECT_EQUAL(sizeof(Value), sizeof(void*)); // ensure single vtable
+}
+
+TEST("test type ids") {
+ EXPECT_EQUAL(0u, vespalib::slime::NIX::ID);
+ EXPECT_EQUAL(1u, vespalib::slime::BOOL::ID);
+ EXPECT_EQUAL(2u, vespalib::slime::LONG::ID);
+ EXPECT_EQUAL(3u, vespalib::slime::DOUBLE::ID);
+ EXPECT_EQUAL(4u, vespalib::slime::STRING::ID);
+ EXPECT_EQUAL(5u, vespalib::slime::DATA::ID);
+ EXPECT_EQUAL(6u, vespalib::slime::ARRAY::ID);
+ EXPECT_EQUAL(7u, vespalib::slime::OBJECT::ID);
+}
+
+TEST("test empty") {
+ Slime slime;
+ for (int i = 0; i < 2; ++i) {
+ Cursor &cur = (i == 0 ?
+ slime.get() : // i = 0 -> empty object
+ *vespalib::slime::NixValue::invalid()); // i = 1 -> invalid cursor
+ if (i == 0) {
+ EXPECT_TRUE(cur.valid());
+ } else {
+ EXPECT_TRUE(!cur.valid());
+ }
+ EXPECT_EQUAL(vespalib::slime::NIX::ID, cur.type().getId());
+ EXPECT_EQUAL(0u, cur.children());
+ EXPECT_EQUAL(0u, cur.entries());
+ EXPECT_EQUAL(0u, cur.fields());
+ EXPECT_EQUAL(cur.asBool(), false);
+ EXPECT_EQUAL(cur.asLong(), 0L);
+ EXPECT_EQUAL(cur.asDouble(), 0.0);
+ {
+ Memory expect;
+ Memory actual = cur.asString();
+ EXPECT_EQUAL(expect.data, actual.data);
+ EXPECT_EQUAL(expect.size, actual.size);
+ }
+ {
+ Memory expect;
+ Memory actual = cur.asData();
+ EXPECT_EQUAL(expect.data, actual.data);
+ EXPECT_EQUAL(expect.size, actual.size);
+ }
+ EXPECT_TRUE(!cur[0].valid()); // ARRAY
+ EXPECT_TRUE(!cur["foo"].valid()); // OBJECT
+ EXPECT_TRUE(!cur[Symbol(5)].valid()); // OBJECT
+ }
+}
+
+TEST("test basic") {
+ { // BOOL
+ Slime slime;
+ slime.setBool(true);
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(vespalib::slime::BOOL::ID, slime.get().type().getId());
+ EXPECT_EQUAL(slime.get().asBool(), true);
+ }
+ { // LONG
+ Slime slime;
+ slime.setLong(123);
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(vespalib::slime::LONG::ID, slime.get().type().getId());
+ EXPECT_EQUAL(123, slime.get().asLong());
+ }
+ { // DOUBLE
+ Slime slime;
+ slime.setDouble(2.5);
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(vespalib::slime::DOUBLE::ID, slime.get().type().getId());
+ EXPECT_EQUAL(2.5, slime.get().asDouble());
+ }
+ { // STRING
+ std::string str("string");
+ Slime slime;
+ slime.setString(Memory(str));
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(vespalib::slime::STRING::ID, slime.get().type().getId());
+ EXPECT_EQUAL(std::string("string"), slime.get().asString().make_string());
+ }
+ { // DATA
+ std::string data("data");
+ Slime slime;
+ slime.setData(Memory(data));
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(vespalib::slime::DATA::ID, slime.get().type().getId());
+ EXPECT_EQUAL(std::string("data"), slime.get().asData().make_string());
+ }
+}
+
+TEST("test array") {
+ Slime slime;
+ Cursor &c = slime.setArray();
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(vespalib::slime::ARRAY::ID, slime.get().type().getId());
+ EXPECT_EQUAL(0u, c.children());
+ EXPECT_EQUAL(0u, c.entries());
+ EXPECT_EQUAL(0u, c.fields());
+ c.addNix();
+ c.addBool(true);
+ c.addLong(5);
+ c.addDouble(3.5);
+ c.addString(Memory("string"));
+ c.addData(Memory("data"));
+ EXPECT_EQUAL(6u, c.children());
+ EXPECT_EQUAL(6u, c.entries());
+ EXPECT_EQUAL(0u, c.fields());
+ EXPECT_TRUE(c[0].valid());
+ EXPECT_EQUAL(true, c[1].asBool());
+ EXPECT_EQUAL(5, c[2].asLong());
+ EXPECT_EQUAL(3.5, c[3].asDouble());
+ EXPECT_EQUAL(std::string("string"), c[4].asString().make_string());
+ EXPECT_EQUAL(std::string("data"), c[5].asData().make_string());
+ EXPECT_TRUE(!c[Symbol(5)].valid()); // not OBJECT
+}
+
+TEST("test object") {
+ Slime slime;
+ Cursor &c = slime.setObject();
+ EXPECT_TRUE(slime.get().valid());
+ EXPECT_EQUAL(vespalib::slime::OBJECT::ID, slime.get().type().getId());
+ EXPECT_EQUAL(0u, c.children());
+ EXPECT_EQUAL(0u, c.entries());
+ EXPECT_EQUAL(0u, c.fields());
+ c.setNix("a");
+ c.setBool("b", true);
+ c.setLong("c", 5);
+ c.setDouble("d", 3.5);
+ c.setString("e", Memory("string"));
+ c.setData("f", Memory("data"));
+ EXPECT_EQUAL(6u, c.children());
+ EXPECT_EQUAL(0u, c.entries());
+ EXPECT_EQUAL(6u, c.fields());
+ EXPECT_TRUE(c["a"].valid());
+ EXPECT_EQUAL(true, c["b"].asBool());
+ EXPECT_EQUAL(5, c["c"].asLong());
+ EXPECT_EQUAL(3.5, c["d"].asDouble());
+ EXPECT_EQUAL(std::string("string"), c["e"].asString().make_string());
+ EXPECT_EQUAL(std::string("data"), c["f"].asData().make_string());
+ EXPECT_TRUE(!c[4].valid()); // not ARRAY
+}
+
+TEST("test chaining") {
+ // when adding a value, a cursor for the added value is
+ // returned. If the add fails for some reason, an invalid cursor
+ // is returned instead.
+ {
+ Slime slime;
+ Cursor &c = slime.setArray();
+ EXPECT_EQUAL(5, c.addLong(5).asLong());
+ }
+ {
+ Slime slime;
+ Cursor &c = slime.setObject();
+ EXPECT_EQUAL(5, c.setLong("a", 5).asLong());
+ }
+}
+
+TEST("test proxy conversion") {
+ Slime slime;
+ Cursor &c = slime.setLong(10);
+ Inspector &i1 = c;
+ EXPECT_EQUAL(10u, i1.asLong());
+ Inspector &i2 = slime.get();
+ EXPECT_EQUAL(10u, i2.asLong());
+ const Slime &const_slime = slime;
+ Inspector &i3 = const_slime.get();
+ EXPECT_EQUAL(10u, i3.asLong());
+}
+
+TEST("test nesting") {
+ Slime slime;
+ {
+ Cursor &c1 = slime.setObject();
+ {
+ c1.setLong("bar", 10);
+ {
+ Cursor &c2 = c1.setArray("foo");
+ c2.addLong(20); // [0]
+ {
+ Cursor &c3 = c2.addObject(); // [1]
+ c3.setLong("answer", 42);
+ }
+ }
+ }
+ }
+ Cursor &c = slime.get();
+ EXPECT_EQUAL(10, c["bar"].asLong());
+ EXPECT_EQUAL(20, c["foo"][0].asLong());
+ EXPECT_EQUAL(42, c["foo"][1]["answer"].asLong());
+}
+
+TEST("test wrap") {
+ Slime slime;
+ slime.setLong(42);
+ EXPECT_EQUAL(42, slime.get().asLong());
+ slime.wrap("foo");
+ EXPECT_EQUAL(42, slime.get()["foo"].asLong());
+}
+
+TEST("string format") {
+ std::string ret = vespalib::slime::strfmt("num: %d", 5);
+ EXPECT_EQUAL(ret, "num: 5");
+}
+
+TEST("cross-type number conversion") {
+ Slime slime;
+ slime.setArray();
+ slime.get().addDouble(2.7);
+ slime.get().addLong(5);
+ EXPECT_EQUAL(2.7, slime.get()[0].asDouble());
+ EXPECT_EQUAL(2, slime.get()[0].asLong());
+ EXPECT_EQUAL(5, slime.get()[1].asLong());
+ EXPECT_EQUAL(5.0, slime.get()[1].asDouble());
+}
+
+TEST("slime toString produces human-readable JSON") {
+ Slime slime;
+ {
+ Cursor &c1 = slime.setObject();
+ {
+ c1.setLong("bar", 10);
+ {
+ Cursor &c2 = c1.setArray("foo");
+ c2.addLong(20); // [0]
+ {
+ Cursor &c3 = c2.addObject(); // [1]
+ c3.setLong("answer", 42);
+ }
+ }
+ }
+ }
+ std::string expect;
+ {
+ vespalib::slime::SimpleBuffer buf;
+ vespalib::slime::JsonFormat::encode(slime, buf, false);
+ expect = buf.get().make_string();
+ }
+ EXPECT_EQUAL(expect, slime.toString());
+}
+
+TEST("require that slime objects can be moved") {
+ Slime obj1;
+ {
+ obj1.setObject().setLong("foo", 123);
+ }
+ EXPECT_EQUAL(123, obj1.get()["foo"].asLong());
+ Slime obj2(std::move(obj1));
+ EXPECT_TRUE(!obj1.get()["foo"].valid());
+ EXPECT_EQUAL(123, obj2.get()["foo"].asLong());
+ Slime obj3;
+ obj3 = std::move(obj2);
+ EXPECT_TRUE(!obj2.get()["foo"].valid());
+ EXPECT_EQUAL(123, obj3.get()["foo"].asLong());
+}
+
+TEST("require that we can replace symbol table") {
+ const Memory A("a");
+ vespalib::slime::SymbolTable::UP symbols = std::make_unique<vespalib::slime::SymbolTable>();
+ EXPECT_TRUE(symbols->lookup(A).undefined());
+ symbols->insert(A);
+ EXPECT_FALSE(symbols->lookup(A).undefined());
+ Slime slime(Slime::Params(std::move(symbols)));
+ EXPECT_FALSE(slime.lookup(A).undefined());
+ symbols = Slime::reclaimSymbols(std::move(slime));
+ EXPECT_FALSE(symbols->lookup(A).undefined());
+}
+
+TEST("require that slime objects can be compared") {
+ EXPECT_EQUAL(Slime().setNix(), Slime().setNix());
+ EXPECT_EQUAL(Slime().setBool(false), Slime().setBool(false));
+ EXPECT_NOT_EQUAL(Slime().setBool(false), Slime().setBool(true));
+ EXPECT_EQUAL(Slime().setLong(123), Slime().setLong(123));
+ EXPECT_NOT_EQUAL(Slime().setLong(123), Slime().setLong(321));
+ EXPECT_EQUAL(Slime().setDouble(123), Slime().setDouble(123));
+ EXPECT_NOT_EQUAL(Slime().setDouble(123), Slime().setDouble(321));
+ EXPECT_EQUAL(Slime().setString("foo"), Slime().setString("foo"));
+ EXPECT_NOT_EQUAL(Slime().setString("foo"), Slime().setString("bar"));
+ EXPECT_EQUAL(Slime().setData("foo"), Slime().setData("foo"));
+ EXPECT_NOT_EQUAL(Slime().setData("foo"), Slime().setData("bar"));
+ EXPECT_EQUAL(Slime().setArray(), Slime().setArray());
+ EXPECT_EQUAL(Slime().setObject(), Slime().setObject());
+ {
+ Slime a;
+ Cursor &arr_a = a.setArray();
+ arr_a.addLong(1);
+ arr_a.addLong(2);
+ arr_a.addLong(3);
+ Slime b;
+ Cursor &arr_b = b.setArray();
+ arr_b.addLong(1);
+ arr_b.addLong(2);
+ arr_b.addLong(3);
+ EXPECT_EQUAL(a, b);
+ EXPECT_EQUAL(b, a);
+ arr_b.addLong(4);
+ EXPECT_NOT_EQUAL(a, b);
+ EXPECT_NOT_EQUAL(b, a);
+ arr_a.addLong(5);
+ EXPECT_NOT_EQUAL(a, b);
+ EXPECT_NOT_EQUAL(b, a);
+ }
+ {
+ Slime a;
+ Cursor &obj_a = a.setObject();
+ obj_a.setLong("foo", 1);
+ obj_a.setLong("bar", 2);
+ obj_a.setLong("baz", 3);
+ Slime b;
+ Cursor &obj_b = b.setObject();
+ obj_b.setLong("foo", 1);
+ obj_b.setLong("bar", 2);
+ obj_b.setLong("baz", 3);
+ EXPECT_EQUAL(a, b);
+ EXPECT_EQUAL(b, a);
+ obj_b.setLong("fox", 4);
+ EXPECT_NOT_EQUAL(a, b);
+ EXPECT_NOT_EQUAL(b, a);
+ obj_a.setLong("fox", 5);
+ EXPECT_NOT_EQUAL(a, b);
+ EXPECT_NOT_EQUAL(b, a);
+ }
+ EXPECT_NOT_EQUAL(Slime().setBool(false), Slime().setNix());
+ EXPECT_NOT_EQUAL(Slime().setLong(123), Slime().setDouble(123));
+ EXPECT_NOT_EQUAL(Slime().setData("foo"), Slime().setString("foo"));
+ EXPECT_NOT_EQUAL(Slime().setArray(), Slime().setObject());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/slime/summary-feature-benchmark/.gitignore b/vespalib/src/tests/slime/summary-feature-benchmark/.gitignore
new file mode 100644
index 00000000000..4a614c681f4
--- /dev/null
+++ b/vespalib/src/tests/slime/summary-feature-benchmark/.gitignore
@@ -0,0 +1,2 @@
+/summary-feature-benchmark
+vespalib_summary-feature-benchmark_app
diff --git a/vespalib/src/tests/slime/summary-feature-benchmark/CMakeLists.txt b/vespalib/src/tests/slime/summary-feature-benchmark/CMakeLists.txt
new file mode 100644
index 00000000000..cd7fe80c3fc
--- /dev/null
+++ b/vespalib/src/tests/slime/summary-feature-benchmark/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_summary-feature-benchmark_app
+ SOURCES
+ summary-feature-benchmark.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_summary-feature-benchmark_app COMMAND vespalib_summary-feature-benchmark_app BENCHMARK)
diff --git a/vespalib/src/tests/slime/summary-feature-benchmark/FILES b/vespalib/src/tests/slime/summary-feature-benchmark/FILES
new file mode 100644
index 00000000000..1b4c570c614
--- /dev/null
+++ b/vespalib/src/tests/slime/summary-feature-benchmark/FILES
@@ -0,0 +1 @@
+summary-feature-benchmark.cpp
diff --git a/vespalib/src/tests/slime/summary-feature-benchmark/summary-feature-benchmark.cpp b/vespalib/src/tests/slime/summary-feature-benchmark/summary-feature-benchmark.cpp
new file mode 100644
index 00000000000..ba95c1fef9c
--- /dev/null
+++ b/vespalib/src/tests/slime/summary-feature-benchmark/summary-feature-benchmark.cpp
@@ -0,0 +1,70 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/data/slime/slime.h>
+
+using namespace vespalib;
+using namespace vespalib::slime::convenience;
+
+struct MyBuffer : public slime::Output {
+ std::vector<char> data;
+ size_t used;
+ MyBuffer() : data(1024 * 1024), used(0) {}
+ virtual char *exchange(char *, size_t commit, size_t) {
+ return &data[used += commit];
+ }
+};
+
+std::string make_name(size_t idx) {
+ return make_string("summary_feature_%zu", idx);
+}
+
+double make_value(size_t idx) {
+ return (0.017 * idx);
+}
+
+struct FeatureFixture {
+ Slime slime;
+ FeatureFixture() {
+ Cursor &obj = slime.setObject();
+ for (size_t i = 0; i < 1000; ++i) {
+ obj.setDouble(make_name(i), make_value(i));
+ }
+ }
+};
+
+TEST_F("slime -> json speed", FeatureFixture()) {
+ size_t size = 0;
+ double minTime = 1000000.0;
+ MyBuffer buffer;
+ for (size_t i = 0; i < 16; ++i) {
+ FastOS_Time timer;
+ timer.SetNow();
+ for (size_t j = 0; j < 256; ++j) {
+ buffer.used = 0;
+ slime::JsonFormat::encode(f1.slime, buffer, true);
+ }
+ minTime = std::min(minTime, timer.MilliSecsToNow() / 256.0);
+ size = buffer.used;
+ }
+ fprintf(stderr, "time: %g ms (size: %zu bytes)\n", minTime, size);
+}
+
+TEST_F("slime -> binary speed", FeatureFixture()) {
+ size_t size = 0;
+ double minTime = 1000000.0;
+ MyBuffer buffer;
+ for (size_t i = 0; i < 16; ++i) {
+ FastOS_Time timer;
+ timer.SetNow();
+ for (size_t j = 0; j < 256; ++j) {
+ buffer.used = 0;
+ slime::BinaryFormat::encode(f1.slime, buffer);
+ }
+ minTime = std::min(minTime, timer.MilliSecsToNow() / 256.0);
+ size = buffer.used;
+ }
+ fprintf(stderr, "time: %g ms (size: %zu bytes)\n", minTime, size);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/slime/type_traits.cpp b/vespalib/src/tests/slime/type_traits.cpp
new file mode 100644
index 00000000000..85d0b2fc643
--- /dev/null
+++ b/vespalib/src/tests/slime/type_traits.cpp
@@ -0,0 +1,15 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "type_traits.h"
+
+namespace vespalib {
+namespace slime {
+
+const bool TypeTraits<BOOL>::unsetValue;
+const int64_t TypeTraits<LONG>::unsetValue;
+const double TypeTraits<DOUBLE>::unsetValue = 0.0;
+const Memory TypeTraits<STRING>::unsetValue;
+const Memory TypeTraits<DATA>::unsetValue;
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/tests/slime/type_traits.h b/vespalib/src/tests/slime/type_traits.h
new file mode 100644
index 00000000000..0af21629945
--- /dev/null
+++ b/vespalib/src/tests/slime/type_traits.h
@@ -0,0 +1,59 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/data/slime/type.h>
+#include <vespa/vespalib/data/slime/memory.h>
+#include <vespa/vespalib/data/slime/stored_memory.h>
+
+namespace vespalib {
+namespace slime {
+
+// internal traits for data type types
+template<typename T> struct TypeTraits {};
+
+template<> struct TypeTraits<NIX> {
+ static void assertIsCreatedEmpty() {}
+};
+
+template<> struct TypeTraits<BOOL> {
+ typedef bool PassType;
+ typedef PassType StoreType;
+ static const bool unsetValue = false;
+};
+
+template<> struct TypeTraits<LONG> {
+ typedef int64_t PassType;
+ typedef PassType StoreType;
+ static const int64_t unsetValue = 0;
+};
+
+template<> struct TypeTraits<DOUBLE> {
+ typedef double PassType;
+ typedef PassType StoreType;
+ static const double unsetValue;
+};
+
+template<> struct TypeTraits<STRING> {
+ typedef Memory PassType;
+ typedef StoredMemory StoreType;
+ static const Memory unsetValue;
+};
+
+template<> struct TypeTraits<DATA> {
+ typedef Memory PassType;
+ typedef StoredMemory StoreType;
+ static const Memory unsetValue;
+};
+
+template<> struct TypeTraits<ARRAY> {
+ static void assertIsCreatedEmpty() {}
+};
+
+template<> struct TypeTraits<OBJECT> {
+ static void assertIsCreatedEmpty() {}
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/tests/stash/.gitignore b/vespalib/src/tests/stash/.gitignore
new file mode 100644
index 00000000000..01c3fb95b3b
--- /dev/null
+++ b/vespalib/src/tests/stash/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+stash_test
+vespalib_stash_test_app
diff --git a/vespalib/src/tests/stash/CMakeLists.txt b/vespalib/src/tests/stash/CMakeLists.txt
new file mode 100644
index 00000000000..68da4f2bfbf
--- /dev/null
+++ b/vespalib/src/tests/stash/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_stash_test_app
+ SOURCES
+ stash.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_stash_test_app COMMAND vespalib_stash_test_app)
diff --git a/vespalib/src/tests/stash/DESC b/vespalib/src/tests/stash/DESC
new file mode 100644
index 00000000000..d947e0b1c4f
--- /dev/null
+++ b/vespalib/src/tests/stash/DESC
@@ -0,0 +1 @@
+stash test. Take a look at stash.cpp for details.
diff --git a/vespalib/src/tests/stash/FILES b/vespalib/src/tests/stash/FILES
new file mode 100644
index 00000000000..0c295c0f048
--- /dev/null
+++ b/vespalib/src/tests/stash/FILES
@@ -0,0 +1 @@
+stash.cpp
diff --git a/vespalib/src/tests/stash/stash.cpp b/vespalib/src/tests/stash/stash.cpp
new file mode 100644
index 00000000000..b4ee201a50a
--- /dev/null
+++ b/vespalib/src/tests/stash/stash.cpp
@@ -0,0 +1,330 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/stash.h>
+#include <vespa/vespalib/util/traits.h>
+
+using namespace vespalib;
+
+//-----------------------------------------------------------------------------
+
+template <size_t fill_size>
+struct Object {
+ bool alive;
+ int check1;
+ int check2;
+ int check3;
+ bool &destructed;
+ char bloat[fill_size];
+ explicit Object(bool &dref)
+ : alive(true), check1(0x1111), check2(0x2222), check3(0x5555),
+ destructed(dref), bloat()
+ {
+ for (size_t i = 0; i < fill_size; ++i) {
+ bloat[i] = 0xee;
+ }
+ }
+ ~Object() {
+ ASSERT_TRUE(alive);
+ ASSERT_TRUE(check1 == 0x1111);
+ ASSERT_TRUE(check2 == 0x2222);
+ ASSERT_TRUE(check3 == 0x5555);
+ alive = false;
+ check1 = 0;
+ check2 = 0;
+ check3 = 0;
+ destructed = true;
+ }
+};
+
+typedef Object<8> SmallObject;
+typedef Object<10000> LargeObject;
+
+struct Small : SmallObject {
+ Small(bool &dref) : SmallObject(dref) {}
+};
+
+struct Large : LargeObject {
+ Large(bool &dref) : LargeObject(dref) {}
+};
+
+struct Small_NoDelete : SmallObject {
+ Small_NoDelete(bool &dref) : SmallObject(dref) {}
+};
+
+struct Large_NoDelete : LargeObject {
+ Large_NoDelete(bool &dref) : LargeObject(dref) {}
+};
+
+VESPA_CAN_SKIP_DESTRUCTION(Small_NoDelete);
+VESPA_CAN_SKIP_DESTRUCTION(Large_NoDelete);
+
+//-----------------------------------------------------------------------------
+
+struct Pair {
+ int a;
+ double b;
+ Pair() : a(42), b(4.2) {}
+ Pair(int a_in, double b_in) : a(a_in), b(b_in) {}
+};
+
+struct PairD {
+ int a;
+ double b;
+ PairD() : a(42), b(4.2) {}
+ PairD(int a_in, double b_in) : a(a_in), b(b_in) {}
+ ~PairD() {}
+};
+
+//-----------------------------------------------------------------------------
+
+size_t sum(std::initializer_list<size_t> list) {
+ size_t ret = 0;
+ for (auto i: list) {
+ ret += i;
+ }
+ return ret;
+}
+
+//-----------------------------------------------------------------------------
+
+size_t char_ptr_size() { return sizeof(char*); }
+size_t chunk_header_size() { return sizeof(stash::Chunk); }
+size_t dtor_hook_size() { return sizeof(stash::DestructObject<Small>); }
+size_t free_hook_size() { return sizeof(stash::DeleteMemory); }
+
+//-----------------------------------------------------------------------------
+
+TEST("require that base types have expected size") {
+ EXPECT_EQUAL(8u, char_ptr_size());
+ EXPECT_EQUAL(16u, chunk_header_size());
+ EXPECT_EQUAL(16u, dtor_hook_size());
+ EXPECT_EQUAL(16u, free_hook_size());
+}
+
+TEST("require that raw memory can be allocated inside the stash") {
+ Stash stash;
+ EXPECT_EQUAL(0u, stash.count_used());
+ char *mem1 = stash.alloc(512);
+ EXPECT_EQUAL(sum({chunk_header_size(), 512}), stash.count_used());
+ char *mem2 = stash.alloc(512);
+ EXPECT_EQUAL(sum({chunk_header_size(), 512, 512}), stash.count_used());
+ char *mem3 = stash.alloc(512);
+ EXPECT_EQUAL(sum({chunk_header_size(), 512, 512, 512}), stash.count_used());
+ EXPECT_TRUE(mem1 + 512 == mem2);
+ EXPECT_TRUE(mem2 + 512 == mem3);
+}
+
+TEST("require that raw memory can be allocated outside the stash") {
+ Stash stash;
+ EXPECT_EQUAL(0u, stash.count_used());
+ EXPECT_TRUE(stash.alloc(10000) != nullptr);
+ EXPECT_EQUAL(0u, stash.count_used());
+ EXPECT_TRUE(stash.alloc(10000) != nullptr);
+ EXPECT_EQUAL(0u, stash.count_used());
+}
+
+TEST("require that allocations are aligned to pointer size") {
+ Stash stash;
+ EXPECT_EQUAL(0u, stash.count_used());
+ char *mem1 = stash.alloc(1);
+ EXPECT_EQUAL(sum({chunk_header_size(), char_ptr_size()}), stash.count_used());
+ char *mem2 = stash.alloc(char_ptr_size() - 1);
+ EXPECT_EQUAL(sum({chunk_header_size(), char_ptr_size(), char_ptr_size()}), stash.count_used());
+ char *mem3 = stash.alloc(char_ptr_size());
+ EXPECT_EQUAL(sum({chunk_header_size(), char_ptr_size(), char_ptr_size(), char_ptr_size()}), stash.count_used());
+ EXPECT_TRUE(mem1 + char_ptr_size() == mem2);
+ EXPECT_TRUE(mem2 + char_ptr_size() == mem3);
+}
+
+TEST("require that valid empty memory may be allocated") {
+ Stash stash;
+ EXPECT_EQUAL(0u, stash.count_used());
+ char *mem1 = stash.alloc(0);
+ EXPECT_EQUAL(sum({chunk_header_size()}), stash.count_used());
+ char *mem2 = stash.alloc(0);
+ EXPECT_EQUAL(sum({chunk_header_size()}), stash.count_used());
+ char *mem3 = stash.alloc(char_ptr_size());
+ EXPECT_EQUAL(sum({chunk_header_size(), char_ptr_size()}), stash.count_used());
+ char *mem4 = stash.alloc(0);
+ EXPECT_EQUAL(sum({chunk_header_size(), char_ptr_size()}), stash.count_used());
+ EXPECT_TRUE(mem1 == mem2);
+ EXPECT_TRUE(mem2 == mem3);
+ EXPECT_TRUE(mem3 + char_ptr_size() == mem4);
+}
+
+TEST("require that small object creation and destruction works") {
+ bool destructed = false;
+ {
+ Stash stash;
+ stash.create<Small>(destructed);
+ EXPECT_EQUAL(sum({chunk_header_size(), dtor_hook_size(), sizeof(Small)}), stash.count_used());
+ EXPECT_FALSE(destructed);
+ }
+ EXPECT_TRUE(destructed);
+}
+
+TEST("require that large object creation and destruction works") {
+ bool destructed = false;
+ {
+ Stash stash;
+ stash.create<Large>(destructed);
+ EXPECT_EQUAL(0u, stash.count_used());
+ EXPECT_GREATER(sizeof(Large), 1024u);
+ EXPECT_FALSE(destructed);
+ }
+ EXPECT_TRUE(destructed);
+}
+
+TEST("require that small objects can skip destruction") {
+ bool destructed = false;
+ {
+ Stash stash;
+ stash.create<Small_NoDelete>(destructed);
+ EXPECT_EQUAL(sum({chunk_header_size(), sizeof(Small_NoDelete)}), stash.count_used());
+ }
+ EXPECT_FALSE(destructed);
+}
+
+TEST("require that large objects can skip destruction") {
+ bool destructed = false;
+ {
+ Stash stash;
+ stash.create<Large_NoDelete>(destructed);
+ EXPECT_EQUAL(0u, stash.count_used());
+ EXPECT_GREATER(sizeof(Large_NoDelete), 1024u);
+ }
+ EXPECT_FALSE(destructed);
+}
+
+TEST("require that constructor parameters are passed correctly") {
+ Stash stash;
+ {
+ PairD &pair = stash.create<PairD>();
+ Pair &pair_nodelete = stash.create<Pair>();
+ EXPECT_EQUAL(pair.a, pair_nodelete.a);
+ EXPECT_EQUAL(pair.b, pair_nodelete.b);
+ EXPECT_EQUAL(42, pair.a);
+ EXPECT_EQUAL(4.2, pair.b);
+ }
+ {
+ PairD &pair = stash.create<PairD>(50, 100.5);
+ Pair &pair_nodelete = stash.create<Pair>(50, 100.5);
+ EXPECT_EQUAL(pair.a, pair_nodelete.a);
+ EXPECT_EQUAL(pair.b, pair_nodelete.b);
+ EXPECT_EQUAL(50, pair.a);
+ EXPECT_EQUAL(100.5, pair.b);
+ }
+}
+
+TEST("require that trivially destructable objects are detected") {
+ Stash stash;
+ EXPECT_TRUE(can_skip_destruction<Pair>::value);
+ EXPECT_FALSE(can_skip_destruction<PairD>::value);
+ stash.create<Pair>();
+ EXPECT_EQUAL(sum({chunk_header_size(), sizeof(Pair)}), stash.count_used());
+ stash.create<PairD>();
+ EXPECT_EQUAL(sum({chunk_header_size(), sizeof(Pair), dtor_hook_size(), sizeof(PairD)}), stash.count_used());
+}
+
+TEST("require that multiple chunks can be used by the stash") {
+ Stash stash;
+ char *prev = nullptr;
+ size_t count = 0;
+ for (size_t i = 0; i < 100; ++i) {
+ char *ptr = stash.alloc(512);
+ if (prev == nullptr || (prev + 512) != ptr) {
+ ++count;
+ }
+ prev = ptr;
+ }
+ EXPECT_TRUE(count > 10);
+ EXPECT_EQUAL(100 * 512 + count * chunk_header_size(), stash.count_used());
+}
+
+TEST("require that default chunk size is 4096") {
+ Stash stash;
+ EXPECT_EQUAL(4096u, stash.get_chunk_size());
+}
+
+TEST("require that the chunk size can be adjusted") {
+ Stash stash(64000);
+ EXPECT_EQUAL(64000u, stash.get_chunk_size());
+}
+
+TEST("require that minimal chunk size is 4096") {
+ Stash stash(128);
+ EXPECT_EQUAL(4096u, stash.get_chunk_size());
+}
+
+TEST("require that a stash can be moved by construction") {
+ bool destructed = false;
+ {
+ Stash outer_stash;
+ outer_stash.create<Small>(destructed);
+ {
+ EXPECT_TRUE(outer_stash.count_used() > 0);
+ Stash inner_stash(std::move(outer_stash));
+ EXPECT_TRUE(inner_stash.count_used() > 0);
+ EXPECT_TRUE(outer_stash.count_used() == 0);
+ EXPECT_FALSE(destructed);
+ }
+ EXPECT_TRUE(destructed);
+ }
+}
+
+TEST("require that a stash can be moved by assignment") {
+ bool destructed = false;
+ {
+ Stash outer_stash;
+ outer_stash.create<Small>(destructed);
+ {
+ EXPECT_TRUE(outer_stash.count_used() > 0);
+ Stash inner_stash;
+ EXPECT_TRUE(inner_stash.count_used() == 0);
+ inner_stash = std::move(outer_stash);
+ EXPECT_TRUE(inner_stash.count_used() > 0);
+ EXPECT_TRUE(outer_stash.count_used() == 0);
+ EXPECT_FALSE(destructed);
+ }
+ EXPECT_TRUE(destructed);
+ }
+}
+
+TEST("require that an empty stash can be cleared") {
+ Stash stash;
+ EXPECT_EQUAL(0u, stash.count_used());
+ stash.clear();
+ EXPECT_EQUAL(0u, stash.count_used());
+}
+
+TEST("require that a stash retains memory when cleared") {
+ bool destructed = false;
+ {
+ Stash stash;
+ stash.create<Small>(destructed);
+ EXPECT_EQUAL(sum({chunk_header_size(), dtor_hook_size(), sizeof(Small)}), stash.count_used());
+ EXPECT_FALSE(destructed);
+ stash.clear();
+ EXPECT_EQUAL(sum({chunk_header_size()}), stash.count_used());
+ EXPECT_TRUE(destructed);
+ }
+}
+
+TEST("require that a stash only retains a single chunk when cleared") {
+ Stash stash;
+ char *prev = nullptr;
+ size_t count = 0;
+ for (size_t i = 0; i < 100; ++i) {
+ char *ptr = stash.alloc(512);
+ if (prev == nullptr || (prev + 512) != ptr) {
+ ++count;
+ }
+ prev = ptr;
+ }
+ EXPECT_TRUE(count > 10);
+ EXPECT_EQUAL(100 * 512 + count * chunk_header_size(), stash.count_used());
+ stash.clear();
+ EXPECT_EQUAL(sum({chunk_header_size()}), stash.count_used());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/stllike/.gitignore b/vespalib/src/tests/stllike/.gitignore
new file mode 100644
index 00000000000..fb864427c81
--- /dev/null
+++ b/vespalib/src/tests/stllike/.gitignore
@@ -0,0 +1,15 @@
+.depend
+Makefile
+asciistream_test
+string_test
+lookup_benchmark
+hash_test
+hashtable_test
+uniq_by_sort_map_hash
+vespalib_asciistream_test_app
+vespalib_hash_test_app
+vespalib_hashtable_test_app
+vespalib_string_test_app
+vespalib_vector_map_test_app
+vespalib_lookup_benchmark_app
+vespalib_uniq_by_sort_map_hash_app
diff --git a/vespalib/src/tests/stllike/CMakeLists.txt b/vespalib/src/tests/stllike/CMakeLists.txt
new file mode 100644
index 00000000000..2753a167f72
--- /dev/null
+++ b/vespalib/src/tests/stllike/CMakeLists.txt
@@ -0,0 +1,49 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_hash_test_app
+ SOURCES
+ hash_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_hash_test_app COMMAND vespalib_hash_test_app)
+vespa_add_executable(vespalib_string_test_app
+ SOURCES
+ string_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_string_test_app COMMAND vespalib_string_test_app)
+vespa_add_executable(vespalib_vector_map_test_app
+ SOURCES
+ vector_map_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_vector_map_test_app COMMAND vespalib_vector_map_test_app)
+vespa_add_executable(vespalib_asciistream_test_app
+ SOURCES
+ asciistream_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_asciistream_test_app COMMAND vespalib_asciistream_test_app)
+vespa_add_executable(vespalib_hashtable_test_app
+ SOURCES
+ hashtable_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_hashtable_test_app COMMAND vespalib_hashtable_test_app)
+vespa_add_executable(vespalib_uniq_by_sort_map_hash_app
+ SOURCES
+ uniq_by_sort_map_hash.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_executable(vespalib_lookup_benchmark_app
+ SOURCES
+ lookup_benchmark.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_lookup_benchmark_app COMMAND vespalib_lookup_benchmark_app BENCHMARK)
diff --git a/vespalib/src/tests/stllike/DESC b/vespalib/src/tests/stllike/DESC
new file mode 100644
index 00000000000..dab62790af5
--- /dev/null
+++ b/vespalib/src/tests/stllike/DESC
@@ -0,0 +1,2 @@
+string test. Take a look at string.cpp for details.
+asciistream test. Take a look at asciistream.cpp for details.
diff --git a/vespalib/src/tests/stllike/FILES b/vespalib/src/tests/stllike/FILES
new file mode 100644
index 00000000000..24baf8f9baa
--- /dev/null
+++ b/vespalib/src/tests/stllike/FILES
@@ -0,0 +1,2 @@
+string.cpp
+asciistream.cpp
diff --git a/vespalib/src/tests/stllike/asciistream_test.cpp b/vespalib/src/tests/stllike/asciistream_test.cpp
new file mode 100644
index 00000000000..bca3d431405
--- /dev/null
+++ b/vespalib/src/tests/stllike/asciistream_test.cpp
@@ -0,0 +1,517 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <limits>
+#include <vespa/log/log.h>
+LOG_SETUP("identifiable_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <iomanip>
+
+using namespace vespalib;
+
+class AsciistreamTest : public TestApp
+{
+public:
+ int Main();
+ template <typename T>
+ void verify(T first, T second, const char * firstResult, const char * secondResult, char delim);
+ template <typename T>
+ void verifyBothWays(T value, const char * firstResult);
+ void testIntegerManip();
+ void testFill();
+ void testString();
+ void testCreateFromFile();
+ void testWriteThenRead();
+ void testGetLine();
+ void testCopyConstruct();
+ void testIllegalNumbers();
+ void testDouble();
+};
+
+template <typename T>
+void
+AsciistreamTest::verifyBothWays(T value, const char * expected)
+{
+ asciistream os;
+ os << value;
+ EXPECT_EQUAL(os.str(), string(expected));
+ EXPECT_EQUAL(os.size(), strlen(expected));
+ T v;
+ os >> v;
+ EXPECT_EQUAL(value, v);
+ EXPECT_TRUE(os.empty());
+}
+
+template <typename T>
+void
+AsciistreamTest::verify(T first, T second, const char * firstResult, const char * secondResult, char delim)
+{
+ asciistream os;
+ std::ostringstream ss;
+ os << first;
+ ss << first;
+ EXPECT_EQUAL(os.str(), string(firstResult));
+ EXPECT_EQUAL(os.size(), strlen(firstResult));
+ EXPECT_EQUAL(ss.str().size(), strlen(firstResult));
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), firstResult), 0);
+ os << delim << second;
+ ss << delim << second;
+ EXPECT_EQUAL(os.size(), strlen(secondResult));
+ EXPECT_EQUAL(ss.str().size(), strlen(secondResult));
+ EXPECT_EQUAL(strcmp(os.c_str(), secondResult), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), secondResult), 0);
+}
+
+void
+AsciistreamTest::testIllegalNumbers()
+{
+ {
+ asciistream is("777777777777");
+ uint16_t s(0);
+ EXPECT_EXCEPTION(is >> s, IllegalArgumentException, "An uint16_t can not represent '777777777777'");
+ EXPECT_EQUAL(12u, is.size());
+ uint32_t i(0);
+ EXPECT_EXCEPTION(is >> i, IllegalArgumentException, "An uint32_t can not represent '777777777777'");
+ EXPECT_EQUAL(12u, is.size());
+ int16_t si(0);
+ EXPECT_EXCEPTION(is >> si, IllegalArgumentException, "An int16_t can not represent '777777777777'");
+ EXPECT_EQUAL(12u, is.size());
+ int32_t ii(0);
+ EXPECT_EXCEPTION(is >> ii, IllegalArgumentException, "An int32_t can not represent '777777777777'");
+ EXPECT_EQUAL(12u, is.size());
+ is << "777777777777";
+ EXPECT_EQUAL(24u, is.size());
+ uint64_t l(0);
+ EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "uint64_t value is outside of range '777777777777777777777777'");
+ EXPECT_EQUAL(24u, is.size());
+ int64_t li(0);
+ EXPECT_EXCEPTION(is >> li, IllegalArgumentException, "int64_t value is outside of range '777777777777777777777777'");
+ EXPECT_EQUAL(24u, is.size());
+ }
+ {
+ asciistream is("-77");
+ uint16_t s(0);
+ EXPECT_EXCEPTION(is >> s, IllegalArgumentException, "An uint16_t can not represent '-77'");
+ EXPECT_EQUAL(3u, is.size());
+ uint32_t i(0);
+ EXPECT_EXCEPTION(is >> i, IllegalArgumentException, "An uint32_t can not represent '-77'");
+ EXPECT_EQUAL(3u, is.size());
+ }
+ {
+ asciistream is("7777777777777777777777777777777777777777");
+ EXPECT_EQUAL(40u, is.size());
+ float f(0);
+ EXPECT_EXCEPTION(is >> f, IllegalArgumentException, "float value is outside of range '7777777777777777777777777777777777777777'");
+ EXPECT_EQUAL(40u, is.size());
+ is << "e" << is.str();
+ EXPECT_EQUAL(81u, is.size());
+ double d(0);
+ EXPECT_EXCEPTION(is >> d, IllegalArgumentException, "double value is outside of range '7777777777777777777777777777777777777777e7777777777777777777777777777777777777777'");
+ EXPECT_EQUAL(81u, is.size());
+ }
+ {
+ asciistream is("a");
+ char c(' ');
+ EXPECT_EQUAL(1u, is.size());
+ is >> c;
+ EXPECT_EQUAL('a', c);
+ EXPECT_TRUE(is.empty());
+ EXPECT_EXCEPTION(is >> c, IllegalArgumentException, "buffer underflow at pos 1.");
+ EXPECT_TRUE(is.empty());
+ unsigned char u(' ');
+ EXPECT_EXCEPTION(is >> u, IllegalArgumentException, "buffer underflow at pos 1.");
+ EXPECT_TRUE(is.empty());
+ bool b(false);
+ EXPECT_EXCEPTION(is >> b, IllegalArgumentException, "buffer underflow at pos 1.");
+ EXPECT_TRUE(is.empty());
+ {
+ uint32_t l(0);
+ EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "Failed decoding a uint64_t from ''.");
+ EXPECT_TRUE(is.empty());
+ }
+ {
+ int32_t l(0);
+ EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "Failed decoding a int64_t from ''.");
+ EXPECT_TRUE(is.empty());
+ }
+ {
+ float l(0);
+ EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "Failed decoding a float from ''.");
+ EXPECT_TRUE(is.empty());
+ }
+ {
+ double l(0);
+ EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "Failed decoding a double from ''.");
+ EXPECT_TRUE(is.empty());
+ }
+
+ }
+}
+
+void
+AsciistreamTest::testCopyConstruct()
+{
+ asciistream os;
+ os << "test1";
+ asciistream os2(os);
+ EXPECT_EQUAL(os.str(), os2.str());
+ os2 << " test2";
+ EXPECT_FALSE(os.str() == os2.str());
+ asciistream os3(os);
+ os3 = os2;
+ EXPECT_EQUAL(os2.str(), os3.str());
+ os.swap(os2);
+ EXPECT_EQUAL(os.str(), os3.str());
+ EXPECT_FALSE(os3.str() == os2.str());
+ os.swap(os2);
+ EXPECT_TRUE(os3.str() == os2.str());
+}
+
+void
+AsciistreamTest::testIntegerManip()
+{
+ asciistream os;
+ std::ostringstream ss;
+ os << 10;
+ ss << 10;
+ EXPECT_EQUAL(os.size(), 2u);
+ EXPECT_EQUAL(ss.str().size(), 2u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "10"), 0);
+ os << ' ' << dec << 10;
+ ss << ' ' << std::dec << 10;
+ EXPECT_EQUAL(os.size(), 5u);
+ EXPECT_EQUAL(ss.str().size(), 5u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10 10"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 10"), 0);
+ os << ' ' << hex << 10 << ' ' << 11;
+ ss << ' ' << std::hex << 10 << ' ' << 11;
+ EXPECT_EQUAL(os.size(), 9u);
+ EXPECT_EQUAL(ss.str().size(), 9u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10 10 a b"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 10 a b"), 0);
+ os << ' ' << oct << 10;
+ ss << ' ' << std::oct << 10;
+ EXPECT_EQUAL(os.size(), 12u);
+ EXPECT_EQUAL(ss.str().size(), 12u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10 10 a b 12"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 10 a b 12"), 0);
+
+ // std::bin not supported by std::streams.
+ os << ' ' << bin << 10;
+ EXPECT_EQUAL(os.size(), 19u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10 10 a b 12 0b1010"), 0);
+
+ void *fooptr = reinterpret_cast<void*>(0x1badbadc0ffeeull);
+ // Also test that number base is restored OK after ptr print
+ os << dec << ' ' << fooptr << ' ' << 1234;
+ ss << std::dec << ' ' << fooptr << ' ' << 1234;
+ EXPECT_EQUAL(std::string("10 10 a b 12 0b1010 0x1badbadc0ffee 1234"), os.str());
+ EXPECT_EQUAL(std::string("10 10 a b 12 0x1badbadc0ffee 1234"), ss.str());
+
+ int i = 0;
+ const char *digits = "12345";
+ std::string ffs(digits, 4);
+ std::istringstream std_istr(ffs);
+ std_istr >> i;
+ EXPECT_EQUAL(1234, i);
+
+ stringref firstfour(digits, 4);
+ asciistream istr(firstfour);
+ istr >> i;
+ EXPECT_EQUAL(1234, i);
+}
+
+
+void
+AsciistreamTest::testFill()
+{
+ {
+ asciistream os;
+ std::ostringstream ss;
+ os << 10 << ' ' << setfill('h') << 11;
+ ss << 10 << ' ' << std::setfill('h') << 11;
+ EXPECT_EQUAL(os.size(), 5u);
+ EXPECT_EQUAL(ss.str().size(), 5u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10 11"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 11"), 0);
+ os << setw(4) << 10 << ' ' << 11;
+ ss << std::setw(4) << 10 << ' ' << 11;
+ EXPECT_EQUAL(os.size(), 12u);
+ EXPECT_EQUAL(ss.str().size(), 12u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10 11hh10 11"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 11hh10 11"), 0);
+ os << setw(4) << 10 << ' ' << 11;
+ ss << std::setw(4) << 10 << ' ' << 11;
+ EXPECT_EQUAL(os.size(), 19u);
+ EXPECT_EQUAL(ss.str().size(), 19u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "10 11hh10 11hh10 11"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 11hh10 11hh10 11"), 0);
+ }
+ {
+ asciistream os;
+ std::ostringstream ss;
+ os << setfill('X') << setw(19) << 'a';
+ ss << std::setfill('X') << std::setw(19) << 'a';
+ EXPECT_EQUAL(os.size(), 19u);
+ EXPECT_EQUAL(ss.str().size(), 19u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXXXXa"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXXXXa"), 0);
+ }
+ {
+ asciistream os;
+ std::ostringstream ss;
+ os << setfill('X') << setw(19) << "a";
+ ss << std::setfill('X') << std::setw(19) << "a";
+ EXPECT_EQUAL(os.size(), 19u);
+ EXPECT_EQUAL(ss.str().size(), 19u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXXXXa"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXXXXa"), 0);
+ }
+ {
+ float f(8.9);
+ asciistream os;
+ std::ostringstream ss;
+ os << setfill('X') << setw(19) << f;
+ ss << std::setfill('X') << std::setw(19) << f;
+ EXPECT_EQUAL(os.size(), 19u);
+ EXPECT_EQUAL(ss.str().size(), 19u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXX8.9"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXX8.9"), 0);
+ }
+ {
+ double f(8.9);
+ asciistream os;
+ std::ostringstream ss;
+ os << setfill('X') << setw(19) << f;
+ ss << std::setfill('X') << std::setw(19) << f;
+ EXPECT_EQUAL(os.size(), 19u);
+ EXPECT_EQUAL(ss.str().size(), 19u);
+ EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXX8.9"), 0);
+ EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXX8.9"), 0);
+ }
+
+}
+
+void
+AsciistreamTest::testString()
+{
+
+ std::string ss("a");
+ vespalib::string vs("a");
+ {
+ std::ostringstream oss;
+ oss << ss << vs;
+ EXPECT_EQUAL("aa", oss.str());
+ }
+ {
+ asciistream oss;
+ oss << ss << vs;
+ EXPECT_EQUAL("aa", oss.str());
+ }
+ {
+ std::istringstream iss("b c");
+ iss >> ss >> vs;
+ EXPECT_EQUAL("b", ss);
+ EXPECT_EQUAL("c", vs);
+ }
+ {
+ std::istringstream iss("b c");
+ iss >> vs >> ss;
+ EXPECT_EQUAL("b", vs);
+ EXPECT_EQUAL("c", ss);
+ }
+ {
+ asciistream iss("b c");
+ iss >> ss >> vs;
+ EXPECT_EQUAL("b", ss);
+ EXPECT_EQUAL("c", vs);
+ }
+ {
+ asciistream iss("b c");
+ iss >> vs >> ss;
+ EXPECT_EQUAL("b", vs);
+ EXPECT_EQUAL("c", ss);
+ }
+}
+
+void
+AsciistreamTest::testCreateFromFile()
+{
+ asciistream is(asciistream::createFromFile("non-existing.txt"));
+ EXPECT_TRUE(is.eof());
+
+ is = asciistream::createFromFile("test.txt");
+ EXPECT_FALSE(is.eof());
+ EXPECT_EQUAL(12u, is.size());
+ string s;
+ is >> s;
+ EXPECT_EQUAL("line1", s);
+ is >> s;
+ EXPECT_EQUAL("line2", s);
+ EXPECT_FALSE(is.eof());
+ is >> s;
+ EXPECT_EQUAL("", s);
+ EXPECT_TRUE(is.eof());
+
+ is = asciistream::createFromDevice("/proc/stat");
+ EXPECT_FALSE(is.eof());
+}
+
+void
+AsciistreamTest::testWriteThenRead()
+{
+ asciistream ios;
+ ios << "3 words";
+ int n(0);
+ string v;
+ ios >> n >> v;
+ EXPECT_EQUAL(3, n);
+ EXPECT_EQUAL("words", v);
+ EXPECT_TRUE(ios.eof());
+}
+
+void
+AsciistreamTest::testGetLine()
+{
+ asciistream is("");
+ EXPECT_TRUE(is.getlines().empty());
+ is = asciistream("line 1");
+ std::vector<string> v = is.getlines();
+ EXPECT_EQUAL(1u, v.size());
+ EXPECT_EQUAL("line 1", v[0]);
+ is = asciistream("line 1\nline 2");
+ v = is.getlines();
+ EXPECT_EQUAL(2u, v.size());
+ EXPECT_EQUAL("line 1", v[0]);
+ EXPECT_EQUAL("line 2", v[1]);
+ is = asciistream("line 1\nline 2\n\n");
+ v = is.getlines();
+ EXPECT_EQUAL(3u, v.size());
+ EXPECT_EQUAL("line 1", v[0]);
+ EXPECT_EQUAL("line 2", v[1]);
+ EXPECT_EQUAL("", v[2]);
+ is = asciistream("line 1");
+ string s;
+ getline(is, s);
+ EXPECT_EQUAL("line 1", s);
+}
+
+#define VERIFY_DOUBLE_SERIALIZATION(value, expected, format, precision) { \
+ asciistream mystream; \
+ mystream << format; \
+ if (precision > 0) mystream << asciistream::Precision(precision); \
+ mystream << value; \
+ EXPECT_EQUAL(expected, mystream.str()); \
+}
+
+void
+AsciistreamTest::testDouble() {
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.000000", fixed, -1);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.000000e+00", scientific, -1);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0", automatic, -1);
+
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0", fixed, 1);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0e+00", scientific, 1);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0", automatic, 1);
+
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0000000000000000", fixed, 16);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0000000000000000e+00", scientific, 16);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0", automatic, 16);
+
+ double maxVal = std::numeric_limits<double>::max();
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000", fixed, -1);
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "1.797693e+308", scientific, -1);
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "1.79769e+308", automatic, -1);
+
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0", fixed, 1);
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "1.8e+308", scientific, 1);
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "2e+308", automatic, 1);
+
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000000000", fixed, 16);
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "1.7976931348623157e+308", scientific, 16)
+ VERIFY_DOUBLE_SERIALIZATION(maxVal, "1.797693134862316e+308", automatic, 16);
+
+ double minVal = std::numeric_limits<double>::min();
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "0.000000", fixed, -1);
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "2.225074e-308", scientific, -1);
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "2.22507e-308", automatic, -1);
+
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "0.0", fixed, 1);
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "2.2e-308", scientific, 1);
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "2e-308", automatic, 1);
+
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "0.0000000000000000", fixed, 16);
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "2.2250738585072014e-308", scientific, 16);
+ VERIFY_DOUBLE_SERIALIZATION(minVal, "2.225073858507201e-308", automatic, 16);
+
+ double maxInteger = uint64_t(1) << 53;
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9007199254740992.000000", fixed, -1);
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9.007199e+15", scientific, -1);
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9.0072e+15", automatic, -1);
+
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9007199254740992.0", fixed, 1);
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9.0e+15", scientific, 1);
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9e+15", automatic, 1);
+
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9007199254740992.0000000000000000", fixed, 16);
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9.0071992547409920e+15", scientific, 16);
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9007199254740992", automatic, 16);
+
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0", automatic << forcedot, -1);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0", automatic << forcedot, 1);
+ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0", automatic << forcedot, 16);
+ VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9007199254740992.0", automatic << forcedot, 16);
+}
+
+int
+AsciistreamTest::Main()
+{
+ TEST_INIT("asciistream_test");
+
+ TEST_DO(verify("per", "paal", "per", "per paal", ' '));
+ TEST_DO(verify<float>(7.89, -1.3, "7.89", "7.89 -1.3", ' '));
+ TEST_DO(verify<double>(7.89, -1.3, "7.89", "7.89 -1.3", ' '));
+ TEST_DO(verify<bool>(true, false, "1", "1 0", ' '));
+ TEST_DO(verify<char>(65, 66, "A", "A B", ' '));
+// TEST_DO(verify<int8_t>(65, -1, "65", "65 -1", ' '));
+ TEST_DO(verify<int16_t>(0, -1, "0", "0 -1", ' '));
+ TEST_DO(verify<int16_t>(789, -1, "789", "789 -1", ' '));
+ TEST_DO(verify<int32_t>(789, -1, "789", "789 -1", ' '));
+ TEST_DO(verify<int64_t>(789789789789789l, -1, "789789789789789", "789789789789789 -1", ' '));
+// TEST_DO(verify<uint8_t>(65, -1, "65", "65 255", ' '));
+ TEST_DO(verify<uint16_t>(789, -1, "789", "789 65535", ' '));
+ TEST_DO(verify<uint32_t>(789, -1, "789", "789 4294967295", ' '));
+ TEST_DO(verify<uint64_t>(789789789789789l, -1, "789789789789789", "789789789789789 18446744073709551615", ' '));
+
+ TEST_DO(verifyBothWays<vespalib::string>("7.89", "7.89"));
+ TEST_DO(verifyBothWays<std::string>("7.89", "7.89"));
+ TEST_DO(verifyBothWays<float>(7.89, "7.89"));
+ TEST_DO(verifyBothWays<double>(7.89, "7.89"));
+ TEST_DO(verifyBothWays<bool>(true, "1"));
+ TEST_DO(verifyBothWays<bool>(false, "0"));
+ TEST_DO(verifyBothWays<char>(65, "A"));
+ TEST_DO(verifyBothWays<unsigned char>(65, "A"));
+ //TEST_DO(verifyBothWays<int8_t>(7, "7"));
+ //TEST_DO(verifyBothWays<uint8_t>(7, "7"));
+ TEST_DO(verifyBothWays<int16_t>(7, "7"));
+ TEST_DO(verifyBothWays<uint16_t>(7, "7"));
+ TEST_DO(verifyBothWays<int32_t>(7, "7"));
+ TEST_DO(verifyBothWays<uint32_t>(7, "7"));
+ TEST_DO(verifyBothWays<int64_t>(7, "7"));
+ TEST_DO(verifyBothWays<uint64_t>(7, "7"));
+
+ testCopyConstruct();
+ testIntegerManip();
+ testFill();
+ testString();
+ testCreateFromFile();
+ testWriteThenRead();
+ testGetLine();
+ testIllegalNumbers();
+ testDouble();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(AsciistreamTest)
diff --git a/vespalib/src/tests/stllike/hash_test.cpp b/vespalib/src/tests/stllike/hash_test.cpp
new file mode 100644
index 00000000000..cae98bf0e40
--- /dev/null
+++ b/vespalib/src/tests/stllike/hash_test.cpp
@@ -0,0 +1,479 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("hash_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/stllike/hash_set.h>
+#include <vespa/vespalib/stllike/hash_map.h>
+
+using namespace vespalib;
+using std::make_pair;
+
+namespace {
+ struct Foo {
+ int i;
+
+ Foo() : i(0) {}
+ Foo(int i_) : i(i_) {}
+
+ bool operator==(const Foo& f) const
+ { return (i == f.i); }
+
+ struct hash {
+ size_t operator() (const Foo& f) const {
+ return (f.i % 16);
+ }
+ };
+ friend std::ostream & operator << (std::ostream & os, const Foo & f) { return os << f.i; }
+ };
+}
+
+TEST("test hash set with custom type and hash function")
+{
+ const size_t testSize(2000);
+ hash_set<Foo, Foo::hash> set(100);
+ // Verfify start conditions.
+ EXPECT_TRUE(set.size() == 0);
+ EXPECT_TRUE(set.begin() == set.end());
+ EXPECT_TRUE(set.find(7) == set.end());
+ // Insert one element
+ set.insert(Foo(7));
+ EXPECT_TRUE(set.size() == 1);
+ EXPECT_TRUE(set.begin() != set.end());
+ EXPECT_TRUE(set.find(Foo(7)) != set.end());
+ EXPECT_TRUE(*set.find(Foo(7)) == Foo(7));
+ EXPECT_TRUE(set.find(Foo(8)) == set.end());
+ // erase non existing
+ set.erase(Foo(8));
+ EXPECT_TRUE(set.size() == 1);
+ EXPECT_TRUE(set.begin() != set.end());
+ EXPECT_TRUE(set.find(Foo(7)) != set.end());
+ EXPECT_TRUE(*set.find(Foo(7)) == Foo(7));
+ EXPECT_TRUE(set.find(Foo(8)) == set.end());
+ // erase existing
+ set.erase(Foo(7));
+ EXPECT_TRUE(set.size() == 0);
+ EXPECT_TRUE(set.begin() == set.end());
+ EXPECT_TRUE(set.find(Foo(7)) == set.end());
+ for (size_t i(0); i < testSize; i++) {
+ set.insert(Foo(i));
+ hash_set<Foo, Foo::hash>::iterator it = set.find(Foo(i));
+ ASSERT_TRUE(it != set.end());
+ for (size_t j=0; j < i; j++) {
+ it = set.find(Foo(j));
+ ASSERT_TRUE(it != set.end());
+ }
+ }
+ EXPECT_TRUE(set.size() == testSize);
+ hash_set<Foo, Foo::hash>::iterator it = set.find(Foo((testSize/2)-1));
+ ASSERT_TRUE(it != set.end());
+ EXPECT_EQUAL(*it, Foo((testSize/2)-1));
+ for (size_t i(0); i < testSize/2; i++) {
+ set.erase(Foo(i*2));
+ }
+ ASSERT_TRUE(it != set.end());
+ EXPECT_EQUAL(*it, Foo((testSize/2)-1));
+ EXPECT_TRUE(set.find(Foo(testSize/2)) == set.end());
+ EXPECT_TRUE(set.size() == testSize/2);
+ for (size_t i(0); i < testSize; i++) {
+ set.insert(Foo(i));
+ }
+ EXPECT_EQUAL(set.size(), testSize);
+ EXPECT_TRUE(*set.find(Foo(7)) == Foo(7));
+ EXPECT_TRUE(*set.find(Foo(0)) == Foo(0));
+ EXPECT_TRUE(*set.find(Foo(1)) == Foo(1));
+ EXPECT_TRUE(*set.find(Foo(testSize-1)) == Foo(testSize-1));
+ EXPECT_TRUE(set.find(Foo(testSize)) == set.end());
+
+ set.clear();
+
+ EXPECT_EQUAL(set.size(), 0u);
+ EXPECT_TRUE(set.find(Foo(7)) == set.end());
+}
+
+TEST("test hash set with simple type")
+{
+ hash_set<int> set(1000);
+ // Verfify start conditions.
+ EXPECT_TRUE(set.size() == 0);
+ EXPECT_TRUE(set.begin() == set.end());
+ EXPECT_TRUE(set.find(7) == set.end());
+ // Insert one element
+ set.insert(7);
+ EXPECT_TRUE(set.size() == 1);
+ EXPECT_TRUE(set.begin() != set.end());
+ EXPECT_TRUE(set.find(7) != set.end());
+ EXPECT_TRUE(*set.find(7) == 7);
+ EXPECT_TRUE(set.find(8) == set.end());
+ // erase non existing
+ set.erase(8);
+ EXPECT_TRUE(set.size() == 1);
+ EXPECT_TRUE(set.begin() != set.end());
+ EXPECT_TRUE(set.find(7) != set.end());
+ EXPECT_TRUE(*set.find(7) == 7);
+ EXPECT_TRUE(set.find(8) == set.end());
+ // erase existing
+ set.erase(7);
+ EXPECT_TRUE(set.size() == 0);
+ EXPECT_TRUE(set.begin() == set.end());
+ EXPECT_TRUE(set.find(7) == set.end());
+ for (size_t i(0); i < 10000; i++) {
+ set.insert(i);
+ }
+ EXPECT_TRUE(set.size() == 10000);
+ for (size_t i(0); i < 5000; i++) {
+ set.erase(i*2);
+ }
+ EXPECT_TRUE(*set.find(4999) == 4999);
+ EXPECT_TRUE(set.find(5000) == set.end());
+ EXPECT_TRUE(set.size() == 5000);
+ for (size_t i(0); i < 10000; i++) {
+ set.insert(i);
+ }
+ EXPECT_EQUAL(set.size(), 10000u);
+ EXPECT_TRUE(*set.find(7) == 7);
+ EXPECT_TRUE(*set.find(0) == 0);
+ EXPECT_TRUE(*set.find(1) == 1);
+ EXPECT_TRUE(*set.find(9999) == 9999);
+ EXPECT_TRUE(set.find(10000) == set.end());
+
+ set.clear();
+
+ EXPECT_EQUAL(set.size(), 0u);
+ EXPECT_TRUE(set.find(7) == set.end());
+}
+
+TEST("test hash map iterator stability")
+{
+ hash_map<int, int> h;
+ EXPECT_EQUAL(1ul, h.capacity());
+ for (size_t i(0); i < 100; i++) {
+ EXPECT_TRUE(h.find(i) == h.end());
+ h[i] = i;
+ EXPECT_TRUE(h.find(i) != h.end());
+ int * p1 = & h.find(i)->second;
+ int * p2 = & h[i];
+ EXPECT_EQUAL(p1, p2);
+ }
+ EXPECT_EQUAL(128ul, h.capacity());
+}
+
+
+class Clever {
+public:
+ Clever() : _counter(&_global) { (*_counter)++; }
+ Clever(volatile size_t * counter) :
+ _counter(counter)
+ {
+ (*_counter)++;
+ }
+ Clever(const Clever & rhs) :
+ _counter(rhs._counter)
+ {
+ (*_counter)++;
+ }
+ Clever & operator = (const Clever & rhs)
+ {
+ if (&rhs != this) {
+ Clever tmp(rhs);
+ swap(tmp);
+ }
+ return *this;
+ }
+ void swap(Clever & rhs)
+ {
+ std::swap(_counter, rhs._counter);
+ }
+ ~Clever() { (*_counter)--; }
+ static size_t getGlobal() { return _global; }
+private:
+ volatile size_t * _counter;
+ static size_t _global;
+};
+
+size_t Clever::_global = 0;
+
+TEST("test hash map resizing")
+{
+ volatile size_t counter(0);
+ {
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ Clever c(&counter);
+ EXPECT_EQUAL(1ul, counter);
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ {
+ hash_map<int, Clever> h;
+ h[0] = c;
+ for (size_t i(0); i < 10000; i++) {
+ h[i] = c;
+ EXPECT_EQUAL(2+i, counter);
+ }
+ EXPECT_EQUAL(10001ul, counter);
+ for (size_t i(0); i < 10000; i++) {
+ h[i] = c;
+ EXPECT_EQUAL(10001ul, counter);
+ }
+ EXPECT_EQUAL(10001ul, counter);
+ h.clear();
+ EXPECT_EQUAL(1ul, counter);
+ for (size_t i(0); i < 10000; i++) {
+ h[i] = c;
+ EXPECT_EQUAL(2+i, counter);
+ }
+ EXPECT_EQUAL(10001ul, counter);
+ }
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ EXPECT_EQUAL(1ul, counter);
+ }
+ EXPECT_EQUAL(0ul, Clever::getGlobal());
+ EXPECT_EQUAL(0ul, counter);
+}
+
+TEST("test hash map with simple key and value type")
+{
+ hash_map<int, int> set(1000);
+ // Verfify start conditions.
+ EXPECT_TRUE(set.size() == 0);
+ EXPECT_TRUE(set.begin() == set.end());
+ EXPECT_TRUE(set.find(7) == set.end());
+ // Insert one element
+ set.insert(make_pair(7, 70));
+ EXPECT_TRUE(set.size() == 1);
+ EXPECT_TRUE(set.begin() != set.end());
+ EXPECT_TRUE(set.find(7) != set.end());
+ EXPECT_TRUE(set.find(7)->first == 7);
+ EXPECT_TRUE(set.find(7)->second == 70);
+ EXPECT_TRUE(set.find(8) == set.end());
+ // erase non existing
+ set.erase(8);
+ EXPECT_TRUE(set.size() == 1);
+ EXPECT_TRUE(set.begin() != set.end());
+ EXPECT_TRUE(set.find(7) != set.end());
+ EXPECT_TRUE(set.find(7)->first == 7);
+ EXPECT_TRUE(set.find(7)->second == 70);
+ EXPECT_TRUE(set.find(8) == set.end());
+ // erase existing
+ set.erase(7);
+ EXPECT_TRUE(set.size() == 0);
+ EXPECT_TRUE(set.begin() == set.end());
+ EXPECT_TRUE(set.find(7) == set.end());
+ for (size_t i(0); i < 10000; i++) {
+ set.insert(make_pair(i,i*10));
+ }
+ EXPECT_TRUE(set.size() == 10000);
+ for (size_t i(0); i < 5000; i++) {
+ set.erase(i*2);
+ }
+ EXPECT_TRUE(set.find(4999)->first == 4999);
+ EXPECT_TRUE(set.find(4999)->second == 49990);
+ EXPECT_TRUE(set.find(5000) == set.end());
+ EXPECT_TRUE(set.size() == 5000);
+ for (size_t i(0); i < 10000; i++) {
+ set.insert(make_pair(i,i*10));
+ }
+ EXPECT_EQUAL(set.size(), 10000u);
+ EXPECT_TRUE(set.find(7)->first == 7);
+ EXPECT_TRUE(set.find(7)->second == 70);
+ EXPECT_TRUE(set.find(0)->first == 0);
+ EXPECT_TRUE(set.find(0)->second == 0);
+ EXPECT_TRUE(set.find(1)->first == 1);
+ EXPECT_TRUE(set.find(1)->second == 10);
+ EXPECT_TRUE(set.find(9999)->first == 9999);
+ EXPECT_TRUE(set.find(9999)->second == 99990);
+ EXPECT_TRUE(set.find(10000) == set.end());
+
+ hash_map<int, int> set2(7);
+ set.swap(set2);
+ EXPECT_EQUAL(set2.size(), 10000u);
+ EXPECT_TRUE(set2.find(7)->first == 7);
+ EXPECT_TRUE(set2.find(7)->second == 70);
+
+ EXPECT_EQUAL(set.size(), 0u);
+ EXPECT_TRUE(set.find(7) == set.end());
+ for (int i=0; i < 100; i++) {
+ set.insert(make_pair(i,i*10));
+ }
+ for (int i=0; i < 100; i++) {
+ EXPECT_TRUE(set.find(i)->second == i*10);
+ }
+
+ hash_map<int, int> set3;
+ set3.insert(set.begin(), set.end());
+ for (int i=0; i < 100; i++) {
+ EXPECT_EQUAL(i*10, set.find(i)->second);
+ }
+
+ {
+ hash_map<int, int> a, b;
+ EXPECT_TRUE(a == b);
+ a[1] = 2;
+ EXPECT_FALSE(a == b);
+ EXPECT_TRUE(a == a);
+ b[1] = 3;
+ EXPECT_FALSE(a == b);
+ a[2] = 7;
+ EXPECT_FALSE(a == b);
+ b[1] = 2;
+ EXPECT_FALSE(a == b);
+ b[2] = 7;
+ EXPECT_TRUE(a == b);
+ }
+}
+
+class S {
+public:
+ explicit S(uint64_t l=0) : _a(l&0xfffffffful), _b(l>>32) { }
+ uint32_t hash() const { return _a; }
+ uint32_t a() const { return _a; }
+ friend bool operator == (const S & a, const S & b) { return a._a == b._a && a._b == b._b; }
+private:
+ uint32_t _a, _b;
+};
+
+struct myhash {
+ size_t operator() (const S & arg) const { return arg.hash(); }
+};
+
+struct myextract {
+ uint32_t operator() (const S & arg) const { return arg.a(); }
+};
+
+TEST("test hash set find")
+{
+ hash_set<S, myhash> set(1000);
+ for (size_t i(0); i < 10000; i++) {
+ set.insert(S(i));
+ }
+ EXPECT_TRUE(*set.find(S(1)) == S(1));
+ hash_set<S, myhash>::iterator cit = set.find<uint32_t, myextract, vespalib::hash<uint32_t>, std::equal_to<uint32_t> >(7);
+ EXPECT_TRUE(*cit == S(7));
+}
+
+TEST("test hash set range constructor")
+{
+ // std::string satisfies iterable char range concept
+ std::string chars("abcd");
+ hash_set<char> set(chars.begin(), chars.end());
+ EXPECT_EQUAL(4u, set.size());
+ for (size_t i = 0; i < chars.size(); ++i) {
+ EXPECT_TRUE(set.find(chars[i]) != set.end());
+ }
+}
+
+namespace {
+
+template <typename T0, typename T1>
+struct equal_types {
+ static const bool value = false;
+};
+
+template <typename T0>
+struct equal_types<T0, T0> {
+ static const bool value = true;
+};
+
+}
+
+TEST("test hash set iterators stl compatible")
+{
+ typedef vespalib::hash_set<int> set_type;
+ typedef set_type::iterator iter_type;
+ typedef std::iterator_traits<iter_type> iter_traits;
+
+ set_type set;
+ set.insert(123);
+ set.insert(456);
+ set.insert(789);
+
+ std::vector<int> vec(set.begin(), set.end());
+ std::sort(vec.begin(), vec.end());
+ ASSERT_EQUAL(size_t(3), vec.size());
+ EXPECT_EQUAL(123, vec[0]);
+ EXPECT_EQUAL(456, vec[1]);
+ EXPECT_EQUAL(789, vec[2]);
+
+ // Meta-testing
+ ASSERT_TRUE((equal_types<int, int>::value));
+ ASSERT_FALSE((equal_types<int, char>::value));
+
+ // These could be compile-time assertions...
+ EXPECT_TRUE((equal_types<iter_traits::difference_type, ptrdiff_t>::value));
+ EXPECT_TRUE((equal_types<iter_traits::value_type, int>::value));
+ EXPECT_TRUE((equal_types<iter_traits::reference, int&>::value));
+ EXPECT_TRUE((equal_types<iter_traits::pointer, int*>::value));
+ EXPECT_TRUE((equal_types<iter_traits::iterator_category,
+ std::forward_iterator_tag>::value));
+
+ typedef set_type::const_iterator const_iter_type;
+ typedef std::iterator_traits<const_iter_type> const_iter_traits;
+ EXPECT_TRUE((equal_types<const_iter_traits::difference_type, ptrdiff_t>::value));
+ EXPECT_TRUE((equal_types<const_iter_traits::value_type, const int>::value));
+ EXPECT_TRUE((equal_types<const_iter_traits::reference, const int&>::value));
+ EXPECT_TRUE((equal_types<const_iter_traits::pointer, const int*>::value));
+ EXPECT_TRUE((equal_types<const_iter_traits::iterator_category,
+ std::forward_iterator_tag>::value));
+}
+
+using IntHashSet = hash_set<int>;
+
+TEST("test hash set initializer list - empty")
+{
+ IntHashSet s = {};
+ EXPECT_EQUAL(0u, s.size());
+}
+
+TEST("test hash set initializer list - 1 element")
+{
+ IntHashSet s = {1};
+ EXPECT_EQUAL(1u, s.size());
+ EXPECT_TRUE(s.find(1) != s.end());
+}
+
+TEST("test hash set initializer list - many elements")
+{
+ IntHashSet s = {1,2,3};
+ EXPECT_EQUAL(3u, s.size());
+ EXPECT_TRUE(s.find(1) != s.end());
+ EXPECT_TRUE(s.find(2) != s.end());
+ EXPECT_TRUE(s.find(3) != s.end());
+}
+
+bool
+checkEquals(const IntHashSet &lhs, const IntHashSet &rhs)
+{
+ return lhs == rhs;
+}
+
+TEST("test hash set operator==")
+{
+ EXPECT_TRUE(checkEquals({}, {}));
+ EXPECT_TRUE(checkEquals({1}, {1}));
+ EXPECT_TRUE(checkEquals({1,2,3}, {1,2,3}));
+ EXPECT_TRUE(checkEquals({1,2,3}, {3,2,1}));
+ EXPECT_FALSE(checkEquals({1}, {}));
+ EXPECT_FALSE(checkEquals({}, {1}));
+ EXPECT_FALSE(checkEquals({1,2}, {1}));
+ EXPECT_FALSE(checkEquals({1}, {1,2}));
+ EXPECT_FALSE(checkEquals({1,2,3}, {2,3,4}));
+ EXPECT_FALSE(checkEquals({2,3,4}, {1,2,3}));
+}
+
+TEST("test hash table capacity and size") {
+ hash_set<int> empty;
+ EXPECT_EQUAL(0u, empty.size());
+ EXPECT_EQUAL(1u, empty.capacity());
+
+ hash_set<int> one(1);
+ EXPECT_EQUAL(0u, one.size());
+ EXPECT_EQUAL(8u, one.capacity());
+
+ hash_set<int> three(3);
+ EXPECT_EQUAL(0u, three.size());
+ EXPECT_EQUAL(8u, three.capacity());
+
+ hash_set<int> many(1894);
+ EXPECT_EQUAL(0u, many.size());
+ EXPECT_EQUAL(2048u, many.capacity());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/stllike/hashtable_test.cpp b/vespalib/src/tests/stllike/hashtable_test.cpp
new file mode 100644
index 00000000000..7516ca1ab34
--- /dev/null
+++ b/vespalib/src/tests/stllike/hashtable_test.cpp
@@ -0,0 +1,96 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Unit tests for hashtable.
+
+#include <vespa/log/log.h>
+LOG_SETUP("hashtable_test");
+#include <vespa/fastos/fastos.h>
+
+#include <vespa/vespalib/stllike/hashtable.h>
+#include <vespa/vespalib/testkit/testapp.h>
+#include <memory>
+#include <vector>
+
+using vespalib::hashtable;
+using std::vector;
+
+using namespace vespalib;
+
+namespace {
+
+template<typename T>
+struct Dereference : std::unary_function<T, std::unique_ptr<T>> {
+ T &operator()(std::unique_ptr<T>& p) const { return *p; }
+ const T& operator()(const std::unique_ptr<T>& p) const { return *p; }
+};
+
+template<typename K> using up_hashtable =
+ hashtable<K, std::unique_ptr<K>,
+ vespalib::hash<K>, std::equal_to<K>, Dereference<K>>;
+
+TEST("require that hashtable can store unique_ptrs") {
+ up_hashtable<int> table(100);
+ typedef std::unique_ptr<int> UP;
+ table.insert(UP(new int(42)));
+ auto it = table.find(42);
+ EXPECT_EQUAL(42, **it);
+
+ UP u = std::move(*it); // This changes the key. Don't do this.
+ EXPECT_EQUAL(42, *u);
+
+ // it = table.find(42); // This will crash, since the key is removed.
+}
+
+template<typename To, typename Entry>
+struct First : std::unary_function<To, Entry> {
+ To &operator()(Entry& p) const { return p.first; }
+ const To& operator()(const Entry& p) const { return p.first; }
+};
+
+template <typename K, typename V> using Entry =
+ std::pair<K, std::unique_ptr<V>>;
+typedef hashtable<int, Entry<int, int>,
+ vespalib::hash<int>, std::equal_to<int>,
+ First<int, Entry<int, int>>> PairHashtable;
+
+TEST("require that hashtable can store pairs of <key, unique_ptr to value>") {
+ PairHashtable table(100);
+ table.insert(make_pair(42, std::unique_ptr<int>(new int(84))));
+ PairHashtable::iterator it = table.find(42);
+ EXPECT_EQUAL(84, *it->second);
+ auto it2 = table.find(42);
+ EXPECT_EQUAL(84, *it2->second); // find is not destructive.
+
+ std::unique_ptr<int> up = std::move(it->second);
+ it2 = table.find(42);
+ EXPECT_FALSE(it2->second.get()); // value has been moved out.
+}
+
+template<typename K> using set_hashtable =
+ hashtable<K, K, vespalib::hash<K>, std::equal_to<K>, std::_Identity<K>>;
+
+TEST("require that hashtable<int> can be copied") {
+ set_hashtable<int> table(100);
+ table.insert(42);
+ set_hashtable<int> table2(table);
+ EXPECT_EQUAL(42, *table2.find(42));
+}
+
+template<typename To, typename Vector>
+struct FirstInVector : std::unary_function<To, Vector> {
+ To &operator()(Vector& v) const { return v[0]; }
+ const To& operator()(const Vector& v) const { return v[0]; }
+};
+
+TEST("require that hashtable<vector<int>> can be copied") {
+ typedef hashtable<int, vector<int>, vespalib::hash<int>,
+ std::equal_to<int>, FirstInVector<int, vector<int>>> VectorHashtable;
+ VectorHashtable table(100);
+ table.insert(std::vector<int>{2, 4, 6});
+ VectorHashtable table2(table);
+ EXPECT_EQUAL(6, (*table2.find(2))[2]);
+ EXPECT_EQUAL(6, (*table.find(2))[2]);
+}
+
+} // namespace
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/stllike/lookup_benchmark.cpp b/vespalib/src/tests/stllike/lookup_benchmark.cpp
new file mode 100644
index 00000000000..0a82bfa292b
--- /dev/null
+++ b/vespalib/src/tests/stllike/lookup_benchmark.cpp
@@ -0,0 +1,103 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <map>
+#include <set>
+#include <tr1/unordered_set>
+#include <vector>
+#include <algorithm>
+#include <vespa/vespalib/stllike/hash_set.h>
+
+template <typename S>
+void fill(S & s, size_t count)
+{
+ for(size_t i(0); i < count; i++) {
+ s.insert(i);
+ }
+}
+
+template <typename S>
+size_t lookup_bench(S & s, size_t count, size_t rep)
+{
+ size_t sum(0);
+ typename S::const_iterator e(s.end());
+ for (size_t j(0); j < rep; j++) {
+ for (size_t i(0); i < count; i++) {
+ if (e != s.find(i)) {
+ sum++;
+ }
+ }
+ }
+ return sum;
+}
+
+template <typename S>
+size_t bench(S & set, size_t sz, size_t numLookups)
+{
+ fill(set, sz);
+ return lookup_bench(set, sz, numLookups/sz);
+}
+
+size_t benchMap(size_t sz, size_t numLookups)
+{
+ std::set<uint32_t> set;
+ return bench(set, sz, numLookups);
+}
+
+size_t benchHashStl(size_t sz, size_t numLookups)
+{
+ std::tr1::unordered_set<uint32_t> set;
+ return bench(set, sz, numLookups);
+}
+
+size_t benchHashVespaLib(size_t sz, size_t numLookups)
+{
+ vespalib::hash_set<uint32_t> set;
+ return bench(set, sz, numLookups);
+}
+
+size_t benchHashVespaLib2(size_t sz, size_t numLookups)
+{
+ vespalib::hash_set<uint32_t, vespalib::hash<uint32_t>, std::equal_to<uint32_t>, vespalib::hashtable_base::and_modulator > set;
+ return bench(set, sz, numLookups);
+}
+
+int main(int argc, char *argv[])
+{
+ size_t count(1000);
+ size_t rep(10000000);
+ char type('m');
+ if (argc >= 2) {
+ type = argv[1][0];
+ }
+ if (argc >= 3) {
+ count = strtoul(argv[2], NULL, 0);
+ }
+ if (argc >= 4) {
+ rep = strtoul(argv[3], NULL, 0);
+ }
+ std::vector<const char *> description(256);
+ description['m'] = "std::set";
+ description['h'] = "std::hash_set";
+ description['g'] = "vespalib::hash_set";
+ description['G'] = "vespalib::hash_set with simple and modulator.";
+ size_t found(0);
+ switch (type) {
+ case 'm': found = benchMap(count, rep); break;
+ case 'h': found = benchHashStl(count, rep); break;
+ case 'g': found = benchHashVespaLib(count, rep); break;
+ case 'G': found = benchHashVespaLib2(count, rep); break;
+ default:
+ printf("'m' = %s\n", description[type]);
+ printf("'h' = %s\n", description[type]);
+ printf("'g' = %s\n", description[type]);
+ printf("'G' = %s\n", description[type]);
+ printf("Unspecified type %c. Running map lookup benchmark\n", type);
+ exit(1);
+ break;
+ }
+ printf("Running test '%c' = %s, result = %ld found values\n", type, description[type], found);
+}
+
diff --git a/vespalib/src/tests/stllike/string_test.cpp b/vespalib/src/tests/stllike/string_test.cpp
new file mode 100644
index 00000000000..730073b0379
--- /dev/null
+++ b/vespalib/src/tests/stllike/string_test.cpp
@@ -0,0 +1,427 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/stllike/string.h>
+
+using namespace vespalib;
+
+TEST("testStringInsert") {
+ string s("first string ");
+ string a;
+ EXPECT_TRUE("first string " == a.insert(0, s));
+ EXPECT_EQUAL(string("first first string string "), a.insert(6, s));
+ EXPECT_EQUAL(2*s.size(), a.size());
+ EXPECT_TRUE(string("first first string string ") == s.insert(6, s));
+}
+
+TEST("testStringIterator") {
+ string s("abcabccba");
+ std::replace(s.begin(), s.end(), 'a','z');
+ EXPECT_TRUE(s == "zbczbccbz");
+}
+
+TEST("test iterator assignment") {
+ std::vector<char> empty;
+ string s(empty.begin(), empty.end());
+ EXPECT_TRUE(strstr(s.c_str(), "mumbo jumbo.") == nullptr);
+}
+
+TEST("test self assignment of small string") {
+ const char * text = "abc";
+ string s(text);
+ const char * addr(reinterpret_cast<const char *>(&s));
+ EXPECT_TRUE((addr < s.c_str()) && (s.c_str() < addr + sizeof(s)));
+ s = s;
+ EXPECT_EQUAL(text, s);
+}
+
+TEST("test self assignment of big string") {
+ const char * text = "abcbcdefghijklmnopqrstuvwxyz-abcbcdefghijklmnopqrstuvwxyz";
+ string s(text);
+ const char * addr(reinterpret_cast<const char *>(&s));
+ EXPECT_TRUE((addr > s.c_str()) || (s.c_str() > addr + sizeof(s)));
+ s = s;
+ EXPECT_EQUAL(text, s);
+}
+
+TEST("testStringAlloc") {
+ fprintf(stderr, "... testing allocations\n");
+ string a("abcde");
+
+ for (int i=0; i<99999; i++) {
+ a.append("12345");
+ }
+ EXPECT_TRUE(a.size() == 5u*100000);
+ EXPECT_TRUE(a.capacity() > a.size());
+ EXPECT_TRUE(a.capacity() < 2*a.size());
+
+ string foo;
+ EXPECT_EQUAL(64ul, sizeof(foo));
+
+ small_string<112> bar;
+ EXPECT_EQUAL(128ul, sizeof(bar));
+
+ string reset;
+ for (int i=0; i<100; i++) {
+ reset.append("12345");
+ }
+ EXPECT_EQUAL(500u, reset.size());
+ EXPECT_EQUAL(511u, reset.capacity());
+ reset.reserve(2000);
+ EXPECT_EQUAL(500u, reset.size());
+ EXPECT_EQUAL(2000u, reset.capacity());
+ reset.reset();
+ EXPECT_EQUAL(0u, reset.size());
+ EXPECT_EQUAL(47u, reset.capacity());
+
+ TEST_FLUSH();
+}
+
+TEST("testStringCompare") {
+ fprintf(stderr, "... testing comparison\n");
+ string abc("abc");
+ string abb("abb");
+ string abd("abd");
+
+ string a5("abcde");
+
+ std::string other("abc");
+
+ EXPECT_TRUE(abc == "abc");
+ EXPECT_TRUE(abc == other);
+ EXPECT_TRUE(!(abc == "aaa"));
+ EXPECT_TRUE(!(abc == "a"));
+ EXPECT_TRUE(!(abc == "abcde"));
+ EXPECT_TRUE(!(abc == abb));
+ EXPECT_TRUE(!(abc == a5));
+
+ EXPECT_TRUE(abc != abd);
+ EXPECT_TRUE(abc != "aaa");
+ EXPECT_TRUE(abc != "a");
+ EXPECT_TRUE(abc != a5);
+ EXPECT_TRUE(!(abc != abc));
+ EXPECT_TRUE(!(abc != other));
+
+ EXPECT_TRUE(abc < abd);
+ EXPECT_TRUE(abb < abc);
+ EXPECT_TRUE(abc < a5);
+ EXPECT_TRUE(abc.compare(abd) < 0);
+ EXPECT_TRUE(abd.compare(abc) > 0);
+ EXPECT_TRUE(abc.compare(abc) == 0);
+
+ TEST_FLUSH();
+}
+
+TEST("testString") {
+ fprintf(stderr, "... testing basic functionality\n");
+ string a;
+ EXPECT_EQUAL(sizeof(a), 48 + sizeof(uint32_t)*2 + sizeof(char *));
+ EXPECT_EQUAL(0u, a.size());
+ a.append("a");
+ EXPECT_EQUAL(1u, a.size());
+ EXPECT_TRUE(strcmp("a", a.c_str()) == 0);
+ a.append("b");
+ EXPECT_EQUAL(2u, a.size());
+ EXPECT_TRUE(strcmp("ab", a.c_str()) == 0);
+ string b(a);
+ EXPECT_EQUAL(2u, a.size());
+ EXPECT_TRUE(strcmp("ab", a.c_str()) == 0);
+ EXPECT_EQUAL(2u, b.size());
+ EXPECT_TRUE(strcmp("ab", b.c_str()) == 0);
+ string c("dfajsg");
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+ b = c;
+ EXPECT_EQUAL(6u, b.size());
+ EXPECT_TRUE(strcmp("dfajsg", b.c_str()) == 0);
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+ TEST_FLUSH();
+
+ std::string::size_type exp = std::string::npos;
+ std::string::size_type act = vespalib::string::npos;
+ EXPECT_EQUAL(exp, act);
+ std::string::size_type idx = a.find('a');
+ EXPECT_EQUAL(0u, idx);
+ idx = a.find('b');
+ EXPECT_EQUAL(1u, idx);
+ idx = a.find('x');
+ EXPECT_EQUAL(std::string::npos, idx);
+ EXPECT_EQUAL(1u, a.find('b', 1));
+ EXPECT_EQUAL(std::string::npos, a.find('b', 2));
+ // causes warning:
+ EXPECT_TRUE(vespalib::string::npos == idx);
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+ TEST_FLUSH();
+
+ string slow;
+ for (int i = 0; i < 9; i++) {
+ EXPECT_EQUAL(i*5u, slow.size());
+ slow.append("abcde");
+ EXPECT_EQUAL(sizeof(slow) - 17u, slow.capacity());
+ }
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+ EXPECT_EQUAL(45u, slow.size());
+ EXPECT_EQUAL(47u, slow.capacity());
+ slow.append("1");
+ EXPECT_EQUAL(46u, slow.size());
+ slow.append("1");
+ EXPECT_EQUAL(47u, slow.size());
+ EXPECT_EQUAL(47u, slow.capacity());
+ slow.append("1");
+ EXPECT_EQUAL(48u, slow.size());
+ EXPECT_EQUAL(63u, slow.capacity());
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+
+ string fast;
+ fast.append(slow);
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+ EXPECT_EQUAL(48u, fast.size());
+ EXPECT_EQUAL(63u, fast.capacity());
+ fast.append(slow);
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+ EXPECT_EQUAL(48u*2, fast.size());
+ EXPECT_EQUAL(127u, fast.capacity());
+ fast.append(slow);
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+ EXPECT_EQUAL(48u*3, fast.size());
+ EXPECT_EQUAL(255u, fast.capacity());
+ fast.append(slow);
+ EXPECT_EQUAL(48u*4, fast.size());
+ EXPECT_EQUAL(255u, fast.capacity());
+
+ EXPECT_EQUAL(6u, c.size());
+ EXPECT_TRUE(strcmp("dfajsg", c.c_str()) == 0);
+
+ std::istringstream is("test streng");
+ string test, streng;
+ is >> test >> streng;
+ EXPECT_EQUAL(test, "test");
+ EXPECT_EQUAL(streng, "streng");
+ std::ostringstream os;
+ os << test << streng;
+ EXPECT_EQUAL(os.str(), "teststreng");
+
+ {
+ string s("abcabca");
+ EXPECT_EQUAL(string::npos, s.find('g'));
+ EXPECT_EQUAL(string::npos, s.rfind('g'));
+ EXPECT_EQUAL(0u, s.find('a'));
+ EXPECT_EQUAL(6u, s.rfind('a'));
+ EXPECT_EQUAL(1u, s.find('b'));
+ EXPECT_EQUAL(4u, s.rfind('b'));
+ EXPECT_EQUAL(2u, s.find("ca"));
+ EXPECT_EQUAL(5u, s.rfind("ca"));
+ EXPECT_EQUAL(0u, s.find("ab"));
+ EXPECT_EQUAL(3u, s.rfind("ab"));
+ }
+ {
+ stringref s("abcabca");
+ EXPECT_EQUAL(string::npos, s.find('g'));
+ EXPECT_EQUAL(string::npos, s.rfind('g'));
+ EXPECT_EQUAL(0u, s.find('a'));
+ EXPECT_EQUAL(6u, s.rfind('a'));
+ EXPECT_EQUAL(1u, s.find('b'));
+ EXPECT_EQUAL(4u, s.rfind('b'));
+ EXPECT_EQUAL(2u, s.find("ca"));
+ EXPECT_EQUAL(5u, s.rfind("ca"));
+ EXPECT_EQUAL(0u, s.find("ab"));
+ EXPECT_EQUAL(3u, s.rfind("ab"));
+ }
+
+ EXPECT_EQUAL("a" + stringref("b"), string("ab"));
+ EXPECT_EQUAL("a" + string("b"), string("ab"));
+ EXPECT_EQUAL(string("a") + string("b"), string("ab"));
+ EXPECT_EQUAL(string("a") + stringref("b"), string("ab"));
+ EXPECT_EQUAL(string("a") + "b", string("ab"));
+ EXPECT_EQUAL(stringref("a") + stringref("b"), string("ab"));
+
+ // Test std::string conversion of empty string
+ stringref sref;
+ std::string stdString(sref);
+ EXPECT_TRUE(strcmp("", sref.c_str()) == 0);
+ stdString = "abc";
+ stringref sref2(stdString);
+ EXPECT_TRUE(stdString.c_str() == sref2.c_str());
+ EXPECT_TRUE(stdString == sref2);
+ EXPECT_TRUE(sref2 == stdString);
+ {
+ string s;
+ s = std::string("cba");
+ EXPECT_TRUE("cba" == s);
+ s = sref2;
+ EXPECT_TRUE("abc" == s);
+ string s2;
+ s2.swap(s);
+ EXPECT_TRUE(s.empty());
+ EXPECT_TRUE("abc" == s2);
+ }
+ {
+ EXPECT_EQUAL(string("abc"), string("abcd", 3));
+ EXPECT_EQUAL(string("abc"), string(stringref("abc")));
+ }
+ {
+ string s("abc");
+ EXPECT_EQUAL(string("a"), s.substr(0,1));
+ EXPECT_EQUAL(string("b"), s.substr(1,1));
+ EXPECT_EQUAL(string("c"), s.substr(2,1));
+ EXPECT_EQUAL(string("abc"), s.substr(0));
+ EXPECT_EQUAL(string("bc"), s.substr(1));
+ EXPECT_EQUAL(string("c"), s.substr(2));
+ }
+ {
+ stringref s("abc");
+ EXPECT_EQUAL(string("a"), s.substr(0,1));
+ EXPECT_EQUAL(string("b"), s.substr(1,1));
+ EXPECT_EQUAL(string("c"), s.substr(2,1));
+ EXPECT_EQUAL(string("abc"), s.substr(0));
+ EXPECT_EQUAL(string("bc"), s.substr(1));
+ EXPECT_EQUAL(string("c"), s.substr(2));
+ }
+
+ {
+ string s(" A very long string that is longer than what fits on the stack so that it will be initialized directly on the heap");
+ EXPECT_TRUE( ! s.empty());
+ EXPECT_TRUE(s.length() > sizeof(s));
+ }
+
+ TEST_FLUSH();
+}
+
+TEST("require that vespalib::string can append characters (non-standard)") {
+ char c = 'x';
+ vespalib::string str;
+ str.append(c);
+ str.append(c);
+ str.append(c);
+ EXPECT_EQUAL(str, "xxx");
+}
+
+TEST("require that vespalib::append_from_reserved gives uninitialized data (non-standard)") {
+ vespalib::string str;
+ str.reserve(8);
+ char *s = &str[0];
+ s[0] = 'x';
+ s[1] = 'x';
+ s[2] = 'x';
+ str.append_from_reserved(3);
+ EXPECT_EQUAL(3u, str.size());
+ EXPECT_EQUAL(str, "xxx");
+ s[3] = 'y';
+ s[4] = 'y';
+ s[5] = 'y';
+ str.append_from_reserved(3);
+ EXPECT_EQUAL(6u, str.size());
+ EXPECT_EQUAL(str, "xxxyyy");
+}
+
+TEST("require that vespalib::resize works") {
+ vespalib::string s("abcdefghijk");
+ EXPECT_EQUAL(11u, s.size());
+ s.resize(5);
+ EXPECT_EQUAL(5u, s.size());
+ EXPECT_EQUAL("abcde", s);
+ s.resize(7, 'X');
+ EXPECT_EQUAL(7u, s.size());
+ EXPECT_EQUAL("abcdeXX", s);
+ EXPECT_EQUAL(47u, s.capacity());
+ s.resize(50, 'Y');
+ EXPECT_EQUAL(50u, s.size());
+ EXPECT_EQUAL("abcdeXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", s);
+}
+
+TEST("require that you can format a number into a vespalib::string easily") {
+ vespalib::string str = vespalib::stringify(0);
+ EXPECT_EQUAL(str, "0");
+ EXPECT_EQUAL(vespalib::stringify(1), "1");
+ EXPECT_EQUAL(vespalib::stringify(123), "123");
+ EXPECT_EQUAL(vespalib::stringify(123456789), "123456789");
+ EXPECT_EQUAL(vespalib::stringify(987654321uLL), "987654321");
+ EXPECT_EQUAL(vespalib::stringify(18446744073709551615uLL), "18446744073709551615");
+}
+
+TEST("require that contains works") {
+ vespalib::string s("require that contains works");
+ EXPECT_TRUE(contains(s, "require"));
+ EXPECT_TRUE(contains(s, "require that contains work"));
+ EXPECT_TRUE(contains(s, "require that contains works"));
+ EXPECT_TRUE(contains(s, "equire"));
+ EXPECT_TRUE(contains(s, "ks"));
+ EXPECT_FALSE(contains(s, "not in there"));
+}
+
+TEST("require that starts_with works") {
+ vespalib::string s("require that starts_with works");
+ EXPECT_TRUE(starts_with(s, "require"));
+ EXPECT_TRUE(starts_with(s, "require that starts_with work"));
+ EXPECT_TRUE(starts_with(s, "require that starts_with works"));
+ EXPECT_FALSE(starts_with(s, "equire"));
+ EXPECT_FALSE(starts_with(s, "not in there"));
+}
+
+TEST("require that ends_with works") {
+ vespalib::string s("require that ends_with works");
+ EXPECT_FALSE(ends_with(s, "require"));
+ EXPECT_TRUE(ends_with(s, "works"));
+ EXPECT_TRUE(ends_with(s, "equire that ends_with works"));
+ EXPECT_TRUE(ends_with(s, "require that ends_with works"));
+ EXPECT_FALSE(ends_with(s, "work"));
+ EXPECT_FALSE(ends_with(s, "not in there"));
+}
+
+TEST("test that small_string::pop_back works") {
+ vespalib::string s("string");
+ EXPECT_EQUAL(s.size(), 6u);
+ s.pop_back();
+ EXPECT_EQUAL(s.size(), 5u);
+ EXPECT_EQUAL(s, string("strin"));
+ EXPECT_NOT_EQUAL(s, string("string"));
+ s.pop_back();
+ EXPECT_EQUAL(s, string("stri"));
+}
+
+
+TEST("test that operator<() works with stringref versus string") {
+ vespalib::stringref sra("a");
+ vespalib::string sa("a");
+ vespalib::stringref srb("b");
+ vespalib::string sb("b");
+ EXPECT_FALSE(sra < sra);
+ EXPECT_FALSE(sra < sa);
+ EXPECT_TRUE(sra < srb);
+ EXPECT_TRUE(sra < sb);
+ EXPECT_FALSE(sa < sra);
+ EXPECT_FALSE(sa < sa);
+ EXPECT_TRUE(sa < srb);
+ EXPECT_TRUE(sa < sb);
+ EXPECT_FALSE(srb < sra);
+ EXPECT_FALSE(srb < sa);
+ EXPECT_FALSE(srb < srb);
+ EXPECT_FALSE(srb < sb);
+ EXPECT_FALSE(sb < sra);
+ EXPECT_FALSE(sb < sa);
+ EXPECT_FALSE(sb < srb);
+ EXPECT_FALSE(sb < sb);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/stllike/test.txt b/vespalib/src/tests/stllike/test.txt
new file mode 100644
index 00000000000..c0d0fb45c38
--- /dev/null
+++ b/vespalib/src/tests/stllike/test.txt
@@ -0,0 +1,2 @@
+line1
+line2
diff --git a/vespalib/src/tests/stllike/uniq_by_sort_map_hash.cpp b/vespalib/src/tests/stllike/uniq_by_sort_map_hash.cpp
new file mode 100644
index 00000000000..04c3faf362a
--- /dev/null
+++ b/vespalib/src/tests/stllike/uniq_by_sort_map_hash.cpp
@@ -0,0 +1,337 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <map>
+#include <set>
+#include <tr1/unordered_set>
+#include <vector>
+#include <algorithm>
+#include <vespa/vespalib/stllike/hash_set.h>
+
+template <typename T>
+class RoundRobinAllocator
+{
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef T * pointer;
+ typedef const T * const_pointer;
+ typedef T & reference;
+ typedef const T & const_reference;
+ typedef T value_type;
+
+ template<typename _Tp1>
+ struct rebind {
+ typedef RoundRobinAllocator<_Tp1> other;
+ };
+ RoundRobinAllocator() { }
+ template<typename _Tp1>
+ RoundRobinAllocator(const RoundRobinAllocator<_Tp1>&) throw() { }
+
+ void construct(pointer p, const T& val) { new(static_cast<void*>(p)) T(val); }
+ void destroy(pointer p) {
+ p->~T();
+ }
+ pointer allocate(size_type n, const_pointer hint = 0) {
+ (void) hint;
+ if ((_w + n) < _sz) {
+ pointer p(_memory + _w);
+ _w += n;
+ return p;
+ }
+ throw std::bad_alloc();
+ }
+
+ void deallocate(pointer p, size_type n) {
+ if ((p - _memory) == long(_r)) {
+ _r += n;
+ }
+ }
+ size_type max_size() const throw() { return _sz; }
+
+private:
+ static size_t _r;
+ static size_t _w;
+ static size_t _sz;
+ static T * _memory;
+};
+
+template <typename T>
+size_t RoundRobinAllocator<T>::_r = 0;
+template <typename T>
+size_t RoundRobinAllocator<T>::_w = 0;
+template <typename T>
+size_t RoundRobinAllocator<T>::_sz = 10000000;
+template <typename T>
+T * RoundRobinAllocator<T>::_memory = static_cast<T *> (malloc(10000000*sizeof(T)));
+
+class Gid
+{
+public:
+ struct hash {
+ size_t operator () (const Gid & g) const { return g.getGid()[0]; }
+ };
+ Gid(unsigned int v=0) : _gid() { _gid[0] = _gid[1] = _gid[2] = v; }
+ const unsigned int * getGid() const { return _gid; }
+ int cmp(const Gid & b) const { return memcmp(_gid, b._gid, sizeof(_gid)); }
+ bool operator < (const Gid & b) const { return cmp(b) < 0; }
+ bool operator == (const Gid & b) const { return cmp(b) == 0; }
+private:
+ unsigned int _gid[3];
+};
+
+class Slot
+{
+public:
+ Slot(unsigned int v=0) : _gid(v) { }
+ const Gid & getGid() const { return _gid; }
+ int cmp(const Slot & b) const { return _gid.cmp(b.getGid()); }
+private:
+ Gid _gid;
+};
+
+struct IndirectCmp : public std::binary_function<Slot*, Slot*, bool> {
+ bool operator()(const Slot* s1, const Slot* s2) {
+ return s1->cmp(*s2) < 0;
+ }
+};
+
+size_t benchMap(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ typedef std::set<Gid> M;
+ M set;
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ if (set.find(s.getGid()) == set.end()) {
+ set.insert(s.getGid());
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchMapIntelligent(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ typedef std::set<Gid> M;
+ M set;
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ std::pair<M::iterator, bool> r = set.insert(s.getGid());
+ if (r.second) {
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchHashStl(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ typedef std::tr1::unordered_set< Gid, Gid::hash > M;
+ M set(v.size());
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ if (set.find(s.getGid()) == set.end()) {
+ set.insert(s.getGid());
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchHashStlIntelligent(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ typedef std::tr1::unordered_set< Gid, Gid::hash > M;
+ M set(v.size());
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ std::pair<M::iterator, bool> r = set.insert(s.getGid());
+ if (r.second) {
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchHashStlFastAlloc(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ std::tr1::unordered_set< Gid, Gid::hash, std::equal_to<Gid>, RoundRobinAllocator<Gid> > set(v.size());
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ if (set.find(s.getGid()) == set.end()) {
+ set.insert(s.getGid());
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchHashVespaLib(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ typedef vespalib::hash_set< Gid, Gid::hash > M;
+ M set(v.size()*2);
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ if (set.find(s.getGid()) == set.end()) {
+ set.insert(s.getGid());
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchHashVespaLibIntelligent(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ typedef vespalib::hash_set< Gid, Gid::hash > M;
+ M set(v.size()*2);
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ std::pair<M::iterator, bool> r = set.insert(s.getGid());
+ if (r.second) {
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchHashVespaLibIntelligentAndFast(const std::vector<Slot *> & v)
+{
+ size_t uniq(0);
+ typedef vespalib::hash_set< Gid, Gid::hash, std::equal_to<Gid>, vespalib::hashtable_base::and_modulator > M;
+ M set(v.size()*2);
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ std::pair<M::iterator, bool> r = set.insert(s.getGid());
+ if (r.second) {
+ uniq++;
+ }
+ }
+ return uniq;
+}
+
+size_t benchSort(const std::vector<Slot *> & vOrg)
+{
+ IndirectCmp iCmp;
+ std::vector<Slot *> v(vOrg);
+ std::sort(v.begin(), v.end(), iCmp);
+ Gid prev(0);
+ size_t count(0);
+ for(size_t i(0), m(v.size()); i < m; i++) {
+ const Slot & s = *v[i];
+ if (s.getGid().cmp(prev) != 0) {
+ v[count++] = v[i];
+ prev = s.getGid();
+ }
+ }
+ v.resize(count);
+ return count;
+}
+
+static char _type;
+
+int runBenchMark(const std::vector<Slot *> * indirectSlotVector)
+{
+ int uniq(0);
+ switch (_type) {
+ case 'm': uniq = benchMap(*indirectSlotVector); break;
+ case 'M': uniq = benchMapIntelligent(*indirectSlotVector); break;
+ case 'v': uniq = benchSort(*indirectSlotVector); break;
+ case 'h': uniq = benchHashStl(*indirectSlotVector); break;
+ case 'H': uniq = benchHashStlIntelligent(*indirectSlotVector); break;
+ case 'a': uniq = benchHashStlFastAlloc(*indirectSlotVector); break;
+ case 'g': uniq = benchHashVespaLib(*indirectSlotVector); break;
+ case 'G': uniq = benchHashVespaLibIntelligent(*indirectSlotVector); break;
+ case 'J': uniq = benchHashVespaLibIntelligentAndFast(*indirectSlotVector); break;
+ default: break;
+ }
+ return uniq;
+}
+
+int main(int argc, char *argv[])
+{
+ typedef void* (*VFUNC)(void*);
+ size_t count(10000000);
+ size_t rep(10);
+ size_t numThreads(0);
+ char type('m');
+ if (argc >= 2) {
+ type = argv[1][0];
+ }
+ if (argc >= 3) {
+ count = strtoul(argv[2], NULL, 0);
+ }
+ if (argc >= 4) {
+ rep = strtoul(argv[3], NULL, 0);
+ }
+ if (argc >= 5) {
+ numThreads = strtoul(argv[4], NULL, 0);
+ }
+ std::vector<Slot> slotVector(count);
+ for (size_t i(0), m(slotVector.size()); i < m; i++) {
+ slotVector[i] = Slot(rand());
+ }
+ std::vector<Slot *> indirectSlotVector(slotVector.size());
+ for (size_t i(0), m(slotVector.size()); i < m; i++) {
+ indirectSlotVector[i] = &slotVector[i];
+ }
+ std::vector<const char *> description(256);
+ description['m'] = "std::set";
+ description['M'] = "std::set with intelligent insert";
+ description['v'] = "std::sort";
+ description['h'] = "std::hash_set";
+ description['H'] = "std::hash_set with intelligent insert";
+ description['a'] = "std::hash_set with special allocator. Not threadsafe and hence not usable.";
+ description['g'] = "vespalib::hash_set";
+ description['G'] = "vespalib::hash_set with intelligent insert";
+ description['J'] = "vespalib::hash_set with intelligent insert and fast modulator";
+ size_t uniq(0);
+ for (size_t i(0); i < rep; i++) {
+ switch (type) {
+ case 'm':
+ case 'M':
+ case 'v':
+ case 'h':
+ case 'H':
+ case 'a':
+ case 'g':
+ case 'G':
+ case 'J':
+ _type = type;
+ if (numThreads == 0) {
+ runBenchMark(&indirectSlotVector);
+ } else {
+ std::vector<pthread_t> threads(numThreads);
+ for (size_t j(0); j < numThreads; j++) {
+ pthread_create(&threads[j], NULL, (VFUNC)runBenchMark, &indirectSlotVector);
+ }
+ for (size_t j(0); j < numThreads; j++) {
+ pthread_join(threads[j], NULL);
+ }
+ }
+ break;
+ default:
+ printf("'m' = %s\n", description[type]);
+ printf("'M' = %s\n", description[type]);
+ printf("'v' = %s\n", description[type]);
+ printf("'h' = %s\n", description[type]);
+ printf("'a' = %s\n", description[type]);
+ printf("'H' = %s\n", description[type]);
+ printf("'g' = %s\n", description[type]);
+ printf("'G' = %s\n", description[type]);
+ printf("'J' = %s\n", description[type]);
+ printf("Unspecified type %c. Running map benchmark\n", type);
+ exit(1);
+ break;
+ }
+ }
+ printf("Running test '%c' = %s, result = %ld unique values\n", type, description[type], uniq);
+}
+
diff --git a/vespalib/src/tests/stllike/vector_map_test.cpp b/vespalib/src/tests/stllike/vector_map_test.cpp
new file mode 100644
index 00000000000..76c80173b0b
--- /dev/null
+++ b/vespalib/src/tests/stllike/vector_map_test.cpp
@@ -0,0 +1,24 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Unit tests for hashtable.
+
+#include <vespa/log/log.h>
+LOG_SETUP("vector_map_test");
+#include <vespa/fastos/fastos.h>
+
+#include <vespa/vespalib/stllike/vector_map.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using vespalib::vector_map;
+
+using namespace vespalib;
+
+namespace {
+
+TEST("verify size of underlying storage") {
+ EXPECT_EQUAL(8u, sizeof(vector_map<uint32_t, uint32_t>::value_type));
+ EXPECT_EQUAL(16u, sizeof(vector_map<uint32_t, void *>::value_type));
+}
+
+} // namespace
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/stringfmt/.gitignore b/vespalib/src/tests/stringfmt/.gitignore
new file mode 100644
index 00000000000..866aba1f500
--- /dev/null
+++ b/vespalib/src/tests/stringfmt/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+stringfmt_test
+vespalib_stringfmt_test_app
diff --git a/vespalib/src/tests/stringfmt/CMakeLists.txt b/vespalib/src/tests/stringfmt/CMakeLists.txt
new file mode 100644
index 00000000000..174e45545ac
--- /dev/null
+++ b/vespalib/src/tests/stringfmt/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_stringfmt_test_app
+ SOURCES
+ fmt.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_stringfmt_test_app COMMAND vespalib_stringfmt_test_app)
diff --git a/vespalib/src/tests/stringfmt/DESC b/vespalib/src/tests/stringfmt/DESC
new file mode 100644
index 00000000000..12428e4bff6
--- /dev/null
+++ b/vespalib/src/tests/stringfmt/DESC
@@ -0,0 +1 @@
+Unit tests for the StringFmt class.
diff --git a/vespalib/src/tests/stringfmt/FILES b/vespalib/src/tests/stringfmt/FILES
new file mode 100644
index 00000000000..1f1161422a0
--- /dev/null
+++ b/vespalib/src/tests/stringfmt/FILES
@@ -0,0 +1 @@
+fmt.cpp
diff --git a/vespalib/src/tests/stringfmt/fmt.cpp b/vespalib/src/tests/stringfmt/fmt.cpp
new file mode 100644
index 00000000000..d5d6cef3854
--- /dev/null
+++ b/vespalib/src/tests/stringfmt/fmt.cpp
@@ -0,0 +1,102 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("stringfmt_test");
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/vstringfmt.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using vespalib::make_string;
+using vespalib::make_vespa_string;
+
+class Test : public vespalib::TestApp
+{
+public:
+ void testSimple();
+ int Main();
+};
+
+/*
+static bool eq(const std::string& a, const std::string& b)
+{
+ if (a == b) {
+ return true;
+ } else {
+ LOG(warning, "a(%s) != b(%s)", a.c_str(), b.c_str());
+ return false;
+ }
+}
+*/
+
+static bool eq(const vespalib::string& a, const vespalib::string& b)
+{
+ if (a == b) {
+ return true;
+ } else {
+ LOG(warning, "a(%s) != b(%s)", a.c_str(), b.c_str());
+ return false;
+ }
+}
+
+
+void
+Test::testSimple()
+{
+ int i=7;
+ int j=0x666;
+ const char *s = "a test ";
+
+ std::string foo = make_string("%d/%x", i, j);
+ std::string bar = make_string("%d/%x", i, j).c_str();
+
+ vespalib::string tst("7/666");
+
+ EXPECT_TRUE(tst == foo);
+ EXPECT_TRUE(tst == bar);
+
+ vespalib::string foo_v = make_vespa_string("%d/%x", i, j);
+ vespalib::string bar_v = make_vespa_string("%d/%x", i, j).c_str();
+ vespalib::string tst_v = tst;
+
+ EXPECT_TRUE(tst_v == foo_v);
+ EXPECT_TRUE(tst_v == bar_v);
+
+ EXPECT_TRUE(tst == make_string("%d/%x", i, j));
+ EXPECT_TRUE(tst_v == make_vespa_string("%d/%x", i, j));
+
+ tst = "a test ";
+ tst_v = tst;
+ EXPECT_TRUE(tst == make_string("%s", s));
+ EXPECT_TRUE(tst_v == make_vespa_string("%s", s));
+
+ tst = "a t";
+ EXPECT_TRUE(tst == make_string("%.3s", s));
+ tst_v = tst;
+ foo_v = make_vespa_string("%.3s", s);
+ EXPECT_TRUE(eq(tst, make_string("%.3s", s)));
+ EXPECT_TRUE(eq(tst_v, make_vespa_string("%.3s", s)));
+
+ const char *p = "really really really really "
+ "very very very very very "
+ "extremely extremely extremely extremely "
+ "very very very very very "
+ "really really really really "
+ "insanely insanely insanely insanely "
+ "hugely hugely hugely hugely "
+ "bloated fat long string";
+ tst = p;
+ EXPECT_TRUE(eq(tst, make_string("%s", p)));
+ tst_v = tst;
+ EXPECT_TRUE(eq(tst_v, make_vespa_string("%s", p)));
+}
+
+
+int
+Test::Main()
+{
+ TEST_INIT("stringfmt_test");
+ testSimple();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/sync/.gitignore b/vespalib/src/tests/sync/.gitignore
new file mode 100644
index 00000000000..bee38903897
--- /dev/null
+++ b/vespalib/src/tests/sync/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+sync_test
+vespalib_sync_test_app
diff --git a/vespalib/src/tests/sync/CMakeLists.txt b/vespalib/src/tests/sync/CMakeLists.txt
new file mode 100644
index 00000000000..944d9d76337
--- /dev/null
+++ b/vespalib/src/tests/sync/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_sync_test_app
+ SOURCES
+ sync_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_sync_test_app COMMAND vespalib_sync_test_app)
diff --git a/vespalib/src/tests/sync/DESC b/vespalib/src/tests/sync/DESC
new file mode 100644
index 00000000000..82fc5b4dd36
--- /dev/null
+++ b/vespalib/src/tests/sync/DESC
@@ -0,0 +1 @@
+sync test. Take a look at sync.cpp for details.
diff --git a/vespalib/src/tests/sync/FILES b/vespalib/src/tests/sync/FILES
new file mode 100644
index 00000000000..57472ad6c2b
--- /dev/null
+++ b/vespalib/src/tests/sync/FILES
@@ -0,0 +1 @@
+sync.cpp
diff --git a/vespalib/src/tests/sync/sync_test.cpp b/vespalib/src/tests/sync/sync_test.cpp
new file mode 100644
index 00000000000..5f71c845326
--- /dev/null
+++ b/vespalib/src/tests/sync/sync_test.cpp
@@ -0,0 +1,323 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("sync_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/sync.h>
+
+using namespace vespalib;
+
+#define CHECK_LOCKED(m) { TryLock tl(m); EXPECT_TRUE(!tl.hasLock()); }
+#define CHECK_UNLOCKED(m) { TryLock tl(m); EXPECT_TRUE(tl.hasLock()); }
+
+class Test : public TestApp
+{
+private:
+ Lock _lock;
+ Monitor _monitor;
+
+ LockGuard lockLock() { return LockGuard(_lock); }
+ LockGuard lockMonitor() { return LockGuard(_monitor); }
+ MonitorGuard obtainMonitor() { return MonitorGuard(_monitor); }
+public:
+ void testCountDownLatch();
+ int Main();
+};
+
+void
+Test::testCountDownLatch() {
+ {
+ CountDownLatch latch(5);
+ EXPECT_EQUAL(latch.getCount(), 5u);
+ latch.countDown();
+ EXPECT_EQUAL(latch.getCount(), 4u);
+ latch.countDown();
+ EXPECT_EQUAL(latch.getCount(), 3u);
+ latch.countDown();
+ EXPECT_EQUAL(latch.getCount(), 2u);
+ latch.countDown();
+ EXPECT_EQUAL(latch.getCount(), 1u);
+ latch.countDown();
+ EXPECT_EQUAL(latch.getCount(), 0u);
+ latch.countDown();
+ EXPECT_EQUAL(latch.getCount(), 0u);
+ latch.await(); // should not block
+ latch.await(); // should not block
+ }
+ {
+ Gate gate;
+ EXPECT_EQUAL(gate.getCount(), 1u);
+ gate.countDown();
+ EXPECT_EQUAL(gate.getCount(), 0u);
+ gate.countDown();
+ EXPECT_EQUAL(gate.getCount(), 0u);
+ gate.await(); // should not block
+ gate.await(); // should not block
+ }
+ {
+ Gate gate;
+ EXPECT_EQUAL(gate.getCount(), 1u);
+ EXPECT_EQUAL(gate.await(0), false);
+ EXPECT_EQUAL(gate.await(10), false);
+ gate.countDown();
+ EXPECT_EQUAL(gate.getCount(), 0u);
+ EXPECT_EQUAL(gate.await(0), true);
+ EXPECT_EQUAL(gate.await(10), true);
+ }
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("sync_test");
+ {
+ Lock lock;
+ {
+ CHECK_UNLOCKED(lock);
+ LockGuard guard(lock);
+ CHECK_LOCKED(lock);
+ }
+ CHECK_UNLOCKED(lock);
+ {
+ LockGuard guard(lock);
+ CHECK_LOCKED(lock);
+ guard.unlock();
+ CHECK_UNLOCKED(lock);
+ }
+ }
+ // you can use a LockGuard to lock a Monitor
+ {
+ Monitor monitor;
+ {
+ CHECK_UNLOCKED(monitor);
+ LockGuard guard(monitor);
+ CHECK_LOCKED(monitor);
+ }
+ CHECK_UNLOCKED(monitor);
+ {
+ LockGuard guard(monitor);
+ CHECK_LOCKED(monitor);
+ guard.unlock();
+ CHECK_UNLOCKED(monitor);
+ }
+ }
+ {
+ Monitor monitor;
+ {
+ CHECK_UNLOCKED(monitor);
+ MonitorGuard guard(monitor);
+ guard.signal();
+ guard.broadcast();
+ guard.wait(10);
+ CHECK_LOCKED(monitor);
+ }
+ CHECK_UNLOCKED(monitor);
+ {
+ MonitorGuard guard(monitor);
+ CHECK_LOCKED(monitor);
+ guard.unlock();
+ CHECK_UNLOCKED(monitor);
+ }
+ }
+ // copy/assign is nop, but legal
+ {
+ Lock a;
+ Lock b(a);
+ b = a;
+ }
+ {
+ Monitor a;
+ Monitor b(a);
+ b = a;
+ }
+ // you can lock const objects
+ {
+ const Lock lock;
+ CHECK_UNLOCKED(lock);
+ LockGuard guard(lock);
+ CHECK_LOCKED(lock);
+ }
+ {
+ const Monitor lock;
+ CHECK_UNLOCKED(lock);
+ LockGuard guard(lock);
+ CHECK_LOCKED(lock);
+ }
+ {
+ const Monitor monitor;
+ CHECK_UNLOCKED(monitor);
+ MonitorGuard guard(monitor);
+ CHECK_LOCKED(monitor);
+ }
+ // TryLock hands the lock over to a LockGuard/MonitorGuard
+ {
+ Lock lock;
+ CHECK_UNLOCKED(lock);
+ TryLock a(lock);
+ CHECK_LOCKED(lock);
+ if (a.hasLock()) {
+ LockGuard guard(a);
+ CHECK_LOCKED(lock);
+ }
+ CHECK_UNLOCKED(lock);
+ }
+ {
+ Monitor mon;
+ CHECK_UNLOCKED(mon);
+ TryLock a(mon);
+ CHECK_LOCKED(mon);
+ if (a.hasLock()) {
+ LockGuard guard(a);
+ CHECK_LOCKED(mon);
+ }
+ CHECK_UNLOCKED(mon);
+ }
+ {
+ Monitor mon;
+ CHECK_UNLOCKED(mon);
+ TryLock a(mon);
+ CHECK_LOCKED(mon);
+ if (a.hasLock()) {
+ MonitorGuard guard(a);
+ CHECK_LOCKED(mon);
+ }
+ CHECK_UNLOCKED(mon);
+ }
+ {
+ Lock lock;
+
+ CHECK_UNLOCKED(lock);
+ TryLock a(lock);
+ CHECK_LOCKED(lock);
+ TryLock b(lock);
+ CHECK_LOCKED(lock);
+
+ EXPECT_TRUE(a.hasLock());
+ EXPECT_TRUE(!b.hasLock());
+ {
+ CHECK_LOCKED(lock);
+ EXPECT_TRUE(a.hasLock());
+ LockGuard guard(a);
+ EXPECT_TRUE(!a.hasLock());
+ CHECK_LOCKED(lock);
+ }
+ CHECK_UNLOCKED(lock);
+ }
+ // TryLock will unlock when exiting scope if lock was not passed on
+ {
+ Lock lock;
+ Monitor mon;
+ CHECK_UNLOCKED(lock);
+ CHECK_UNLOCKED(mon);
+ {
+ TryLock a(lock);
+ EXPECT_TRUE(a.hasLock());
+ TryLock b(mon);
+ EXPECT_TRUE(b.hasLock());
+ CHECK_LOCKED(lock);
+ CHECK_LOCKED(mon);
+ }
+ CHECK_UNLOCKED(lock);
+ CHECK_UNLOCKED(mon);
+ }
+ // TryLock explicitt unlock of lock
+ {
+ Lock lock;
+ TryLock tl(lock);
+ EXPECT_TRUE(tl.hasLock());
+ tl.unlock();
+ EXPECT_FALSE(tl.hasLock());
+ tl.unlock();
+ EXPECT_FALSE(tl.hasLock());
+ }
+ // TryLock explicitt unlock of monitor
+ {
+ Monitor lock;
+ TryLock tl(lock);
+ EXPECT_TRUE(tl.hasLock());
+ tl.unlock();
+ EXPECT_FALSE(tl.hasLock());
+ tl.unlock();
+ EXPECT_FALSE(tl.hasLock());
+ }
+ // LockGuard/MonitorGuard have destructive copy
+ {
+ Lock lock;
+ CHECK_UNLOCKED(lock);
+ LockGuard a(lock);
+ CHECK_LOCKED(lock);
+ {
+ CHECK_LOCKED(lock);
+ LockGuard b(a);
+ CHECK_LOCKED(lock);
+ }
+ CHECK_UNLOCKED(lock);
+ }
+ {
+ Monitor mon;
+ CHECK_UNLOCKED(mon);
+ MonitorGuard a(mon);
+ CHECK_LOCKED(mon);
+ {
+ CHECK_LOCKED(mon);
+ MonitorGuard b(a);
+ CHECK_LOCKED(mon);
+ }
+ CHECK_UNLOCKED(mon);
+ }
+ // Destructive copy also works for return value handover
+ {
+ CHECK_UNLOCKED(_lock);
+ CHECK_UNLOCKED(_monitor);
+ {
+ CHECK_UNLOCKED(_lock);
+ CHECK_UNLOCKED(_monitor);
+ LockGuard a(lockLock());
+ CHECK_LOCKED(_lock);
+ CHECK_UNLOCKED(_monitor);
+ LockGuard b = lockMonitor(); // copy, not assign
+ CHECK_LOCKED(_lock);
+ CHECK_LOCKED(_monitor);
+ }
+ CHECK_UNLOCKED(_lock);
+ CHECK_UNLOCKED(_monitor);
+ }
+ {
+ CHECK_UNLOCKED(_monitor);
+ {
+ CHECK_UNLOCKED(_monitor);
+ MonitorGuard guard(obtainMonitor());
+ CHECK_LOCKED(_monitor);
+ }
+ CHECK_UNLOCKED(_monitor);
+ }
+ // Test that guards can be matched to locks/monitors
+ {
+ Lock lock1;
+ Lock lock2;
+ LockGuard lockGuard1(lock1);
+ LockGuard lockGuard2(lock2);
+ EXPECT_TRUE(lockGuard1.locks(lock1));
+ EXPECT_FALSE(lockGuard1.locks(lock2));
+ EXPECT_TRUE(lockGuard2.locks(lock2));
+ EXPECT_FALSE(lockGuard2.locks(lock1));
+ lockGuard1.unlock();
+ EXPECT_FALSE(lockGuard1.locks(lock1));
+ }
+ {
+ Monitor lock1;
+ Monitor lock2;
+ MonitorGuard lockGuard1(lock1);
+ MonitorGuard lockGuard2(lock2);
+ EXPECT_TRUE(lockGuard1.monitors(lock1));
+ EXPECT_FALSE(lockGuard1.monitors(lock2));
+ EXPECT_TRUE(lockGuard2.monitors(lock2));
+ EXPECT_FALSE(lockGuard2.monitors(lock1));
+ lockGuard1.unlock();
+ EXPECT_FALSE(lockGuard1.monitors(lock1));
+ }
+ testCountDownLatch();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/systemstate/.gitignore b/vespalib/src/tests/systemstate/.gitignore
new file mode 100644
index 00000000000..653dd0dbbe3
--- /dev/null
+++ b/vespalib/src/tests/systemstate/.gitignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+systemstate_test
diff --git a/vespalib/src/tests/systemstate/DESC b/vespalib/src/tests/systemstate/DESC
new file mode 100644
index 00000000000..7b0e778ea7c
--- /dev/null
+++ b/vespalib/src/tests/systemstate/DESC
@@ -0,0 +1 @@
+systemstate test. Take a look at systemstate.cpp for details.
diff --git a/vespalib/src/tests/systemstate/FILES b/vespalib/src/tests/systemstate/FILES
new file mode 100644
index 00000000000..e1d0e026d31
--- /dev/null
+++ b/vespalib/src/tests/systemstate/FILES
@@ -0,0 +1 @@
+systemstate.cpp
diff --git a/vespalib/src/tests/tensor/compact_tensor_builder/.gitignore b/vespalib/src/tests/tensor/compact_tensor_builder/.gitignore
new file mode 100644
index 00000000000..57abfa0f6a9
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_builder/.gitignore
@@ -0,0 +1 @@
+vespalib_compact_tensor_builder_test_app
diff --git a/vespalib/src/tests/tensor/compact_tensor_builder/CMakeLists.txt b/vespalib/src/tests/tensor/compact_tensor_builder/CMakeLists.txt
new file mode 100644
index 00000000000..bc6a2bfe981
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_builder/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_compact_tensor_builder_test_app
+ SOURCES
+ compact_tensor_builder_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_compact_tensor_builder_test_app COMMAND vespalib_compact_tensor_builder_test_app)
diff --git a/vespalib/src/tests/tensor/compact_tensor_builder/FILES b/vespalib/src/tests/tensor/compact_tensor_builder/FILES
new file mode 100644
index 00000000000..f31a47be268
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_builder/FILES
@@ -0,0 +1 @@
+compact_tensor_builder_test.cpp
diff --git a/vespalib/src/tests/tensor/compact_tensor_builder/compact_tensor_builder_test.cpp b/vespalib/src/tests/tensor/compact_tensor_builder/compact_tensor_builder_test.cpp
new file mode 100644
index 00000000000..3d9f7f36242
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_builder/compact_tensor_builder_test.cpp
@@ -0,0 +1,58 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_builder.h>
+
+using namespace vespalib::tensor;
+
+
+void
+assertCellValue(double expValue, const TensorAddress &address, const CompactTensor::Cells &cells)
+{
+ CompactTensorAddressBuilder addressBuilder;
+ for (const auto &element : address.elements()) {
+ addressBuilder.add(element.dimension(), element.label());
+ }
+ CompactTensorAddressRef addressRef(addressBuilder.getAddressRef());
+ auto itr = cells.find(addressRef);
+ EXPECT_FALSE(itr == cells.end());
+ EXPECT_EQUAL(expValue, itr->second);
+}
+
+TEST("require that tensor can be constructed")
+{
+ CompactTensorBuilder builder;
+ builder.add_label(builder.define_dimension("a"), "1").
+ add_label(builder.define_dimension("b"), "2").add_cell(10).
+ add_label(builder.define_dimension("c"), "3").
+ add_label(builder.define_dimension("d"), "4").add_cell(20);
+ Tensor::UP tensor = builder.build();
+ const CompactTensor &compactTensor = dynamic_cast<const CompactTensor &>(*tensor);
+ const CompactTensor::Cells &cells = compactTensor.cells();
+ EXPECT_EQUAL(2u, cells.size());
+ assertCellValue(10, TensorAddress({{"a","1"},{"b","2"}}), cells);
+ assertCellValue(20, TensorAddress({{"c","3"},{"d","4"}}), cells);
+}
+
+TEST("require that dimensions are extracted")
+{
+ CompactTensorBuilder builder;
+ builder.define_dimension("c");
+ builder.define_dimension("a");
+ builder.define_dimension("b");
+ builder.
+ add_label(builder.define_dimension("a"), "1").
+ add_label(builder.define_dimension("b"), "2").add_cell(10).
+ add_label(builder.define_dimension("b"), "3").
+ add_label(builder.define_dimension("c"), "4").add_cell(20);
+ Tensor::UP tensor = builder.build();
+ const CompactTensor &compactTensor = dynamic_cast<const CompactTensor &>(*tensor);
+ const CompactTensor::Dimensions &dims = compactTensor.dimensions();
+ EXPECT_EQUAL(3u, dims.size());
+ EXPECT_EQUAL("a", dims[0]);
+ EXPECT_EQUAL("b", dims[1]);
+ EXPECT_EQUAL("c", dims[2]);
+ EXPECT_EQUAL("tensor(a{},b{},c{})", compactTensor.getType().toSpec());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/compact_tensor_v2_builder/.gitignore b/vespalib/src/tests/tensor/compact_tensor_v2_builder/.gitignore
new file mode 100644
index 00000000000..22edb7555be
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_v2_builder/.gitignore
@@ -0,0 +1 @@
+vespalib_compact_tensor_v2_builder_test_app
diff --git a/vespalib/src/tests/tensor/compact_tensor_v2_builder/CMakeLists.txt b/vespalib/src/tests/tensor/compact_tensor_v2_builder/CMakeLists.txt
new file mode 100644
index 00000000000..820db2fbc0c
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_v2_builder/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_compact_tensor_v2_builder_test_app
+ SOURCES
+ compact_tensor_v2_builder_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_compact_tensor_v2_builder_test_app COMMAND vespalib_compact_tensor_v2_builder_test_app)
diff --git a/vespalib/src/tests/tensor/compact_tensor_v2_builder/FILES b/vespalib/src/tests/tensor/compact_tensor_v2_builder/FILES
new file mode 100644
index 00000000000..196c68833da
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_v2_builder/FILES
@@ -0,0 +1 @@
+compact_tensor_v2_builder_test.cpp
diff --git a/vespalib/src/tests/tensor/compact_tensor_v2_builder/compact_tensor_v2_builder_test.cpp b/vespalib/src/tests/tensor/compact_tensor_v2_builder/compact_tensor_v2_builder_test.cpp
new file mode 100644
index 00000000000..18630967d33
--- /dev/null
+++ b/vespalib/src/tests/tensor/compact_tensor_v2_builder/compact_tensor_v2_builder_test.cpp
@@ -0,0 +1,79 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h>
+
+using namespace vespalib::tensor;
+
+
+void
+assertCellValue(double expValue, const TensorAddress &address,
+ const TensorDimensions &dimensions,
+ const CompactTensorV2::Cells &cells)
+{
+ CompactTensorV2AddressBuilder addressBuilder;
+ auto dimsItr = dimensions.cbegin();
+ auto dimsItrEnd = dimensions.cend();
+ for (const auto &element : address.elements()) {
+ while ((dimsItr < dimsItrEnd) && (*dimsItr < element.dimension())) {
+ addressBuilder.add("");
+ ++dimsItr;
+ }
+ assert((dimsItr != dimsItrEnd) && (*dimsItr == element.dimension()));
+ addressBuilder.add(element.label());
+ ++dimsItr;
+ }
+ while (dimsItr < dimsItrEnd) {
+ addressBuilder.add("");
+ ++dimsItr;
+ }
+ CompactTensorAddressRef addressRef(addressBuilder.getAddressRef());
+ auto itr = cells.find(addressRef);
+ EXPECT_FALSE(itr == cells.end());
+ EXPECT_EQUAL(expValue, itr->second);
+}
+
+TEST("require that tensor can be constructed")
+{
+ CompactTensorV2Builder builder;
+ builder.define_dimension("c");
+ builder.define_dimension("d");
+ builder.define_dimension("a");
+ builder.define_dimension("b");
+ builder.add_label(builder.define_dimension("a"), "1").
+ add_label(builder.define_dimension("b"), "2").add_cell(10).
+ add_label(builder.define_dimension("c"), "3").
+ add_label(builder.define_dimension("d"), "4").add_cell(20);
+ Tensor::UP tensor = builder.build();
+ const CompactTensorV2 &compactTensor = dynamic_cast<const CompactTensorV2 &>(*tensor);
+ const TensorDimensions &dimensions = compactTensor.dimensions();
+ const CompactTensorV2::Cells &cells = compactTensor.cells();
+ EXPECT_EQUAL(2u, cells.size());
+ assertCellValue(10, TensorAddress({{"a","1"},{"b","2"}}),
+ dimensions, cells);
+ assertCellValue(20, TensorAddress({{"c","3"},{"d","4"}}),
+ dimensions, cells);
+}
+
+TEST("require that dimensions are extracted")
+{
+ CompactTensorV2Builder builder;
+ builder.define_dimension("c");
+ builder.define_dimension("a");
+ builder.define_dimension("b");
+ builder.
+ add_label(builder.define_dimension("a"), "1").
+ add_label(builder.define_dimension("b"), "2").add_cell(10).
+ add_label(builder.define_dimension("b"), "3").
+ add_label(builder.define_dimension("c"), "4").add_cell(20);
+ Tensor::UP tensor = builder.build();
+ const CompactTensorV2 &compactTensor = dynamic_cast<const CompactTensorV2 &>(*tensor);
+ const TensorDimensions &dims = compactTensor.dimensions();
+ EXPECT_EQUAL(3u, dims.size());
+ EXPECT_EQUAL("a", dims[0]);
+ EXPECT_EQUAL("b", dims[1]);
+ EXPECT_EQUAL("c", dims[2]);
+ EXPECT_EQUAL("tensor(a{},b{},c{})", compactTensor.getType().toSpec());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/dense_tensor_builder/.gitignore b/vespalib/src/tests/tensor/dense_tensor_builder/.gitignore
new file mode 100644
index 00000000000..5b3598a205d
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_builder/.gitignore
@@ -0,0 +1 @@
+vespalib_dense_tensor_builder_test_app
diff --git a/vespalib/src/tests/tensor/dense_tensor_builder/CMakeLists.txt b/vespalib/src/tests/tensor/dense_tensor_builder/CMakeLists.txt
new file mode 100644
index 00000000000..0be94792298
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_builder/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_dense_tensor_builder_test_app
+ SOURCES
+ dense_tensor_builder_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_dense_tensor_builder_test_app COMMAND vespalib_dense_tensor_builder_test_app)
diff --git a/vespalib/src/tests/tensor/dense_tensor_builder/FILES b/vespalib/src/tests/tensor/dense_tensor_builder/FILES
new file mode 100644
index 00000000000..448dd3c1e3c
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_builder/FILES
@@ -0,0 +1 @@
+dense_tensor_builder_test.cpp
diff --git a/vespalib/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp b/vespalib/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp
new file mode 100644
index 00000000000..09c1e31ef2f
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp
@@ -0,0 +1,208 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/test/insertion_operators.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor_builder.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <algorithm>
+
+using namespace vespalib::tensor;
+using vespalib::IllegalArgumentException;
+using Builder = DenseTensorBuilder;
+
+void
+assertTensor(const DenseTensor::DimensionsMeta &expDims,
+ const DenseTensor::Cells &expCells,
+ const Tensor &tensor)
+{
+ const DenseTensor &realTensor = dynamic_cast<const DenseTensor &>(tensor);
+ EXPECT_EQUAL(expDims, realTensor.dimensionsMeta());
+ EXPECT_EQUAL(expCells, realTensor.cells());
+}
+
+struct Fixture
+{
+ Builder builder;
+};
+
+TEST_F("require that 1d tensor can be constructed", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 3);
+ f.builder.addLabel(dimX, 0).addCell(10).
+ addLabel(dimX, 1).addCell(11).
+ addLabel(dimX, 2).addCell(12);
+ assertTensor({{"x",3}}, {10,11,12},
+ *f.builder.build());
+}
+
+TEST_F("require that 2d tensor can be constructed", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 3);
+ Builder::Dimension dimY = f.builder.defineDimension("y", 2);
+ f.builder.addLabel(dimX, 0).addLabel(dimY, 0).addCell(10).
+ addLabel(dimX, 0).addLabel(dimY, 1).addCell(11).
+ addLabel(dimX, 1).addLabel(dimY, 0).addCell(12).
+ addLabel(dimX, 1).addLabel(dimY, 1).addCell(13).
+ addLabel(dimX, 2).addLabel(dimY, 0).addCell(14).
+ addLabel(dimX, 2).addLabel(dimY, 1).addCell(15);
+ assertTensor({{"x",3},{"y",2}}, {10,11,12,13,14,15},
+ *f.builder.build());
+}
+
+TEST_F("require that 3d tensor can be constructed", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 3);
+ Builder::Dimension dimY = f.builder.defineDimension("y", 2);
+ Builder::Dimension dimZ = f.builder.defineDimension("z", 2);
+ f.builder.addLabel(dimX, 0).addLabel(dimY, 0).addLabel(dimZ, 0).addCell(10).
+ addLabel(dimX, 0).addLabel(dimY, 0).addLabel(dimZ, 1).addCell(11).
+ addLabel(dimX, 0).addLabel(dimY, 1).addLabel(dimZ, 0).addCell(12).
+ addLabel(dimX, 0).addLabel(dimY, 1).addLabel(dimZ, 1).addCell(13).
+ addLabel(dimX, 1).addLabel(dimY, 0).addLabel(dimZ, 0).addCell(14).
+ addLabel(dimX, 1).addLabel(dimY, 0).addLabel(dimZ, 1).addCell(15).
+ addLabel(dimX, 1).addLabel(dimY, 1).addLabel(dimZ, 0).addCell(16).
+ addLabel(dimX, 1).addLabel(dimY, 1).addLabel(dimZ, 1).addCell(17).
+ addLabel(dimX, 2).addLabel(dimY, 0).addLabel(dimZ, 0).addCell(18).
+ addLabel(dimX, 2).addLabel(dimY, 0).addLabel(dimZ, 1).addCell(19).
+ addLabel(dimX, 2).addLabel(dimY, 1).addLabel(dimZ, 0).addCell(20).
+ addLabel(dimX, 2).addLabel(dimY, 1).addLabel(dimZ, 1).addCell(21);
+ assertTensor({{"x",3},{"y",2},{"z",2}},
+ {10,11,12,13,14,15,16,17,18,19,20,21},
+ *f.builder.build());
+}
+
+TEST_F("require that cells get default value 0 if not specified", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 3);
+ f.builder.addLabel(dimX, 1).addCell(11);
+ assertTensor({{"x",3}}, {0,11,0},
+ *f.builder.build());
+}
+
+TEST_F("require that labels can be added in arbitrarily order", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 2);
+ Builder::Dimension dimY = f.builder.defineDimension("y", 3);
+ f.builder.addLabel(dimY, 0).addLabel(dimX, 1).addCell(10);
+ assertTensor({{"x",2},{"y",3}}, {0,0,0,10,0,0},
+ *f.builder.build());
+}
+
+TEST_F("require that builder can be re-used", Fixture)
+{
+ {
+ Builder::Dimension dimX = f.builder.defineDimension("x", 2);
+ f.builder.addLabel(dimX, 0).addCell(10).
+ addLabel(dimX, 1).addCell(11);
+ assertTensor({{"x",2}}, {10,11},
+ *f.builder.build());
+ }
+ {
+ Builder::Dimension dimY = f.builder.defineDimension("y", 3);
+ f.builder.addLabel(dimY, 0).addCell(20).
+ addLabel(dimY, 1).addCell(21).
+ addLabel(dimY, 2).addCell(22);
+ assertTensor({{"y",3}}, {20,21,22},
+ *f.builder.build());
+ }
+}
+
+void
+assertTensorCell(const std::vector<size_t> &expAddress,
+ double expCell,
+ const DenseTensor::CellsIterator &itr)
+{
+ EXPECT_TRUE(itr.valid());
+ EXPECT_EQUAL(expAddress, itr.address());
+ EXPECT_EQUAL(expCell, itr.cell());
+}
+
+TEST_F("require that dense tensor cells iterator works for 1d tensor", Fixture)
+{
+ Tensor::UP tensor;
+ {
+ Builder::Dimension dimX = f.builder.defineDimension("x", 2);
+ f.builder.addLabel(dimX, 0).addCell(2).
+ addLabel(dimX, 1).addCell(3);
+ tensor = f.builder.build();
+ }
+
+ const DenseTensor &denseTensor = dynamic_cast<const DenseTensor &>(*tensor);
+ DenseTensor::CellsIterator itr = denseTensor.cellsIterator();
+
+ assertTensorCell({0}, 2, itr);
+ itr.next();
+ assertTensorCell({1}, 3, itr);
+ itr.next();
+ EXPECT_FALSE(itr.valid());
+}
+
+TEST_F("require that dense tensor cells iterator works for 2d tensor", Fixture)
+{
+ Tensor::UP tensor;
+ {
+ Builder::Dimension dimX = f.builder.defineDimension("x", 2);
+ Builder::Dimension dimY = f.builder.defineDimension("y", 2);
+ f.builder.addLabel(dimX, 0).addLabel(dimY, 0).addCell(2).
+ addLabel(dimX, 0).addLabel(dimY, 1).addCell(3).
+ addLabel(dimX, 1).addLabel(dimY, 0).addCell(5).
+ addLabel(dimX, 1).addLabel(dimY, 1).addCell(7);
+ tensor = f.builder.build();
+ }
+
+ const DenseTensor &denseTensor = dynamic_cast<const DenseTensor &>(*tensor);
+ DenseTensor::CellsIterator itr = denseTensor.cellsIterator();
+
+ assertTensorCell({0,0}, 2, itr);
+ itr.next();
+ assertTensorCell({0,1}, 3, itr);
+ itr.next();
+ assertTensorCell({1,0}, 5, itr);
+ itr.next();
+ assertTensorCell({1,1}, 7, itr);
+ itr.next();
+ EXPECT_FALSE(itr.valid());
+}
+
+TEST_F("require that undefined label for a dimension throws exception", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 2);
+ f.builder.defineDimension("y", 3);
+ EXPECT_EXCEPTION(f.builder.addLabel(dimX, 0).addCell(10),
+ IllegalArgumentException,
+ "Label for dimension 'y' is undefined. Expected a value in the range [0, 3>");
+}
+
+TEST_F("require that label outside range throws exception", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 2);
+ EXPECT_EXCEPTION(f.builder.addLabel(dimX, 2).addCell(10),
+ IllegalArgumentException,
+ "Label '2' for dimension 'x' is outside range [0, 2>");
+}
+
+TEST_F("require that already specified label throws exception", Fixture)
+{
+ Builder::Dimension dimX = f.builder.defineDimension("x", 2);
+ EXPECT_EXCEPTION(f.builder.addLabel(dimX, 0).addLabel(dimX, 1).addCell(10),
+ IllegalArgumentException,
+ "Label for dimension 'x' is already specified with value '0'");
+}
+
+
+TEST_F("require that dimensions are sorted", Fixture)
+{
+ Builder::Dimension dimY = f.builder.defineDimension("y", 3);
+ Builder::Dimension dimX = f.builder.defineDimension("x", 5);
+ f.builder.addLabel(dimX, 0).addLabel(dimY, 0).addCell(10);
+ f.builder.addLabel(dimX, 0).addLabel(dimY, 1).addCell(11);
+ f.builder.addLabel(dimX, 1).addLabel(dimY, 0).addCell(12);
+ std::unique_ptr<Tensor> tensor = f.builder.build();
+ const DenseTensor &denseTensor = dynamic_cast<const DenseTensor &>(*tensor);
+ assertTensor({{"x", 5}, {"y", 3}},
+ {10, 11, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ denseTensor);
+ EXPECT_EQUAL("tensor(x[5],y[3])", denseTensor.getType().toSpec());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/dense_tensor_operations/.gitignore b/vespalib/src/tests/tensor/dense_tensor_operations/.gitignore
new file mode 100644
index 00000000000..1180a740209
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_operations/.gitignore
@@ -0,0 +1 @@
+vespalib_dense_tensor_operations_test_app
diff --git a/vespalib/src/tests/tensor/dense_tensor_operations/CMakeLists.txt b/vespalib/src/tests/tensor/dense_tensor_operations/CMakeLists.txt
new file mode 100644
index 00000000000..800ffeeccc9
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_operations/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_dense_tensor_operations_test_app
+ SOURCES
+ dense_tensor_operations_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_dense_tensor_operations_test_app COMMAND vespalib_dense_tensor_operations_test_app)
diff --git a/vespalib/src/tests/tensor/dense_tensor_operations/FILES b/vespalib/src/tests/tensor/dense_tensor_operations/FILES
new file mode 100644
index 00000000000..e9ba06f506a
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_operations/FILES
@@ -0,0 +1 @@
+dense_tensor_operations_test.cpp
diff --git a/vespalib/src/tests/tensor/dense_tensor_operations/dense_tensor_operations_test.cpp b/vespalib/src/tests/tensor/dense_tensor_operations/dense_tensor_operations_test.cpp
new file mode 100644
index 00000000000..8264fa74e17
--- /dev/null
+++ b/vespalib/src/tests/tensor/dense_tensor_operations/dense_tensor_operations_test.cpp
@@ -0,0 +1,473 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor_builder.h>
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/tensor/tensor_function.h>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+#include <vespa/vespalib/tensor/tensor_type.h>
+#include <iostream>
+
+using namespace vespalib::tensor;
+
+using DenseTensorCells = std::map<std::map<vespalib::string, size_t>, double>;
+
+namespace vespalib {
+namespace tensor {
+
+static bool operator==(const Tensor &lhs, const Tensor &rhs)
+{
+ return lhs.equals(rhs);
+}
+
+}
+}
+
+//-----------------------------------------------------------------------------
+
+class MyInput : public TensorFunction::Input
+{
+private:
+ std::vector<Tensor::CREF> tensors;
+ std::vector<CellFunction::CREF> cell_functions;
+ const Tensor &get_tensor(size_t id) const override {
+ ASSERT_GREATER(tensors.size(), id);
+ return tensors[id];
+ }
+ virtual const CellFunction &get_cell_function(size_t id) const override {
+ ASSERT_GREATER(cell_functions.size(), id);
+ return cell_functions[id];
+ }
+public:
+ size_t add(const Tensor &tensor) {
+ size_t id = tensors.size();
+ tensors.push_back(tensor);
+ return id;
+ }
+ size_t add(const CellFunction &cell_function) {
+ size_t id = cell_functions.size();
+ cell_functions.push_back(cell_function);
+ return id;
+ }
+};
+
+const Tensor &eval_tensor(function::Node &function_ir, const TensorFunction::Input &input) {
+ ASSERT_TRUE(function_ir.type().is_tensor());
+ TensorFunction &function = function_ir; // compile step
+ const Tensor &result = function.eval(input).as_tensor;
+ EXPECT_EQUAL(result.getType(), function_ir.type());
+ return result;
+}
+
+const Tensor &eval_tensor_unchecked(function::Node &function_ir, const TensorFunction::Input &input) {
+ ASSERT_TRUE(function_ir.type().is_tensor());
+ TensorFunction &function = function_ir; // compile step
+ return function.eval(input).as_tensor;
+}
+
+const Tensor &eval_tensor_unchecked_allow_invalid(function::Node &function_ir, const TensorFunction::Input &input) {
+ TensorFunction &function = function_ir; // compile step
+ return function.eval(input).as_tensor;
+}
+
+double eval_number(function::Node &function_ir, const TensorFunction::Input &input) {
+ ASSERT_TRUE(function_ir.type().is_number());
+ TensorFunction &function = function_ir; // compile step
+ return function.eval(input).as_double;
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename BuilderType>
+struct Fixture
+{
+ BuilderType _builder;
+ Fixture() : _builder() {}
+
+ Tensor::UP createTensor(const DenseTensorCells &cells) {
+ std::map<std::string, size_t> dimensionSizes;
+ for (const auto &cell : cells) {
+ for (const auto &addressElem : cell.first) {
+ dimensionSizes[addressElem.first] = std::max(dimensionSizes[addressElem.first],
+ (addressElem.second + 1));
+ }
+ }
+ std::map<std::string, typename BuilderType::Dimension> dimensionEnums;
+ for (const auto &dimensionElem : dimensionSizes) {
+ dimensionEnums[dimensionElem.first] =
+ _builder.defineDimension(dimensionElem.first, dimensionElem.second);
+ }
+ for (const auto &cell : cells) {
+ for (const auto &addressElem : cell.first) {
+ const auto &dimension = addressElem.first;
+ size_t label = addressElem.second;
+ _builder.addLabel(dimensionEnums[dimension], label);
+ }
+ _builder.addCell(cell.second);
+ }
+ return _builder.build();
+ }
+ void assertAddImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::add(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertAdd(const DenseTensorCells &exp,
+ const DenseTensorCells &lhs, const DenseTensorCells &rhs) {
+ assertAddImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertSubtractImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::subtract(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertSubtract(const DenseTensorCells &exp,
+ const DenseTensorCells &lhs,
+ const DenseTensorCells &rhs) {
+ assertSubtractImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMinImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::min(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMin(const DenseTensorCells &exp, const DenseTensorCells &lhs,
+ const DenseTensorCells &rhs) {
+ assertMinImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMaxImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::max(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMax(const DenseTensorCells &exp, const DenseTensorCells &lhs,
+ const DenseTensorCells &rhs) {
+ assertMaxImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertSumImpl(double exp, const Tensor &tensor) {
+ MyInput input;
+ function::Node_UP ir = function::sum(function::input(tensor.getType(), input.add(tensor)));
+ EXPECT_EQUAL(exp, eval_number(*ir, input));
+ }
+ void assertSum(double exp, const DenseTensorCells &cells) {
+ assertSumImpl(exp, *createTensor(cells));
+ }
+ void assertMatchImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::match(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMatch(const DenseTensorCells &exp, const DenseTensorCells &lhs,
+ const DenseTensorCells &rhs) {
+ assertMatchImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertApplyImpl(const Tensor &exp, const Tensor &tensor, const CellFunction &func) {
+ MyInput input;
+ function::Node_UP ir = function::apply(function::input(tensor.getType(), input.add(tensor)), input.add(func));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertApply(const DenseTensorCells &exp, const DenseTensorCells &arg,
+ const CellFunction &func) {
+ assertApplyImpl(*createTensor(exp), *createTensor(arg), func);
+ }
+ void assertDimensionSumImpl(const Tensor &exp, const Tensor &tensor, const vespalib::string &dimension) {
+ MyInput input;
+ function::Node_UP ir = function::dimension_sum(function::input(tensor.getType(), input.add(tensor)), dimension);
+ if (!ir->type().is_valid()) {
+ // According to the ir, it is not allowed to sum over a
+ // non-existing dimension. The current implementation
+ // allows this, resulting in a tensor with no cells and
+ // with all dimensions not sliced.
+ EXPECT_EQUAL(exp, eval_tensor_unchecked_allow_invalid(*ir, input)); // UNCHECKED_ALLOW_INVALID
+ } else {
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ }
+ void assertDimensionSum(const DenseTensorCells &exp,
+ const DenseTensorCells &arg,
+ const vespalib::string &dimension) {
+ assertDimensionSumImpl(*createTensor(exp), *createTensor(arg), dimension);
+ }
+ void assertMultiplyImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::multiply(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMultiply(const DenseTensorCells &exp,
+ const DenseTensorCells &lhs, const DenseTensorCells &rhs) {
+ assertMultiplyImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+};
+
+using DenseFixture = Fixture<DenseTensorBuilder>;
+
+
+template <typename FixtureType>
+void
+testTensorAdd(FixtureType &f)
+{
+ f.assertAdd({},{},{});
+ f.assertAdd({ {{{"x",0}}, 8} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, 5} });
+ f.assertAdd({ {{{"x",0}}, -2} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, -5} });
+ f.assertAdd({ {{{"x",0}}, 10}, {{{"x",1}}, 16} },
+ { {{{"x",0}}, 3}, {{{"x",1}}, 5} },
+ { {{{"x",0}}, 7}, {{{"x",1}}, 11} });
+ f.assertAdd({ {{{"x",0},{"y",0}}, 8} },
+ { {{{"x",0},{"y",0}}, 3} },
+ { {{{"x",0},{"y",0}}, 5} });
+}
+
+template <typename FixtureType>
+void
+testTensorSubtract(FixtureType &f)
+{
+ f.assertSubtract({},{},{});
+ f.assertSubtract({ {{{"x",0}}, -2} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, 5} });
+ f.assertSubtract({ {{{"x",0}}, 8} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, -5} });
+ f.assertSubtract({ {{{"x",0}}, -4}, {{{"x",1}}, -6} },
+ { {{{"x",0}}, 3}, {{{"x",1}}, 5} },
+ { {{{"x",0}}, 7}, {{{"x",1}}, 11} });
+ f.assertSubtract({ {{{"x",0},{"y",0}}, -2} },
+ { {{{"x",0},{"y",0}}, 3} },
+ { {{{"x",0},{"y",0}}, 5} });
+}
+
+template <typename FixtureType>
+void
+testTensorMin(FixtureType &f)
+{
+ f.assertMin({},{},{});
+ f.assertMin({ {{{"x",0}}, 3} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, 5} });
+ f.assertMin({ {{{"x",0}}, -5} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, -5} });
+ f.assertMin({ {{{"x",0}}, 3}, {{{"x",1}}, 5} },
+ { {{{"x",0}}, 3}, {{{"x",1}}, 5} },
+ { {{{"x",0}}, 7}, {{{"x",1}}, 11} });
+ f.assertMin({ {{{"x",0},{"y",0}}, 3} },
+ { {{{"x",0},{"y",0}}, 3} },
+ { {{{"x",0},{"y",0}}, 5} });
+}
+
+template <typename FixtureType>
+void
+testTensorMax(FixtureType &f)
+{
+ f.assertMax({},{},{});
+ f.assertMax({ {{{"x",0}}, 5} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, 5} });
+ f.assertMax({ {{{"x",0}}, 3} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, -5} });
+ f.assertMax({ {{{"x",0}}, 7}, {{{"x",1}}, 11} },
+ { {{{"x",0}}, 3}, {{{"x",1}}, 5} },
+ { {{{"x",0}}, 7}, {{{"x",1}}, 11} });
+ f.assertMax({ {{{"x",0},{"y",0}}, 5} },
+ { {{{"x",0},{"y",0}}, 3} },
+ { {{{"x",0},{"y",0}}, 5} });
+}
+
+template <typename FixtureType>
+void
+testTensorSum(FixtureType &f)
+{
+ f.assertSum(0.0, {});
+ f.assertSum(0.0, { {{{"x",0}}, 0} });
+ f.assertSum(3.0, { {{{"x",0}}, 3} });
+ f.assertSum(8.0, { {{{"x",0}}, 3}, {{{"x",1}}, 5} });
+ f.assertSum(-2.0, { {{{"x",0}}, 3}, {{{"x",1}}, -5} });
+}
+
+template <typename FixtureType>
+void
+testTensorMatch(FixtureType &f)
+{
+ f.assertMatch({}, {}, {});
+ f.assertMatch({ {{{"x",0}}, 15} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, 5} });
+ f.assertMatch({ {{{"x",0}}, 0} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, 0} });
+ f.assertMatch({ {{{"x",0}}, -15} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, -5} });
+ f.assertMatch({ {{{"x",0}, {"y",0}}, 39},
+ {{{"x",1}, {"y",0}}, 85},
+ {{{"x",0}, {"y",1}}, 133},
+ {{{"x",1}, {"y",1}}, 253} },
+ { {{{"x",0}, {"y",0}}, 3},
+ {{{"x",1}, {"y",0}}, 5},
+ {{{"x",0}, {"y",1}}, 7},
+ {{{"x",1}, {"y",1}}, 11} },
+ { {{{"x",0}, {"y",0}}, 13},
+ {{{"x",1}, {"y",0}}, 17},
+ {{{"x",0}, {"y",1}}, 19},
+ {{{"x",1}, {"y",1}}, 23} });
+}
+
+template <typename FixtureType>
+void
+testTensorMultiply(FixtureType &f)
+{
+ f.assertMultiply({}, {}, {});
+ f.assertMultiply({ {{{"x",0}}, 15} },
+ { {{{"x",0}}, 3} },
+ { {{{"x",0}}, 5} });
+ f.assertMultiply({ {{{"x",0}}, 21},
+ {{{"x",1}}, 55} },
+ { {{{"x",0}}, 3},
+ {{{"x",1}}, 5} },
+ { {{{"x",0}}, 7},
+ {{{"x",1}}, 11} });
+ f.assertMultiply({ {{{"x",0},{"y",0}}, 15} },
+ { {{{"x",0}}, 3} },
+ { {{{"y",0}}, 5} });
+ f.assertMultiply({ {{{"x",0},{"y",0}}, 21},
+ {{{"x",0},{"y",1}}, 33},
+ {{{"x",1},{"y",0}}, 35},
+ {{{"x",1},{"y",1}}, 55} },
+ { {{{"x",0}}, 3},
+ {{{"x",1}}, 5} },
+ { {{{"y",0}}, 7},
+ {{{"y",1}}, 11} });
+ f.assertMultiply({ {{{"x",0},{"y",0},{"z",0}}, 7},
+ {{{"x",0},{"y",0},{"z",1}}, 11},
+ {{{"x",0},{"y",1},{"z",0}}, 26},
+ {{{"x",0},{"y",1},{"z",1}}, 34},
+ {{{"x",1},{"y",0},{"z",0}}, 21},
+ {{{"x",1},{"y",0},{"z",1}}, 33},
+ {{{"x",1},{"y",1},{"z",0}}, 65},
+ {{{"x",1},{"y",1},{"z",1}}, 85} },
+ { {{{"x",0},{"y",0}}, 1},
+ {{{"x",0},{"y",1}}, 2},
+ {{{"x",1},{"y",0}}, 3},
+ {{{"x",1},{"y",1}}, 5} },
+ { {{{"y",0},{"z",0}}, 7},
+ {{{"y",0},{"z",1}}, 11},
+ {{{"y",1},{"z",0}}, 13},
+ {{{"y",1},{"z",1}}, 17} });
+}
+
+template <typename FixtureType>
+void
+testTensorMultiplePreservationOfDimensions(FixtureType &f)
+{
+ (void) f;
+}
+
+struct MyFunction : public CellFunction
+{
+ virtual double apply(double value) const override {
+ return value + 5;
+ }
+};
+
+template <typename FixtureType>
+void
+testTensorApply(FixtureType &f)
+{
+ f.assertApply({ {{{"x",0}}, 6}, {{{"x",1}}, 2} },
+ { {{{"x",0}}, 1}, {{{"x",1}}, -3} },
+ MyFunction());
+}
+
+template <typename FixtureType>
+void
+testTensorSumDimension(FixtureType &f)
+{
+ f.assertDimensionSum({ {{{"y",0}}, 4}, {{{"y",1}}, 12} },
+ { {{{"x",0},{"y",0}}, 1},
+ {{{"x",1},{"y",0}}, 3},
+ {{{"x",0},{"y",1}}, 5},
+ {{{"x",1},{"y",1}}, 7} }, "x");
+
+ f.assertDimensionSum({ {{{"x",0}}, 6}, {{{"x",1}}, 10} },
+ { {{{"x",0},{"y",0}}, 1},
+ {{{"x",1},{"y",0}}, 3},
+ {{{"x",0},{"y",1}}, 5},
+ {{{"x",1},{"y",1}}, 7} }, "y");
+ f.assertDimensionSum({ {{{"y",0}, {"z",0}}, 4},
+ {{{"y",1}, {"z",0}}, 12},
+ {{{"y",0}, {"z",1}}, 24},
+ {{{"y",1}, {"z",1}}, 36} },
+ { {{{"x",0},{"y",0}, {"z",0}}, 1},
+ {{{"x",1},{"y",0}, {"z",0}}, 3},
+ {{{"x",0},{"y",1}, {"z",0}}, 5},
+ {{{"x",1},{"y",1}, {"z",0}}, 7},
+ {{{"x",0},{"y",0}, {"z",1}}, 11},
+ {{{"x",1},{"y",0}, {"z",1}}, 13},
+ {{{"x",0},{"y",1}, {"z",1}}, 17},
+ {{{"x",1},{"y",1}, {"z",1}}, 19} }, "x");
+ f.assertDimensionSum({ {{{"x",0}, {"z",0}}, 6},
+ {{{"x",1}, {"z",0}}, 10},
+ {{{"x",0}, {"z",1}}, 28},
+ {{{"x",1}, {"z",1}}, 32} },
+ { {{{"x",0},{"y",0}, {"z",0}}, 1},
+ {{{"x",1},{"y",0}, {"z",0}}, 3},
+ {{{"x",0},{"y",1}, {"z",0}}, 5},
+ {{{"x",1},{"y",1}, {"z",0}}, 7},
+ {{{"x",0},{"y",0}, {"z",1}}, 11},
+ {{{"x",1},{"y",0}, {"z",1}}, 13},
+ {{{"x",0},{"y",1}, {"z",1}}, 17},
+ {{{"x",1},{"y",1}, {"z",1}}, 19} }, "y");
+ f.assertDimensionSum({ {{{"x",0}, {"y",0}}, 12},
+ {{{"x",1}, {"y",0}}, 16},
+ {{{"x",0}, {"y",1}}, 22},
+ {{{"x",1}, {"y",1}}, 26} },
+ { {{{"x",0},{"y",0}, {"z",0}}, 1},
+ {{{"x",1},{"y",0}, {"z",0}}, 3},
+ {{{"x",0},{"y",1}, {"z",0}}, 5},
+ {{{"x",1},{"y",1}, {"z",0}}, 7},
+ {{{"x",0},{"y",0}, {"z",1}}, 11},
+ {{{"x",1},{"y",0}, {"z",1}}, 13},
+ {{{"x",0},{"y",1}, {"z",1}}, 17},
+ {{{"x",1},{"y",1}, {"z",1}}, 19} }, "z");
+ f.assertDimensionSum({ {{{"x",0}}, 3} },
+ { {{{"x",0}}, 3} },
+ "y");
+ f.assertDimensionSum({ {{}, 3} },
+ { {{{"x",0}}, 3} },
+ "x");
+}
+
+template <typename FixtureType>
+void
+testAllTensorOperations(FixtureType &f)
+{
+ TEST_DO(testTensorAdd(f));
+ TEST_DO(testTensorSubtract(f));
+ TEST_DO(testTensorMin(f));
+ TEST_DO(testTensorMax(f));
+ TEST_DO(testTensorSum(f));
+ TEST_DO(testTensorMatch(f));
+ TEST_DO(testTensorMultiply(f));
+ TEST_DO(testTensorMultiplePreservationOfDimensions(f));
+ TEST_DO(testTensorApply(f));
+ TEST_DO(testTensorSumDimension(f));
+}
+
+TEST_F("test tensor operations for DenseTensor", DenseFixture)
+{
+ testAllTensorOperations(f);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/join_tensor_addresses/.gitignore b/vespalib/src/tests/tensor/join_tensor_addresses/.gitignore
new file mode 100644
index 00000000000..bcf856a9f59
--- /dev/null
+++ b/vespalib/src/tests/tensor/join_tensor_addresses/.gitignore
@@ -0,0 +1 @@
+vespalib_join_tensor_addresses_test_app
diff --git a/vespalib/src/tests/tensor/join_tensor_addresses/CMakeLists.txt b/vespalib/src/tests/tensor/join_tensor_addresses/CMakeLists.txt
new file mode 100644
index 00000000000..c03137947fe
--- /dev/null
+++ b/vespalib/src/tests/tensor/join_tensor_addresses/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_join_tensor_addresses_test_app
+ SOURCES
+ join_tensor_addresses_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_join_tensor_addresses_test_app COMMAND vespalib_join_tensor_addresses_test_app)
diff --git a/vespalib/src/tests/tensor/join_tensor_addresses/FILES b/vespalib/src/tests/tensor/join_tensor_addresses/FILES
new file mode 100644
index 00000000000..ad4ab2f6d87
--- /dev/null
+++ b/vespalib/src/tests/tensor/join_tensor_addresses/FILES
@@ -0,0 +1 @@
+join_tensor_addresses_test.cpp
diff --git a/vespalib/src/tests/tensor/join_tensor_addresses/join_tensor_addresses_test.cpp b/vespalib/src/tests/tensor/join_tensor_addresses/join_tensor_addresses_test.cpp
new file mode 100644
index 00000000000..f00cd23e322
--- /dev/null
+++ b/vespalib/src/tests/tensor/join_tensor_addresses/join_tensor_addresses_test.cpp
@@ -0,0 +1,317 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/stllike/hash_set.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include <vespa/vespalib/tensor/tensor_address_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_address.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_address_builder.h>
+#include <vespa/vespalib/tensor/tensor_address_element_iterator.h>
+#include <vespa/vespalib/tensor/dimensions_vector_iterator.h>
+#include <vespa/vespalib/tensor/join_tensor_addresses.h>
+
+using namespace vespalib::tensor;
+
+using TensorAddressMap = std::map<std::string, std::string>;
+using TensorAddressElementVec =
+ std::vector<std::pair<std::string, std::string>>;
+
+namespace vespalib
+{
+
+std::ostream &
+operator<<(std::ostream &out, const TensorAddressElementVec &vec)
+{
+ out << "{";
+ bool first = true;
+ for (const auto &elem : vec) {
+ if (!first) {
+ out << ",";
+ }
+ out << "{\"" << elem.first << "\",\"" << elem.second << "\"}";
+ first = false;
+ }
+ out << "}";
+ return out;
+};
+
+}
+
+
+class DummyAddressBuilder
+{
+ TensorAddressElementVec _elements;
+public:
+ void add(vespalib::stringref dimension, vespalib::stringref label)
+ {
+ _elements.emplace_back(dimension, label);
+ }
+
+ const TensorAddressElementVec &elements() const { return _elements; }
+ void clear() { }
+};
+
+
+template <class TensorAddressT> struct FixtureBase;
+
+template <> struct FixtureBase<TensorAddress>
+{
+ using AddressType = TensorAddress;
+ using AddressBuilderType = TensorAddressBuilder;
+
+ static TensorAddress create(TensorAddressBuilder &builder) {
+ return builder.build();
+ }
+};
+
+
+template <> struct FixtureBase<CompactTensorAddress>
+{
+ using AddressType = CompactTensorAddress;
+ using AddressBuilderType = CompactTensorAddressBuilder;
+
+ vespalib::Stash _stash;
+
+ CompactTensorAddress
+ create(CompactTensorAddressBuilder &builder)
+ {
+ CompactTensorAddressRef oldRef = builder.getAddressRef();
+ CompactTensorAddressRef newRef(oldRef, _stash);
+ CompactTensorAddress ret;
+ ret.deserializeFromSparseAddressRef(newRef);
+ return ret;
+ }
+};
+
+template <> struct FixtureBase<CompactTensorAddressRef>
+{
+ using AddressType = CompactTensorAddressRef;
+ using AddressBuilderType = CompactTensorAddressBuilder;
+
+ vespalib::Stash _stash;
+
+ CompactTensorAddressRef
+ create(CompactTensorAddressBuilder &builder)
+ {
+ CompactTensorAddressRef oldRef = builder.getAddressRef();
+ CompactTensorAddressRef newRef(oldRef, _stash);
+ return newRef;
+ }
+};
+
+template <class TensorAddressT> struct Fixture
+ : public FixtureBase<TensorAddressT>
+{
+ using Parent = FixtureBase<TensorAddressT>;
+ using AddressType = typename Parent::AddressType;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using Parent::create;
+
+ AddressType
+ create(const TensorAddressMap &address_in) {
+ AddressBuilderType builder;
+ for (auto &element : address_in) {
+ builder.add(element.first, element.second);
+ }
+ return create(builder);
+ }
+
+ void
+ verifyJoin3Way(bool exp,
+ const TensorAddressElementVec &expVec,
+ const DimensionsVector &commonDimensions,
+ const TensorAddressMap &lhsAddress_in,
+ const TensorAddressMap &rhsAddress_in)
+ {
+ AddressType expAddress = create(lhsAddress_in);
+ AddressType lhsAddress = create(lhsAddress_in);
+ AddressType rhsAddress = create(rhsAddress_in);
+ DummyAddressBuilder builder;
+ bool act = joinTensorAddresses<DummyAddressBuilder,
+ AddressType, AddressType>
+ (builder, commonDimensions, lhsAddress, rhsAddress);
+ EXPECT_EQUAL(exp, act);
+ if (exp) {
+ EXPECT_EQUAL(expVec, builder.elements());
+ }
+ }
+
+ void
+ verifyJoin2Way(bool exp,
+ const TensorAddressElementVec &expVec,
+ const DimensionsSet &commonDimensions,
+ const TensorAddressMap &lhsAddress_in,
+ const TensorAddressMap &rhsAddress_in)
+ {
+ AddressType expAddress = create(lhsAddress_in);
+ AddressType lhsAddress = create(lhsAddress_in);
+ AddressType rhsAddress = create(rhsAddress_in);
+ DummyAddressBuilder builder;
+ bool act = joinTensorAddresses<DummyAddressBuilder,
+ AddressType, AddressType>
+ (builder, commonDimensions, lhsAddress, rhsAddress);
+ EXPECT_EQUAL(exp, act);
+ if (exp) {
+ EXPECT_EQUAL(expVec, builder.elements());
+ }
+ }
+
+ void
+ verifyJoin(bool exp,
+ const TensorAddressElementVec &expVec,
+ const DimensionsVector &commonDimensions,
+ const TensorAddressMap &lhsAddress,
+ const TensorAddressMap &rhsAddress)
+ {
+ TEST_DO(verifyJoin3Way(exp, expVec, commonDimensions,
+ lhsAddress, rhsAddress));
+ DimensionsSet commonDimensionsSet(commonDimensions.begin(),
+ commonDimensions.end());
+ TEST_DO(verifyJoin2Way(exp, expVec, commonDimensionsSet,
+ lhsAddress, rhsAddress));
+ }
+
+ void
+ verifyJoin(const TensorAddressElementVec &expVec,
+ const DimensionsVector &commonDimensions,
+ const TensorAddressMap &lhsAddress,
+ const TensorAddressMap &rhsAddress)
+ {
+ verifyJoin(true, expVec, commonDimensions, lhsAddress, rhsAddress);
+ }
+
+ void
+ verifyJoinFailure(const DimensionsVector &commonDimensions,
+ const TensorAddressMap &lhsAddress,
+ const TensorAddressMap &rhsAddress)
+ {
+ verifyJoin(false, {}, commonDimensions, lhsAddress, rhsAddress);
+ }
+
+ void
+ verifyJoinFailureOnLabelMisMatch()
+ {
+ TEST_DO(verifyJoinFailure({"x", "y"},
+ {{"x", "1"}, {"y", "2"}},
+ {{"x", "1"}, {"y", "3"}}));
+ TEST_DO(verifyJoinFailure({"x", "y"},
+ {{"x", "1"}, {"y", "2"}},
+ {{"x", "2"}, {"y", "2"}}));
+ TEST_DO(verifyJoinFailure({"y"},
+ {{"x", "1"}, {"y", "2"}},
+ {{"y", "1"}, {"z", "3"}}));
+ TEST_DO(verifyJoinFailure({"y"},
+ {{"y", "2"}, {"z", "3"}},
+ {{"x", "1"}, {"y", "1"}}));
+ }
+
+ void
+ verityJoinFailureOnMissingDimension()
+ {
+ TEST_DO(verifyJoinFailure({"x", "y"},
+ {{"y", "2"}},
+ {{"x", "2"}, {"y", "2"}}));
+ TEST_DO(verifyJoinFailure({"x", "y"},
+ {{"x", "1"}, {"y", "2"}},
+ {{"y", "2"}}));
+ TEST_DO(verifyJoinFailure({"x", "y"},
+ {{"x", "1"}},
+ {{"x", "2"}, {"y", "2"}}));
+ TEST_DO(verifyJoinFailure({"x", "y"},
+ {{"x", "1"}, {"y", "2"}},
+ {{"x", "2"}}));
+ TEST_DO(verifyJoinFailure({"x", "y", "z"},
+ {{"x", "1"}, {"z", "3"}},
+ {{"x", "2"}, {"y", "2"}, {"z", "3"}}));
+ TEST_DO(verifyJoinFailure({"x", "y", "z"},
+ {{"x", "2"}, {"y", "2"}, {"z", "3"}},
+ {{"x", "1"}, {"z", "3"}}));
+ }
+
+ void
+ verifyJoinSuccessOnDisjunctDimensions()
+ {
+ TEST_DO(verifyJoin({}, {}, {}, {}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}, {"z", "3"}, {"zz", "4"}},
+ {},
+ {{"x", "1"}, {"y", "2"}},
+ {{"z", "3"}, {"zz", "4"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}, {"z", "3"}, {"zz", "4"}},
+ {},
+ {{"z", "3"}, {"zz", "4"}},
+ {{"x", "1"}, {"y", "2"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}, {"z", "3"}, {"zz", "4"}},
+ {},
+ {{"x", "1"}, {"z", "3"}},
+ {{"y", "2"}, {"zz", "4"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}},
+ {},
+ {{"x", "1"}, {"y", "2"}},
+ {}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}},
+ {},
+ {},
+ {{"x", "1"}, {"y", "2"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"z", "3"}}, {"y"},
+ {{"x", "1"}},
+ {{"z", "3"}}));
+ TEST_DO(verifyJoin( {{"x", "1"}, {"z", "3"}}, {"y"},
+ {{"z", "3"}},
+ {{"x", "1"}}));
+ }
+
+ void
+ verifyJoinSuccessOnOverlappingDimensions()
+ {
+ TEST_DO(verifyJoin({{"x", "1"}}, {"x"},
+ {{"x", "1"}}, {{"x", "1"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}, {"z", "3"}},
+ {"x", "z"},
+ {{"x", "1"}, {"y", "2"}, {"z", "3"}},
+ {{"x", "1"}, {"z", "3"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}, {"z", "3"}},
+ {"x", "z"},
+ {{"x", "1"}, {"y", "2"}, {"z", "3"}},
+ {{"x", "1"}, {"z", "3"}}));
+ TEST_DO(verifyJoin( {{"x", "1"}, {"y", "2"}}, {"x", "y"},
+ {{"x", "1"}, {"y", "2"}},
+ {{"x", "1"}, {"y", "2"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}, {"z", "3"}}, {"y"},
+ {{"x", "1"}, {"y", "2"}},
+ {{"y", "2"}, {"z", "3"}}));
+ TEST_DO(verifyJoin({{"x", "1"}, {"y", "2"}, {"z", "3"}}, {"y"},
+ {{"y", "2"}, {"z", "3"}},
+ {{"x", "1"}, {"y", "2"}}));
+ }
+
+ void
+ verifyJoin()
+ {
+ verifyJoinSuccessOnDisjunctDimensions();
+ verifyJoinSuccessOnOverlappingDimensions();
+ verifyJoinFailureOnLabelMisMatch();
+ verityJoinFailureOnMissingDimension();
+ }
+
+};
+
+
+TEST_F("Test that Tensor address can be joined", Fixture<TensorAddress>)
+{
+ f.verifyJoin();
+}
+
+TEST_F("Test that compact Tensor address can be joined",
+ Fixture<CompactTensorAddress>)
+{
+ f.verifyJoin();
+}
+
+
+TEST_F("Test that compact Tensor address ref can be joined",
+ Fixture<CompactTensorAddressRef>)
+{
+ f.verifyJoin();
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/simple_tensor_builder/.gitignore b/vespalib/src/tests/tensor/simple_tensor_builder/.gitignore
new file mode 100644
index 00000000000..b8e9dc6dfc5
--- /dev/null
+++ b/vespalib/src/tests/tensor/simple_tensor_builder/.gitignore
@@ -0,0 +1 @@
+vespalib_simple_tensor_builder_test_app
diff --git a/vespalib/src/tests/tensor/simple_tensor_builder/CMakeLists.txt b/vespalib/src/tests/tensor/simple_tensor_builder/CMakeLists.txt
new file mode 100644
index 00000000000..e41866c9589
--- /dev/null
+++ b/vespalib/src/tests/tensor/simple_tensor_builder/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_simple_tensor_builder_test_app
+ SOURCES
+ simple_tensor_builder_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_simple_tensor_builder_test_app COMMAND vespalib_simple_tensor_builder_test_app)
diff --git a/vespalib/src/tests/tensor/simple_tensor_builder/FILES b/vespalib/src/tests/tensor/simple_tensor_builder/FILES
new file mode 100644
index 00000000000..e8940ccf5ef
--- /dev/null
+++ b/vespalib/src/tests/tensor/simple_tensor_builder/FILES
@@ -0,0 +1 @@
+simple_tensor_builder_test.cpp
diff --git a/vespalib/src/tests/tensor/simple_tensor_builder/simple_tensor_builder_test.cpp b/vespalib/src/tests/tensor/simple_tensor_builder/simple_tensor_builder_test.cpp
new file mode 100644
index 00000000000..1181d56b12b
--- /dev/null
+++ b/vespalib/src/tests/tensor/simple_tensor_builder/simple_tensor_builder_test.cpp
@@ -0,0 +1,52 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor_builder.h>
+
+using namespace vespalib::tensor;
+
+void
+assertCellValue(double expValue, const TensorAddress &address, const SimpleTensor::Cells &cells)
+{
+ auto itr = cells.find(address);
+ EXPECT_FALSE(itr == cells.end());
+ EXPECT_EQUAL(expValue, itr->second);
+}
+
+TEST("require that tensor can be constructed")
+{
+ SimpleTensorBuilder builder;
+ builder.add_label(builder.define_dimension("a"), "1").
+ add_label(builder.define_dimension("b"), "2").add_cell(10).
+ add_label(builder.define_dimension("c"), "3").
+ add_label(builder.define_dimension("d"), "4").add_cell(20);
+ Tensor::UP tensor = builder.build();
+ const SimpleTensor &simpleTensor = dynamic_cast<const SimpleTensor &>(*tensor);
+ const SimpleTensor::Cells &cells = simpleTensor.cells();
+ EXPECT_EQUAL(2u, cells.size());
+ assertCellValue(10, TensorAddress({{"a","1"},{"b","2"}}), cells);
+ assertCellValue(20, TensorAddress({{"c","3"},{"d","4"}}), cells);
+}
+
+TEST("require that dimensions are extracted")
+{
+ SimpleTensorBuilder builder;
+ builder.define_dimension("c");
+ builder.define_dimension("a");
+ builder.define_dimension("b");
+ builder.
+ add_label(builder.define_dimension("a"), "1").
+ add_label(builder.define_dimension("b"), "2").add_cell(10).
+ add_label(builder.define_dimension("b"), "3").
+ add_label(builder.define_dimension("c"), "4").add_cell(20);
+ Tensor::UP tensor = builder.build();
+ const SimpleTensor &simpleTensor = dynamic_cast<const SimpleTensor &>(*tensor);
+ const SimpleTensor::Dimensions &dims = simpleTensor.dimensions();
+ EXPECT_EQUAL(3u, dims.size());
+ EXPECT_EQUAL("a", dims[0]);
+ EXPECT_EQUAL("b", dims[1]);
+ EXPECT_EQUAL("c", dims[2]);
+ EXPECT_EQUAL("tensor(a{},b{},c{})", simpleTensor.getType().toSpec());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor/.gitignore b/vespalib/src/tests/tensor/tensor/.gitignore
new file mode 100644
index 00000000000..5682a3d5a74
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_test_app
diff --git a/vespalib/src/tests/tensor/tensor/CMakeLists.txt b/vespalib/src/tests/tensor/tensor/CMakeLists.txt
new file mode 100644
index 00000000000..6e76b1a322d
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_test_app
+ SOURCES
+ tensor_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_test_app COMMAND vespalib_tensor_test_app)
diff --git a/vespalib/src/tests/tensor/tensor/FILES b/vespalib/src/tests/tensor/tensor/FILES
new file mode 100644
index 00000000000..6ece9b360b5
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor/FILES
@@ -0,0 +1 @@
+tensor_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor/tensor_test.cpp b/vespalib/src/tests/tensor/tensor/tensor_test.cpp
new file mode 100644
index 00000000000..df80e6cbf18
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor/tensor_test.cpp
@@ -0,0 +1,49 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor.h>
+#include <vespa/vespalib/tensor/tensor_factory.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor_builder.h>
+
+using namespace vespalib::tensor;
+
+namespace
+{
+
+SimpleTensor::UP createTensor(const TensorCells &cells)
+{
+ SimpleTensorBuilder builder;
+ return SimpleTensor::UP(static_cast<SimpleTensor *>
+ (TensorFactory::create(cells, builder).release()));
+}
+
+}
+
+void
+assertCellValue(double expValue, const TensorAddress &address, const SimpleTensor::Cells &cells)
+{
+ auto itr = cells.find(address);
+ EXPECT_FALSE(itr == cells.end());
+ EXPECT_EQUAL(expValue, itr->second);
+}
+
+TEST("require that tensor can be constructed")
+{
+ SimpleTensor::UP tensor = createTensor({ {{{"a","1"},{"b","2"}},10}, {{{"c","3"},{"d","4"}},20} });
+ const SimpleTensor::Cells &cells = tensor->cells();
+ EXPECT_EQUAL(2u, cells.size());
+ assertCellValue(10, TensorAddress({{"a","1"},{"b","2"}}), cells);
+ assertCellValue(20, TensorAddress({{"c","3"},{"d","4"}}), cells);
+}
+
+TEST("require that dimensions are extracted")
+{
+ SimpleTensor::UP tensor = createTensor({ {{{"a","1"},{"b","2"}},10}, {{{"b","3"},{"c","4"}},20} });
+ const SimpleTensor::Dimensions &dims = tensor->dimensions();
+ EXPECT_EQUAL(3u, dims.size());
+ EXPECT_EQUAL("a", dims[0]);
+ EXPECT_EQUAL("b", dims[1]);
+ EXPECT_EQUAL("c", dims[2]);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_address/.gitignore b/vespalib/src/tests/tensor/tensor_address/.gitignore
new file mode 100644
index 00000000000..189adb8710b
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_address_test_app
diff --git a/vespalib/src/tests/tensor/tensor_address/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_address/CMakeLists.txt
new file mode 100644
index 00000000000..ecd3bf8898b
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_address_test_app
+ SOURCES
+ tensor_address_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_address_test_app COMMAND vespalib_tensor_address_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_address/FILES b/vespalib/src/tests/tensor/tensor_address/FILES
new file mode 100644
index 00000000000..1d7d1c533a0
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address/FILES
@@ -0,0 +1 @@
+tensor_address_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor_address/tensor_address_test.cpp b/vespalib/src/tests/tensor/tensor_address/tensor_address_test.cpp
new file mode 100644
index 00000000000..70f33bdf0c4
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address/tensor_address_test.cpp
@@ -0,0 +1,39 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+
+using namespace vespalib::tensor;
+
+void
+assertSortOrder(const TensorAddress::Elements &exp,
+ const TensorAddress::Elements &input)
+{
+ TensorAddress address(input);
+ EXPECT_EQUAL(exp, address.elements());
+}
+
+TEST("require that elements are sorted in constructor")
+{
+ assertSortOrder({{"a","1"},{"b","1"},{"c","1"}},
+ {{"c","1"},{"a","1"},{"b","1"}});
+}
+
+TEST("require that we can check whether a dimension is present")
+{
+ TensorAddress address({{"a","1"},{"b","1"}});
+ EXPECT_TRUE(address.hasDimension("a"));
+ EXPECT_TRUE(address.hasDimension("b"));
+ EXPECT_FALSE(address.hasDimension("c"));
+}
+
+TEST("require that tensor address sort order is defined")
+{
+ TensorAddress::Elements single = {{"a","1"}};
+ EXPECT_LESS(TensorAddress(single),
+ TensorAddress({{"a","1"},{"b","1"}}));
+ EXPECT_LESS(TensorAddress({{"a","1"},{"b","1"}}),
+ TensorAddress({{"a","1"},{"c","1"}}));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_address_element_iterator/.gitignore b/vespalib/src/tests/tensor/tensor_address_element_iterator/.gitignore
new file mode 100644
index 00000000000..c28cf0c86f2
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address_element_iterator/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_address_element_iterator_test_app
diff --git a/vespalib/src/tests/tensor/tensor_address_element_iterator/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_address_element_iterator/CMakeLists.txt
new file mode 100644
index 00000000000..fd923f3ce4c
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address_element_iterator/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_address_element_iterator_test_app
+ SOURCES
+ tensor_address_element_iterator_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_address_element_iterator_test_app COMMAND vespalib_tensor_address_element_iterator_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_address_element_iterator/FILES b/vespalib/src/tests/tensor/tensor_address_element_iterator/FILES
new file mode 100644
index 00000000000..b185a25973e
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address_element_iterator/FILES
@@ -0,0 +1 @@
+tensor_address_element_iterator_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor_address_element_iterator/tensor_address_element_iterator_test.cpp b/vespalib/src/tests/tensor/tensor_address_element_iterator/tensor_address_element_iterator_test.cpp
new file mode 100644
index 00000000000..95fe166937d
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_address_element_iterator/tensor_address_element_iterator_test.cpp
@@ -0,0 +1,343 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/stllike/hash_set.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include <vespa/vespalib/tensor/tensor_address_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_address.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_address_builder.h>
+#include <vespa/vespalib/tensor/tensor_address_element_iterator.h>
+
+using namespace vespalib::tensor;
+
+using TensorAddressMap = std::map<std::string, std::string>;
+using TensorAddressElementVec =
+ std::vector<std::pair<std::string, std::string>>;
+
+namespace vespalib
+{
+
+std::ostream &
+operator<<(std::ostream &out, const TensorAddressElementVec &vec)
+{
+ out << "{";
+ bool first = true;
+ for (const auto &elem : vec) {
+ if (!first) {
+ out << ",";
+ }
+ out << "{\"" << elem.first << "\",\"" << elem.second << "\"}";
+ first = false;
+ }
+ out << "}";
+ return out;
+};
+
+}
+
+
+class DummyAddressBuilder
+{
+ TensorAddressElementVec _elements;
+public:
+ void add(vespalib::stringref dimension, vespalib::stringref label)
+ {
+ _elements.emplace_back(dimension, label);
+ }
+
+ const TensorAddressElementVec &elements() const { return _elements; }
+};
+
+
+template <class TensorAddressT> struct FixtureBase;
+
+template <> struct FixtureBase<TensorAddress>
+{
+ using AddressType = TensorAddress;
+ using AddressBuilderType = TensorAddressBuilder;
+
+ static TensorAddress create(TensorAddressBuilder &builder) {
+ return builder.build();
+ }
+};
+
+
+template <> struct FixtureBase<CompactTensorAddress>
+{
+ using AddressType = CompactTensorAddress;
+ using AddressBuilderType = CompactTensorAddressBuilder;
+
+ vespalib::Stash _stash;
+
+ CompactTensorAddress
+ create(CompactTensorAddressBuilder &builder)
+ {
+ CompactTensorAddressRef oldRef = builder.getAddressRef();
+ CompactTensorAddressRef newRef(oldRef, _stash);
+ CompactTensorAddress ret;
+ ret.deserializeFromSparseAddressRef(newRef);
+ return ret;
+ }
+};
+
+template <> struct FixtureBase<CompactTensorAddressRef>
+{
+ using AddressType = CompactTensorAddressRef;
+ using AddressBuilderType = CompactTensorAddressBuilder;
+
+ vespalib::Stash _stash;
+
+ CompactTensorAddressRef
+ create(CompactTensorAddressBuilder &builder)
+ {
+ CompactTensorAddressRef oldRef = builder.getAddressRef();
+ CompactTensorAddressRef newRef(oldRef, _stash);
+ return newRef;
+ }
+};
+
+template <class TensorAddressT> struct Fixture
+ : public FixtureBase<TensorAddressT>
+{
+ using Parent = FixtureBase<TensorAddressT>;
+ using AddressType = typename Parent::AddressType;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using Parent::create;
+
+ AddressType
+ create(const TensorAddressMap &address_in) {
+ AddressBuilderType builder;
+ for (auto &element : address_in) {
+ builder.add(element.first, element.second);
+ }
+ return create(builder);
+ }
+
+ void
+ verifyPlainIterate(const TensorAddressMap &address_in)
+ {
+ AddressType address = create(address_in);
+ TensorAddressElementIterator<AddressType> itr(address);
+ for (auto &element : address_in) {
+ EXPECT_TRUE(itr.valid());
+ EXPECT_EQUAL(element.first, itr.dimension());
+ EXPECT_EQUAL(element.second, itr.label());
+ itr.next();
+ }
+ EXPECT_FALSE(itr.valid());
+ }
+
+
+ void
+ verifyPlainIterate()
+ {
+ TEST_DO(verifyPlainIterate({}));
+ TEST_DO(verifyPlainIterate({{"a", "1"}}));
+ TEST_DO(verifyPlainIterate({{"a", "1"}, {"b", "2"}}));
+ }
+
+ void
+ verifyBeforeDimension(const TensorAddressMap &lhsAddress_in,
+ const TensorAddressMap &rhsAddress_in,
+ bool exp)
+ {
+ AddressType lhsAddress = create(lhsAddress_in);
+ TensorAddressElementIterator<AddressType> lhsItr(lhsAddress);
+ AddressType rhsAddress = create(rhsAddress_in);
+ TensorAddressElementIterator<AddressType> rhsItr(rhsAddress);
+ EXPECT_EQUAL(exp, lhsItr.beforeDimension(rhsItr));
+ }
+
+ void
+ verifyBeforeDimension() {
+ TEST_DO(verifyBeforeDimension({}, {}, false));
+ TEST_DO(verifyBeforeDimension({}, {{"x", "1"}}, false));
+ TEST_DO(verifyBeforeDimension({{"x", "1"}}, {}, true));
+ TEST_DO(verifyBeforeDimension({{"x", "1"}}, {{"x", "2"}}, false));
+ TEST_DO(verifyBeforeDimension({{"x", "1"}}, {{"y", "2"}}, true));
+ TEST_DO(verifyBeforeDimension({{"y", "1"}}, {{"x", "2"}}, false));
+ }
+
+ void
+ verifyAtDimension(const TensorAddressMap &address_in,
+ vespalib::stringref dimension,
+ bool exp)
+ {
+ AddressType address = create(address_in);
+ TensorAddressElementIterator<AddressType> itr(address);
+ EXPECT_EQUAL(exp, itr.atDimension(dimension));
+ }
+
+ void
+ verifyAtDimension()
+ {
+ TEST_DO(verifyAtDimension({}, "x", false));
+ TEST_DO(verifyAtDimension({{"x", "1"}}, "x", true));
+ TEST_DO(verifyAtDimension({{"x", "1"}}, "y", false));
+ TEST_DO(verifyAtDimension({{"y", "1"}}, "x", false));
+ TEST_DO(verifyAtDimension({{"y", "1"}}, "y", true));
+ }
+
+ void
+ verifyAddElements(const TensorAddressMap &lhsAddress_in,
+ const TensorAddressMap &rhsAddress_in,
+ const TensorAddressElementVec &exp)
+ {
+ AddressType lhsAddress = create(lhsAddress_in);
+ TensorAddressElementIterator<AddressType> lhsItr(lhsAddress);
+ AddressType rhsAddress = create(rhsAddress_in);
+ TensorAddressElementIterator<AddressType> rhsItr(rhsAddress);
+ DummyAddressBuilder builder;
+ lhsItr.addElements(builder, rhsItr);
+ EXPECT_EQUAL(exp, builder.elements());
+ }
+
+ void verifyAddElements(const TensorAddressMap &address_in,
+ const TensorAddressElementVec &exp)
+ {
+ AddressType address = create(address_in);
+ TensorAddressElementIterator<AddressType> itr(address);
+ DummyAddressBuilder builder;
+ itr.addElements(builder);
+ EXPECT_EQUAL(exp, builder.elements());
+ }
+
+ void verifyAddElements(const TensorAddressMap &address_in,
+ const DimensionsSet &dimensions,
+ bool exp,
+ const TensorAddressElementVec &expVec)
+ {
+ AddressType address = create(address_in);
+ TensorAddressElementIterator<AddressType> itr(address);
+ DummyAddressBuilder builder;
+ EXPECT_EQUAL(exp, itr.addElements(builder, dimensions));
+ EXPECT_EQUAL(expVec, builder.elements());
+ }
+
+ void verifyAddElements(const TensorAddressMap &lhsAddress_in,
+ const TensorAddressMap &rhsAddress_in,
+ const DimensionsSet &dimensions,
+ bool exp,
+ const TensorAddressElementVec &expVec)
+ {
+ AddressType lhsAddress = create(lhsAddress_in);
+ TensorAddressElementIterator<AddressType> lhsItr(lhsAddress);
+ AddressType rhsAddress = create(rhsAddress_in);
+ TensorAddressElementIterator<AddressType> rhsItr(rhsAddress);
+ DummyAddressBuilder builder;
+ ASSERT_TRUE(lhsItr.beforeDimension(rhsItr));
+ EXPECT_EQUAL(exp, lhsItr.addElements(builder, dimensions, rhsItr));
+ EXPECT_EQUAL(expVec, builder.elements());
+ }
+
+ void
+ verifyAddElements()
+ {
+ // Stop according to rhs iterator
+ TEST_DO(verifyAddElements({}, {}, {}));
+ TEST_DO(verifyAddElements({{"x", "1"}}, {}, {{"x", "1"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}}, {{"x", "1"}}, {}));
+ TEST_DO(verifyAddElements({{"x", "1"}}, {{"y", "1"}}, {{"x", "1"}}));
+ TEST_DO(verifyAddElements({{"y", "1"}}, {{"x", "1"}}, {}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}}, {{"z", "1"}},
+ {{"x", "1"}, {"y", "2"}}));
+ // Pass through everything
+ TEST_DO(verifyAddElements({}, {}));
+ TEST_DO(verifyAddElements({{"x", "1"}}, {{"x", "1"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}},
+ {{"x", "1"}, {"y", "2"}}));
+ // Filter on dimension set
+ TEST_DO(verifyAddElements({}, {}, true, {}));
+ TEST_DO(verifyAddElements({{"x", "1"}}, {}, true, {{"x", "1"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}}, {}, true,
+ {{"x", "1"}, {"y", "2"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}}, {"y"}, false,
+ {{"x", "1"}}));
+ // Filter on dimension set and stop according to rhs iterator
+ TEST_DO(verifyAddElements({{"x", "1"}}, {}, {}, true, {{"x", "1"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}}, {}, {}, true,
+ {{"x", "1"}, {"y", "2"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}}, {{"y", "2"}}, {},
+ true, {{"x", "1"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}}, {{"y", "2"}}, {"y"},
+ true, {{"x", "1"}}));
+ TEST_DO(verifyAddElements({{"x", "1"}, {"y", "2"}}, {{"y", "2"}}, {"x"},
+ false, {}));
+ }
+};
+
+
+TEST_F("Test that Tensor address can be iterated", Fixture<TensorAddress>)
+{
+ f.verifyPlainIterate();
+}
+
+TEST_F("Test that compact Tensor address can be iterated",
+ Fixture<CompactTensorAddress>)
+{
+ f.verifyPlainIterate();
+}
+
+
+TEST_F("Test that compact Tensor address ref can be iterated",
+ Fixture<CompactTensorAddressRef>)
+{
+ f.verifyPlainIterate();
+}
+
+TEST_F("Test that Tensor address works with beforeDimension",
+ Fixture<TensorAddress>)
+{
+ f.verifyBeforeDimension();
+}
+
+TEST_F("Test that compact Tensor address works with beforeDimension",
+ Fixture<CompactTensorAddress>)
+{
+ f.verifyBeforeDimension();
+}
+
+TEST_F("Test that compat Tensor address ref works with beforeDimension",
+ Fixture<CompactTensorAddressRef>)
+{
+ f.verifyBeforeDimension();
+}
+
+TEST_F("Test that Tensor address works with atDimension",
+ Fixture<TensorAddress>)
+{
+ f.verifyAtDimension();
+}
+
+TEST_F("Test that compact Tensor address works with atDimension",
+ Fixture<CompactTensorAddress>)
+{
+ f.verifyAtDimension();
+}
+
+TEST_F("Test that compat Tensor address ref works with atDimension",
+ Fixture<CompactTensorAddressRef>)
+{
+ f.verifyAtDimension();
+}
+
+TEST_F("Test that Tensor address works with addElements",
+ Fixture<TensorAddress>)
+{
+ f.verifyAddElements();
+}
+
+TEST_F("Test that compact Tensor address works with addElements",
+ Fixture<CompactTensorAddress>)
+{
+ f.verifyAddElements();
+}
+
+TEST_F("Test that compat Tensor address ref works with addElements",
+ Fixture<CompactTensorAddressRef>)
+{
+ f.verifyAddElements();
+}
+
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_function/.gitignore b/vespalib/src/tests/tensor/tensor_function/.gitignore
new file mode 100644
index 00000000000..9dff11e518c
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_function/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_function_test_app
diff --git a/vespalib/src/tests/tensor/tensor_function/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_function/CMakeLists.txt
new file mode 100644
index 00000000000..944fa7d28f5
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_function/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_function_test_app
+ SOURCES
+ tensor_function_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_function_test_app COMMAND vespalib_tensor_function_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_function/tensor_function_test.cpp b/vespalib/src/tests/tensor/tensor_function/tensor_function_test.cpp
new file mode 100644
index 00000000000..4d64ad74209
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_function/tensor_function_test.cpp
@@ -0,0 +1,170 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/tensor_type.h>
+#include <vespa/vespalib/tensor/tensor_function.h>
+
+using namespace vespalib::tensor;
+
+// Evaluation of tensor functions is tested in the 'tensor operations'
+// test. This test checks type resolving and will be extended with
+// inspectability of tensor functions when the implementation is
+// extended to support it.
+
+// Note: The 'tensor type' test verifies how tensor type dimensions
+// may be combined. Specifically the fact that common dense dimensions
+// must have the same size.
+
+function::Node_UP invalid_value() {
+ return function::input(TensorType::invalid(), 0);
+}
+
+function::Node_UP number_value() {
+ return function::sum(function::input(TensorType::sparse({}), 0));
+}
+
+function::Node_UP sparse_value(const std::vector<vespalib::string> &arg) {
+ return function::input(TensorType::sparse(arg), 0);
+}
+
+function::Node_UP dense_value(std::vector<TensorType::Dimension> arg) {
+ return function::input(TensorType::dense(std::move(arg)), 0);
+}
+
+TensorAddress address(const TensorAddress::Elements &elems) {
+ return TensorAddress(elems);
+}
+
+TEST("require that helper functions produce appropriate types") {
+ EXPECT_TRUE(!invalid_value()->type().is_valid());
+ EXPECT_EQUAL(number_value()->type(), TensorType::number());
+ EXPECT_EQUAL(sparse_value({"x", "y"})->type(), TensorType::sparse({"x", "y"}));
+ EXPECT_EQUAL(dense_value({{"x", 10}})->type(), TensorType::dense({{"x", 10}}));
+}
+
+TEST("require that input tensors preserves type") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y"}),
+ function::input(TensorType::sparse({"x", "y"}), 0)->type());
+ EXPECT_EQUAL(TensorType::dense({{"x", 10}}),
+ function::input(TensorType::dense({{"x", 10}}), 0)->type());
+}
+
+TEST("require that input tensors with non-tensor types are invalid") {
+ EXPECT_TRUE(!function::input(TensorType::invalid(), 0)->type().is_valid());
+ EXPECT_TRUE(!function::input(TensorType::number(), 0)->type().is_valid());
+}
+
+TEST("require that sum of tensor gives number as result") {
+ EXPECT_EQUAL(TensorType::number(), function::sum(sparse_value({}))->type());
+ EXPECT_EQUAL(TensorType::number(), function::sum(dense_value({}))->type());
+}
+
+TEST("require that dimension sum removes the summed dimension") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y"}),
+ function::dimension_sum(sparse_value({"x", "y", "z"}), "z")->type());
+ EXPECT_EQUAL(TensorType::dense({{"y", 10}}),
+ function::dimension_sum(dense_value({{"x", 10}, {"y", 10}}), "x")->type());
+}
+
+TEST("require that dimension sum over non-existing dimension is invalid") {
+ EXPECT_TRUE(!function::dimension_sum(sparse_value({"x", "y", "z"}), "w")->type().is_valid());
+ EXPECT_TRUE(!function::dimension_sum(dense_value({{"x", 10}, {"y", 10}}), "z")->type().is_valid());
+}
+
+TEST("require that apply preserves tensor type") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y"}),
+ function::apply(sparse_value({"x", "y"}), 0)->type());
+ EXPECT_EQUAL(TensorType::dense({{"x", 10}}),
+ function::apply(dense_value({{"x", 10}}), 0)->type());
+}
+
+TEST("require that tensor add result has union of input dimensions") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y", "z"}),
+ function::add(sparse_value({"x", "y"}),
+ sparse_value({"y", "z"}))->type());
+ EXPECT_EQUAL(TensorType::sparse({{"x", 10}, {"y", 10}, {"z", 10}}),
+ function::add(sparse_value({{"x", 10}, {"y", 10}}),
+ sparse_value({{"y", 10}, {"z", 10}}))->type());
+}
+
+TEST("require that tensor subtract result has union of input dimensions") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y", "z"}),
+ function::subtract(sparse_value({"x", "y"}),
+ sparse_value({"y", "z"}))->type());
+ EXPECT_EQUAL(TensorType::sparse({{"x", 10}, {"y", 10}, {"z", 10}}),
+ function::subtract(sparse_value({{"x", 10}, {"y", 10}}),
+ sparse_value({{"y", 10}, {"z", 10}}))->type());
+}
+
+TEST("require that tensor multiply result has union of input dimensions") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y", "z"}),
+ function::multiply(sparse_value({"x", "y"}),
+ sparse_value({"y", "z"}))->type());
+ EXPECT_EQUAL(TensorType::sparse({{"x", 10}, {"y", 10}, {"z", 10}}),
+ function::multiply(sparse_value({{"x", 10}, {"y", 10}}),
+ sparse_value({{"y", 10}, {"z", 10}}))->type());
+}
+
+TEST("require that tensor min result has union of input dimensions") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y", "z"}),
+ function::min(sparse_value({"x", "y"}),
+ sparse_value({"y", "z"}))->type());
+ EXPECT_EQUAL(TensorType::sparse({{"x", 10}, {"y", 10}, {"z", 10}}),
+ function::min(sparse_value({{"x", 10}, {"y", 10}}),
+ sparse_value({{"y", 10}, {"z", 10}}))->type());
+}
+
+TEST("require that tensor max result has union of input dimensions") {
+ EXPECT_EQUAL(TensorType::sparse({"x", "y", "z"}),
+ function::max(sparse_value({"x", "y"}),
+ sparse_value({"y", "z"}))->type());
+ EXPECT_EQUAL(TensorType::sparse({{"x", 10}, {"y", 10}, {"z", 10}}),
+ function::max(sparse_value({{"x", 10}, {"y", 10}}),
+ sparse_value({{"y", 10}, {"z", 10}}))->type());
+}
+
+TEST("require that tensor match result has intersection of input dimensions") {
+ EXPECT_EQUAL(TensorType::sparse({"y"}),
+ function::match(sparse_value({"x", "y"}),
+ sparse_value({"y", "z"}))->type());
+ EXPECT_EQUAL(TensorType::sparse({{"y", 10}}),
+ function::match(sparse_value({{"x", 10}, {"y", 10}}),
+ sparse_value({{"y", 10}, {"z", 10}}))->type());
+}
+
+TEST("require that sparse and dense tensors cannot be directly combined") {
+ EXPECT_TRUE(!function::add(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::add(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::subtract(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::subtract(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::multiply(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::multiply(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::min(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::min(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::max(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::max(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::match(sparse_value({}), dense_value({}))->type().is_valid());
+ EXPECT_TRUE(!function::match(sparse_value({}), dense_value({}))->type().is_valid());
+}
+
+TEST("require that tensor operations on non-tensor types are invalid") {
+ EXPECT_TRUE(!function::sum(invalid_value())->type().is_valid());
+ EXPECT_TRUE(!function::sum(number_value())->type().is_valid());
+ EXPECT_TRUE(!function::dimension_sum(invalid_value(), "x")->type().is_valid());
+ EXPECT_TRUE(!function::dimension_sum(number_value(), "x")->type().is_valid());
+ EXPECT_TRUE(!function::apply(invalid_value(), 0)->type().is_valid());
+ EXPECT_TRUE(!function::apply(number_value(), 0)->type().is_valid());
+ EXPECT_TRUE(!function::add(invalid_value(), invalid_value())->type().is_valid());
+ EXPECT_TRUE(!function::add(number_value(), number_value())->type().is_valid());
+ EXPECT_TRUE(!function::subtract(invalid_value(), invalid_value())->type().is_valid());
+ EXPECT_TRUE(!function::subtract(number_value(), number_value())->type().is_valid());
+ EXPECT_TRUE(!function::multiply(invalid_value(), invalid_value())->type().is_valid());
+ EXPECT_TRUE(!function::multiply(number_value(), number_value())->type().is_valid());
+ EXPECT_TRUE(!function::min(invalid_value(), invalid_value())->type().is_valid());
+ EXPECT_TRUE(!function::min(number_value(), number_value())->type().is_valid());
+ EXPECT_TRUE(!function::max(invalid_value(), invalid_value())->type().is_valid());
+ EXPECT_TRUE(!function::max(number_value(), number_value())->type().is_valid());
+ EXPECT_TRUE(!function::match(invalid_value(), invalid_value())->type().is_valid());
+ EXPECT_TRUE(!function::match(number_value(), number_value())->type().is_valid());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_mapper/.gitignore b/vespalib/src/tests/tensor/tensor_mapper/.gitignore
new file mode 100644
index 00000000000..8a312ff3157
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_mapper/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_mapper_test_app
diff --git a/vespalib/src/tests/tensor/tensor_mapper/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_mapper/CMakeLists.txt
new file mode 100644
index 00000000000..62216540417
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_mapper/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_mapper_test_app
+ SOURCES
+ tensor_mapper_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_mapper_test_app COMMAND vespalib_tensor_mapper_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_mapper/FILES b/vespalib/src/tests/tensor/tensor_mapper/FILES
new file mode 100644
index 00000000000..8678f175be1
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_mapper/FILES
@@ -0,0 +1 @@
+tensor_mapper_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp b/vespalib/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp
new file mode 100644
index 00000000000..190ac0bf015
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp
@@ -0,0 +1,226 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/tensor_type.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor_builder.h>
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/tensor/tensor_factory.h>
+#include <vespa/vespalib/tensor/tensor_function.h>
+#include <vespa/vespalib/tensor/tensor_mapper.h>
+#include <vespa/vespalib/tensor/default_tensor.h>
+#include <ostream>
+
+using namespace vespalib::tensor;
+
+namespace vespalib {
+namespace tensor {
+
+static bool operator==(const Tensor &lhs, const Tensor &rhs)
+{
+ return lhs.equals(rhs);
+}
+
+}
+}
+
+template <typename BuilderType>
+bool defaultBuilder() { return false; }
+
+template <>
+bool defaultBuilder<DefaultTensor::builder>() { return true; }
+
+template <typename BuilderType>
+struct TensorTFromBuilder;
+
+template <>
+struct TensorTFromBuilder<SimpleTensorBuilder> {
+ using TensorT = SimpleTensor;
+};
+
+template <>
+struct TensorTFromBuilder<CompactTensorBuilder> {
+ using TensorT = CompactTensor;
+};
+
+template <>
+struct TensorTFromBuilder<CompactTensorV2Builder> {
+ using TensorT = CompactTensorV2;
+};
+
+template <typename BuilderType>
+using TensorTFromBuilder_t = typename TensorTFromBuilder<BuilderType>::TensorT;
+
+struct FixtureBase
+{
+ Tensor::UP createDenseTensor(const DenseTensorCells &cells) {
+ return TensorFactory::createDense(cells);
+ }
+};
+
+template <typename BuilderType>
+struct Fixture : public FixtureBase
+{
+ BuilderType _builder;
+ using TensorT = TensorTFromBuilder_t<BuilderType>;
+ Fixture() : FixtureBase(), _builder() {}
+
+ Tensor::UP createTensor(const TensorCells &cells,
+ const TensorDimensions &dimensions) {
+ return TensorFactory::create(cells, dimensions, _builder);
+ }
+
+ void assertSparseMapImpl(const Tensor &exp,
+ const TensorType &tensorType,
+ const Tensor &rhs, bool isDefaultBuilder)
+ {
+ EXPECT_TRUE(tensorType.type() == TensorType::Type::SPARSE);
+ if (isDefaultBuilder) {
+ TensorMapper mapper(tensorType);
+ std::unique_ptr<Tensor> mapped = mapper.map(rhs);
+ EXPECT_TRUE(!!mapped);
+ EXPECT_EQUAL(exp, *mapped);
+ }
+ std::unique_ptr<Tensor> mapped =
+ TensorMapper::mapToSparse<TensorT>(rhs, tensorType);
+ EXPECT_TRUE(!!mapped);
+ EXPECT_EQUAL(exp, *mapped);
+ }
+
+ void assertDenseMapImpl(const Tensor &exp,
+ const TensorType &tensorType,
+ const Tensor &rhs)
+ {
+ EXPECT_TRUE(tensorType.type() == TensorType::Type::DENSE);
+ TensorMapper mapper(tensorType);
+ std::unique_ptr<Tensor> mapped = mapper.map(rhs);
+ EXPECT_TRUE(!!mapped);
+ EXPECT_EQUAL(exp, *mapped);
+ }
+
+ void
+ assertSparseMap(const TensorCells &expTensor,
+ const TensorDimensions &expDimensions,
+ const vespalib::string &typeSpec,
+ const TensorCells &rhsTensor,
+ const TensorDimensions &rhsDimensions)
+ {
+ assertSparseMapImpl(*createTensor(expTensor, expDimensions),
+ TensorType::fromSpec(typeSpec),
+ *createTensor(rhsTensor, rhsDimensions),
+ defaultBuilder<BuilderType>());
+ }
+
+ void
+ assertDenseMap(const DenseTensorCells &expTensor,
+ const vespalib::string &typeSpec,
+ const TensorCells &rhsTensor,
+ const TensorDimensions &rhsDimensions)
+ {
+ assertDenseMapImpl(*createDenseTensor(expTensor),
+ TensorType::fromSpec(typeSpec),
+ *createTensor(rhsTensor, rhsDimensions));
+ }
+};
+
+using SimpleFixture = Fixture<SimpleTensorBuilder>;
+using CompactFixture = Fixture<CompactTensorBuilder>;
+using CompactV2Fixture = Fixture<CompactTensorV2Builder>;
+
+template <typename FixtureType>
+void
+testTensorMapper(FixtureType &f)
+{
+ TEST_DO(f.assertSparseMap({
+ {{{"y","1"}}, 4},
+ {{{"y","2"}}, 12}
+ },
+ { "y" },
+ "tensor(y{})",
+ {
+ {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","2"},{"y","1"}}, 3},
+ {{{"x","1"},{"y","2"}}, 5},
+ {{{"x","2"},{"y","2"}}, 7}
+ },
+ { "x", "y" }));
+ TEST_DO(f.assertSparseMap({
+ {{{"x","1"}}, 6},
+ {{{"x","2"}}, 10}
+ },
+ { "x" },
+ "tensor(x{})",
+ {
+ {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","2"},{"y","1"}}, 3},
+ {{{"x","1"},{"y","2"}}, 5},
+ {{{"x","2"},{"y","2"}}, 7}
+ },
+ { "x", "y" }));
+ TEST_DO(f.assertDenseMap({
+ {{{"y",0}}, 4},
+ {{{"y",1}}, 12},
+ {{{"y",2}}, 0}
+ },
+ "tensor(y[3])",
+ {
+ {{{"x","1"},{"y","0"}}, 1},
+ {{{"x","2"},{"y","0"}}, 3},
+ {{{"x","1"},{"y","1"}}, 5},
+ {{{"x","2"},{"y","1"}}, 7}
+ },
+ { "x", "y" }));
+ TEST_DO(f.assertDenseMap({
+ {{{"y",0}}, 3},
+ {{{"y",1}}, 5},
+ {{{"y",2}}, 0}
+ },
+ "tensor(y[3])",
+ {
+ {{{"x","1"},{"y","0x"}}, 1},
+ {{{"x","2"},{"y",""}}, 3},
+ {{{"x","1"},{"y","1"}}, 5},
+ {{{"x","2"},{"y","10"}}, 7}
+ },
+ { "x", "y" }));
+ TEST_DO(f.assertDenseMap({
+ {{{"x",0},{"y",0}}, 1},
+ {{{"x",0},{"y",1}}, 5},
+ {{{"x",0},{"y",2}}, 0},
+ {{{"x",1},{"y",0}}, 3},
+ {{{"x",1},{"y",1}}, 0},
+ {{{"x",1},{"y",2}}, 0}
+ },
+ "tensor(x[2], y[3])",
+ {
+ {{{"x","0"},{"y","0"}}, 1},
+ {{{"x","1"},{"y","0"}}, 3},
+ {{{"x","0"},{"y","1"}}, 5},
+ {{{"x","10"},{"y","1"}}, 7}
+ },
+ { "x", "y" }));
+}
+
+TEST_F("test tensor mapper for SimpleTensor", SimpleFixture)
+{
+ testTensorMapper(f);
+}
+
+TEST_F("test tensor mapper for CompactTensor", CompactFixture)
+{
+ testTensorMapper(f);
+}
+
+TEST_F("test tensor mapper for CompactTensorV2", CompactV2Fixture)
+{
+ testTensorMapper(f);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_operations/.gitignore b/vespalib/src/tests/tensor/tensor_operations/.gitignore
new file mode 100644
index 00000000000..2b54654dfb3
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_operations/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_operations_test_app
diff --git a/vespalib/src/tests/tensor/tensor_operations/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_operations/CMakeLists.txt
new file mode 100644
index 00000000000..d9d688dc82d
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_operations/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_operations_test_app
+ SOURCES
+ tensor_operations_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_operations_test_app COMMAND vespalib_tensor_operations_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_operations/FILES b/vespalib/src/tests/tensor/tensor_operations/FILES
new file mode 100644
index 00000000000..b3cc5fa2a92
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_operations/FILES
@@ -0,0 +1 @@
+tensor_operations_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor_operations/tensor_operations_test.cpp b/vespalib/src/tests/tensor/tensor_operations/tensor_operations_test.cpp
new file mode 100644
index 00000000000..b079c4f64c3
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_operations/tensor_operations_test.cpp
@@ -0,0 +1,627 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h>
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/tensor/tensor_factory.h>
+#include <vespa/vespalib/tensor/tensor_function.h>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+#include <iostream>
+
+using namespace vespalib::tensor;
+
+namespace vespalib {
+namespace tensor {
+
+static bool operator==(const Tensor &lhs, const Tensor &rhs)
+{
+ return lhs.equals(rhs);
+}
+
+}
+}
+
+//-----------------------------------------------------------------------------
+
+class MyInput : public TensorFunction::Input
+{
+private:
+ std::vector<Tensor::CREF> tensors;
+ std::vector<CellFunction::CREF> cell_functions;
+ const Tensor &get_tensor(size_t id) const override {
+ ASSERT_GREATER(tensors.size(), id);
+ return tensors[id];
+ }
+ virtual const CellFunction &get_cell_function(size_t id) const override {
+ ASSERT_GREATER(cell_functions.size(), id);
+ return cell_functions[id];
+ }
+public:
+ size_t add(const Tensor &tensor) {
+ size_t id = tensors.size();
+ tensors.push_back(tensor);
+ return id;
+ }
+ size_t add(const CellFunction &cell_function) {
+ size_t id = cell_functions.size();
+ cell_functions.push_back(cell_function);
+ return id;
+ }
+};
+
+const Tensor &eval_tensor(function::Node &function_ir, const TensorFunction::Input &input) {
+ ASSERT_TRUE(function_ir.type().is_tensor());
+ TensorFunction &function = function_ir; // compile step
+ const Tensor &result = function.eval(input).as_tensor;
+ EXPECT_EQUAL(result.getType(), function_ir.type());
+ return result;
+}
+
+const Tensor &eval_tensor_unchecked(function::Node &function_ir, const TensorFunction::Input &input) {
+ ASSERT_TRUE(function_ir.type().is_tensor());
+ TensorFunction &function = function_ir; // compile step
+ return function.eval(input).as_tensor;
+}
+
+double eval_number(function::Node &function_ir, const TensorFunction::Input &input) {
+ ASSERT_TRUE(function_ir.type().is_number());
+ TensorFunction &function = function_ir; // compile step
+ return function.eval(input).as_double;
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename BuilderType>
+struct Fixture
+{
+ BuilderType _builder;
+ Fixture() : _builder() {}
+
+ Tensor::UP createTensor(const TensorCells &cells) {
+ return TensorFactory::create(cells, _builder);
+ }
+ Tensor::UP createTensor(const TensorCells &cells, const TensorDimensions &dimensions) {
+ return TensorFactory::create(cells, dimensions, _builder);
+ }
+ void assertEquals(const TensorCells &lhs,
+ const TensorDimensions &lhsDimensions,
+ const TensorCells &rhs,
+ const TensorDimensions &rhsDimensions) {
+ EXPECT_EQUAL(*createTensor(lhs, lhsDimensions),
+ *createTensor(rhs, rhsDimensions));
+ }
+ void assertEquals(const TensorCells &lhs, const TensorCells &rhs) {
+ EXPECT_EQUAL(*createTensor(lhs), *createTensor(rhs));
+ }
+ void assertNotEquals(const TensorCells &lhs, const TensorCells &rhs) {
+ EXPECT_NOT_EQUAL(*createTensor(lhs), *createTensor(rhs));
+ }
+ void assertNotEquals(const TensorCells &lhs,
+ const TensorDimensions &lhsDimensions,
+ const TensorCells &rhs,
+ const TensorDimensions &rhsDimensions) {
+ EXPECT_NOT_EQUAL(*createTensor(lhs, lhsDimensions),
+ *createTensor(rhs, rhsDimensions));
+ }
+ void assertAddImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::add(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertAdd(const TensorCells &exp, const TensorCells &lhs, const TensorCells &rhs) {
+ assertAddImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertSubtractImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::subtract(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertSubtract(const TensorCells &exp, const TensorCells &lhs, const TensorCells &rhs) {
+ assertSubtractImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMinImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::min(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMin(const TensorCells &exp, const TensorCells &lhs, const TensorCells &rhs) {
+ assertMinImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMaxImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::max(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMax(const TensorCells &exp, const TensorCells &lhs, const TensorCells &rhs) {
+ assertMaxImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertSumImpl(double exp, const Tensor &tensor) {
+ MyInput input;
+ function::Node_UP ir = function::sum(function::input(tensor.getType(), input.add(tensor)));
+ EXPECT_EQUAL(exp, eval_number(*ir, input));
+ }
+ void assertSum(double exp, const TensorCells &cells) {
+ assertSumImpl(exp, *createTensor(cells));
+ }
+ void assertMatchImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::match(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ // The match operation currently ends up the union of input
+ // dimensions. It should be the intersection of input
+ // dimensions as claimed by the intermediate
+ // representation. The tensor result type checking is disabled
+ // until the corresponding bug is fixed.
+ EXPECT_EQUAL(exp, eval_tensor_unchecked(*ir, input)); // UNCHECKED (ref VESPA-1868)
+ }
+ void assertMatch(const TensorCells &exp, const TensorCells &lhs, const TensorCells &rhs) {
+ assertMatchImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMatch(const TensorCells &expTensor, const TensorDimensions &expDimensions,
+ const TensorCells &lhs, const TensorCells &rhs) {
+ assertMatchImpl(*createTensor(expTensor, expDimensions), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMultiplyImpl(const Tensor &exp, const Tensor &lhs, const Tensor &rhs) {
+ MyInput input;
+ function::Node_UP ir = function::multiply(function::input(lhs.getType(), input.add(lhs)),
+ function::input(rhs.getType(), input.add(rhs)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMultiply(const TensorCells &exp, const TensorCells &lhs, const TensorCells &rhs) {
+ assertMultiplyImpl(*createTensor(exp), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMultiply(const TensorCells &expTensor, const TensorDimensions &expDimensions,
+ const TensorCells &lhs, const TensorCells &rhs) {
+ assertMultiplyImpl(*createTensor(expTensor, expDimensions), *createTensor(lhs), *createTensor(rhs));
+ }
+ void assertMultiplyImpl(const Tensor &exp, const Tensor &arg1, const Tensor &arg2, const Tensor &arg3) {
+ MyInput input;
+ function::Node_UP ir = function::multiply(
+ function::multiply(function::input(arg1.getType(), input.add(arg1)),
+ function::input(arg2.getType(), input.add(arg2))),
+ function::input(arg3.getType(), input.add(arg3)));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertMultiply(const TensorCells &expTensor, const TensorDimensions &expDimensions,
+ const TensorCells &arg1, const TensorCells &arg2, const TensorCells &arg3) {
+ assertMultiplyImpl(*createTensor(expTensor, expDimensions), *createTensor(arg1), *createTensor(arg2), *createTensor(arg3));
+ }
+ void assertApplyImpl(const Tensor &exp, const Tensor &tensor, const CellFunction &func) {
+ MyInput input;
+ function::Node_UP ir = function::apply(function::input(tensor.getType(), input.add(tensor)), input.add(func));
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertApply(const TensorCells &exp, const TensorCells &arg, const CellFunction &func) {
+ assertApplyImpl(*createTensor(exp), *createTensor(arg), func);
+ }
+ void assertDimensionSumImpl(const Tensor &exp, const Tensor &tensor, const vespalib::string &dimension) {
+ MyInput input;
+ function::Node_UP ir = function::dimension_sum(function::input(tensor.getType(), input.add(tensor)), dimension);
+ EXPECT_EQUAL(exp, eval_tensor(*ir, input));
+ }
+ void assertDimensionSum(const TensorCells &exp, const TensorCells &arg,
+ const vespalib::string &dimension) {
+ assertDimensionSumImpl(*createTensor(exp), *createTensor(arg), dimension);
+ }
+};
+
+using SimpleFixture = Fixture<SimpleTensorBuilder>;
+using CompactFixture = Fixture<CompactTensorBuilder>;
+using CompactV2Fixture = Fixture<CompactTensorV2Builder>;
+
+
+template <typename FixtureType>
+void
+testTensorEquals(FixtureType &f)
+{
+ TEST_DO(f.assertEquals({}, {}));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, {}));
+ TEST_DO(f.assertNotEquals({}, { {{{"x","1"}}, 3} }));
+ TEST_DO(f.assertEquals({ {{{"x","1"}}, 3} }, { {{{"x","1"}}, 3} }));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, { {{{"x","1"}}, 4} }));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, { {{{"x","2"}}, 3} }));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, { {{{"y","1"}}, 3} }));
+ TEST_DO(f.assertEquals({ {{{"x","1"}}, 3} }, {"x"},
+ { {{{"x","1"}}, 3} }, {"x"}));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, {"x"},
+ { {{{"x","1"}}, 4} }, {"x"}));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, {"x"},
+ { {{{"x","2"}}, 3} }, {"x"}));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, {"x"},
+ { {{{"x","2"}}, 3} }, {"x"}));
+ TEST_DO(f.assertEquals({ {{{"x","1"}}, 3} }, {"x", "y"},
+ { {{{"x","1"}}, 3} }, {"x", "y"}));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, {"x", "y"},
+ { {{{"x","1"}}, 3} }, {"x", "z"}));
+ TEST_DO(f.assertNotEquals({ {{{"x","1"}}, 3} }, {"x", "y"},
+ { {{{"y","1"}}, 3} }, {"y", "z"}));
+}
+
+template <typename FixtureType>
+void
+testTensorAdd(FixtureType &f)
+{
+ f.assertAdd({},{},{});
+ f.assertAdd({ {{{"x","1"}}, 3}, {{{"x","2"}}, 5} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 5} });
+ f.assertAdd({ {{{"x","1"}}, 8} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 5} });
+ f.assertAdd({ {{{"x","1"}}, -2} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, -5} });
+ f.assertAdd({ {{{"x","1"}}, 0} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, -3} });
+ f.assertAdd({ {{{"x","1"}}, 3}, {{{"y","2"}}, 12}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertAdd({ {{{"x","1"}}, 3}, {{{"y","2"}}, 12}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertAdd({ {{{"y","2"}}, 12}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertAdd({ {{{"y","2"}}, 12}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} });
+ f.assertAdd({ {{{"x","1"}}, 3}, {{{"y","2"}}, 12} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7} });
+ f.assertAdd({ {{{"x","1"}}, 3}, {{{"y","2"}}, 12} },
+ { {{{"y","2"}}, 7} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertAdd({ {{{"x","1"}}, 3}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} },
+ { {{{"z","3"}}, 11} });
+ f.assertAdd({ {{{"x","1"}}, 3}, {{{"z","3"}}, 11} },
+ { {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} });
+}
+
+template <typename FixtureType>
+void
+testTensorSubtract(FixtureType &f)
+{
+ f.assertSubtract({},{},{});
+ f.assertSubtract({ {{{"x","1"}}, 3}, {{{"x","2"}}, -5} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 5} });
+ f.assertSubtract({ {{{"x","1"}}, -2} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 5} });
+ f.assertSubtract({ {{{"x","1"}}, 8} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, -5} });
+ f.assertSubtract({ {{{"x","1"}}, 0} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 3} });
+ f.assertSubtract({ {{{"x","1"}}, 3}, {{{"y","2"}},-2}, {{{"z","3"}},-11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertSubtract({ {{{"x","1"}},-3}, {{{"y","2"}}, 2}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertSubtract({ {{{"y","2"}},-2}, {{{"z","3"}},-11} },
+ { {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertSubtract({ {{{"y","2"}}, 2}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} });
+ f.assertSubtract({ {{{"x","1"}}, 3}, {{{"y","2"}},-2} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7} });
+ f.assertSubtract({ {{{"x","1"}},-3}, {{{"y","2"}}, 2} },
+ { {{{"y","2"}}, 7} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertSubtract({ {{{"x","1"}}, 3}, {{{"z","3"}},-11} },
+ { {{{"x","1"}}, 3} },
+ { {{{"z","3"}}, 11} });
+ f.assertSubtract({ {{{"x","1"}},-3}, {{{"z","3"}}, 11} },
+ { {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} });
+}
+
+template <typename FixtureType>
+void
+testTensorMin(FixtureType &f)
+{
+ f.assertMin({},{},{});
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"x","2"}}, 5} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 5} });
+ f.assertMin({ {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 5} });
+ f.assertMin({ {{{"x","1"}}, -5} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, -5} });
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"x","2"}}, 0} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 0} });
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"y","2"}}, 5}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"y","2"}}, 5}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertMin({ {{{"y","2"}}, 5}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertMin({ {{{"y","2"}}, 5}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} });
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7} });
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} },
+ { {{{"z","3"}}, 11} });
+ f.assertMin({ {{{"x","1"}}, 3}, {{{"z","3"}}, 11} },
+ { {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} });
+}
+
+template <typename FixtureType>
+void
+testTensorMax(FixtureType &f)
+{
+ f.assertMax({},{},{});
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"x","2"}}, 5} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 5} });
+ f.assertMax({ {{{"x","1"}}, 5} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 5} });
+ f.assertMax({ {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, -5} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"x","2"}}, 0} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 0} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"x","2"}}, -5} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, -5} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertMax({ {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} });
+ f.assertMax({ {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"y","2"}}, 7} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"y","2"}}, 7} },
+ { {{{"y","2"}}, 7} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} },
+ { {{{"z","3"}}, 11} });
+ f.assertMax({ {{{"x","1"}}, 3}, {{{"z","3"}}, 11} },
+ { {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} });
+}
+
+template <typename FixtureType>
+void
+testTensorSum(FixtureType &f)
+{
+ f.assertSum(0.0, {});
+ f.assertSum(0.0, { {{{"x","1"}}, 0} });
+ f.assertSum(3.0, { {{{"x","1"}}, 3} });
+ f.assertSum(8.0, { {{{"x","1"}}, 3}, {{{"x","2"}}, 5} });
+ f.assertSum(-2.0, { {{{"x","1"}}, 3}, {{{"x","2"}}, -5} });
+}
+
+template <typename FixtureType>
+void
+testTensorMatch(FixtureType &f)
+{
+ TEST_DO(f.assertMatch({}, {}, {}));
+ TEST_DO(f.assertMatch({}, {"x"},
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 5} }));
+ TEST_DO(f.assertMatch({ {{{"x","1"}}, 15} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 5} }));
+ TEST_DO(f.assertMatch({ {{{"x","1"}}, 0} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 0} }));
+ TEST_DO(f.assertMatch({ {{{"x","1"}}, -15} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, -5} }));
+ TEST_DO(f.assertMatch({ {{{"x","1"}}, 15},
+ {{{"x","1"}, {"y","1"}}, 7} }, {"x","y","z"},
+ { {{{"x","1"}}, 3},
+ {{{"x","2"}}, 3},
+ {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","1"},{"y","2"}}, 6} },
+ { {{{"x","1"}}, 5},
+ {{{"x","1"},{"y","1"}}, 7},
+ {{{"x","1"},{"y","1"},{"z","1"}}, 6} }));
+ TEST_DO(f.assertMatch({ {{{"y","2"}}, 35} }, {"x", "y", "z"},
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} }));
+ TEST_DO(f.assertMatch({ {{{"y","2"}}, 35} }, {"x", "y", "z"},
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} }));
+ TEST_DO(f.assertMatch({ {{{"y","2"}}, 35} }, {"y", "z"},
+ { {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} }));
+ TEST_DO(f.assertMatch({ {{{"y","2"}}, 35} }, {"y", "z"},
+ { {{{"y","2"}}, 7}, {{{"z","3"}}, 11} },
+ { {{{"y","2"}}, 5} }));
+ TEST_DO(f.assertMatch({ {{{"y","2"}}, 35} }, {"x", "y"},
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} },
+ { {{{"y","2"}}, 7} }));
+ TEST_DO(f.assertMatch({ {{{"y","2"}}, 35} }, {"x", "y"},
+ { {{{"y","2"}}, 7} },
+ { {{{"x","1"}}, 3}, {{{"y","2"}}, 5} }));
+ TEST_DO(f.assertMatch({ }, {"x", "z"},
+ { {{{"x","1"}}, 3} },
+ { {{{"z","3"}}, 11} }));
+ TEST_DO(f.assertMatch({ }, {"x", "z"},
+ { {{{"z","3"}}, 11} },
+ { {{{"x","1"}}, 3} }));
+}
+
+template <typename FixtureType>
+void
+testTensorMultiply(FixtureType &f)
+{
+ f.assertMultiply({}, {}, {});
+ f.assertMultiply({}, {"x"},
+ { {{{"x","1"}}, 3} },
+ { {{{"x","2"}}, 5} });
+ f.assertMultiply({ {{{"x","1"}}, 15} },
+ { {{{"x","1"}}, 3} },
+ { {{{"x","1"}}, 5} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"}}, 15} },
+ { {{{"x","1"}}, 3} },
+ { {{{"y","1"}}, 5} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"}}, 15}, {{{"x","2"},{"y","1"}}, 35} },
+ { {{{"x","1"}}, 3}, {{{"x","2"}}, 7} },
+ { {{{"y","1"}}, 5} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"},{"z","1"}}, 7},
+ {{{"x","1"},{"y","1"},{"z","2"}}, 13},
+ {{{"x","2"},{"y","1"},{"z","1"}}, 21},
+ {{{"x","2"},{"y","1"},{"z","2"}}, 39},
+ {{{"x","1"},{"y","2"},{"z","1"}}, 55} },
+ { {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","2"},{"y","1"}}, 3},
+ {{{"x","1"},{"y","2"}}, 5} },
+ { {{{"y","1"},{"z","1"}}, 7},
+ {{{"y","2"},{"z","1"}}, 11},
+ {{{"y","1"},{"z","2"}}, 13} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"},{"z","1"}}, 7} },
+ { {{{"x","1"}}, 5}, {{{"x","1"},{"y","1"}}, 1} },
+ { {{{"y","1"},{"z","1"}}, 7} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"},{"z","1"}}, 7}, {{{"x","1"},{"z","1"}}, 55} },
+ { {{{"x","1"}}, 5}, {{{"x","1"},{"y","1"}}, 1} },
+ { {{{"z","1"}}, 11}, {{{"y","1"},{"z","1"}}, 7} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"},{"z","1"}}, 7} },
+ { {{}, 5}, {{{"x","1"},{"y","1"}}, 1} },
+ { {{{"y","1"},{"z","1"}}, 7} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"},{"z","1"}}, 7}, {{}, 55} },
+ { {{}, 5}, {{{"x","1"},{"y","1"}}, 1} },
+ { {{}, 11}, {{{"y","1"},{"z","1"}}, 7} });
+}
+
+template <typename FixtureType>
+void
+testTensorMultiplePreservationOfDimensions(FixtureType &f)
+{
+ f.assertMultiply({}, {"x"},
+ { {{{"x","1"}}, 1} },
+ { {{{"x","2"}}, 1} });
+ f.assertMultiply({ {{{"x","1"}}, 1} }, {"x","y"},
+ { {{{"x","1"}}, 1} },
+ { {{{"x","2"},{"y","1"}}, 1}, {{{"x","1"}}, 1} });
+ f.assertMultiply({}, {"x","y"},
+ { {{{"x","1"}}, 1} },
+ { {{{"x","2"},{"y","1"}}, 1}, {{{"x","1"}}, 1} },
+ { {{{"x","1"},{"y","1"}}, 1} });
+ f.assertMultiply({ {{{"x","1"},{"y","1"}}, 1} }, {"x","y"},
+ { {{{"x","1"}}, 1} },
+ { {{{"x","1"},{"y","1"}}, 1} });
+}
+
+struct MyFunction : public CellFunction
+{
+ virtual double apply(double value) const override {
+ return value + 5;
+ }
+};
+
+template <typename FixtureType>
+void
+testTensorApply(FixtureType &f)
+{
+ f.assertApply({ {{{"x","1"}}, 6}, {{{"y","1"}}, 2} },
+ { {{{"x","1"}}, 1}, {{{"y","1"}}, -3} },
+ MyFunction());
+}
+
+template <typename FixtureType>
+void
+testTensorSumDimension(FixtureType &f)
+{
+ f.assertDimensionSum({ {{{"y","1"}}, 4}, {{{"y","2"}}, 12} },
+ { {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","2"},{"y","1"}}, 3},
+ {{{"x","1"},{"y","2"}}, 5},
+ {{{"x","2"},{"y","2"}}, 7} }, "x");
+ f.assertDimensionSum({ {{{"x","1"}}, 6}, {{{"x","2"}}, 10} },
+ { {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","2"},{"y","1"}}, 3},
+ {{{"x","1"},{"y","2"}}, 5},
+ {{{"x","2"},{"y","2"}}, 7} }, "y");
+ f.assertDimensionSum({ {{}, 13}, {{{"x","1"}}, 17}, {{{"x","2"}}, 10} },
+ { {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","2"},{"y","1"}}, 3},
+ {{{"x","1"},{"y","2"}}, 5},
+ {{{"x","2"},{"y","2"}}, 7},
+ {{{"x","1"}}, 11},
+ {{{"y","2"}}, 13} }, "y");
+ f.assertDimensionSum({ {{}, 11}, {{{"y","1"}}, 4}, {{{"y","2"}}, 25}, {{{"z","1"}}, 19} },
+ { {{{"x","1"},{"y","1"}}, 1},
+ {{{"x","2"},{"y","1"}}, 3},
+ {{{"x","1"},{"y","2"}}, 5},
+ {{{"x","2"},{"y","2"}}, 7},
+ {{{"x","1"}}, 11},
+ {{{"y","2"}}, 13},
+ {{{"z","1"}}, 19}, }, "x");
+}
+
+template <typename FixtureType>
+void
+testAllTensorOperations(FixtureType &f)
+{
+ TEST_DO(testTensorEquals(f));
+ TEST_DO(testTensorAdd(f));
+ TEST_DO(testTensorSubtract(f));
+ TEST_DO(testTensorMin(f));
+ TEST_DO(testTensorMax(f));
+ TEST_DO(testTensorSum(f));
+ TEST_DO(testTensorMatch(f));
+ TEST_DO(testTensorMultiply(f));
+ TEST_DO(testTensorMultiplePreservationOfDimensions(f));
+ TEST_DO(testTensorApply(f));
+ TEST_DO(testTensorSumDimension(f));
+}
+
+TEST_F("test tensor operations for SimpleTensor", SimpleFixture)
+{
+ testAllTensorOperations(f);
+}
+
+TEST_F("test tensor operations for CompactTensor", CompactFixture)
+{
+ testAllTensorOperations(f);
+}
+
+TEST_F("test tensor operations for CompactTensorV2", CompactV2Fixture)
+{
+ testAllTensorOperations(f);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_performance/.gitignore b/vespalib/src/tests/tensor/tensor_performance/.gitignore
new file mode 100644
index 00000000000..c9401246324
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_performance/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_performance_test_app
diff --git a/vespalib/src/tests/tensor/tensor_performance/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_performance/CMakeLists.txt
new file mode 100644
index 00000000000..cda4e309497
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_performance/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_performance_test_app
+ SOURCES
+ tensor_performance_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(
+ NAME vespalib_tensor_performance_test_app
+ COMMAND vespalib_tensor_performance_test_app
+ ENVIRONMENT "TEST_SUBSET=SMOKETEST"
+)
diff --git a/vespalib/src/tests/tensor/tensor_performance/FILES b/vespalib/src/tests/tensor/tensor_performance/FILES
new file mode 100644
index 00000000000..4cec89055e5
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_performance/FILES
@@ -0,0 +1 @@
+tensor_performance_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor_performance/tensor_performance_test.cpp b/vespalib/src/tests/tensor/tensor_performance/tensor_performance_test.cpp
new file mode 100644
index 00000000000..2b9370bb606
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_performance/tensor_performance_test.cpp
@@ -0,0 +1,371 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/function.h>
+#include <vespa/vespalib/eval/interpreted_function.h>
+#include <vespa/vespalib/eval/tensor_nodes.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor_builder.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor_builder.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/tensor_builder.h>
+#include <vespa/vespalib/util/benchmark_timer.h>
+#include <vespa/vespalib/tensor/default_tensor_engine.h>
+
+using namespace vespalib;
+using namespace vespalib::eval;
+using namespace vespalib::tensor;
+
+//-----------------------------------------------------------------------------
+
+const vespalib::string dot_product_match_expr = "sum(match(query,document))";
+const vespalib::string dot_product_multiply_expr = "sum(query*document)";
+const vespalib::string model_match_expr = "sum(match(query*document,model))";
+const vespalib::string matrix_product_expr = "sum(sum((query+document)*model,x))";
+
+//-----------------------------------------------------------------------------
+
+Value::UP wrap(std::unique_ptr<eval::Tensor> tensor) {
+ return Value::UP(new TensorValue(std::move(tensor)));
+}
+
+//-----------------------------------------------------------------------------
+
+struct Params {
+ std::map<vespalib::string, Value::UP> map;
+ Params &add(const vespalib::string &name, Value::UP value) {
+ map.emplace(name, std::move(value));
+ return *this;
+ }
+ Params &add(const vespalib::string &name, std::unique_ptr<eval::Tensor> value) {
+ return add(name, wrap(std::move(value)));
+ }
+};
+
+void inject_params(const Function &function, const Params &params,
+ InterpretedFunction::Context &ctx)
+{
+ ctx.clear_params();
+ EXPECT_EQUAL(params.map.size(), function.num_params());
+ for (size_t i = 0; i < function.num_params(); ++i) {
+ auto param = params.map.find(function.param_name(i));
+ ASSERT_TRUE(param != params.map.end());
+ ctx.add_param(*(param->second));
+ }
+}
+
+double calculate_expression(const vespalib::string &expression, const Params &params) {
+ const Function function = Function::parse(expression);
+ const InterpretedFunction interpreted(tensor::DefaultTensorEngine::ref(), function);
+ InterpretedFunction::Context context;
+ inject_params(function, params, context);
+ const Value &result = interpreted.eval(context);
+ EXPECT_TRUE(result.is_double());
+ return result.as_double();
+}
+
+DoubleValue dummy_result(0.0);
+const Value &dummy_ranking(InterpretedFunction::Context &) { return dummy_result; }
+
+double benchmark_expression_us(const vespalib::string &expression, const Params &params) {
+ const Function function = Function::parse(expression);
+ const InterpretedFunction interpreted(tensor::DefaultTensorEngine::ref(), function);
+ InterpretedFunction::Context context;
+ inject_params(function, params, context);
+ auto ranking = [&](){ interpreted.eval(context); };
+ auto baseline = [&](){ dummy_ranking(context); };
+ return BenchmarkTimer::benchmark(ranking, baseline, 5.0) * 1000.0 * 1000.0;
+}
+
+//-----------------------------------------------------------------------------
+
+tensor::Tensor::UP parse_tensor(const vespalib::string &tensor_str) {
+ Function function = Function::parse(tensor_str);
+ auto tensor = nodes::as<nodes::Tensor>(function.root());
+ ASSERT_TRUE(tensor);
+ SimpleTensorBuilder builder;
+ for (const auto &cell: tensor->cells()) {
+ for (const auto &dimension: cell.first) {
+ builder.add_label(builder.define_dimension(dimension.first), dimension.second);
+ }
+ builder.add_cell(cell.second);
+ }
+ return builder.build();
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("SMOKETEST - require that dot product benchmark expressions produce expected results") {
+ Params params;
+ params.add("query", parse_tensor("{{x:0}:1.0,{x:1}:2.0,{x:2}:3.0}"));
+ params.add("document", parse_tensor("{{x:0}:2.0,{x:1}:2.0,{x:2}:2.0}"));
+ EXPECT_EQUAL(calculate_expression(dot_product_match_expr, params), 12.0);
+ EXPECT_EQUAL(calculate_expression(dot_product_multiply_expr, params), 12.0);
+}
+
+TEST("SMOKETEST - require that model match benchmark expression produces expected result") {
+ Params params;
+ params.add("query", parse_tensor("{{x:0}:1.0,{x:1}:2.0}"));
+ params.add("document", parse_tensor("{{y:0}:3.0,{y:1}:4.0}"));
+ params.add("model", parse_tensor("{{x:0,y:0}:2.0,{x:0,y:1}:2.0,"
+ " {x:1,y:0}:2.0,{x:1,y:1}:2.0}"));
+ EXPECT_EQUAL(calculate_expression(model_match_expr, params), 42.0);
+}
+
+TEST("SMOKETEST - require that matrix product benchmark expression produces expected result") {
+ Params params;
+ params.add("query", parse_tensor("{{x:0}:1.0}"));
+ params.add("document", parse_tensor("{{x:1}:2.0}"));
+ params.add("model", parse_tensor("{{x:0,y:0}:1.0,{x:0,y:1}:2.0,"
+ " {x:1,y:0}:3.0,{x:1,y:1}:4.0}"));
+ EXPECT_EQUAL(calculate_expression(matrix_product_expr, params), 17.0);
+}
+
+//-----------------------------------------------------------------------------
+
+struct DummyBuilder : TensorBuilder {
+ Dimension define_dimension(const vespalib::string &) override { return 0; }
+ TensorBuilder &add_label(Dimension, const vespalib::string &) override { return *this; }
+ TensorBuilder &add_cell(double) override { return *this; }
+ tensor::Tensor::UP build() override { return tensor::Tensor::UP(); }
+};
+
+
+struct DummyDenseTensorBuilder
+{
+ using Dimension = TensorBuilder::Dimension;
+ Dimension defineDimension(const vespalib::string &, size_t) { return 0; }
+ DummyDenseTensorBuilder &addLabel(Dimension, size_t) { return *this; }
+ DummyDenseTensorBuilder &addCell(double) { return *this; }
+ tensor::Tensor::UP build() { return tensor::Tensor::UP(); }
+};
+
+struct DimensionSpec {
+ vespalib::string name;
+ size_t count;
+ size_t offset;
+ DimensionSpec(const vespalib::string &name_in, size_t count_in, size_t offset_in = 0)
+ : name(name_in), count(count_in), offset(offset_in) {}
+};
+
+struct StringBinding {
+ TensorBuilder::Dimension dimension;
+ vespalib::string label;
+ StringBinding(TensorBuilder &builder, const DimensionSpec &dimension_in)
+ : dimension(builder.define_dimension(dimension_in.name)),
+ label()
+ {
+ }
+ void set_label(size_t id) {
+ label = vespalib::make_string("%zu", id);
+ }
+ static void add_cell(TensorBuilder &builder, double value) {
+ builder.add_cell(value);
+ }
+ void add_label(TensorBuilder &builder) const {
+ builder.add_label(dimension, label);
+ }
+};
+
+struct NumberBinding {
+ TensorBuilder::Dimension dimension;
+ size_t label;
+ template <typename Builder>
+ NumberBinding(Builder &builder, const DimensionSpec &dimension_in)
+ : dimension(builder.defineDimension(dimension_in.name,
+ dimension_in.offset +
+ dimension_in.count)),
+ label()
+ {
+ }
+ void set_label(size_t id) {
+ label = id;
+ }
+ template <typename Builder>
+ static void add_cell(Builder &builder, double value) {
+ builder.addCell(value);
+ }
+ template <typename Builder>
+ void add_label(Builder &builder) const {
+ builder.addLabel(dimension, label);
+ }
+};
+
+
+template <typename Builder, typename Binding>
+void build_tensor(Builder &builder, const std::vector<DimensionSpec> &dimensions,
+ std::vector<Binding> &bindings)
+{
+ if (bindings.size() == dimensions.size()) {
+ for (const auto &bound: bindings) {
+ bound.add_label(builder);
+ }
+ Binding::add_cell(builder, 42);
+ } else {
+ const auto &spec = dimensions[bindings.size()];
+ bindings.emplace_back(builder, spec);
+ for (size_t i = 0; i < spec.count; ++i) {
+ bindings.back().set_label(spec.offset + i);
+ build_tensor(builder, dimensions, bindings);
+ }
+ bindings.pop_back();
+ }
+}
+
+template <typename Builder, typename IBuilder, typename Binding>
+tensor::Tensor::UP make_tensor_impl(const std::vector<DimensionSpec> &dimensions) {
+ Builder builder;
+ std::vector<Binding> bindings;
+ bindings.reserve(dimensions.size());
+ build_tensor<IBuilder, Binding>(builder, dimensions, bindings);
+ return builder.build();
+}
+
+//-----------------------------------------------------------------------------
+
+enum class BuilderType { DUMMY, SIMPLE, COMPACT, COMPACTV2, NUMBERDUMMY,
+ DENSE };
+
+const BuilderType DUMMY = BuilderType::DUMMY;
+const BuilderType SIMPLE = BuilderType::SIMPLE;
+const BuilderType COMPACT = BuilderType::COMPACT;
+const BuilderType COMPACTV2 = BuilderType::COMPACTV2;
+const BuilderType NUMBERDUMMY = BuilderType::NUMBERDUMMY;
+const BuilderType DENSE = BuilderType::DENSE;
+
+const char *name(BuilderType type) {
+ switch (type) {
+ case BuilderType::DUMMY: return " dummy";
+ case BuilderType::SIMPLE: return " simple";
+ case BuilderType::COMPACT: return "compact";
+ case BuilderType::COMPACTV2: return "compactv2";
+ case BuilderType::NUMBERDUMMY: return "numberdummy";
+ case BuilderType::DENSE: return "dense";
+ }
+ abort();
+}
+
+tensor::Tensor::UP make_tensor(BuilderType type, const std::vector<DimensionSpec> &dimensions) {
+ switch (type) {
+ case BuilderType::DUMMY:
+ return make_tensor_impl<DummyBuilder, TensorBuilder, StringBinding>
+ (dimensions);
+ case BuilderType::SIMPLE:
+ return make_tensor_impl<SimpleTensorBuilder, TensorBuilder,
+ StringBinding>(dimensions);
+ case BuilderType::COMPACT:
+ return make_tensor_impl<CompactTensorBuilder, TensorBuilder,
+ StringBinding>(dimensions);
+ case BuilderType::COMPACTV2:
+ return make_tensor_impl<CompactTensorV2Builder, TensorBuilder,
+ StringBinding>(dimensions);
+ case BuilderType::NUMBERDUMMY:
+ return make_tensor_impl<DummyDenseTensorBuilder,
+ DummyDenseTensorBuilder, NumberBinding>(dimensions);
+ case BuilderType::DENSE:
+ return make_tensor_impl<DenseTensorBuilder, DenseTensorBuilder,
+ NumberBinding>(dimensions);
+ }
+ abort();
+}
+
+//-----------------------------------------------------------------------------
+
+struct BuildTask {
+ BuilderType type;
+ std::vector<DimensionSpec> spec;
+ BuildTask(BuilderType type_in, const std::vector<DimensionSpec> &spec_in) : type(type_in), spec(spec_in) {}
+ void operator()() { tensor::Tensor::UP tensor = make_tensor(type, spec); }
+};
+
+double benchmark_build_us(BuilderType type, const std::vector<DimensionSpec> &spec) {
+ BuildTask build_task(type, spec);
+ BuildTask dummy_task((type == DENSE) ? NUMBERDUMMY : DUMMY, spec);
+ return BenchmarkTimer::benchmark(build_task, dummy_task, 5.0) * 1000.0 * 1000.0;
+}
+
+TEST("benchmark create/destroy time for 1d tensors") {
+ for (size_t size: {5, 10, 25, 50, 100, 250, 500}) {
+ for (auto type: {SIMPLE, COMPACT, COMPACTV2, DENSE}) {
+ double time_us = benchmark_build_us(type, {DimensionSpec("x", size)});
+ fprintf(stderr, "-- 1d tensor create/destroy (%s) with size %zu: %g us\n", name(type), size, time_us);
+ }
+ }
+}
+
+TEST("benchmark create/destroy time for 2d tensors") {
+ for (size_t size: {5, 10, 25, 50, 100}) {
+ for (auto type: {SIMPLE, COMPACT, COMPACTV2, DENSE}) {
+ double time_us = benchmark_build_us(type, {DimensionSpec("x", size), DimensionSpec("y", size)});
+ fprintf(stderr, "-- 2d tensor create/destroy (%s) with size %zux%zu: %g us\n", name(type), size, size, time_us);
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("benchmark dot product using match") {
+ for (size_t size: {10, 25, 50, 100, 250}) {
+ for (auto type: {SIMPLE, COMPACT, COMPACTV2, DENSE}) {
+ Params params;
+ params.add("query", make_tensor(type, {DimensionSpec("x", size)}));
+ params.add("document", make_tensor(type, {DimensionSpec("x", size)}));
+ double time_us = benchmark_expression_us(dot_product_match_expr, params);
+ fprintf(stderr, "-- dot product (%s) using match %zu vs %zu: %g us\n", name(type), size, size, time_us);
+ }
+ }
+}
+
+TEST("benchmark dot product using multiply") {
+ for (size_t size: {10, 25, 50, 100, 250}) {
+ for (auto type: {SIMPLE, COMPACT, COMPACTV2, DENSE}) {
+ Params params;
+ params.add("query", make_tensor(type, {DimensionSpec("x", size)}));
+ params.add("document", make_tensor(type, {DimensionSpec("x", size)}));
+ double time_us = benchmark_expression_us(dot_product_multiply_expr, params);
+ fprintf(stderr, "-- dot product (%s) using multiply %zu vs %zu: %g us\n", name(type), size, size, time_us);
+ }
+ }
+}
+
+TEST("benchmark model match") {
+ for (size_t model_size: {25, 50, 100}) {
+ for (size_t vector_size: {5, 10, 25, 50, 100}) {
+ if (vector_size <= model_size) {
+ for (auto type: {SIMPLE, COMPACT, COMPACTV2}) {
+ Params params;
+ params.add("query", make_tensor(type, {DimensionSpec("x", vector_size)}));
+ params.add("document", make_tensor(type, {DimensionSpec("y", vector_size)}));
+ params.add("model", make_tensor(type, {DimensionSpec("x", model_size), DimensionSpec("y", model_size)}));
+ double time_us = benchmark_expression_us(model_match_expr, params);
+ fprintf(stderr, "-- model match (%s) %zu * %zu vs %zux%zu: %g us\n", name(type), vector_size, vector_size, model_size, model_size, time_us);
+ }
+ }
+ }
+ }
+}
+
+TEST("benchmark matrix product") {
+ for (size_t vector_size: {5, 10, 25, 50}) {
+ size_t matrix_size = vector_size * 2;
+ for (auto type: {SIMPLE, COMPACT, COMPACTV2, DENSE}) {
+ Params params;
+ size_t document_size = vector_size;
+ if (type == DENSE) {
+ document_size = matrix_size;
+ }
+ params.add("query", make_tensor(type, {DimensionSpec("x", vector_size, vector_size)}));
+ params.add("document", make_tensor(type, {DimensionSpec("x", document_size)}));
+ params.add("model", make_tensor(type, {DimensionSpec("x", matrix_size), DimensionSpec("y", matrix_size)}));
+ double time_us = benchmark_expression_us(matrix_product_expr, params);
+ fprintf(stderr, "-- matrix product (%s) %zu + %zu vs %zux%zu: %g us\n", name(type), vector_size, vector_size, matrix_size, matrix_size, time_us);
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_serialization/.gitignore b/vespalib/src/tests/tensor/tensor_serialization/.gitignore
new file mode 100644
index 00000000000..f8525561c6b
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_serialization/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_serialization_test_app
diff --git a/vespalib/src/tests/tensor/tensor_serialization/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_serialization/CMakeLists.txt
new file mode 100644
index 00000000000..cc1ff3ecc43
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_serialization/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_serialization_test_app
+ SOURCES
+ tensor_serialization_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_serialization_test_app COMMAND vespalib_tensor_serialization_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_serialization/FILES b/vespalib/src/tests/tensor/tensor_serialization/FILES
new file mode 100644
index 00000000000..882dd368f5c
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_serialization/FILES
@@ -0,0 +1 @@
+tensor_serialization_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor_serialization/tensor_serialization_test.cpp b/vespalib/src/tests/tensor/tensor_serialization/tensor_serialization_test.cpp
new file mode 100644
index 00000000000..6a4fcefba9c
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_serialization/tensor_serialization_test.cpp
@@ -0,0 +1,267 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h>
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/tensor/default_tensor.h>
+#include <vespa/vespalib/tensor/tensor_factory.h>
+#include <vespa/vespalib/tensor/serialization/typed_binary_format.h>
+#include <vespa/vespalib/objects/nbostream.h>
+#include <iostream>
+
+using namespace vespalib::tensor;
+using vespalib::nbostream;
+using ExpBuffer = std::vector<uint8_t>;
+
+namespace std {
+
+bool operator==(const std::vector<uint8_t> &exp, const nbostream &stream)
+{
+ return ((exp.size() == stream.size()) &&
+ (memcmp(&exp[0], stream.peek(), exp.size()) == 0));
+}
+
+std::ostream &operator<<(std::ostream &out, const std::vector<uint8_t> &rhs)
+{
+ out << vespalib::HexDump(&rhs[0], rhs.size());
+ return out;
+}
+
+}
+
+namespace vespalib {
+
+namespace tensor {
+
+static bool operator==(const Tensor &lhs, const Tensor &rhs)
+{
+ return lhs.equals(rhs);
+}
+
+}
+}
+
+template <class BuilderType>
+void
+checkDeserialize(vespalib::nbostream &stream, const Tensor &rhs)
+{
+ (void) stream;
+ (void) rhs;
+}
+
+template <>
+void
+checkDeserialize<DefaultTensor::builder>(nbostream &stream, const Tensor &rhs)
+{
+ nbostream wrapStream(stream.peek(), stream.size());
+ auto chk = TypedBinaryFormat::deserialize(wrapStream);
+ EXPECT_EQUAL(0u, wrapStream.size());
+ EXPECT_EQUAL(*chk, rhs);
+}
+
+template <typename BuilderType>
+struct Fixture
+{
+ BuilderType _builder;
+ Fixture() : _builder() {}
+
+ Tensor::UP createTensor(const TensorCells &cells) {
+ return vespalib::tensor::TensorFactory::create(cells, _builder);
+ }
+ Tensor::UP createTensor(const TensorCells &cells, const TensorDimensions &dimensions) {
+ return TensorFactory::create(cells, dimensions, _builder);
+ }
+
+ void serialize(nbostream &stream, const Tensor &tensor) {
+ TypedBinaryFormat::serialize(stream, tensor);
+ }
+ Tensor::UP deserialize(nbostream &stream) {
+ BuilderType builder;
+ nbostream wrapStream(stream.peek(), stream.size());
+ TypedBinaryFormat::deserialize(wrapStream, builder);
+ EXPECT_TRUE(wrapStream.size() == 0);
+ auto ret = builder.build();
+ checkDeserialize<BuilderType>(stream, *ret);
+ stream.adjustReadPos(stream.size());
+ return ret;
+ }
+ void assertSerialized(const ExpBuffer &exp, const TensorCells &rhs,
+ const TensorDimensions &rhsDimensions) {
+ Tensor::UP rhsTensor(createTensor(rhs, rhsDimensions));
+ nbostream rhsStream;
+ serialize(rhsStream, *rhsTensor);
+ EXPECT_EQUAL(exp, rhsStream);
+ auto rhs2 = deserialize(rhsStream);
+ EXPECT_EQUAL(*rhs2, *rhsTensor);
+ }
+};
+
+using SimpleFixture = Fixture<SimpleTensorBuilder>;
+using CompactFixture = Fixture<CompactTensorBuilder>;
+using CompactV2Fixture = Fixture<CompactTensorV2Builder>;
+
+
+template <typename FixtureType>
+void
+testTensorSerialization(FixtureType &f)
+{
+ TEST_DO(f.assertSerialized({ 0x01, 0x00, 0x00 }, {}, {}));
+ TEST_DO(f.assertSerialized({ 0x01, 0x01, 0x01, 0x78, 0x00 },
+ {}, { "x" }));
+ TEST_DO(f.assertSerialized({ 0x01, 0x02, 0x01, 0x78, 0x01, 0x79, 0x00 },
+ {}, { "x", "y" }));
+ TEST_DO(f.assertSerialized({ 0x01, 0x01, 0x01, 0x78, 0x01, 0x01, 0x31, 0x40,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x","1"}}, 3} }, { "x" }));
+ TEST_DO(f.assertSerialized({ 0x01, 0x02, 0x01, 0x78, 0x01, 0x79, 0x01, 0x00,
+ 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00 },
+ { {{}, 3} }, { "x", "y"}));
+ TEST_DO(f.assertSerialized({ 0x01, 0x02, 0x01, 0x78, 0x01, 0x79, 0x01, 0x01,
+ 0x31, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00 },
+ { {{{"x","1"}}, 3} }, { "x", "y" }));
+ TEST_DO(f.assertSerialized({ 0x01, 0x02, 0x01, 0x78, 0x01, 0x79, 0x01, 0x00,
+ 0x01, 0x33, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00 },
+ { {{{"y","3"}}, 3} }, { "x", "y" }));
+ TEST_DO(f.assertSerialized({ 0x01, 0x02, 0x01, 0x78, 0x01, 0x79, 0x01, 0x01,
+ 0x32, 0x01, 0x34, 0x40, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00 },
+ { {{{"x","2"}, {"y", "4"}}, 3} }, { "x", "y" }));
+ TEST_DO(f.assertSerialized({ 0x01, 0x02, 0x01, 0x78, 0x01, 0x79,
+ 0x01, 0x01, 0x31, 0x00, 0x40, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x","1"}}, 3} }, {"x", "y"}));
+}
+
+TEST_F("test tensor serialization for SimpleTensor", SimpleFixture)
+{
+ testTensorSerialization(f);
+}
+
+TEST_F("test tensor serialization for CompactTensor", CompactFixture)
+{
+ testTensorSerialization(f);
+}
+
+TEST_F("test tensor serialization for CompactTensorV2", CompactV2Fixture)
+{
+ testTensorSerialization(f);
+}
+
+
+struct DenseFixture
+{
+ Tensor::UP createTensor(const DenseTensorCells &cells) {
+ return TensorFactory::createDense(cells);
+ }
+
+ void serialize(nbostream &stream, const Tensor &tensor) {
+ TypedBinaryFormat::serialize(stream, tensor);
+ }
+
+ Tensor::UP deserialize(nbostream &stream) {
+ nbostream wrapStream(stream.peek(), stream.size());
+ auto ret = TypedBinaryFormat::deserialize(wrapStream);
+ EXPECT_TRUE(wrapStream.size() == 0);
+ stream.adjustReadPos(stream.size());
+ return ret;
+ }
+ void assertSerialized(const ExpBuffer &exp, const DenseTensorCells &rhs) {
+ Tensor::UP rhsTensor(createTensor(rhs));
+ nbostream rhsStream;
+ serialize(rhsStream, *rhsTensor);
+ EXPECT_EQUAL(exp, rhsStream);
+ auto rhs2 = deserialize(rhsStream);
+ EXPECT_EQUAL(*rhs2, *rhsTensor);
+ }
+};
+
+
+TEST_F("test tensor serialization for DenseTensor", DenseFixture)
+{
+ TEST_DO(f.assertSerialized({ 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ {}));
+ TEST_DO(f.assertSerialized({ 0x02, 0x01, 0x01, 0x78, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
+ { {{{"x",0}}, 0} }));
+ TEST_DO(f.assertSerialized({ 0x02, 0x02, 0x01, 0x78, 0x01,
+ 0x01, 0x79, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x",0},{"y", 0}}, 0} }));
+ TEST_DO(f.assertSerialized({ 0x02, 0x01, 0x01, 0x78, 0x02,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x",1}}, 3} }));
+ TEST_DO(f.assertSerialized({ 0x02, 0x02, 0x01, 0x78, 0x01,
+ 0x01, 0x79, 0x01,
+ 0x40, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x",0},{"y",0}}, 3} }));
+ TEST_DO(f.assertSerialized({ 0x02, 0x02, 0x01, 0x78, 0x02,
+ 0x01, 0x79, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x",1},{"y",0}}, 3} }));
+ TEST_DO(f.assertSerialized({ 0x02, 0x02, 0x01, 0x78, 0x01,
+ 0x01, 0x79, 0x04,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x",0},{"y",3}}, 3} }));
+ TEST_DO(f.assertSerialized({ 0x02, 0x02, 0x01, 0x78, 0x03,
+ 0x01, 0x79, 0x05,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ { {{{"x",2}, {"y",4}}, 3} }));
+}
+
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_slime_serialization/.gitignore b/vespalib/src/tests/tensor/tensor_slime_serialization/.gitignore
new file mode 100644
index 00000000000..9cb3b664d58
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_slime_serialization/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_slime_serialization_test_app
diff --git a/vespalib/src/tests/tensor/tensor_slime_serialization/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_slime_serialization/CMakeLists.txt
new file mode 100644
index 00000000000..51e68c26d2d
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_slime_serialization/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_slime_serialization_test_app
+ SOURCES
+ tensor_slime_serialization_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_slime_serialization_test_app COMMAND vespalib_tensor_slime_serialization_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_slime_serialization/FILES b/vespalib/src/tests/tensor/tensor_slime_serialization/FILES
new file mode 100644
index 00000000000..874f951beb5
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_slime_serialization/FILES
@@ -0,0 +1 @@
+tensor_slime_serialization_test.cpp
diff --git a/vespalib/src/tests/tensor/tensor_slime_serialization/tensor_slime_serialization_test.cpp b/vespalib/src/tests/tensor/tensor_slime_serialization/tensor_slime_serialization_test.cpp
new file mode 100644
index 00000000000..f53b42c433e
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_slime_serialization/tensor_slime_serialization_test.cpp
@@ -0,0 +1,209 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor.h>
+#include <vespa/vespalib/tensor/simple/simple_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h>
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/tensor/default_tensor.h>
+#include <vespa/vespalib/tensor/tensor_factory.h>
+#include <vespa/vespalib/tensor/serialization/typed_binary_format.h>
+#include <vespa/vespalib/tensor/serialization/slime_binary_format.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include <iostream>
+
+using namespace vespalib::tensor;
+
+template <typename BuilderType>
+struct Fixture
+{
+ BuilderType _builder;
+ Fixture() : _builder() {}
+
+ Tensor::UP createTensor(const TensorCells &cells) {
+ return vespalib::tensor::TensorFactory::create(cells, _builder);
+ }
+ Tensor::UP createTensor(const TensorCells &cells, const TensorDimensions &dimensions) {
+ return TensorFactory::create(cells, dimensions, _builder);
+ }
+
+ static inline uint32_t getTensorTypeId();
+
+ void assertSerialized(const vespalib::string &exp, const TensorCells &rhs,
+ const TensorDimensions &rhsDimensions) {
+ Tensor::UP rhsTensor(createTensor(rhs, rhsDimensions));
+ auto slime = SlimeBinaryFormat::serialize(*rhsTensor);
+ vespalib::slime::Memory memory_exp(exp);
+ vespalib::Slime expSlime;
+ size_t used = vespalib::slime::JsonFormat::decode(memory_exp, expSlime);
+ EXPECT_EQUAL(used, memory_exp.size);
+ EXPECT_EQUAL(expSlime, *slime);
+ }
+};
+
+template <>
+uint32_t
+Fixture<SimpleTensorBuilder>::getTensorTypeId() { return 0u; }
+
+template <>
+uint32_t
+Fixture<CompactTensorBuilder>::getTensorTypeId() { return 1u; }
+
+template <>
+uint32_t
+Fixture<CompactTensorV2Builder>::getTensorTypeId() { return 2u; }
+
+
+using SimpleFixture = Fixture<SimpleTensorBuilder>;
+using CompactFixture = Fixture<CompactTensorBuilder>;
+using CompactV2Fixture = Fixture<CompactTensorV2Builder>;
+
+
+namespace {
+vespalib::string twoCellsJson[3] =
+{
+ "{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { y:'3'}, value: 4.0 },"
+ "{ address: { x:'1'}, value: 3.0 }"
+ "] }",
+ "{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x:'1'}, value: 3.0 },"
+ "{ address: { y:'3'}, value: 4.0 }"
+ "] }",
+ "{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x:'1'}, value: 3.0 },"
+ "{ address: { y:'3'}, value: 4.0 }"
+ "] }",
+};
+}
+
+
+template <typename FixtureType>
+void
+testTensorSlimeSerialization(FixtureType &f)
+{
+ TEST_DO(f.assertSerialized("{ dimensions: [], cells: [] }", {}, {}));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x' ], cells: [] }",
+ {}, { "x" }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ], cells: [] }",
+ {}, { "x", "y" }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x' ],"
+ "cells: ["
+ "{ address: { x: '1' }, value: 3.0 }"
+ "] }",
+ { {{{"x","1"}}, 3} }, { "x" }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { }, value: 3.0 }"
+ "] }",
+ { {{}, 3} }, { "x", "y"}));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x: '1' }, value: 3.0 }"
+ "] }",
+ { {{{"x","1"}}, 3} }, { "x", "y" }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { y: '3' }, value: 3.0 }"
+ "] }",
+ { {{{"y","3"}}, 3} }, { "x", "y" }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x:'2', y:'4'}, value: 3.0 }"
+ "] }",
+ { {{{"x","2"}, {"y", "4"}}, 3} }, { "x", "y" }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x:'1'}, value: 3.0 }"
+ "] }",
+ { {{{"x","1"}}, 3} }, {"x", "y"}));
+ TEST_DO(f.assertSerialized(twoCellsJson[FixtureType::getTensorTypeId()],
+ { {{{"x","1"}}, 3}, {{{"y","3"}}, 4} },
+ {"x", "y"}));
+}
+
+TEST_F("test tensor slime serialization for SimpleTensor", SimpleFixture)
+{
+ testTensorSlimeSerialization(f);
+}
+
+TEST_F("test tensor slime serialization for CompactTensor", CompactFixture)
+{
+ testTensorSlimeSerialization(f);
+}
+
+TEST_F("test tensor slime serialization for CompactTensorV2", CompactV2Fixture)
+{
+ testTensorSlimeSerialization(f);
+}
+
+
+struct DenseFixture
+{
+ DenseFixture() {}
+
+ Tensor::UP createTensor(const DenseTensorCells &cells) {
+ return vespalib::tensor::TensorFactory::createDense(cells);
+ }
+
+ void assertSerialized(const vespalib::string &exp,
+ const DenseTensorCells &rhs) {
+ Tensor::UP rhsTensor(createTensor(rhs));
+ auto slime = SlimeBinaryFormat::serialize(*rhsTensor);
+ vespalib::slime::Memory memory_exp(exp);
+ vespalib::Slime expSlime;
+ size_t used = vespalib::slime::JsonFormat::decode(memory_exp, expSlime);
+ EXPECT_EQUAL(used, memory_exp.size);
+ EXPECT_EQUAL(expSlime, *slime);
+ }
+};
+
+
+TEST_F("test tensor slime serialization for DenseTensor", DenseFixture)
+{
+ TEST_DO(f.assertSerialized("{ dimensions: [], cells: ["
+ "{ address: { }, value: 0.0 }"
+ "] }", {}));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x' ], cells: ["
+ "{ address: { x: '0' }, value: 0.0 }"
+ "] }",
+ { {{{"x",0}}, 0} }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ], cells: ["
+ "{ address: { x: '0', y: '0' }, value: 0.0 }"
+ "] }",
+ { {{{"x",0},{"y",0}}, 0} }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x' ],"
+ "cells: ["
+ "{ address: { x: '0' }, value: 0.0 },"
+ "{ address: { x: '1' }, value: 3.0 }"
+ "] }",
+ { {{{"x",1}}, 3} }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x: '0', y: '0' }, value: 3.0 }"
+ "] }",
+ { {{{"x",0},{"y",0}}, 3} }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x: '0', y: '0' }, value: 0.0 },"
+ "{ address: { x: '1', y: '0' }, value: 3.0 }"
+ "] }",
+ { {{{"x",1},{"y", 0}}, 3} }));
+ TEST_DO(f.assertSerialized("{ dimensions: [ 'x', 'y' ],"
+ " cells: ["
+ "{ address: { x: '0', y: '0' }, value: 0.0 },"
+ "{ address: { x: '0', y: '1' }, value: 0.0 },"
+ "{ address: { x: '0', y: '2' }, value: 0.0 },"
+ "{ address: { x: '0', y: '3' }, value: 3.0 }"
+ "] }",
+ { {{{"x",0},{"y",3}}, 3} }));
+}
+
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tensor/tensor_type/.gitignore b/vespalib/src/tests/tensor/tensor_type/.gitignore
new file mode 100644
index 00000000000..fca663cd6c4
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_type/.gitignore
@@ -0,0 +1 @@
+vespalib_tensor_type_test_app
diff --git a/vespalib/src/tests/tensor/tensor_type/CMakeLists.txt b/vespalib/src/tests/tensor/tensor_type/CMakeLists.txt
new file mode 100644
index 00000000000..29f7231683c
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_type/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_tensor_type_test_app
+ SOURCES
+ tensor_type_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_tensor_type_test_app COMMAND vespalib_tensor_type_test_app)
diff --git a/vespalib/src/tests/tensor/tensor_type/tensor_type_test.cpp b/vespalib/src/tests/tensor/tensor_type/tensor_type_test.cpp
new file mode 100644
index 00000000000..362e7dfbba4
--- /dev/null
+++ b/vespalib/src/tests/tensor/tensor_type/tensor_type_test.cpp
@@ -0,0 +1,312 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/eval/value_type.h>
+#include <vespa/vespalib/tensor/tensor_type.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <ostream>
+
+using namespace vespalib::tensor;
+using vespalib::eval::ValueType;
+
+TEST("require that INVALID tensor type can be created") {
+ TensorType t = TensorType::invalid();
+ EXPECT_TRUE(t.type() == TensorType::Type::INVALID);
+ EXPECT_EQUAL(t.dimensions().size(), 0u);
+}
+
+TEST("require that NUMBER tensor type can be created") {
+ TensorType t = TensorType::number();
+ EXPECT_TRUE(t.type() == TensorType::Type::NUMBER);
+ EXPECT_EQUAL(t.dimensions().size(), 0u);
+}
+
+TEST("require that SPARSE tensor type can be created") {
+ TensorType t = TensorType::sparse({"x", "y"});
+ EXPECT_TRUE(t.type() == TensorType::Type::SPARSE);
+ ASSERT_EQUAL(t.dimensions().size(), 2u);
+ EXPECT_EQUAL(t.dimensions()[0].name, "x");
+ EXPECT_EQUAL(t.dimensions()[1].name, "y");
+}
+
+TEST("require that SPARSE tensor type sorts dimensions") {
+ TensorType t = TensorType::sparse({"x", "z", "y"});
+ EXPECT_TRUE(t.type() == TensorType::Type::SPARSE);
+ ASSERT_EQUAL(t.dimensions().size(), 3u);
+ EXPECT_EQUAL(t.dimensions()[0].name, "x");
+ EXPECT_EQUAL(t.dimensions()[1].name, "y");
+ EXPECT_EQUAL(t.dimensions()[2].name, "z");
+}
+
+TEST("require that SPARSE tensor type use npos for dimension size") {
+ TensorType t = TensorType::sparse({"x", "y"});
+ EXPECT_TRUE(t.type() == TensorType::Type::SPARSE);
+ ASSERT_EQUAL(t.dimensions().size(), 2u);
+ EXPECT_EQUAL(t.dimensions()[0].name, "x");
+ EXPECT_EQUAL(t.dimensions()[0].size, TensorType::Dimension::npos);
+ EXPECT_EQUAL(t.dimensions()[1].name, "y");
+ EXPECT_EQUAL(t.dimensions()[1].size, TensorType::Dimension::npos);
+}
+
+TEST("require that DENSE tensor type can be created") {
+ TensorType t = TensorType::dense({{"x", 10}, {"y", 20}});
+ EXPECT_TRUE(t.type() == TensorType::Type::DENSE);
+ ASSERT_EQUAL(t.dimensions().size(), 2u);
+ EXPECT_EQUAL(t.dimensions()[0].name, "x");
+ EXPECT_EQUAL(t.dimensions()[0].size, 10u);
+ EXPECT_EQUAL(t.dimensions()[1].name, "y");
+ EXPECT_EQUAL(t.dimensions()[1].size, 20u);
+}
+
+TEST("require that DENSE tensor type sorts dimensions") {
+ TensorType t = TensorType::dense({{"x", 10}, {"z", 30}, {"y", 20}});
+ EXPECT_TRUE(t.type() == TensorType::Type::DENSE);
+ ASSERT_EQUAL(t.dimensions().size(), 3u);
+ EXPECT_EQUAL(t.dimensions()[0].name, "x");
+ EXPECT_EQUAL(t.dimensions()[0].size, 10u);
+ EXPECT_EQUAL(t.dimensions()[1].name, "y");
+ EXPECT_EQUAL(t.dimensions()[1].size, 20u);
+ EXPECT_EQUAL(t.dimensions()[2].name, "z");
+ EXPECT_EQUAL(t.dimensions()[2].size, 30u);
+}
+
+void verify_equal(const TensorType &a, const TensorType &b) {
+ EXPECT_TRUE(a == b);
+ EXPECT_TRUE(b == a);
+ EXPECT_FALSE(a != b);
+ EXPECT_FALSE(b != a);
+}
+
+void verify_not_equal(const TensorType &a, const TensorType &b) {
+ EXPECT_TRUE(a != b);
+ EXPECT_TRUE(b != a);
+ EXPECT_FALSE(a == b);
+ EXPECT_FALSE(b == a);
+}
+
+TEST("require that valid tensor types can be compared") {
+ TEST_DO(verify_equal(TensorType::number(), TensorType::number()));
+ TEST_DO(verify_not_equal(TensorType::number(), TensorType::sparse({})));
+ TEST_DO(verify_not_equal(TensorType::number(), TensorType::dense({})));
+ TEST_DO(verify_equal(TensorType::sparse({"x", "y"}), TensorType::sparse({"y", "x"})));
+ TEST_DO(verify_not_equal(TensorType::sparse({"x", "y"}), TensorType::sparse({"x", "y", "z"})));
+ TEST_DO(verify_not_equal(TensorType::sparse({}), TensorType::dense({})));
+ TEST_DO(verify_equal(TensorType::dense({{"x", 10}, {"y", 20}}), TensorType::dense({{"y", 20}, {"x", 10}})));
+ TEST_DO(verify_not_equal(TensorType::dense({{"x", 10}, {"y", 20}}), TensorType::dense({{"x", 10}, {"y", 10}})));
+}
+
+TEST("require that INVALID tensor type is not equal to any type") {
+ TEST_DO(verify_not_equal(TensorType::invalid(), TensorType::invalid()));
+ TEST_DO(verify_not_equal(TensorType::invalid(), TensorType::number()));
+ TEST_DO(verify_not_equal(TensorType::invalid(), TensorType::sparse({})));
+ TEST_DO(verify_not_equal(TensorType::invalid(), TensorType::dense({})));
+}
+
+void verify_predicates(const TensorType &type, bool expect_valid, bool expect_number, bool expect_tensor) {
+ EXPECT_EQUAL(type.is_valid(), expect_valid);
+ EXPECT_EQUAL(type.is_number(), expect_number);
+ EXPECT_EQUAL(type.is_tensor(), expect_tensor);
+}
+
+TEST("require that type-related predicate functions work as expected") {
+ TEST_DO(verify_predicates(TensorType::invalid(), false, false, false));
+ TEST_DO(verify_predicates(TensorType::number(), true, true, false));
+ TEST_DO(verify_predicates(TensorType::sparse({}), true, false, true));
+ TEST_DO(verify_predicates(TensorType::dense({}), true, false, true));
+}
+
+TEST("require that duplicate dimension names result in invalid types") {
+ EXPECT_TRUE(!TensorType::sparse({"x", "x"}).is_valid());
+ EXPECT_TRUE(!TensorType::dense({{"x", 10}, {"x", 10}}).is_valid());
+ EXPECT_TRUE(!TensorType::dense({{"x", 10}, {"x", 20}}).is_valid());
+}
+
+TEST("require that removing dimensions from non-tensor types gives invalid type") {
+ EXPECT_TRUE(!TensorType::invalid().remove_dimensions({"x"}).is_valid());
+ EXPECT_TRUE(!TensorType::number().remove_dimensions({"x"}).is_valid());
+ EXPECT_TRUE(!TensorType::invalid().remove_dimensions({}).is_valid());
+ EXPECT_TRUE(!TensorType::number().remove_dimensions({}).is_valid());
+}
+
+TEST("require that dimensions can be removed from sparse tensor types") {
+ TensorType type = TensorType::sparse({"x", "y", "z"});
+ EXPECT_EQUAL(TensorType::sparse({"y", "z"}), type.remove_dimensions({"x"}));
+ EXPECT_EQUAL(TensorType::sparse({"x", "z"}), type.remove_dimensions({"y"}));
+ EXPECT_EQUAL(TensorType::sparse({"x", "y"}), type.remove_dimensions({"z"}));
+ EXPECT_EQUAL(TensorType::sparse({"y"}), type.remove_dimensions({"x", "z"}));
+ EXPECT_EQUAL(TensorType::sparse({"y"}), type.remove_dimensions({"z", "x"}));
+}
+
+TEST("require that dimensions can be removed from dense tensor types") {
+ TensorType type = TensorType::dense({{"x", 10}, {"y", 20}, {"z", 30}});
+ EXPECT_EQUAL(TensorType::dense({{"y", 20}, {"z", 30}}), type.remove_dimensions({"x"}));
+ EXPECT_EQUAL(TensorType::dense({{"x", 10}, {"z", 30}}), type.remove_dimensions({"y"}));
+ EXPECT_EQUAL(TensorType::dense({{"x", 10}, {"y", 20}}), type.remove_dimensions({"z"}));
+ EXPECT_EQUAL(TensorType::dense({{"y", 20}}), type.remove_dimensions({"x", "z"}));
+ EXPECT_EQUAL(TensorType::dense({{"y", 20}}), type.remove_dimensions({"z", "x"}));
+}
+
+TEST("require that removing non-existing dimensions gives invalid type") {
+ EXPECT_TRUE(!TensorType::sparse({"y"}).remove_dimensions({"x"}).is_valid());
+ EXPECT_TRUE(!TensorType::dense({{"y", 10}}).remove_dimensions({"x"}).is_valid());
+}
+
+TEST("require that dimensions can be combined for sparse tensor types") {
+ TensorType sparse = TensorType::sparse({});
+ TensorType sparse_xy = TensorType::sparse({"x", "y"});
+ TensorType sparse_yz = TensorType::sparse({"y", "z"});
+ TensorType sparse_xyz = TensorType::sparse({"x", "y", "z"});
+ TensorType sparse_y = TensorType::sparse({"y"});
+ EXPECT_EQUAL(sparse_xy.add_dimensions_from(sparse_yz), sparse_xyz);
+ EXPECT_EQUAL(sparse_yz.add_dimensions_from(sparse_xy), sparse_xyz);
+ EXPECT_EQUAL(sparse_xy.keep_dimensions_in(sparse_yz), sparse_y);
+ EXPECT_EQUAL(sparse_yz.keep_dimensions_in(sparse_xy), sparse_y);
+ EXPECT_EQUAL(sparse_y.add_dimensions_from(sparse_y), sparse_y);
+ EXPECT_EQUAL(sparse_y.keep_dimensions_in(sparse_y), sparse_y);
+ EXPECT_EQUAL(sparse.add_dimensions_from(sparse), sparse);
+ EXPECT_EQUAL(sparse.keep_dimensions_in(sparse), sparse);
+}
+
+TEST("require that dimensions can be combined for dense tensor types") {
+ TensorType dense = TensorType::dense({});
+ TensorType dense_xy = TensorType::dense({{"x", 10}, {"y", 10}});
+ TensorType dense_yz = TensorType::dense({{"y", 10}, {"z", 10}});
+ TensorType dense_xyz = TensorType::dense({{"x", 10}, {"y", 10}, {"z", 10}});
+ TensorType dense_y = TensorType::dense({{"y", 10}});
+ EXPECT_EQUAL(dense_xy.add_dimensions_from(dense_yz), dense_xyz);
+ EXPECT_EQUAL(dense_yz.add_dimensions_from(dense_xy), dense_xyz);
+ EXPECT_EQUAL(dense_xy.keep_dimensions_in(dense_yz), dense_y);
+ EXPECT_EQUAL(dense_yz.keep_dimensions_in(dense_xy), dense_y);
+ EXPECT_EQUAL(dense_y.add_dimensions_from(dense_y), dense_y);
+ EXPECT_EQUAL(dense_y.keep_dimensions_in(dense_y), dense_y);
+ EXPECT_EQUAL(dense.add_dimensions_from(dense), dense);
+ EXPECT_EQUAL(dense.keep_dimensions_in(dense), dense);
+}
+
+void verify_combinable(const TensorType &a, const TensorType &b) {
+ EXPECT_TRUE(a.add_dimensions_from(b).is_valid());
+ EXPECT_TRUE(b.add_dimensions_from(a).is_valid());
+ EXPECT_TRUE(a.keep_dimensions_in(b).is_valid());
+ EXPECT_TRUE(b.keep_dimensions_in(a).is_valid());
+}
+
+void verify_not_combinable(const TensorType &a, const TensorType &b) {
+ EXPECT_TRUE(!a.add_dimensions_from(b).is_valid());
+ EXPECT_TRUE(!b.add_dimensions_from(a).is_valid());
+ EXPECT_TRUE(!a.keep_dimensions_in(b).is_valid());
+ EXPECT_TRUE(!b.keep_dimensions_in(a).is_valid());
+}
+
+TEST("require that dimensions need to have the same size to be combinable") {
+ verify_combinable(TensorType::dense({{"x", 10}}), TensorType::dense({{"x", 10}}));
+ verify_not_combinable(TensorType::dense({{"x", 10}}), TensorType::dense({{"x", 20}}));
+}
+
+TEST("require that dimension combining only works for equal tensor types") {
+ std::vector<TensorType> types = {TensorType::invalid(), TensorType::number(),
+ TensorType::sparse({}), TensorType::dense({})};
+ for (size_t a = 0; a < types.size(); ++a) {
+ for (size_t b = a; b < types.size(); ++b) {
+ TEST_STATE(vespalib::make_string("a=%zu, b=%zu", a, b).c_str());
+ if ((a == b) && types[a].is_tensor()) {
+ verify_combinable(types[a], types[b]);
+ } else {
+ verify_not_combinable(types[a], types[b]);
+ }
+ }
+ }
+}
+
+TEST("require that sparse tensor type can make spec") {
+ TensorType sparse = TensorType::sparse({});
+ TensorType sparse_xy = TensorType::sparse({"x", "y"});
+ TensorType sparse_yz = TensorType::sparse({"y", "z"});
+ TensorType sparse_xyz = TensorType::sparse({"x", "y", "z"});
+ TensorType sparse_y = TensorType::sparse({"y"});
+ EXPECT_EQUAL("tensor()", sparse.toSpec());
+ EXPECT_EQUAL("tensor(x{},y{})", sparse_xy.toSpec());
+ EXPECT_EQUAL("tensor(y{},z{})", sparse_yz.toSpec());
+ EXPECT_EQUAL("tensor(x{},y{},z{})", sparse_xyz.toSpec());
+ EXPECT_EQUAL("tensor(y{})", sparse_y.toSpec());
+}
+
+TEST("require that dense tensor type can make spec") {
+ TensorType dense = TensorType::dense({});
+ TensorType dense_xy = TensorType::dense({{"x", 10}, {"y", 10}});
+ TensorType dense_yz = TensorType::dense({{"y", 10}, {"z", 10}});
+ TensorType dense_xyz = TensorType::dense({{"x", 10}, {"y", 10}, {"z", 10}});
+ TensorType dense_y = TensorType::dense({{"y", 10}});
+ EXPECT_EQUAL("tensor()", dense.toSpec());
+ EXPECT_EQUAL("tensor(x[10],y[10])", dense_xy.toSpec());
+ EXPECT_EQUAL("tensor(y[10],z[10])", dense_yz.toSpec());
+ EXPECT_EQUAL("tensor(x[10],y[10],z[10])", dense_xyz.toSpec());
+ EXPECT_EQUAL("tensor(y[10])", dense_y.toSpec());
+}
+
+TEST("require that sparse tensor type spec can be parsed") {
+ TensorType sparse_xy = TensorType::sparse({"x", "y"});
+ TensorType sparse_yz = TensorType::sparse({"y", "z"});
+ TensorType sparse_xyz = TensorType::sparse({"x", "y", "z"});
+ TensorType sparse_y = TensorType::sparse({"y"});
+ EXPECT_EQUAL(sparse_xy, TensorType::fromSpec("tensor(x{},y{})"));
+ EXPECT_EQUAL(sparse_xy,
+ TensorType::fromSpec(" tensor ( x { } , y { } )"));
+ EXPECT_EQUAL(sparse_yz, TensorType::fromSpec("tensor(y{},z{})"));
+ EXPECT_EQUAL(sparse_xyz, TensorType::fromSpec("tensor(x{},y{},z{})"));
+ EXPECT_EQUAL(sparse_xyz, TensorType::fromSpec("tensor(z{},y{},x{})"));
+ EXPECT_EQUAL(sparse_y, TensorType::fromSpec("tensor(y{})"));
+}
+
+TEST("require that dense tensor type spec can be parsed") {
+ TensorType dense = TensorType::dense({});
+ TensorType dense_xy = TensorType::dense({{"x", 10}, {"y", 10}});
+ TensorType dense_yz = TensorType::dense({{"y", 10}, {"z", 10}});
+ TensorType dense_xyz = TensorType::dense({{"x", 10}, {"y", 10}, {"z", 10}});
+ TensorType dense_y = TensorType::dense({{"y", 10}});
+ EXPECT_EQUAL(dense, TensorType::fromSpec("tensor()"));
+ EXPECT_EQUAL(dense_xy, TensorType::fromSpec("tensor(x[10],y[10])"));
+ EXPECT_EQUAL(dense_xy,
+ TensorType::fromSpec(" tensor ( x [ 10 ] , y [ 10 ] ) "));
+ EXPECT_EQUAL(dense_yz, TensorType::fromSpec("tensor(y[10],z[10])"));
+ EXPECT_EQUAL(dense_xyz, TensorType::fromSpec("tensor(x[10],y[10],z[10])"));
+ EXPECT_EQUAL(dense_xyz, TensorType::fromSpec("tensor(z[10],y[10],x[10])"));
+ EXPECT_EQUAL(dense_y, TensorType::fromSpec("tensor(y[10])"));
+}
+
+TEST("require that tensor type can be converted to value type") {
+ EXPECT_TRUE(TensorType::invalid().as_value_type().is_error());
+ EXPECT_TRUE(TensorType::number().as_value_type().is_double());
+ EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y"}, {"z"}}),
+ TensorType::sparse({"x", "y", "z"}).as_value_type());
+ EXPECT_EQUAL(ValueType::tensor_type({{"x", 10}, {"y", 20}, {"z", 30}}),
+ TensorType::dense({{"x", 10}, {"y", 20}, {"z", 30}}).as_value_type());
+ EXPECT_EQUAL(ValueType::tensor_type({}), TensorType::sparse({}).as_value_type());
+ EXPECT_EQUAL(ValueType::tensor_type({}), TensorType::dense({}).as_value_type());
+}
+
+TEST("require that invalid tensor type spec is parsed as invalid") {
+ TensorType::Type invalid = TensorType::Type::INVALID;
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tansor(y{})").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y{10})").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y{}").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y{}),").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(x{},y[10])").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tansor(y[10])").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y[])").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y[10]").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y[10]),").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(x[10],y{})").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("invalid").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("number").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("dense").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("sparse").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("densetensor").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("sparsetensor").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec(" ").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y{},y{})").type());
+ EXPECT_TRUE(invalid == TensorType::fromSpec("tensor(y[10],y[10])").type());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/testapp-debug/.gitignore b/vespalib/src/tests/testapp-debug/.gitignore
new file mode 100644
index 00000000000..206e1f1546f
--- /dev/null
+++ b/vespalib/src/tests/testapp-debug/.gitignore
@@ -0,0 +1,9 @@
+.depend
+Makefile
+debug_test
+diff.out
+lhs.out
+rhs.out
+testapp-debug_test
+vespalib_debug_test_app
+vespalib_testapp-debug_test_app
diff --git a/vespalib/src/tests/testapp-debug/CMakeLists.txt b/vespalib/src/tests/testapp-debug/CMakeLists.txt
new file mode 100644
index 00000000000..7102162f76f
--- /dev/null
+++ b/vespalib/src/tests/testapp-debug/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_testapp-debug_test_app
+ SOURCES
+ testapp-debug.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_testapp-debug_test_app COMMAND vespalib_testapp-debug_test_app)
+vespa_add_executable(vespalib_debug_test_app
+ SOURCES
+ debugtest.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/testapp-debug/DESC b/vespalib/src/tests/testapp-debug/DESC
new file mode 100644
index 00000000000..5e09bd953cb
--- /dev/null
+++ b/vespalib/src/tests/testapp-debug/DESC
@@ -0,0 +1 @@
+testapp-debug test. Take a look at testapp-debug.cpp for details.
diff --git a/vespalib/src/tests/testapp-debug/FILES b/vespalib/src/tests/testapp-debug/FILES
new file mode 100644
index 00000000000..999e0707bf0
--- /dev/null
+++ b/vespalib/src/tests/testapp-debug/FILES
@@ -0,0 +1 @@
+testapp-debug.cpp
diff --git a/vespalib/src/tests/testapp-debug/debugtest.cpp b/vespalib/src/tests/testapp-debug/debugtest.cpp
new file mode 100644
index 00000000000..a3c22d2f04a
--- /dev/null
+++ b/vespalib/src/tests/testapp-debug/debugtest.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+
+using namespace vespalib;
+
+void testDebug() {
+ TEST_DEBUG("lhs.out", "rhs.out");
+ EXPECT_EQUAL("a\n"
+ "b\n"
+ "c\n",
+
+ "a\n"
+ "b\n"
+ "c\n"
+ "d\n");
+ EXPECT_EQUAL("a\n"
+ "d\n"
+ "b\n"
+ "c\n",
+
+ "a\n"
+ "b\n"
+ "c\n"
+ "d\n");
+ EXPECT_EQUAL(1, 2);
+ EXPECT_EQUAL("foo", "bar");
+}
+
+TEST_MAIN() {
+ testDebug();
+}
diff --git a/vespalib/src/tests/testapp-debug/diff.ref b/vespalib/src/tests/testapp-debug/diff.ref
new file mode 100644
index 00000000000..f07ae077630
--- /dev/null
+++ b/vespalib/src/tests/testapp-debug/diff.ref
@@ -0,0 +1,18 @@
+1c1
+< [LHS]
+---
+> [RHS]
+5a6
+> d
+9d9
+< d
+11a12
+> d
+14c15
+< 1
+---
+> 2
+16c17
+< foo
+---
+> bar
diff --git a/vespalib/src/tests/testapp-debug/testapp-debug.cpp b/vespalib/src/tests/testapp-debug/testapp-debug.cpp
new file mode 100644
index 00000000000..7b332220f1d
--- /dev/null
+++ b/vespalib/src/tests/testapp-debug/testapp-debug.cpp
@@ -0,0 +1,11 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+
+using namespace vespalib;
+
+TEST_MAIN() {
+ system("./vespalib_debug_test_app");
+ system("diff lhs.out rhs.out > diff.out");
+ EXPECT_EQUAL(system("diff diff.out diff.ref"), 0);
+}
diff --git a/vespalib/src/tests/testapp-generic/.gitignore b/vespalib/src/tests/testapp-generic/.gitignore
new file mode 100644
index 00000000000..eb69e5c5b65
--- /dev/null
+++ b/vespalib/src/tests/testapp-generic/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+testapp-generic_test
+vespalib_testapp-generic_test_app
diff --git a/vespalib/src/tests/testapp-generic/CMakeLists.txt b/vespalib/src/tests/testapp-generic/CMakeLists.txt
new file mode 100644
index 00000000000..109af28225b
--- /dev/null
+++ b/vespalib/src/tests/testapp-generic/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_testapp-generic_test_app
+ SOURCES
+ testapp-generic.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_testapp-generic_test_app COMMAND vespalib_testapp-generic_test_app)
diff --git a/vespalib/src/tests/testapp-generic/DESC b/vespalib/src/tests/testapp-generic/DESC
new file mode 100644
index 00000000000..a4448179841
--- /dev/null
+++ b/vespalib/src/tests/testapp-generic/DESC
@@ -0,0 +1 @@
+testapp-generic test. Take a look at testapp-generic.cpp for details.
diff --git a/vespalib/src/tests/testapp-generic/FILES b/vespalib/src/tests/testapp-generic/FILES
new file mode 100644
index 00000000000..ad8ea50bc6e
--- /dev/null
+++ b/vespalib/src/tests/testapp-generic/FILES
@@ -0,0 +1 @@
+testapp-generic.cpp
diff --git a/vespalib/src/tests/testapp-generic/testapp-generic.cpp b/vespalib/src/tests/testapp-generic/testapp-generic.cpp
new file mode 100644
index 00000000000..6a71ea4532c
--- /dev/null
+++ b/vespalib/src/tests/testapp-generic/testapp-generic.cpp
@@ -0,0 +1,191 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <stdexcept>
+
+using namespace vespalib;
+
+void assertProgress(uint32_t pass, uint32_t fail) {
+ TEST_FLUSH(); // sync progress to shared state
+ if ((TEST_MASTER.getProgress().passCnt != pass) ||
+ (TEST_MASTER.getProgress().failCnt != fail))
+ {
+ TEST_FATAL(make_string("expected (pass/fail) %d/%d, but was %zu/%zu",
+ pass, fail, TEST_MASTER.getProgress().passCnt,
+ TEST_MASTER.getProgress().failCnt).c_str());
+ }
+}
+
+void testGeneric() {
+ uint32_t a = 10;
+ uint32_t b = 20;
+
+ std::string x("xxx");
+ std::string y("yyy");
+
+ { // test ==
+ EXPECT_EQUAL(a, a); // OK
+ assertProgress(1, 0);
+ EXPECT_EQUAL(a, b); // FAIL
+ assertProgress(1, 1);
+ EXPECT_EQUAL(b, a); // FAIL
+ assertProgress(1, 2);
+
+ EXPECT_EQUAL(x, x); // OK
+ assertProgress(2, 2);
+ EXPECT_EQUAL(x, y); // FAIL
+ assertProgress(2, 3);
+ EXPECT_EQUAL(y, x); // FAIL
+ assertProgress(2, 4);
+ }
+ { // test !=
+ EXPECT_NOT_EQUAL(a, a); // FAIL
+ assertProgress(2, 5);
+ EXPECT_NOT_EQUAL(a, b); // OK
+ assertProgress(3, 5);
+ EXPECT_NOT_EQUAL(b, a); // OK
+ assertProgress(4, 5);
+
+ EXPECT_NOT_EQUAL(x, x); // FAIL
+ assertProgress(4, 6);
+ EXPECT_NOT_EQUAL(x, y); // OK
+ assertProgress(5, 6);
+ EXPECT_NOT_EQUAL(y, x); // OK
+ assertProgress(6, 6);
+ }
+ { // test <
+ EXPECT_LESS(a, a); // FAIL
+ assertProgress(6, 7);
+ EXPECT_LESS(a, b); // OK
+ assertProgress(7, 7);
+ EXPECT_LESS(b, a); // FAIL
+ assertProgress(7, 8);
+
+ EXPECT_LESS(x, x); // FAIL
+ assertProgress(7, 9);
+ EXPECT_LESS(x, y); // OK
+ assertProgress(8, 9);
+ EXPECT_LESS(y, x); // FAIL
+ assertProgress(8, 10);
+ }
+ { // test <=
+ EXPECT_LESS_EQUAL(a, a); // OK
+ assertProgress(9, 10);
+ EXPECT_LESS_EQUAL(a, b); // OK
+ assertProgress(10, 10);
+ EXPECT_LESS_EQUAL(b, a); // FAIL
+ assertProgress(10, 11);
+
+ EXPECT_LESS_EQUAL(x, x); // OK
+ assertProgress(11, 11);
+ EXPECT_LESS_EQUAL(x, y); // OK
+ assertProgress(12, 11);
+ EXPECT_LESS_EQUAL(y, x); // FAIL
+ assertProgress(12, 12);
+ }
+ { // test >
+ EXPECT_GREATER(a, a); // FAIL
+ assertProgress(12, 13);
+ EXPECT_GREATER(a, b); // FAIL
+ assertProgress(12, 14);
+ EXPECT_GREATER(b, a); // OK
+ assertProgress(13, 14);
+
+ EXPECT_GREATER(x, x); // FAIL
+ assertProgress(13, 15);
+ EXPECT_GREATER(x, y); // FAIL
+ assertProgress(13, 16);
+ EXPECT_GREATER(y, x); // OK
+ assertProgress(14, 16);
+ }
+ { // test >=
+ EXPECT_GREATER_EQUAL(a, a); // OK
+ assertProgress(15, 16);
+ EXPECT_GREATER_EQUAL(a, b); // FAIL
+ assertProgress(15, 17);
+ EXPECT_GREATER_EQUAL(b, a); // OK
+ assertProgress(16, 17);
+
+ EXPECT_GREATER_EQUAL(x, x); // OK
+ assertProgress(17, 17);
+ EXPECT_GREATER_EQUAL(x, y); // FAIL
+ assertProgress(17, 18);
+ EXPECT_GREATER_EQUAL(y, x); // OK
+ assertProgress(18, 18);
+ }
+ { // test ~=
+ EXPECT_APPROX(1.0f, 1.1, 0.2); // OK
+ assertProgress(19, 18);
+ EXPECT_APPROX(1.0f, 1.1, 0.05); // FAIL
+ assertProgress(19, 19);
+ EXPECT_APPROX(5, 5, 0); // OK
+ assertProgress(20, 19);
+ EXPECT_APPROX(5, 6, 1); // OK
+ assertProgress(21, 19);
+
+ EXPECT_APPROX(1.1, 1.0f, 0.2); // OK
+ assertProgress(22, 19);
+ EXPECT_APPROX(1.1, 1.0f, 0.05); // FAIL
+ assertProgress(22, 20);
+ EXPECT_APPROX(5, 5, 0); // OK
+ assertProgress(23, 20);
+ EXPECT_APPROX(6, 5, 1); // OK
+ assertProgress(24, 20);
+ }
+ { // test !~=
+ EXPECT_NOT_APPROX(1.0f, 1.1, 0.2); // FAIL
+ assertProgress(24, 21);
+ EXPECT_NOT_APPROX(1.0f, 1.1, 0.05); // OK
+ assertProgress(25, 21);
+ EXPECT_NOT_APPROX(5, 5, 0); // FAIL
+ assertProgress(25, 22);
+ EXPECT_NOT_APPROX(5, 6, 1); // FAIL
+ assertProgress(25, 23);
+
+ EXPECT_NOT_APPROX(1.1, 1.0f, 0.2); // FAIL
+ assertProgress(25, 24);
+ EXPECT_NOT_APPROX(1.1, 1.0f, 0.05); // OK
+ assertProgress(26, 24);
+ EXPECT_NOT_APPROX(5, 5, 0); // FAIL
+ assertProgress(26, 25);
+ EXPECT_NOT_APPROX(6, 5, 1); // FAIL
+ assertProgress(26, 26);
+ }
+ { // test throwing exceptions
+ EXPECT_EXCEPTION({}, std::runtime_error, "foo"); // FAIL
+ assertProgress(26, 27);
+ try {
+ EXPECT_EXCEPTION(throw std::logic_error("foo"), std::runtime_error,
+ "foo"); // FAIL
+ } catch (std::logic_error &) {
+ }
+ assertProgress(26, 28);
+ try {
+ EXPECT_EXCEPTION(throw std::runtime_error("bar"), std::runtime_error,
+ "foo"); // FAIL
+ } catch (std::runtime_error &) {
+ }
+ assertProgress(26, 29);
+ EXPECT_EXCEPTION(throw std::runtime_error("foo"), std::runtime_error,
+ "foo"); // OK
+ assertProgress(27, 29);
+ }
+ { // test implicit approx for double
+ double foo = 1.0;
+ double bar = 1.0 + 1e-9;
+ double baz = 1.0 + 1e-5;
+ EXPECT_TRUE(foo != bar); // OK
+ EXPECT_EQUAL(foo, bar); // OK
+ EXPECT_EQUAL(bar, foo); // OK
+ assertProgress(30, 29);
+ EXPECT_EQUAL(foo, baz); // FAIL
+ EXPECT_EQUAL(baz, foo); // FAIL
+ assertProgress(30, 31);
+ }
+}
+
+TEST_MAIN() {
+ testGeneric();
+ TEST_MASTER.discardFailedChecks(31);
+}
diff --git a/vespalib/src/tests/testapp-main/.gitignore b/vespalib/src/tests/testapp-main/.gitignore
new file mode 100644
index 00000000000..1f31c2a688c
--- /dev/null
+++ b/vespalib/src/tests/testapp-main/.gitignore
@@ -0,0 +1 @@
+vespalib_testapp-main_test_app
diff --git a/vespalib/src/tests/testapp-main/CMakeLists.txt b/vespalib/src/tests/testapp-main/CMakeLists.txt
new file mode 100644
index 00000000000..8aeb28e975d
--- /dev/null
+++ b/vespalib/src/tests/testapp-main/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_testapp-main_test_app
+ SOURCES
+ testapp-main_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_testapp-main_test_app COMMAND vespalib_testapp-main_test_app)
diff --git a/vespalib/src/tests/testapp-main/FILES b/vespalib/src/tests/testapp-main/FILES
new file mode 100644
index 00000000000..28abdbd9e18
--- /dev/null
+++ b/vespalib/src/tests/testapp-main/FILES
@@ -0,0 +1 @@
+testapp-main_test.cpp
diff --git a/vespalib/src/tests/testapp-main/testapp-main_test.cpp b/vespalib/src/tests/testapp-main/testapp-main_test.cpp
new file mode 100644
index 00000000000..c252d8fecc5
--- /dev/null
+++ b/vespalib/src/tests/testapp-main/testapp-main_test.cpp
@@ -0,0 +1,11 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+
+void subtest() {
+ EXPECT_TRUE(true);
+}
+
+TEST_MAIN() {
+ TEST_DO(subtest());
+}
diff --git a/vespalib/src/tests/testapp-state/.cvsignore b/vespalib/src/tests/testapp-state/.cvsignore
new file mode 100644
index 00000000000..6beefaa8e76
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/.cvsignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+testapp-state_test
diff --git a/vespalib/src/tests/testapp-state/.gitignore b/vespalib/src/tests/testapp-state/.gitignore
new file mode 100644
index 00000000000..db6a3e3e414
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/.gitignore
@@ -0,0 +1,8 @@
+.depend
+Makefile
+actual.txt
+out.txt
+state_test
+testapp-state_test
+vespalib_state_test_app
+vespalib_testapp-state_test_app
diff --git a/vespalib/src/tests/testapp-state/CMakeLists.txt b/vespalib/src/tests/testapp-state/CMakeLists.txt
new file mode 100644
index 00000000000..0fa88d7ddd2
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_testapp-state_test_app
+ SOURCES
+ testapp-state.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_testapp-state_test_app COMMAND vespalib_testapp-state_test_app)
+vespa_add_executable(vespalib_state_test_app
+ SOURCES
+ statetest.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/testapp-state/DESC b/vespalib/src/tests/testapp-state/DESC
new file mode 100644
index 00000000000..3f29b94f72d
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/DESC
@@ -0,0 +1 @@
+testapp-state test. Take a look at testapp-state.cpp for details.
diff --git a/vespalib/src/tests/testapp-state/FILES b/vespalib/src/tests/testapp-state/FILES
new file mode 100644
index 00000000000..ef2eb9303fc
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/FILES
@@ -0,0 +1 @@
+testapp-state.cpp
diff --git a/vespalib/src/tests/testapp-state/expect.txt b/vespalib/src/tests/testapp-state/expect.txt
new file mode 100644
index 00000000000..87b7721907e
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/expect.txt
@@ -0,0 +1,22 @@
+ STATE[0]: 'foo' (statetest.cpp:26)
+ STATE[1]: 'bar' (statetest.cpp:29)
+ STATE[0]: 'foo' (statetest.cpp:26)
+ STATE[2]: 'baz' (statetest.cpp:32)
+ STATE[1]: 'bar' (statetest.cpp:29)
+ STATE[0]: 'foo' (statetest.cpp:26)
+ STATE[1]: 'bar' (statetest.cpp:29)
+ STATE[0]: 'foo' (statetest.cpp:26)
+ STATE[0]: 'foo' (statetest.cpp:26)
+ STATE[0]: 'testSomething()' (statetest.cpp:42)
+ STATE[1]: 'testInner()' (statetest.cpp:13)
+ STATE[0]: 'testSomething()' (statetest.cpp:42)
+ STATE[0]: 'testSomething()' (statetest.cpp:42)
+ STATE[0]: 'something else' (statetest.cpp:45)
+ STATE[1]: 'testSomethingElse()' (statetest.cpp:47)
+ STATE[0]: 'something else' (statetest.cpp:45)
+ STATE[2]: 'testInner()' (statetest.cpp:19)
+ STATE[1]: 'testSomethingElse()' (statetest.cpp:47)
+ STATE[0]: 'something else' (statetest.cpp:45)
+ STATE[1]: 'testSomethingElse()' (statetest.cpp:47)
+ STATE[0]: 'something else' (statetest.cpp:45)
+ STATE[0]: 'something else' (statetest.cpp:45)
diff --git a/vespalib/src/tests/testapp-state/statetest.cpp b/vespalib/src/tests/testapp-state/statetest.cpp
new file mode 100644
index 00000000000..4ca9fc4259e
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/statetest.cpp
@@ -0,0 +1,54 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+
+using namespace vespalib;
+
+void testInner() {
+ EXPECT_TRUE(false);
+}
+
+void testSomething() {
+ EXPECT_TRUE(false);
+ TEST_DO(testInner());
+ EXPECT_TRUE(false);
+}
+
+void testSomethingElse() {
+ EXPECT_TRUE(false);
+ TEST_DO(testInner());
+ EXPECT_TRUE(false);
+}
+
+void testState() {
+ EXPECT_TRUE(false);
+ {
+ TEST_STATE("foo");
+ EXPECT_TRUE(false);
+ {
+ TEST_STATE("bar");
+ EXPECT_TRUE(false);
+ {
+ TEST_STATE("baz");
+ EXPECT_TRUE(false);
+ }
+ EXPECT_TRUE(false);
+ }
+ EXPECT_TRUE(false);
+ }
+ EXPECT_TRUE(false);
+ EXPECT_TRUE(false);
+ {
+ TEST_DO(testSomething());
+ }
+ {
+ TEST_STATE("something else");
+ EXPECT_TRUE(false);
+ TEST_DO(testSomethingElse());
+ EXPECT_TRUE(false);
+ }
+}
+
+TEST_MAIN() {
+ testState();
+}
diff --git a/vespalib/src/tests/testapp-state/testapp-state.cpp b/vespalib/src/tests/testapp-state/testapp-state.cpp
new file mode 100644
index 00000000000..016ad90dd50
--- /dev/null
+++ b/vespalib/src/tests/testapp-state/testapp-state.cpp
@@ -0,0 +1,11 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+
+using namespace vespalib;
+
+TEST_MAIN() {
+ system("./vespalib_state_test_app > out.txt 2>&1 out.txt");
+ system("cat out.txt | grep STATE | sed 's/([^)].*\\//(/' > actual.txt");
+ EXPECT_EQUAL(system("diff -u expect.txt actual.txt"), 0);
+}
diff --git a/vespalib/src/tests/testkit-mt/.gitignore b/vespalib/src/tests/testkit-mt/.gitignore
new file mode 100644
index 00000000000..fefc0b2936f
--- /dev/null
+++ b/vespalib/src/tests/testkit-mt/.gitignore
@@ -0,0 +1 @@
+vespalib_testkit-mt_test_app
diff --git a/vespalib/src/tests/testkit-mt/CMakeLists.txt b/vespalib/src/tests/testkit-mt/CMakeLists.txt
new file mode 100644
index 00000000000..ad74618064a
--- /dev/null
+++ b/vespalib/src/tests/testkit-mt/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_testkit-mt_test_app
+ SOURCES
+ testkit-mt_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_testkit-mt_test_app COMMAND vespalib_testkit-mt_test_app)
diff --git a/vespalib/src/tests/testkit-mt/FILES b/vespalib/src/tests/testkit-mt/FILES
new file mode 100644
index 00000000000..c351aaf9e79
--- /dev/null
+++ b/vespalib/src/tests/testkit-mt/FILES
@@ -0,0 +1 @@
+testkit-mt_test.cpp
diff --git a/vespalib/src/tests/testkit-mt/testkit-mt_test.cpp b/vespalib/src/tests/testkit-mt/testkit-mt_test.cpp
new file mode 100644
index 00000000000..336a748773e
--- /dev/null
+++ b/vespalib/src/tests/testkit-mt/testkit-mt_test.cpp
@@ -0,0 +1,88 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+
+using namespace vespalib;
+
+void checkThreads(size_t thread_id, size_t num_threads, std::vector<size_t> &state) {
+ if (thread_id == 0) {
+ for (size_t i = 0; i < num_threads; ++i) {
+ state.push_back(num_threads);
+ }
+ }
+ TEST_BARRIER();
+ ASSERT_EQUAL(num_threads, state.size());
+ state[thread_id] = thread_id;
+ TEST_BARRIER();
+ if (thread_id == 0) {
+ for (size_t i = 0; i < num_threads; ++i) {
+ EXPECT_EQUAL(i, state[i]);
+ }
+ }
+}
+
+TEST_MT("multi-threaded test without fixtures", 100) {
+ static std::vector<size_t> state;
+ TEST_DO(checkThreads(thread_id, num_threads, state));
+}
+
+TEST_MT_F("multi-threaded test with 1 fixture", 100, std::vector<size_t>()) {
+ EXPECT_EQUAL(&f, &f1);
+ TEST_DO(checkThreads(thread_id, num_threads, f1));
+}
+
+TEST_MT_FF("multi-threaded test with 2 fixtures", 100, std::vector<size_t>(), size_t(5)) {
+ EXPECT_EQUAL(5u, f2);
+ TEST_DO(checkThreads(thread_id, num_threads, f1));
+}
+
+TEST_MT_FFF("multi-threaded test with 3 fixtures", 100, std::vector<size_t>(), size_t(5), size_t(10)) {
+ EXPECT_EQUAL(5u, f2);
+ EXPECT_EQUAL(10u, f3);
+ TEST_DO(checkThreads(thread_id, num_threads, f1));
+}
+
+TEST_MT_F("let fixture pick up thread count", 14, size_t(num_threads)) {
+ EXPECT_EQUAL(num_threads, f1);
+}
+
+TEST_MT_FF("let fixtures pick up thread count", 14, size_t(num_threads), size_t(num_threads)) {
+ EXPECT_EQUAL(num_threads, f1);
+ EXPECT_EQUAL(num_threads, f2);
+}
+
+TEST_MT_FFF("let fixturess pick up thread count", 14, size_t(num_threads),
+ size_t(num_threads), size_t(num_threads))
+{
+ EXPECT_EQUAL(num_threads, f1);
+ EXPECT_EQUAL(num_threads, f2);
+ EXPECT_EQUAL(num_threads, f3);
+}
+
+IGNORE_TEST_MT("partial unwind breaks barrier", 10) {
+ if (thread_id == 5) {
+ TEST_FATAL("partial unwind");
+ }
+ TEST_BARRIER();
+}
+
+IGNORE_TEST_MT("ignore multithreaded test with no fixtures", 10) {
+ EXPECT_TRUE(true);
+}
+
+IGNORE_TEST_MT_F("ignore multithreaded test with 1 fixture", 10, int(5)) {
+ EXPECT_EQUAL(5, f1);
+}
+
+IGNORE_TEST_MT_FF("ignore multithreaded test with 2 fixtures", 10, int(5), int(10)) {
+ EXPECT_EQUAL(5, f1);
+ EXPECT_EQUAL(10, f2);
+}
+
+IGNORE_TEST_MT_FFF("ignore multithreaded test with 3 fixtures", 10, int(5), int(10), int(15)) {
+ EXPECT_EQUAL(5, f1);
+ EXPECT_EQUAL(10, f2);
+ EXPECT_EQUAL(15, f3);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/testkit-subset/.gitignore b/vespalib/src/tests/testkit-subset/.gitignore
new file mode 100644
index 00000000000..1007cdc2b36
--- /dev/null
+++ b/vespalib/src/tests/testkit-subset/.gitignore
@@ -0,0 +1,2 @@
+/out.txt
+vespalib_testkit-subset_test_app
diff --git a/vespalib/src/tests/testkit-subset/CMakeLists.txt b/vespalib/src/tests/testkit-subset/CMakeLists.txt
new file mode 100644
index 00000000000..8267a213aa7
--- /dev/null
+++ b/vespalib/src/tests/testkit-subset/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_testkit-subset_test_app
+ SOURCES
+ testkit-subset_test.cpp
+ testkit-subset_extra.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_testkit-subset_test_app COMMAND sh testkit-subset_test.sh)
diff --git a/vespalib/src/tests/testkit-subset/FILES b/vespalib/src/tests/testkit-subset/FILES
new file mode 100644
index 00000000000..225ad2ae56c
--- /dev/null
+++ b/vespalib/src/tests/testkit-subset/FILES
@@ -0,0 +1,4 @@
+testkit-subset_test.cpp
+testkit-subset_extra.cpp
+out.txt
+out.ref.txt
diff --git a/vespalib/src/tests/testkit-subset/out.ref.txt b/vespalib/src/tests/testkit-subset/out.ref.txt
new file mode 100644
index 00000000000..18dd7ea756d
--- /dev/null
+++ b/vespalib/src/tests/testkit-subset/out.ref.txt
@@ -0,0 +1,20 @@
+testkit-subset_test.cpp: info: running test suite 'testkit-subset_test.cpp'
+testkit-subset_test.cpp: info: only running tests matching 'pass'
+testkit-subset_test.cpp: info: trace: thread '0(1)' (testkit-subset_extra.cpp:5)
+testkit-subset_test.cpp: info: status_for_test 'will pass extra': PASS
+testkit-subset_test.cpp: info: trace: thread '0(1)' (testkit-subset_test.cpp:5)
+testkit-subset_test.cpp: info: status_for_test 'will pass main': PASS
+testkit-subset_test.cpp: info: test summary --- 2 test(s) passed --- 0 test(s) failed
+testkit-subset_test.cpp: info: test summary --- 2 test(s) skipped
+testkit-subset_test.cpp: info: imported 2 passed check(s) from 1 thread(s)
+testkit-subset_test.cpp: info: summary --- 2 check(s) passed --- 0 check(s) failed
+testkit-subset_test.cpp: info: CONCLUSION: PASS
+testkit-subset_test.cpp: info: running test suite 'testkit-subset_test.cpp'
+testkit-subset_test.cpp: info: only running tests matching 'extra\.cpp:.*pass.*'
+testkit-subset_test.cpp: info: trace: thread '0(1)' (testkit-subset_extra.cpp:5)
+testkit-subset_test.cpp: info: status_for_test 'will pass extra': PASS
+testkit-subset_test.cpp: info: test summary --- 1 test(s) passed --- 0 test(s) failed
+testkit-subset_test.cpp: info: test summary --- 3 test(s) skipped
+testkit-subset_test.cpp: info: imported 1 passed check(s) from 1 thread(s)
+testkit-subset_test.cpp: info: summary --- 1 check(s) passed --- 0 check(s) failed
+testkit-subset_test.cpp: info: CONCLUSION: PASS
diff --git a/vespalib/src/tests/testkit-subset/testkit-subset_extra.cpp b/vespalib/src/tests/testkit-subset/testkit-subset_extra.cpp
new file mode 100644
index 00000000000..6b507f23cef
--- /dev/null
+++ b/vespalib/src/tests/testkit-subset/testkit-subset_extra.cpp
@@ -0,0 +1,12 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+TEST("will pass extra") {
+ TEST_TRACE();
+ EXPECT_TRUE(true);
+}
+
+TEST("will fail extra") {
+ TEST_TRACE();
+ EXPECT_TRUE(false);
+}
diff --git a/vespalib/src/tests/testkit-subset/testkit-subset_test.cpp b/vespalib/src/tests/testkit-subset/testkit-subset_test.cpp
new file mode 100644
index 00000000000..b02e3b9cd5c
--- /dev/null
+++ b/vespalib/src/tests/testkit-subset/testkit-subset_test.cpp
@@ -0,0 +1,14 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+TEST("will pass main") {
+ TEST_TRACE();
+ EXPECT_TRUE(true);
+}
+
+TEST("will fail main") {
+ TEST_TRACE();
+ EXPECT_TRUE(false);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/testkit-subset/testkit-subset_test.sh b/vespalib/src/tests/testkit-subset/testkit-subset_test.sh
new file mode 100755
index 00000000000..6da1584a3f3
--- /dev/null
+++ b/vespalib/src/tests/testkit-subset/testkit-subset_test.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
+TEST_SUBSET=pass $VALGRIND ./vespalib_testkit-subset_test_app 2> out.txt
+TEST_SUBSET="extra\.cpp:.*pass.*" $VALGRIND ./vespalib_testkit-subset_test_app 2>> out.txt
+cat out.txt | grep "\.cpp: " | sed "s~$DIR~~g" > out.relpath.txt
+diff -u out.relpath.txt out.ref.txt
diff --git a/vespalib/src/tests/testkit-testcase/.gitignore b/vespalib/src/tests/testkit-testcase/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/vespalib/src/tests/testkit-testcase/.gitignore
diff --git a/vespalib/src/tests/testkit-testhook/.gitignore b/vespalib/src/tests/testkit-testhook/.gitignore
new file mode 100644
index 00000000000..25396d26d0c
--- /dev/null
+++ b/vespalib/src/tests/testkit-testhook/.gitignore
@@ -0,0 +1 @@
+vespalib_testkit-testhook_test_app
diff --git a/vespalib/src/tests/testkit-testhook/CMakeLists.txt b/vespalib/src/tests/testkit-testhook/CMakeLists.txt
new file mode 100644
index 00000000000..8f5d31ba338
--- /dev/null
+++ b/vespalib/src/tests/testkit-testhook/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_testkit-testhook_test_app
+ SOURCES
+ testkit-testhook_test.cpp
+ DEPENDS
+ vespalib
+ cppunit
+)
+vespa_add_test(NAME vespalib_testkit-testhook_test_app COMMAND vespalib_testkit-testhook_test_app)
diff --git a/vespalib/src/tests/testkit-testhook/DESC b/vespalib/src/tests/testkit-testhook/DESC
new file mode 100644
index 00000000000..5b6987a8361
--- /dev/null
+++ b/vespalib/src/tests/testkit-testhook/DESC
@@ -0,0 +1 @@
+testkit-testcase test. Take a look at testkit-testcase_test.cpp for details.
diff --git a/vespalib/src/tests/testkit-testhook/FILES b/vespalib/src/tests/testkit-testhook/FILES
new file mode 100644
index 00000000000..ee54954c392
--- /dev/null
+++ b/vespalib/src/tests/testkit-testhook/FILES
@@ -0,0 +1 @@
+testkit-testcase_test.cpp
diff --git a/vespalib/src/tests/testkit-testhook/testkit-testhook_test.cpp b/vespalib/src/tests/testkit-testhook/testkit-testhook_test.cpp
new file mode 100644
index 00000000000..6234b6f6308
--- /dev/null
+++ b/vespalib/src/tests/testkit-testhook/testkit-testhook_test.cpp
@@ -0,0 +1,181 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <stdexcept>
+
+//-----------------------------------------------------------------------------
+
+struct Fixture {
+ int number;
+ Fixture(int a) : number(a) {}
+ Fixture(int a, int b) : number(a * b) {}
+ Fixture(int a, int b, int c) : number(a * b * c) {}
+};
+
+struct FixtureRef {
+ Fixture &ref;
+ FixtureRef(Fixture &r) : ref(r) {}
+};
+
+struct FixtureRef2 {
+ Fixture &ref1;
+ FixtureRef &ref2;
+ FixtureRef2(Fixture &r1, FixtureRef &r2) : ref1(r1), ref2(r2) {}
+};
+
+struct Fixture1 {
+ int number;
+ Fixture1() : number(1) {}
+};
+
+struct Fixture2 {
+ int number;
+ Fixture2() : number(2) {}
+};
+
+struct Fixture3 {
+ int number;
+ Fixture3() : number(3) {}
+};
+
+//-----------------------------------------------------------------------------
+
+TEST("first test; pass count should be 0") {
+ TEST_FLUSH();
+ EXPECT_EQUAL(0u, TEST_MASTER.getProgress().passCnt);
+ EXPECT_EQUAL(0u, TEST_MASTER.getProgress().failCnt);
+}
+
+//-----------------------------------------------------------------------------
+
+IGNORE_TEST("ignored test with a single non-fatal error") {
+ EXPECT_EQUAL(1, 10);
+}
+
+TEST("verify that failure from previous test was ignored") {
+ EXPECT_EQUAL(0u, TEST_MASTER.getProgress().failCnt);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("a fatal failure should unwind the test") {
+ TEST_FATAL("fatal failure!");
+ TEST_FATAL("should not reach this!");
+}
+
+TEST("verify that previous test only produced a single failure") {
+ EXPECT_EQUAL(1u, TEST_MASTER.getProgress().failCnt);
+ TEST_MASTER.discardFailedChecks(1);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_F("single fixture", Fixture1) {
+ EXPECT_EQUAL(1, f.number);
+}
+
+TEST_FF("double fixture", Fixture1, Fixture2) {
+ EXPECT_EQUAL(1, f1.number);
+ EXPECT_EQUAL(2, f2.number);
+}
+
+TEST_FFF("triple fixture", Fixture1, Fixture2, Fixture3) {
+ EXPECT_EQUAL(1, f1.number);
+ EXPECT_EQUAL(2, f2.number);
+ EXPECT_EQUAL(3, f3.number);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_F("single parameterized fixture", Fixture(2)) {
+ EXPECT_EQUAL(2, f.number);
+}
+
+TEST_FF("double parameterized fixture", Fixture(2), Fixture(2, 3)) {
+ EXPECT_EQUAL(2, f1.number);
+ EXPECT_EQUAL(6, f2.number);
+}
+
+TEST_FFF("triple parameterized fixture",
+ Fixture(2), Fixture(2, 3), Fixture(2, 3, 5))
+{
+ EXPECT_EQUAL(2, f1.number);
+ EXPECT_EQUAL(6, f2.number);
+ EXPECT_EQUAL(30, f3.number);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_FF("double parameterized fixture with backref",
+ Fixture(42), FixtureRef(f1))
+{
+ EXPECT_EQUAL(42, f1.number);
+ EXPECT_EQUAL(&f1, &f2.ref);
+}
+
+TEST_FFF("triple parameterized fixture with backref",
+ Fixture(42), FixtureRef(f1), FixtureRef2(f1, f2))
+{
+ EXPECT_EQUAL(42, f1.number);
+ EXPECT_EQUAL(&f1, &f2.ref);
+ EXPECT_EQUAL(&f1, &f3.ref1);
+ EXPECT_EQUAL(&f2, &f3.ref2);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_F("unused fixture", Fixture1) {}
+TEST_FF("unused double fixture", Fixture1, Fixture2) {}
+TEST_FFF("unused triple fixture", Fixture1, Fixture2, Fixture3) {}
+
+//-----------------------------------------------------------------------------
+
+TEST("non-fatal failures should not unwind the test") {
+ EXPECT_TRUE(false);
+ TEST_ERROR("unfatal error");
+ EXPECT_EQUAL(1, 10);
+}
+
+TEST("verify that all failures from previous test was counted") {
+ EXPECT_EQUAL(3u, TEST_MASTER.getProgress().failCnt);
+ TEST_MASTER.discardFailedChecks(3);
+}
+
+//-----------------------------------------------------------------------------
+
+IGNORE_TEST("passed tests can also be ignored") {
+ EXPECT_EQUAL(1, 1);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("cppunit unwind will result in 1 failed test and 1 failed check") {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("cppunit happy", 1, 1);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("cppunit not happy", 1, 2);
+}
+
+TEST("std::excpetion unwind will result in 1 failed test and 1 failed check") {
+ throw std::runtime_error("something failed");
+}
+
+TEST("random unwind will result in 1 failed test and 1 failed check") {
+ throw 1;
+}
+
+TEST("verify and ignore check failures from previous tests") {
+ EXPECT_EQUAL(3u, TEST_MASTER.getProgress().failCnt);
+ TEST_MASTER.discardFailedChecks(3);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("verify that all appropriate tests have been executed") {
+ TEST_FLUSH();
+ EXPECT_EQUAL(25u, TEST_MASTER.getProgress().passCnt);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/text/lowercase/.gitignore b/vespalib/src/tests/text/lowercase/.gitignore
new file mode 100644
index 00000000000..f1bdb6df992
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/.gitignore
@@ -0,0 +1 @@
+vespalib_lowercase_test_app
diff --git a/vespalib/src/tests/text/lowercase/CMakeLists.txt b/vespalib/src/tests/text/lowercase/CMakeLists.txt
new file mode 100644
index 00000000000..82fa2a7f1a7
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_lowercase_test_app
+ SOURCES
+ lowercase_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_lowercase_test_app COMMAND vespalib_lowercase_test_app)
diff --git a/vespalib/src/tests/text/lowercase/DESC b/vespalib/src/tests/text/lowercase/DESC
new file mode 100644
index 00000000000..e277112f112
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/DESC
@@ -0,0 +1 @@
+lowercase test. Take a look at lowercase_test.cpp for details.
diff --git a/vespalib/src/tests/text/lowercase/FILES b/vespalib/src/tests/text/lowercase/FILES
new file mode 100644
index 00000000000..418ce2dc5f5
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/FILES
@@ -0,0 +1 @@
+lowercase_test.cpp
diff --git a/vespalib/src/tests/text/lowercase/lowercase-table.dat b/vespalib/src/tests/text/lowercase/lowercase-table.dat
new file mode 100644
index 00000000000..c63883860ee
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/lowercase-table.dat
@@ -0,0 +1,664 @@
+lowercase( 65 )= 97
+lowercase( 66 )= 98
+lowercase( 67 )= 99
+lowercase( 68 )= 100
+lowercase( 69 )= 101
+lowercase( 70 )= 102
+lowercase( 71 )= 103
+lowercase( 72 )= 104
+lowercase( 73 )= 105
+lowercase( 74 )= 106
+lowercase( 75 )= 107
+lowercase( 76 )= 108
+lowercase( 77 )= 109
+lowercase( 78 )= 110
+lowercase( 79 )= 111
+lowercase( 80 )= 112
+lowercase( 81 )= 113
+lowercase( 82 )= 114
+lowercase( 83 )= 115
+lowercase( 84 )= 116
+lowercase( 85 )= 117
+lowercase( 86 )= 118
+lowercase( 87 )= 119
+lowercase( 88 )= 120
+lowercase( 89 )= 121
+lowercase( 90 )= 122
+lowercase( 192 )= 224
+lowercase( 193 )= 225
+lowercase( 194 )= 226
+lowercase( 195 )= 227
+lowercase( 196 )= 228
+lowercase( 197 )= 229
+lowercase( 198 )= 230
+lowercase( 199 )= 231
+lowercase( 200 )= 232
+lowercase( 201 )= 233
+lowercase( 202 )= 234
+lowercase( 203 )= 235
+lowercase( 204 )= 236
+lowercase( 205 )= 237
+lowercase( 206 )= 238
+lowercase( 207 )= 239
+lowercase( 208 )= 240
+lowercase( 209 )= 241
+lowercase( 210 )= 242
+lowercase( 211 )= 243
+lowercase( 212 )= 244
+lowercase( 213 )= 245
+lowercase( 214 )= 246
+lowercase( 216 )= 248
+lowercase( 217 )= 249
+lowercase( 218 )= 250
+lowercase( 219 )= 251
+lowercase( 220 )= 252
+lowercase( 221 )= 253
+lowercase( 222 )= 254
+lowercase( 256 )= 257
+lowercase( 258 )= 259
+lowercase( 260 )= 261
+lowercase( 262 )= 263
+lowercase( 264 )= 265
+lowercase( 266 )= 267
+lowercase( 268 )= 269
+lowercase( 270 )= 271
+lowercase( 272 )= 273
+lowercase( 274 )= 275
+lowercase( 276 )= 277
+lowercase( 278 )= 279
+lowercase( 280 )= 281
+lowercase( 282 )= 283
+lowercase( 284 )= 285
+lowercase( 286 )= 287
+lowercase( 288 )= 289
+lowercase( 290 )= 291
+lowercase( 292 )= 293
+lowercase( 294 )= 295
+lowercase( 296 )= 297
+lowercase( 298 )= 299
+lowercase( 300 )= 301
+lowercase( 302 )= 303
+lowercase( 304 )= 105
+lowercase( 308 )= 309
+lowercase( 310 )= 311
+lowercase( 313 )= 314
+lowercase( 315 )= 316
+lowercase( 317 )= 318
+lowercase( 321 )= 322
+lowercase( 323 )= 324
+lowercase( 325 )= 326
+lowercase( 327 )= 328
+lowercase( 330 )= 331
+lowercase( 332 )= 333
+lowercase( 334 )= 335
+lowercase( 336 )= 337
+lowercase( 338 )= 339
+lowercase( 340 )= 341
+lowercase( 342 )= 343
+lowercase( 344 )= 345
+lowercase( 346 )= 347
+lowercase( 348 )= 349
+lowercase( 350 )= 351
+lowercase( 352 )= 353
+lowercase( 354 )= 355
+lowercase( 356 )= 357
+lowercase( 358 )= 359
+lowercase( 360 )= 361
+lowercase( 362 )= 363
+lowercase( 364 )= 365
+lowercase( 366 )= 367
+lowercase( 368 )= 369
+lowercase( 370 )= 371
+lowercase( 372 )= 373
+lowercase( 374 )= 375
+lowercase( 376 )= 255
+lowercase( 377 )= 378
+lowercase( 379 )= 380
+lowercase( 381 )= 382
+lowercase( 385 )= 595
+lowercase( 386 )= 387
+lowercase( 388 )= 389
+lowercase( 390 )= 596
+lowercase( 391 )= 392
+lowercase( 393 )= 598
+lowercase( 394 )= 599
+lowercase( 395 )= 396
+lowercase( 398 )= 477
+lowercase( 399 )= 601
+lowercase( 400 )= 603
+lowercase( 401 )= 402
+lowercase( 403 )= 608
+lowercase( 404 )= 611
+lowercase( 406 )= 617
+lowercase( 407 )= 616
+lowercase( 408 )= 409
+lowercase( 412 )= 623
+lowercase( 413 )= 626
+lowercase( 415 )= 629
+lowercase( 416 )= 417
+lowercase( 418 )= 419
+lowercase( 420 )= 421
+lowercase( 422 )= 640
+lowercase( 423 )= 424
+lowercase( 425 )= 643
+lowercase( 428 )= 429
+lowercase( 430 )= 648
+lowercase( 431 )= 432
+lowercase( 433 )= 650
+lowercase( 434 )= 651
+lowercase( 435 )= 436
+lowercase( 437 )= 438
+lowercase( 439 )= 658
+lowercase( 440 )= 441
+lowercase( 444 )= 445
+lowercase( 461 )= 462
+lowercase( 463 )= 464
+lowercase( 465 )= 466
+lowercase( 467 )= 468
+lowercase( 469 )= 470
+lowercase( 471 )= 472
+lowercase( 473 )= 474
+lowercase( 475 )= 476
+lowercase( 478 )= 479
+lowercase( 480 )= 481
+lowercase( 482 )= 483
+lowercase( 484 )= 485
+lowercase( 486 )= 487
+lowercase( 488 )= 489
+lowercase( 490 )= 491
+lowercase( 492 )= 493
+lowercase( 494 )= 495
+lowercase( 500 )= 501
+lowercase( 502 )= 405
+lowercase( 503 )= 447
+lowercase( 504 )= 505
+lowercase( 506 )= 507
+lowercase( 508 )= 509
+lowercase( 510 )= 511
+lowercase( 512 )= 513
+lowercase( 514 )= 515
+lowercase( 516 )= 517
+lowercase( 518 )= 519
+lowercase( 520 )= 521
+lowercase( 522 )= 523
+lowercase( 524 )= 525
+lowercase( 526 )= 527
+lowercase( 528 )= 529
+lowercase( 530 )= 531
+lowercase( 532 )= 533
+lowercase( 534 )= 535
+lowercase( 536 )= 537
+lowercase( 538 )= 539
+lowercase( 540 )= 541
+lowercase( 542 )= 543
+lowercase( 544 )= 414
+lowercase( 546 )= 547
+lowercase( 548 )= 549
+lowercase( 550 )= 551
+lowercase( 552 )= 553
+lowercase( 554 )= 555
+lowercase( 556 )= 557
+lowercase( 558 )= 559
+lowercase( 560 )= 561
+lowercase( 562 )= 563
+lowercase( 902 )= 940
+lowercase( 904 )= 941
+lowercase( 905 )= 942
+lowercase( 906 )= 943
+lowercase( 908 )= 972
+lowercase( 910 )= 973
+lowercase( 911 )= 974
+lowercase( 913 )= 945
+lowercase( 914 )= 946
+lowercase( 915 )= 947
+lowercase( 916 )= 948
+lowercase( 917 )= 949
+lowercase( 918 )= 950
+lowercase( 919 )= 951
+lowercase( 920 )= 952
+lowercase( 921 )= 953
+lowercase( 922 )= 954
+lowercase( 923 )= 955
+lowercase( 924 )= 956
+lowercase( 925 )= 957
+lowercase( 926 )= 958
+lowercase( 927 )= 959
+lowercase( 928 )= 960
+lowercase( 929 )= 961
+lowercase( 931 )= 963
+lowercase( 932 )= 964
+lowercase( 933 )= 965
+lowercase( 934 )= 966
+lowercase( 935 )= 967
+lowercase( 936 )= 968
+lowercase( 937 )= 969
+lowercase( 938 )= 970
+lowercase( 939 )= 971
+lowercase( 984 )= 985
+lowercase( 986 )= 987
+lowercase( 988 )= 989
+lowercase( 990 )= 991
+lowercase( 992 )= 993
+lowercase( 994 )= 995
+lowercase( 996 )= 997
+lowercase( 998 )= 999
+lowercase( 1000 )= 1001
+lowercase( 1002 )= 1003
+lowercase( 1004 )= 1005
+lowercase( 1006 )= 1007
+lowercase( 1015 )= 1016
+lowercase( 1018 )= 1019
+lowercase( 1024 )= 1104
+lowercase( 1025 )= 1105
+lowercase( 1026 )= 1106
+lowercase( 1027 )= 1107
+lowercase( 1028 )= 1108
+lowercase( 1029 )= 1109
+lowercase( 1030 )= 1110
+lowercase( 1031 )= 1111
+lowercase( 1032 )= 1112
+lowercase( 1033 )= 1113
+lowercase( 1034 )= 1114
+lowercase( 1035 )= 1115
+lowercase( 1036 )= 1116
+lowercase( 1037 )= 1117
+lowercase( 1038 )= 1118
+lowercase( 1039 )= 1119
+lowercase( 1040 )= 1072
+lowercase( 1041 )= 1073
+lowercase( 1042 )= 1074
+lowercase( 1043 )= 1075
+lowercase( 1044 )= 1076
+lowercase( 1045 )= 1077
+lowercase( 1046 )= 1078
+lowercase( 1047 )= 1079
+lowercase( 1048 )= 1080
+lowercase( 1049 )= 1081
+lowercase( 1050 )= 1082
+lowercase( 1051 )= 1083
+lowercase( 1052 )= 1084
+lowercase( 1053 )= 1085
+lowercase( 1054 )= 1086
+lowercase( 1055 )= 1087
+lowercase( 1056 )= 1088
+lowercase( 1057 )= 1089
+lowercase( 1058 )= 1090
+lowercase( 1059 )= 1091
+lowercase( 1060 )= 1092
+lowercase( 1061 )= 1093
+lowercase( 1062 )= 1094
+lowercase( 1063 )= 1095
+lowercase( 1064 )= 1096
+lowercase( 1065 )= 1097
+lowercase( 1066 )= 1098
+lowercase( 1067 )= 1099
+lowercase( 1068 )= 1100
+lowercase( 1069 )= 1101
+lowercase( 1070 )= 1102
+lowercase( 1071 )= 1103
+lowercase( 1120 )= 1121
+lowercase( 1122 )= 1123
+lowercase( 1124 )= 1125
+lowercase( 1126 )= 1127
+lowercase( 1128 )= 1129
+lowercase( 1130 )= 1131
+lowercase( 1132 )= 1133
+lowercase( 1134 )= 1135
+lowercase( 1136 )= 1137
+lowercase( 1138 )= 1139
+lowercase( 1140 )= 1141
+lowercase( 1142 )= 1143
+lowercase( 1144 )= 1145
+lowercase( 1146 )= 1147
+lowercase( 1148 )= 1149
+lowercase( 1150 )= 1151
+lowercase( 1152 )= 1153
+lowercase( 1162 )= 1163
+lowercase( 1164 )= 1165
+lowercase( 1166 )= 1167
+lowercase( 1168 )= 1169
+lowercase( 1170 )= 1171
+lowercase( 1172 )= 1173
+lowercase( 1174 )= 1175
+lowercase( 1176 )= 1177
+lowercase( 1178 )= 1179
+lowercase( 1180 )= 1181
+lowercase( 1182 )= 1183
+lowercase( 1184 )= 1185
+lowercase( 1186 )= 1187
+lowercase( 1188 )= 1189
+lowercase( 1190 )= 1191
+lowercase( 1192 )= 1193
+lowercase( 1194 )= 1195
+lowercase( 1196 )= 1197
+lowercase( 1198 )= 1199
+lowercase( 1200 )= 1201
+lowercase( 1202 )= 1203
+lowercase( 1204 )= 1205
+lowercase( 1206 )= 1207
+lowercase( 1208 )= 1209
+lowercase( 1210 )= 1211
+lowercase( 1212 )= 1213
+lowercase( 1214 )= 1215
+lowercase( 1217 )= 1218
+lowercase( 1219 )= 1220
+lowercase( 1221 )= 1222
+lowercase( 1223 )= 1224
+lowercase( 1225 )= 1226
+lowercase( 1227 )= 1228
+lowercase( 1229 )= 1230
+lowercase( 1232 )= 1233
+lowercase( 1234 )= 1235
+lowercase( 1236 )= 1237
+lowercase( 1238 )= 1239
+lowercase( 1240 )= 1241
+lowercase( 1242 )= 1243
+lowercase( 1244 )= 1245
+lowercase( 1246 )= 1247
+lowercase( 1248 )= 1249
+lowercase( 1250 )= 1251
+lowercase( 1252 )= 1253
+lowercase( 1254 )= 1255
+lowercase( 1256 )= 1257
+lowercase( 1258 )= 1259
+lowercase( 1260 )= 1261
+lowercase( 1262 )= 1263
+lowercase( 1264 )= 1265
+lowercase( 1266 )= 1267
+lowercase( 1268 )= 1269
+lowercase( 1272 )= 1273
+lowercase( 1280 )= 1281
+lowercase( 1282 )= 1283
+lowercase( 1284 )= 1285
+lowercase( 1286 )= 1287
+lowercase( 1288 )= 1289
+lowercase( 1290 )= 1291
+lowercase( 1292 )= 1293
+lowercase( 1294 )= 1295
+lowercase( 1329 )= 1377
+lowercase( 1330 )= 1378
+lowercase( 1331 )= 1379
+lowercase( 1332 )= 1380
+lowercase( 1333 )= 1381
+lowercase( 1334 )= 1382
+lowercase( 1335 )= 1383
+lowercase( 1336 )= 1384
+lowercase( 1337 )= 1385
+lowercase( 1338 )= 1386
+lowercase( 1339 )= 1387
+lowercase( 1340 )= 1388
+lowercase( 1341 )= 1389
+lowercase( 1342 )= 1390
+lowercase( 1343 )= 1391
+lowercase( 1344 )= 1392
+lowercase( 1345 )= 1393
+lowercase( 1346 )= 1394
+lowercase( 1347 )= 1395
+lowercase( 1348 )= 1396
+lowercase( 1349 )= 1397
+lowercase( 1350 )= 1398
+lowercase( 1351 )= 1399
+lowercase( 1352 )= 1400
+lowercase( 1353 )= 1401
+lowercase( 1354 )= 1402
+lowercase( 1355 )= 1403
+lowercase( 1356 )= 1404
+lowercase( 1357 )= 1405
+lowercase( 1358 )= 1406
+lowercase( 1359 )= 1407
+lowercase( 1360 )= 1408
+lowercase( 1361 )= 1409
+lowercase( 1362 )= 1410
+lowercase( 1363 )= 1411
+lowercase( 1364 )= 1412
+lowercase( 1365 )= 1413
+lowercase( 1366 )= 1414
+lowercase( 7680 )= 7681
+lowercase( 7682 )= 7683
+lowercase( 7684 )= 7685
+lowercase( 7686 )= 7687
+lowercase( 7688 )= 7689
+lowercase( 7690 )= 7691
+lowercase( 7692 )= 7693
+lowercase( 7694 )= 7695
+lowercase( 7696 )= 7697
+lowercase( 7698 )= 7699
+lowercase( 7700 )= 7701
+lowercase( 7702 )= 7703
+lowercase( 7704 )= 7705
+lowercase( 7706 )= 7707
+lowercase( 7708 )= 7709
+lowercase( 7710 )= 7711
+lowercase( 7712 )= 7713
+lowercase( 7714 )= 7715
+lowercase( 7716 )= 7717
+lowercase( 7718 )= 7719
+lowercase( 7720 )= 7721
+lowercase( 7722 )= 7723
+lowercase( 7724 )= 7725
+lowercase( 7726 )= 7727
+lowercase( 7728 )= 7729
+lowercase( 7730 )= 7731
+lowercase( 7732 )= 7733
+lowercase( 7734 )= 7735
+lowercase( 7736 )= 7737
+lowercase( 7738 )= 7739
+lowercase( 7740 )= 7741
+lowercase( 7742 )= 7743
+lowercase( 7744 )= 7745
+lowercase( 7746 )= 7747
+lowercase( 7748 )= 7749
+lowercase( 7750 )= 7751
+lowercase( 7752 )= 7753
+lowercase( 7754 )= 7755
+lowercase( 7756 )= 7757
+lowercase( 7758 )= 7759
+lowercase( 7760 )= 7761
+lowercase( 7762 )= 7763
+lowercase( 7764 )= 7765
+lowercase( 7766 )= 7767
+lowercase( 7768 )= 7769
+lowercase( 7770 )= 7771
+lowercase( 7772 )= 7773
+lowercase( 7774 )= 7775
+lowercase( 7776 )= 7777
+lowercase( 7778 )= 7779
+lowercase( 7780 )= 7781
+lowercase( 7782 )= 7783
+lowercase( 7784 )= 7785
+lowercase( 7786 )= 7787
+lowercase( 7788 )= 7789
+lowercase( 7790 )= 7791
+lowercase( 7792 )= 7793
+lowercase( 7794 )= 7795
+lowercase( 7796 )= 7797
+lowercase( 7798 )= 7799
+lowercase( 7800 )= 7801
+lowercase( 7802 )= 7803
+lowercase( 7804 )= 7805
+lowercase( 7806 )= 7807
+lowercase( 7808 )= 7809
+lowercase( 7810 )= 7811
+lowercase( 7812 )= 7813
+lowercase( 7814 )= 7815
+lowercase( 7816 )= 7817
+lowercase( 7818 )= 7819
+lowercase( 7820 )= 7821
+lowercase( 7822 )= 7823
+lowercase( 7824 )= 7825
+lowercase( 7826 )= 7827
+lowercase( 7828 )= 7829
+lowercase( 7840 )= 7841
+lowercase( 7842 )= 7843
+lowercase( 7844 )= 7845
+lowercase( 7846 )= 7847
+lowercase( 7848 )= 7849
+lowercase( 7850 )= 7851
+lowercase( 7852 )= 7853
+lowercase( 7854 )= 7855
+lowercase( 7856 )= 7857
+lowercase( 7858 )= 7859
+lowercase( 7860 )= 7861
+lowercase( 7862 )= 7863
+lowercase( 7864 )= 7865
+lowercase( 7866 )= 7867
+lowercase( 7868 )= 7869
+lowercase( 7870 )= 7871
+lowercase( 7872 )= 7873
+lowercase( 7874 )= 7875
+lowercase( 7876 )= 7877
+lowercase( 7878 )= 7879
+lowercase( 7880 )= 7881
+lowercase( 7882 )= 7883
+lowercase( 7884 )= 7885
+lowercase( 7886 )= 7887
+lowercase( 7888 )= 7889
+lowercase( 7890 )= 7891
+lowercase( 7892 )= 7893
+lowercase( 7894 )= 7895
+lowercase( 7896 )= 7897
+lowercase( 7898 )= 7899
+lowercase( 7900 )= 7901
+lowercase( 7902 )= 7903
+lowercase( 7904 )= 7905
+lowercase( 7906 )= 7907
+lowercase( 7908 )= 7909
+lowercase( 7910 )= 7911
+lowercase( 7912 )= 7913
+lowercase( 7914 )= 7915
+lowercase( 7916 )= 7917
+lowercase( 7918 )= 7919
+lowercase( 7920 )= 7921
+lowercase( 7922 )= 7923
+lowercase( 7924 )= 7925
+lowercase( 7926 )= 7927
+lowercase( 7928 )= 7929
+lowercase( 7944 )= 7936
+lowercase( 7945 )= 7937
+lowercase( 7946 )= 7938
+lowercase( 7947 )= 7939
+lowercase( 7948 )= 7940
+lowercase( 7949 )= 7941
+lowercase( 7950 )= 7942
+lowercase( 7951 )= 7943
+lowercase( 7960 )= 7952
+lowercase( 7961 )= 7953
+lowercase( 7962 )= 7954
+lowercase( 7963 )= 7955
+lowercase( 7964 )= 7956
+lowercase( 7965 )= 7957
+lowercase( 7976 )= 7968
+lowercase( 7977 )= 7969
+lowercase( 7978 )= 7970
+lowercase( 7979 )= 7971
+lowercase( 7980 )= 7972
+lowercase( 7981 )= 7973
+lowercase( 7982 )= 7974
+lowercase( 7983 )= 7975
+lowercase( 7992 )= 7984
+lowercase( 7993 )= 7985
+lowercase( 7994 )= 7986
+lowercase( 7995 )= 7987
+lowercase( 7996 )= 7988
+lowercase( 7997 )= 7989
+lowercase( 7998 )= 7990
+lowercase( 7999 )= 7991
+lowercase( 8008 )= 8000
+lowercase( 8009 )= 8001
+lowercase( 8010 )= 8002
+lowercase( 8011 )= 8003
+lowercase( 8012 )= 8004
+lowercase( 8013 )= 8005
+lowercase( 8025 )= 8017
+lowercase( 8027 )= 8019
+lowercase( 8029 )= 8021
+lowercase( 8031 )= 8023
+lowercase( 8040 )= 8032
+lowercase( 8041 )= 8033
+lowercase( 8042 )= 8034
+lowercase( 8043 )= 8035
+lowercase( 8044 )= 8036
+lowercase( 8045 )= 8037
+lowercase( 8046 )= 8038
+lowercase( 8047 )= 8039
+lowercase( 8072 )= 8064
+lowercase( 8073 )= 8065
+lowercase( 8074 )= 8066
+lowercase( 8075 )= 8067
+lowercase( 8076 )= 8068
+lowercase( 8077 )= 8069
+lowercase( 8078 )= 8070
+lowercase( 8079 )= 8071
+lowercase( 8088 )= 8080
+lowercase( 8089 )= 8081
+lowercase( 8090 )= 8082
+lowercase( 8091 )= 8083
+lowercase( 8092 )= 8084
+lowercase( 8093 )= 8085
+lowercase( 8094 )= 8086
+lowercase( 8095 )= 8087
+lowercase( 8104 )= 8096
+lowercase( 8105 )= 8097
+lowercase( 8106 )= 8098
+lowercase( 8107 )= 8099
+lowercase( 8108 )= 8100
+lowercase( 8109 )= 8101
+lowercase( 8110 )= 8102
+lowercase( 8111 )= 8103
+lowercase( 8120 )= 8112
+lowercase( 8121 )= 8113
+lowercase( 8122 )= 8048
+lowercase( 8124 )= 8115
+lowercase( 8136 )= 8050
+lowercase( 8138 )= 8052
+lowercase( 8140 )= 8131
+lowercase( 8152 )= 8144
+lowercase( 8153 )= 8145
+lowercase( 8154 )= 8054
+lowercase( 8168 )= 8160
+lowercase( 8169 )= 8161
+lowercase( 8170 )= 8058
+lowercase( 8172 )= 8165
+lowercase( 8184 )= 8056
+lowercase( 8186 )= 8060
+lowercase( 8188 )= 8179
+lowercase( 66560 )= 66600
+lowercase( 66561 )= 66601
+lowercase( 66562 )= 66602
+lowercase( 66563 )= 66603
+lowercase( 66564 )= 66604
+lowercase( 66565 )= 66605
+lowercase( 66566 )= 66606
+lowercase( 66567 )= 66607
+lowercase( 66568 )= 66608
+lowercase( 66569 )= 66609
+lowercase( 66570 )= 66610
+lowercase( 66571 )= 66611
+lowercase( 66572 )= 66612
+lowercase( 66573 )= 66613
+lowercase( 66574 )= 66614
+lowercase( 66575 )= 66615
+lowercase( 66576 )= 66616
+lowercase( 66577 )= 66617
+lowercase( 66578 )= 66618
+lowercase( 66579 )= 66619
+lowercase( 66580 )= 66620
+lowercase( 66581 )= 66621
+lowercase( 66582 )= 66622
+lowercase( 66583 )= 66623
+lowercase( 66584 )= 66624
+lowercase( 66585 )= 66625
+lowercase( 66586 )= 66626
+lowercase( 66587 )= 66627
+lowercase( 66588 )= 66628
+lowercase( 66589 )= 66629
+lowercase( 66590 )= 66630
+lowercase( 66591 )= 66631
+lowercase( 66592 )= 66632
+lowercase( 66593 )= 66633
+lowercase( 66594 )= 66634
+lowercase( 66595 )= 66635
+lowercase( 66596 )= 66636
+lowercase( 66597 )= 66637
+lowercase( 66598 )= 66638
+lowercase( 66599 )= 66639
diff --git a/vespalib/src/tests/text/lowercase/lowercase_test.cpp b/vespalib/src/tests/text/lowercase/lowercase_test.cpp
new file mode 100644
index 00000000000..b226690790d
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/lowercase_test.cpp
@@ -0,0 +1,38 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("lowercase_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/text/lowercase.h>
+#include <iostream>
+#include <fstream>
+
+using namespace vespalib;
+
+TEST_SETUP(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("lowercase_test");
+
+ EXPECT_EQUAL('a', LowerCase::convert('A'));
+ EXPECT_EQUAL((int8_t)'a', LowerCase::convert((int8_t)'A'));
+ EXPECT_EQUAL((uint8_t)'a', LowerCase::convert((uint8_t)'A'));
+
+ std::ifstream yellData("yell-want.dat");
+
+ EXPECT_TRUE(yellData.good());
+
+ while (yellData.good()) {
+ uint32_t hi=0, lo=0;
+ yellData >> hi >> lo;
+ EXPECT_EQUAL(lo, LowerCase::convert(hi));
+ if (lo != LowerCase::convert(hi)) {
+ printf("lc(%04X) -> %04X\n", hi, LowerCase::convert(hi));
+ printf("yell(%04X) -> %04X\n", hi, lo);
+ }
+ // printf("lowercase( %d )= %d\n", hi, lo);
+ }
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/text/lowercase/to-c-code.pl b/vespalib/src/tests/text/lowercase/to-c-code.pl
new file mode 100755
index 00000000000..63a87fb56ae
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/to-c-code.pl
@@ -0,0 +1,74 @@
+#!/usr/local/bin/perl
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+# input looks like:
+# lowercase( 65 )= 97
+
+
+my %lowercase;
+
+my %blocks;
+
+while (<>) {
+ my ( $key, $value ) = m{lowercase. (\d+) .. (\d+)$} ;
+ $lowercase{$key} = $value;
+
+ my $b = ( $key >> 8 );
+ ++$blocks{$b};
+}
+
+@kl = keys %blocks;
+@nkl = sort {$a <=> $b} @kl;
+
+print STDERR "blocks: " . join(" ", @nkl) . "\n";
+
+
+foreach $b ( @nkl )
+{
+ if ( $b == 0 ) {
+ print "unsigned char\nLowerCase::lowercase_${b}_block[256] = {\n\t";
+ } else {
+ print "\nuint32_t\nLowerCase::lowercase_${b}_block[256] = {\n\t";
+ }
+ my $act = 0;
+ for ($i = 0; $i < 256; $i++) {
+ if ($act > 7) {
+ print ",\n\t";
+ $act = 0;
+ } elsif ($act) {
+ print ",";
+ }
+ $n = ($b << 8) + $i;
+ $v = $lowercase{$n};
+ if (defined $v) {
+ print "\t$v";
+ die "too big value in table 0: $v\n" if ($v > 255 && $b == 0);
+ } else {
+ print "\t$n";
+ }
+ ++$act;
+ }
+ print "\n\t};\n\n";
+}
+
+{
+ print "\nuint32_t\nLowerCase::lowercase_0_5_block[0x600] = {\n\t";
+ my $act = 0;
+ for ($i = 0; $i < 0x600; $i++) {
+ if ($act > 7) {
+ print ",\n\t";
+ $act = 0;
+ } elsif ($act) {
+ print ",";
+ }
+ $n = $i;
+ $v = $lowercase{$n};
+ if (defined $v) {
+ print "\t$v";
+ } else {
+ print "\t$n";
+ }
+ ++$act;
+ }
+ print "\n\t};\n\n";
+}
diff --git a/vespalib/src/tests/text/lowercase/yell-want.dat b/vespalib/src/tests/text/lowercase/yell-want.dat
new file mode 100644
index 00000000000..88ca4bc6972
--- /dev/null
+++ b/vespalib/src/tests/text/lowercase/yell-want.dat
@@ -0,0 +1,792 @@
+65 97
+66 98
+67 99
+68 100
+69 101
+70 102
+71 103
+72 104
+73 105
+74 106
+75 107
+76 108
+77 109
+78 110
+79 111
+80 112
+81 113
+82 114
+83 115
+84 116
+85 117
+86 118
+87 119
+88 120
+89 121
+90 122
+192 224
+193 225
+194 226
+195 227
+196 228
+197 229
+198 230
+199 231
+200 232
+201 233
+202 234
+203 235
+204 236
+205 237
+206 238
+207 239
+208 240
+209 241
+210 242
+211 243
+212 244
+213 245
+214 246
+216 248
+217 249
+218 250
+219 251
+220 252
+221 253
+222 254
+256 257
+258 259
+260 261
+262 263
+264 265
+266 267
+268 269
+270 271
+272 273
+274 275
+276 277
+278 279
+280 281
+282 283
+284 285
+286 287
+288 289
+290 291
+292 293
+294 295
+296 297
+298 299
+300 301
+302 303
+304 105
+308 309
+310 311
+313 314
+315 316
+317 318
+321 322
+323 324
+325 326
+327 328
+330 331
+332 333
+334 335
+336 337
+338 339
+340 341
+342 343
+344 345
+346 347
+348 349
+350 351
+352 353
+354 355
+356 357
+358 359
+360 361
+362 363
+364 365
+366 367
+368 369
+370 371
+372 373
+374 375
+376 255
+377 378
+379 380
+381 382
+385 595
+386 387
+388 389
+390 596
+391 392
+393 598
+394 599
+395 396
+398 477
+399 601
+400 603
+401 402
+403 608
+404 611
+406 617
+407 616
+408 409
+412 623
+413 626
+415 629
+416 417
+418 419
+420 421
+422 640
+423 424
+425 643
+428 429
+430 648
+431 432
+433 650
+434 651
+435 436
+437 438
+439 658
+440 441
+444 445
+461 462
+463 464
+465 466
+467 468
+469 470
+471 472
+473 474
+475 476
+478 479
+480 481
+482 483
+484 485
+486 487
+488 489
+490 491
+492 493
+494 495
+500 501
+502 405
+503 447
+504 505
+506 507
+508 509
+510 511
+512 513
+514 515
+516 517
+518 519
+520 521
+522 523
+524 525
+526 527
+528 529
+530 531
+532 533
+534 535
+536 537
+538 539
+540 541
+542 543
+544 414
+546 547
+548 549
+550 551
+552 553
+554 555
+556 557
+558 559
+560 561
+562 563
+570 11365
+571 572
+573 410
+574 11366
+577 578
+579 384
+580 649
+581 652
+582 583
+584 585
+586 587
+588 589
+590 591
+902 940
+904 941
+905 942
+906 943
+908 972
+910 973
+911 974
+913 945
+914 946
+915 947
+916 948
+917 949
+918 950
+919 951
+920 952
+921 953
+922 954
+923 955
+924 956
+925 957
+926 958
+927 959
+928 960
+929 961
+931 963
+932 964
+933 965
+934 966
+935 967
+936 968
+937 969
+938 970
+939 971
+984 985
+986 987
+988 989
+990 991
+992 993
+994 995
+996 997
+998 999
+1000 1001
+1002 1003
+1004 1005
+1006 1007
+1015 1016
+1018 1019
+1021 891
+1022 892
+1023 893
+1024 1104
+1025 1105
+1026 1106
+1027 1107
+1028 1108
+1029 1109
+1030 1110
+1031 1111
+1032 1112
+1033 1113
+1034 1114
+1035 1115
+1036 1116
+1037 1117
+1038 1118
+1039 1119
+1040 1072
+1041 1073
+1042 1074
+1043 1075
+1044 1076
+1045 1077
+1046 1078
+1047 1079
+1048 1080
+1049 1081
+1050 1082
+1051 1083
+1052 1084
+1053 1085
+1054 1086
+1055 1087
+1056 1088
+1057 1089
+1058 1090
+1059 1091
+1060 1092
+1061 1093
+1062 1094
+1063 1095
+1064 1096
+1065 1097
+1066 1098
+1067 1099
+1068 1100
+1069 1101
+1070 1102
+1071 1103
+1120 1121
+1122 1123
+1124 1125
+1126 1127
+1128 1129
+1130 1131
+1132 1133
+1134 1135
+1136 1137
+1138 1139
+1140 1141
+1142 1143
+1144 1145
+1146 1147
+1148 1149
+1150 1151
+1152 1153
+1162 1163
+1164 1165
+1166 1167
+1168 1169
+1170 1171
+1172 1173
+1174 1175
+1176 1177
+1178 1179
+1180 1181
+1182 1183
+1184 1185
+1186 1187
+1188 1189
+1190 1191
+1192 1193
+1194 1195
+1196 1197
+1198 1199
+1200 1201
+1202 1203
+1204 1205
+1206 1207
+1208 1209
+1210 1211
+1212 1213
+1214 1215
+1216 1231
+1217 1218
+1219 1220
+1221 1222
+1223 1224
+1225 1226
+1227 1228
+1229 1230
+1232 1233
+1234 1235
+1236 1237
+1238 1239
+1240 1241
+1242 1243
+1244 1245
+1246 1247
+1248 1249
+1250 1251
+1252 1253
+1254 1255
+1256 1257
+1258 1259
+1260 1261
+1262 1263
+1264 1265
+1266 1267
+1268 1269
+1270 1271
+1272 1273
+1274 1275
+1276 1277
+1278 1279
+1280 1281
+1282 1283
+1284 1285
+1286 1287
+1288 1289
+1290 1291
+1292 1293
+1294 1295
+1296 1297
+1298 1299
+1329 1377
+1330 1378
+1331 1379
+1332 1380
+1333 1381
+1334 1382
+1335 1383
+1336 1384
+1337 1385
+1338 1386
+1339 1387
+1340 1388
+1341 1389
+1342 1390
+1343 1391
+1344 1392
+1345 1393
+1346 1394
+1347 1395
+1348 1396
+1349 1397
+1350 1398
+1351 1399
+1352 1400
+1353 1401
+1354 1402
+1355 1403
+1356 1404
+1357 1405
+1358 1406
+1359 1407
+1360 1408
+1361 1409
+1362 1410
+1363 1411
+1364 1412
+1365 1413
+1366 1414
+4256 11520
+4257 11521
+4258 11522
+4259 11523
+4260 11524
+4261 11525
+4262 11526
+4263 11527
+4264 11528
+4265 11529
+4266 11530
+4267 11531
+4268 11532
+4269 11533
+4270 11534
+4271 11535
+4272 11536
+4273 11537
+4274 11538
+4275 11539
+4276 11540
+4277 11541
+4278 11542
+4279 11543
+4280 11544
+4281 11545
+4282 11546
+4283 11547
+4284 11548
+4285 11549
+4286 11550
+4287 11551
+4288 11552
+4289 11553
+4290 11554
+4291 11555
+4292 11556
+4293 11557
+7680 7681
+7682 7683
+7684 7685
+7686 7687
+7688 7689
+7690 7691
+7692 7693
+7694 7695
+7696 7697
+7698 7699
+7700 7701
+7702 7703
+7704 7705
+7706 7707
+7708 7709
+7710 7711
+7712 7713
+7714 7715
+7716 7717
+7718 7719
+7720 7721
+7722 7723
+7724 7725
+7726 7727
+7728 7729
+7730 7731
+7732 7733
+7734 7735
+7736 7737
+7738 7739
+7740 7741
+7742 7743
+7744 7745
+7746 7747
+7748 7749
+7750 7751
+7752 7753
+7754 7755
+7756 7757
+7758 7759
+7760 7761
+7762 7763
+7764 7765
+7766 7767
+7768 7769
+7770 7771
+7772 7773
+7774 7775
+7776 7777
+7778 7779
+7780 7781
+7782 7783
+7784 7785
+7786 7787
+7788 7789
+7790 7791
+7792 7793
+7794 7795
+7796 7797
+7798 7799
+7800 7801
+7802 7803
+7804 7805
+7806 7807
+7808 7809
+7810 7811
+7812 7813
+7814 7815
+7816 7817
+7818 7819
+7820 7821
+7822 7823
+7824 7825
+7826 7827
+7828 7829
+7840 7841
+7842 7843
+7844 7845
+7846 7847
+7848 7849
+7850 7851
+7852 7853
+7854 7855
+7856 7857
+7858 7859
+7860 7861
+7862 7863
+7864 7865
+7866 7867
+7868 7869
+7870 7871
+7872 7873
+7874 7875
+7876 7877
+7878 7879
+7880 7881
+7882 7883
+7884 7885
+7886 7887
+7888 7889
+7890 7891
+7892 7893
+7894 7895
+7896 7897
+7898 7899
+7900 7901
+7902 7903
+7904 7905
+7906 7907
+7908 7909
+7910 7911
+7912 7913
+7914 7915
+7916 7917
+7918 7919
+7920 7921
+7922 7923
+7924 7925
+7926 7927
+7928 7929
+7944 7936
+7945 7937
+7946 7938
+7947 7939
+7948 7940
+7949 7941
+7950 7942
+7951 7943
+7960 7952
+7961 7953
+7962 7954
+7963 7955
+7964 7956
+7965 7957
+7976 7968
+7977 7969
+7978 7970
+7979 7971
+7980 7972
+7981 7973
+7982 7974
+7983 7975
+7992 7984
+7993 7985
+7994 7986
+7995 7987
+7996 7988
+7997 7989
+7998 7990
+7999 7991
+8008 8000
+8009 8001
+8010 8002
+8011 8003
+8012 8004
+8013 8005
+8025 8017
+8027 8019
+8029 8021
+8031 8023
+8040 8032
+8041 8033
+8042 8034
+8043 8035
+8044 8036
+8045 8037
+8046 8038
+8047 8039
+8072 8064
+8073 8065
+8074 8066
+8075 8067
+8076 8068
+8077 8069
+8078 8070
+8079 8071
+8088 8080
+8089 8081
+8090 8082
+8091 8083
+8092 8084
+8093 8085
+8094 8086
+8095 8087
+8104 8096
+8105 8097
+8106 8098
+8107 8099
+8108 8100
+8109 8101
+8110 8102
+8111 8103
+8120 8112
+8121 8113
+8122 8048
+8124 8115
+8136 8050
+8138 8052
+8140 8131
+8152 8144
+8153 8145
+8154 8054
+8168 8160
+8169 8161
+8170 8058
+8172 8165
+8184 8056
+8186 8060
+8188 8179
+8498 8526
+8579 8580
+11264 11312
+11265 11313
+11266 11314
+11267 11315
+11268 11316
+11269 11317
+11270 11318
+11271 11319
+11272 11320
+11273 11321
+11274 11322
+11275 11323
+11276 11324
+11277 11325
+11278 11326
+11279 11327
+11280 11328
+11281 11329
+11282 11330
+11283 11331
+11284 11332
+11285 11333
+11286 11334
+11287 11335
+11288 11336
+11289 11337
+11290 11338
+11291 11339
+11292 11340
+11293 11341
+11294 11342
+11295 11343
+11296 11344
+11297 11345
+11298 11346
+11299 11347
+11300 11348
+11301 11349
+11302 11350
+11303 11351
+11304 11352
+11305 11353
+11306 11354
+11307 11355
+11308 11356
+11309 11357
+11310 11358
+11360 11361
+11362 619
+11363 7549
+11364 637
+11367 11368
+11369 11370
+11371 11372
+11381 11382
+11392 11393
+11394 11395
+11396 11397
+11398 11399
+11400 11401
+11402 11403
+11404 11405
+11406 11407
+11408 11409
+11410 11411
+11412 11413
+11414 11415
+11416 11417
+11418 11419
+11420 11421
+11422 11423
+11424 11425
+11426 11427
+11428 11429
+11430 11431
+11432 11433
+11434 11435
+11436 11437
+11438 11439
+11440 11441
+11442 11443
+11444 11445
+11446 11447
+11448 11449
+11450 11451
+11452 11453
+11454 11455
+11456 11457
+11458 11459
+11460 11461
+11462 11463
+11464 11465
+11466 11467
+11468 11469
+11470 11471
+11472 11473
+11474 11475
+11476 11477
+11478 11479
+11480 11481
+11482 11483
+11484 11485
+11486 11487
+11488 11489
+11490 11491
diff --git a/vespalib/src/tests/text/stringtokenizer/.gitignore b/vespalib/src/tests/text/stringtokenizer/.gitignore
new file mode 100644
index 00000000000..56f823c9950
--- /dev/null
+++ b/vespalib/src/tests/text/stringtokenizer/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+stringtokenizer_test
+vespalib_stringtokenizer_test_app
diff --git a/vespalib/src/tests/text/stringtokenizer/CMakeLists.txt b/vespalib/src/tests/text/stringtokenizer/CMakeLists.txt
new file mode 100644
index 00000000000..a31710b2447
--- /dev/null
+++ b/vespalib/src/tests/text/stringtokenizer/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_stringtokenizer_test_app
+ SOURCES
+ stringtokenizer_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_stringtokenizer_test_app COMMAND vespalib_stringtokenizer_test_app)
diff --git a/vespalib/src/tests/text/stringtokenizer/DESC b/vespalib/src/tests/text/stringtokenizer/DESC
new file mode 100644
index 00000000000..0d680dfedf4
--- /dev/null
+++ b/vespalib/src/tests/text/stringtokenizer/DESC
@@ -0,0 +1 @@
+stringtokenizer test. Take a look at stringtokenizer.cpp for details.
diff --git a/vespalib/src/tests/text/stringtokenizer/FILES b/vespalib/src/tests/text/stringtokenizer/FILES
new file mode 100644
index 00000000000..a40dd2d8811
--- /dev/null
+++ b/vespalib/src/tests/text/stringtokenizer/FILES
@@ -0,0 +1 @@
+stringtokenizer.cpp
diff --git a/vespalib/src/tests/text/stringtokenizer/stringtokenizer_test.cpp b/vespalib/src/tests/text/stringtokenizer/stringtokenizer_test.cpp
new file mode 100644
index 00000000000..1c88cb6587e
--- /dev/null
+++ b/vespalib/src/tests/text/stringtokenizer/stringtokenizer_test.cpp
@@ -0,0 +1,72 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("stringtokenizer_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/text/stringtokenizer.h>
+#include <set>
+
+using namespace vespalib;
+
+TEST_SETUP(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("stringtokenizer_test");
+ {
+ string s("This,is ,a,,list ,\tof,,sepa rated\n, \rtokens,");
+ StringTokenizer tokenizer(s);
+ std::vector<string> result;
+ result.push_back("This");
+ result.push_back("is");
+ result.push_back("a");
+ result.push_back("");
+ result.push_back("list");
+ result.push_back("of");
+ result.push_back("");
+ result.push_back("sepa rated");
+ result.push_back("tokens");
+ result.push_back("");
+
+ EXPECT_EQUAL(result.size(),
+ static_cast<size_t>(tokenizer.size()));
+ for (unsigned int i=0; i<result.size(); i++)
+ EXPECT_EQUAL(result[i], tokenizer[i]);
+ std::set<string> sorted(tokenizer.begin(), tokenizer.end());
+ EXPECT_EQUAL(static_cast<size_t>(8u), sorted.size());
+
+ tokenizer.removeEmptyTokens();
+ EXPECT_EQUAL(7u, tokenizer.size());
+ }
+ {
+ string s("\tAnother list with some \ntokens, and stuff.");
+ StringTokenizer tokenizer(s, " \t\n", ",.");
+ std::vector<string> result;
+ result.push_back("");
+ result.push_back("Another");
+ result.push_back("list");
+ result.push_back("with");
+ result.push_back("some");
+ result.push_back("");
+ result.push_back("tokens");
+ result.push_back("and");
+ result.push_back("stuff");
+
+ EXPECT_EQUAL(result.size(),
+ static_cast<size_t>(tokenizer.size()));
+ for (unsigned int i=0; i<result.size(); i++)
+ EXPECT_EQUAL(result[i], tokenizer[i]);
+ std::set<string> sorted(tokenizer.begin(), tokenizer.end());
+ EXPECT_EQUAL(static_cast<size_t>(8u), sorted.size());
+
+ tokenizer.removeEmptyTokens();
+ EXPECT_EQUAL(7u, tokenizer.size());
+ }
+ {
+ string s(" ");
+ StringTokenizer tokenizer(s);
+ EXPECT_EQUAL(0u, tokenizer.size());
+ }
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/text/utf8/.gitignore b/vespalib/src/tests/text/utf8/.gitignore
new file mode 100644
index 00000000000..8f97f6d3438
--- /dev/null
+++ b/vespalib/src/tests/text/utf8/.gitignore
@@ -0,0 +1,3 @@
+/make_url
+vespalib_utf8_test_app
+vespalib_make_url_app
diff --git a/vespalib/src/tests/text/utf8/CMakeLists.txt b/vespalib/src/tests/text/utf8/CMakeLists.txt
new file mode 100644
index 00000000000..888df5eb6dc
--- /dev/null
+++ b/vespalib/src/tests/text/utf8/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_utf8_test_app
+ SOURCES
+ utf8_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_utf8_test_app COMMAND vespalib_utf8_test_app)
+vespa_add_executable(vespalib_make_url_app
+ SOURCES
+ make_url.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/text/utf8/DESC b/vespalib/src/tests/text/utf8/DESC
new file mode 100644
index 00000000000..941b9d7292d
--- /dev/null
+++ b/vespalib/src/tests/text/utf8/DESC
@@ -0,0 +1 @@
+utf8 test. Take a look at utf8_test.cpp for details.
diff --git a/vespalib/src/tests/text/utf8/FILES b/vespalib/src/tests/text/utf8/FILES
new file mode 100644
index 00000000000..df9e000c979
--- /dev/null
+++ b/vespalib/src/tests/text/utf8/FILES
@@ -0,0 +1 @@
+utf8_test.cpp
diff --git a/vespalib/src/tests/text/utf8/make_url.cpp b/vespalib/src/tests/text/utf8/make_url.cpp
new file mode 100644
index 00000000000..29b0cf5dcc2
--- /dev/null
+++ b/vespalib/src/tests/text/utf8/make_url.cpp
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/text/utf8.h>
+
+void printCodepoint(unsigned long codepoint)
+{
+ vespalib::string data;
+ vespalib::Utf8Writer w(data);
+ w.putChar(codepoint);
+ printf("URL encoding of codepoint U+%04lX entity &#%lu; string value '%s' is:\n",
+ codepoint, codepoint, data.c_str());
+
+ for (size_t i = 0; i < data.size(); ++i) {
+ unsigned char byte = data[i];
+ printf("%%%02X", byte);
+ }
+ printf("\n");
+}
+
+int main(int argc, char **argv)
+{
+ if (argc == 2) {
+ unsigned long codepoint = 0;
+ if (sscanf(argv[1], "U+%lx", &codepoint) == 1) {
+ printCodepoint(codepoint);
+ return 0;
+ } else if (sscanf(argv[1], "\\u%lx", &codepoint) == 1) {
+ printCodepoint(codepoint);
+ return 0;
+ }
+ }
+ fprintf(stderr, "Usage: %s U+XXXX\n", argv[0]);
+ return 1;
+}
diff --git a/vespalib/src/tests/text/utf8/regular-utf8.dat b/vespalib/src/tests/text/utf8/regular-utf8.dat
new file mode 100644
index 00000000000..1509ebfce44
--- /dev/null
+++ b/vespalib/src/tests/text/utf8/regular-utf8.dat
@@ -0,0 +1 @@
+ #',29AJT_kx†•¥¶ÈÛïĄĚıʼnŢżƗƳǐǮȍȭɎɰʓʷ˜̩̂͑ͺΤϏϻШі҅ҵӦԘՋտִתءٙڒی܇݃ހ޾߽࠽ࡾࣀःेঌ৒ਙ੡પ૴ି஋௘ద౵೅ഖ൨රฏ๤຺༑ཀྵ࿂လၷდᄰᆎᇭቍኮጐ፳Ꮧᐼᒢᔉᕱᗚᙄᚯ᜛ឈ៶ᡥᣕ᥆ᦸᨫ᪟ᬔᮊᰁᱹᳲᵬᷧṣỠ὞῝⁝⃞Ⅰ⇣≧⋬⍲⏹⒁┊▔☟⚫✸⟆⡕⣥⥶⨈⪛⬯⯄ⱚ⳱ⶉ⸢⺼⽗⿳ゐㄮ㇍㉭㌎㎰㑓㓷㖜㙂㛩㞑㠺㣤㦏㨻㫨㮖㱅㳵㶦㹘㼋㾿䁴䄪䇡䊙䍒䐌䓇䖃䙀䛾䞽䡽䤾䨀䫃䮇䱌䴒䷙亡佪倴僿凋劘卦吵唅嗖嚨坻塏夤姺嫑宩岂嵜帷弓忰惎憭抍据摐攳昗曼柢棉榱檚殄汯浛湈漶瀥焕爆狸珫瓟痔益矁碹禲窬箧粣綠纞羝肝膞芠莣蒧薬蚲螹裁觊諔诟賫跸輆逕鄥鈶鍈鑛镯隄鞚颱駉髢鯼鴗鸳齐ꁮꆍꊭꏎꓰꘓꜷꡜꦂꪩꯑ곺긤꽏끻놨닖됅딵뙦래룋맿무뱪붡뻙쀒셌슇쏃씀옾읽좽짾쭀첃췇켌큒톙틡퐪해횿寮ﬢﲉﷱz𐃄𐈯𐎛𐔈𐙶𐟥𐥕𐫆𐰸𐶫𐼟𑂔𑈊𑎁𑓹𑙲𑟬𑥧𑫣𑱠𑷞𑽝𒃝𒉞𒏠𒕣𒛧𒡬𒧲𒭹𒴁𒺊𓀔𓆟𓌫𓒸𓙆𓟕𓥥𓫶𓲈𓸛𓾯𔅄𔋚𔑱𔘉𔞢𔤼𔫗𔱳𔸐𔾮𕅍𕋭𕒎𕘰𕟓𕥷𕬜𕳂𕹩𖀑𖆺𖍤𖔏𖚻𖡨𖨖𖯅𖵵𖼦𗃘𗊋𗐿𗗴𗞪𗥡𗬙𗳒𗺌𘁇𘈃𘏀𘕾𘜽𘣽𘪾𘲀𘹃𙀇𙇌𙎒𙕙𙜡𙣪𙪴𙱿𙹋𚀘𚇦𚎵𚖅𚝖𚤨𚫻𚳏𚺤𛁺𛉑𛐩𛘂𛟜𛦷𛮓𛵰𛽎𜄭𜌍𜓮𜛐𜢳𜪗𜱼𜹢𝁉𝈱𝐚𝘄𝟯𝧛𝯈𝶶𝾥𞆕𞎆𞕸𞝫𞥟𞭔𞵊𞽁🄹🌲🔬🜧🤣🬠🴞🼝𠄝𠌞𠔠𠜣𠤧𠬬𠴲𠼹𡅁𡍊𡕔𡝟𡥫𡭸𡶆𡾕𢆥𢎶𢗈𢟛𢧯𢰄𢸚𣀱𣉉𣑢𣙼𣢗𣪳𣳐𣻮𤄍𤌭𤕎𤝰𤦓𤮷𤷜𥀂𥈩𥑑𥙺𥢤𥫏𥳻𥼨𦅖𦎅𦖵𦟦𦨘𦱋𦹿𧂴𧋪𧔡𧝙𧦒𧯌𧸇𨁃𨊀𨒾𨛽𨤽𨭾𨷀𩀃𩉇𩒌𩛒𩤙𩭡𩶪𩿴𪈿𪒋𪛘𪤦𪭵𪷅𫀖𫉨𫒻𫜏𫥤𫮺𫸑𬁩𬋂𬔜𬝷𬧓𬰰𬺎𭃭𭍍𭖮𭠐𭩳𭳗𭼼𮆢𮐉𮙱𮣚𮭄𮶯𯀛𯊈𯓶𯝥賁𯱆𯺸𰄫𰎟𰘔𰢊𰬁𰵹𰿲𱉬𱓧𱝣𱧠𱱞𱻝𲅝𲏞𲙠𲣣𲭧𲷬𳁲𳋹𳖁𳠊𳪔𳴟𳾫𴈸𴓆𴝕𴧥𴱶𴼈𵆛𵐯𵛄𵥚𵯱𵺉𶄢𶎼𶙗𶣳𶮐𶸮𷃍𷍭𷘎𷢰𷭓𷷷𸂜𸍂𸗩𸢑𸬺𸷤𹂏𹌻𹗨𹢖𹭅𹷵𺂦𺍘𺘋𺢿𺭴𺸪𻃡𻎙𻙒𻤌𻯇𻺃𼅀𼏾𼚽𼥽𼰾𼼀𽇃𽒇𽝌𽨒𽳙𽾡𾉪𾔴𾟿𾫋𾶘𿁦𿌵𿘅𿣖𿮨𿹻񀅏񀐤񀛺񀧑񀲩񀾂񁉜񁔷񁠓񁫰񁷎񂂭񂎍񂙮񂥐񂰳񂼗񃇼񃓢񃟉񃪱񃶚񄂄񄍯񄙛񄥈񄰶񄼥񅈕񅔆񅟸񅫫񅷟񆃔񆏊񆛁񆦹񆲲񆾬񇊧񇖣񇢠񇮞񇺝񈆝񈒞񈞠񈪣񈶧񉂬񉎲񉚹񉧁񉳊񉿔񊋟񊗫񊣸񊰆񊼕񋈥񋔶񋡈񋭛񋹯񌆄񌒚񌞱񌫉񌷢񍃼񍐗񍜳񍩐񍵮񎂍񎎭񎛎񎧰񎴓񏀷񏍜񏚂񏦩񏳑񏿺񐌤񐙏񐥻񐲨񐿖񑌅񑘵񑥦񑲘񑿋񒋿񒘴񒥪񒲡񒿙񓌒񓙌񓦇񓳃񔀀񔌾񔙽񔦽񔳾񕁀񕎃񕛇񕨌񕵒񖂙񖏡񖜪񖩴񖶿񗄋񗑘񗞦񗫵񗹅񘆖񘓨񘠻񘮏񘻤񙈺񙖑񙣩񙱂񙾜񚋷񚙓񚦰񚴎񛁭񛏍񛜮񛪐񛷳񜅗񜒼񜠢񜮉񜻱񝉚񝗄񝤯񝲛񞀈񞍶񞛥񞩕񞷆񟄸񟒫񟠟񟮔񟼊񠊁񠗹񠥲񠳬񡁧񡏣񡝠񡫞񡹝񢇝񢕞񢣠񢱣񢿧񣍬񣛲񣩹񣸁񤆊񤔔񤢟񤰫񤾸񥍆񥛕񥩥񥷶񦆈񦔛񦢯񦱄񦿚񧍱񧜉񧪢񧸼񨇗񨕳񨤐񨲮񩁍񩏭񩞎񩬰񩻓񪉷񪘜񪧂񪵩񫄑񫒺񫡤񫰏񫾻񬍨񬜖񬫅񬹵񭈦񭗘񭦋񭴿񮃴񮒪񮡡񮰙񮿒񯎌񯝇񯬃񯻀񰉾񰘽񰧽񰶾񱆀񱕃񱤇񱳌񲂒񲑙񲠡񲯪񲾴񳍿񳝋񳬘񳻦񴊵񴚅񴩖񴸨񵇻񵗏񵦤񵵺񶅑񶔩񶤂񶳜񷂷񷒓񷡰񷱎񸀭񸐍񸟮񸯐񸾳񹎗񹝼񹭢񹽉񺌱񺜚񺬄񺻯񻋛񻛈񻪶񻺥񼊕񼚆񼩸񼹫񽉟񽙔񽩊񽹁񾈹񾘲񾨬񾸧񿈣񿘠񿨞񿸝򀈝򀘞򀨠򀸣򁈧򁘬򁨲򁸹򂉁򂙊򂩔򂹟򃉫򃙸򃪆򃺕򄊥򄚶򄫈򄻛򅋯򅜄򅬚򅼱򆍉򆝢򆭼򆾗򇎳򇟐򇯮򈀍򈐭򈡎򈱰򉂓򉒷򉣜򉴂򊄩򊕑򊥺򊶤򋇏򋗻򋨨򋹖򌊅򌚵򌫦򌼘򍍋򍝿򍮴򍿪򎐡򎡙򎲒򏃌򏔇򏥃򏶀򐆾򐗽򐨽򐹾򑋀򑜃򑭇򑾌򒏒򒠙򒱡򓂪򓓴򓤿򓶋򔇘򔘦򔩵򔻅򕌖򕝨򕮻򖀏򖑤򖢺򖴑򗅩򗗂򗨜򗹷򘋓򘜰򘮎򘿭򙑍򙢮򙴐򚅳򚗗򚨼򚺢򛌉򛝱򛯚򜁄򜒯򜤛򜶈򝇶򝙥򝫕򝽆򞎸򞠫򞲟򟄔򟖊򟨁򟹹򠋲򠝬򠯧򡁣򡓠򡥞򡷝򢉝򢛞򢭠򢿣򣑧򣣬򣵲򤇹򤚁򤬊򤾔򥐟򥢫򥴸򦇆򦙕򦫥򦽶򧐈򧢛򧴯򨇄򨙚򨫱򨾉򩐢򩢼򩵗򪇳򪚐򪬮򪿍򫑭򫤎򫶰򬉓򬛷򬮜򭁂򭓩򭦑򭸺򮋤򮞏򮰻򯃨򯖖򯩅򯻵򰎦򰡘򰴋򱆿򱙴򱬪򱿡򲒙򲥒򲸌򳋇򳞃򳱀򴃾򴖽򴩽򴼾򵐀򵣃򵶇򶉌򶜒򶯙򷂡򷕪򷨴򷻿򸏋򸢘򸵦򹈵򹜅򹯖򺂨򺕻򺩏򺼤򻏺򻣑򻶩򼊂򼝜򼰷򽄓򽗰򽫎򽾭򾒍򾥮򾹐򿌳򿠗򿳼󀇢󀛉󀮱󁂚󁖄󁩯󁽛󂑈󂤶󂸥󃌕󃠆󃳸󄇫󄛟󄯔󅃊󅗁󅪹󅾲󆒬󆦧󆺣󇎠󇢞󇶝󈊝󈞞󈲠󉆣󉚧󉮬󊂲󊖹󊫁󊿊󋓔󋧟󋻫󌏸󌤆󌸕󍌥󍠶󍵈󎉛󎝯󎲄󏆚󏚱󏯉󐃢󐗼󐬗󑀳󑕐󑩮󑾍󒒭󒧎󒻰󓐓󓤷󓹜󔎂󔢩󔷑󕋺󕠤󕵏󖉻󖞨󖳖󗈅󗜵󗱦󘆘󘛋󘯿󙄴󙙪󙮡󚃙󚘒󚭌󛂇󛗃󛬀󜀾󜕽󜪽󜿾󝕀󝪃󝿇󞔌󞩒󞾙󟓡󟨪󟽴󠒿󠨋󠽘󡒦󡧵󡽅󢒖󢧨󢼻󣒏󣧤󣼺󤒑󤧩󤽂󥒜󥧷󥽓󦒰󦨎󦽭󧓍󧨮󧾐󨓳󨩗󨾼󩔢󩪉󩿱󪕚󪫄󫀯󫖛󫬈󬁶󬗥󬭕󭃆󭘸󭮫󮄟󮚔󮰊󯆁󯛹󯱲󰇬󰝧󰳣󱉠󱟞󱵝󲋝󲡞󲷠󳍣󳣧󳹬󴏲󴥹󴼁󵒊󵨔󵾟󶔫󶪸󷁆󷗕󷭥󸃶󸚈󸰛󹆯󹝄󹳚󺉱󺠉󺶢󻌼󻣗󻹳󼐐󼦮󼽍󽓭󽪎󾀰󾗓󾭷󿄜󿛂󿱩􀈑􀞺􀵤􁌏􁢻􁹨􂐖􂧅􂽵􃔦􃫘􄂋􄘿􄯴􅆪􅝡􅴙􆋒􆢌􆹇􇐃􇧀􇽾􈔽􈫽􉂾􉚀􉱃􊈇􊟌􊶒􋍙􋤡􋻪􌒴􌩿􍁋􍘘􍯦􎆵􎞅􎵖􏌨􏣻􏻏 \ No newline at end of file
diff --git a/vespalib/src/tests/text/utf8/utf8_test.cpp b/vespalib/src/tests/text/utf8/utf8_test.cpp
new file mode 100644
index 00000000000..99a926f8088
--- /dev/null
+++ b/vespalib/src/tests/text/utf8/utf8_test.cpp
@@ -0,0 +1,79 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("utf8_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/text/utf8.h>
+#if 0
+#include <vespa/fastlib/text/unicodeutil.h>
+#endif
+
+using namespace vespalib;
+
+TEST_SETUP(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("utf8_test");
+
+ for (uint32_t h = 0; h < 0x1100; h++) {
+ vespalib::string data;
+
+ if (h >= 0xD8 && h < 0xE0) continue;
+
+ Utf8Writer w(data);
+ for (uint32_t i = 0; i < 256; i++) {
+ unsigned int codepoint = (h << 8) | i;
+ w.putChar(codepoint);
+ }
+
+ fprintf(stderr, "encoded 256 codepoints [U+%04X,U+%04X] in %zu bytes\n",
+ (h << 8), (h << 8) | 0xFF, data.size());
+
+ Utf8Reader r(data);
+ for (uint32_t i = 0; i < 256; i++) {
+ EXPECT_TRUE(r.hasMore());
+ unsigned int codepoint = (h << 8) | i;
+ unsigned int got = r.getChar(12345678);
+ EXPECT_EQUAL(codepoint, got);
+ }
+ EXPECT_TRUE(! r.hasMore());
+
+#if 0
+ char *p = data.begin();
+ char *e = data.end();
+ for (uint32_t i = 0; i < 256; i++) {
+ unsigned int codepoint = (h << 8) | i;
+ unsigned int got = Fast_UnicodeUtil::GetUTF8Char(p);
+ EXPECT_EQUAL(codepoint, got);
+ }
+ EXPECT_EQUAL(p, e);
+#endif
+ }
+
+ {
+ // read data produced from Java program
+ int fd = ::open("regular-utf8.dat", O_RDONLY);
+ ASSERT_TRUE(fd > 0);
+ vespalib::string data;
+ data.clear();
+ data.reserve(5510);
+ ASSERT_TRUE(::read(fd, data.begin(), 5510) == 5509);
+ data.append_from_reserved(5509);
+ Utf8Reader r(data);
+ uint32_t i = 32;
+ uint32_t j = 3;
+ while (i < 0x110000) {
+ if (i < 0xD800 || i >= 0xE000) {
+ ASSERT_TRUE(r.hasMore());
+ uint32_t got = r.getChar(12345678);
+ EXPECT_EQUAL(i, got);
+ }
+ i += j;
+ j++;
+ }
+ EXPECT_TRUE(! r.hasMore());
+ }
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/thread/.gitignore b/vespalib/src/tests/thread/.gitignore
new file mode 100644
index 00000000000..0853d8fb1da
--- /dev/null
+++ b/vespalib/src/tests/thread/.gitignore
@@ -0,0 +1 @@
+vespalib_thread_test_app
diff --git a/vespalib/src/tests/thread/CMakeLists.txt b/vespalib/src/tests/thread/CMakeLists.txt
new file mode 100644
index 00000000000..eae0fde2646
--- /dev/null
+++ b/vespalib/src/tests/thread/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_thread_test_app
+ SOURCES
+ thread_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_thread_test_app COMMAND vespalib_thread_test_app)
diff --git a/vespalib/src/tests/thread/FILES b/vespalib/src/tests/thread/FILES
new file mode 100644
index 00000000000..9c62d0111c5
--- /dev/null
+++ b/vespalib/src/tests/thread/FILES
@@ -0,0 +1 @@
+thread_test.cpp
diff --git a/vespalib/src/tests/thread/thread_test.cpp b/vespalib/src/tests/thread/thread_test.cpp
new file mode 100644
index 00000000000..76c6ccdee1d
--- /dev/null
+++ b/vespalib/src/tests/thread/thread_test.cpp
@@ -0,0 +1,54 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/thread.h>
+
+using namespace vespalib;
+
+struct Agent : public Runnable {
+ bool started;
+ int loopCnt;
+ Agent() : started(false), loopCnt(0) {}
+ virtual void run() {
+ started = true;
+ Thread &thread = Thread::currentThread();
+ while (thread.slumber(60.0)) {
+ ++loopCnt;
+ }
+ }
+};
+
+TEST("thread never started") {
+ Agent agent;
+ {
+ Thread thread(agent);
+ }
+ EXPECT_TRUE(!agent.started);
+ EXPECT_EQUAL(0, agent.loopCnt);
+}
+
+TEST("normal operation") {
+ Agent agent;
+ {
+ Thread thread(agent);
+ thread.start();
+ FastOS_Thread::Sleep(20);
+ thread.stop().join();
+ }
+ EXPECT_TRUE(agent.started);
+ EXPECT_EQUAL(0, agent.loopCnt);
+}
+
+TEST("stop before start") {
+ Agent agent;
+ {
+ Thread thread(agent);
+ thread.stop();
+ thread.start();
+ thread.join();
+ }
+ EXPECT_TRUE(agent.started);
+ EXPECT_EQUAL(0, agent.loopCnt);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/time_tracker/.gitignore b/vespalib/src/tests/time_tracker/.gitignore
new file mode 100644
index 00000000000..b6275ecd945
--- /dev/null
+++ b/vespalib/src/tests/time_tracker/.gitignore
@@ -0,0 +1 @@
+vespalib_time_tracker_test_app
diff --git a/vespalib/src/tests/time_tracker/CMakeLists.txt b/vespalib/src/tests/time_tracker/CMakeLists.txt
new file mode 100644
index 00000000000..504cceab892
--- /dev/null
+++ b/vespalib/src/tests/time_tracker/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_time_tracker_test_app
+ SOURCES
+ time_tracker_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_time_tracker_test_app COMMAND vespalib_time_tracker_test_app)
diff --git a/vespalib/src/tests/time_tracker/FILES b/vespalib/src/tests/time_tracker/FILES
new file mode 100644
index 00000000000..dba9cab3217
--- /dev/null
+++ b/vespalib/src/tests/time_tracker/FILES
@@ -0,0 +1 @@
+time_tracker_test.cpp
diff --git a/vespalib/src/tests/time_tracker/time_tracker_test.cpp b/vespalib/src/tests/time_tracker/time_tracker_test.cpp
new file mode 100644
index 00000000000..0f1bf57c378
--- /dev/null
+++ b/vespalib/src/tests/time_tracker/time_tracker_test.cpp
@@ -0,0 +1,94 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/time_tracker.h>
+#include <vespa/vespalib/util/stringfmt.h>
+
+using namespace vespalib;
+
+size_t count(const std::string &token, const vespalib::string &str) {
+ size_t cnt = 0;
+ for (size_t pos = str.find(token); pos != str.npos; pos = str.find(token, pos + 1)) {
+ ++cnt;
+ }
+ return cnt;
+}
+
+void do_stuff(size_t n) {
+ vespalib::string data;
+ for (size_t i = 0; i < n; ++i) {
+ data.append(make_string("%zu%zu", i, i));
+ }
+}
+
+TEST("require that thread aware time tracking works") {
+ TimeTracker outer_tt(2);
+ TimeTracker medio_tt(0);
+ TimeTracker inner_tt(3);
+ {
+ TIMED_THREAD(outer_tt);
+ TIMED("foo", do_stuff(100));
+ TIMED("bar", do_stuff(200));
+ TIMED("baz", do_stuff(300));
+ {
+ TIMED_SCOPE("foo");
+ do_stuff(100);
+ {
+ {
+ TIMED_THREAD(medio_tt);
+ TIMED("ignore", do_stuff(100)); // max_level == 0
+ TIMED("ignore", do_stuff(200)); // max_level == 0
+ TIMED("ignore", do_stuff(300)); // max_level == 0
+ {
+ TIMED_THREAD(inner_tt);
+ TIMED("foo", do_stuff(100));
+ TIMED("bar", do_stuff(200));
+ TIMED("baz", do_stuff(300));
+ {
+ TIMED_SCOPE("foo");
+ do_stuff(100);
+ {
+ TIMED_SCOPE("bar");
+ do_stuff(200);
+ {
+ TIMED_SCOPE("baz");
+ do_stuff(300);
+ }
+ }
+ }
+ }
+ }
+ TIMED_SCOPE("bar");
+ do_stuff(200);
+ {
+ TIMED_SCOPE("ignore"); // below max level
+ TIMED("ignore", do_stuff(100)); // below max level
+ TIMED("ignore", do_stuff(200)); // below max level
+ TIMED("ignore", do_stuff(300)); // below max level
+ }
+ }
+ }
+ }
+ TIMED("ignore", do_stuff(100)); // outside
+ TIMED("ignore", do_stuff(200)); // outside
+ TIMED("ignore", do_stuff(300)); // outside
+ fprintf(stderr, "outer stats: \n%s\n", outer_tt.get_stats().c_str());
+ EXPECT_EQUAL(2u, count("foo:", outer_tt.get_stats()));
+ EXPECT_EQUAL(2u, count("bar:", outer_tt.get_stats()));
+ EXPECT_EQUAL(1u, count("baz:", outer_tt.get_stats()));
+ EXPECT_EQUAL(3u, count("foo", outer_tt.get_stats()));
+ EXPECT_EQUAL(2u, count("bar", outer_tt.get_stats()));
+ EXPECT_EQUAL(0u, count("ignore", outer_tt.get_stats()));
+ EXPECT_EQUAL(5u, count("\n", outer_tt.get_stats()));
+ EXPECT_EQUAL("", medio_tt.get_stats());
+ fprintf(stderr, "inner stats: \n%s\n", inner_tt.get_stats().c_str());
+ EXPECT_EQUAL(2u, count("foo:", inner_tt.get_stats()));
+ EXPECT_EQUAL(2u, count("bar:", inner_tt.get_stats()));
+ EXPECT_EQUAL(2u, count("baz:", inner_tt.get_stats()));
+ EXPECT_EQUAL(4u, count("foo", inner_tt.get_stats()));
+ EXPECT_EQUAL(3u, count("bar", inner_tt.get_stats()));
+ EXPECT_EQUAL(0u, count("ignore", inner_tt.get_stats()));
+ EXPECT_EQUAL(6u, count("\n", inner_tt.get_stats()));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/trace/.gitignore b/vespalib/src/tests/trace/.gitignore
new file mode 100644
index 00000000000..51b4ee1aef8
--- /dev/null
+++ b/vespalib/src/tests/trace/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+trace_test
+vespalib_trace_test_app
diff --git a/vespalib/src/tests/trace/CMakeLists.txt b/vespalib/src/tests/trace/CMakeLists.txt
new file mode 100644
index 00000000000..c0dbdef7ad3
--- /dev/null
+++ b/vespalib/src/tests/trace/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_trace_test_app
+ SOURCES
+ trace.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_trace_test_app COMMAND vespalib_trace_test_app)
diff --git a/vespalib/src/tests/trace/DESC b/vespalib/src/tests/trace/DESC
new file mode 100644
index 00000000000..452e75aefea
--- /dev/null
+++ b/vespalib/src/tests/trace/DESC
@@ -0,0 +1 @@
+trace test. Take a look at trace.cpp for details.
diff --git a/vespalib/src/tests/trace/FILES b/vespalib/src/tests/trace/FILES
new file mode 100644
index 00000000000..9a32b13b6f3
--- /dev/null
+++ b/vespalib/src/tests/trace/FILES
@@ -0,0 +1 @@
+trace.cpp
diff --git a/vespalib/src/tests/trace/trace.cpp b/vespalib/src/tests/trace/trace.cpp
new file mode 100644
index 00000000000..92b5917891c
--- /dev/null
+++ b/vespalib/src/tests/trace/trace.cpp
@@ -0,0 +1,410 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("trace_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/trace/trace.h>
+#include <vespa/vespalib/trace/tracevisitor.h>
+
+using namespace vespalib;
+
+class Test : public vespalib::TestApp {
+private:
+ void testEncodeDecode();
+ void testReservedChars();
+ void testConstruct();
+ void testAdd();
+ void testSort();
+ void testStrict();
+ void testTraceLevel();
+ void testCompact();
+ void testNormalize();
+ void testTraceDump();
+ void testVisiting();
+ void testTimestamp();
+
+public:
+ int Main();
+};
+
+TEST_APPHOOK(Test);
+
+int
+Test::Main()
+{
+ TEST_INIT("trace_test");
+ testEncodeDecode();
+ testReservedChars();
+ testAdd();
+ testConstruct();
+ testSort();
+ testStrict();
+ testTraceLevel();
+ testCompact();
+ testNormalize();
+ testTraceDump();
+ testVisiting();
+ testTimestamp();
+ TEST_DONE();
+}
+
+void
+Test::testEncodeDecode()
+{
+ EXPECT_EQUAL("()", TraceNode::decode("").encode());
+ EXPECT_EQUAL("()", TraceNode::decode("[xyz").encode());
+ EXPECT_EQUAL("([xyz][])", TraceNode::decode("[xyz][]").encode());
+ EXPECT_EQUAL("[xyz]", TraceNode::decode("[xyz]").encode());
+ EXPECT_EQUAL("()", TraceNode::decode("{()").encode());
+ EXPECT_EQUAL("({()}{})", TraceNode::decode("{()}{}").encode());
+ EXPECT_EQUAL("{()}", TraceNode::decode("{()}").encode());
+ EXPECT_EQUAL("()", TraceNode::decode("({}").encode());
+ EXPECT_EQUAL("(({})())", TraceNode::decode("({})()").encode());
+ EXPECT_EQUAL("([])", TraceNode::decode("([])").encode());
+
+ EXPECT_TRUE(TraceNode::decode("").isEmpty());
+ EXPECT_TRUE(!TraceNode::decode("([note])").isEmpty());
+
+ string str =
+ "([[17/Jun/2009:09:02:30 +0200\\] Message (type 1) received at 'dst' for session 'session'.]"
+ "[[17/Jun/2009:09:02:30 +0200\\] [APP_TRANSIENT_ERROR @ localhost\\]: err1]"
+ "[[17/Jun/2009:09:02:30 +0200\\] Sending reply (version 4.2) from 'dst'.])";
+ fprintf(stderr, "%s\n", TraceNode::decode(str).toString().c_str());
+ EXPECT_EQUAL(str, TraceNode::decode(str).encode());
+
+ str = "([Note 0][Note 1]{[Note 2]}{([Note 3])({[Note 4]})})";
+ TraceNode t = TraceNode::decode(str);
+ EXPECT_EQUAL(str, t.encode());
+
+ EXPECT_TRUE(t.isRoot());
+ EXPECT_TRUE(t.isStrict());
+ EXPECT_TRUE(!t.isLeaf());
+ EXPECT_EQUAL(4u, t.getNumChildren());
+
+ {
+ TraceNode c = t.getChild(0);
+ EXPECT_TRUE(c.isLeaf());
+ EXPECT_EQUAL("Note 0", c.getNote());
+ }
+ {
+ TraceNode c = t.getChild(1);
+ EXPECT_TRUE(c.isLeaf());
+ EXPECT_EQUAL("Note 1", c.getNote());
+ }
+ {
+ TraceNode c = t.getChild(2);
+ EXPECT_TRUE(!c.isLeaf());
+ EXPECT_TRUE(!c.isStrict());
+ EXPECT_EQUAL(1u, c.getNumChildren());
+ {
+ TraceNode d = c.getChild(0);
+ EXPECT_TRUE(d.isLeaf());
+ EXPECT_EQUAL("Note 2", d.getNote());
+ }
+ }
+ {
+ TraceNode c = t.getChild(3);
+ EXPECT_TRUE(!c.isStrict());
+ EXPECT_EQUAL(2u, c.getNumChildren());
+ {
+ TraceNode d = c.getChild(0);
+ EXPECT_TRUE(d.isStrict());
+ EXPECT_TRUE(!d.isLeaf());
+ EXPECT_EQUAL(1u, d.getNumChildren());
+ {
+ TraceNode e = d.getChild(0);
+ EXPECT_TRUE(e.isLeaf());
+ EXPECT_EQUAL("Note 3", e.getNote());
+ }
+ }
+ {
+ TraceNode d = c.getChild(1);
+ EXPECT_TRUE(d.isStrict());
+ EXPECT_EQUAL(1u, d.getNumChildren());
+ {
+ TraceNode e = d.getChild(0);
+ EXPECT_TRUE(!e.isStrict());
+ EXPECT_EQUAL(1u, e.getNumChildren());
+ {
+ TraceNode f = e.getChild(0);
+ EXPECT_TRUE(f.isLeaf());
+ EXPECT_EQUAL("Note 4", f.getNote());
+ }
+ }
+ }
+ }
+}
+
+void
+Test::testReservedChars()
+{
+ TraceNode t;
+ t.addChild("abc(){}[]\\xyz");
+ EXPECT_EQUAL("abc(){}[]\\xyz", t.getChild(0).getNote());
+ EXPECT_EQUAL("([abc(){}[\\]\\\\xyz])", t.encode());
+ {
+ // test swap/clear/empty here
+ TraceNode t2;
+ EXPECT_TRUE(t2.isEmpty());
+ t2.swap(t);
+ EXPECT_TRUE(!t2.isEmpty());
+ EXPECT_EQUAL("abc(){}[]\\xyz", t2.getChild(0).getNote());
+ EXPECT_EQUAL("([abc(){}[\\]\\\\xyz])", t2.encode());
+ t2.clear();
+ EXPECT_TRUE(t2.isEmpty());
+ }
+}
+
+void
+Test::testAdd()
+{
+ TraceNode t1 = TraceNode::decode("([x])");
+ TraceNode t2 = TraceNode::decode("([y])");
+ TraceNode t3 = TraceNode::decode("([z])");
+
+ t1.addChild(t2);
+ EXPECT_EQUAL("([x]([y]))", t1.encode());
+ EXPECT_TRUE(t1.getChild(1).isStrict());
+ t1.addChild("txt");
+ EXPECT_TRUE(t1.getChild(2).isLeaf());
+ EXPECT_EQUAL("([x]([y])[txt])", t1.encode());
+ t3.addChild(t1);
+ EXPECT_EQUAL("([z]([x]([y])[txt]))", t3.encode());
+
+ // crazy but possible (everything is by value)
+ t2.addChild(t2).addChild(t2);
+ EXPECT_EQUAL("([y]([y])([y]([y])))", t2.encode());
+}
+
+void
+Test::testStrict()
+{
+ EXPECT_EQUAL("{}", TraceNode::decode("()").setStrict(false).encode());
+ EXPECT_EQUAL("{[x]}", TraceNode::decode("([x])").setStrict(false).encode());
+ EXPECT_EQUAL("{[x][y]}", TraceNode::decode("([x][y])").setStrict(false).encode());
+}
+
+void
+Test::testTraceLevel()
+{
+ Trace t;
+ t.setLevel(4);
+ EXPECT_EQUAL(4u, t.getLevel());
+ t.trace(9, "no");
+ EXPECT_EQUAL(0u, t.getRoot().getNumChildren());
+ t.trace(8, "no");
+ EXPECT_EQUAL(0u, t.getRoot().getNumChildren());
+ t.trace(7, "no");
+ EXPECT_EQUAL(0u, t.getRoot().getNumChildren());
+ t.trace(6, "no");
+ EXPECT_EQUAL(0u, t.getRoot().getNumChildren());
+ t.trace(5, "no");
+ EXPECT_EQUAL(0u, t.getRoot().getNumChildren());
+ t.trace(4, "yes");
+ EXPECT_EQUAL(1u, t.getRoot().getNumChildren());
+ t.trace(3, "yes");
+ EXPECT_EQUAL(2u, t.getRoot().getNumChildren());
+ t.trace(2, "yes");
+ EXPECT_EQUAL(3u, t.getRoot().getNumChildren());
+ t.trace(1, "yes");
+ EXPECT_EQUAL(4u, t.getRoot().getNumChildren());
+ t.trace(0, "yes");
+ EXPECT_EQUAL(5u, t.getRoot().getNumChildren());
+}
+
+void
+Test::testCompact()
+{
+ EXPECT_EQUAL("()", TraceNode::decode("()").compact().encode());
+ EXPECT_EQUAL("()", TraceNode::decode("(())").compact().encode());
+ EXPECT_EQUAL("()", TraceNode::decode("(()())").compact().encode());
+ EXPECT_EQUAL("()", TraceNode::decode("({})").compact().encode());
+ EXPECT_EQUAL("()", TraceNode::decode("({}{})").compact().encode());
+ EXPECT_EQUAL("()", TraceNode::decode("({{}{}})").compact().encode());
+
+ EXPECT_EQUAL("([x])", TraceNode::decode("([x])").compact().encode());
+ EXPECT_EQUAL("([x])", TraceNode::decode("(([x]))").compact().encode());
+ EXPECT_EQUAL("([x][y])", TraceNode::decode("(([x])([y]))").compact().encode());
+ EXPECT_EQUAL("([x])", TraceNode::decode("({[x]})").compact().encode());
+ EXPECT_EQUAL("([x][y])", TraceNode::decode("({[x]}{[y]})").compact().encode());
+ EXPECT_EQUAL("({[x][y]})", TraceNode::decode("({{[x]}{[y]}})").compact().encode());
+
+ EXPECT_EQUAL("([a][b][c][d])", TraceNode::decode("(([a][b])([c][d]))").compact().encode());
+ EXPECT_EQUAL("({[a][b]}{[c][d]})", TraceNode::decode("({[a][b]}{[c][d]})").compact().encode());
+ EXPECT_EQUAL("({[a][b][c][d]})", TraceNode::decode("({{[a][b]}{[c][d]}})").compact().encode());
+ EXPECT_EQUAL("({([a][b])([c][d])})", TraceNode::decode("({([a][b])([c][d])})").compact().encode());
+
+ EXPECT_EQUAL("({{}{(({()}({}){()(){}}){})}})", TraceNode::decode("({{}{(({()}({}){()(){}}){})}})").encode());
+ EXPECT_EQUAL("()", TraceNode::decode("({{}{(({()}({}){()(){}}){})}})").compact().encode());
+ EXPECT_EQUAL("([x])", TraceNode::decode("({{}{([x]({()}({}){()(){}}){})}})").compact().encode());
+ EXPECT_EQUAL("([x])", TraceNode::decode("({{}{(({()}({[x]}){()(){}}){})}})").compact().encode());
+ EXPECT_EQUAL("([x])", TraceNode::decode("({{}{(({()}({}){()(){}})[x]{})}})").compact().encode());
+
+ EXPECT_EQUAL("({[a][b][c][d][e][f]})", TraceNode::decode("({({[a][b]})({[c][d]})({[e][f]})})").compact().encode());
+}
+
+void
+Test::testSort()
+{
+ EXPECT_EQUAL("([b][a][c])", TraceNode::decode("([b][a][c])").sort().encode());
+ EXPECT_EQUAL("({[a][b][c]})", TraceNode::decode("({[b][a][c]})").sort().encode());
+ EXPECT_EQUAL("(([c][a])([b]))", TraceNode::decode("(([c][a])([b]))").sort().encode());
+ EXPECT_EQUAL("({[b]([c][a])})", TraceNode::decode("({([c][a])[b]})").sort().encode());
+ EXPECT_EQUAL("({[a][c]}[b])", TraceNode::decode("({[c][a]}[b])").sort().encode());
+ EXPECT_EQUAL("({([b]){[a][c]}})", TraceNode::decode("({{[c][a]}([b])})").sort().encode());
+}
+
+void
+Test::testNormalize()
+{
+ TraceNode t1 = TraceNode::decode("({([a][b]{[x][y]([p][q])})([c][d])([e][f])})");
+ TraceNode t2 = TraceNode::decode("({([a][b]{[y][x]([p][q])})([c][d])([e][f])})");
+ TraceNode t3 = TraceNode::decode("({([a][b]{[y]([p][q])[x]})([c][d])([e][f])})");
+ TraceNode t4 = TraceNode::decode("({([e][f])([a][b]{[y]([p][q])[x]})([c][d])})");
+ TraceNode t5 = TraceNode::decode("({([e][f])([c][d])([a][b]{([p][q])[y][x]})})");
+
+ TraceNode tx = TraceNode::decode("({([b][a]{[x][y]([p][q])})([c][d])([e][f])})");
+ TraceNode ty = TraceNode::decode("({([a][b]{[x][y]([p][q])})([d][c])([e][f])})");
+ TraceNode tz = TraceNode::decode("({([a][b]{[x][y]([q][p])})([c][d])([e][f])})");
+
+ EXPECT_EQUAL("({([a][b]{[x][y]([p][q])})([c][d])([e][f])})", t1.compact().encode());
+
+ EXPECT_TRUE(t1.compact().encode() != t2.compact().encode());
+ EXPECT_TRUE(t1.compact().encode() != t3.compact().encode());
+ EXPECT_TRUE(t1.compact().encode() != t4.compact().encode());
+ EXPECT_TRUE(t1.compact().encode() != t5.compact().encode());
+ EXPECT_TRUE(t1.compact().encode() != tx.compact().encode());
+ EXPECT_TRUE(t1.compact().encode() != ty.compact().encode());
+ EXPECT_TRUE(t1.compact().encode() != tz.compact().encode());
+
+ fprintf(stderr, "1: %s\n", + t1.normalize().encode().c_str());
+ fprintf(stderr, "2: %s\n", + t2.normalize().encode().c_str());
+ fprintf(stderr, "3: %s\n", + t3.normalize().encode().c_str());
+ fprintf(stderr, "4: %s\n", + t4.normalize().encode().c_str());
+ fprintf(stderr, "5: %s\n", + t5.normalize().encode().c_str());
+ fprintf(stderr, "x: %s\n", + tx.normalize().encode().c_str());
+ fprintf(stderr, "y: %s\n", + ty.normalize().encode().c_str());
+ fprintf(stderr, "z: %s\n", + tz.normalize().encode().c_str());
+ EXPECT_TRUE(t1.normalize().encode() == t2.normalize().encode());
+ EXPECT_TRUE(t1.normalize().encode() == t3.normalize().encode());
+ EXPECT_TRUE(t1.normalize().encode() == t4.normalize().encode());
+ EXPECT_TRUE(t1.normalize().encode() == t5.normalize().encode());
+ EXPECT_TRUE(t1.normalize().encode() != tx.normalize().encode());
+ EXPECT_TRUE(t1.normalize().encode() != ty.normalize().encode());
+ EXPECT_TRUE(t1.normalize().encode() != tz.normalize().encode());
+
+ EXPECT_EQUAL("({([c][d])([e][f])([a][b]{[x][y]([p][q])})})", t1.normalize().encode());
+}
+
+void
+Test::testTraceDump()
+{
+ {
+ Trace big;
+ TraceNode b1;
+ TraceNode b2;
+ for (int i = 0; i < 100; ++i) {
+ b2.addChild("test");
+ }
+ for (int i = 0; i < 10; ++i) {
+ b1.addChild(b2);
+ }
+ for (int i = 0; i < 10; ++i) {
+ big.getRoot().addChild(b1);
+ }
+ string normal = big.toString();
+ string full = big.getRoot().toString();
+ EXPECT_GREATER(normal.size(), 30000u);
+ EXPECT_LESS(normal.size(), 32000u);
+ EXPECT_GREATER(full.size(), 50000u);
+ EXPECT_EQUAL(0, strncmp(normal.c_str(), full.c_str(), 30000));
+ }
+ {
+ TraceNode s1;
+ TraceNode s2;
+ s2.addChild("test");
+ s2.addChild("test");
+ s1.addChild(s2);
+ s1.addChild(s2);
+ EXPECT_EQUAL(vespalib::string("...\n"), s1.toString(0));
+ EXPECT_EQUAL(vespalib::string("<trace>\n...\n"), s1.toString(1));
+ EXPECT_EQUAL(vespalib::string("<trace>\n" // 8 8
+ " <trace>\n" // 12 20
+ " test\n" // 13 33
+ "...\n"), s1.toString(33));
+ EXPECT_EQUAL(vespalib::string("<trace>\n" // 8 8
+ " test\n" // 9 17
+ " test\n" // 9 26
+ "...\n"), s2.toString(26));
+ EXPECT_EQUAL(vespalib::string("<trace>\n" // 8 8
+ " test\n" // 9 17
+ " test\n" // 9 26
+ "</trace>\n"), s2.toString(27));
+ EXPECT_EQUAL(s2.toString(27), s2.toString());
+ }
+}
+
+struct EncoderVisitor : public TraceVisitor
+{
+ vespalib::string str;
+ void entering(const TraceNode & traceNode) {
+ (void) traceNode;
+ str += "(";
+ }
+ void visit(const TraceNode & traceNode) {
+ if (traceNode.hasNote()) {
+ str += "[";
+ str += traceNode.getNote();
+ str += "]";
+ }
+ }
+ void leaving(const TraceNode & traceNode) {
+ (void) traceNode;
+ str += ")";
+ }
+};
+
+void
+Test::testVisiting()
+{
+ TraceNode b1;
+ TraceNode b2;
+ for (int i = 0; i < 100; ++i) {
+ std::stringstream ss;
+ ss << i;
+ TraceNode b3;
+ b3.addChild(ss.str());
+ b2.addChild(b3);
+ }
+ for (int i = 0; i < 10; ++i) {
+ b1.addChild(b2);
+ }
+ EncoderVisitor encoder;
+ b1.accept(encoder);
+ EXPECT_EQUAL(encoder.str, b1.encode());
+}
+
+void
+Test::testTimestamp()
+{
+ TraceNode root;
+ root.addChild("foo", 1234);
+ root.addChild("bar");
+ EXPECT_EQUAL(root.getTimestamp(), 0);
+ EXPECT_EQUAL(root.getChild(0).getTimestamp(), 1234);
+ EXPECT_EQUAL(root.getChild(1).getTimestamp(), 0);
+}
+
+void
+Test::testConstruct()
+{
+ TraceNode leaf1("foo", 123);
+ EXPECT_TRUE(leaf1.hasNote());
+ EXPECT_EQUAL("foo", leaf1.getNote());
+ EXPECT_EQUAL(123, leaf1.getTimestamp());
+
+ TraceNode leaf2(124);
+ EXPECT_FALSE(leaf2.hasNote());
+ EXPECT_EQUAL("", leaf2.getNote());
+ EXPECT_EQUAL(124, leaf2.getTimestamp());
+}
diff --git a/vespalib/src/tests/traits/.gitignore b/vespalib/src/tests/traits/.gitignore
new file mode 100644
index 00000000000..904c47c7e1c
--- /dev/null
+++ b/vespalib/src/tests/traits/.gitignore
@@ -0,0 +1 @@
+vespalib_traits_test_app
diff --git a/vespalib/src/tests/traits/CMakeLists.txt b/vespalib/src/tests/traits/CMakeLists.txt
new file mode 100644
index 00000000000..9d9280c671d
--- /dev/null
+++ b/vespalib/src/tests/traits/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_traits_test_app
+ SOURCES
+ traits_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_traits_test_app COMMAND vespalib_traits_test_app)
diff --git a/vespalib/src/tests/traits/FILES b/vespalib/src/tests/traits/FILES
new file mode 100644
index 00000000000..746da2f95ea
--- /dev/null
+++ b/vespalib/src/tests/traits/FILES
@@ -0,0 +1 @@
+traits_test.cpp
diff --git a/vespalib/src/tests/traits/traits_test.cpp b/vespalib/src/tests/traits/traits_test.cpp
new file mode 100644
index 00000000000..82824d8c2ee
--- /dev/null
+++ b/vespalib/src/tests/traits/traits_test.cpp
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/traits.h>
+#include <vespa/vespalib/util/arrayqueue.hpp>
+
+using namespace vespalib;
+
+struct Simple {
+ int value;
+ int moved;
+ explicit Simple(int v) : value(v), moved(0) {}
+ Simple(const Simple &rhs) : value(rhs.value), moved(rhs.moved) {}
+ Simple(Simple &&rhs) : value(rhs.value), moved(rhs.moved + 1) {}
+};
+typedef std::unique_ptr<Simple> Hard;
+
+struct Base {
+ virtual void foo() = 0;
+ virtual ~Base() {}
+};
+struct Child1 : Base {
+ void foo() override {}
+};
+struct Child2 : Base {
+ void foo() override {}
+};
+
+VESPA_CAN_SKIP_DESTRUCTION(Child2);
+
+TEST("require that is_copyable works") {
+ EXPECT_EQUAL(is_copyable<Simple>::value, true);
+ EXPECT_EQUAL(is_copyable<Hard>::value, false);
+ EXPECT_EQUAL(is_copyable<ArrayQueue<Simple> >::value, true);
+ EXPECT_EQUAL(is_copyable<ArrayQueue<Hard> >::value, false);
+ EXPECT_EQUAL(is_copyable<std::unique_ptr<Hard> >::value, false);
+}
+
+TEST("require that can_skip_destruction works") {
+ EXPECT_EQUAL(can_skip_destruction<Simple>::value, true);
+ EXPECT_EQUAL(can_skip_destruction<Hard>::value, false);
+ EXPECT_EQUAL(can_skip_destruction<Child1>::value, false);
+ EXPECT_EQUAL(can_skip_destruction<Child2>::value, true);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/true/.gitignore b/vespalib/src/tests/true/.gitignore
new file mode 100644
index 00000000000..c3f942b8118
--- /dev/null
+++ b/vespalib/src/tests/true/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+true_test
+vespalib_true_test_app
diff --git a/vespalib/src/tests/true/CMakeLists.txt b/vespalib/src/tests/true/CMakeLists.txt
new file mode 100644
index 00000000000..7042424c1c0
--- /dev/null
+++ b/vespalib/src/tests/true/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_true_test_app
+ SOURCES
+ true.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_true_test_app COMMAND vespalib_true_test_app)
diff --git a/vespalib/src/tests/true/DESC b/vespalib/src/tests/true/DESC
new file mode 100644
index 00000000000..646e1020a6c
--- /dev/null
+++ b/vespalib/src/tests/true/DESC
@@ -0,0 +1 @@
+Test that always passes. May also be used as template for new tests.
diff --git a/vespalib/src/tests/true/FILES b/vespalib/src/tests/true/FILES
new file mode 100644
index 00000000000..7d324c5824d
--- /dev/null
+++ b/vespalib/src/tests/true/FILES
@@ -0,0 +1 @@
+true.cpp
diff --git a/vespalib/src/tests/true/true.cpp b/vespalib/src/tests/true/true.cpp
new file mode 100644
index 00000000000..d052f3ca4e4
--- /dev/null
+++ b/vespalib/src/tests/true/true.cpp
@@ -0,0 +1,15 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("true_test");
+#include <vespa/vespalib/testkit/testapp.h>
+
+TEST_SETUP(Test)
+
+int
+Test::Main()
+{
+ TEST_INIT("true_test");
+ EXPECT_TRUE(true);
+ TEST_DONE();
+}
diff --git a/vespalib/src/tests/tutorial/.gitignore b/vespalib/src/tests/tutorial/.gitignore
new file mode 100644
index 00000000000..f3407703d3e
--- /dev/null
+++ b/vespalib/src/tests/tutorial/.gitignore
@@ -0,0 +1,5 @@
+/make_tutorial
+/xml_escape
+/tutorial_out.html
+vespalib_make_tutorial_app
+vespalib_xml_escape_app
diff --git a/vespalib/src/tests/tutorial/CMakeLists.txt b/vespalib/src/tests/tutorial/CMakeLists.txt
new file mode 100644
index 00000000000..d99ad20ff92
--- /dev/null
+++ b/vespalib/src/tests/tutorial/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_make_tutorial_app
+ SOURCES
+ make_tutorial.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_make_tutorial_app COMMAND vespalib_make_tutorial_app)
+vespa_add_executable(vespalib_xml_escape_app
+ SOURCES
+ xml_escape.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/tutorial/checks/.gitignore b/vespalib/src/tests/tutorial/checks/.gitignore
new file mode 100644
index 00000000000..bd3d3565773
--- /dev/null
+++ b/vespalib/src/tests/tutorial/checks/.gitignore
@@ -0,0 +1,2 @@
+vespalib_checks_test_app
+Testing
diff --git a/vespalib/src/tests/tutorial/checks/CMakeLists.txt b/vespalib/src/tests/tutorial/checks/CMakeLists.txt
new file mode 100644
index 00000000000..b934e1d6dd6
--- /dev/null
+++ b/vespalib/src/tests/tutorial/checks/CMakeLists.txt
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_checks_test_app
+ SOURCES
+ checks_test.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/tutorial/checks/checks_test.cpp b/vespalib/src/tests/tutorial/checks/checks_test.cpp
new file mode 100644
index 00000000000..a2ef309c277
--- /dev/null
+++ b/vespalib/src/tests/tutorial/checks/checks_test.cpp
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <stdexcept>
+
+void willThrow() {
+ throw std::runtime_error("This failed");
+}
+
+TEST("require that checks work") {
+ EXPECT_TRUE(true);
+ EXPECT_FALSE(false);
+ EXPECT_EQUAL(3, 3);
+ EXPECT_NOT_EQUAL(3, 4);
+ EXPECT_APPROX(3.0, 3.1, 0.2);
+ EXPECT_NOT_APPROX(3.0, 3.5, 0.2);
+ EXPECT_LESS(3, 4);
+ EXPECT_LESS_EQUAL(3, 3);
+ EXPECT_GREATER(4, 3);
+ EXPECT_GREATER_EQUAL(4, 4);
+ EXPECT_EXCEPTION(willThrow(), std::runtime_error, "fail");
+}
+
+TEST("this test will fail") {
+ EXPECT_EQUAL(3, 4);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tutorial/fixtures/.gitignore b/vespalib/src/tests/tutorial/fixtures/.gitignore
new file mode 100644
index 00000000000..049a39ac736
--- /dev/null
+++ b/vespalib/src/tests/tutorial/fixtures/.gitignore
@@ -0,0 +1,2 @@
+vespalib_fixtures_test_app
+Testing
diff --git a/vespalib/src/tests/tutorial/fixtures/CMakeLists.txt b/vespalib/src/tests/tutorial/fixtures/CMakeLists.txt
new file mode 100644
index 00000000000..7e67f34d472
--- /dev/null
+++ b/vespalib/src/tests/tutorial/fixtures/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_fixtures_test_app
+ SOURCES
+ fixtures_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_fixtures_test_app COMMAND vespalib_fixtures_test_app)
diff --git a/vespalib/src/tests/tutorial/fixtures/fixtures_test.cpp b/vespalib/src/tests/tutorial/fixtures/fixtures_test.cpp
new file mode 100644
index 00000000000..54b88b8ef67
--- /dev/null
+++ b/vespalib/src/tests/tutorial/fixtures/fixtures_test.cpp
@@ -0,0 +1,20 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+struct Fixture {
+ int value;
+ Fixture() : value(5) {}
+};
+
+TEST_F("basic fixture", Fixture) {
+ EXPECT_EQUAL(5, f1.value);
+}
+
+TEST_FFF("fancy fixtures", size_t(10), int(5), std::vector<int>(f1, f2)) {
+ EXPECT_EQUAL(10u, f1);
+ EXPECT_EQUAL(5, f2);
+ ASSERT_EQUAL(10u, f3.size());
+ EXPECT_EQUAL(5, f3[7]);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tutorial/make_example.sh b/vespalib/src/tests/tutorial/make_example.sh
new file mode 100755
index 00000000000..9b015c93e2b
--- /dev/null
+++ b/vespalib/src/tests/tutorial/make_example.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+dirname=`dirname $1`
+filename=`basename $1`
+unset MAKELEVEL
+unset MAKEFLAGS
+unset VALGRIND
+unset TEST_SUBSET
+
+echo "<div class=\"example\" id=\"$dirname\">"
+echo "<h2>$filename</h2>"
+echo "<pre class=\"prettyprint linenums\">"
+(cd $dirname && cat $filename) | ./vespalib_xml_escape_app
+echo "</pre>"
+echo "<pre class=\"output\">"
+(cd $dirname && make all > /dev/null 2>&1)
+(cd $dirname && make test 2>&1) | ./vespalib_xml_escape_app
+echo "</pre>"
+echo "</div>"
diff --git a/vespalib/src/tests/tutorial/make_source.sh b/vespalib/src/tests/tutorial/make_source.sh
new file mode 100755
index 00000000000..e56b3b6e54d
--- /dev/null
+++ b/vespalib/src/tests/tutorial/make_source.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+filename=$1
+echo "<h2>$filename</h2>"
+echo "<pre class=\"prettyprint linenums\">"
+(cat $filename | ./xml_escape)
+echo "</pre>"
diff --git a/vespalib/src/tests/tutorial/make_tutorial.cpp b/vespalib/src/tests/tutorial/make_tutorial.cpp
new file mode 100644
index 00000000000..3f83caef67c
--- /dev/null
+++ b/vespalib/src/tests/tutorial/make_tutorial.cpp
@@ -0,0 +1,81 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/util/slaveproc.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+using namespace vespalib;
+
+std::string readFile(const std::string &filename) {
+ TEST_STATE(filename.c_str());
+ std::string ret;
+ struct stat info;
+ int fd = open(filename.c_str(), O_RDONLY);
+ ASSERT_TRUE(fd >= 0 && fstat(fd, &info) == 0);
+ char *data = (char*)(mmap(0, info.st_size, PROT_READ, MAP_SHARED, fd, 0));
+ ASSERT_NOT_EQUAL(data, MAP_FAILED);
+ ret = std::string(data, info.st_size);
+ munmap(data, info.st_size);
+ close(fd);
+ return ret;
+}
+
+std::string runCommand(const std::string &cmd) {
+ std::string out;
+ ASSERT_TRUE(SlaveProc::run(cmd.c_str(), out));
+ return out;
+}
+
+void insertExample(const std::string &name) {
+ std::string str = runCommand(make_string("./make_example.sh %s",
+ name.c_str()));
+ fprintf(stdout, "%s", str.c_str());
+}
+
+void insertSource(const std::string &name) {
+ std::string str = runCommand(make_string("./make_source.sh %s",
+ name.c_str()));
+ fprintf(stdout, "%s", str.c_str());
+}
+
+void insertFile(const std::string &name) {
+ std::string str = readFile(name);
+ fprintf(stdout, "%s", str.c_str());
+}
+
+TEST_MAIN_WITH_PROCESS_PROXY() {
+ std::string pre("[insert:");
+ std::string example("example:");
+ std::string source("source:");
+ std::string file("file:");
+ std::string post("]\n");
+
+ size_t pos = 0;
+ size_t end = 0;
+ size_t cursor = 0;
+ std::string input = readFile("tutorial_source.html");
+ while ((pos = input.find(pre, cursor)) < input.size() &&
+ (end = input.find(post, pos)) < input.size())
+ {
+ fprintf(stdout, "%.*s", (int)(pos - cursor), (input.data() + cursor));
+ pos += pre.size();
+ if (input.find(example, pos) == pos) {
+ pos += example.size();
+ insertExample(std::string((input.data() + pos), (end - pos)));
+ } else if (input.find(source, pos) == pos) {
+ pos += source.size();
+ insertSource(std::string((input.data() + pos), (end - pos)));
+ } else if (input.find(file, pos) == pos) {
+ pos += file.size();
+ insertFile(std::string((input.data() + pos), (end - pos)));
+ } else {
+ std::string str((input.data() + pos), (end - pos));
+ TEST_FATAL(make_string("invalid directive >%s<", str.c_str()).c_str());
+ }
+ cursor = end + post.size();
+ }
+ fprintf(stdout, "%.*s", (int)(input.size() - cursor), (input.data() + cursor));
+}
diff --git a/vespalib/src/tests/tutorial/minimal/.gitignore b/vespalib/src/tests/tutorial/minimal/.gitignore
new file mode 100644
index 00000000000..bb09f68684f
--- /dev/null
+++ b/vespalib/src/tests/tutorial/minimal/.gitignore
@@ -0,0 +1,2 @@
+vespalib_minimal_test_app
+Testing
diff --git a/vespalib/src/tests/tutorial/minimal/CMakeLists.txt b/vespalib/src/tests/tutorial/minimal/CMakeLists.txt
new file mode 100644
index 00000000000..206684d4d55
--- /dev/null
+++ b/vespalib/src/tests/tutorial/minimal/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_minimal_test_app
+ SOURCES
+ minimal_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_minimal_test_app COMMAND vespalib_minimal_test_app)
diff --git a/vespalib/src/tests/tutorial/minimal/minimal_test.cpp b/vespalib/src/tests/tutorial/minimal/minimal_test.cpp
new file mode 100644
index 00000000000..87d89917499
--- /dev/null
+++ b/vespalib/src/tests/tutorial/minimal/minimal_test.cpp
@@ -0,0 +1,4 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+TEST_MAIN() {}
diff --git a/vespalib/src/tests/tutorial/simple/.gitignore b/vespalib/src/tests/tutorial/simple/.gitignore
new file mode 100644
index 00000000000..42594074945
--- /dev/null
+++ b/vespalib/src/tests/tutorial/simple/.gitignore
@@ -0,0 +1,2 @@
+vespalib_simple_test_app
+Testing
diff --git a/vespalib/src/tests/tutorial/simple/CMakeLists.txt b/vespalib/src/tests/tutorial/simple/CMakeLists.txt
new file mode 100644
index 00000000000..b23470f4758
--- /dev/null
+++ b/vespalib/src/tests/tutorial/simple/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_simple_test_app
+ SOURCES
+ simple_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_simple_test_app COMMAND vespalib_simple_test_app)
diff --git a/vespalib/src/tests/tutorial/simple/simple_test.cpp b/vespalib/src/tests/tutorial/simple/simple_test.cpp
new file mode 100644
index 00000000000..9746076689b
--- /dev/null
+++ b/vespalib/src/tests/tutorial/simple/simple_test.cpp
@@ -0,0 +1,12 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+TEST("require something") {
+ EXPECT_TRUE(true);
+}
+
+TEST("require something else") {
+ EXPECT_TRUE(true);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tutorial/style.inc b/vespalib/src/tests/tutorial/style.inc
new file mode 100644
index 00000000000..b66c31ec7a2
--- /dev/null
+++ b/vespalib/src/tests/tutorial/style.inc
@@ -0,0 +1,51 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+ <style type="text/css">
+
+ body {
+ margin: 3em;
+ }
+
+ body, p, div, div, span, dl, li, pre {
+ font-size: 16px;
+ line-height: 22px;
+ }
+
+ header h1 {
+ font-size: 54px;
+ line-height: 1;
+ }
+
+ section {
+ padding-top: 60px;
+ }
+
+ ol.linenums {
+ padding-left: 20px;
+ }
+
+ pre, pre * {
+ font-size: 14px !important;
+ }
+
+ li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9
+ {
+ color: #bbb;
+ list-style-type: decimal;
+ }
+
+ h2 {
+ padding-top: 20px;
+ padding-bottom: 10px;
+ }
+
+ pre.output {
+ border: 1px solid #888;
+ }
+
+ code {
+ color: #444;
+ border: 0;
+ background-color: transparent;
+ }
+
+ </style>
diff --git a/vespalib/src/tests/tutorial/threads/.gitignore b/vespalib/src/tests/tutorial/threads/.gitignore
new file mode 100644
index 00000000000..a90822b0e7c
--- /dev/null
+++ b/vespalib/src/tests/tutorial/threads/.gitignore
@@ -0,0 +1,2 @@
+vespalib_threads_test_app
+Testing
diff --git a/vespalib/src/tests/tutorial/threads/CMakeLists.txt b/vespalib/src/tests/tutorial/threads/CMakeLists.txt
new file mode 100644
index 00000000000..88898df697c
--- /dev/null
+++ b/vespalib/src/tests/tutorial/threads/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_threads_test_app
+ SOURCES
+ threads_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_threads_test_app COMMAND vespalib_threads_test_app)
diff --git a/vespalib/src/tests/tutorial/threads/threads_test.cpp b/vespalib/src/tests/tutorial/threads/threads_test.cpp
new file mode 100644
index 00000000000..f625693c121
--- /dev/null
+++ b/vespalib/src/tests/tutorial/threads/threads_test.cpp
@@ -0,0 +1,17 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+TEST_MT_F("multiple threads", 2, std::vector<size_t>(num_threads)) {
+ ASSERT_EQUAL(num_threads, f1.size());
+ f1[thread_id] = thread_id;
+ TEST_BARRIER();
+ if (thread_id == 0) {
+ TEST_TRACE();
+ EXPECT_EQUAL(1u, f1[1]);
+ } else {
+ TEST_TRACE();
+ EXPECT_EQUAL(0u, f1[0]);
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/tutorial/tutorial.html b/vespalib/src/tests/tutorial/tutorial.html
new file mode 100644
index 00000000000..744dd9541e2
--- /dev/null
+++ b/vespalib/src/tests/tutorial/tutorial.html
@@ -0,0 +1,628 @@
+<!DOCTYPE html>
+<!-- Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -->
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <title>Vespa Test Framework Tutorial</title>
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+ <style type="text/css">
+
+ body {
+ margin: 3em;
+ }
+
+ body, p, div, div, span, dl, li, pre {
+ font-size: 16px;
+ line-height: 22px;
+ }
+
+ header h1 {
+ font-size: 54px;
+ line-height: 1;
+ }
+
+ section {
+ padding-top: 60px;
+ }
+
+ ol.linenums {
+ padding-left: 20px;
+ }
+
+ pre, pre * {
+ font-size: 14px !important;
+ }
+
+ li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9
+ {
+ color: #bbb;
+ list-style-type: decimal;
+ }
+
+ h2 {
+ padding-top: 20px;
+ padding-bottom: 10px;
+ }
+
+ pre.output {
+ border: 1px solid #888;
+ }
+
+ code {
+ color: #444;
+ border: 0;
+ background-color: transparent;
+ }
+
+ </style>
+</head>
+<body>
+
+<header>
+<h1>Vespa Test Framework Tutorial</h1>
+</header>
+
+<section>
+<div class="page-header">
+<h1>Introduction</h1>
+</div>
+
+<p>
+The Vespa test framework helps you write small applications to test
+C++ code. All interaction with the test framework is done with the use
+of macros.
+</p>
+
+<p>
+The minimal test application looks like this:
+</p>
+
+<div class="example" id="minimal">
+<h2>minimal_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+
+TEST_MAIN() {}
+</pre>
+<pre class="output">
+minimal_test.cpp: info: running test suite 'minimal_test.cpp'
+minimal_test.cpp: info: summary --- 0 check(s) passed --- 0 check(s) failed
+minimal_test.cpp: info: CONCLUSION: PASS
+</pre>
+</div>
+
+<p>
+The runnable application itself is called a <strong>test
+suite</strong> and inherits its name from the cpp file containing the
+TEST_MAIN macro. Each individual verification of some value is called
+a <strong>check</strong>. Checks can be put anywhere, but it is highly
+recommended that you put them inside <strong>tests</strong>. Tests are
+created by a family of macros. Another macro (TEST_RUN_ALL) is used to
+execute them.
+</p>
+
+<p>
+Example with two tests, each containing a single check:
+</p>
+
+<div class="example" id="simple">
+<h2>simple_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+
+TEST(&quot;require something&quot;) {
+ EXPECT_TRUE(true);
+}
+
+TEST(&quot;require something else&quot;) {
+ EXPECT_TRUE(true);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
+</pre>
+<pre class="output">
+simple_test.cpp: info: running test suite 'simple_test.cpp'
+simple_test.cpp: info: status_for_test 'require something': PASS
+simple_test.cpp: info: status_for_test 'require something else': PASS
+simple_test.cpp: info: test summary --- 2 test(s) passed --- 0 test(s) failed
+simple_test.cpp: info: imported 2 passed check(s) from 1 thread(s)
+simple_test.cpp: info: summary --- 2 check(s) passed --- 0 check(s) failed
+simple_test.cpp: info: CONCLUSION: PASS
+</pre>
+</div>
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Checks</h1>
+</div>
+
+<p>
+All checks are available in two variants. Those with the
+<strong>EXPECT_</strong> prefix allow execution to continue even if a
+check fails. Those with the <strong>ASSERT_</strong> prefix will
+terminate execution of the current test if it fails.
+</p>
+
+<div class="example" id="checks">
+<h2>checks_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+#include &lt;stdexcept&gt;
+
+void willThrow() {
+ throw std::runtime_error(&quot;This failed&quot;);
+}
+
+TEST(&quot;require that checks work&quot;) {
+ EXPECT_TRUE(true);
+ EXPECT_FALSE(false);
+ EXPECT_EQUAL(3, 3);
+ EXPECT_NOT_EQUAL(3, 4);
+ EXPECT_APPROX(3.0, 3.1, 0.2);
+ EXPECT_NOT_APPROX(3.0, 3.5, 0.2);
+ EXPECT_LESS(3, 4);
+ EXPECT_LESS_EQUAL(3, 3);
+ EXPECT_GREATER(4, 3);
+ EXPECT_GREATER_EQUAL(4, 4);
+ EXPECT_EXCEPTION(willThrow(), std::runtime_error, &quot;fail&quot;);
+}
+
+TEST(&quot;this test will fail&quot;) {
+ EXPECT_EQUAL(3, 4);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
+</pre>
+<pre class="output">
+checks_test.cpp: info: running test suite 'checks_test.cpp'
+checks_test.cpp: info: status_for_test 'require that checks work': PASS
+checks_test.cpp: ERROR: check failure #1: '3 == 4' in thread '0(1)' (checks_test.cpp:24)
+ STATE[0]: 'this test will fail' (checks_test.cpp:23)
+lhs: 3
+rhs: 4
+checks_test.cpp: ERROR: status_for_test 'this test will fail': FAIL
+checks_test.cpp: info: test summary --- 1 test(s) passed --- 1 test(s) failed
+checks_test.cpp: info: imported 11 passed check(s) from 1 thread(s)
+checks_test.cpp: info: summary --- 11 check(s) passed --- 1 check(s) failed
+checks_test.cpp: info: CONCLUSION: FAIL
+make: *** [test] Error 1
+</pre>
+</div>
+
+<p>
+Checks involving comparison of values typically use == and &lt;
+operators to compare values. Also; in order to be part of a comparison
+check, the value must support the &lt;&lt; operator to print the value
+to a string stream in case the check fails.
+</p>
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Test Fixtures</h1>
+</div>
+<p>
+Sometimes multiple tests wish to use the same predefined state as a
+starting point. This state is called a test fixture. Test fixtures are
+untangled from the actual tests and construction/destruction is used
+to handle their lifetime. When thinking of what can be used as a
+fixture, think of what can be put after <strong>new</strong> to create
+an object.
+</p>
+
+<ul>
+<li>A single test can have multiple test fixtures.</li>
+<li>The number of <strong>F</strong>s in the test macro denotes the number of fixtures.</li>
+<li>Inside the test, fixtures are available as <strong>f1</strong>, <strong>f2</strong> and so forth.</li>
+<li>Test fixtures can be parameterized with constructor parameters.</li>
+<li>Checks can be performed inside test fixture constructors.</li>
+<li>A test fixture constructor can take other test fixtures as input.</li>
+</ul>
+
+<div class="example" id="fixtures">
+<h2>fixtures_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+
+struct Fixture {
+ int value;
+ Fixture() : value(5) {}
+};
+
+TEST_F(&quot;basic fixture&quot;, Fixture) {
+ EXPECT_EQUAL(5, f1.value);
+}
+
+TEST_FFF(&quot;fancy fixtures&quot;, size_t(10), int(5), std::vector&lt;int&gt;(f1, f2)) {
+ EXPECT_EQUAL(10u, f1);
+ EXPECT_EQUAL(5, f2);
+ ASSERT_EQUAL(10u, f3.size());
+ EXPECT_EQUAL(5, f3[7]);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
+</pre>
+<pre class="output">
+fixtures_test.cpp: info: running test suite 'fixtures_test.cpp'
+fixtures_test.cpp: info: status_for_test 'basic fixture': PASS
+fixtures_test.cpp: info: status_for_test 'fancy fixtures': PASS
+fixtures_test.cpp: info: test summary --- 2 test(s) passed --- 0 test(s) failed
+fixtures_test.cpp: info: imported 5 passed check(s) from 1 thread(s)
+fixtures_test.cpp: info: summary --- 5 check(s) passed --- 0 check(s) failed
+fixtures_test.cpp: info: CONCLUSION: PASS
+</pre>
+</div>
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Multi-Threaded Tests</h1>
+</div>
+<p>
+One of the most novel features of the test framework is the ability to
+write multi-threaded tests. Multi-threaded tests are created by using
+test macros containing <strong>_MT</strong> and supplying a thread
+count. All threads will execute the block of code encapsulated by the
+test. The test fixtures are shared among all threads. In addition,
+each thread has a variable named <strong>num_threads</strong>
+containing the total number of threads running the test and a variable
+named <strong>thread_id</strong> identifying the thread.
+</p>
+
+<p>
+The <strong>TEST_BARRIER()</strong> macro can be used inside the test
+to synchronize the threads. The macro will block execution of each
+thread invoking it until all threads have invoked it.
+</p>
+
+<div class="example" id="threads">
+<h2>threads_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+
+TEST_MT_F(&quot;multiple threads&quot;, 2, std::vector&lt;size_t&gt;(num_threads)) {
+ ASSERT_EQUAL(num_threads, f1.size());
+ f1[thread_id] = thread_id;
+ TEST_BARRIER();
+ if (thread_id == 0) {
+ TEST_TRACE();
+ EXPECT_EQUAL(1u, f1[1]);
+ } else {
+ TEST_TRACE();
+ EXPECT_EQUAL(0u, f1[0]);
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
+</pre>
+<pre class="output">
+threads_test.cpp: info: running test suite 'threads_test.cpp'
+threads_test.cpp: info: trace: thread '0(2)' (threads_test.cpp:9)
+threads_test.cpp: info: trace: thread '1(2)' (threads_test.cpp:12)
+threads_test.cpp: info: status_for_test 'multiple threads': PASS
+threads_test.cpp: info: test summary --- 1 test(s) passed --- 0 test(s) failed
+threads_test.cpp: info: imported 4 passed check(s) from 2 thread(s)
+threads_test.cpp: info: summary --- 4 check(s) passed --- 0 check(s) failed
+threads_test.cpp: info: CONCLUSION: PASS
+</pre>
+</div>
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Real World Examples</h1>
+</div>
+<div class="example" id="../box">
+<h2>box_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+#include &lt;vespa/vespalib/util/box.h&gt;
+
+using namespace vespalib;
+
+void checkValues(const std::vector&lt;int&gt; &amp;values, size_t n) {
+ ASSERT_EQUAL(n, values.size());
+ for (size_t i = 0; i &lt; n; ++i) {
+ EXPECT_EQUAL(int(10 + (10 * i)), values[i]);
+ }
+}
+
+TEST(&quot;require that boxes can be created and converted to vector&quot;) {
+ Box&lt;int&gt; box;
+ box.add(10).add(20).add(30);
+ checkValues(box, 3);
+}
+
+TEST(&quot;require that boxes can be created in place&quot;) {
+ checkValues(Box&lt;int&gt;().add(10).add(20).add(30), 3);
+}
+
+TEST(&quot;require that make_box works&quot;) {
+ checkValues(make_box(10), 1);
+ checkValues(make_box(10, 20), 2);
+ checkValues(make_box(10, 20, 30), 3);
+ checkValues(make_box(10, 20, 30, 40), 4);
+ checkValues(make_box(10, 20, 30, 40, 50), 5);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
+</pre>
+<pre class="output">
+box_test.cpp: info: running test suite 'box_test.cpp'
+box_test.cpp: info: status_for_test 'require that boxes can be created and converted to vector': PASS
+box_test.cpp: info: status_for_test 'require that boxes can be created in place': PASS
+box_test.cpp: info: status_for_test 'require that make_box works': PASS
+box_test.cpp: info: test summary --- 3 test(s) passed --- 0 test(s) failed
+box_test.cpp: info: imported 28 passed check(s) from 1 thread(s)
+box_test.cpp: info: summary --- 28 check(s) passed --- 0 check(s) failed
+box_test.cpp: info: CONCLUSION: PASS
+</pre>
+</div>
+<div class="example" id="../barrier">
+<h2>barrier_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+#include &lt;vespa/vespalib/util/barrier.h&gt;
+
+using namespace vespalib;
+
+struct Fixture {
+ Barrier barrier;
+ CountDownLatch latch;
+ Fixture(size_t n) : barrier(n), latch(n) {}
+};
+
+TEST_MT_F(&quot;require that barriers are satisfied by the appropriate number of threads&quot;, 3, Fixture(num_threads)) {
+ if (thread_id == 0) {
+ f1.latch.countDown();
+ EXPECT_FALSE(f.latch.await(250));
+ EXPECT_TRUE(f.barrier.await());
+ EXPECT_TRUE(f.latch.await(25000));
+ } else {
+ EXPECT_TRUE(f1.barrier.await());
+ f1.latch.countDown();
+ }
+}
+
+TEST_MT_F(&quot;require that barriers can be used multiple times&quot;, 3, Fixture(num_threads)) {
+ EXPECT_TRUE(f1.barrier.await());
+ EXPECT_TRUE(f1.barrier.await());
+ if (thread_id == 0) {
+ f1.latch.countDown();
+ EXPECT_FALSE(f.latch.await(250));
+ EXPECT_TRUE(f.barrier.await());
+ EXPECT_TRUE(f.latch.await(25000));
+ } else {
+ EXPECT_TRUE(f1.barrier.await());
+ f1.latch.countDown();
+ }
+}
+
+TEST_MT_F(&quot;require that barriers can be broken&quot;, 3, Fixture(num_threads)) {
+ EXPECT_TRUE(f1.barrier.await());
+ if (thread_id == 0) {
+ f1.latch.countDown();
+ EXPECT_FALSE(f.latch.await(250));
+ f1.barrier.destroy();
+ EXPECT_TRUE(f.latch.await(25000));
+ } else {
+ EXPECT_FALSE(f1.barrier.await());
+ f1.latch.countDown();
+ }
+ EXPECT_FALSE(f1.barrier.await());
+}
+
+TEST_MT_F(&quot;require that barriers cannot be retroactively broken&quot;, 100, Barrier(num_threads)) {
+ EXPECT_TRUE(f1.await());
+ f1.destroy();
+ EXPECT_FALSE(f1.await());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
+</pre>
+<pre class="output">
+barrier_test.cpp: info: running test suite 'barrier_test.cpp'
+barrier_test.cpp: info: status_for_test 'require that barriers are satisfied by the appropriate number of threads': PASS
+barrier_test.cpp: info: status_for_test 'require that barriers can be used multiple times': PASS
+barrier_test.cpp: info: status_for_test 'require that barriers can be broken': PASS
+barrier_test.cpp: info: status_for_test 'require that barriers cannot be retroactively broken': PASS
+barrier_test.cpp: info: test summary --- 4 test(s) passed --- 0 test(s) failed
+barrier_test.cpp: info: imported 226 passed check(s) from 100 thread(s)
+barrier_test.cpp: info: summary --- 226 check(s) passed --- 0 check(s) failed
+barrier_test.cpp: info: CONCLUSION: PASS
+</pre>
+</div>
+<div class="example" id="../dual_merge_director">
+<h2>dual_merge_director_test.cpp</h2>
+<pre class="prettyprint linenums">
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include &lt;vespa/vespalib/testkit/test_kit.h&gt;
+#include &lt;vespa/vespalib/util/dual_merge_director.h&gt;
+
+using namespace vespalib;
+
+struct MySource : public DualMergeDirector::Source {
+
+ bool typeA;
+ std::string data;
+ std::string diff;
+
+ MySource(bool a, size_t num_sources, size_t source_id)
+ : typeA(a),
+ data(num_sources, '0'),
+ diff(num_sources, '5')
+ {
+ if (source_id &lt; num_sources) {
+ data[source_id] = '1';
+ diff[source_id] = '6';
+ }
+ }
+ virtual void merge(Source &amp;mt) {
+ MySource &amp;rhs = static_cast&lt;MySource&amp;&gt;(mt);
+ ASSERT_EQUAL(typeA, rhs.typeA);
+ ASSERT_EQUAL(data.size(), rhs.data.size());
+ for (size_t i = 0; i &lt; data.size(); ++i) {
+ int d = (rhs.data[i] - '0');
+ data[i] += d;
+ diff[i] += d;
+ rhs.diff[i] -= d;
+ }
+ }
+ void verifyFinal() const {
+ EXPECT_EQUAL(std::string(data.size(), '1'), data);
+ EXPECT_EQUAL(std::string(diff.size(), '6'), diff);
+ }
+ void verifyIntermediate() const {
+ EXPECT_EQUAL(std::string(diff.size(), '5'), diff);
+ }
+};
+
+TEST_MT_F(&quot;require that merging works&quot;, 64, std::unique_ptr&lt;DualMergeDirector&gt;()) {
+ for (size_t use_threads = 1; use_threads &lt;= num_threads; ++use_threads) {
+ MySource sourceA(true, use_threads, thread_id);
+ MySource sourceB(false, use_threads, thread_id);
+ if (thread_id == 0) {
+ f1.reset(new DualMergeDirector(use_threads));
+ }
+ TEST_BARRIER();
+ if (thread_id &lt; use_threads) {
+ f1-&gt;dualMerge(thread_id, sourceA, sourceB);
+ }
+ TEST_BARRIER();
+ if (thread_id == 0) {
+ sourceA.verifyFinal();
+ sourceB.verifyFinal();
+ } else if (thread_id &lt; use_threads) {
+ sourceA.verifyIntermediate();
+ sourceB.verifyIntermediate();
+ }
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
+</pre>
+<pre class="output">
+dual_merge_director_test.cpp: info: running test suite 'dual_merge_director_test.cpp'
+dual_merge_director_test.cpp: info: status_for_test 'require that merging works': PASS
+dual_merge_director_test.cpp: info: test summary --- 1 test(s) passed --- 0 test(s) failed
+dual_merge_director_test.cpp: info: imported 12352 passed check(s) from 64 thread(s)
+dual_merge_director_test.cpp: info: summary --- 12352 check(s) passed --- 0 check(s) failed
+dual_merge_director_test.cpp: info: CONCLUSION: PASS
+</pre>
+</div>
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Macro Summary</h1>
+</div>
+
+<h2>Overall Execution Macros</h2>
+<ul>
+<li><code>TEST_MAIN()</code></li>
+<li><code>TEST_RUN_ALL()</code></li>
+</ul>
+
+<h2>Test Creation Macros</h2>
+<ul>
+<li><code>TEST(name)</code></li>
+<li><code>TEST_F(name, fixture)</code></li>
+<li><code>TEST_FF(name, fixture1, fixture2)</code></li>
+<li><code>TEST_FFF(name, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<ul>
+<li><code>TEST_MT(name, threads)</code></li>
+<li><code>TEST_MT_F(name, threads, fixture)</code></li>
+<li><code>TEST_MT_FF(name, threads, fixture1, fixture2)</code></li>
+<li><code>TEST_MT_FFF(name, threads, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<ul>
+<li><code>IGNORE_TEST(name)</code></li>
+<li><code>IGNORE_TEST_F(name, fixture)</code></li>
+<li><code>IGNORE_TEST_FF(name, fixture1, fixture2)</code></li>
+<li><code>IGNORE_TEST_FFF(name, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<ul>
+<li><code>IGNORE_TEST_MT(name, threads)</code></li>
+<li><code>IGNORE_TEST_MT_F(name, threads, fixture)</code></li>
+<li><code>IGNORE_TEST_MT_FF(name, threads, fixture1, fixture2)</code></li>
+<li><code>IGNORE_TEST_MT_FFF(name, threads, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<h2>Check Macros</h2>
+<ul>
+<li><code>ASSERT_TRUE(rc)</code></li>
+<li><code>ASSERT_FALSE(rc)</code></li>
+<li><code>ASSERT_EQUAL(a, b)</code></li>
+<li><code>ASSERT_NOT_EQUAL(a, b)</code></li>
+<li><code>ASSERT_APPROX(a, b, eps)</code></li>
+<li><code>ASSERT_NOT_APPROX(a, b, eps)</code></li>
+<li><code>ASSERT_LESS(a, b)</code></li>
+<li><code>ASSERT_LESS_EQUAL(a, b)</code></li>
+<li><code>ASSERT_GREATER(a, b)</code></li>
+<li><code>ASSERT_GREATER_EQUAL(a, b)</code></li>
+<li><code>ASSERT_EXCEPTION(statement, exception_type, msg_substr)</code></li>
+<li><code>TEST_FATAL(msg)</code></li>
+</ul>
+
+<ul>
+<li><code>EXPECT_TRUE(rc)</code></li>
+<li><code>EXPECT_FALSE(rc)</code></li>
+<li><code>EXPECT_EQUAL(a, b)</code></li>
+<li><code>EXPECT_NOT_EQUAL(a, b)</code></li>
+<li><code>EXPECT_APPROX(a, b, eps)</code></li>
+<li><code>EXPECT_NOT_APPROX(a, b, eps)</code></li>
+<li><code>EXPECT_LESS(a, b)</code></li>
+<li><code>EXPECT_LESS_EQUAL(a, b)</code></li>
+<li><code>EXPECT_GREATER(a, b)</code></li>
+<li><code>EXPECT_GREATER_EQUAL(a, b)</code></li>
+<li><code>EXPECT_EXCEPTION(statement, exception_type, msg_substr)</code></li>
+<li><code>TEST_ERROR(msg)</code></li>
+</ul>
+
+<h2>Thread Macros</h2>
+<ul>
+<li><code>TEST_BARRIER()</code></li>
+</ul>
+
+<h2>State Tracking Macros</h2>
+<ul>
+<li><code>TEST_DO(doit)</code></li>
+<li><code>TEST_STATE(msg)</code></li>
+</ul>
+
+<h2>Macros of Limited Use</h2>
+<ul>
+<li><code>TEST_TRACE()</code></li>
+<li><code>TEST_FLUSH()</code></li>
+<li><code>TEST_THREAD(name)</code></li>
+<li><code>TEST_DEBUG(lhsFile, rhsFile)</code></li>
+<li><code>TEST_MAIN_WITH_PROCESS_PROXY()</code></li>
+</ul>
+</section>
+
+<script type="text/javascript">
+$(function(){
+ window.prettyPrint && prettyPrint();
+});
+
+</script>
+
+</body>
+</html>
diff --git a/vespalib/src/tests/tutorial/tutorial_source.html b/vespalib/src/tests/tutorial/tutorial_source.html
new file mode 100644
index 00000000000..baa000e8cd3
--- /dev/null
+++ b/vespalib/src/tests/tutorial/tutorial_source.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html>
+<!-- Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -->
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <title>Vespa Test Framework Tutorial</title>
+[insert:file:style.inc]
+</head>
+<body>
+
+<header>
+<h1>Vespa Test Framework Tutorial</h1>
+</header>
+
+<section>
+<div class="page-header">
+<h1>Introduction</h1>
+</div>
+
+<p>
+The Vespa test framework helps you write small applications to test
+C++ code. All interaction with the test framework is done with the use
+of macros.
+</p>
+
+<p>
+The minimal test application looks like this:
+</p>
+
+[insert:example:minimal/minimal_test.cpp]
+
+<p>
+The runnable application itself is called a <strong>test
+suite</strong> and inherits its name from the cpp file containing the
+TEST_MAIN macro. Each individual verification of some value is called
+a <strong>check</strong>. Checks can be put anywhere, but it is highly
+recommended that you put them inside <strong>tests</strong>. Tests are
+created by a family of macros. Another macro (TEST_RUN_ALL) is used to
+execute them.
+</p>
+
+<p>
+Example with two tests, each containing a single check:
+</p>
+
+[insert:example:simple/simple_test.cpp]
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Checks</h1>
+</div>
+
+<p>
+All checks are available in two variants. Those with the
+<strong>EXPECT_</strong> prefix allow execution to continue even if a
+check fails. Those with the <strong>ASSERT_</strong> prefix will
+terminate execution of the current test if it fails.
+</p>
+
+[insert:example:checks/checks_test.cpp]
+
+<p>
+Checks involving comparison of values typically use == and &lt;
+operators to compare values. Also; in order to be part of a comparison
+check, the value must support the &lt;&lt; operator to print the value
+to a string stream in case the check fails.
+</p>
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Test Fixtures</h1>
+</div>
+<p>
+Sometimes multiple tests wish to use the same predefined state as a
+starting point. This state is called a test fixture. Test fixtures are
+untangled from the actual tests and construction/destruction is used
+to handle their lifetime. When thinking of what can be used as a
+fixture, think of what can be put after <strong>new</strong> to create
+an object.
+</p>
+
+<ul>
+<li>A single test can have multiple test fixtures.</li>
+<li>The number of <strong>F</strong>s in the test macro denotes the number of fixtures.</li>
+<li>Inside the test, fixtures are available as <strong>f1</strong>, <strong>f2</strong> and so forth.</li>
+<li>Test fixtures can be parameterized with constructor parameters.</li>
+<li>Checks can be performed inside test fixture constructors.</li>
+<li>A test fixture constructor can take other test fixtures as input.</li>
+</ul>
+
+[insert:example:fixtures/fixtures_test.cpp]
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Multi-Threaded Tests</h1>
+</div>
+<p>
+One of the most novel features of the test framework is the ability to
+write multi-threaded tests. Multi-threaded tests are created by using
+test macros containing <strong>_MT</strong> and supplying a thread
+count. All threads will execute the block of code encapsulated by the
+test. The test fixtures are shared among all threads. In addition,
+each thread has a variable named <strong>num_threads</strong>
+containing the total number of threads running the test and a variable
+named <strong>thread_id</strong> identifying the thread.
+</p>
+
+<p>
+The <strong>TEST_BARRIER()</strong> macro can be used inside the test
+to synchronize the threads. The macro will block execution of each
+thread invoking it until all threads have invoked it.
+</p>
+
+[insert:example:threads/threads_test.cpp]
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Real World Examples</h1>
+</div>
+[insert:example:../box/box_test.cpp]
+[insert:example:../barrier/barrier_test.cpp]
+[insert:example:../dual_merge_director/dual_merge_director_test.cpp]
+</section>
+
+
+<section>
+<div class="page-header">
+<h1>Macro Summary</h1>
+</div>
+
+<h2>Overall Execution Macros</h2>
+<ul>
+<li><code>TEST_MAIN()</code></li>
+<li><code>TEST_RUN_ALL()</code></li>
+</ul>
+
+<h2>Test Creation Macros</h2>
+<ul>
+<li><code>TEST(name)</code></li>
+<li><code>TEST_F(name, fixture)</code></li>
+<li><code>TEST_FF(name, fixture1, fixture2)</code></li>
+<li><code>TEST_FFF(name, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<ul>
+<li><code>TEST_MT(name, threads)</code></li>
+<li><code>TEST_MT_F(name, threads, fixture)</code></li>
+<li><code>TEST_MT_FF(name, threads, fixture1, fixture2)</code></li>
+<li><code>TEST_MT_FFF(name, threads, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<ul>
+<li><code>IGNORE_TEST(name)</code></li>
+<li><code>IGNORE_TEST_F(name, fixture)</code></li>
+<li><code>IGNORE_TEST_FF(name, fixture1, fixture2)</code></li>
+<li><code>IGNORE_TEST_FFF(name, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<ul>
+<li><code>IGNORE_TEST_MT(name, threads)</code></li>
+<li><code>IGNORE_TEST_MT_F(name, threads, fixture)</code></li>
+<li><code>IGNORE_TEST_MT_FF(name, threads, fixture1, fixture2)</code></li>
+<li><code>IGNORE_TEST_MT_FFF(name, threads, fixture1, fixture2, fixture3)</code></li>
+</ul>
+
+<h2>Check Macros</h2>
+<ul>
+<li><code>ASSERT_TRUE(rc)</code></li>
+<li><code>ASSERT_FALSE(rc)</code></li>
+<li><code>ASSERT_EQUAL(a, b)</code></li>
+<li><code>ASSERT_NOT_EQUAL(a, b)</code></li>
+<li><code>ASSERT_APPROX(a, b, eps)</code></li>
+<li><code>ASSERT_NOT_APPROX(a, b, eps)</code></li>
+<li><code>ASSERT_LESS(a, b)</code></li>
+<li><code>ASSERT_LESS_EQUAL(a, b)</code></li>
+<li><code>ASSERT_GREATER(a, b)</code></li>
+<li><code>ASSERT_GREATER_EQUAL(a, b)</code></li>
+<li><code>ASSERT_EXCEPTION(statement, exception_type, msg_substr)</code></li>
+<li><code>TEST_FATAL(msg)</code></li>
+</ul>
+
+<ul>
+<li><code>EXPECT_TRUE(rc)</code></li>
+<li><code>EXPECT_FALSE(rc)</code></li>
+<li><code>EXPECT_EQUAL(a, b)</code></li>
+<li><code>EXPECT_NOT_EQUAL(a, b)</code></li>
+<li><code>EXPECT_APPROX(a, b, eps)</code></li>
+<li><code>EXPECT_NOT_APPROX(a, b, eps)</code></li>
+<li><code>EXPECT_LESS(a, b)</code></li>
+<li><code>EXPECT_LESS_EQUAL(a, b)</code></li>
+<li><code>EXPECT_GREATER(a, b)</code></li>
+<li><code>EXPECT_GREATER_EQUAL(a, b)</code></li>
+<li><code>EXPECT_EXCEPTION(statement, exception_type, msg_substr)</code></li>
+<li><code>TEST_ERROR(msg)</code></li>
+</ul>
+
+<h2>Thread Macros</h2>
+<ul>
+<li><code>TEST_BARRIER()</code></li>
+</ul>
+
+<h2>State Tracking Macros</h2>
+<ul>
+<li><code>TEST_DO(doit)</code></li>
+<li><code>TEST_STATE(msg)</code></li>
+</ul>
+
+<h2>Macros of Limited Use</h2>
+<ul>
+<li><code>TEST_TRACE()</code></li>
+<li><code>TEST_FLUSH()</code></li>
+<li><code>TEST_THREAD(name)</code></li>
+<li><code>TEST_DEBUG(lhsFile, rhsFile)</code></li>
+<li><code>TEST_MAIN_WITH_PROCESS_PROXY()</code></li>
+</ul>
+</section>
+
+<script type="text/javascript">
+$(function(){
+ window.prettyPrint && prettyPrint();
+});
+
+</script>
+
+</body>
+</html>
diff --git a/vespalib/src/tests/tutorial/xml_escape.cpp b/vespalib/src/tests/tutorial/xml_escape.cpp
new file mode 100644
index 00000000000..4bbc1445318
--- /dev/null
+++ b/vespalib/src/tests/tutorial/xml_escape.cpp
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+int main() {
+ char c[2] = "x";
+ while (fread(&c, 1, 1, stdin) == 1) {
+ const char *out = c;
+ switch (c[0]) {
+ case '<': out = "&lt;"; break;
+ case '>': out = "&gt;"; break;
+ case '&': out = "&amp;"; break;
+ case '"': out = "&quot;"; break;
+ }
+ fwrite(out, 1, strlen(out), stdout);
+ }
+ return 0;
+}
diff --git a/vespalib/src/tests/util/generationhandler/.gitignore b/vespalib/src/tests/util/generationhandler/.gitignore
new file mode 100644
index 00000000000..c98a32727d9
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+generationhandler_test
+vespalib_generationhandler_test_app
diff --git a/vespalib/src/tests/util/generationhandler/CMakeLists.txt b/vespalib/src/tests/util/generationhandler/CMakeLists.txt
new file mode 100644
index 00000000000..98c0a59d006
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_generationhandler_test_app
+ SOURCES
+ generationhandler_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_generationhandler_test_app COMMAND vespalib_generationhandler_test_app)
diff --git a/vespalib/src/tests/util/generationhandler/DESC b/vespalib/src/tests/util/generationhandler/DESC
new file mode 100644
index 00000000000..5b4befa2c15
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler/DESC
@@ -0,0 +1 @@
+generationhandler test. Take a look at generationhandler_test.cpp for details.
diff --git a/vespalib/src/tests/util/generationhandler/FILES b/vespalib/src/tests/util/generationhandler/FILES
new file mode 100644
index 00000000000..07c356893a5
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler/FILES
@@ -0,0 +1 @@
+generationhandler_test.cpp
diff --git a/vespalib/src/tests/util/generationhandler/generationhandler_test.cpp b/vespalib/src/tests/util/generationhandler/generationhandler_test.cpp
new file mode 100644
index 00000000000..c3d7b874c36
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler/generationhandler_test.cpp
@@ -0,0 +1,159 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("generationhandler_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/generationhandler.h>
+#include <deque>
+
+namespace vespalib {
+
+typedef GenerationHandler::Guard GenGuard;
+
+class Test : public vespalib::TestApp {
+private:
+ void requireThatGenerationCanBeIncreased();
+ void requireThatReadersCanTakeGuards();
+ void requireThatGuardsCanBeCopied();
+ void requireThatTheFirstUsedGenerationIsCorrect();
+ void requireThatGenerationCanGrowLarge();
+public:
+ int Main();
+};
+
+void
+Test::requireThatGenerationCanBeIncreased()
+{
+ GenerationHandler gh;
+ EXPECT_EQUAL(0u, gh.getCurrentGeneration());
+ EXPECT_EQUAL(0u, gh.getFirstUsedGeneration());
+ gh.incGeneration();
+ EXPECT_EQUAL(1u, gh.getCurrentGeneration());
+ EXPECT_EQUAL(1u, gh.getFirstUsedGeneration());
+}
+
+void
+Test::requireThatReadersCanTakeGuards()
+{
+ GenerationHandler gh;
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(0));
+ {
+ GenGuard g1 = gh.takeGuard();
+ EXPECT_EQUAL(1u, gh.getGenerationRefCount(0));
+ {
+ GenGuard g2 = gh.takeGuard();
+ EXPECT_EQUAL(2u, gh.getGenerationRefCount(0));
+ gh.incGeneration();
+ {
+ GenGuard g3 = gh.takeGuard();
+ EXPECT_EQUAL(2u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(1u, gh.getGenerationRefCount(1));
+ EXPECT_EQUAL(3u, gh.getGenerationRefCount());
+ }
+ EXPECT_EQUAL(2u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(1));
+ gh.incGeneration();
+ {
+ GenGuard g3 = gh.takeGuard();
+ EXPECT_EQUAL(2u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(1));
+ EXPECT_EQUAL(1u, gh.getGenerationRefCount(2));
+ }
+ EXPECT_EQUAL(2u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(1));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(2));
+ }
+ EXPECT_EQUAL(1u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(1));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(2));
+ }
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(1));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(2));
+}
+
+void
+Test::requireThatGuardsCanBeCopied()
+{
+ GenerationHandler gh;
+ GenGuard g1 = gh.takeGuard();
+ EXPECT_EQUAL(1u, gh.getGenerationRefCount(0));
+ GenGuard g2(g1);
+ EXPECT_EQUAL(2u, gh.getGenerationRefCount(0));
+ gh.incGeneration();
+ GenGuard g3 = gh.takeGuard();
+ EXPECT_EQUAL(2u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(1u, gh.getGenerationRefCount(1));
+ g3 = g2;
+ EXPECT_EQUAL(3u, gh.getGenerationRefCount(0));
+ EXPECT_EQUAL(0u, gh.getGenerationRefCount(1));
+}
+
+void
+Test::requireThatTheFirstUsedGenerationIsCorrect()
+{
+ GenerationHandler gh;
+ EXPECT_EQUAL(0u, gh.getFirstUsedGeneration());
+ gh.incGeneration();
+ EXPECT_EQUAL(1u, gh.getFirstUsedGeneration());
+ {
+ GenGuard g1 = gh.takeGuard();
+ gh.incGeneration();
+ EXPECT_EQUAL(true, gh.hasReaders());
+ EXPECT_EQUAL(1u, gh.getFirstUsedGeneration());
+ }
+ EXPECT_EQUAL(1u, gh.getFirstUsedGeneration());
+ gh.updateFirstUsedGeneration(); // Only writer should call this
+ EXPECT_EQUAL(false, gh.hasReaders());
+ EXPECT_EQUAL(2u, gh.getFirstUsedGeneration());
+ {
+ GenGuard g1 = gh.takeGuard();
+ gh.incGeneration();
+ gh.incGeneration();
+ EXPECT_EQUAL(true, gh.hasReaders());
+ EXPECT_EQUAL(2u, gh.getFirstUsedGeneration());
+ {
+ GenGuard g2 = gh.takeGuard();
+ EXPECT_EQUAL(2u, gh.getFirstUsedGeneration());
+ }
+ }
+ EXPECT_EQUAL(2u, gh.getFirstUsedGeneration());
+ gh.updateFirstUsedGeneration(); // Only writer should call this
+ EXPECT_EQUAL(false, gh.hasReaders());
+ EXPECT_EQUAL(4u, gh.getFirstUsedGeneration());
+}
+
+void
+Test::requireThatGenerationCanGrowLarge()
+{
+ GenerationHandler gh;
+ std::deque<GenGuard> guards;
+ for (size_t i = 0; i < 10000; ++i) {
+ EXPECT_EQUAL(i, gh.getCurrentGeneration());
+ guards.push_back(gh.takeGuard()); // take guard on current generation
+ if (i >= 128) {
+ EXPECT_EQUAL(i - 128, gh.getFirstUsedGeneration());
+ guards.pop_front();
+ EXPECT_EQUAL(128u, gh.getGenerationRefCount());
+ }
+ gh.incGeneration();
+ }
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("generationhandler_test");
+
+ TEST_DO(requireThatGenerationCanBeIncreased());
+ TEST_DO(requireThatReadersCanTakeGuards());
+ TEST_DO(requireThatGuardsCanBeCopied());
+ TEST_DO(requireThatTheFirstUsedGenerationIsCorrect());
+ TEST_DO(requireThatGenerationCanGrowLarge());
+
+ TEST_DONE();
+}
+
+}
+
+TEST_APPHOOK(vespalib::Test);
diff --git a/vespalib/src/tests/util/generationhandler_stress/.gitignore b/vespalib/src/tests/util/generationhandler_stress/.gitignore
new file mode 100644
index 00000000000..bd50526d7cd
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler_stress/.gitignore
@@ -0,0 +1 @@
+vespalib_generation_handler_stress_test_app
diff --git a/vespalib/src/tests/util/generationhandler_stress/CMakeLists.txt b/vespalib/src/tests/util/generationhandler_stress/CMakeLists.txt
new file mode 100644
index 00000000000..0842ccd35bc
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler_stress/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_generation_handler_stress_test_app
+ SOURCES
+ generation_handler_stress_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_generation_handler_stress_test_app COMMAND vespalib_generation_handler_stress_test_app BENCHMARK)
diff --git a/vespalib/src/tests/util/generationhandler_stress/DESC b/vespalib/src/tests/util/generationhandler_stress/DESC
new file mode 100644
index 00000000000..18f577aa095
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler_stress/DESC
@@ -0,0 +1 @@
+GenerationHandler stress test. Take a look at generation_handler_stress_test.cpp for details.
diff --git a/vespalib/src/tests/util/generationhandler_stress/FILES b/vespalib/src/tests/util/generationhandler_stress/FILES
new file mode 100644
index 00000000000..9c60622e3e9
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler_stress/FILES
@@ -0,0 +1 @@
+generation_handler_stress_test.cpp
diff --git a/vespalib/src/tests/util/generationhandler_stress/generation_handler_stress_test.cpp b/vespalib/src/tests/util/generationhandler_stress/generation_handler_stress_test.cpp
new file mode 100644
index 00000000000..a11cff02d22
--- /dev/null
+++ b/vespalib/src/tests/util/generationhandler_stress/generation_handler_stress_test.cpp
@@ -0,0 +1,169 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("generation_handler_stress_test");
+#include <vespa/vespalib/testkit/testapp.h>
+
+#include <vespa/vespalib/util/generationhandler.h>
+#include <vespa/vespalib/util/threadstackexecutor.h>
+
+using vespalib::Executor;
+using vespalib::GenerationHandler;
+using vespalib::ThreadStackExecutor;
+
+
+struct WorkContext
+{
+ uint64_t _generation;
+
+ WorkContext()
+ : _generation(0)
+ {
+ }
+};
+
+struct Fixture {
+ GenerationHandler _generationHandler;
+ uint32_t _readThreads;
+ ThreadStackExecutor _writer; // 1 write thread
+ ThreadStackExecutor _readers; // multiple reader threads
+ std::atomic<long> _readSeed;
+ std::atomic<long> _doneWriteWork;
+ std::atomic<long> _doneReadWork;
+ std::atomic<int> _stopRead;
+ bool _reportWork;
+
+ Fixture(uint32_t readThreads = 1);
+
+ ~Fixture();
+
+ void readWork(const WorkContext &context);
+ void writeWork(uint32_t cnt, WorkContext &context);
+ uint32_t getReadThreads() const { return _readThreads; }
+ void stressTest(uint32_t writeCnt);
+
+private:
+ Fixture(const Fixture &index) = delete;
+ Fixture(Fixture &&index) = delete;
+ Fixture &operator=(const Fixture &index) = delete;
+ Fixture &operator=(Fixture &&index) = delete;
+};
+
+
+Fixture::Fixture(uint32_t readThreads)
+ : _generationHandler(),
+ _readThreads(readThreads),
+ _writer(1, 128 * 1024),
+ _readers(readThreads, 128 * 1024),
+ _doneWriteWork(0),
+ _doneReadWork(0),
+ _stopRead(0),
+ _reportWork(false)
+{
+}
+
+
+Fixture::~Fixture()
+{
+ _readers.sync();
+ _readers.shutdown();
+ _writer.sync();
+ _writer.shutdown();
+ if (_reportWork) {
+ LOG(info,
+ "readWork=%ld, writeWork=%ld",
+ _doneReadWork.load(), _doneWriteWork.load());
+ }
+}
+
+
+void
+Fixture::readWork(const WorkContext &context)
+{
+ uint32_t i;
+ uint32_t cnt = std::numeric_limits<uint32_t>::max();
+
+ for (i = 0; i < cnt && _stopRead.load() == 0; ++i) {
+ auto guard = _generationHandler.takeGuard();
+ auto generation = context._generation;
+ EXPECT_GREATER_EQUAL(generation, guard.getGeneration());
+ }
+ _doneReadWork += i;
+ LOG(info, "done %u read work", i);
+}
+
+
+void
+Fixture::writeWork(uint32_t cnt, WorkContext &context)
+{
+ for (uint32_t i = 0; i < cnt; ++i) {
+ context._generation = _generationHandler.getNextGeneration();
+ _generationHandler.incGeneration();
+ }
+ _doneWriteWork += cnt;
+ _stopRead = 1;
+ LOG(info, "done %u write work", cnt);
+}
+
+namespace
+{
+
+class ReadWorkTask : public vespalib::Executor::Task
+{
+ Fixture &_f;
+ std::shared_ptr<WorkContext> _context;
+public:
+ ReadWorkTask(Fixture &f, std::shared_ptr<WorkContext> context)
+ : _f(f),
+ _context(context)
+ {
+ }
+ virtual void run() override { _f.readWork(*_context); }
+};
+
+class WriteWorkTask : public vespalib::Executor::Task
+{
+ Fixture &_f;
+ uint32_t _cnt;
+ std::shared_ptr<WorkContext> _context;
+public:
+ WriteWorkTask(Fixture &f, uint32_t cnt,
+ std::shared_ptr<WorkContext> context)
+ : _f(f),
+ _cnt(cnt),
+ _context(context)
+ {
+ }
+ virtual void run() override { _f.writeWork(_cnt, *_context); }
+};
+
+}
+
+
+void
+Fixture::stressTest(uint32_t writeCnt)
+{
+ _reportWork = true;
+ uint32_t readThreads = getReadThreads();
+ LOG(info,
+ "starting stress test, 1 write thread, %u read threads, %u writes",
+ readThreads, writeCnt);
+ auto context = std::make_shared<WorkContext>();
+ _writer.execute(std::make_unique<WriteWorkTask>(*this, writeCnt, context));
+ for (uint32_t i = 0; i < readThreads; ++i) {
+ _readers.execute(std::make_unique<ReadWorkTask>(*this, context));
+ }
+}
+
+
+TEST_F("stress test, 2 readers", Fixture(2))
+{
+ f.stressTest(1000000);
+}
+
+TEST_F("stress test, 4 readers", Fixture(4))
+{
+ f.stressTest(1000000);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/valgrind/.gitignore b/vespalib/src/tests/valgrind/.gitignore
new file mode 100644
index 00000000000..d4b7a9e7e55
--- /dev/null
+++ b/vespalib/src/tests/valgrind/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+valgrind_test
+vespalib_valgrind_test_app
diff --git a/vespalib/src/tests/valgrind/CMakeLists.txt b/vespalib/src/tests/valgrind/CMakeLists.txt
new file mode 100644
index 00000000000..72643d9b7e7
--- /dev/null
+++ b/vespalib/src/tests/valgrind/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_valgrind_test_app
+ SOURCES
+ valgrind_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_valgrind_test_app_testInitializedUser COMMAND vespalib_valgrind_test_app testInitializedUser NO_VALGRIND)
+vespa_add_test(NAME vespalib_valgrind_test_app_testInitializedSystemCall COMMAND vespalib_valgrind_test_app testInitializedSystemCall NO_VALGRIND)
+vespa_add_test(NAME vespalib_valgrind_test_app_testUninitializedUser COMMAND vespalib_valgrind_test_app testUninitializedUser NO_VALGRIND)
+vespa_add_test(NAME vespalib_valgrind_test_app_testUninitializedSystemCall COMMAND vespalib_valgrind_test_app testUninitializedSystemCall NO_VALGRIND)
diff --git a/vespalib/src/tests/valgrind/DESC b/vespalib/src/tests/valgrind/DESC
new file mode 100644
index 00000000000..fdaf253ad9d
--- /dev/null
+++ b/vespalib/src/tests/valgrind/DESC
@@ -0,0 +1 @@
+valgrind test. Take a look at valgrind.cpp for details.
diff --git a/vespalib/src/tests/valgrind/FILES b/vespalib/src/tests/valgrind/FILES
new file mode 100644
index 00000000000..c1ecefffc5a
--- /dev/null
+++ b/vespalib/src/tests/valgrind/FILES
@@ -0,0 +1 @@
+valgrind.cpp
diff --git a/vespalib/src/tests/valgrind/valgrind_test.cpp b/vespalib/src/tests/valgrind/valgrind_test.cpp
new file mode 100644
index 00000000000..443f6814c5c
--- /dev/null
+++ b/vespalib/src/tests/valgrind/valgrind_test.cpp
@@ -0,0 +1,68 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("valgrind_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/util/valgrind.h>
+
+using namespace vespalib;
+
+class Test : public TestApp
+{
+ int Main();
+ void testUninitializedUser();
+ void testUninitializedSystemCall();
+ void testInitializedUser();
+ void testInitializedSystemCall();
+};
+
+void Test::testUninitializedUser()
+{
+ char buf[7];
+ buf[0] = 7;
+ buf[5] = 7;
+ Valgrind::testUninitialized(buf, sizeof(buf));
+}
+
+void Test::testUninitializedSystemCall()
+{
+ char buf[7];
+ buf[0] = 7;
+ buf[5] = 7;
+ Valgrind::testSystemCall(buf, sizeof(buf));
+}
+void Test::testInitializedUser()
+{
+ char buf[7];
+ memset(buf, 0, sizeof(buf));
+ Valgrind::testUninitialized(buf, sizeof(buf));
+}
+
+void Test::testInitializedSystemCall()
+{
+ char buf[7];
+ memset(buf, 0, sizeof(buf));
+ Valgrind::testSystemCall(buf, sizeof(buf));
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("valgrind_test");
+
+ if (strcmp(_argv[1], "testInitializedUser") == 0) {
+ testInitializedUser();
+ } else if (strcmp(_argv[1], "testInitializedSystemCall") == 0) {
+ testInitializedSystemCall();
+ } else if (strcmp(_argv[1], "testUninitializedUser") == 0) {
+ testUninitializedUser();
+ } else if (strcmp(_argv[1], "testUninitializedSystemCall") == 0) {
+ testUninitializedSystemCall();
+ } else {
+ testInitializedUser();
+ }
+
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/weakref/.gitignore b/vespalib/src/tests/weakref/.gitignore
new file mode 100644
index 00000000000..8ef27437213
--- /dev/null
+++ b/vespalib/src/tests/weakref/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+weakref_test
+vespalib_weakref_test_app
diff --git a/vespalib/src/tests/weakref/CMakeLists.txt b/vespalib/src/tests/weakref/CMakeLists.txt
new file mode 100644
index 00000000000..fe2a61d6586
--- /dev/null
+++ b/vespalib/src/tests/weakref/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_weakref_test_app
+ SOURCES
+ weakref_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_weakref_test_app COMMAND vespalib_weakref_test_app)
diff --git a/vespalib/src/tests/weakref/DESC b/vespalib/src/tests/weakref/DESC
new file mode 100644
index 00000000000..d2a0b5757a6
--- /dev/null
+++ b/vespalib/src/tests/weakref/DESC
@@ -0,0 +1 @@
+Unit test for the WeakRef class.
diff --git a/vespalib/src/tests/weakref/FILES b/vespalib/src/tests/weakref/FILES
new file mode 100644
index 00000000000..82209bcb6ae
--- /dev/null
+++ b/vespalib/src/tests/weakref/FILES
@@ -0,0 +1 @@
+weakref.cpp
diff --git a/vespalib/src/tests/weakref/weakref_test.cpp b/vespalib/src/tests/weakref/weakref_test.cpp
new file mode 100644
index 00000000000..9da22c308c3
--- /dev/null
+++ b/vespalib/src/tests/weakref/weakref_test.cpp
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("weakref_test");
+#include <vespa/vespalib/util/weakref.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using vespalib::WeakRef;
+
+
+class Test : public vespalib::TestApp
+{
+public:
+ int getFive() { return 5; }
+ void testSimple();
+ int Main();
+};
+
+
+void
+Test::testSimple()
+{
+ WeakRef<Test>::Owner owner(this);
+ WeakRef<Test> ref(owner);
+ {
+ WeakRef<Test>::Usage use(ref);
+ ASSERT_TRUE(use.valid());
+ EXPECT_TRUE(use->getFive() == 5);
+ }
+ owner.clear();
+ {
+ WeakRef<Test>::Usage use(ref);
+ EXPECT_TRUE(!use.valid());
+ }
+}
+
+
+int
+Test::Main()
+{
+ TEST_INIT("weakref_test");
+ testSimple();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test)
diff --git a/vespalib/src/tests/websocket/.gitignore b/vespalib/src/tests/websocket/.gitignore
new file mode 100644
index 00000000000..379d76b3ece
--- /dev/null
+++ b/vespalib/src/tests/websocket/.gitignore
@@ -0,0 +1,3 @@
+/websocket_server
+vespalib_websocket_test_app
+vespalib_websocket_server_app
diff --git a/vespalib/src/tests/websocket/CMakeLists.txt b/vespalib/src/tests/websocket/CMakeLists.txt
new file mode 100644
index 00000000000..c74aad84692
--- /dev/null
+++ b/vespalib/src/tests/websocket/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_websocket_test_app
+ SOURCES
+ websocket_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_websocket_test_app COMMAND vespalib_websocket_test_app)
+vespa_add_executable(vespalib_websocket_server_app
+ SOURCES
+ websocket_server.cpp
+ DEPENDS
+ vespalib
+)
diff --git a/vespalib/src/tests/websocket/FILES b/vespalib/src/tests/websocket/FILES
new file mode 100644
index 00000000000..b3d0cb52dee
--- /dev/null
+++ b/vespalib/src/tests/websocket/FILES
@@ -0,0 +1 @@
+websocket_test.cpp
diff --git a/vespalib/src/tests/websocket/favicon.ico b/vespalib/src/tests/websocket/favicon.ico
new file mode 100644
index 00000000000..22f61482bd0
--- /dev/null
+++ b/vespalib/src/tests/websocket/favicon.ico
Binary files differ
diff --git a/vespalib/src/tests/websocket/index.html b/vespalib/src/tests/websocket/index.html
new file mode 100644
index 00000000000..3d705380d10
--- /dev/null
+++ b/vespalib/src/tests/websocket/index.html
@@ -0,0 +1,5 @@
+<!-- Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -->
+<html>
+<h1>Websocket server</h1>
+<a href="test.html">run test</a>
+</html>
diff --git a/vespalib/src/tests/websocket/test.html b/vespalib/src/tests/websocket/test.html
new file mode 100644
index 00000000000..6a9a00ce001
--- /dev/null
+++ b/vespalib/src/tests/websocket/test.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<!-- Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -->
+
+<meta charset="utf-8" />
+
+<title>WebSocket Test</title>
+
+<script language="javascript" type="text/javascript">
+
+ var wsUri = "ws://[SELF]/echo";
+ var output;
+
+ function init()
+ {
+ output = document.getElementById("output");
+ testWebSocket();
+ }
+
+ function testWebSocket()
+ {
+ websocket = new WebSocket(wsUri);
+ websocket.onopen = function(evt) { onOpen(evt) };
+ websocket.onclose = function(evt) { onClose(evt) };
+ websocket.onmessage = function(evt) { onMessage(evt) };
+ websocket.onerror = function(evt) { onError(evt) };
+ }
+
+ function onOpen(evt)
+ {
+ writeToScreen("CONNECTED");
+ doSend("WebSocket rocks");
+ }
+
+ function onClose(evt)
+ {
+ writeToScreen("DISCONNECTED");
+ }
+
+ function onMessage(evt)
+ {
+ writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
+ websocket.close();
+ }
+
+ function onError(evt)
+ {
+ writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
+ }
+
+ function doSend(message)
+ {
+ writeToScreen("SENT: " + message);
+ websocket.send(message);
+ }
+
+ function writeToScreen(message)
+ {
+ var pre = document.createElement("p");
+ pre.style.wordWrap = "break-word";
+ pre.innerHTML = message;
+ output.appendChild(pre);
+ }
+
+ window.addEventListener("load", init, false);
+
+</script>
+
+<h2>WebSocket Test</h2>
+
+<div id="output"></div>
diff --git a/vespalib/src/tests/websocket/websocket_server.cpp b/vespalib/src/tests/websocket/websocket_server.cpp
new file mode 100644
index 00000000000..e7b6d23e566
--- /dev/null
+++ b/vespalib/src/tests/websocket/websocket_server.cpp
@@ -0,0 +1,62 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/websocket/websocket_server.h>
+#include <vespa/vespalib/util/host_name.h>
+#include <vespa/vespalib/util/signalhandler.h>
+#include <thread>
+#include <chrono>
+
+using namespace vespalib;
+
+vespalib::string read_file(const vespalib::string &file_name) {
+ vespalib::string ret;
+ struct stat info;
+ int fd = open(file_name.c_str(), O_RDONLY);
+ if (fd >= 0 && fstat(fd, &info) == 0) {
+ char *data = (char*)(mmap(0, info.st_size, PROT_READ, MAP_SHARED, fd, 0));
+ if (data != MAP_FAILED) {
+ ret = vespalib::string(data, info.st_size);
+ }
+ munmap(data, info.st_size);
+ }
+ close(fd);
+ return ret;
+}
+
+vespalib::string find_content_type(const vespalib::string &file_name) {
+ if (ends_with(file_name, ".html")) {
+ return "text/html";
+ }
+ if (ends_with(file_name, ".js")) {
+ return "text/javascript";
+ }
+ if (ends_with(file_name, ".ico")) {
+ return "image/x-icon";
+ }
+ return "text/plain";
+}
+
+int main(int argc, char **argv) {
+ ws::WebsocketServer::StaticRepo repo;
+ for (int i = 1; i < argc; ++i) {
+ vespalib::string file_name(argv[i]);
+ vespalib::string content = read_file(file_name);
+ vespalib::string content_type = find_content_type(file_name);
+ if (!content.empty()) {
+ fprintf(stderr, "loaded file: %s as content %s\n", file_name.c_str(), content_type.c_str());
+ repo.emplace("/" + file_name, ws::WebsocketServer::StaticPage{content_type, content});
+ }
+ }
+ ws::WebsocketServer server(0, std::move(repo));
+ int port = server.port();
+ SignalHandler::INT.hook();
+ fprintf(stderr, "running websocket server at http://%s:%d/index.html\n",
+ HostName::get().c_str(), port);
+ fprintf(stderr, "use ^C (SIGINT) to exit\n");
+ while (!SignalHandler::INT.check()) {
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ }
+ fprintf(stderr, "exiting...\n");
+ kill(getpid(), SIGTERM);
+ return 0;
+}
diff --git a/vespalib/src/tests/websocket/websocket_test.cpp b/vespalib/src/tests/websocket/websocket_test.cpp
new file mode 100644
index 00000000000..c756cb3d22d
--- /dev/null
+++ b/vespalib/src/tests/websocket/websocket_test.cpp
@@ -0,0 +1,145 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/websocket/socket.h>
+#include <vespa/vespalib/websocket/server_socket.h>
+#include <vespa/vespalib/websocket/handler.h>
+#include <vespa/vespalib/websocket/acceptor.h>
+#include <vespa/vespalib/websocket/key.h>
+#include <vespa/vespalib/websocket/buffer.h>
+#include <vespa/vespalib/util/sync.h>
+#include <thread>
+#include <functional>
+#include <chrono>
+
+using namespace vespalib::ws;
+
+template <typename T>
+struct Receptor : vespalib::ws::Handler<T> {
+ std::unique_ptr<T> obj;
+ vespalib::Gate gate;
+ void handle(std::unique_ptr<T> t) override {
+ obj = std::move(t);
+ gate.countDown();
+ }
+};
+
+vespalib::string read_bytes(Socket &socket, size_t wanted_bytes) {
+ char tmp[64];
+ vespalib::string result;
+ while (result.size() < wanted_bytes) {
+ size_t read_size = std::min(sizeof(tmp), wanted_bytes - result.size());
+ size_t read_result = socket.read(tmp, read_size);
+ if (read_result <= 0) {
+ return result;
+ }
+ result.append(tmp, read_result);
+ }
+ return result;
+}
+
+void verify_socket_io(bool is_server, Socket &socket) {
+ vespalib::string server_message = "hello, this is the server speaking";
+ vespalib::string client_message = "please pick up, I need to talk to you";
+ if(is_server) {
+ socket.write(server_message.data(), server_message.size());
+ vespalib::string read = read_bytes(socket, client_message.size());
+ EXPECT_EQUAL(client_message, read);
+ } else {
+ socket.write(client_message.data(), client_message.size());
+ vespalib::string read = read_bytes(socket, server_message.size());
+ EXPECT_EQUAL(server_message, read);
+ }
+}
+
+void verify_socket_io_async(Socket &server, Socket &client) {
+ std::thread server_thread(verify_socket_io, true, std::ref(server));
+ std::thread client_thread(verify_socket_io, false, std::ref(client));
+ server_thread.join();
+ client_thread.join();
+}
+
+Socket::UP connect_sockets(bool is_server, ServerSocket &server_socket) {
+ if (is_server) {
+ return server_socket.accept();
+ } else {
+ return Socket::UP(new Socket("localhost", server_socket.port()));
+ }
+}
+
+void check_buffer_stats(const Buffer &buffer, size_t dead, size_t used, size_t free) {
+ EXPECT_EQUAL(dead, buffer.dead());
+ EXPECT_EQUAL(used, buffer.used());
+ EXPECT_EQUAL(free, buffer.free());
+}
+
+TEST("require that basic reserve/commit/obtain/evict buffer cycle works") {
+ Buffer buffer;
+ check_buffer_stats(buffer, 0, 0, 0);
+ char *a = buffer.reserve(1);
+ check_buffer_stats(buffer, 0, 0, 1);
+ *a = 'x';
+ buffer.commit(1);
+ check_buffer_stats(buffer, 0, 1, 0);
+ EXPECT_EQUAL('x', *buffer.obtain());
+ check_buffer_stats(buffer, 0, 1, 0);
+ buffer.evict(1);
+ check_buffer_stats(buffer, 1, 0, 0);
+}
+
+TEST("require that buffer moves contained data when more space is needed") {
+ Buffer buffer;
+ strncpy(buffer.reserve(3), "xyz", 3);
+ buffer.commit(3);
+ EXPECT_EQUAL('x', *buffer.obtain());
+ buffer.evict(1);
+ EXPECT_EQUAL('y', *buffer.obtain());
+ check_buffer_stats(buffer, 1, 2, 0);
+ buffer.reserve(1);
+ check_buffer_stats(buffer, 0, 2, 1);
+ EXPECT_EQUAL('y', *buffer.obtain());
+ buffer.evict(1);
+ EXPECT_EQUAL('z', *buffer.obtain());
+ check_buffer_stats(buffer, 1, 1, 1);
+ buffer.reserve(3);
+ check_buffer_stats(buffer, 0, 1, 3);
+ EXPECT_EQUAL('z', *buffer.obtain());
+}
+
+TEST_MT_F("require that basic socket io works", 2, ServerSocket(0)) {
+ bool is_server = (thread_id == 0);
+ Socket::UP socket = connect_sockets(is_server, f1);
+ TEST_DO(verify_socket_io(is_server, *socket));
+}
+
+TEST_MT_F("require that server accept can be interrupted", 2, ServerSocket(0)) {
+ bool is_server = (thread_id == 0);
+ if (is_server) {
+ fprintf(stderr, "--> calling accept\n");
+ Socket::UP socket = f1.accept();
+ fprintf(stderr, "<-- accept returned\n");
+ EXPECT_TRUE(socket.get() == nullptr);
+ EXPECT_TRUE(f1.is_closed());
+ } else {
+ std::this_thread::sleep_for(std::chrono::milliseconds(500));
+ fprintf(stderr, "--- closing server socket\n");
+ f1.close();
+ }
+}
+
+TEST("require that an acceptor can accept connections asynchronously") {
+ Receptor<Socket> server;
+ Acceptor acceptor(0, server);
+ Socket::UP client(new Socket("localhost", acceptor.port()));
+ server.gate.await(60000);
+ EXPECT_TRUE(server.obj.get() != nullptr);
+ EXPECT_TRUE(client.get() != nullptr);
+ TEST_DO(verify_socket_io_async(*server.obj, *client));
+}
+
+TEST("require that websocket accept tokens are generated correctly") {
+ vespalib::string key("dGhlIHNhbXBsZSBub25jZQ==");
+ vespalib::string accept_token("s3pPLMBiTxaQ9kYGzzhZRbK+xOo=");
+ EXPECT_EQUAL(accept_token, Key::accept(key));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/zcurve/.gitignore b/vespalib/src/tests/zcurve/.gitignore
new file mode 100644
index 00000000000..dbbe05b223b
--- /dev/null
+++ b/vespalib/src/tests/zcurve/.gitignore
@@ -0,0 +1,5 @@
+.depend
+Makefile
+zcurve_test
+vespalib_zcurve_ranges_test_app
+vespalib_zcurve_test_app
diff --git a/vespalib/src/tests/zcurve/CMakeLists.txt b/vespalib/src/tests/zcurve/CMakeLists.txt
new file mode 100644
index 00000000000..14d08bbe9ba
--- /dev/null
+++ b/vespalib/src/tests/zcurve/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_zcurve_test_app
+ SOURCES
+ zcurve_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_zcurve_test_app COMMAND vespalib_zcurve_test_app)
+vespa_add_executable(vespalib_zcurve_ranges_test_app
+ SOURCES
+ zcurve_ranges_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_zcurve_ranges_test_app COMMAND vespalib_zcurve_ranges_test_app)
diff --git a/vespalib/src/tests/zcurve/DESC b/vespalib/src/tests/zcurve/DESC
new file mode 100644
index 00000000000..e47e3fb171e
--- /dev/null
+++ b/vespalib/src/tests/zcurve/DESC
@@ -0,0 +1 @@
+This is a test for the ZCurve class.
diff --git a/vespalib/src/tests/zcurve/FILES b/vespalib/src/tests/zcurve/FILES
new file mode 100644
index 00000000000..715d2c9dedb
--- /dev/null
+++ b/vespalib/src/tests/zcurve/FILES
@@ -0,0 +1 @@
+zcurve.cpp
diff --git a/vespalib/src/tests/zcurve/zcurve_ranges_test.cpp b/vespalib/src/tests/zcurve/zcurve_ranges_test.cpp
new file mode 100644
index 00000000000..06112045dc2
--- /dev/null
+++ b/vespalib/src/tests/zcurve/zcurve_ranges_test.cpp
@@ -0,0 +1,57 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/geo/zcurve.h>
+#include <vector>
+
+typedef vespalib::geo::ZCurve Z;
+
+bool inside(int x, int y, const Z::RangeVector &ranges) {
+ int64_t z = Z::encode(x, y);
+ for (auto range: ranges) {
+ if (z >= range.min() && z <= range.max()) {
+ return true;
+ }
+ }
+ fprintf(stderr, "FAILED: (%d, %d) -> (%ld) not in:\n", x, y, z);
+ for (auto range: ranges) {
+ fprintf(stderr, " [%ld, %ld]\n", range.min(), range.max());
+ }
+ return false;
+}
+
+bool verify_ranges(int min_x, int min_y, int max_x, int max_y) {
+ Z::RangeVector ranges = Z::find_ranges(min_x, min_y, max_x, max_y);
+ for (int x = min_x; x <= max_x; ++x) {
+ for (int y = min_y; y <= max_y; ++y) {
+ if (!EXPECT_TRUE(inside(x, y, ranges))) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+TEST("require that returned ranges contains bounding box") {
+ std::vector<int> values({-13, -1, 0, 1, 13});
+ for (auto min_x: values) {
+ for (auto min_y: values) {
+ for (auto max_x: values) {
+ for (auto max_y: values) {
+ if (max_x >= min_x && max_y >= min_y) {
+ if (!EXPECT_TRUE(verify_ranges(min_x, min_y, max_x, max_y))) {
+ fprintf(stderr, "BOX: (%d, %d) -> (%d, %d)\n",
+ min_x, min_y, max_x, max_y);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+TEST("require that silly bounding box does not explode") {
+ Z::RangeVector ranges = Z::find_ranges(-105, -7000000, 105, 7000000);
+ EXPECT_EQUAL(42u, ranges.size());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/tests/zcurve/zcurve_test.cpp b/vespalib/src/tests/zcurve/zcurve_test.cpp
new file mode 100644
index 00000000000..e4a5d02d68e
--- /dev/null
+++ b/vespalib/src/tests/zcurve/zcurve_test.cpp
@@ -0,0 +1,399 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("zcurve_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/geo/zcurve.h>
+#include <algorithm>
+#include <limits>
+#include <map>
+
+namespace vespalib {
+
+using geo::ZCurve;
+
+class ZCurveTest : public vespalib::TestApp
+{
+public:
+ ZCurveTest(void)
+ : vespalib::TestApp()
+ {
+ }
+
+ void
+ testEncoding(void);
+
+ void
+ testDecoding(void);
+
+ double
+ ftime(void);
+
+ static inline int64_t
+ encodexy3(int32_t x, int32_t y);
+
+#define BMLIMIT 0x1000000
+
+ template <bool decode>
+ int64_t
+ bm(void);
+
+ template <bool decode>
+ int64_t
+ bm2(void);
+
+ template <bool decode>
+ int64_t
+ bm3(void);
+
+ int64_t
+ bmcheck(void);
+
+ int Main(void);
+};
+
+
+void
+ZCurveTest::testEncoding(void)
+{
+ int32_t x = 0;
+ int32_t y = 0;
+ int64_t z = ZCurve::encode(x, y);
+ ASSERT_TRUE(z == 0);
+
+ x = std::numeric_limits<int32_t>::min();
+ y = std::numeric_limits<int32_t>::min();
+ z = ZCurve::encode(x, y);
+ ASSERT_TRUE(static_cast<int64_t>(UINT64_C(0xc000000000000000)) == z);
+
+ x = std::numeric_limits<int32_t>::min();
+ y = std::numeric_limits<int32_t>::max();
+ z = ZCurve::encode(x, y);
+ ASSERT_TRUE(static_cast<int64_t>(UINT64_C(0x6aaaaaaaaaaaaaaa)) == z);
+
+ x = std::numeric_limits<int32_t>::max();
+ y = std::numeric_limits<int32_t>::max();
+ z = ZCurve::encode(x, y);
+ ASSERT_TRUE(static_cast<int64_t>(UINT64_C(0x3fffffffffffffff)) == z);
+
+ x = -1;
+ y = -1;
+ z = ZCurve::encode(x, y);
+ ASSERT_TRUE(static_cast<int64_t>(UINT64_C(0xffffffffffffffff)) == z);
+
+ x = std::numeric_limits<int32_t>::max() / 2;
+ y = std::numeric_limits<int32_t>::min() / 2;
+ z = ZCurve::encode(x, y);
+ ASSERT_TRUE(static_cast<int64_t>(UINT64_C(0xa555555555555555)) == z);
+}
+
+
+void
+ZCurveTest::testDecoding(void)
+{
+ int32_t x = 0;
+ int32_t y = 0;
+ int64_t z = ZCurve::encode(x, y);
+ int32_t dx;
+ int32_t dy;
+ dx = 0;
+ dy = 0;
+ ZCurve::decode(z, &dx, &dy);
+ ASSERT_TRUE(dx == x);
+ ASSERT_TRUE(dy == y);
+
+ x = std::numeric_limits<int32_t>::max();
+ y = std::numeric_limits<int32_t>::max();
+ z = ZCurve::encode(x, y);
+ ZCurve::decode(z, &dx, &dy);
+ ASSERT_TRUE(dx == x);
+ ASSERT_TRUE(dy == y);
+
+ x = std::numeric_limits<int32_t>::min();
+ y = std::numeric_limits<int32_t>::min();
+ z = ZCurve::encode(x, y);
+ ZCurve::decode(z, &dx, &dy);
+ ASSERT_TRUE(dx == x);
+ ASSERT_TRUE(dy == y);
+
+ x = std::numeric_limits<int32_t>::min();
+ y = std::numeric_limits<int32_t>::max();
+ z = ZCurve::encode(x, y);
+ ZCurve::decode(z, &dx, &dy);
+ ASSERT_TRUE(dx == x);
+ ASSERT_TRUE(dy == y);
+
+ x = -18;
+ y = 1333;
+ z = ZCurve::encode(x, y);
+ ZCurve::decode(z, &dx, &dy);
+ ASSERT_TRUE(dx == x);
+ ASSERT_TRUE(dy == y);
+
+ x = 0;
+ y = 0;
+ z = ZCurve::encode(x, y);
+ ZCurve::decode(z, &dx, &dy);
+ ASSERT_TRUE(dx == x);
+ ASSERT_TRUE(dy == y);
+}
+
+
+double
+ZCurveTest::ftime(void)
+{
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec + tv.tv_usec / 1000000.0;
+}
+
+int64_t
+ZCurveTest::encodexy3(int32_t x, int32_t y)
+{
+ uint32_t resxl;
+ uint32_t resxh;
+ uint32_t resyl;
+ uint32_t resyh;
+
+ resxl = (static_cast<uint32_t>(x) & 0x0000ffffu);
+ resxh = (static_cast<uint32_t>(x) & 0xffff0000u) >> 16;
+ resyl = (static_cast<uint32_t>(y) & 0x0000ffffu);
+ resyh = (static_cast<uint32_t>(y) & 0xffff0000u) >> 16;
+ resxl = ((resxl & 0xff00ff00u) << 8) | (resxl & 0x00ff00ffu);
+ resyl = ((resyl & 0xff00ff00u) << 8) | (resyl & 0x00ff00ffu);
+ resxh = ((resxh & 0xff00ff00u) << 8) | (resxh & 0x00ff00ffu);
+ resyh = ((resyh & 0xff00ff00u) << 8) | (resyh & 0x00ff00ffu);
+ resxl = ((resxl & 0xf0f0f0f0u) << 4) | (resxl & 0x0f0f0f0fu);
+ resyl = ((resyl & 0xf0f0f0f0u) << 4) | (resyl & 0x0f0f0f0fu);
+ resxh = ((resxh & 0xf0f0f0f0u) << 4) | (resxh & 0x0f0f0f0fu);
+ resyh = ((resyh & 0xf0f0f0f0u) << 4) | (resyh & 0x0f0f0f0fu);
+ resxl = ((resxl & 0xccccccccu) << 2) | (resxl & 0x33333333u);
+ resyl = ((resyl & 0xccccccccu) << 2) | (resyl & 0x33333333u);
+ resxh = ((resxh & 0xccccccccu) << 2) | (resxh & 0x33333333u);
+ resyh = ((resyh & 0xccccccccu) << 2) | (resyh & 0x33333333u);
+ resxl = ((resxl & 0xaaaaaaaau) << 1) | (resxl & 0x55555555u);
+ resyl = ((resyl & 0xaaaaaaaau) << 1) | (resyl & 0x55555555u);
+ resxh = ((resxh & 0xaaaaaaaau) << 1) | (resxh & 0x55555555u);
+ resyh = ((resyh & 0xaaaaaaaau) << 1) | (resyh & 0x55555555u);
+ return static_cast<int64_t>(resxl | (resyl << 1) |
+ (static_cast<uint64_t>(resxh |
+ (resyh << 1)) << 32));
+}
+
+
+template <bool decode>
+int64_t
+ZCurveTest::bm(void)
+{
+ int64_t res = 0;
+ double before = ftime();
+ int32_t x = 0;
+ do {
+ x++;
+ int64_t enc = ZCurve::encodeSlow(x, 0);
+ res += enc;
+ if (decode) {
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decodeSlow(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == x);
+ ASSERT_TRUE(checky == 0);
+ }
+ } while (x != BMLIMIT);
+ int32_t y = 0;
+ do {
+ y++;
+ int64_t enc = ZCurve::encodeSlow(0, y);
+ res += enc;
+ if (decode) {
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decodeSlow(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == 0);
+ ASSERT_TRUE(checky == y);
+ }
+ } while (y != BMLIMIT);
+ double after = ftime();
+ LOG(info,
+ "Elapsed bm<decode = %s> = %6.2f",
+ decode ? "true" : "false",
+ after - before);
+ return res;
+}
+
+
+template <bool decode>
+int64_t
+ZCurveTest::bm2(void)
+{
+ int64_t res = 0;
+ double before = ftime();
+ int32_t x = 0;
+ do {
+ x++;
+ int64_t enc = ZCurve::encode(x, 0);
+ res += enc;
+ if (decode) {
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decode(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == x);
+ ASSERT_TRUE(checky == 0);
+ }
+ } while (x != BMLIMIT);
+ int32_t y = 0;
+ do {
+ y++;
+ int64_t enc = ZCurve::encode(0, y);
+ res += enc;
+ if (decode) {
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decode(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == 0);
+ ASSERT_TRUE(checky == y);
+ }
+ } while (y != BMLIMIT);
+ double after = ftime();
+ LOG(info,
+ "Elapsed bm2<decode = %s> = %6.2f",
+ decode ? "true" : "false",
+ after - before);
+ return res;
+}
+
+
+template <bool decode>
+int64_t
+ZCurveTest::bm3(void)
+{
+ int64_t res = 0;
+ double before = ftime();
+ int32_t x = 0;
+ do {
+ x++;
+ int64_t enc = encodexy3(x, 0);
+ res += enc;
+ if (decode) {
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decode(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == x);
+ ASSERT_TRUE(checky == 0);
+ }
+ } while (x != BMLIMIT);
+ int32_t y = 0;
+ do {
+ y++;
+ int64_t enc = encodexy3(0, y);
+ res += enc;
+ if (decode) {
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decode(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == 0);
+ ASSERT_TRUE(checky == y);
+ }
+ } while (y != BMLIMIT);
+ double after = ftime();
+ LOG(info,
+ "Elapsed bm3<decode = %s> = %6.2f",
+ decode ? "true" : "false",
+ after - before);
+ return res;
+}
+
+
+int64_t
+ZCurveTest::bmcheck(void)
+{
+ int64_t res = 0;
+ double before = ftime();
+ int32_t x = 0;
+ do {
+ x++;
+ int64_t enc = ZCurve::encodeSlow(x, 0);
+ int64_t enc2 = ZCurve::encode(x, 0);
+ int64_t enc3 = encodexy3(x, 0);
+ ASSERT_TRUE(enc == enc2);
+ ASSERT_TRUE(enc == enc3);
+ res += enc;
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decode(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == x);
+ ASSERT_TRUE(checky == 0);
+ } while (x != BMLIMIT);
+ int32_t y = 0;
+ do {
+ y++;
+ int64_t enc = ZCurve::encodeSlow(0, y);
+ int64_t enc2 = ZCurve::encode(0, y);
+ int64_t enc3 = encodexy3(0, y);
+ ASSERT_TRUE(enc == enc2);
+ ASSERT_TRUE(enc == enc3);
+ res += enc;
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ ZCurve::decode(enc, &checkx, &checky);
+ ASSERT_TRUE(checkx == 0);
+ ASSERT_TRUE(checky == y);
+ } while (y != BMLIMIT);
+ double after = ftime();
+ LOG(info,
+ "Elapsed bmcheck = %6.2f",
+ after - before);
+ return res;
+}
+
+
+int
+ZCurveTest::Main(void)
+{
+ TEST_INIT("zcurve_test");
+
+ for (int32_t x = 0; x < 4; x++) {
+ for (int32_t y = 0; y < 4; y++) {
+ int64_t enc = 0;
+ int64_t enc2 = 0;
+ int64_t enc3 = 0;
+ int32_t checkx = 0;
+ int32_t checky = 0;
+ enc = ZCurve::encodeSlow(x, y);
+ enc2 = ZCurve::encode(x, y);
+ enc3 = encodexy3(x, y);
+ ASSERT_TRUE(enc == enc2);
+ ASSERT_TRUE(enc == enc3);
+ // printf("x=%u, y=%u, enc=%" PRId64 "\n", x, y, enc);
+ checkx = 0;
+ checky = 0;
+ ZCurve::decodeSlow(enc, &checkx, &checky);
+ ASSERT_TRUE(x == checkx);
+ ASSERT_TRUE(y == checky);
+ }
+ }
+ testEncoding();
+ testDecoding();
+ if (_argc >= 2) {
+ int64_t enc1 = bm<true>();
+ int64_t enc1b = bm<false>();
+ int64_t enc2 = bm2<true>();
+ int64_t enc2b = bm2<false>();
+ int64_t enc3 = bm3<true>();
+ int64_t enc3b = bm3<false>();
+ int64_t enc4 = bmcheck();
+ ASSERT_TRUE(enc1 == enc1b);
+ ASSERT_TRUE(enc1 == enc2);
+ ASSERT_TRUE(enc1 == enc2b);
+ ASSERT_TRUE(enc1 == enc3);
+ ASSERT_TRUE(enc1 == enc3b);
+ ASSERT_TRUE(enc1 == enc4);
+ }
+
+ TEST_DONE();
+}
+
+}
+
+TEST_APPHOOK(vespalib::ZCurveTest);
diff --git a/vespalib/src/vespa/vespalib/.gitignore b/vespalib/src/vespa/vespalib/.gitignore
new file mode 100644
index 00000000000..fae8ae72fc9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/.gitignore
@@ -0,0 +1,3 @@
+*.so.*
+.depend
+Makefile
diff --git a/vespalib/src/vespa/vespalib/CMakeLists.txt b/vespalib/src/vespa/vespalib/CMakeLists.txt
new file mode 100644
index 00000000000..db9ac232190
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib
+ SOURCES
+ $<TARGET_OBJECTS:vespalib_vespalib_component>
+ $<TARGET_OBJECTS:vespalib_vespalib_data>
+ $<TARGET_OBJECTS:vespalib_vespalib_data_slime>
+ $<TARGET_OBJECTS:vespalib_vespalib_eval>
+ $<TARGET_OBJECTS:vespalib_vespalib_geo>
+ $<TARGET_OBJECTS:vespalib_vespalib_io>
+ $<TARGET_OBJECTS:vespalib_vespalib_net>
+ $<TARGET_OBJECTS:vespalib_vespalib_objects>
+ $<TARGET_OBJECTS:vespalib_vespalib_stllike>
+ $<TARGET_OBJECTS:vespalib_vespalib_testkit>
+ $<TARGET_OBJECTS:vespalib_vespalib_text>
+ $<TARGET_OBJECTS:vespalib_vespalib_trace>
+ $<TARGET_OBJECTS:vespalib_vespalib_util>
+ $<TARGET_OBJECTS:vespalib_vespalib_websocket>
+ $<TARGET_OBJECTS:vespalib_vespalib_xxhash>
+ INSTALL lib64
+ DEPENDS
+ vespalib_vespalib_tensor
+ vespalib_vespalib_test
+)
diff --git a/vespalib/src/vespa/vespalib/component/.gitignore b/vespalib/src/vespa/vespalib/component/.gitignore
new file mode 100644
index 00000000000..75fec0dcbdd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/component/.gitignore
@@ -0,0 +1,4 @@
+*.So
+.depend
+Makefile
+getversion
diff --git a/vespalib/src/vespa/vespalib/component/CMakeLists.txt b/vespalib/src/vespa/vespalib/component/CMakeLists.txt
new file mode 100644
index 00000000000..36dba10f7d3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/component/CMakeLists.txt
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_component OBJECT
+ SOURCES
+ version.cpp
+ versionspecification.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/component/version.cpp b/vespalib/src/vespa/vespalib/component/version.cpp
new file mode 100644
index 00000000000..ea8f3fdbde9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/component/version.cpp
@@ -0,0 +1,145 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "version.h"
+#include <vespa/vespalib/util/exception.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <ctype.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+
+using vespalib::stringref;
+
+namespace vespalib {
+
+
+void
+Version::initialize()
+{
+ asciistream buf;
+ if (_qualifier != "") {
+ buf << _major << "." << _minor << "." << _micro << "." << _qualifier;
+ } else if (_micro > 0) {
+ buf << _major << "." << _minor << "." << _micro;
+ } else if (_minor > 0) {
+ buf << _major << "." << _minor;
+ } else if (_major > 0) {
+ buf << _major;
+ }
+ _stringValue = buf.str();
+ if ((_major < 0) || (_minor < 0) || (_micro < 0) || !_qualifier.empty()) {
+ verifySanity();
+ }
+}
+
+void
+Version::verifySanity()
+{
+ if (_major < 0)
+ throw IllegalArgumentException("Negative major in " + _stringValue);
+
+ if (_minor < 0)
+ throw IllegalArgumentException("Negative minor in " + _stringValue);
+
+ if (_micro < 0)
+ throw IllegalArgumentException("Negative micro in " + _stringValue);
+
+ if (_qualifier != "") {
+ for (size_t i = 0; i < _qualifier.length(); i++) {
+ unsigned char c = _qualifier[i];
+ if (! isalnum(c)) {
+ throw IllegalArgumentException("Error in " + _stringValue + ": Invalid character in qualifier");
+ }
+ }
+ }
+}
+
+static int parseInteger(const stringref & input) __attribute__((noinline));
+static int parseInteger(const stringref & input)
+{
+ const char *s = input.c_str();
+ unsigned char firstDigit = s[0];
+ if (!isdigit(firstDigit))
+ throw IllegalArgumentException("integer must start with a digit");
+ char *ep;
+ long ret = strtol(s, &ep, 10);
+ if (ret > INT_MAX || ret < 0) {
+ throw IllegalArgumentException("integer out of range");
+ }
+ if (s + input.size() != ep ) {
+ throw IllegalArgumentException("extra characters after integer");
+ }
+ return ret;
+}
+
+
+Version::Version(const string & versionString)
+ : _major(0),
+ _minor(0),
+ _micro(0),
+ _qualifier(),
+ _stringValue(versionString)
+{
+ if (versionString != "") {
+ stringref r(versionString.c_str(), versionString.size());
+ stringref::size_type dot(r.find('.'));
+ stringref majorS(r.substr(0, dot));
+
+ if ( !majorS.empty()) {
+ _major = parseInteger(majorS);
+ if (dot == stringref::npos) return;
+ r = r.substr(dot + 1);
+ dot = r.find('.');
+ stringref minorS(r.substr(0, dot));
+ if ( !minorS.empty()) {
+ _minor = parseInteger(minorS);
+
+ if (dot == stringref::npos) return;
+ r = r.substr(dot + 1);
+ dot = r.find('.');
+ stringref microS(r.substr(0, dot));
+ if ( ! microS.empty()) {
+ _micro = parseInteger(microS);
+
+ if (dot == stringref::npos) return;
+ r = r.substr(dot + 1);
+ dot = r.find('.');
+ if (dot == stringref::npos) {
+ _qualifier = r;
+ } else {
+ throw IllegalArgumentException("too many dot-separated components in version string '" + versionString + "'");
+ }
+ }
+ }
+ }
+ }
+ verifySanity();
+}
+
+bool
+Version::equals(const Version& other) const
+{
+ if (_major != other._major) return false;
+ if (_minor != other._minor) return false;
+ if (_micro != other._micro) return false;
+ if (_qualifier != other._qualifier) return false;
+
+ return true;
+}
+
+int
+Version::compareTo(const Version& other) const
+{
+ int result = getMajor() - other.getMajor();
+ if (result != 0) return result;
+
+ result = getMinor() - other.getMinor();
+ if (result != 0) return result;
+
+ result = getMicro() - other.getMicro();
+ if (result != 0) return result;
+
+ return getQualifier().compare(other.getQualifier());
+}
+
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/component/version.h b/vespalib/src/vespa/vespalib/component/version.h
new file mode 100644
index 00000000000..e637e46ff90
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/component/version.h
@@ -0,0 +1,151 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+/**
+ * @brief A component version identifier.
+ *
+ * Version identifiers have four components.
+ * <ol>
+ * <li>Major version. A non-negative integer.</li>
+ * <li>Minor version. A non-negative integer.</li>
+ * <li>Micro version. A non-negative integer.</li>
+ * <li>Qualifier. An ascii text string. See <code>Version(String)</code> for the
+ * format of the qualifier string.</li>
+ * </ol>
+ * <p>
+ * An unspecified component is equivalent to 0 (or the empty string for qualifier).<br>
+ * <p>
+ * <code>Version</code> objects are immutable.
+ *
+ * @author arnej27959
+ * @author bratseth
+ **/
+class Version
+{
+public:
+ typedef vespalib::string string;
+private:
+ int _major;
+ int _minor;
+ int _micro;
+ string _qualifier;
+ string _stringValue;
+
+ /**
+ * Must be called on construction after the component values are set.
+ * Creates the underlying version string, and verifies that values are sound.
+ */
+ void initialize();
+ /**
+ * Is called after initialization if there are problems.
+ * @throws IllegalArgumentException If the numerical components are negative
+ * or the qualifier string is invalid.
+ */
+ void verifySanity() __attribute__((noinline));
+
+public:
+ /**
+ * @brief Creates a version identifier from the specified components.
+ *
+ * @param major major component of the version identifier, 0 if not specified
+ * @param minor minor component of the version identifier, 0 if not specified
+ * @param micro micro component of the version identifier, 0 if not specified
+ * @param qualifier Qualifier component of the version identifier, empty string if unspecified
+ * @throws IllegalArgumentException if the numerical components are negative
+ * the qualifier string contains non-word/digit-characters
+ */
+
+ Version(int major = 0, int minor = 0, int micro = 0, const string & qualifier = "")
+ : _major(major),
+ _minor(minor),
+ _micro(micro),
+ _qualifier(qualifier),
+ _stringValue()
+ {
+ initialize();
+ }
+
+ /**
+ * @brief Creates a version identifier from the specified string.
+ *
+ * Version strings follows this grammar (same as Osgi versions):
+ *
+ * <pre>
+ * version ::= major('.'minor('.'micro('.'qualifier)?)?)?
+ * major ::= digit+
+ * minor ::= digit+
+ * micro ::= digit+
+ * qualifier ::= (alpha|digit|'_'|'-')+
+ * digit ::= [0..9]
+ * alpha ::= [a..zA..Z]
+ * </pre>
+ *
+ * @param versionString String representation of the version identifier
+ * @throws IllegalArgumentException If <code>version</code> is improperly
+ * formatted.
+ */
+ Version(const string & versionString);
+
+ /** @brief Returns the major component of this version, or 0 if not specified */
+ int getMajor() const { return _major; }
+
+ /** @brief Returns the minor component of this version, or 0 if not specified */
+ int getMinor() const { return _minor; }
+
+ /** @brief Returns the micro component of this version, or 0 if not specified */
+ int getMicro() const { return _micro; }
+
+ /** @brief Returns the qualifier component of this version, or "" if not specified */
+ const string & getQualifier() const { return _qualifier; }
+
+ /**
+ * @brief Returns the string representation of this version identifier as major.minor.micro,
+ * or major.minor.micro.qualifier if a non-empty qualifier was specified.
+ */
+ const string & toString() const { return _stringValue; }
+
+ /**
+ * @brief Compares this Version object to another.
+ *
+ * A version is considered to be <b>equal to </b> another version if the
+ * major, minor and micro components are equal and the qualifier component
+ * has the same value.
+ *
+ * @param other The <code>Version</code> object to be compared.
+ * @return true if equal, false otherwise
+ */
+ bool equals(const Version& other) const;
+ bool operator==(const Version& other) const { return equals(other); }
+
+ /**
+ * @brief Compares this Version object to another.
+ *
+ * A version is considered to be <b>less than </b> another version if its
+ * major component is less than the other version's major component, or the
+ * major components are equal and its minor component is less than the other
+ * version's minor component, or the major and minor components are equal
+ * and its micro component is less than the other version's micro component,
+ * or the major, minor and micro components are equal and it's qualifier
+ * component is less than the other version's qualifier component (using
+ * <code>string.compare</code>).
+ *
+ * A version is considered to be <b>equal to</b> another version
+ * if the major, minor and micro components are equal and the
+ * qualifier component has the same string value.
+ *
+ * @param other the <code>Version</code> object compared.
+ * @return A negative integer, zero, or a positive integer if this object is
+ * less than, equal to, or greater than the specified <code>Version</code> object.
+ * @throws ClassCastException if the specified object is not a <code>Version</code>.
+ */
+ int compareTo(const Version& other) const;
+ bool operator<(const Version& other) const { return compareTo(other) < 0; }
+
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/component/versionspecification.cpp b/vespalib/src/vespa/vespalib/component/versionspecification.cpp
new file mode 100644
index 00000000000..af200b21caa
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/component/versionspecification.cpp
@@ -0,0 +1,148 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "version.h"
+#include "versionspecification.h"
+#include <vespa/vespalib/util/exception.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/text/stringtokenizer.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <ctype.h>
+
+namespace vespalib {
+
+void
+VersionSpecification::initialize()
+{
+ asciistream buf;
+
+ if (_major == UNSPECIFIED) { buf << "*"; } else { buf << _major; }
+ buf << ".";
+ if (_minor == UNSPECIFIED) { buf << "*"; } else { buf << _minor; }
+ buf << ".";
+ if (_micro == UNSPECIFIED) { buf << "*"; } else { buf << _micro; }
+
+ if (_qualifier != "") {
+ buf << "." << _qualifier;
+ }
+ _stringValue = buf.str();
+
+ if ((_major < UNSPECIFIED) || (_minor < UNSPECIFIED) || (_micro < UNSPECIFIED) || !_qualifier.empty()) {
+ verifySanity();
+ }
+}
+
+void
+VersionSpecification::verifySanity()
+{
+
+ if (_major < UNSPECIFIED)
+ throw IllegalArgumentException("Negative major in " + _stringValue);
+
+ if (_minor < UNSPECIFIED)
+ throw IllegalArgumentException("Negative minor in " + _stringValue);
+
+ if (_micro < UNSPECIFIED)
+ throw IllegalArgumentException("Negative micro in " + _stringValue);
+
+ if (_qualifier != "") {
+ for (size_t i = 0; i < _qualifier.length(); i++) {
+ unsigned char c = _qualifier[i];
+ if (! isalnum(c)) {
+ throw IllegalArgumentException("Error in " + _stringValue + ": Invalid character in qualifier");
+ }
+ }
+ }
+}
+
+static int parseInteger(const VersionSpecification::string & input) __attribute__((noinline));
+static int parseInteger(const VersionSpecification::string & input)
+{
+ const char *s = input.c_str();
+ unsigned char firstDigit = s[0];
+ if (!isdigit(firstDigit))
+ throw IllegalArgumentException("integer must start with a digit");
+ char *ep;
+ long ret = strtol(s, &ep, 10);
+ if (ret > INT_MAX || ret < 0) {
+ throw IllegalArgumentException("integer out of range");
+ }
+ if (*ep != '\0') {
+ throw IllegalArgumentException("extra characters after integer");
+ }
+ return ret;
+}
+
+
+VersionSpecification::VersionSpecification(const string & versionString)
+ : _major(UNSPECIFIED),
+ _minor(UNSPECIFIED),
+ _micro(UNSPECIFIED),
+ _qualifier(),
+ _stringValue()
+{
+ if (versionString != "") {
+ StringTokenizer components(versionString, ".", ""); // Split on dot
+
+ if (components.size() > 0)
+ _major = parseInteger(components[0]);
+ if (components.size() > 1)
+ _minor = parseInteger(components[1]);
+ if (components.size() > 2)
+ _micro = parseInteger(components[2]);
+ if (components.size() > 3)
+ _qualifier = components[3];
+ if (components.size() > 4)
+ throw IllegalArgumentException("too many dot-separated components in version string");
+ }
+ initialize();
+}
+
+bool
+VersionSpecification::equals(const VersionSpecification& other) const
+{
+ if (_major != other._major) return false;
+ if (_minor != other._minor) return false;
+ if (_micro != other._micro) return false;
+ if (_qualifier != other._qualifier) return false;
+
+ return true;
+}
+
+int
+VersionSpecification::compareTo(const VersionSpecification& other) const
+{
+ int result = _major - other._major;
+ if (result != 0) return result;
+
+ result = _minor - other._minor;
+ if (result != 0) return result;
+
+ result = _micro - other._micro;
+ if (result != 0) return result;
+
+ return _qualifier.compare(other._qualifier);
+}
+
+bool
+VersionSpecification::matches(int spec, int v) const
+{
+ if (spec == VersionSpecification::UNSPECIFIED) return true;
+ return (spec == v);
+}
+
+bool
+VersionSpecification::matches(const Version& version) const
+{
+ if (matches(_major, version.getMajor()) &&
+ matches(_minor, version.getMinor()) &&
+ matches(_micro, version.getMicro()))
+ {
+ return getQualifier() == version.getQualifier();
+ } else {
+ return false;
+ }
+}
+
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/component/versionspecification.h b/vespalib/src/vespa/vespalib/component/versionspecification.h
new file mode 100644
index 00000000000..f19af4c429f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/component/versionspecification.h
@@ -0,0 +1,184 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/component/version.h>
+
+namespace vespalib {
+
+/**
+ * @brief A component version specification.
+ *
+ * Version specifications have four components.
+ * <ol>
+ * <li>Major version. A non-negative integer.</li>
+ * <li>Minor version. A non-negative integer.</li>
+ * <li>Micro version. A non-negative integer.</li>
+ * <li>Qualifier. An ascii text string. See <code>Version(String)</code> for the
+ * format of the qualifier string.</li>
+ * </ol>
+ * <p>
+ * An unspecified component is equivalent to 0 (or the empty string for qualifier).<br>
+ * <p>
+ * <code>VersionSpecification</code> objects are immutable.
+ *
+ * @author arnej27959
+ * @author bratseth
+ **/
+class VersionSpecification
+{
+public:
+ typedef Version::string string;
+private:
+ int _major;
+ int _minor;
+ int _micro;
+ string _qualifier;
+ string _stringValue;
+
+ /**
+ * Must be called on construction after the component values are set.
+ * Creates the underlying version string, and verifies that values are sound.
+ */
+ void initialize();
+ /**
+ * Is called after initialization if there are problems.
+ * @throws IllegalArgumentException If the numerical components are negative
+ * or the qualifier string is invalid.
+ */
+ void verifySanity() __attribute__((noinline));
+
+public:
+ /** @brief constant signifying an unspecified component */
+ enum {
+ UNSPECIFIED = -1
+ };
+
+ /**
+ * @brief Creates a version specification from the specified components.
+ *
+ * @param major major component of the version specification
+ * @param minor minor component of the version specification
+ * @param micro micro component of the version specification
+ * @param qualifier Qualifier component of the version specification
+ * @throws IllegalArgumentException if the numerical components are negative
+ * the qualifier string contains non-word/digit-characters, or
+ * an earlier component is not specified but a later one is
+ */
+
+ VersionSpecification(int major = UNSPECIFIED,
+ int minor = UNSPECIFIED,
+ int micro = UNSPECIFIED,
+ const string & qualifier = "")
+ : _major(major),
+ _minor(minor),
+ _micro(micro),
+ _qualifier(qualifier),
+ _stringValue()
+ {
+ initialize();
+ }
+
+ /**
+ * @brief Creates a version specification from the specified string.
+ *
+ * Version strings follows this grammar (same as Osgi versions):
+ *
+ * <pre>
+ * version ::= major('.'minor('.'micro('.'qualifier)?)?)?
+ * major ::= digit+
+ * minor ::= digit+
+ * micro ::= digit+
+ * qualifier ::= (alpha|digit|'_'|'-')+
+ * digit ::= [0..9]
+ * alpha ::= [a..zA..Z]
+ * </pre>
+ *
+ * @param versionString String representation of the version specification
+ * @throws IllegalArgumentException If <code>version</code> is improperly
+ * formatted.
+ */
+ VersionSpecification(const string & versionString);
+
+ /** @brief Returns the major component of this version, or 0 if not specified */
+ int getMajor() const { return _major==UNSPECIFIED ? 0 : _major; }
+
+ /** @brief Returns the minor component of this version, or 0 if not specified */
+ int getMinor() const { return _minor==UNSPECIFIED ? 0 : _minor; }
+
+ /** @brief Returns the micro component of this version, or 0 if not specified */
+ int getMicro() const { return _micro==UNSPECIFIED ? 0 : _micro; }
+
+ /** @brief Returns the qualifier component of this version, or "" if not specified */
+ const string & getQualifier() const { return _qualifier; }
+
+ /** @brief Returns the specified major component, which may be UNSPECIFIED */
+ int getSpecifiedMajor() const { return _major; }
+
+ /** @brief Returns the specified minor component, which may be UNSPECIFIED */
+ int getSpecifiedMinor() const { return _minor; }
+
+ /** @brief Returns the specified micro component, which may be UNSPECIFIED */
+ int getSpecifiedMicro() const { return _micro; }
+
+ /**
+ * @brief Returns the string representation of this version specification as major.minor.micro,
+ * or major.minor.micro.qualifier if a non-empty qualifier was specified.
+ */
+ const string & toString() const { return _stringValue; }
+
+ /**
+ * @brief Compares this <code>VersionSpecification</code> to another.
+ *
+ * A versionspecification is considered to be <b>equal to </b> another versionspecification if the
+ * major, minor and micro components are equal and the qualifier component
+ * has the same value.
+ * <p>
+ *
+ * @param other The <code>VersionSpecification</code> object to be compared.
+ * @return true if equal, false otherwise
+ */
+ bool equals(const VersionSpecification& other) const;
+ bool operator==(const VersionSpecification& other) const { return equals(other); }
+
+ /**
+ * @brief Compares this <code>VersionSpecification</code> object to another.
+ *
+ * A version is considered to be <b>less than </b> another version if its
+ * major component is less than the other version's major component, or the
+ * major components are equal and its minor component is less than the other
+ * version's minor component, or the major and minor components are equal
+ * and its micro component is less than the other version's micro component,
+ * or the major, minor and micro components are equal and it's qualifier
+ * component is less than the other version's qualifier component (using
+ * <code>String.compareTo</code>).
+ * <p>
+ * A version is considered to be <b>equal to</b> another version if the
+ * major, minor and micro components are equal and the qualifier component
+ * has the same string value.
+ *
+ * @param other the <code>VersionSpecification</code> object compared.
+ * @return A negative integer, zero, or a positive integer if this object is
+ * less than, equal to, or greater than the specified <code>VersionSpecification</code> object.
+ * @throws ClassCastException if the specified object is not a <code>VersionSpecification</code>.
+ */
+ int compareTo(const VersionSpecification& other) const;
+ bool operator<(const VersionSpecification& other) const { return compareTo(other) < 0; }
+
+
+ /**
+ * @brief Returns true if the given Version matches this specification.
+ *
+ * A Version identfier matches if all the numeric components
+ * specified are the same as in the version, and qualifiers
+ * are either both empty or set to the same value. I.e, a version which
+ * includes a qualifier will only match exactly and will never
+ * return true from a request for an unspecified qualifier.
+ */
+ bool matches(const Version& version) const;
+
+private:
+ bool matches(int spec, int v) const;
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/cppunit/.gitignore b/vespalib/src/vespa/vespalib/cppunit/.gitignore
new file mode 100644
index 00000000000..583460ae288
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/cppunit/.gitignore
@@ -0,0 +1,3 @@
+*.So
+.depend
+Makefile
diff --git a/vespalib/src/vespa/vespalib/data/CMakeLists.txt b/vespalib/src/vespa/vespalib/data/CMakeLists.txt
new file mode 100644
index 00000000000..6752d1c99cf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_data OBJECT
+ SOURCES
+ memorydatastore.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/data/memorydatastore.cpp b/vespalib/src/vespa/vespalib/data/memorydatastore.cpp
new file mode 100644
index 00000000000..74443ed7603
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/memorydatastore.cpp
@@ -0,0 +1,56 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/data/memorydatastore.h>
+
+namespace vespalib {
+
+MemoryDataStore::MemoryDataStore(size_t initialSize) :
+ _buffers()
+{
+ _buffers.reserve(24);
+ Buffer buf;
+ _buffers.push_back(buf);
+ _buffers.back().reserve(initialSize);
+}
+
+MemoryDataStore::~MemoryDataStore()
+{
+}
+
+MemoryDataStore::Reference
+MemoryDataStore::push_back(const void * data, const size_t sz)
+{
+ const Buffer & b = _buffers.back();
+ if (sz > (b.capacity() - b.size())) {
+ size_t newSize(std::max(sz, _buffers.back().size()*2));
+ Buffer buf;
+ assert(_buffers.capacity() >= (_buffers.size() + 1));
+ _buffers.push_back(buf);
+ _buffers.back().reserve(newSize);
+ }
+ Buffer & buf = _buffers.back();
+ const char * start = static_cast<const char *>(data);
+ for (uint32_t i(0); i < sz; i++) {
+ buf.push_back_fast(start[i]);
+ }
+ return Reference(&buf[buf.size() - sz]);
+}
+
+VariableSizeVector::VariableSizeVector(size_t initialSize) :
+ _vector(),
+ _store(initialSize)
+{
+}
+
+VariableSizeVector::~VariableSizeVector()
+{
+}
+
+VariableSizeVector::Reference
+VariableSizeVector::push_back(const void * data, const size_t sz)
+{
+ MemoryDataStore::Reference ptr(_store.push_back(data, sz));
+ _vector.push_back(Reference(ptr.data(), sz));
+ return _vector.back();
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/memorydatastore.h b/vespalib/src/vespa/vespalib/data/memorydatastore.h
new file mode 100644
index 00000000000..aa21d0a4a34
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/memorydatastore.h
@@ -0,0 +1,119 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/util/array.h>
+#include <vespa/vespalib/util/noncopyable.hpp>
+
+namespace vespalib {
+
+/**
+ * This is a backing store intended for small size variable length data elemets.
+ * It has the important property that once an object has been allocated it does not move in memory.
+ * It will start of by allocating one backing buffer and items stored will be appended here.
+ * When limit is exceeded a new buffer is allocated with twice the size of the previous and so it goes.
+ **/
+class MemoryDataStore : public noncopyable {
+public:
+ class Reference {
+ public:
+ Reference(void * data_) : _data(data_) { }
+ void * data() { return _data; }
+ const char * c_str() const { return static_cast<const char *>(_data); }
+ private:
+ void * _data;
+ };
+ MemoryDataStore(size_t initialSize=256);
+ ~MemoryDataStore();
+ /**
+ * Will allocate space and copy the data in. The returned pointer will be valid
+ * for the lifetime of this object.
+ * @return A pointer/reference to the freshly stored object.
+ */
+ Reference push_back(const void * data, const size_t sz);
+ void swap(MemoryDataStore & rhs) { _buffers.swap(rhs._buffers); }
+ void clear() {
+ _buffers.clear();
+ }
+private:
+ typedef Array<char> Buffer;
+ std::vector<Buffer> _buffers;
+};
+
+class VariableSizeVector : public noncopyable
+{
+public:
+ class Reference {
+ public:
+ Reference(void * data_, size_t sz) : _data(data_), _sz(sz) { }
+ void * data() { return _data; }
+ const char * c_str() const { return static_cast<const char *>(_data); }
+ size_t size() const { return _sz; }
+ private:
+ void * _data;
+ size_t _sz;
+ };
+ class iterator {
+ public:
+ iterator(vespalib::Array<Reference> & v, size_t index) : _vector(&v), _index(index) {}
+ Reference & operator * () const { return (*_vector)[_index]; }
+ Reference * operator -> () const { return &(*_vector)[_index]; }
+ iterator & operator ++ () {
+ _index++;
+ return *this;
+ }
+ iterator operator ++ (int) {
+ iterator prev = *this;
+ ++(*this);
+ return prev;
+ }
+ bool operator==(const iterator& rhs) const { return (_index == rhs._index); }
+ bool operator!=(const iterator& rhs) const { return (_index != rhs._index); }
+ private:
+ vespalib::Array<Reference> * _vector;
+ size_t _index;
+ };
+ class const_iterator {
+ public:
+ const_iterator(const vespalib::Array<Reference> & v, size_t index) : _vector(&v), _index(index) {}
+ const Reference & operator * () const { return (*_vector)[_index]; }
+ const Reference * operator -> () const { return &(*_vector)[_index]; }
+ const_iterator & operator ++ () {
+ _index++;
+ return *this;
+ }
+ const_iterator operator ++ (int) {
+ const_iterator prev = *this;
+ ++(*this);
+ return prev;
+ }
+ bool operator==(const const_iterator& rhs) const { return (_index == rhs._index); }
+ bool operator!=(const const_iterator& rhs) const { return (_index != rhs._index); }
+ private:
+ const vespalib::Array<Reference> * _vector;
+ size_t _index;
+ };
+ VariableSizeVector(size_t initialSize=256);
+ ~VariableSizeVector();
+ iterator begin() { return iterator(_vector, 0); }
+ iterator end() { return iterator(_vector, size()); }
+ const_iterator begin() const { return const_iterator(_vector, 0); }
+ const_iterator end() const { return const_iterator(_vector, size()); }
+ Reference push_back(const void * data, const size_t sz);
+ Reference operator [] (uint32_t index) const { return _vector[index]; }
+ size_t size() const { return _vector.size(); }
+ bool empty() const { return _vector.empty(); }
+ void swap(VariableSizeVector & rhs) {
+ _vector.swap(rhs._vector);
+ _store.swap(rhs._store);
+ }
+ void clear() {
+ _vector.clear();
+ _store.clear();
+ }
+private:
+ vespalib::Array<Reference> _vector;
+ MemoryDataStore _store;
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/.gitignore b/vespalib/src/vespa/vespalib/data/slime/.gitignore
new file mode 100644
index 00000000000..99978696b36
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/.gitignore
@@ -0,0 +1,5 @@
+*.So
+.depend
+Makefile
+/slime_me.h
+/slime_me.cpp
diff --git a/vespalib/src/vespa/vespalib/data/slime/CMakeLists.txt b/vespalib/src/vespa/vespalib/data/slime/CMakeLists.txt
new file mode 100644
index 00000000000..e1749627ac5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_data_slime OBJECT
+ SOURCES
+ array_traverser.cpp
+ array_value.cpp
+ basic_value.cpp
+ basic_value_factory.cpp
+ binary_format.cpp
+ buffered_input.cpp
+ buffered_output.cpp
+ convenience.cpp
+ cursor.cpp
+ empty_value_factory.cpp
+ inject.cpp
+ inserter.cpp
+ inspector.cpp
+ json_format.cpp
+ memory.cpp
+ named_symbol_inserter.cpp
+ named_symbol_lookup.cpp
+ nix_value.cpp
+ object_traverser.cpp
+ object_value.cpp
+ output.cpp
+ resolved_symbol.cpp
+ root_value.cpp
+ simple_buffer.cpp
+ slime.cpp
+ stored_memory.cpp
+ strfmt.cpp
+ symbol.cpp
+ symbol_inserter.cpp
+ symbol_lookup.cpp
+ symbol_table.cpp
+ type.cpp
+ value.cpp
+ value_factory.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/data/slime/array_traverser.cpp b/vespalib/src/vespa/vespalib/data/slime/array_traverser.cpp
new file mode 100644
index 00000000000..7165829bf1a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/array_traverser.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "array_traverser.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/array_traverser.h b/vespalib/src/vespa/vespalib/data/slime/array_traverser.h
new file mode 100644
index 00000000000..74c595856b7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/array_traverser.h
@@ -0,0 +1,20 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "inspector.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Interface used when traversing all the entries of an array value.
+ **/
+struct ArrayTraverser {
+ virtual void entry(size_t idx, const Inspector &inspector) = 0;
+ virtual ~ArrayTraverser() {}
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/array_value.cpp b/vespalib/src/vespa/vespalib/data/slime/array_value.cpp
new file mode 100644
index 00000000000..1d2fccc2f7a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/array_value.cpp
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "array_value.h"
+#include "array_traverser.h"
+#include "empty_value_factory.h"
+#include "basic_value_factory.h"
+
+namespace vespalib {
+namespace slime {
+
+void
+ArrayValue::traverse(ArrayTraverser &at) const {
+ for (size_t i = 0; i < _values.size(); ++i) {
+ at.entry(i, *_values[i]);
+ }
+}
+
+
+Cursor &
+ArrayValue::addArray() {
+ return addLeaf(ArrayValueFactory(_symbolTable));
+}
+
+Cursor &
+ArrayValue::addObject() {
+ return addLeaf(ObjectValueFactory(_symbolTable));
+}
+
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/array_value.h b/vespalib/src/vespa/vespalib/data/slime/array_value.h
new file mode 100644
index 00000000000..b4f17015ef6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/array_value.h
@@ -0,0 +1,58 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value.h"
+#include "nix_value.h"
+#include "value_factory.h"
+#include "symbol_table.h"
+#include <vector>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Class representing a collection of ordered values that can be
+ * looked up by index.
+ **/
+class ArrayValue : public Value
+{
+private:
+ SymbolTable &_symbolTable;
+ Stash &_stash;
+ std::vector<Value*> _values;
+
+protected:
+ virtual Cursor &addLeaf(const ValueFactory &input) {
+ Value *value = input.create(_stash);
+ _values.push_back(value);
+ return *value;
+ }
+
+public:
+ ArrayValue(SymbolTable &table, Stash & stash) : _symbolTable(table), _stash(stash), _values() {}
+ ArrayValue(const ArrayValue &) = delete;
+ ArrayValue &operator=(const ArrayValue &) = delete;
+
+ virtual Type type() const { return ARRAY::instance; }
+ virtual size_t children() const { return _values.size(); }
+ virtual size_t entries() const { return _values.size(); }
+ virtual void traverse(ArrayTraverser &at) const;
+
+ virtual Cursor &operator[](size_t idx) const {
+ if (idx < _values.size()) {
+ return *_values[idx];
+ }
+ return *NixValue::invalid();
+ }
+
+ virtual Cursor &addArray();
+ virtual Cursor &addObject();
+
+ virtual ~ArrayValue() { }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/basic_value.cpp b/vespalib/src/vespa/vespalib/data/slime/basic_value.cpp
new file mode 100644
index 00000000000..0acf882d359
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/basic_value.cpp
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "basic_value.h"
+
+namespace vespalib {
+namespace slime {
+
+namespace {
+
+Memory
+store(Memory m, Stash & stash)
+{
+ char * buf = stash.alloc(m.size);
+ memcpy(buf, m.data, m.size);
+ return Memory(buf, m.size);
+}
+
+}
+
+BasicStringValue::BasicStringValue(Memory m, Stash & stash)
+ : _value(store(m, stash))
+{
+}
+
+BasicDataValue::BasicDataValue(Memory m, Stash & stash)
+ : _value(store(m, stash))
+{
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/basic_value.h b/vespalib/src/vespa/vespalib/data/slime/basic_value.h
new file mode 100644
index 00000000000..67d5655a6a9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/basic_value.h
@@ -0,0 +1,69 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value.h"
+#include "memory.h"
+#include <vespa/vespalib/util/traits.h>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Classes representing a single basic value.
+ **/
+class BasicBoolValue : public Value {
+ bool _value;
+public:
+ BasicBoolValue(bool bit) : _value(bit) {}
+ virtual bool asBool() const { return _value; }
+ virtual Type type() const { return BOOL::instance; }
+};
+
+class BasicLongValue : public Value {
+ int64_t _value;
+public:
+ BasicLongValue(int64_t l) : _value(l) {}
+ virtual int64_t asLong() const { return _value; }
+ virtual double asDouble() const { return _value; }
+ virtual Type type() const { return LONG::instance; }
+};
+
+class BasicDoubleValue : public Value {
+ double _value;
+public:
+ BasicDoubleValue(double d) : _value(d) {}
+ virtual double asDouble() const { return _value; }
+ virtual int64_t asLong() const { return _value; }
+ virtual Type type() const { return DOUBLE::instance; }
+};
+
+class BasicStringValue : public Value {
+ Memory _value;
+public:
+ BasicStringValue(Memory str, Stash & stash);
+ BasicStringValue(const BasicStringValue &) = delete;
+ BasicStringValue & operator = (const BasicStringValue &) = delete;
+ virtual Memory asString() const { return _value; }
+ virtual Type type() const { return STRING::instance; }
+};
+
+class BasicDataValue : public Value {
+ Memory _value;
+public:
+ BasicDataValue(Memory data, Stash & stash);
+ BasicDataValue(const BasicDataValue &) = delete;
+ BasicDataValue & operator = (const BasicDataValue &) = delete;
+ virtual Memory asData() const { return _value; }
+ virtual Type type() const { return DATA::instance; }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
+VESPA_CAN_SKIP_DESTRUCTION(vespalib::slime::BasicBoolValue);
+VESPA_CAN_SKIP_DESTRUCTION(vespalib::slime::BasicLongValue);
+VESPA_CAN_SKIP_DESTRUCTION(vespalib::slime::BasicDoubleValue);
+VESPA_CAN_SKIP_DESTRUCTION(vespalib::slime::BasicStringValue);
+VESPA_CAN_SKIP_DESTRUCTION(vespalib::slime::BasicDataValue);
diff --git a/vespalib/src/vespa/vespalib/data/slime/basic_value_factory.cpp b/vespalib/src/vespa/vespalib/data/slime/basic_value_factory.cpp
new file mode 100644
index 00000000000..dec4b789921
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/basic_value_factory.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "basic_value_factory.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/basic_value_factory.h b/vespalib/src/vespa/vespalib/data/slime/basic_value_factory.h
new file mode 100644
index 00000000000..25281612257
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/basic_value_factory.h
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value_factory.h"
+#include "basic_value.h"
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace slime {
+
+struct BoolValueFactory : public ValueFactory {
+ bool input;
+ BoolValueFactory(bool in) : input(in) {}
+ Value *create(Stash & stash) const override { return & stash.create<BasicBoolValue>(input); }
+};
+
+struct LongValueFactory : public ValueFactory {
+ int64_t input;
+ LongValueFactory(int64_t in) : input(in) {}
+ Value *create(Stash & stash) const override { return & stash.create<BasicLongValue>(input); }
+};
+
+struct DoubleValueFactory : public ValueFactory {
+ double input;
+ DoubleValueFactory(double in) : input(in) {}
+ Value *create(Stash & stash) const override { return & stash.create<BasicDoubleValue>(input); }
+};
+
+struct StringValueFactory : public ValueFactory {
+ Memory input;
+ StringValueFactory(Memory in) : input(in) {}
+ Value *create(Stash & stash) const override { return & stash.create<BasicStringValue>(input, stash); }
+};
+
+struct DataValueFactory : public ValueFactory {
+ Memory input;
+ DataValueFactory(Memory in) : input(in) {}
+ Value *create(Stash & stash) const override { return & stash.create<BasicDataValue>(input, stash); }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/binary_format.cpp b/vespalib/src/vespa/vespalib/data/slime/binary_format.cpp
new file mode 100644
index 00000000000..d3026211c61
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/binary_format.cpp
@@ -0,0 +1,265 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "binary_format.h"
+#include "inserter.h"
+#include "slime.h"
+
+namespace vespalib {
+namespace slime {
+
+namespace binary_format {
+
+struct BinaryEncoder : public ArrayTraverser,
+ public ObjectSymbolTraverser
+{
+ BufferedOutput &out;
+ BinaryEncoder(BufferedOutput &out_in) : out(out_in) {}
+ void encodeNix() {
+ out.writeByte(NIX::ID);
+ }
+ void encodeBool(bool value) {
+ out.writeByte(encode_type_and_meta(BOOL::ID, value ? 1 : 0));
+ }
+ void encodeLong(int64_t value) {
+ write_type_and_bytes<false>(out, LONG::ID, encode_zigzag(value));
+ }
+ void encodeDouble(double value) {
+ write_type_and_bytes<true>(out, DOUBLE::ID, encode_double(value));
+ }
+ void encodeString(const Memory &memory) {
+ write_type_and_size(out, STRING::ID, memory.size);
+ out.writeBytes(memory.data, memory.size);
+ }
+ void encodeData(const Memory &memory) {
+ write_type_and_size(out, DATA::ID, memory.size);
+ out.writeBytes(memory.data, memory.size);
+ }
+ void encodeArray(const Inspector &inspector) {
+ ArrayTraverser &array_traverser = *this;
+ write_type_and_size(out, ARRAY::ID, inspector.children());
+ inspector.traverse(array_traverser);
+ }
+ void encodeObject(const Inspector &inspector) {
+ ObjectSymbolTraverser &object_traverser = *this;
+ write_type_and_size(out, OBJECT::ID, inspector.children());
+ inspector.traverse(object_traverser);
+ }
+ void encodeValue(const Inspector &inspector) {
+ switch (inspector.type().getId()) {
+ case NIX::ID: return encodeNix();
+ case BOOL::ID: return encodeBool(inspector.asBool());
+ case LONG::ID: return encodeLong(inspector.asLong());
+ case DOUBLE::ID: return encodeDouble(inspector.asDouble());
+ case STRING::ID: return encodeString(inspector.asString());
+ case DATA::ID: return encodeData(inspector.asData());
+ case ARRAY::ID: return encodeArray(inspector);
+ case OBJECT::ID: return encodeObject(inspector);
+ }
+ abort(); // should not be reached
+ }
+ void encodeSymbolTable(const Slime &slime) {
+ size_t numSymbols = slime.symbols();
+ write_cmpr_ulong(out, numSymbols);
+ for (size_t i = 0; i < numSymbols; ++i) {
+ Memory image = slime.inspect(Symbol(i));
+ write_cmpr_ulong(out, image.size);
+ out.writeBytes(image.data, image.size);
+ }
+ }
+ virtual void entry(size_t, const Inspector &inspector);
+ virtual void field(const Symbol &symbol, const Inspector &inspector);
+};
+
+void
+BinaryEncoder::entry(size_t, const Inspector &inspector)
+{
+ encodeValue(inspector);
+}
+
+void
+BinaryEncoder::field(const Symbol &symbol, const Inspector &inspector)
+{
+ write_cmpr_ulong(out, symbol.getValue());
+ encodeValue(inspector);
+}
+
+//-----------------------------------------------------------------------------
+
+struct DirectSymbols {
+ void hint_symbol_count(size_t) {}
+ bool add_symbol(Symbol symbol, size_t i, BufferedInput &in) {
+ if (symbol.getValue() != i) {
+ in.fail("duplicate symbols in symbol table");
+ return false;
+ }
+ return true;
+ }
+ Symbol map_symbol(Symbol symbol) const { return symbol; }
+};
+
+struct MappedSymbols {
+ std::vector<Symbol> symbol_mapping;
+ void hint_symbol_count(size_t n) {
+ symbol_mapping.reserve(n);
+ }
+ bool add_symbol(Symbol symbol, size_t, BufferedInput &) {
+ symbol_mapping.push_back(symbol);
+ return true;
+ }
+ Symbol map_symbol(Symbol symbol) const {
+ return (symbol.getValue() < symbol_mapping.size())
+ ? symbol_mapping[symbol.getValue()]
+ : symbol;
+ }
+};
+
+template <bool remap_symbols>
+struct SymbolHandler {
+ typedef typename std::conditional<remap_symbols, MappedSymbols, DirectSymbols>::type type;
+};
+
+template <bool remap_symbols>
+struct BinaryDecoder : SymbolHandler<remap_symbols>::type {
+
+ BufferedInput &in;
+
+ using SymbolHandler<remap_symbols>::type::hint_symbol_count;
+ using SymbolHandler<remap_symbols>::type::add_symbol;
+ using SymbolHandler<remap_symbols>::type::map_symbol;
+
+ BinaryDecoder(BufferedInput &input) : in(input) {}
+
+ Cursor &decodeNix(const Inserter &inserter) {
+ return inserter.insertNix();
+ }
+
+ Cursor &decodeBool(const Inserter &inserter, uint32_t meta) {
+ return inserter.insertBool(meta != 0);
+ }
+
+ Cursor &decodeLong(const Inserter &inserter, uint32_t meta) {
+ return inserter.insertLong(decode_zigzag(read_bytes<false>(in, meta)));
+ }
+
+ Cursor &decodeDouble(const Inserter &inserter, uint32_t meta) {
+ return inserter.insertDouble(decode_double(read_bytes<true>(in, meta)));
+ }
+
+ Cursor &decodeString(const Inserter &inserter, uint32_t meta) {
+ uint64_t size = read_size(in, meta);
+ return inserter.insertString(in.getBytes(size));
+ }
+
+ Cursor &decodeData(const Inserter &inserter, uint32_t meta) {
+ uint64_t size = read_size(in, meta);
+ return inserter.insertData(in.getBytes(size));
+ }
+
+ Cursor &decodeArray(const Inserter &inserter, uint32_t meta);
+
+ Cursor &decodeObject(const Inserter &inserter, uint32_t meta);
+
+ Cursor &decodeValue(const Inserter &inserter, uint32_t type, uint32_t meta) {
+ switch (type) {
+ case NIX::ID: return decodeNix(inserter);
+ case BOOL::ID: return decodeBool(inserter, meta);
+ case LONG::ID: return decodeLong(inserter, meta);
+ case DOUBLE::ID: return decodeDouble(inserter, meta);
+ case STRING::ID: return decodeString(inserter, meta);
+ case DATA::ID: return decodeData(inserter, meta);
+ case ARRAY::ID: return decodeArray(inserter, meta);
+ case OBJECT::ID: return decodeObject(inserter, meta);
+ }
+ abort(); // code should not be reached
+ }
+
+ void decodeValue(const Inserter &inserter) {
+ char byte = in.getByte();
+ Cursor &cursor = decodeValue(inserter,
+ decode_type(byte),
+ decode_meta(byte));
+ if (!cursor.valid()) {
+ in.fail("failed to decode value");
+ }
+ }
+
+ void decodeSymbolTable(Slime &slime) {
+ uint64_t numSymbols = read_cmpr_ulong(in);
+ hint_symbol_count(numSymbols);
+ for (size_t i = 0; i < numSymbols; ++i) {
+ uint64_t size = read_cmpr_ulong(in);
+ Memory image = in.getBytes(size);
+ Symbol symbol = slime.insert(image);
+ if (!add_symbol(symbol, i, in)) {
+ return;
+ }
+ }
+ }
+};
+
+template <bool remap_symbols>
+Cursor &
+BinaryDecoder<remap_symbols>::decodeArray(const Inserter &inserter, uint32_t meta)
+{
+ Cursor &cursor = inserter.insertArray();
+ ArrayInserter childInserter(cursor);
+ uint64_t size = read_size(in, meta);
+ for (size_t i = 0; i < size; ++i) {
+ decodeValue(childInserter);
+ }
+ return cursor;
+}
+
+template <bool remap_symbols>
+Cursor &
+BinaryDecoder<remap_symbols>::decodeObject(const Inserter &inserter, uint32_t meta)
+{
+ Cursor &cursor = inserter.insertObject();
+ uint64_t size = read_size(in, meta);
+ for (size_t i = 0; i < size; ++i) {
+ Symbol symbol(map_symbol(read_cmpr_ulong(in)));
+ ObjectSymbolInserter childInserter(cursor, symbol);
+ decodeValue(childInserter);
+ }
+ return cursor;
+}
+
+template <bool remap_symbols>
+size_t decode(const Memory &memory, Slime &slime, const Inserter &inserter) {
+ BufferedInput input(memory);
+ binary_format::BinaryDecoder<remap_symbols> decoder(input);
+ decoder.decodeSymbolTable(slime);
+ decoder.decodeValue(inserter);
+ if (input.failed() && !remap_symbols) {
+ slime.wrap("partial_result");
+ slime.get().setData("offending_input", input.getOffending());
+ slime.get().setString("error_message", input.getErrorMessage());
+ }
+ return input.getConsumed().size;
+}
+
+} // namespace vespalib::slime::binary_format
+
+void
+BinaryFormat::encode(const Slime &slime, Output &output)
+{
+ BufferedOutput out(output);
+ binary_format::BinaryEncoder encoder(out);
+ encoder.encodeSymbolTable(slime);
+ encoder.encodeValue(slime.get());
+}
+
+size_t
+BinaryFormat::decode(const Memory &memory, Slime &slime)
+{
+ return binary_format::decode<false>(memory, slime, SlimeInserter(slime));
+}
+
+size_t
+BinaryFormat::decode_into(const Memory &memory, Slime &slime, const Inserter &inserter)
+{
+ return binary_format::decode<true>(memory, slime, inserter);
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/binary_format.h b/vespalib/src/vespa/vespalib/data/slime/binary_format.h
new file mode 100644
index 00000000000..a49dc55a684
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/binary_format.h
@@ -0,0 +1,152 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "output.h"
+#include "type.h"
+#include "buffered_input.h"
+#include "buffered_output.h"
+#include "inserter.h"
+
+namespace vespalib {
+
+class Slime;
+
+namespace slime {
+
+struct BinaryFormat {
+ static void encode(const Slime &slime, Output &output);
+ static size_t decode(const Memory &memory, Slime &slime);
+ static size_t decode_into(const Memory &memory, Slime &slime, const Inserter &inserter);
+};
+
+namespace binary_format {
+
+inline uint64_t encode_zigzag(int64_t x) {
+ return ((x << 1) ^ (x >> 63));
+}
+
+inline int64_t decode_zigzag(uint64_t x) {
+ return ((x >> 1) ^ (-(x & 0x1)));
+}
+
+inline uint64_t encode_double(double x) {
+ union { uint64_t UINT64; double DOUBLE; } val;
+ val.DOUBLE = x;
+ return val.UINT64;
+}
+
+inline double decode_double(uint64_t x) {
+ union { uint64_t UINT64; double DOUBLE; } val;
+ val.UINT64 = x;
+ return val.DOUBLE;
+}
+
+inline char encode_type_and_meta(uint32_t type, uint32_t meta) {
+ return (((type & 0x7) | (meta << 3)) & 0xff);
+}
+
+inline uint32_t decode_type(uint32_t type_and_meta) {
+ return (type_and_meta & 0x7);
+}
+
+inline uint32_t decode_meta(uint32_t type_and_meta) {
+ return ((type_and_meta >> 3) & 0x1f);
+}
+
+inline uint32_t encode_cmpr_ulong(char *out,
+ uint64_t value)
+{
+ // pre-req: out has room for 10 bytes
+ char *pos = out;
+ char next = (value & 0x7f);
+ value >>= 7;
+ while (value != 0) {
+ *pos++ = (next | 0x80);
+ next = (value & 0x7f);
+ value >>= 7;
+ }
+ *pos++ = next;
+ return (pos - out);
+}
+
+inline void write_cmpr_ulong(BufferedOutput &out,
+ uint64_t value)
+{
+ out.commit(encode_cmpr_ulong(out.reserve(10), value));
+}
+
+inline uint64_t read_cmpr_ulong(BufferedInput &in)
+{
+ uint64_t next = in.getByte();
+ uint64_t value = (next & 0x7f);
+ int shift = 7;
+ while ((next & 0x80) != 0) {
+ next = in.getByte();
+ value |= ((next & 0x7f) << shift);
+ shift += 7;
+ }
+ return value;
+}
+
+inline void write_type_and_size(BufferedOutput &out,
+ uint32_t type, uint64_t size)
+{
+ char *start = out.reserve(11); // max size
+ char *pos = start;
+ if (size <= 30) {
+ *pos++ = encode_type_and_meta(type, size + 1);
+ } else {
+ *pos++ = encode_type_and_meta(type, 0);
+ pos += encode_cmpr_ulong(pos, size);
+ }
+ out.commit(pos - start);
+}
+
+inline uint64_t read_size(BufferedInput &in, uint32_t meta)
+{
+ return (meta == 0) ? read_cmpr_ulong(in) : (meta - 1);
+}
+
+template <bool top>
+inline void write_type_and_bytes(BufferedOutput &out,
+ uint32_t type, uint64_t bits)
+{
+ char *start = out.reserve(9); // max size
+ char *pos = start + 1;
+ while (bits != 0) {
+ if (top) {
+ *pos++ = (bits >> 56);
+ bits <<= 8;
+ } else {
+ *pos++ = (bits & 0xff);
+ bits >>= 8;
+ }
+ }
+ *start = encode_type_and_meta(type, pos - start - 1);
+ out.commit(pos - start);
+}
+
+template <bool top>
+inline uint64_t read_bytes(BufferedInput &in,
+ uint32_t bytes)
+{
+ uint64_t value = 0;
+ int shift = top ? 56 : 0;
+ for (uint32_t i = 0; i < bytes; ++i) {
+ uint64_t byte = in.getByte();
+ value |= ((byte & 0xff) << shift);
+ if (top) {
+ shift -= 8;
+ } else {
+ shift += 8;
+ }
+ }
+ return value;
+}
+
+} // namespace vespalib::slime::binary_format
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/buffered_input.cpp b/vespalib/src/vespa/vespalib/data/slime/buffered_input.cpp
new file mode 100644
index 00000000000..279f3de9f7e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/buffered_input.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "buffered_input.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/buffered_input.h b/vespalib/src/vespa/vespalib/data/slime/buffered_input.h
new file mode 100644
index 00000000000..5c7f8e1c86f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/buffered_input.h
@@ -0,0 +1,80 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "memory.h"
+#include <assert.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * A simple class tracking the consumption of input data. Also keeps
+ * track of data underflow.
+ **/
+class BufferedInput
+{
+private:
+ const char *_begin; // start of input
+ const char *_pos; // current read position
+ const char *_end; // end of input
+ const char *_fail; // read position at failure
+ std::string _msg; // error message of failure
+
+public:
+ explicit BufferedInput(const Memory &memory)
+ : _begin(memory.data), _pos(_begin), _end(_pos + memory.size),
+ _fail(0), _msg() {}
+
+ bool eof() const { return (_pos == _end); }
+
+ bool failed() const { return (_fail != 0); }
+
+ const std::string &getErrorMessage() const { return _msg; }
+
+ Memory getConsumed() const {
+ if (_fail != 0) {
+ return Memory();
+ }
+ return Memory(_begin, (_pos - _begin));
+ }
+
+ Memory getOffending() const {
+ if (_fail == 0) {
+ return Memory();
+ }
+ return Memory(_begin, (_fail - _begin));
+ }
+
+ void fail(const std::string &msg) {
+ if (_fail == 0) {
+ _fail = _pos;
+ _msg = msg;
+ _pos = _end;
+ }
+ }
+
+ char getByte() {
+ if (_pos == _end) {
+ fail("input buffer underflow");
+ return 0;
+ }
+ return *_pos++;
+ }
+
+ Memory getBytes(size_t n) {
+ if ((_pos + n) > _end) {
+ assert(_fail == 0 || _pos == _end);
+ _pos = _end;
+ fail("input buffer underflow");
+ return Memory();
+ }
+ Memory ret(_pos, n);
+ _pos += n;
+ return ret;
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/buffered_output.cpp b/vespalib/src/vespa/vespalib/data/slime/buffered_output.cpp
new file mode 100644
index 00000000000..1f2d19737d9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/buffered_output.cpp
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "buffered_output.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <assert.h>
+
+namespace vespalib {
+namespace slime {
+
+void
+BufferedOutput::printf(const char *fmt, ...)
+{
+ int space = 256;
+ char *p = reserve(space);
+ int size;
+ va_list ap;
+ va_start(ap, fmt);
+ size = vsnprintf(p, space, fmt, ap);
+ va_end(ap);
+ assert(size >= 0);
+ if (size >= space) {
+ space = size + 1;
+ p = reserve(space);
+ va_start(ap, fmt);
+ size = vsnprintf(p, space, fmt, ap);
+ va_end(ap);
+ assert((size + 1) == space);
+ }
+ commit(size);
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/buffered_output.h b/vespalib/src/vespa/vespalib/data/slime/buffered_output.h
new file mode 100644
index 00000000000..c5c9ab5d17d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/buffered_output.h
@@ -0,0 +1,71 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "output.h"
+#include <string.h>
+#include <algorithm>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Thin layer on top of the Output interface that supplies us with an
+ * inlined API for efficient buffer handling.
+ **/
+class BufferedOutput
+{
+private:
+ enum { CHUNK_SIZE = 8000 };
+
+ Output &_output;
+ char *_start;
+ char *_pos;
+ char *_end;
+
+public:
+ BufferedOutput(Output &out)
+ : _output(out), _start(0), _pos(0), _end(0) {}
+
+ char *reserve(size_t bytes) {
+ if (__builtin_expect((size_t)(_end - _pos) < bytes, false)) {
+ size_t wantBytes = std::max(size_t(CHUNK_SIZE), bytes);
+ _start = _output.exchange(_start, _pos - _start, wantBytes);
+ _pos = _start;
+ _end = _start + wantBytes;
+ }
+ return _pos;
+ }
+
+ void commit(size_t bytes) {
+ _pos += bytes;
+ }
+
+ void writeByte(char value) {
+ reserve(1)[0] = value;
+ commit(1);
+ }
+
+ void writeBytes(const char *data, size_t size) {
+ char *p = reserve(size);
+ memcpy(p, data, size);
+ commit(size);
+ }
+
+ void printf(const char *fmt, ...)
+#ifdef __GNUC__
+ // Add printf format checks with gcc
+ __attribute__ ((format (printf,2,3)))
+#endif
+ ;
+
+ ~BufferedOutput() {
+ if (_pos != _start) {
+ _output.exchange(_start, _pos - _start, 0);
+ }
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/convenience.cpp b/vespalib/src/vespa/vespalib/data/slime/convenience.cpp
new file mode 100644
index 00000000000..f6a42aed600
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/convenience.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "convenience.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/convenience.h b/vespalib/src/vespa/vespalib/data/slime/convenience.h
new file mode 100644
index 00000000000..3d4e1947ab9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/convenience.h
@@ -0,0 +1,40 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "cursor.h"
+#include "inspector.h"
+#include "type.h"
+#include "inserter.h"
+#include "inject.h"
+
+namespace vespalib {
+
+class Slime;
+
+namespace slime {
+
+struct Memory;
+class Type;
+class Symbol;
+
+namespace convenience {
+
+using ::vespalib::Slime;
+
+using ::vespalib::slime::Symbol;
+using ::vespalib::slime::Memory;
+using ::vespalib::slime::Cursor;
+using ::vespalib::slime::Inspector;
+using ::vespalib::slime::Type;
+
+using ::vespalib::slime::Inserter;
+using ::vespalib::slime::SlimeInserter;
+using ::vespalib::slime::ArrayInserter;
+using ::vespalib::slime::ObjectInserter;
+using ::vespalib::slime::inject;
+
+} // namespace vespalib::slime::convenience
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/cursor.cpp b/vespalib/src/vespa/vespalib/data/slime/cursor.cpp
new file mode 100644
index 00000000000..4c2242bf6de
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/cursor.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "cursor.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/cursor.h b/vespalib/src/vespa/vespalib/data/slime/cursor.h
new file mode 100644
index 00000000000..0e83fa379d3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/cursor.h
@@ -0,0 +1,45 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "inspector.h"
+
+namespace vespalib {
+namespace slime {
+
+struct Cursor : public Inspector {
+ virtual Cursor &operator[](size_t idx) const = 0;
+ virtual Cursor &operator[](Symbol sym) const = 0;
+ virtual Cursor &operator[](Memory name) const = 0;
+
+ virtual Cursor &addNix() = 0;
+ virtual Cursor &addBool(bool bit) = 0;
+ virtual Cursor &addLong(int64_t l) = 0;
+ virtual Cursor &addDouble(double d) = 0;
+ virtual Cursor &addString(Memory str) = 0;
+ virtual Cursor &addData(Memory data) = 0;
+ virtual Cursor &addArray() = 0;
+ virtual Cursor &addObject() = 0;
+
+ virtual Cursor &setNix(Symbol sym) = 0;
+ virtual Cursor &setBool(Symbol sym, bool bit) = 0;
+ virtual Cursor &setLong(Symbol sym, int64_t l) = 0;
+ virtual Cursor &setDouble(Symbol sym, double d) = 0;
+ virtual Cursor &setString(Symbol sym, Memory str) = 0;
+ virtual Cursor &setData(Symbol sym, Memory data) = 0;
+ virtual Cursor &setArray(Symbol sym) = 0;
+ virtual Cursor &setObject(Symbol sym) = 0;
+
+ virtual Cursor &setNix(Memory name) = 0;
+ virtual Cursor &setBool(Memory name, bool bit) = 0;
+ virtual Cursor &setLong(Memory name, int64_t l) = 0;
+ virtual Cursor &setDouble(Memory name, double d) = 0;
+ virtual Cursor &setString(Memory name, Memory str) = 0;
+ virtual Cursor &setData(Memory name, Memory str) = 0;
+ virtual Cursor &setArray(Memory name) = 0;
+ virtual Cursor &setObject(Memory name) = 0;
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp
new file mode 100644
index 00000000000..c441d89cb44
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "empty_value_factory.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h
new file mode 100644
index 00000000000..4ff238b05b5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value_factory.h"
+#include "nix_value.h"
+#include "array_value.h"
+#include "object_value.h"
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace slime {
+
+struct NixValueFactory : public ValueFactory {
+ Value *create(Stash &) const override { return NixValue::instance(); }
+};
+
+struct ArrayValueFactory : public ValueFactory {
+ SymbolTable &symbolTable;
+ ArrayValueFactory(SymbolTable &table) : symbolTable(table) {}
+ Value *create(Stash & stash) const override { return & stash.create<ArrayValue>(symbolTable, stash); }
+};
+
+struct ObjectValueFactory : public ValueFactory {
+ SymbolTable &symbolTable;
+ ObjectValueFactory(SymbolTable &table) : symbolTable(table) {}
+ Value *create(Stash & stash) const override { return & stash.create<ObjectValue>(symbolTable, stash); }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/inject.cpp b/vespalib/src/vespa/vespalib/data/slime/inject.cpp
new file mode 100644
index 00000000000..76cc2fe0cc0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/inject.cpp
@@ -0,0 +1,81 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "inject.h"
+#include "cursor.h"
+#include "array_traverser.h"
+#include "object_traverser.h"
+#include <stdlib.h>
+
+namespace vespalib {
+namespace slime {
+
+namespace {
+
+struct NestedInjector : ArrayTraverser, ObjectTraverser {
+ Cursor &cursor;
+ const Inspector *guard;
+ NestedInjector(Cursor &c, const Inspector *g) : cursor(c), guard(g) {}
+ virtual void entry(size_t, const Inspector &inspector);
+ virtual void field(const Memory &symbol_name, const Inspector &inspector);
+};
+
+void injectNix(const Inserter &inserter) { inserter.insertNix(); }
+void injectBool(const Inserter &inserter, bool value) { inserter.insertBool(value); }
+void injectLong(const Inserter &inserter, int64_t value) { inserter.insertLong(value); }
+void injectDouble(const Inserter &inserter, double value) { inserter.insertDouble(value); }
+void injectString(const Inserter &inserter, const Memory &memory) { inserter.insertString(memory); }
+void injectData(const Inserter &inserter, const Memory &memory) { inserter.insertData(memory); }
+void injectArray(const Inserter &inserter, const Inspector &inspector, const Inspector *guard) {
+ Cursor &cursor = inserter.insertArray();
+ NestedInjector injector(cursor, (guard != 0) ? guard : &cursor);
+ ArrayTraverser &array_traverser = injector;
+ inspector.traverse(array_traverser);
+}
+void injectObject(const Inserter &inserter, const Inspector &inspector, const Inspector *guard) {
+ Cursor &cursor = inserter.insertObject();
+ NestedInjector injector(cursor, (guard != 0) ? guard : &cursor);
+ ObjectTraverser &object_traverser = injector;
+ inspector.traverse(object_traverser);
+}
+void injectValue(const Inserter &inserter, const Inspector &inspector, const Inspector *guard) {
+ switch (inspector.type().getId()) {
+ case NIX::ID: return injectNix(inserter);
+ case BOOL::ID: return injectBool(inserter, inspector.asBool());
+ case LONG::ID: return injectLong(inserter, inspector.asLong());
+ case DOUBLE::ID: return injectDouble(inserter, inspector.asDouble());
+ case STRING::ID: return injectString(inserter, inspector.asString());
+ case DATA::ID: return injectData(inserter, inspector.asData());
+ case ARRAY::ID: return injectArray(inserter, inspector, guard);
+ case OBJECT::ID: return injectObject(inserter, inspector, guard);
+ }
+ abort(); // should not be reached
+}
+
+void
+NestedInjector::entry(size_t, const Inspector &inspector) {
+ if (&inspector == guard) {
+ return;
+ }
+ ArrayInserter inserter(cursor);
+ injectValue(inserter, inspector, guard);
+}
+
+void
+NestedInjector::field(const Memory &symbol_name, const Inspector &inspector) {
+ if (&inspector == guard) {
+ return;
+ }
+ ObjectInserter inserter(cursor, symbol_name);
+ injectValue(inserter, inspector, guard);
+}
+
+} // namespace vespalib::slime::<unnamed>
+
+void inject(const Inspector &inspector, const Inserter &inserter) {
+ if (inspector.valid()) {
+ injectValue(inserter, inspector, 0);
+ }
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/inject.h b/vespalib/src/vespa/vespalib/data/slime/inject.h
new file mode 100644
index 00000000000..a800c2c28fa
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/inject.h
@@ -0,0 +1,28 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "inserter.h"
+#include "inspector.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Inject a slime sub-structure described by an Inspector into a slime
+ * structure where the insertion point is described by an
+ * Inserter. This will copy all the values represented by the
+ * Inspector into the position described by the Inserter. Note that
+ * this can be used to either copy data from one Slime structure to
+ * another, or to copy data internally within a single slime
+ * structure. If the Inspector contains the insertion point it will
+ * only be expanded once to avoid infinite recursion.
+ *
+ * @param inspector what to inject
+ * @param inserter where to inject
+ **/
+void inject(const Inspector &inspector, const Inserter &inserter);
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/inserter.cpp b/vespalib/src/vespa/vespalib/data/slime/inserter.cpp
new file mode 100644
index 00000000000..5fb761f785d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/inserter.cpp
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "inserter.h"
+#include "slime.h"
+
+namespace vespalib {
+namespace slime {
+
+Cursor &SlimeInserter::insertNix() const { return slime.setNix(); }
+Cursor &SlimeInserter::insertBool(bool value) const { return slime.setBool(value); }
+Cursor &SlimeInserter::insertLong(int64_t value) const { return slime.setLong(value); }
+Cursor &SlimeInserter::insertDouble(double value) const { return slime.setDouble(value); }
+Cursor &SlimeInserter::insertString(Memory value) const { return slime.setString(value); }
+Cursor &SlimeInserter::insertData(Memory value) const { return slime.setData(value); }
+Cursor &SlimeInserter::insertArray() const { return slime.setArray(); }
+Cursor &SlimeInserter::insertObject() const { return slime.setObject(); }
+
+Cursor &ArrayInserter::insertNix() const { return cursor.addNix(); }
+Cursor &ArrayInserter::insertBool(bool value) const { return cursor.addBool(value); }
+Cursor &ArrayInserter::insertLong(int64_t value) const { return cursor.addLong(value); }
+Cursor &ArrayInserter::insertDouble(double value) const { return cursor.addDouble(value); }
+Cursor &ArrayInserter::insertString(Memory value) const { return cursor.addString(value); }
+Cursor &ArrayInserter::insertData(Memory value) const { return cursor.addData(value); }
+Cursor &ArrayInserter::insertArray() const { return cursor.addArray(); }
+Cursor &ArrayInserter::insertObject() const { return cursor.addObject(); }
+
+Cursor &ObjectSymbolInserter::insertNix() const { return cursor.setNix(symbol); }
+Cursor &ObjectSymbolInserter::insertBool(bool value) const { return cursor.setBool(symbol, value); }
+Cursor &ObjectSymbolInserter::insertLong(int64_t value) const { return cursor.setLong(symbol, value); }
+Cursor &ObjectSymbolInserter::insertDouble(double value) const { return cursor.setDouble(symbol, value); }
+Cursor &ObjectSymbolInserter::insertString(Memory value) const { return cursor.setString(symbol, value); }
+Cursor &ObjectSymbolInserter::insertData(Memory value) const { return cursor.setData(symbol, value); }
+Cursor &ObjectSymbolInserter::insertArray() const { return cursor.setArray(symbol); }
+Cursor &ObjectSymbolInserter::insertObject() const { return cursor.setObject(symbol); }
+
+Cursor &ObjectInserter::insertNix() const { return cursor.setNix(name); }
+Cursor &ObjectInserter::insertBool(bool value) const { return cursor.setBool(name, value); }
+Cursor &ObjectInserter::insertLong(int64_t value) const { return cursor.setLong(name, value); }
+Cursor &ObjectInserter::insertDouble(double value) const { return cursor.setDouble(name, value); }
+Cursor &ObjectInserter::insertString(Memory value) const { return cursor.setString(name, value); }
+Cursor &ObjectInserter::insertData(Memory value) const { return cursor.setData(name, value); }
+Cursor &ObjectInserter::insertArray() const { return cursor.setArray(name); }
+Cursor &ObjectInserter::insertObject() const { return cursor.setObject(name); }
+
+} // namespace slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/inserter.h b/vespalib/src/vespa/vespalib/data/slime/inserter.h
new file mode 100644
index 00000000000..76f6120ba55
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/inserter.h
@@ -0,0 +1,97 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "type.h"
+#include "memory.h"
+#include "symbol.h"
+
+namespace vespalib {
+
+class Slime;
+
+namespace slime {
+
+class Cursor;
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Interface for inserting a value while hiding how/where it is
+ * inserted.
+ **/
+struct Inserter {
+ virtual Cursor &insertNix() const = 0;
+ virtual Cursor &insertBool(bool value) const = 0;
+ virtual Cursor &insertLong(int64_t value) const = 0;
+ virtual Cursor &insertDouble(double value) const = 0;
+ virtual Cursor &insertString(Memory value) const = 0;
+ virtual Cursor &insertData(Memory value) const = 0;
+ virtual Cursor &insertArray() const = 0;
+ virtual Cursor &insertObject() const = 0;
+ virtual ~Inserter() {}
+};
+
+//-----------------------------------------------------------------------------
+
+struct SlimeInserter : Inserter {
+ Slime &slime;
+ explicit SlimeInserter(Slime &s) : slime(s) {}
+
+ virtual Cursor &insertNix() const;
+ virtual Cursor &insertBool(bool value) const;
+ virtual Cursor &insertLong(int64_t value) const;
+ virtual Cursor &insertDouble(double value) const;
+ virtual Cursor &insertString(Memory value) const;
+ virtual Cursor &insertData(Memory value) const;
+ virtual Cursor &insertArray() const;
+ virtual Cursor &insertObject() const;
+};
+
+struct ArrayInserter : Inserter {
+ Cursor &cursor;
+ explicit ArrayInserter(Cursor &c) : cursor(c) {}
+
+ virtual Cursor &insertNix() const;
+ virtual Cursor &insertBool(bool value) const;
+ virtual Cursor &insertLong(int64_t value) const;
+ virtual Cursor &insertDouble(double value) const;
+ virtual Cursor &insertString(Memory value) const;
+ virtual Cursor &insertData(Memory value) const;
+ virtual Cursor &insertArray() const;
+ virtual Cursor &insertObject() const;
+};
+
+struct ObjectSymbolInserter : Inserter {
+ Cursor &cursor;
+ Symbol symbol;
+ ObjectSymbolInserter(Cursor &c, const Symbol &s) : cursor(c), symbol(s) {}
+
+ virtual Cursor &insertNix() const;
+ virtual Cursor &insertBool(bool value) const;
+ virtual Cursor &insertLong(int64_t value) const;
+ virtual Cursor &insertDouble(double value) const;
+ virtual Cursor &insertString(Memory value) const;
+ virtual Cursor &insertData(Memory value) const;
+ virtual Cursor &insertArray() const;
+ virtual Cursor &insertObject() const;
+};
+
+struct ObjectInserter : Inserter {
+ Cursor &cursor;
+ Memory name;
+ ObjectInserter(Cursor &c, const Memory &n) : cursor(c), name(n) {}
+
+ virtual Cursor &insertNix() const;
+ virtual Cursor &insertBool(bool value) const;
+ virtual Cursor &insertLong(int64_t value) const;
+ virtual Cursor &insertDouble(double value) const;
+ virtual Cursor &insertString(Memory value) const;
+ virtual Cursor &insertData(Memory value) const;
+ virtual Cursor &insertArray() const;
+ virtual Cursor &insertObject() const;
+};
+
+} // namespace slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/inspector.cpp b/vespalib/src/vespa/vespalib/data/slime/inspector.cpp
new file mode 100644
index 00000000000..a387ab5b86a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/inspector.cpp
@@ -0,0 +1,93 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "inspector.h"
+#include "object_traverser.h"
+#include "array_traverser.h"
+#include <assert.h>
+
+namespace vespalib {
+namespace slime {
+
+class Equal {
+public:
+ Equal(const Inspector & rhs) : _rhs(rhs), _equal(true) { }
+ bool isEqual() const { return _equal; }
+protected:
+ const Inspector & _rhs;
+ bool _equal;
+};
+
+class EqualObject : public ObjectTraverser, public Equal {
+public:
+ EqualObject(const Inspector & rhs) : Equal(rhs) { }
+private:
+ virtual void field(const Memory &symbol, const Inspector &inspector) {
+ if ( _equal ) {
+ _equal = (inspector == _rhs[symbol]);
+ }
+ }
+};
+
+class EqualArray : public ArrayTraverser, public Equal {
+public:
+ EqualArray(const Inspector & rhs) : Equal(rhs) { }
+private:
+ virtual void entry(size_t idx, const Inspector &inspector) {
+ if ( _equal ) {
+ _equal = (inspector == _rhs[idx]);
+ }
+ }
+};
+
+bool operator == (const Inspector & a, const Inspector & b)
+{
+ bool equal(a.type().getId() == b.type().getId());
+ if (equal) {
+ switch (a.type().getId()) {
+ case NIX::ID:
+ break;
+ case BOOL::ID:
+ equal = a.asBool() == b.asBool();
+ break;
+ case LONG::ID:
+ equal = a.asLong() == b.asLong();
+ break;
+ case DOUBLE::ID:
+ equal = a.asDouble() == b.asDouble();
+ break;
+ case STRING::ID:
+ equal = a.asString() == b.asString();
+ break;
+ case DATA::ID:
+ equal = a.asData() == b.asData();
+ break;
+ case ARRAY::ID:
+ {
+ EqualArray traverser(b);
+ a.traverse(traverser);
+ equal = traverser.isEqual() && (a.entries() == b.entries());
+ }
+ break;
+ case OBJECT::ID:
+ {
+ EqualObject traverser(b);
+ a.traverse(traverser);
+ equal = traverser.isEqual() && (a.fields() == b.fields());
+ }
+ break;
+ default:
+ assert(false);
+ break;
+ }
+ }
+ return equal;
+}
+
+std::ostream & operator << (std::ostream & os, const Inspector & inspector)
+{
+ os << inspector.toString();
+ return os;
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/inspector.h b/vespalib/src/vespa/vespalib/data/slime/inspector.h
new file mode 100644
index 00000000000..5f60222b052
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/inspector.h
@@ -0,0 +1,48 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "type.h"
+#include "memory.h"
+#include "symbol.h"
+
+namespace vespalib {
+namespace slime {
+
+struct ArrayTraverser;
+struct ObjectSymbolTraverser;
+struct ObjectTraverser;
+
+struct Inspector {
+ virtual bool valid() const = 0;
+ virtual Type type() const = 0;
+ virtual size_t children() const = 0;
+ virtual size_t entries() const = 0;
+ virtual size_t fields() const = 0;
+
+ virtual bool asBool() const = 0;
+ virtual int64_t asLong() const = 0;
+ virtual double asDouble() const = 0;
+ virtual Memory asString() const = 0;
+ virtual Memory asData() const = 0;
+
+ virtual void traverse(ArrayTraverser &at) const = 0;
+ virtual void traverse(ObjectSymbolTraverser &ot) const = 0;
+ virtual void traverse(ObjectTraverser &ot) const = 0;
+
+ virtual vespalib::string toString() const = 0;
+
+ virtual Inspector &operator[](size_t idx) const = 0;
+ virtual Inspector &operator[](Symbol sym) const = 0;
+ virtual Inspector &operator[](Memory name) const = 0;
+
+ virtual ~Inspector() {}
+};
+
+bool operator == (const Inspector & a, const Inspector & b);
+std::ostream & operator << (std::ostream & os, const Inspector & inspector);
+
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/json_format.cpp b/vespalib/src/vespa/vespalib/data/slime/json_format.cpp
new file mode 100644
index 00000000000..04efc182637
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/json_format.cpp
@@ -0,0 +1,499 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "strfmt.h"
+#include "json_format.h"
+#include "inserter.h"
+#include "slime.h"
+#include <errno.h>
+#include <cmath>
+#include <sstream>
+
+namespace vespalib {
+namespace slime {
+
+namespace {
+
+template <bool COMPACT>
+struct JsonEncoder : public ArrayTraverser,
+ public ObjectTraverser
+{
+ BufferedOutput &out;
+ int level;
+ bool head;
+
+ JsonEncoder(BufferedOutput &out_in)
+ : out(out_in), level(0), head(true) {}
+
+ void openScope(char c) {
+ out.writeByte(c);
+ ++level;
+ head = true;
+ }
+
+ void separate(bool useComma) {
+ if (!head && useComma) {
+ out.writeByte(',');
+ } else {
+ head = false;
+ }
+ if (!COMPACT) {
+ out.printf("\n%*s", level * 4, "");
+ }
+ }
+
+ void closeScope(char c) {
+ --level;
+ separate(false);
+ out.writeByte(c);
+ }
+
+ void encodeNIX() {
+ out.writeBytes("null", 4);
+ }
+ void encodeBOOL(bool value) {
+ if (value) {
+ out.writeBytes("true", 4);
+ } else {
+ out.writeBytes("false", 5);
+ }
+ }
+ void encodeLONG(int64_t value) {
+ out.printf("%ld", value);
+ }
+ void encodeDOUBLE(double value) {
+ if (std::isnan(value) || std::isinf(value)) {
+ out.writeBytes("null", 4);
+ } else {
+ out.printf("%g", value);
+ }
+ }
+ void encodeSTRING(const Memory &memory) {
+ const char *hex = "0123456789ABCDEF";
+ char *p = out.reserve(memory.size * 6 + 2);
+ size_t len = 2;
+ *p++ = '"';
+ const char *pos = memory.data;
+ const char *end = memory.data + memory.size;
+ for (; pos < end; ++pos) {
+ uint8_t c = *pos;
+ switch(c) {
+ case '"': *p++ = '\\'; *p++ = '"'; len += 2; break;
+ case '\\': *p++ = '\\'; *p++ = '\\'; len += 2; break;
+ case '\b': *p++ = '\\'; *p++ = 'b'; len += 2; break;
+ case '\f': *p++ = '\\'; *p++ = 'f'; len += 2; break;
+ case '\n': *p++ = '\\'; *p++ = 'n'; len += 2; break;
+ case '\r': *p++ = '\\'; *p++ = 'r'; len += 2; break;
+ case '\t': *p++ = '\\'; *p++ = 't'; len += 2; break;
+ default:
+ if (c > 0x1f) {
+ *p++ = c; ++len;
+ } else { // requires escaping according to RFC 4627
+ *p++ = '\\'; *p++ = 'u'; *p++ = '0'; *p++ = '0';
+ *p++ = hex[(c >> 4) & 0xf]; *p++ = hex[c & 0xf];
+ len += 6;
+ }
+ }
+ }
+ *p = '"';
+ out.commit(len);
+ }
+ void encodeDATA(const Memory &memory) {
+ const char *hex = "0123456789ABCDEF";
+ size_t len = memory.size * 2 + 4;
+ char *p = out.reserve(len);
+ *p++ = '"'; *p++ = '0'; *p++ = 'x';
+ const char *pos = memory.data;
+ const char *end = memory.data + memory.size;
+ for (; pos < end; ++pos) {
+ *p++ = hex[(*pos >> 4) & 0xf]; *p++ = hex[*pos & 0xf];
+ }
+ *p = '"';
+ out.commit(len);
+ }
+ void encodeARRAY(const Inspector &inspector) {
+ ArrayTraverser &array_traverser = *this;
+ openScope('[');
+ inspector.traverse(array_traverser);
+ closeScope(']');
+ }
+ void encodeOBJECT(const Inspector &inspector) {
+ ObjectTraverser &object_traverser = *this;
+ openScope('{');
+ inspector.traverse(object_traverser);
+ closeScope('}');
+ }
+ void encodeValue(const Inspector &inspector) {
+ switch (inspector.type().getId()) {
+ case NIX::ID: return encodeNIX();
+ case BOOL::ID: return encodeBOOL(inspector.asBool());
+ case LONG::ID: return encodeLONG(inspector.asLong());
+ case DOUBLE::ID: return encodeDOUBLE(inspector.asDouble());
+ case STRING::ID: return encodeSTRING(inspector.asString());
+ case DATA::ID: return encodeDATA(inspector.asData());
+ case ARRAY::ID: return encodeARRAY(inspector);
+ case OBJECT::ID: return encodeOBJECT(inspector);
+ }
+ abort(); // should not be reached
+ }
+ virtual void entry(size_t idx, const Inspector &inspector);
+ virtual void field(const Memory &symbol_name, const Inspector &inspector);
+
+ static void encode(const Inspector &inspector, BufferedOutput &out) {
+ JsonEncoder<COMPACT> encoder(out);
+ encoder.encodeValue(inspector);
+ if (!COMPACT) {
+ out.writeByte('\n');
+ }
+ }
+};
+
+template <bool COMPACT>
+void
+JsonEncoder<COMPACT>::entry(size_t, const Inspector &inspector)
+{
+ separate(true);
+ encodeValue(inspector);
+}
+
+template <bool COMPACT>
+void
+JsonEncoder<COMPACT>::field(const Memory &symbol_name, const Inspector &inspector)
+{
+ separate(true);
+ encodeSTRING(symbol_name);
+ if (COMPACT) {
+ out.writeByte(':');
+ } else {
+ out.writeBytes(": ", 2);
+ }
+ encodeValue(inspector);
+}
+
+//-----------------------------------------------------------------------------
+
+struct JsonDecoder {
+ BufferedInput &in;
+ char c;
+ vespalib::string key;
+ vespalib::string value;
+
+ JsonDecoder(BufferedInput &input) : in(input), c(in.getByte()), key(), value() {}
+
+ void next() {
+ if (!in.eof()) {
+ c = in.getByte();
+ } else {
+ c = 0;
+ }
+ }
+
+ bool skip(char x) {
+ if (c != x) {
+ return false;
+ }
+ next();
+ return true;
+ }
+
+ void expect(const char *str) {
+ while (*str != 0 && skip(*str)) {
+ ++str;
+ }
+ if (*str != 0) {
+ in.fail("unexpected character");
+ }
+ }
+
+ void skipWhiteSpace() {
+ for (;;) {
+ switch (c) {
+ case ' ': case '\t': case '\n': case '\r':
+ next();
+ break;
+ default: return;
+ }
+ }
+ }
+
+ uint32_t readHexValue(uint32_t len);
+ uint32_t dequoteUtf16();
+ void readString(vespalib::string &str);
+ void readKey();
+ void decodeString(Inserter &inserter);
+ void decodeObject(Inserter &inserter);
+ void decodeArray(Inserter &inserter);
+ void decodeNumber(Inserter &inserter);
+ void decodeValue(Inserter &inserter) {
+ skipWhiteSpace();
+ switch (c) {
+ case '"': case '\'': return decodeString(inserter);
+ case '{': return decodeObject(inserter);
+ case '[': return decodeArray(inserter);
+ case 't': expect("true"); inserter.insertBool(true); return;
+ case 'f': expect("false"); inserter.insertBool(false); return;
+ case 'n': expect("null"); inserter.insertNix(); return;
+ case '-': case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9': return decodeNumber(inserter);
+ }
+ in.fail("invalid initial character for value");
+ }
+
+ void decodeValue(Slime &slime) {
+ SlimeInserter inserter(slime);
+ decodeValue(inserter);
+ }
+};
+
+uint32_t
+JsonDecoder::readHexValue(uint32_t len)
+{
+ uint32_t ret = 0;
+ for (uint32_t i = 0; i < len; ++i) {
+ switch (c) {
+ case '0': ret = (ret << 4) | 0; break;
+ case '1': ret = (ret << 4) | 1; break;
+ case '2': ret = (ret << 4) | 2; break;
+ case '3': ret = (ret << 4) | 3; break;
+ case '4': ret = (ret << 4) | 4; break;
+ case '5': ret = (ret << 4) | 5; break;
+ case '6': ret = (ret << 4) | 6; break;
+ case '7': ret = (ret << 4) | 7; break;
+ case '8': ret = (ret << 4) | 8; break;
+ case '9': ret = (ret << 4) | 9; break;
+ case 'a': case 'A': ret = (ret << 4) | 0xa; break;
+ case 'b': case 'B': ret = (ret << 4) | 0xb; break;
+ case 'c': case 'C': ret = (ret << 4) | 0xc; break;
+ case 'd': case 'D': ret = (ret << 4) | 0xd; break;
+ case 'e': case 'E': ret = (ret << 4) | 0xe; break;
+ case 'f': case 'F': ret = (ret << 4) | 0xf; break;
+ default:
+ in.fail("invalid hex character");
+ return 0;
+ }
+ next();
+ }
+ return ret;
+}
+
+uint32_t
+JsonDecoder::dequoteUtf16()
+{
+ expect("u");
+ uint32_t codepoint = readHexValue(4);
+ if (codepoint >= 0xd800) {
+ if (codepoint < 0xdc00) { // high
+ expect("\\u");
+ uint32_t low = readHexValue(4);
+ if (low >= 0xdc00 && low < 0xe000) {
+ codepoint = 0x10000 + ((codepoint - 0xd800) << 10) + (low - 0xdc00);
+ } else {
+ in.fail("missing low surrogate");
+ }
+ } else if (codepoint < 0xe000) { // low
+ in.fail("unexpected low surrogate");
+ }
+ }
+ return codepoint;
+}
+
+void writeUtf8(uint32_t codepoint, vespalib::string &str, uint32_t mask = 0xffffff80) {
+ if ((codepoint & mask) == 0) {
+ str.push_back((mask << 1) | codepoint);
+ } else {
+ writeUtf8(codepoint >> 6, str, mask >> (2 - ((mask >> 6) & 0x1)));
+ str.push_back(0x80 | (codepoint & 0x3f));
+ }
+}
+
+void
+JsonDecoder::readString(vespalib::string &str)
+{
+ str.clear();
+ char quote = c;
+ assert(quote == '"' || quote == '\'');
+ next();
+ for (;;) {
+ switch (c) {
+ case '\\':
+ next();
+ switch (c) {
+ case '"': case '\\': case '/': case '\'':
+ str.push_back(c);
+ break;
+ case 'b': str.push_back('\b'); break;
+ case 'f': str.push_back('\f'); break;
+ case 'n': str.push_back('\n'); break;
+ case 'r': str.push_back('\r'); break;
+ case 't': str.push_back('\t'); break;
+ case 'u': writeUtf8(dequoteUtf16(), str); continue;
+ default:
+ in.fail(strfmt("invalid quoted char(%02X)", c));
+ break;
+ }
+ next();
+ break;
+ case '"': case '\'':
+ if (c == quote) {
+ next();
+ return;
+ } else {
+ str.push_back(c);
+ next();
+ }
+ break;
+ case '\0':
+ in.fail("unterminated string");
+ return;
+ default:
+ str.push_back(c);
+ next();
+ break;
+ }
+ }
+}
+
+void
+JsonDecoder::readKey() {
+ switch (c) {
+ case '"': case '\'': return readString(key);
+ default:
+ key.clear();
+ for (;;) {
+ switch (c) {
+ case ':': case ' ': case '\t': case '\n': case '\r': case '\0': return;
+ default:
+ key.push_back(c);
+ next();
+ break;
+ }
+ }
+ }
+}
+
+void
+JsonDecoder::decodeString(Inserter &inserter)
+{
+ readString(value);
+ inserter.insertString(value);
+}
+
+void
+JsonDecoder::decodeObject(Inserter &inserter)
+{
+ Cursor &cursor = inserter.insertObject();
+ expect("{");
+ skipWhiteSpace();
+ if (c != '}') {
+ do {
+ skipWhiteSpace();
+ readKey();
+ skipWhiteSpace();
+ expect(":");
+ ObjectInserter childInserter(cursor, key);
+ decodeValue(childInserter);
+ skipWhiteSpace();
+ } while (skip(','));
+ }
+ expect("}");
+}
+
+void
+JsonDecoder::decodeArray(Inserter &inserter)
+{
+ Cursor &cursor = inserter.insertArray();
+ ArrayInserter childInserter(cursor);
+ expect("[");
+ skipWhiteSpace();
+ if (c != ']') {
+ do {
+ decodeValue(childInserter);
+ skipWhiteSpace();
+ } while (skip(','));
+ }
+ expect("]");
+}
+
+static int insertNumber(Inserter &inserter, bool isLong, const vespalib::string &value, char **endp);
+
+void
+JsonDecoder::decodeNumber(Inserter &inserter)
+{
+ bool isLong = true;
+ value.clear();
+ value.push_back(c);
+ next();
+ for (;;) {
+ switch (c) {
+ case '+': case '-': case '.': case 'e': case 'E':
+ isLong = false;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ value.push_back(c);
+ next();
+ break;
+ default:
+ char *endp;
+ int errorCode = insertNumber(inserter, isLong, value, &endp);
+ if (errorCode != 0) {
+ std::stringstream ss;
+ ss << "error inserting number " << value << ". error code: " << errorCode << ". endp - value: " << (endp - value.c_str());
+ in.fail(ss.str());
+ }
+ return;
+ }
+ }
+}
+
+int
+insertNumber(Inserter &inserter, bool isLong, const vespalib::string & value, char **endp)
+{
+ int errorCode = 0;
+ errno = 0;
+ if (isLong) {
+ long val = strtol(value.c_str(), endp, 0);
+ errorCode = errno;
+ inserter.insertLong(val);
+ } else {
+ double val = strtod(value.c_str(), endp);
+ errorCode = errno;
+ inserter.insertDouble(val);
+ }
+ assert(errorCode == 0 || errorCode == ERANGE || errorCode == EINVAL);
+ return errorCode;
+}
+
+} // namespace vespalib::slime::<unnamed>
+
+void
+JsonFormat::encode(const Inspector &inspector, Output &output, bool compact)
+{
+ BufferedOutput out(output);
+ if (compact) {
+ JsonEncoder<true>::encode(inspector, out);
+ } else {
+ JsonEncoder<false>::encode(inspector, out);
+ }
+}
+
+void
+JsonFormat::encode(const Slime &slime, Output &output, bool compact)
+{
+ encode(slime.get(), output, compact);
+}
+
+size_t
+JsonFormat::decode(const Memory &memory, Slime &slime)
+{
+ BufferedInput input(memory);
+ JsonDecoder decoder(input);
+ decoder.decodeValue(slime);
+ if (input.failed()) {
+ slime.wrap("partial_result");
+ slime.get().setString("offending_input", input.getOffending());
+ slime.get().setString("error_message", input.getErrorMessage());
+ }
+ return input.getConsumed().size;
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/json_format.h b/vespalib/src/vespa/vespalib/data/slime/json_format.h
new file mode 100644
index 00000000000..bb23e168bd8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/json_format.h
@@ -0,0 +1,26 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "output.h"
+#include "type.h"
+#include "buffered_input.h"
+#include "buffered_output.h"
+
+namespace vespalib {
+
+class Slime;
+
+namespace slime {
+
+class Inspector;
+
+struct JsonFormat {
+ static void encode(const Inspector &inspector, Output &output, bool compact);
+ static void encode(const Slime &slime, Output &output, bool compact);
+ static size_t decode(const Memory &memory, Slime &slime);
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/make_dist.sh b/vespalib/src/vespa/vespalib/data/slime/make_dist.sh
new file mode 100755
index 00000000000..5c42cd6b08c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/make_dist.sh
@@ -0,0 +1,120 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+echo "generating Slime Mobile Edition ..."
+
+# remove old version if present
+rm -f slime_me.h
+rm -f slime_me.cpp
+
+# identify files to be included in the bundle, sort headers topologically based on include dependencies
+hfiles=$(for file in *.h; do echo $file $file; cat $file | sed -n -e "s/#include \"\(.*\.h\)\"/\1 $file/p"; done | tsort)
+cppfiles=$(echo *.cpp)
+
+# bundle header files
+echo "// Slime Mobile Edition" > slime_me.h
+for file in $hfiles; do
+ echo -e "\n// ---> FILE: $file" >> slime_me.h
+ cat $file >> slime_me.h
+ echo -e "// <--- FILE: $file\n" >> slime_me.h
+done
+
+# bundle cpp files
+echo "// Slime Mobile Edition" > slime_me.cpp
+echo "INCLUDE_SLIME_ME_H_HERE" >> slime_me.cpp
+for file in $cppfiles; do
+ echo -e "\n// ---> FILE: $file" >> slime_me.cpp
+ cat $file >> slime_me.cpp
+ echo -e "// <--- FILE: $file\n" >> slime_me.cpp
+done
+
+# remove includes to local headers and print remaining includes
+sed -i -e 's=#include "\(.*\)"=// include removed (\1)=' slime_me.h slime_me.cpp
+echo -n "includes: "
+cat slime_me.h slime_me.cpp | sed -n -e "s/#include \(.*\)/\1/p" | sort | uniq | xargs echo
+
+# include slime_me.h from slime_me.cpp
+sed -i -e 's=INCLUDE_SLIME_ME_H_HERE=#include "slime_me.h"=' slime_me.cpp
+
+# move code from the vespalib namespace to the my namespace
+sed -i -e 's/vespalib/my/g' slime_me.h slime_me.cpp
+sed -i -e 's/VESPALIB/MY/g' slime_me.h slime_me.cpp
+
+echo "running compilation tests ..."
+
+# prepare temporary test directory
+rm -rf tmp && mkdir tmp
+cp slime_me.h slime_me.cpp tmp/
+
+# simple single file application
+cat > tmp/simple_app.cpp <<EOF
+#include "slime_me.cpp"
+
+int main() {
+ my::Slime slime;
+ return 0;
+}
+EOF
+(cd tmp; set -x; make simple_app) || exit 11
+(cd tmp; set -x; ./simple_app) || exit 12
+
+# multiple includes from single compilation unit
+cat > tmp/include_app.cpp <<EOF
+#include "slime_me.h"
+#include "include_app.h"
+
+#include "slime_me.cpp"
+
+int main() {
+ my::Slime slime;
+ return 0;
+}
+EOF
+cat > tmp/include_app.h <<EOF
+#ifndef INCLUDE_APP
+#define INCLUDE_APP
+#include "slime_me.h"
+#endif
+EOF
+(cd tmp; set -x; make include_app) || exit 21
+(cd tmp; set -x; ./include_app) || exit 22
+
+# application with multiple compliation units
+cat > tmp/multi_tools.h <<EOF
+#ifndef MULTI_TOOLS_H
+#define MULTI_TOOLS_H
+struct MultiTools {
+ int main();
+};
+#endif
+EOF
+cat > tmp/multi_tools.cpp <<EOF
+#include "multi_tools.h"
+#include "slime_me.h"
+
+int
+MultiTools::main()
+{
+ my::Slime slime;
+ return 0;
+}
+EOF
+cat > tmp/multi_app.cpp <<EOF
+#include "slime_me.h"
+#include "multi_tools.h"
+
+int main() {
+ MultiTools tools;
+ return tools.main();
+}
+EOF
+(cd tmp; set -x; g++ -c multi_tools.cpp) || exit 31
+(cd tmp; set -x; g++ -c multi_app.cpp) || exit 32
+(cd tmp; set -x; g++ -c slime_me.cpp) || exit 33
+(cd tmp; set -x; g++ -o multi_app multi_tools.o multi_app.o slime_me.o) || exit 34
+(cd tmp; set -x; ./multi_app) || exit 35
+
+# clean up temporary test directory
+rm -rf tmp
+
+echo "AWESOME (slime_me.{h,cpp} are ready for use)"
diff --git a/vespalib/src/vespa/vespalib/data/slime/memory.cpp b/vespalib/src/vespa/vespalib/data/slime/memory.cpp
new file mode 100644
index 00000000000..991f28a5865
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/memory.cpp
@@ -0,0 +1,22 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "memory.h"
+#include "stored_memory.h"
+
+namespace vespalib {
+namespace slime {
+
+Memory::Memory(const StoredMemory &sm)
+ : data(sm._data),
+ size(sm._size)
+{
+}
+
+vespalib::string
+Memory::make_string() const
+{
+ return vespalib::string(data, size);
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/memory.h b/vespalib/src/vespa/vespalib/data/slime/memory.h
new file mode 100644
index 00000000000..f89c6aa0730
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/memory.h
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/stllike/hash_fun.h>
+
+namespace vespalib {
+namespace slime {
+
+class StoredMemory;
+
+/**
+ * Simple wrapper used to reference a region of memory.
+ **/
+struct Memory
+{
+ const char *data;
+ size_t size;
+
+ Memory() : data(0), size(0) {}
+ Memory(const char *d, size_t s) : data(d), size(s) {}
+ Memory(const char *str) : data(str), size(strlen(str)) {}
+ Memory(const std::string &str)
+ : data(str.data()), size(str.size()) {}
+ Memory(const vespalib::string &str)
+ : data(str.data()), size(str.size()) {}
+ Memory(const stringref &str)
+ : data(str.data()), size(str.size()) {}
+ explicit Memory(const StoredMemory &sm);
+ vespalib::string make_string() const;
+ bool operator == (const Memory & rhs) const {
+ return (size == rhs.size) &&
+ ( (data == rhs.data) ||
+ (memcmp(data, rhs.data, size) == 0) );
+ }
+ size_t hash() const {
+ return vespalib::hashValue(data, size);
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.cpp b/vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.cpp
new file mode 100644
index 00000000000..97c10fcbcea
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "named_symbol_inserter.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.h b/vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.h
new file mode 100644
index 00000000000..507804f20ee
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/named_symbol_inserter.h
@@ -0,0 +1,30 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "symbol_inserter.h"
+#include "symbol_table.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Class used to insert the name of a field into a symbol table.
+ **/
+class NamedSymbolInserter : public SymbolInserter
+{
+private:
+ SymbolTable &_table;
+ const Memory &_name;
+
+public:
+ NamedSymbolInserter(SymbolTable &table, const Memory &name)
+ : _table(table), _name(name) {}
+ virtual Symbol insert() {
+ return _table.insert(_name);
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.cpp b/vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.cpp
new file mode 100644
index 00000000000..18b3e356fd0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "named_symbol_lookup.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.h b/vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.h
new file mode 100644
index 00000000000..792728f870b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/named_symbol_lookup.h
@@ -0,0 +1,30 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "symbol_lookup.h"
+#include "symbol_table.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Class used to look up the name of a field in a symbol table.
+ **/
+class NamedSymbolLookup : public SymbolLookup
+{
+private:
+ const SymbolTable &_table;
+ const Memory &_name;
+
+public:
+ NamedSymbolLookup(const SymbolTable &table, const Memory &name)
+ : _table(table), _name(name) {}
+ virtual Symbol lookup() const {
+ return _table.lookup(_name);
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/nix_value.cpp b/vespalib/src/vespa/vespalib/data/slime/nix_value.cpp
new file mode 100644
index 00000000000..7955d77ba8b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/nix_value.cpp
@@ -0,0 +1,12 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "nix_value.h"
+
+namespace vespalib {
+namespace slime {
+
+NixValue NixValue::_invalid;
+NixValue NixValue::_instance;
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/nix_value.h b/vespalib/src/vespa/vespalib/data/slime/nix_value.h
new file mode 100644
index 00000000000..ad4b5b18ccd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/nix_value.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Class representing a value containing absolutely nothing.
+ **/
+class NixValue : public Value
+{
+private:
+ static NixValue _invalid;
+ static NixValue _instance;
+
+ NixValue() {}
+public:
+ static Value *invalid() { return &_invalid; }
+ static Value *instance() { return &_instance; }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/object_traverser.cpp b/vespalib/src/vespa/vespalib/data/slime/object_traverser.cpp
new file mode 100644
index 00000000000..b24e207e5dd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/object_traverser.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "object_traverser.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/object_traverser.h b/vespalib/src/vespa/vespalib/data/slime/object_traverser.h
new file mode 100644
index 00000000000..68c7e182f72
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/object_traverser.h
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "inspector.h"
+
+namespace vespalib {
+namespace slime {
+
+class Symbol;
+
+/**
+ * Interface used when traversing all the fields of an object value
+ * tagged with symbol id.
+ **/
+struct ObjectSymbolTraverser {
+ virtual void field(const Symbol &symbol, const Inspector &inspector) = 0;
+ virtual ~ObjectSymbolTraverser() {}
+};
+
+/**
+ * Interface used when traversing all the fields of an object value
+ * tagged with symbol name.
+ **/
+struct ObjectTraverser {
+ virtual void field(const Memory &symbol, const Inspector &inspector) = 0;
+ virtual ~ObjectTraverser() {}
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/object_value.cpp b/vespalib/src/vespa/vespalib/data/slime/object_value.cpp
new file mode 100644
index 00000000000..515be5c8808
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/object_value.cpp
@@ -0,0 +1,79 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "object_value.h"
+#include "object_traverser.h"
+#include "empty_value_factory.h"
+#include "resolved_symbol.h"
+#include "named_symbol_lookup.h"
+#include "named_symbol_inserter.h"
+
+namespace vespalib {
+namespace slime {
+
+Cursor &
+ObjectValue::setLeaf(Symbol sym, const ValueFactory &input) {
+ ResolvedSymbol symbol(sym);
+ return setIfUnset(symbol, input);
+
+}
+
+Cursor &
+ObjectValue::setLeaf(Memory name, const ValueFactory &input) {
+ NamedSymbolInserter symbol(_symbolTable, name);
+ return setIfUnset(symbol, input);
+}
+
+void
+ObjectValue::traverse(ObjectSymbolTraverser &ot) const {
+ typedef SymbolValueMap::const_iterator ITR;
+ for (ITR pos = _fields.begin(); pos != _fields.end(); ++pos) {
+ ot.field(pos->first, *pos->second);
+ }
+}
+
+void
+ObjectValue::traverse(ObjectTraverser &ot) const {
+ typedef SymbolValueMap::const_iterator ITR;
+ for (ITR pos = _fields.begin(); pos != _fields.end(); ++pos) {
+ Memory symbol = _symbolTable.inspect(pos->first);
+ ot.field(symbol, *pos->second);
+ }
+}
+
+Cursor &
+ObjectValue::operator[](Symbol sym) const {
+ ResolvedSymbol symbol(sym);
+ return *lookup(symbol);
+}
+
+Cursor &
+ObjectValue::operator[](Memory name) const {
+ NamedSymbolLookup symbol(_symbolTable, name);
+ return *lookup(symbol);
+}
+
+
+Cursor &
+ObjectValue::setArray(Symbol symbol) {
+ return setLeaf(symbol, ArrayValueFactory(_symbolTable));
+}
+
+Cursor &
+ObjectValue::setObject(Symbol symbol) {
+ return setLeaf(symbol, ObjectValueFactory(_symbolTable));
+}
+
+Cursor &
+ObjectValue::setArray(Memory name) {
+ return setLeaf(name, ArrayValueFactory(_symbolTable));
+}
+
+Cursor &
+ObjectValue::setObject(Memory name) {
+ return setLeaf(name, ObjectValueFactory(_symbolTable));
+}
+
+
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/object_value.h b/vespalib/src/vespa/vespalib/data/slime/object_value.h
new file mode 100644
index 00000000000..039bc33d13c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/object_value.h
@@ -0,0 +1,88 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value.h"
+#include "nix_value.h"
+#include "symbol.h"
+#include "symbol_lookup.h"
+#include "symbol_table.h"
+#include "value_factory.h"
+#include "symbol_inserter.h"
+#include <vespa/vespalib/stllike/vector_map.h>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Class representing a collection of unordered values that can be
+ * looked up by symbol.
+ **/
+class ObjectValue : public Value
+{
+private:
+ struct hasher {
+ size_t operator () (const Symbol & s) const { return s.getValue(); }
+ };
+ typedef vector_map<Symbol, Value*> SymbolValueMap;
+ SymbolTable &_symbolTable;
+ Stash &_stash;
+ SymbolValueMap _fields;
+
+ Cursor &setIfUnset(SymbolInserter &symbol, const ValueFactory &input) {
+ Value *&pos = _fields[symbol.insert()];
+ if (pos != 0) {
+ return *NixValue::invalid();
+ }
+ pos = input.create(_stash);
+ return *pos;
+ }
+
+ Value *lookup(const SymbolLookup &symbol) const {
+ SymbolValueMap::const_iterator pos = _fields.find(symbol.lookup());
+ if (pos == _fields.end()) {
+ return NixValue::invalid();
+ }
+ return pos->second;
+ }
+protected:
+ Cursor &setLeaf(Symbol sym, const ValueFactory &input) override;
+ Cursor &setLeaf(Memory name, const ValueFactory &input) override;
+
+public:
+ ObjectValue(SymbolTable &table, Stash & stash) : _symbolTable(table), _stash(stash), _fields() {
+ _fields.reserve(4);
+ }
+
+ ObjectValue(SymbolTable &table, Stash & stash, SymbolInserter &symbol, Value *value)
+ : _symbolTable(table), _stash(stash), _fields()
+ {
+ _fields.reserve(4);
+ _fields[symbol.insert()] = value;
+ }
+ ObjectValue(const ObjectValue &) = delete;
+ ObjectValue &operator=(const ObjectValue &) = delete;
+
+
+ virtual Type type() const { return OBJECT::instance; }
+ virtual size_t children() const { return _fields.size(); }
+ virtual size_t fields() const { return _fields.size(); }
+ virtual void traverse(ObjectSymbolTraverser &ot) const;
+ virtual void traverse(ObjectTraverser &ot) const;
+
+ virtual Cursor &operator[](Symbol sym) const;
+ virtual Cursor &operator[](Memory name) const;
+
+ virtual Cursor &setArray(Symbol sym);
+ virtual Cursor &setObject(Symbol sym);
+
+ virtual Cursor &setArray(Memory name);
+ virtual Cursor &setObject(Memory name);
+
+ virtual ~ObjectValue() { }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/output.cpp b/vespalib/src/vespa/vespalib/data/slime/output.cpp
new file mode 100644
index 00000000000..e7353dbe0ed
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/output.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "output.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/output.h b/vespalib/src/vespa/vespalib/data/slime/output.h
new file mode 100644
index 00000000000..26487faa85d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/output.h
@@ -0,0 +1,20 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <stddef.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Interface used to interact with an external output buffer.
+ **/
+struct Output {
+ virtual char *exchange(char *p, size_t commit, size_t reserve) = 0;
+ virtual ~Output() {}
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/resolved_symbol.cpp b/vespalib/src/vespa/vespalib/data/slime/resolved_symbol.cpp
new file mode 100644
index 00000000000..f6e137bd594
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/resolved_symbol.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "resolved_symbol.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/resolved_symbol.h b/vespalib/src/vespa/vespalib/data/slime/resolved_symbol.h
new file mode 100644
index 00000000000..f258ea6d7a1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/resolved_symbol.h
@@ -0,0 +1,35 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "symbol_lookup.h"
+#include "symbol_inserter.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Class containing the pre-resolved symbol for a field. Since the
+ * symbol is already known, it is also known to be present in the
+ * appropriate symbol table. Thus, this class can satisfy both the
+ * symbol lookup and inserter interfaces.
+ **/
+class ResolvedSymbol : public SymbolLookup,
+ public SymbolInserter
+{
+private:
+ Symbol _symbol;
+
+public:
+ ResolvedSymbol(const Symbol &symbol) : _symbol(symbol) {}
+ virtual Symbol lookup() const {
+ return _symbol;
+ }
+ virtual Symbol insert() {
+ return _symbol;
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/root_value.cpp b/vespalib/src/vespa/vespalib/data/slime/root_value.cpp
new file mode 100644
index 00000000000..e5869c64da7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/root_value.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "root_value.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/root_value.h b/vespalib/src/vespa/vespalib/data/slime/root_value.h
new file mode 100644
index 00000000000..4df77c806ce
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/root_value.h
@@ -0,0 +1,49 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "nix_value.h"
+#include "object_value.h"
+#include "value_factory.h"
+
+namespace vespalib {
+namespace slime {
+
+class RootValue
+{
+private:
+ Value *_value;
+ Stash *_stash;
+
+public:
+ RootValue(Stash * stash) : _value(NixValue::instance()), _stash(stash) {}
+ RootValue(RootValue && rhs) : _value(rhs._value), _stash(rhs._stash) {
+ rhs._value = NixValue::instance();
+ rhs._stash = nullptr;
+ }
+ RootValue(const RootValue &) = delete;
+ RootValue &operator=(const RootValue &) = delete;
+ RootValue &operator=(RootValue && rhs) {
+ _value = rhs._value;
+ _stash = rhs._stash;
+ rhs._value = NixValue::instance();
+ rhs._stash = nullptr;
+ return *this;
+ }
+ Cursor &get() const { return *_value; }
+ Cursor &set(const ValueFactory &input) {
+ Value *value = input.create(*_stash);
+ _value = value;
+ return *value;
+ }
+ Value *wrap(SymbolTable &table, SymbolInserter &symbol) {
+ Value *value = & _stash->create<ObjectValue>(table, *_stash, symbol, _value);
+ _value = value;
+ return _value;
+ }
+ ~RootValue() { }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/simple_buffer.cpp b/vespalib/src/vespa/vespalib/data/slime/simple_buffer.cpp
new file mode 100644
index 00000000000..cbe6a579839
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/simple_buffer.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "simple_buffer.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/simple_buffer.h b/vespalib/src/vespa/vespalib/data/slime/simple_buffer.h
new file mode 100644
index 00000000000..ccee73a9125
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/simple_buffer.h
@@ -0,0 +1,45 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "output.h"
+#include "memory.h"
+#include <vector>
+#include <assert.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Simple output buffer implementation.
+ **/
+class SimpleBuffer : public Output
+{
+private:
+ std::vector<char> _data;
+ size_t _used;
+
+public:
+ SimpleBuffer() : _data(), _used(0) {}
+ virtual char *exchange(char *p, size_t commit, size_t reserve) {
+ (void) p;
+ assert(p == &_data[_used] || commit == 0);
+ assert((_data.size() - _used) >= commit);
+ _used += commit;
+ _data.resize(_used + reserve, char(0x55));
+ return &_data[_used];
+ }
+ SimpleBuffer &add(char byte) {
+ assert(_data.size() == _used);
+ _data.push_back(byte);
+ ++_used;
+ return *this;
+ }
+ Memory get() const {
+ return Memory(&_data[0], _used);
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/slime.cpp b/vespalib/src/vespa/vespalib/data/slime/slime.cpp
new file mode 100644
index 00000000000..59a17a816d6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/slime.cpp
@@ -0,0 +1,18 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "slime.h"
+
+namespace vespalib {
+
+bool operator == (const Slime & a, const Slime & b)
+{
+ return a.get() == b.get();
+}
+
+std::ostream & operator << (std::ostream & os, const Slime & slime)
+{
+ os << slime.toString();
+ return os;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/slime.h b/vespalib/src/vespa/vespalib/data/slime/slime.h
new file mode 100644
index 00000000000..c78f0abce6f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/slime.h
@@ -0,0 +1,176 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "array_traverser.h"
+#include "array_value.h"
+#include "basic_value.h"
+#include "basic_value_factory.h"
+#include "binary_format.h"
+#include "buffered_input.h"
+#include "buffered_output.h"
+#include "convenience.h"
+#include "cursor.h"
+#include "empty_value_factory.h"
+#include "inject.h"
+#include "inserter.h"
+#include "inspector.h"
+#include "json_format.h"
+#include "memory.h"
+#include "named_symbol_inserter.h"
+#include "named_symbol_lookup.h"
+#include "nix_value.h"
+#include "object_traverser.h"
+#include "object_value.h"
+#include "output.h"
+#include "resolved_symbol.h"
+#include "root_value.h"
+#include "simple_buffer.h"
+#include "stored_memory.h"
+#include "symbol.h"
+#include "symbol_inserter.h"
+#include "symbol_lookup.h"
+#include "symbol_table.h"
+#include "type.h"
+#include "value.h"
+#include "value_factory.h"
+#include <memory>
+
+namespace vespalib {
+
+/**
+ * SLIME: 'Schema-Less Interface/Model/Exchange'. Slime is a way to
+ * handle schema-less structured data to be used as part of interfaces
+ * between components (RPC signatures), internal models
+ * (config/parameters) and data exchange between components
+ * (documents). The goal for Slime is to be flexible and lightweight
+ * and at the same time limit the extra overhead in space and time
+ * compared to schema-oriented approaches like protocol buffers and
+ * avro. The data model is inspired by JSON and associative arrays
+ * typically used in programming languages with dynamic typing.
+ **/
+class Slime
+{
+private:
+ typedef slime::Symbol Symbol;
+ typedef slime::SymbolTable SymbolTable;
+ typedef slime::RootValue RootValue;
+ typedef slime::Cursor Cursor;
+ typedef slime::Inspector Inspector;
+ typedef slime::Memory Memory;
+
+ SymbolTable::UP _names;
+ Stash::UP _stash;
+ RootValue _root;
+
+public:
+ typedef std::unique_ptr<Slime> UP;
+ class Params {
+ private:
+ SymbolTable::UP _symbols;
+ size_t _chunkSize;
+ public:
+ Params() : Params(std::make_unique<SymbolTable>()) { }
+ explicit Params(SymbolTable::UP symbols) : _symbols(std::move(symbols)), _chunkSize(4096) { }
+ Params & setChunkSize(size_t chunkSize) {
+ _chunkSize = chunkSize;
+ return *this;
+ }
+ size_t getChunkSize() const { return _chunkSize; }
+ SymbolTable::UP detachSymbols() { return std::move(_symbols); }
+ };
+ /**
+ * Construct an initially empty Slime object.
+ **/
+ explicit Slime(Params params = Params()) :
+ _names(params.detachSymbols()),
+ _stash(std::make_unique<Stash>(params.getChunkSize())),
+ _root(_stash.get())
+ { }
+
+ Slime(Slime &&rhs) :
+ _names(std::move(rhs._names)),
+ _stash(std::move(rhs._stash)),
+ _root(std::move(rhs._root))
+ {
+ }
+
+ Slime(const Slime & rhs) = delete;
+ Slime& operator = (const Slime & rhs) = delete;
+
+ static SymbolTable::UP reclaimSymbols(Slime &&rhs) {
+ rhs._stash.reset();
+ rhs._root = RootValue(nullptr);
+ return std::move(rhs._names);
+ }
+
+ Slime &operator=(Slime &&rhs) {
+ _names = std::move(rhs._names);
+ _stash = std::move(rhs._stash);
+ _root = std::move(rhs._root);
+ return *this;
+ }
+
+ size_t symbols() const {
+ return _names->symbols();
+ }
+
+ Memory inspect(Symbol symbol) const {
+ return _names->inspect(symbol);
+ }
+
+ Symbol insert(Memory name) {
+ return _names->insert(name);
+ }
+
+ Symbol lookup(Memory name) const {
+ return _names->lookup(name);
+ }
+
+ Cursor &get() { return _root.get(); }
+
+ Inspector &get() const { return _root.get(); }
+
+ Cursor &setNix() {
+ return _root.set(slime::NixValueFactory());
+ }
+ Cursor &setBool(bool bit) {
+ return _root.set(slime::BoolValueFactory(bit));
+ }
+ Cursor &setLong(int64_t l) {
+ return _root.set(slime::LongValueFactory(l));
+ }
+ Cursor &setDouble(double d) {
+ return _root.set(slime::DoubleValueFactory(d));
+ }
+ Cursor &setString(const Memory& str) {
+ return _root.set(slime::StringValueFactory(str));
+ }
+ Cursor &setData(const Memory& data) {
+ return _root.set(slime::DataValueFactory(data));
+ }
+ Cursor &setArray() {
+ return _root.set(slime::ArrayValueFactory(*_names));
+ }
+ Cursor &setObject() {
+ return _root.set(slime::ObjectValueFactory(*_names));
+ }
+
+ Cursor &wrap(Symbol sym) {
+ slime::ResolvedSymbol symbol(sym);
+ return *_root.wrap(*_names, symbol);
+ }
+
+ Cursor &wrap(Memory name) {
+ slime::NamedSymbolInserter symbol(*_names, name);
+ return *_root.wrap(*_names, symbol);
+ }
+
+ vespalib::string toString() const { return get().toString(); }
+};
+
+bool operator == (const Slime & a, const Slime & b);
+std::ostream & operator << (std::ostream & os, const Slime & slime);
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/slime.txt b/vespalib/src/vespa/vespalib/data/slime/slime.txt
new file mode 100644
index 00000000000..49d6e76502e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/slime.txt
@@ -0,0 +1,213 @@
+SLIME (Schema-Less Interface/Model/Exchange)
+============================================
+
+
+Introduction
+------------
+
+Slime is a binary format used to exchange JSON-like data structures
+combined with a reference-implementation that outlines how these data
+structures should be manipulated by the application.
+
+Design Goals:
+ - schema-less yet strictly typed
+ - simple yet efficient binary format
+ - simple application interaction while enabling internal optimizations
+
+Intended Usage:
+ - Interface: RPC/Packet/Message
+ - Model: Status/Metrics/Config/Schema
+ - Exchange: Documents/Records
+
+
+Data Model
+----------
+
+Slime: Symbol Table, Value
+Symbol Table: Symbol Name*
+Symbol Name: <string>
+Value: NIX | BOOL | LONG | DOUBLE | STRING | DATA | ARRAY | OBJECT
+NIX: // this datatype has no possible values
+BOOL: <bool>
+LONG: <signed integer>
+DOUBLE: <double>
+STRING: <string>
+DATA: <raw bytes>
+ARRAY: Value*
+OBJECT: (Symbol Id, Value)*
+Symbol Id: <unsigned integer>
+
+A slime data structure consists of two things; a symbol table and a
+value. The symbol table contains all unique field names that are used
+by the value. This separation is done in order to save space when
+dealing with nested or repeating structures, which are common in
+network interfaces used in distributed systems.
+
+Interaction with a Slime structure is done through a cursor interface
+where the cursor is used to move around and access the data stored in
+the Slime structure. This enables us to make slime structures feel
+more dynamic in C++ and to employ internal object storage
+optimizations in Java.
+
+Encoding and decoding is separated from the data model and use the
+public interfaces to build and inspect Slime structures. Encoding and
+decoding is performed on complete slime structures. This makes it
+easier to integrate with other formats and keeps the implementation
+more decoupled.
+
+Slime corresponds well with JSON, and encoding to a JSON string has
+been added to the reference C++ implementation. When encoding, you can
+select whether the output should be compact or readable, which enables
+the JSON encoder to also act as a tool to dump Slime structures in
+human readable format.
+
+A field has a name, its value has a type. This is an important
+difference from many schema-based approaches, where field names and
+types are closely tied together. The Slime approach enables us to
+encode values in a more uniform way across objects and arrays.
+
+Symbol ids are only valid within a single Slime structure. When
+operating on multiple Slime structures, field names must be used to
+identify equivalent fields in objects from different Slime structures.
+
+
+Binary Format
+-------------
+
+The binary format is the heart of Slime. It is intended to be a good
+mix of simple and efficient. Simple means it should be simple to
+understand and simple to implement. Efficient means it should be
+compact and fast to encode and decode.
+
+Slime defines 8 types and assigns them numbers according to increasing
+complexity: NIX(0), BOOL(1), LONG(2), DOUBLE(3), STRING(4), DATA(5),
+ARRAY(6), OBJECT(7).
+
+Binary encoding is performed by combining a few primary constructs in
+various ways:
+
+- type and meta byte (type_meta)
+
+ A single byte used to store a value type (0-7) and associated
+ meta-data (0-31). The 5 most significant bits are used for meta-data
+ while the 3 least significant bits are used for the type.
+
+ MSB LSB
+ +-----+---+
+ |76543|210|
+ +-----+---+
+ meta type
+
+- byte-compressed unsigned integer (cmpr_ulong)
+
+ A self-contained variable-length unsigned integer value where the
+ most significant bit of each byte is used as a continuation bit. The
+ sequence is terminated by a byte where the continuation bit is
+ 0. Each byte contains 7 bits of the total value. The first byte
+ contains the 7 least significant bits and so on (little endian).
+
+- unsigned integer (ulong)
+
+ An externally limited (length is stored elsewhere) variable length
+ unsigned integer value. Each byte contains 8 bits of the total
+ value. The first byte contains the 8 least significant bits and so
+ on (little endian).
+
+A complete Slime structure is encoded as a symbol table followed by a
+single value.
+
+symbol_table:
+ <cmpr_ulong> -> N,
+ (<cmpr_ulong> -> length, <byte> x length -> symbol_name) x N -> symbol_table
+
+The symbol table starts with a <cmpr_ulong> indicating the number of
+symbols in the symbol table followed by the symbols themselves. Each
+symbol is encoded as a <cmpr_ulong> indicating the byte size of the
+symbol name followed by the actual symbol name. The symbols are
+implicitly numbered according to order, starting from 0. These numbers
+will be used by objects to refer to symbols used as field identifiers.
+
+size(meta):
+ meta == 0: <cmpr_ulong> -> size
+ meta != 0: (meta - 1) -> size
+
+Many value types use the meta value stored together with the type to
+represent the size of something. However, the size may be larger than
+what can be stored in the meta value alone. A meta value of 0
+indicates that the size is stored in a separate <cmpr_ulong> directly
+after the <type_meta> byte. A meta value of 1-31 indicate that the
+size is stored in the meta value itself. In this case, the actual size
+is (meta - 1). This gives us a size range of [0..30] that can be
+stored directly as a meta value.
+
+value:
+ <type_meta> -> type, meta
+ type == NIX : <> -> nix_value
+ type == BOOL : meta -> bool_value
+ type == LONG : meta -> N, <ulong(N)> -> zigzag_decode -> long_value
+ type == DOUBLE : meta -> N, <ulong(N)> -> reverse_bytes -> double_value
+ type == STRING : <size(meta)> -> N, <byte> x N -> string_value
+ type == DATA : <size(meta)> -> N, <byte> x N -> data_value
+ type == ARRAY : <size(meta)> -> N, <value> x N -> array_value
+ type == OBJECT : <size(meta)> -> N,
+ (<cmpr_ulong> -> symbol_id, <value>) x N -> object_value
+
+The actual value has different binary format depending on the value
+type. However, all values always start with a <type_meta> byte
+containing the type and its attached meta value.
+
+A NIX value has no additional data, as there are no possible values
+for this type. The meta value will be ignored, but should be set to 0.
+
+A BOOL value has its value stored directly in the meta value; 0 means
+false, 1-31 means true.
+
+A LONG value is made unsigned by applying the zigzag transform
+first. Then, all non-null bytes are stored in little endian, and the
+number of stored bytes are stored as the meta value. This allows for
+up to 248-bit values, but the reference implementation only supports
+64-bit values for now.
+
+A DOUBLE value is first transformed to an unsigned 64-bit value
+representing its bit-pattern according to IEEE 754 (double). Then its
+bytes are reversed to get the most interesting data in the least
+significant bytes. Then, all non-null bytes are stored in little
+endian, and the number of stored bytes are stored as the meta value
+(same as for LONG values).
+
+Note that LONG and DOUBLE values of 0 and 0.0 will have 0 as meta
+value and take no additional space.
+
+STRING, DATA, ARRAY and OBJECT types all have a size that can be
+stored either directly (although incremented) as the meta value or as
+a <cmpr_ulong> directly following the <type_meta> byte (which is 0 in
+this case) as described above.
+
+For STRING and DATA values, the size indicate the number of bytes
+making up the value, and the value itself is simply those bytes
+verbatim.
+
+For ARRAY values, the size indicates the number of elements in the
+array. Each element is encoded directly after one another as a
+<value>. Arrays are dense and start with index 0. Note that array
+elements do not need to all be of the same type.
+
+For OBJECT values, the size indicates the number of fields in the
+object. Each field is encoded as a <cmpr_ulong> followed by a
+<value>. The number preceding the value is the symbol id of the field
+and must reference a valid entry in the symbol table.
+
+All structures are encoded by prepending local sizes. There is no need
+to precalculate the byte size of substructures up front when
+encoding. This avoids the need to traverse the structure twice. It
+also avoids the complexity of calculating the size of compressed data,
+as the space needed to store the size of a substructure depends on the
+size to be stored. On the other hand, this prevents skipping in the
+data while decoding. If an application really needs skipping, it can
+store encoded slime structures as DATA values. Another advantage of
+prepended sizes is that decoding becomes very simple as there is no
+need to look for record end markers or the like.
+
+When decoding, it is safe to pad with 0 bytes if there is a buffer
+underflow. This is utilized in the reference implementation to
+simplify error checking during decoding.
diff --git a/vespalib/src/vespa/vespalib/data/slime/stored_memory.cpp b/vespalib/src/vespa/vespalib/data/slime/stored_memory.cpp
new file mode 100644
index 00000000000..86fcd929539
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/stored_memory.cpp
@@ -0,0 +1,11 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "stored_memory.h"
+#include "memory.h"
+#include <stdlib.h>
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/stored_memory.h b/vespalib/src/vespa/vespalib/data/slime/stored_memory.h
new file mode 100644
index 00000000000..7ca4967b220
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/stored_memory.h
@@ -0,0 +1,41 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <stddef.h>
+#include <vespa/vespalib/data/slime/memory.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Simple class used to store a region of memory.
+ **/
+class StoredMemory
+{
+private:
+ friend struct Memory;
+ char *_data;
+ size_t _size;
+
+ StoredMemory(const StoredMemory &);
+ StoredMemory &operator=(const StoredMemory &);
+public:
+ explicit StoredMemory(const Memory &mem) :
+ _data(0),
+ _size(mem.size)
+ {
+ if (__builtin_expect(_size > 0, true)) {
+ _data = static_cast<char*>(malloc(_size));
+ memcpy(_data, mem.data, _size);
+ }
+ }
+
+ ~StoredMemory() {
+ free(_data);
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/strfmt.cpp b/vespalib/src/vespa/vespalib/data/slime/strfmt.cpp
new file mode 100644
index 00000000000..cabbaab9611
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/strfmt.cpp
@@ -0,0 +1,28 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "strfmt.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <assert.h>
+
+namespace vespalib {
+namespace slime {
+
+std::string strfmt(const char *fmt, ...)
+{
+ va_list ap;
+ std::string ret;
+ int size = 100;
+ do {
+ ret.resize(size + 1);
+ va_start(ap, fmt);
+ size = vsnprintf(&ret[0], ret.size(), fmt, ap);
+ va_end(ap);
+ } while (size >= (int) ret.size());
+ assert(size >= 0);
+ ret.resize(size);
+ return ret;
+}
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/strfmt.h b/vespalib/src/vespa/vespalib/data/slime/strfmt.h
new file mode 100644
index 00000000000..ac54ea3acb4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/strfmt.h
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <string>
+
+namespace vespalib {
+namespace slime {
+
+extern std::string strfmt(const char *fmt, ...)
+#ifdef __GNUC__
+ // Add printf format checks with gcc
+ __attribute__ ((format (printf,1,2)))
+#endif
+ ;
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol.cpp b/vespalib/src/vespa/vespalib/data/slime/symbol.cpp
new file mode 100644
index 00000000000..06b196be5f7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "symbol.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol.h b/vespalib/src/vespa/vespalib/data/slime/symbol.h
new file mode 100644
index 00000000000..a2bbf575187
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol.h
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <stdint.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * A Symbol may be used to look up a field within an OBJECT.
+ **/
+class Symbol
+{
+private:
+ static const uint32_t UNDEFINED = (uint32_t)-1;
+
+ uint32_t _value;
+
+public:
+ Symbol() : _value(UNDEFINED) {}
+ Symbol(uint32_t v) : _value(v) {}
+ bool undefined() const { return (_value == UNDEFINED); }
+ uint32_t getValue() const { return _value; }
+ bool operator<(const Symbol &rhs) const { return (_value < rhs._value); }
+ bool operator==(const Symbol &rhs) const { return (_value == rhs._value); }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol_inserter.cpp b/vespalib/src/vespa/vespalib/data/slime/symbol_inserter.cpp
new file mode 100644
index 00000000000..5dd3637ee61
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol_inserter.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "symbol_inserter.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol_inserter.h b/vespalib/src/vespa/vespalib/data/slime/symbol_inserter.h
new file mode 100644
index 00000000000..19c8de774b4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol_inserter.h
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "symbol.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Interface used to obtain the symbol for a field, and insert it into
+ * the symbol table if needed.
+ **/
+struct SymbolInserter {
+ virtual Symbol insert() = 0;
+ virtual ~SymbolInserter() {}
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol_lookup.cpp b/vespalib/src/vespa/vespalib/data/slime/symbol_lookup.cpp
new file mode 100644
index 00000000000..18f6ea24627
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol_lookup.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "symbol_lookup.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol_lookup.h b/vespalib/src/vespa/vespalib/data/slime/symbol_lookup.h
new file mode 100644
index 00000000000..86f4f32e086
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol_lookup.h
@@ -0,0 +1,20 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "symbol.h"
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Interface used to look up the symbol for a field.
+ **/
+struct SymbolLookup {
+ virtual Symbol lookup() const = 0;
+ virtual ~SymbolLookup() {}
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol_table.cpp b/vespalib/src/vespa/vespalib/data/slime/symbol_table.cpp
new file mode 100644
index 00000000000..161213bbc98
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol_table.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "symbol_table.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/symbol_table.h b/vespalib/src/vespa/vespalib/data/slime/symbol_table.h
new file mode 100644
index 00000000000..d6cdfe2c959
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/symbol_table.h
@@ -0,0 +1,65 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "symbol.h"
+#include "memory.h"
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/data/memorydatastore.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Maps between strings and symbols.
+ **/
+class SymbolTable
+{
+private:
+ struct hasher {
+ size_t operator () (const Memory & lcm) const {
+ return lcm.hash();
+ }
+ };
+ typedef hash_map<Memory, Symbol, hasher> SymbolMap;
+ typedef VariableSizeVector SymbolVector;
+ SymbolMap _symbols;
+ SymbolVector _names;
+
+public:
+ typedef std::unique_ptr<SymbolTable> UP;
+ SymbolTable(size_t expectedNumSymbols=16) : _symbols(3*expectedNumSymbols), _names() {}
+ size_t symbols() const { return _names.size(); }
+ Memory inspect(const Symbol &symbol) const {
+ if (symbol.getValue() > _names.size()) {
+ return Memory();
+ }
+ SymbolVector::Reference r(_names[symbol.getValue()]);
+ return Memory(r.c_str(), r.size());
+ }
+ Symbol insert(const Memory &name) {
+ SymbolMap::const_iterator pos = _symbols.find(name);
+ if (pos == _symbols.end()) {
+ Symbol symbol(_names.size());
+ SymbolVector::Reference r(_names.push_back(name.data, name.size));
+ _symbols.insert(std::make_pair(Memory(r.c_str(), r.size()), symbol));
+ return symbol;
+ }
+ return pos->second;
+ }
+ Symbol lookup(const Memory &name) const {
+ SymbolMap::const_iterator pos = _symbols.find(name);
+ if (pos == _symbols.end()) {
+ return Symbol();
+ }
+ return pos->second;
+ }
+ void clear() {
+ _names.clear();
+ _symbols.clear();
+ }
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/type.cpp b/vespalib/src/vespa/vespalib/data/slime/type.cpp
new file mode 100644
index 00000000000..1572feb8c55
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/type.cpp
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "type.h"
+
+namespace vespalib {
+namespace slime {
+
+template<int T> const uint32_t TypeType<T>::ID;
+template<int T> const TypeType<T> TypeType<T>::instance;
+
+template struct TypeType<NIX::ID>;
+template struct TypeType<BOOL::ID>;
+template struct TypeType<LONG::ID>;
+template struct TypeType<DOUBLE::ID>;
+template struct TypeType<STRING::ID>;
+template struct TypeType<DATA::ID>;
+template struct TypeType<ARRAY::ID>;
+template struct TypeType<OBJECT::ID>;
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/type.h b/vespalib/src/vespa/vespalib/data/slime/type.h
new file mode 100644
index 00000000000..61c7564431d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/type.h
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <stdint.h>
+
+namespace vespalib {
+namespace slime {
+
+/**
+ * Enumeration of slime data types.
+ **/
+class Type
+{
+private:
+ uint32_t _id;
+
+protected:
+ Type(uint32_t id) : _id(id) {}
+
+public:
+ uint32_t getId() const { return _id; }
+};
+
+/**
+ * Separate types for each data type; to be able to specify types at
+ * compile-time as well as run-time.
+ **/
+template<int T>
+struct TypeType : public Type {
+ static const uint32_t ID = T;
+ static const TypeType instance;
+ TypeType() : Type(ID) {}
+};
+typedef TypeType<0> NIX;
+typedef TypeType<1> BOOL;
+typedef TypeType<2> LONG;
+typedef TypeType<3> DOUBLE;
+typedef TypeType<4> STRING;
+typedef TypeType<5> DATA;
+typedef TypeType<6> ARRAY;
+typedef TypeType<7> OBJECT;
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/value.cpp b/vespalib/src/vespa/vespalib/data/slime/value.cpp
new file mode 100644
index 00000000000..1b0b1fc01d4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/value.cpp
@@ -0,0 +1,141 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "value.h"
+#include "nix_value.h"
+#include "resolved_symbol.h"
+#include "empty_value_factory.h"
+#include "basic_value_factory.h"
+#include "simple_buffer.h"
+#include "json_format.h"
+
+namespace vespalib {
+namespace slime {
+
+bool
+Value::valid() const {
+ return (this != NixValue::invalid());
+}
+
+Type
+Value::type() const {
+ return NIX::instance;
+}
+
+size_t
+Value::children() const {
+ return 0;
+}
+
+size_t
+Value::entries() const {
+ return 0;
+}
+
+size_t
+Value::fields() const {
+ return 0;
+}
+
+// default NOPs for leaf values
+Cursor &
+Value::addLeaf(const ValueFactory &) { return *NixValue::invalid(); }
+Cursor &
+Value::setLeaf(Symbol, const ValueFactory &) { return *NixValue::invalid(); }
+Cursor &
+Value::setLeaf(Memory, const ValueFactory &) { return *NixValue::invalid(); }
+
+// default values for accessors
+bool
+Value::asBool() const { return false; }
+int64_t
+Value::asLong() const { return 0; }
+double
+Value::asDouble() const { return 0.0; }
+Memory
+Value::asString() const { return Memory(); }
+Memory
+Value::asData() const { return Memory(); }
+
+Cursor &
+Value::operator[](size_t) const { return *NixValue::invalid(); }
+Cursor &
+Value::operator[](Symbol) const { return *NixValue::invalid(); }
+Cursor &
+Value::operator[](Memory) const { return *NixValue::invalid(); }
+
+// default NOPs for traversal
+void
+Value::traverse(ArrayTraverser &) const {}
+void
+Value::traverse(ObjectSymbolTraverser &) const {}
+void
+Value::traverse(ObjectTraverser &) const {}
+
+// generate string representation
+vespalib::string
+Value::toString() const
+{
+ slime::SimpleBuffer buf;
+ slime::JsonFormat::encode(*this, buf, false);
+ return buf.get().make_string();
+}
+
+// 6 x add
+Cursor &
+Value::addNix() { return addLeaf(NixValueFactory()); }
+Cursor &
+Value::addBool(bool bit) { return addLeaf(BoolValueFactory(bit)); }
+Cursor &
+Value::addLong(int64_t l) { return addLeaf(LongValueFactory(l)); }
+Cursor &
+Value::addDouble(double d) { return addLeaf(DoubleValueFactory(d)); }
+Cursor &
+Value::addString(Memory str) { return addLeaf(StringValueFactory(str)); }
+Cursor &
+Value::addData(Memory data) { return addLeaf(DataValueFactory(data)); }
+
+// 6 x set (with numeric symbol id)
+Cursor &
+Value::setNix(Symbol sym) { return setLeaf(sym, NixValueFactory()); }
+Cursor &
+Value::setBool(Symbol sym, bool bit) { return setLeaf(sym, BoolValueFactory(bit)); }
+Cursor &
+Value::setLong(Symbol sym, int64_t l) { return setLeaf(sym, LongValueFactory(l)); }
+Cursor &
+Value::setDouble(Symbol sym, double d) { return setLeaf(sym, DoubleValueFactory(d)); }
+Cursor &
+Value::setString(Symbol sym, Memory str) { return setLeaf(sym, StringValueFactory(str)); }
+Cursor &
+Value::setData(Symbol sym, Memory data) { return setLeaf(sym, DataValueFactory(data)); }
+
+// 6 x set (with symbol name)
+Cursor &
+Value::setNix(Memory name) { return setLeaf(name, NixValueFactory()); }
+Cursor &
+Value::setBool(Memory name, bool bit) { return setLeaf(name, BoolValueFactory(bit)); }
+Cursor &
+Value::setLong(Memory name, int64_t l) { return setLeaf(name, LongValueFactory(l)); }
+Cursor &
+Value::setDouble(Memory name, double d) { return setLeaf(name, DoubleValueFactory(d)); }
+Cursor &
+Value::setString(Memory name, Memory str) { return setLeaf(name, StringValueFactory(str)); }
+Cursor &
+Value::setData(Memory name, Memory data) { return setLeaf(name, DataValueFactory(data)); }
+
+// nop defaults for array/objects
+Cursor &
+Value::addArray() { return *NixValue::invalid(); }
+Cursor &
+Value::addObject() { return *NixValue::invalid(); }
+
+Cursor &
+Value::setArray(Symbol) { return *NixValue::invalid(); }
+Cursor &
+Value::setObject(Symbol) { return *NixValue::invalid(); }
+Cursor &
+Value::setArray(Memory) { return *NixValue::invalid(); }
+Cursor &
+Value::setObject(Memory) { return *NixValue::invalid(); }
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/value.h b/vespalib/src/vespa/vespalib/data/slime/value.h
new file mode 100644
index 00000000000..7ed2d51ffa1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/value.h
@@ -0,0 +1,85 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "type.h"
+#include "cursor.h"
+
+namespace vespalib {
+namespace slime {
+
+class SymbolTable;
+struct SymbolLookup;
+struct SymbolInserter;
+struct ValueFactory;
+struct ArrayTraverser;
+struct ObjectTraverser;
+
+/**
+ * Top-level value class with default behavior for all virtual
+ * functions.
+ **/
+class Value : public Cursor
+{
+protected:
+ virtual ~Value() {}
+
+ virtual Cursor &addLeaf(const ValueFactory &input);
+ virtual Cursor &setLeaf(Symbol symbol, const ValueFactory &input);
+ virtual Cursor &setLeaf(Memory name, const ValueFactory &input);
+
+public:
+ virtual bool valid() const;
+ virtual Type type() const;
+ virtual size_t children() const;
+ virtual size_t entries() const;
+ virtual size_t fields() const;
+
+ virtual bool asBool() const;
+ virtual int64_t asLong() const;
+ virtual double asDouble() const;
+ virtual Memory asString() const;
+ virtual Memory asData() const;
+
+ virtual void traverse(ArrayTraverser &at) const;
+ virtual void traverse(ObjectSymbolTraverser &ot) const;
+ virtual void traverse(ObjectTraverser &ot) const;
+
+ virtual vespalib::string toString() const override;
+
+ virtual Cursor &operator[](size_t idx) const;
+ virtual Cursor &operator[](Symbol sym) const;
+ virtual Cursor &operator[](Memory name) const;
+
+ virtual Cursor &addNix();
+ virtual Cursor &addBool(bool bit);
+ virtual Cursor &addLong(int64_t l);
+ virtual Cursor &addDouble(double d);
+ virtual Cursor &addString(Memory str);
+ virtual Cursor &addData(Memory data);
+ virtual Cursor &addArray();
+ virtual Cursor &addObject();
+
+ virtual Cursor &setNix(Symbol sym);
+ virtual Cursor &setBool(Symbol sym, bool bit);
+ virtual Cursor &setLong(Symbol sym, int64_t l);
+ virtual Cursor &setDouble(Symbol sym, double d);
+ virtual Cursor &setString(Symbol sym, Memory str);
+ virtual Cursor &setData(Symbol sym, Memory data);
+ virtual Cursor &setArray(Symbol sym);
+ virtual Cursor &setObject(Symbol sym);
+
+ virtual Cursor &setNix(Memory name);
+ virtual Cursor &setBool(Memory name, bool bit);
+ virtual Cursor &setLong(Memory name, int64_t l);
+ virtual Cursor &setDouble(Memory name, double d);
+ virtual Cursor &setString(Memory name, Memory str);
+ virtual Cursor &setData(Memory name, Memory str);
+ virtual Cursor &setArray(Memory name);
+ virtual Cursor &setObject(Memory name);
+
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/data/slime/value_factory.cpp b/vespalib/src/vespa/vespalib/data/slime/value_factory.cpp
new file mode 100644
index 00000000000..95d5cda302d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/value_factory.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "value_factory.h"
+
+namespace vespalib {
+namespace slime {
+
+} // namespace vespalib::slime
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/data/slime/value_factory.h b/vespalib/src/vespa/vespalib/data/slime/value_factory.h
new file mode 100644
index 00000000000..dc278a2368a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/data/slime/value_factory.h
@@ -0,0 +1,24 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+class Stash;
+
+namespace slime {
+
+class Value;
+
+/**
+ * Interface used to create a value object with type and content known
+ * by the implementation, but not by the caller.
+ **/
+struct ValueFactory {
+ virtual Value *create(Stash & stash) const = 0;
+ virtual ~ValueFactory() {}
+};
+
+} // namespace vespalib::slime
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/eval/CMakeLists.txt b/vespalib/src/vespa/vespalib/eval/CMakeLists.txt
new file mode 100644
index 00000000000..fb2e0400fce
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_eval OBJECT
+ SOURCES
+ basic_nodes.cpp
+ call_nodes.cpp
+ compile_cache.cpp
+ compiled_function.cpp
+ deinline_forest.cpp
+ delete_node.cpp
+ eval_spec.cpp
+ function.cpp
+ gbdt.cpp
+ interpreted_function.cpp
+ key_gen.cpp
+ llvm_wrapper.cpp
+ node_types.cpp
+ operation.cpp
+ operator_nodes.cpp
+ simple_tensor.cpp
+ simple_tensor_engine.cpp
+ tensor_engine.cpp
+ tensor_nodes.cpp
+ tensor_spec.cpp
+ value.cpp
+ value_type.cpp
+ value_type_spec.cpp
+ vm_forest.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/eval/basic_nodes.cpp b/vespalib/src/vespa/vespalib/eval/basic_nodes.cpp
new file mode 100644
index 00000000000..241900ea156
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/basic_nodes.cpp
@@ -0,0 +1,129 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "basic_nodes.h"
+#include "node_traverser.h"
+#include "node_visitor.h"
+#include "interpreted_function.h"
+#include "simple_tensor_engine.h"
+
+namespace vespalib {
+namespace eval {
+namespace nodes {
+
+namespace {
+
+struct Frame {
+ const Node &node;
+ size_t child_idx;
+ explicit Frame(const Node &node_in) : node(node_in), child_idx(0) {}
+ bool has_next_child() const { return (child_idx < node.num_children()); }
+ const Node &next_child() { return node.get_child(child_idx++); }
+};
+
+} // namespace vespalib::eval::nodes::<unnamed>
+
+double
+Node::get_const_value() const {
+ assert(is_const());
+ InterpretedFunction function(SimpleTensorEngine::ref(), *this, 0);
+ InterpretedFunction::Context ctx;
+ return function.eval(ctx).as_double();
+}
+
+void
+Node::traverse(NodeTraverser &traverser) const
+{
+ if (!traverser.open(*this)) {
+ return;
+ }
+ std::vector<Frame> stack({Frame(*this)});
+ while (!stack.empty()) {
+ if (stack.back().has_next_child()) {
+ const Node &next_child = stack.back().next_child();
+ if (traverser.open(next_child)) {
+ stack.emplace_back(next_child);
+ }
+ } else {
+ traverser.close(stack.back().node);
+ stack.pop_back();
+ }
+ }
+}
+
+void Number::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void Symbol::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void String::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void Array ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void Neg ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void Not ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void If ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void Let ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void Error ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+
+vespalib::string
+String::dump(DumpContext &) const
+{
+ vespalib::string str;
+ str.push_back('"');
+ for (uint32_t i = 0; i < _value.size(); ++i) {
+ char c = _value[i];
+ switch (c) {
+ case '\\':
+ str.append("\\\\");
+ break;
+ case '"':
+ str.append("\\\"");
+ break;
+ case '\t':
+ str.append("\\t");
+ break;
+ case '\n':
+ str.append("\\n");
+ break;
+ case '\r':
+ str.append("\\r");
+ break;
+ case '\f':
+ str.append("\\f");
+ break;
+ default:
+ if (static_cast<unsigned char>(c) >= 32 &&
+ static_cast<unsigned char>(c) <= 126)
+ {
+ str.push_back(c);
+ } else {
+ const char *lookup = "0123456789abcdef";
+ str.append("\\x");
+ str.push_back(lookup[(c >> 4) & 0xf]);
+ str.push_back(lookup[c & 0xf]);
+ }
+ }
+ }
+ str.push_back('"');
+ return str;
+}
+
+If::If(Node_UP cond_in, Node_UP true_expr_in, Node_UP false_expr_in, double p_true_in)
+ : _cond(std::move(cond_in)),
+ _true_expr(std::move(true_expr_in)),
+ _false_expr(std::move(false_expr_in)),
+ _p_true(p_true_in),
+ _is_tree(false)
+{
+ auto less = as<Less>(cond());
+ auto in = as<In>(cond());
+ bool true_is_subtree = (true_expr().is_tree() || true_expr().is_const());
+ bool false_is_subtree = (false_expr().is_tree() || false_expr().is_const());
+ if (true_is_subtree && false_is_subtree) {
+ if (less) {
+ _is_tree = (less->lhs().is_param() && less->rhs().is_const());
+ } else if (in) {
+ _is_tree = (in->lhs().is_param() && in->rhs().is_const());
+ }
+ }
+}
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/basic_nodes.h b/vespalib/src/vespa/vespalib/eval/basic_nodes.h
new file mode 100644
index 00000000000..41f7e2a6c18
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/basic_nodes.h
@@ -0,0 +1,339 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <memory>
+#include <map>
+#include <vector>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/string_hash.h>
+
+namespace vespalib {
+namespace eval {
+
+namespace nodes { class Node; }
+
+struct NodeTraverser;
+struct NodeVisitor;
+
+/**
+ * Simple interface for handing the ownership of an AST Node from one
+ * actor to another.
+ **/
+struct NodeHandler {
+ virtual void handle(std::unique_ptr<nodes::Node> node) = 0;
+ virtual ~NodeHandler() {}
+};
+
+namespace nodes {
+
+/**
+ * Context object used when dumping an AST to text to keep track of
+ * the names of bound values.
+ **/
+struct DumpContext {
+ const std::vector<vespalib::string> &param_names;
+ std::vector<vespalib::string> let_names;
+ DumpContext(const std::vector<vespalib::string> &param_names_in)
+ : param_names(param_names_in), let_names() {}
+};
+
+/**
+ * Abstract base class of all nodes in an AST. Each node in an AST has
+ * exclusive ownership of its children.
+ **/
+struct Node {
+ virtual bool is_forest() const { return false; }
+ virtual bool is_tree() const { return false; }
+ virtual bool is_const() const { return false; }
+ virtual bool is_param() const { return false; }
+ virtual double get_const_value() const;
+ void traverse(NodeTraverser &traverser) const;
+ virtual vespalib::string dump(DumpContext &ctx) const = 0;
+ virtual void accept(NodeVisitor &visitor) const = 0;
+ virtual size_t num_children() const = 0;
+ virtual const Node &get_child(size_t idx) const = 0;
+ virtual void detach_children(NodeHandler &handler) = 0;
+ bool is_leaf() const { return (num_children() == 0); }
+ virtual ~Node() {}
+};
+typedef std::unique_ptr<Node> Node_UP;
+
+/**
+ * Simple typecasting utility. Intended usage:
+ * <pre>
+ * auto number = as<Number>(node);
+ * if (number) {
+ * do_stuff(number->value());
+ * }
+ * </pre>
+ **/
+template <typename T>
+const T *as(const Node &node) { return dynamic_cast<const T *>(&node); }
+
+/**
+ * AST leaf nodes should inherit from this class to easy their API
+ * burden by not having to care about the concept of children.
+ **/
+struct Leaf : public Node {
+ virtual size_t num_children() const override { return 0; }
+ virtual const Node &get_child(size_t) const override { assert(false); }
+ virtual void detach_children(NodeHandler &) override {}
+};
+
+/**
+ * Helper class used to insert commas on the appropriate places in
+ * comma-separated textual lists.
+ **/
+struct CommaTracker {
+ bool first;
+ CommaTracker() : first(true) {}
+ void maybe_comma(vespalib::string &dst) {
+ if (first) {
+ first = false;
+ } else {
+ dst.push_back(',');
+ }
+ }
+};
+
+class Number : public Leaf {
+private:
+ double _value;
+public:
+ Number(double value_in) : _value(value_in) {}
+ virtual bool is_const() const override { return true; }
+ virtual double get_const_value() const override { return value(); }
+ double value() const { return _value; }
+ virtual vespalib::string dump(DumpContext &) const {
+ return make_string("%g", _value);
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class Symbol : public Leaf {
+private:
+ int _id;
+public:
+ static const int UNDEF = std::numeric_limits<int>::max();
+ explicit Symbol(int id_in) : _id(id_in) {}
+ int id() const { return _id; }
+ virtual bool is_param() const override {
+ return (_id >= 0);
+ }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ if (_id >= 0) { // param value
+ assert(size_t(_id) < ctx.param_names.size());
+ return ctx.param_names[_id];
+ } else { // let binding
+ int let_offset = -(_id + 1);
+ assert(size_t(let_offset) < ctx.let_names.size());
+ return ctx.let_names[let_offset];
+ }
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class String : public Leaf {
+private:
+ vespalib::string _value;
+public:
+ String(const vespalib::string &value_in) : _value(value_in) {}
+ virtual bool is_const() const override { return true; }
+ virtual double get_const_value() const override { return hash(); }
+ const vespalib::string value() const { return _value; }
+ uint32_t hash() const { return hash_code(_value.data(), _value.size()); }
+ virtual vespalib::string dump(DumpContext &ctx) const;
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class Array : public Node {
+private:
+ std::vector<Node_UP> _nodes;
+ bool _is_const;
+public:
+ Array() : _nodes(), _is_const(false) {}
+ virtual bool is_const() const override { return _is_const; }
+ size_t size() const { return _nodes.size(); }
+ const Node &get(size_t i) const { return *_nodes[i]; }
+ virtual size_t num_children() const override { return size(); }
+ virtual const Node &get_child(size_t idx) const override { return get(idx); }
+ virtual void detach_children(NodeHandler &handler) override {
+ for (size_t i = 0; i < _nodes.size(); ++i) {
+ handler.handle(std::move(_nodes[i]));
+ }
+ _nodes.clear();
+ }
+ void add(Node_UP node) {
+ if (_nodes.empty()) {
+ _is_const = node->is_const();
+ } else {
+ _is_const = (_is_const && node->is_const());
+ }
+ _nodes.push_back(std::move(node));
+ }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "[";
+ CommaTracker node_list;
+ for (const auto &node: _nodes) {
+ node_list.maybe_comma(str);
+ str += node->dump(ctx);
+ }
+ str += "]";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class Neg : public Node {
+private:
+ Node_UP _child;
+ bool _is_const;
+public:
+ Neg(Node_UP child_in) : _child(std::move(child_in)), _is_const(_child->is_const()) {}
+ virtual bool is_const() const override { return _is_const; }
+ const Node &child() const { return *_child; }
+ virtual size_t num_children() const override { return _child ? 1 : 0; }
+ virtual const Node &get_child(size_t idx) const override {
+ assert(idx == 0);
+ return child();
+ }
+ virtual void detach_children(NodeHandler &handler) override {
+ handler.handle(std::move(_child));
+ }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "(-";
+ str += _child->dump(ctx);
+ str += ")";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class Not : public Node {
+private:
+ Node_UP _child;
+ bool _is_const;
+public:
+ Not(Node_UP child_in) : _child(std::move(child_in)), _is_const(_child->is_const()) {}
+ virtual bool is_const() const override { return _is_const; }
+ const Node &child() const { return *_child; }
+ virtual size_t num_children() const override { return _child ? 1 : 0; }
+ virtual const Node &get_child(size_t idx) const override {
+ assert(idx == 0);
+ return child();
+ }
+ virtual void detach_children(NodeHandler &handler) override {
+ handler.handle(std::move(_child));
+ }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "(!";
+ str += _child->dump(ctx);
+ str += ")";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class If : public Node {
+private:
+ Node_UP _cond;
+ Node_UP _true_expr;
+ Node_UP _false_expr;
+ double _p_true;
+ bool _is_tree;
+public:
+ If(Node_UP cond_in, Node_UP true_expr_in, Node_UP false_expr_in, double p_true_in);
+ const Node &cond() const { return *_cond; }
+ const Node &true_expr() const { return *_true_expr; }
+ const Node &false_expr() const { return *_false_expr; }
+ double p_true() const { return _p_true; }
+ virtual bool is_tree() const override { return _is_tree; }
+ virtual size_t num_children() const override {
+ return (_cond && _true_expr && _false_expr) ? 3 : 0;
+ }
+ virtual const Node &get_child(size_t idx) const override {
+ assert(idx < 3);
+ if (idx == 0) {
+ return cond();
+ } else if (idx == 1) {
+ return true_expr();
+ } else {
+ return false_expr();
+ }
+ }
+ virtual void detach_children(NodeHandler &handler) override {
+ handler.handle(std::move(_cond));
+ handler.handle(std::move(_true_expr));
+ handler.handle(std::move(_false_expr));
+ }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "if(";
+ str += _cond->dump(ctx);
+ str += ",";
+ str += _true_expr->dump(ctx);
+ str += ",";
+ str += _false_expr->dump(ctx);
+ if (_p_true != 0.5) {
+ str += make_string(",%g", _p_true);
+ }
+ str += ")";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class Let : public Node {
+private:
+ vespalib::string _name;
+ Node_UP _value;
+ Node_UP _expr;
+public:
+ Let(const vespalib::string &name_in, Node_UP value_in, Node_UP expr_in)
+ : _name(name_in), _value(std::move(value_in)), _expr(std::move(expr_in)) {}
+ const vespalib::string &name() const { return _name; }
+ const Node &value() const { return *_value; }
+ const Node &expr() const { return *_expr; }
+ virtual size_t num_children() const override { return (_value && _expr) ? 2 : 0; }
+ virtual const Node &get_child(size_t idx) const override {
+ assert(idx < 2);
+ return (idx == 0) ? value() : expr();
+ }
+ virtual void detach_children(NodeHandler &handler) override {
+ handler.handle(std::move(_value));
+ handler.handle(std::move(_expr));
+ }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "let(";
+ str += _name;
+ str += ",";
+ str += _value->dump(ctx);
+ str += ",";
+ ctx.let_names.push_back(_name);
+ str += _expr->dump(ctx);
+ ctx.let_names.pop_back();
+ str += ")";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class Error : public Leaf {
+private:
+ vespalib::string _message;
+public:
+ Error(const vespalib::string &message_in) : _message(message_in) {}
+ const vespalib::string &message() const { return _message; }
+ virtual vespalib::string dump(DumpContext &) const { return _message; }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/call_nodes.cpp b/vespalib/src/vespa/vespalib/eval/call_nodes.cpp
new file mode 100644
index 00000000000..883fea9429a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/call_nodes.cpp
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "call_nodes.h"
+#include "node_visitor.h"
+
+namespace vespalib {
+namespace eval {
+namespace nodes {
+
+template <typename T> void CallHelper<T>::accept(NodeVisitor &visitor) const {
+ visitor.visit(static_cast<const T&>(*this));
+}
+
+CallRepo CallRepo::_instance;
+CallRepo::CallRepo() : _map() {
+ add(nodes::Cos());
+ add(nodes::Sin());
+ add(nodes::Tan());
+ add(nodes::Cosh());
+ add(nodes::Sinh());
+ add(nodes::Tanh());
+ add(nodes::Acos());
+ add(nodes::Asin());
+ add(nodes::Atan());
+ add(nodes::Exp());
+ add(nodes::Log10());
+ add(nodes::Log());
+ add(nodes::Sqrt());
+ add(nodes::Ceil());
+ add(nodes::Fabs());
+ add(nodes::Floor());
+ add(nodes::Atan2());
+ add(nodes::Ldexp());
+ add(nodes::Pow2());
+ add(nodes::Fmod());
+ add(nodes::Min());
+ add(nodes::Max());
+ add(nodes::IsNan());
+}
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/call_nodes.h b/vespalib/src/vespa/vespalib/eval/call_nodes.h
new file mode 100644
index 00000000000..db3d18cd359
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/call_nodes.h
@@ -0,0 +1,142 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include "basic_nodes.h"
+#include <map>
+#include <cmath>
+
+namespace vespalib {
+namespace eval {
+
+struct NodeVisitor;
+
+namespace nodes {
+
+/**
+ * Common superclass for AST nodes describing calls to built-in
+ * functions. A call has a (function) name and a pre-defined number of
+ * parameters that must be matched by the parsed expression.
+ **/
+class Call : public Node {
+private:
+ vespalib::string _name;
+ size_t _num_params;
+ std::vector<Node_UP> _args;
+ bool _is_const;
+public:
+ Call(const vespalib::string &name_in, size_t num_params_in)
+ : _name(name_in), _num_params(num_params_in), _is_const(false) {}
+ virtual bool is_const() const override { return _is_const; }
+ const vespalib::string &name() const { return _name; }
+ size_t num_params() const { return _num_params; }
+ size_t num_args() const { return _args.size(); }
+ const Node &arg(size_t i) const { return *_args[i]; }
+ virtual size_t num_children() const override { return num_args(); }
+ virtual const Node &get_child(size_t idx) const override { return arg(idx); }
+ virtual void detach_children(NodeHandler &handler) override {
+ for (size_t i = 0; i < _args.size(); ++i) {
+ handler.handle(std::move(_args[i]));
+ }
+ _args.clear();
+ }
+ virtual void bind_next(Node_UP arg_in) {
+ if (_args.empty()) {
+ _is_const = arg_in->is_const();
+ } else {
+ _is_const = (_is_const && arg_in->is_const());
+ }
+ _args.push_back(std::move(arg_in));
+ }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += _name;
+ str += "(";
+ for (size_t i = 0; i < _args.size(); ++i) {
+ if (i > 0) {
+ str += ",";
+ }
+ str += arg(i).dump(ctx);
+ }
+ str += ")";
+ return str;
+ }
+};
+typedef std::unique_ptr<Call> Call_UP;
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Repository for known built-in functions. This is used by the parser
+ * to create appropriate call nodes by looking up function names.
+ **/
+class CallRepo {
+private:
+ static CallRepo _instance;
+ typedef nodes::Call_UP (*factory_type)();
+ std::map<vespalib::string,factory_type> _map;
+ template <typename T>
+ void add(const T &op) { _map[op.name()] = T::create; }
+ CallRepo();
+public:
+ static const CallRepo &instance() { return _instance; }
+ nodes::Call_UP create(const vespalib::string &name) const {
+ auto result = _map.find(name);
+ if (result != _map.end()) {
+ return result->second();
+ }
+ return nodes::Call_UP(nullptr);
+ }
+ std::vector<vespalib::string> get_names() const {
+ std::vector<vespalib::string> ret;
+ for (const auto &entry: _map) {
+ ret.push_back(entry.first);
+ }
+ return ret;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+struct CallHelper : Call {
+ typedef CallHelper<T> Helper;
+ CallHelper(const vespalib::string &name_in, size_t num_params_in)
+ : Call(name_in, num_params_in) {}
+ virtual void accept(NodeVisitor &visitor) const override;
+ static Call_UP create() { return Call_UP(new T()); }
+};
+
+//-----------------------------------------------------------------------------
+
+struct Cos : CallHelper<Cos> { Cos() : Helper("cos", 1) {} };
+struct Sin : CallHelper<Sin> { Sin() : Helper("sin", 1) {} };
+struct Tan : CallHelper<Tan> { Tan() : Helper("tan", 1) {} };
+struct Cosh : CallHelper<Cosh> { Cosh() : Helper("cosh", 1) {} };
+struct Sinh : CallHelper<Sinh> { Sinh() : Helper("sinh", 1) {} };
+struct Tanh : CallHelper<Tanh> { Tanh() : Helper("tanh", 1) {} };
+struct Acos : CallHelper<Acos> { Acos() : Helper("acos", 1) {} };
+struct Asin : CallHelper<Asin> { Asin() : Helper("asin", 1) {} };
+struct Atan : CallHelper<Atan> { Atan() : Helper("atan", 1) {} };
+struct Exp : CallHelper<Exp> { Exp() : Helper("exp", 1) {} };
+struct Log10 : CallHelper<Log10> { Log10() : Helper("log10", 1) {} };
+struct Log : CallHelper<Log> { Log() : Helper("log", 1) {} };
+struct Sqrt : CallHelper<Sqrt> { Sqrt() : Helper("sqrt", 1) {} };
+struct Ceil : CallHelper<Ceil> { Ceil() : Helper("ceil", 1) {} };
+struct Fabs : CallHelper<Fabs> { Fabs() : Helper("fabs", 1) {} };
+struct Floor : CallHelper<Floor> { Floor() : Helper("floor", 1) {} };
+struct Atan2 : CallHelper<Atan2> { Atan2() : Helper("atan2", 2) {} };
+struct Ldexp : CallHelper<Ldexp> { Ldexp() : Helper("ldexp", 2) {} };
+struct Pow2 : CallHelper<Pow2> { Pow2() : Helper("pow", 2) {} };
+struct Fmod : CallHelper<Fmod> { Fmod() : Helper("fmod", 2) {} };
+struct Min : CallHelper<Min> { Min() : Helper("min", 2) {} };
+struct Max : CallHelper<Max> { Max() : Helper("max", 2) {} };
+struct IsNan : CallHelper<IsNan> { IsNan() : Helper("isNan", 1) {} };
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/check_type.h b/vespalib/src/vespa/vespalib/eval/check_type.h
new file mode 100644
index 00000000000..30ef3e69da3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/check_type.h
@@ -0,0 +1,37 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "node_visitor.h"
+
+namespace vespalib {
+namespace eval {
+namespace nodes {
+
+/**
+ * A templated visitor used to check if the visited node matches any
+ * of the given types.
+ **/
+
+template <typename... TYPES> struct CheckTypeVisitor;
+
+template <>
+struct CheckTypeVisitor<> : EmptyNodeVisitor {
+ bool result = false;
+};
+
+template <typename HEAD, typename... TAIL>
+struct CheckTypeVisitor<HEAD, TAIL...> : CheckTypeVisitor<TAIL...> {
+ virtual void visit(const HEAD &) override { this->result = true; }
+};
+
+template <typename... TYPES>
+bool check_type(const nodes::Node &node) {
+ CheckTypeVisitor<TYPES...> check;
+ node.accept(check);
+ return check.result;
+}
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/compile_cache.cpp b/vespalib/src/vespa/vespalib/eval/compile_cache.cpp
new file mode 100644
index 00000000000..2a104f87f84
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/compile_cache.cpp
@@ -0,0 +1,66 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compile_cache.h"
+#include "key_gen.h"
+#include <thread>
+
+namespace vespalib {
+namespace eval {
+
+std::mutex CompileCache::_lock;
+CompileCache::Map CompileCache::_cached;
+
+void
+CompileCache::release(Map::iterator entry)
+{
+ std::lock_guard<std::mutex> guard(_lock);
+ if (--(entry->second.num_refs) == 0) {
+ _cached.erase(entry);
+ }
+}
+
+CompileCache::Token::UP
+CompileCache::compile(const Function &function, PassParams pass_params)
+{
+ std::lock_guard<std::mutex> guard(_lock);
+ CompileContext compile_ctx(function, pass_params);
+ std::thread thread(do_compile, std::ref(compile_ctx));
+ thread.join();
+ return std::move(compile_ctx.token);
+}
+
+size_t
+CompileCache::num_cached()
+{
+ std::lock_guard<std::mutex> guard(_lock);
+ return _cached.size();
+}
+
+size_t
+CompileCache::count_refs()
+{
+ std::lock_guard<std::mutex> guard(_lock);
+ size_t refs = 0;
+ for (const auto &entry: _cached) {
+ refs += entry.second.num_refs;
+ }
+ return refs;
+}
+
+void
+CompileCache::do_compile(CompileContext &ctx) {
+ vespalib::string key = gen_key(ctx.function, ctx.pass_params);
+ auto pos = _cached.find(key);
+ if (pos != _cached.end()) {
+ ++(pos->second.num_refs);
+ ctx.token.reset(new Token(pos));
+ } else {
+ auto res = _cached.emplace(std::move(key), Value(CompiledFunction(ctx.function, ctx.pass_params)));
+ assert(res.second);
+ ctx.token.reset(new Token(res.first));
+ }
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/compile_cache.h b/vespalib/src/vespa/vespalib/eval/compile_cache.h
new file mode 100644
index 00000000000..f137b37ba85
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/compile_cache.h
@@ -0,0 +1,68 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "compiled_function.h"
+#include <mutex>
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * A compilation cache used to reduce application configuration cost
+ * by not having to compile equivalent expressions multiple times. The
+ * expression AST is used to produce a binary key that in turn is used
+ * to query the cache. The cache itself will not keep anything alive,
+ * but will let you find compiled functions that are currently in use
+ * by others.
+ **/
+class CompileCache
+{
+private:
+ typedef vespalib::string Key;
+ struct Value {
+ size_t num_refs;
+ CompiledFunction cf;
+ Value(CompiledFunction &&cf_in) : num_refs(1), cf(std::move(cf_in)) {}
+ };
+ typedef std::map<Key,Value> Map;
+ static std::mutex _lock;
+ static Map _cached;
+
+ static void release(Map::iterator entry);
+
+public:
+ class Token
+ {
+ private:
+ friend class CompileCache;
+ CompileCache::Map::iterator entry;
+ explicit Token(CompileCache::Map::iterator entry_in)
+ : entry(entry_in) {}
+ public:
+ typedef std::unique_ptr<Token> UP;
+ const CompiledFunction &get() const { return entry->second.cf; }
+ ~Token() { CompileCache::release(entry); }
+ };
+ static Token::UP compile(const Function &function, PassParams pass_params);
+ static size_t num_cached();
+ static size_t count_refs();
+
+private:
+ struct CompileContext {
+ const Function &function;
+ PassParams pass_params;
+ Token::UP token;
+ CompileContext(const Function &function_in,
+ PassParams pass_params_in)
+ : function(function_in),
+ pass_params(pass_params_in),
+ token() {}
+ };
+
+ static void do_compile(CompileContext &ctx);
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/eval/compiled_function.cpp b/vespalib/src/vespa/vespalib/eval/compiled_function.cpp
new file mode 100644
index 00000000000..957df7503c3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/compiled_function.cpp
@@ -0,0 +1,50 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compiled_function.h"
+#include <vespa/vespalib/util/benchmark_timer.h>
+
+namespace vespalib {
+namespace eval {
+
+namespace {
+
+double empty_function(const double *) { return 0.0; }
+
+} // namespace vespalib::eval::<unnamed>
+
+CompiledFunction::CompiledFunction(const Function &function_in, PassParams pass_params_in,
+ const gbdt::Optimize::Chain &forest_optimizers)
+ : _llvm_wrapper(),
+ _address(nullptr),
+ _num_params(function_in.num_params()),
+ _pass_params(pass_params_in)
+{
+ _address = _llvm_wrapper.compile_function(function_in.num_params(),
+ (_pass_params == PassParams::ARRAY),
+ function_in.root(),
+ forest_optimizers);
+}
+
+CompiledFunction::CompiledFunction(CompiledFunction &&rhs)
+ : _llvm_wrapper(std::move(rhs._llvm_wrapper)),
+ _address(rhs._address),
+ _num_params(rhs._num_params),
+ _pass_params(rhs._pass_params)
+{
+ rhs._address = nullptr;
+}
+
+double
+CompiledFunction::estimate_cost_us(const std::vector<double> &params) const
+{
+ assert(_pass_params == PassParams::ARRAY);
+ assert(params.size() == _num_params);
+ auto function = get_function();
+ auto actual = [&](){function(&params[0]);};
+ auto baseline = [&](){empty_function(&params[0]);};
+ return BenchmarkTimer::benchmark(actual, baseline, 4.0) * 1000.0 * 1000.0;
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/compiled_function.h b/vespalib/src/vespa/vespalib/eval/compiled_function.h
new file mode 100644
index 00000000000..0c9e9a4a8fc
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/compiled_function.h
@@ -0,0 +1,64 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "function.h"
+#include "gbdt.h"
+#include "llvm_wrapper.h"
+
+namespace vespalib {
+namespace eval {
+
+enum class PassParams { SEPARATE, ARRAY };
+
+/**
+ * A Function that has been compiled to machine code using LLVM. Note
+ * that tensors are currently not supported for compiled functions.
+ **/
+class CompiledFunction
+{
+public:
+ // expand<N>::type will resolve to the type of a function that
+ // takes N separate double parameters and returns double.
+
+ // count down N and add a single double parameter to the list of parameters
+ template <size_t N, typename... T> struct expand : expand<N - 1, double, T...> {};
+ // when N is 0; define 'type' with the list of collected parameters
+ template <typename... T> struct expand<0, T...> { using type = double(*)(T...); };
+
+ using array_function = double (*)(const double *);
+
+private:
+ LLVMWrapper _llvm_wrapper;
+ void *_address;
+ size_t _num_params;
+ PassParams _pass_params;
+
+public:
+ typedef std::unique_ptr<CompiledFunction> UP;
+ CompiledFunction(const Function &function_in, PassParams pass_params_in,
+ const gbdt::Optimize::Chain &forest_optimizers);
+ CompiledFunction(const Function &function_in, PassParams pass_params_in)
+ : CompiledFunction(function_in, pass_params_in, gbdt::Optimize::best) {}
+ CompiledFunction(CompiledFunction &&rhs);
+ size_t num_params() const { return _num_params; }
+ PassParams pass_params() const { return _pass_params; }
+ template <size_t NUM_PARAMS>
+ typename expand<NUM_PARAMS>::type get_function() const {
+ assert(_pass_params == PassParams::SEPARATE);
+ assert(_num_params == NUM_PARAMS);
+ return ((typename expand<NUM_PARAMS>::type)_address);
+ }
+ array_function get_function() const {
+ assert(_pass_params == PassParams::ARRAY);
+ return ((array_function)_address);
+ }
+ const std::vector<gbdt::Forest::UP> &get_forests() const {
+ return _llvm_wrapper.get_forests();
+ }
+ void dump() const { _llvm_wrapper.dump(); }
+ double estimate_cost_us(const std::vector<double> &params) const;
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/deinline_forest.cpp b/vespalib/src/vespa/vespalib/eval/deinline_forest.cpp
new file mode 100644
index 00000000000..ffe0f1c2eaf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/deinline_forest.cpp
@@ -0,0 +1,48 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "gbdt.h"
+#include "deinline_forest.h"
+
+namespace vespalib {
+namespace eval {
+namespace gbdt {
+
+DeinlineForest::DeinlineForest(const std::vector<const nodes::Node *> &trees)
+{
+ size_t idx = 0;
+ while (idx < trees.size()) {
+ size_t fragment_size = 0;
+ std::vector<const nodes::Node *> fragment;
+ while ((idx < trees.size()) && (fragment_size < 256)) {
+ fragment_size += TreeStats(*trees[idx]).size;
+ fragment.push_back(trees[idx++]);
+ }
+ void *address = _llvm_wrapper.compile_forest_fragment(fragment);
+ _fragments.push_back((array_function)address);
+ }
+}
+
+Optimize::Result
+DeinlineForest::optimize(const ForestStats &,
+ const std::vector<const nodes::Node *> &trees)
+{
+ return Optimize::Result(Forest::UP(new DeinlineForest(trees)), eval);
+}
+
+double
+DeinlineForest::eval(const Forest *forest, const double *input)
+{
+ const DeinlineForest &self = *((const DeinlineForest *)forest);
+ double sum = 0.0;
+ for (auto fragment: self._fragments) {
+ sum += fragment(input);
+ }
+ return sum;
+}
+
+Optimize::Chain DeinlineForest::optimize_chain({optimize});
+
+} // namespace vespalib::eval::gbdt
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/deinline_forest.h b/vespalib/src/vespa/vespalib/eval/deinline_forest.h
new file mode 100644
index 00000000000..883720d47d0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/deinline_forest.h
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "gbdt.h"
+#include "llvm_wrapper.h"
+
+namespace vespalib {
+namespace eval {
+namespace gbdt {
+
+/**
+ * GBDT forest optimizer performing automatic function de-inlining.
+ **/
+class DeinlineForest : public Forest
+{
+private:
+ using array_function = double (*)(const double *);
+
+ LLVMWrapper _llvm_wrapper;
+ std::vector<array_function> _fragments;
+
+public:
+ explicit DeinlineForest(const std::vector<const nodes::Node *> &trees);
+ static Optimize::Result optimize(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees);
+ static double eval(const Forest *forest, const double *input);
+ static Optimize::Chain optimize_chain;
+};
+
+} // namespace vespalib::eval::gbdt
+} // namespace vespalib::eval
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/eval/delete_node.cpp b/vespalib/src/vespa/vespalib/eval/delete_node.cpp
new file mode 100644
index 00000000000..c36c5864876
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/delete_node.cpp
@@ -0,0 +1,35 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "key_gen.h"
+#include "node_visitor.h"
+#include "node_traverser.h"
+#include "compiled_function.h"
+
+namespace vespalib {
+namespace eval {
+
+namespace {
+
+struct ChildReaper : public NodeTraverser, public NodeHandler {
+ virtual void handle(nodes::Node_UP) override {}
+ virtual bool open(const nodes::Node &) override { return true; }
+ virtual void close(const nodes::Node &node) override {
+ nodes::Node &mutable_node = const_cast<nodes::Node&>(node);
+ mutable_node.detach_children(*this);
+ }
+};
+
+} // namespace vespalib::nodes::<unnamed>
+
+void
+delete_node(nodes::Node_UP node)
+{
+ if (node) {
+ ChildReaper reaper;
+ node->traverse(reaper);
+ }
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/delete_node.h b/vespalib/src/vespa/vespalib/eval/delete_node.h
new file mode 100644
index 00000000000..228e41ff9fd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/delete_node.h
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "basic_nodes.h"
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * Function used to delete an AST with arbitrary depth without
+ * overflowing the stack. This is needed because the AST is not
+ * compacted in any way and large expressions will produce very deep
+ * ASTs.
+ **/
+void delete_node(nodes::Node_UP node);
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/eval_spec.cpp b/vespalib/src/vespa/vespalib/eval/eval_spec.cpp
new file mode 100644
index 00000000000..95880f45a13
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/eval_spec.cpp
@@ -0,0 +1,351 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "eval_spec.h"
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/string_hash.h>
+#include <cmath>
+
+namespace vespalib {
+namespace eval {
+namespace test {
+
+const double my_nan = std::numeric_limits<double>::quiet_NaN();
+const double my_inf = std::numeric_limits<double>::infinity();
+
+vespalib::string
+EvalSpec::EvalTest::as_string(const std::vector<vespalib::string> &param_names,
+ const std::vector<double> &param_values,
+ const vespalib::string &expression)
+{
+ assert(param_values.size() == param_names.size());
+ vespalib::string str;
+ str += "f(";
+ for (size_t i = 0; i < param_names.size(); ++i) {
+ if (i > 0) {
+ str += ", ";
+ }
+ str += param_names[i];
+ str += "=";
+ str += make_string("%g", param_values[i]);
+ }
+ str += ") { ";
+ str += expression;
+ str += " }";
+ return str;
+}
+
+bool
+EvalSpec::EvalTest::is_same(double expected, double actual) {
+ if (std::isnan(expected)) {
+ return std::isnan(actual);
+ }
+ return (actual == expected);
+}
+
+void
+EvalSpec::add_terminal_cases() {
+ add_expression({}, "(-100)").add_case({}, -100.0);
+ add_expression({}, "(-10)").add_case({}, -10.0);
+ add_expression({}, "(-5.75)").add_case({}, -5.75);
+ add_expression({}, "(-4.5)").add_case({}, -4.5);
+ add_expression({}, "(-3)").add_case({}, -3.0);
+ add_expression({}, "(-2)").add_case({}, -2.0);
+ add_expression({}, "(-0.1)").add_case({}, -0.1);
+ add_expression({}, "0").add_case({}, 0.0);
+ add_expression({}, "0.1").add_case({}, 0.1);
+ add_expression({}, "2").add_case({}, 2.0);
+ add_expression({}, "3").add_case({}, 3.0);
+ add_expression({}, "4.5").add_case({}, 4.5);
+ add_expression({}, "5.75").add_case({}, 5.75);
+ add_expression({}, "10").add_case({}, 10.0);
+ add_expression({}, "100").add_case({}, 100.0);
+ add_rule({"a", -5.0, 5.0}, "a", [](double a){ return a; });
+ add_expression({}, "[]").add_case({}, 0.0);
+ add_expression({}, "[1]").add_case({}, 1.0);
+ add_expression({}, "[1,2]").add_case({}, 2.0);
+ add_expression({}, "[1,2,3]").add_case({}, 3.0);
+ add_expression({}, "[3,2,1]").add_case({}, 3.0);
+ add_expression({}, "[1,1,1,1,1]").add_case({}, 5.0);
+ add_expression({}, "\"\"").add_case({}, vespalib::hash_code(""));
+ add_expression({}, "\"foo\"").add_case({}, vespalib::hash_code("foo"));
+ add_expression({}, "\"foo bar baz\"").add_case({}, vespalib::hash_code("foo bar baz"));
+ add_expression({}, "\">\\\\\\\"\\t\\n\\r\\f<\"").add_case({}, vespalib::hash_code(">\\\"\t\n\r\f<"));
+ add_expression({}, "\">\\x08\\x10\\x12\\x14<\"").add_case({}, vespalib::hash_code(">\x08\x10\x12\x14<"));
+}
+
+void
+EvalSpec::add_arithmetic_cases() {
+ add_rule({"a", -5.0, 5.0}, "(-a)", [](double a){ return -a; });
+ add_rule({"a", -5.0, 5.0}, {"b", -5.0, 5.0}, "(a+b)", [](double a, double b){ return (a + b); });
+ add_rule({"a", -5.0, 5.0}, {"b", -5.0, 5.0}, "(a-b)", [](double a, double b){ return (a - b); });
+ add_rule({"a", -5.0, 5.0}, {"b", -5.0, 5.0}, "(a*b)", [](double a, double b){ return (a * b); });
+ add_rule({"a", -5.0, 5.0}, {"b", -5.0, 5.0}, "(a/b)", [](double a, double b){ return (a / b); });
+ add_rule({"a", -5.0, 5.0}, {"b", -5.0, 5.0}, "(a^b)", [](double a, double b){ return pow(a,b); });
+ add_expression({"a", "b", "c", "d"}, "(((a+1)*(b-1))/((c+1)/(d-1)))")
+ .add_case({0.0, 2.0, 0.0, 2.0}, 1.0)
+ .add_case({1.0, 3.0, 0.0, 2.0}, 4.0)
+ .add_case({1.0, 3.0, 1.0, 2.0}, 2.0)
+ .add_case({1.0, 3.0, 1.0, 5.0}, 8.0);
+}
+
+void
+EvalSpec::add_function_call_cases() {
+ add_rule({"a", -1.0, 1.0}, "cos(a)", [](double a){ return cos(a); });
+ add_rule({"a", -1.0, 1.0}, "sin(a)", [](double a){ return sin(a); });
+ add_rule({"a", -1.0, 1.0}, "tan(a)", [](double a){ return tan(a); });
+ add_rule({"a", -1.0, 1.0}, "cosh(a)", [](double a){ return cosh(a); });
+ add_rule({"a", -1.0, 1.0}, "sinh(a)", [](double a){ return sinh(a); });
+ add_rule({"a", -1.0, 1.0}, "tanh(a)", [](double a){ return tanh(a); });
+ add_rule({"a", -1.0, 1.0}, "acos(a)", [](double a){ return acos(a); });
+ add_rule({"a", -1.0, 1.0}, "asin(a)", [](double a){ return asin(a); });
+ add_rule({"a", -1.0, 1.0}, "atan(a)", [](double a){ return atan(a); });
+ add_rule({"a", -1.0, 1.0}, "exp(a)", [](double a){ return exp(a); });
+ add_rule({"a", -1.0, 1.0}, "log10(a)", [](double a){ return log10(a); });
+ add_rule({"a", -1.0, 1.0}, "log(a)", [](double a){ return log(a); });
+ add_rule({"a", -1.0, 1.0}, "sqrt(a)", [](double a){ return sqrt(a); });
+ add_rule({"a", -1.0, 1.0}, "ceil(a)", [](double a){ return ceil(a); });
+ add_rule({"a", -1.0, 1.0}, "fabs(a)", [](double a){ return fabs(a); });
+ add_rule({"a", -1.0, 1.0}, "floor(a)", [](double a){ return floor(a); });
+ add_expression({"a"}, "isNan(a)")
+ .add_case({-1.0}, 0.0).add_case({-0.5}, 0.0).add_case({0.0}, 0.0).add_case({0.5}, 0.0).add_case({1.0}, 0.0)
+ .add_case({my_nan}, 1.0).add_case({my_inf}, 0.0).add_case({-my_inf}, 0.0);
+ add_rule({"a", -1.0, 1.0}, {"b", -1.0, 1.0}, "atan2(a,b)", [](double a, double b){ return atan2(a, b); });
+ add_rule({"a", -1.0, 1.0}, {"b", -1.0, 1.0}, "ldexp(a,b)", [](double a, double b){ return ldexp(a, b); });
+ add_rule({"a", -1.0, 1.0}, {"b", -1.0, 1.0}, "pow(a,b)", [](double a, double b){ return pow(a, b); });
+ add_rule({"a", -1.0, 1.0}, {"b", -1.0, 1.0}, "fmod(a,b)", [](double a, double b){ return fmod(a, b); });
+ add_rule({"a", -1.0, 1.0}, {"b", -1.0, 1.0}, "min(a,b)", [](double a, double b){ return std::min(a, b); });
+ add_rule({"a", -1.0, 1.0}, {"b", -1.0, 1.0}, "max(a,b)", [](double a, double b){ return std::max(a, b); });
+}
+
+void
+EvalSpec::add_comparison_cases() {
+ add_expression({"a", "b"}, "(a==b)")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({1.0, 2.0}, 0.0)
+ .add_case({2.0 - 1e-10, 2.0}, 0.0)
+ .add_case({2.0, 2.0}, 1.0)
+ .add_case({2.0 + 1e-10, 2.0}, 0.0)
+ .add_case({3.0, 2.0}, 0.0);
+
+ add_expression({"a", "b"}, "(a!=b)")
+ .add_case({my_nan, 2.0}, 1.0)
+ .add_case({2.0, my_nan}, 1.0)
+ .add_case({my_nan, my_nan}, 1.0)
+ .add_case({1.0, 2.0}, 1.0)
+ .add_case({2.0 - 1e-10, 2.0}, 1.0)
+ .add_case({2.0, 2.0}, 0.0)
+ .add_case({2.0 + 1e-10, 2.0}, 1.0)
+ .add_case({3.0, 2.0}, 1.0);
+
+ add_expression({"a", "b"}, "(a~=b)")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({0.5, 0.5}, 1.0)
+ .add_case({1.0, 2.0}, 0.0)
+ .add_case({2.0, 2.0}, 1.0)
+ .add_case({3.0, 2.0}, 0.0)
+ .add_case({0.5 - 1e-10, 0.5}, 1.0)
+ .add_case({0.5, 0.5 - 1e-10}, 1.0)
+ .add_case({2.0 - 1e-10, 2.0}, 1.0)
+ .add_case({2.0, 2.0 - 1e-10}, 1.0)
+ .add_case({0.5 + 1e-10, 0.5}, 1.0)
+ .add_case({0.5, 0.5 + 1e-10}, 1.0)
+ .add_case({2.0 + 1e-10, 2.0}, 1.0)
+ .add_case({2.0, 2.0 + 1e-10}, 1.0)
+ .add_case({0.5 - 2e-7, 0.5}, 0.0)
+ .add_case({0.5, 0.5 - 2e-7}, 0.0)
+ .add_case({2.0 - 5e-7, 2.0}, 0.0)
+ .add_case({2.0, 2.0 - 5e-7}, 0.0)
+ .add_case({0.5 + 2e-7, 0.5}, 0.0)
+ .add_case({0.5, 0.5 + 2e-7}, 0.0)
+ .add_case({2.0 + 5e-7, 2.0}, 0.0)
+ .add_case({2.0, 2.0 + 5e-7}, 0.0);
+
+ add_expression({"a", "b"}, "(a<b)")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({1.0, 2.0}, 1.0)
+ .add_case({2.0 - 1e-10, 2.0}, 1.0)
+ .add_case({2.0, 2.0}, 0.0)
+ .add_case({2.0 + 1e-10, 2.0}, 0.0)
+ .add_case({3.0, 2.0}, 0.0);
+
+ add_expression({"a", "b"}, "(a<=b)")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({1.0, 2.0}, 1.0)
+ .add_case({2.0 - 1e-10, 2.0}, 1.0)
+ .add_case({2.0, 2.0}, 1.0)
+ .add_case({2.0 + 1e-10, 2.0}, 0.0)
+ .add_case({3.0, 2.0}, 0.0);
+
+ add_expression({"a", "b"}, "(a>b)")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({1.0, 2.0}, 0.0)
+ .add_case({2.0 - 1e-10, 2.0}, 0.0)
+ .add_case({2.0, 2.0}, 0.0)
+ .add_case({2.0 + 1e-10, 2.0}, 1.0)
+ .add_case({3.0, 2.0}, 1.0);
+
+ add_expression({"a", "b"}, "(a>=b)")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({1.0, 2.0}, 0.0)
+ .add_case({2.0 - 1e-10, 2.0}, 0.0)
+ .add_case({2.0, 2.0}, 1.0)
+ .add_case({2.0 + 1e-10, 2.0}, 1.0)
+ .add_case({3.0, 2.0}, 1.0);
+}
+
+void
+EvalSpec::add_set_membership_cases()
+{
+ add_expression({"a"}, "(a in [])")
+ .add_case({0.0}, 0.0)
+ .add_case({1.0}, 0.0)
+ .add_case({2.0}, 0.0);
+
+ add_expression({"a"}, "(a in [[]])")
+ .add_case({0.0}, 1.0)
+ .add_case({1.0}, 0.0)
+ .add_case({2.0}, 0.0);
+
+ add_expression({"a"}, "(a in [[[]]])")
+ .add_case({0.0}, 0.0)
+ .add_case({1.0}, 1.0)
+ .add_case({2.0}, 0.0);
+
+ add_expression({"a", "b"}, "(a in b)")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({1.0, 2.0}, 0.0)
+ .add_case({2.0 - 1e-10, 2.0}, 0.0)
+ .add_case({2.0, 2.0}, 1.0)
+ .add_case({2.0 + 1e-10, 2.0}, 0.0)
+ .add_case({3.0, 2.0}, 0.0);
+
+ add_expression({"a", "b"}, "(a in [b])")
+ .add_case({my_nan, 2.0}, 0.0)
+ .add_case({2.0, my_nan}, 0.0)
+ .add_case({my_nan, my_nan}, 0.0)
+ .add_case({1.0, 2.0}, 0.0)
+ .add_case({2.0 - 1e-10, 2.0}, 0.0)
+ .add_case({2.0, 2.0}, 1.0)
+ .add_case({2.0 + 1e-10, 2.0}, 0.0)
+ .add_case({3.0, 2.0}, 0.0);
+
+ add_expression({"a", "b"}, "(a in [[b]])")
+ .add_case({1.0, 2.0}, 1.0)
+ .add_case({2.0, 2.0}, 0.0);
+
+ add_expression({"a", "b", "c", "d"}, "(a in [b,c,d])")
+ .add_case({0.0, 10.0, 20.0, 30.0}, 0.0)
+ .add_case({3.0, 10.0, 20.0, 30.0}, 0.0)
+ .add_case({10.0, 10.0, 20.0, 30.0}, 1.0)
+ .add_case({20.0, 10.0, 20.0, 30.0}, 1.0)
+ .add_case({30.0, 10.0, 20.0, 30.0}, 1.0)
+ .add_case({10.0, 30.0, 20.0, 10.0}, 1.0)
+ .add_case({20.0, 30.0, 20.0, 10.0}, 1.0)
+ .add_case({30.0, 30.0, 20.0, 10.0}, 1.0);
+}
+
+void
+EvalSpec::add_boolean_cases() {
+ add_expression({"a"}, "(!a)")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a)->double{ return !bool(a); });
+
+ add_expression({"a"}, "(!(!a))")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a)->double{ return bool(a); });
+
+ add_expression({"a", "b"}, "(a&&b)")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ {my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a, double b)->double{ return (bool(a) && bool(b)); });
+
+ add_expression({"a", "b"}, "(a||b)")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ {my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a, double b)->double{ return (bool(a) || bool(b)); });
+}
+
+void
+EvalSpec::add_if_cases() {
+ add_expression({"a"}, "if(a,1,0)")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a){ if (a) { return 1.0; } else { return 0.0; } });
+
+ add_expression({"a", "b"}, "if(a,if(b,1,2),if(b,3,4))")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ {my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a, double b)
+ {
+ if (a) {
+ if (b) {
+ return 1.0;
+ } else {
+ return 2.0;
+ }
+ } else {
+ if (b) {
+ return 3.0;
+ } else {
+ return 4.0;
+ }
+ }
+ });
+ add_expression({"a"}, "if(a,1,0,0.25)")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a){ if (a) { return 1.0; } else { return 0.0; } });
+ add_expression({"a"}, "if(a,1,0,0.75)")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a){ if (a) { return 1.0; } else { return 0.0; } });
+}
+
+void
+EvalSpec::add_let_cases() {
+ add_rule({"a", -10.0, 10.0}, "let(tmp,(a+1),(tmp*tmp))", [](double a){ return (a+1)*(a+1); });
+ add_rule({"a", -10.0, 10.0}, "let(a,(a+1),((a*a)*a))", [](double a){ return (a+1)*(a+1)*(a+1); });
+ add_rule({"a", -10.0, 10.0}, "let(a,(a+1),let(a,(a+1),let(b,2,let(a,(a+1),(a+b)))))", [](double a) { return (a + 5.0); });
+ add_rule({"a", -10.0, 10.0}, {"b", -10.0, 10.0}, "let(a,(a*b),let(b,(b+a),(a*b)))",
+ [](double a, double b)
+ {
+ double let_a = (a * b);
+ double let_b = (b + let_a);
+ return (let_a * let_b);
+ });
+}
+
+void
+EvalSpec::add_complex_cases() {
+ add_expression({"a", "b"}, "((a<3)||b)")
+ .add_cases({2.0, 4.0}, {0.0, 0.5, 1.0},
+ [](double a, double b)->double{ return ((a < 3) || bool(b)); });
+
+ add_expression({"a", "b"}, "((a<3)==b)")
+ .add_cases({2.0, 4.0}, {0.0, 0.5, 1.0},
+ [](double a, double b)->double{ return (double((a < 3)) == b); });
+
+ add_expression({"a"}, "(!(-a))")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a)->double{ return !bool(-a); });
+
+ add_expression({"a"}, "(-(!a))")
+ .add_cases({my_nan, -my_inf, -123.0, -1.0, -0.001, 0.0, 0.001, 1.0, 123.0, my_inf},
+ [](double a)->double{ return -double(!bool(a)); });
+}
+
+} // namespace vespalib::eval::test
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/eval_spec.h b/vespalib/src/vespa/vespalib/eval/eval_spec.h
new file mode 100644
index 00000000000..af1821c1e8d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/eval_spec.h
@@ -0,0 +1,159 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <initializer_list>
+#include <cassert>
+
+namespace vespalib {
+namespace eval {
+namespace test {
+
+/**
+ * A collection of expressions with parameter bindings and their
+ * expected evaluation results. This is intended as the basis for
+ * conformance testing of evaluation engines.
+ **/
+class EvalSpec
+{
+private:
+ typedef double (*fun_1_ref)(double);
+ typedef double (*fun_2_ref)(double, double);
+
+ struct Expression {
+ struct Case {
+ std::vector<double> param_values;
+ double expected_result;
+ Case(std::initializer_list<double> param_values_in, double expected_result_in)
+ : param_values(param_values_in), expected_result(expected_result_in) {}
+ };
+ std::vector<vespalib::string> param_names;
+ vespalib::string expression;
+ std::vector<Case> cases;
+ Expression(std::initializer_list<vespalib::string> param_names_in, vespalib::string expression_in)
+ : param_names(param_names_in), expression(expression_in) {}
+
+ Expression &add_case(std::initializer_list<double> param_values, double expected_result) {
+ assert(param_values.size() == param_names.size());
+ cases.emplace_back(param_values, expected_result);
+ return *this;
+ }
+ Expression &add_cases(std::initializer_list<double> a_values, fun_1_ref fun) {
+ for (double a: a_values) {
+ add_case({a}, fun(a));
+ }
+ return *this;
+ }
+ Expression &add_cases(std::initializer_list<double> a_values, std::initializer_list<double> b_values, fun_2_ref fun) {
+ for (double a: a_values) {
+ for (double b: b_values) {
+ add_case({a, b}, fun(a, b));
+ }
+ }
+ return *this;
+ }
+ };
+ std::vector<Expression> expressions;
+
+ Expression &add_expression(std::initializer_list<vespalib::string> param_names, vespalib::string expression) {
+ expressions.emplace_back(param_names, expression);
+ return expressions.back();
+ }
+
+ struct ParamSpec {
+ vespalib::string name;
+ double min;
+ double max;
+ std::vector<double> expand(size_t inner_samples) const {
+ std::vector<double> ret;
+ ret.push_back(min);
+ if (max == min) {
+ return ret;
+ }
+ ret.push_back(max);
+ if ((min < 0.0) && (max > 0.0)) {
+ ret.push_back(0.0);
+ }
+ double delta = (max - min) / (inner_samples + 1);
+ for(size_t i = 0; i < inner_samples; ++i) {
+ double x = min + (delta * (i + 1));
+ if (x != 0.0) {
+ ret.push_back(x);
+ }
+ }
+ return ret;
+ }
+ };
+
+ void add_rule(const ParamSpec &a_spec, const vespalib::string &expression, fun_1_ref ref) {
+ Expression &expr = add_expression({a_spec.name}, expression);
+ std::vector<double> a_values = a_spec.expand(7);
+ for (double a: a_values) {
+ expr.add_case({a}, ref(a));
+ }
+ }
+
+ void add_rule(const ParamSpec &a_spec, const ParamSpec &b_spec, const vespalib::string &expression, fun_2_ref ref) {
+ Expression &expr = add_expression({a_spec.name, b_spec.name}, expression);
+ std::vector<double> a_values = a_spec.expand(5);
+ std::vector<double> b_values = b_spec.expand(5);
+ for (double a: a_values) {
+ for (double b: b_values) {
+ expr.add_case({a, b}, ref(a, b));
+ }
+ }
+ }
+
+public:
+ struct EvalTest {
+ static vespalib::string as_string(const std::vector<vespalib::string> &param_names,
+ const std::vector<double> &param_values,
+ const vespalib::string &expression);
+ bool is_same(double expected, double actual);
+ virtual void next_expression(const std::vector<vespalib::string> &param_names,
+ const vespalib::string &expression) = 0;
+ virtual void handle_case(const std::vector<vespalib::string> &param_names,
+ const std::vector<double> &param_values,
+ const vespalib::string &expression,
+ double expected_result) = 0;
+ virtual ~EvalTest() {}
+ };
+ //-------------------------------------------------------------------------
+ void add_terminal_cases(); // a, 1.0
+ void add_arithmetic_cases(); // a + b, a ^ b
+ void add_function_call_cases(); // cos(a), max(a, b)
+ void add_comparison_cases(); // a < b, c != d
+ void add_set_membership_cases(); // a in [x, y, z]
+ void add_boolean_cases(); // 1.0 && 0.0
+ void add_if_cases(); // if (a < b, a, b)
+ void add_let_cases(); // let (a, b + 1, a * a)
+ void add_complex_cases(); // ...
+ //-------------------------------------------------------------------------
+ void add_all_cases() {
+ add_terminal_cases();
+ add_arithmetic_cases();
+ add_function_call_cases();
+ add_comparison_cases();
+ add_set_membership_cases();
+ add_boolean_cases();
+ add_if_cases();
+ add_let_cases();
+ add_complex_cases();
+ }
+ //-------------------------------------------------------------------------
+ void each_case(EvalTest &test) const {
+ for (const Expression &expr: expressions) {
+ test.next_expression(expr.param_names, expr.expression);
+ for (const Expression::Case &expr_case: expr.cases) {
+ test.handle_case(expr.param_names, expr_case.param_values, expr.expression,
+ expr_case.expected_result);
+ }
+ }
+ }
+};
+
+} // namespace vespalib::eval::test
+} // namespace vespalib::eval
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/eval/function.cpp b/vespalib/src/vespa/vespalib/eval/function.cpp
new file mode 100644
index 00000000000..1ce1901b2b7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/function.cpp
@@ -0,0 +1,726 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <cctype>
+#include <map>
+#include "function.h"
+#include "basic_nodes.h"
+#include "tensor_nodes.h"
+#include "operator_nodes.h"
+#include "call_nodes.h"
+#include "delete_node.h"
+
+namespace vespalib {
+namespace eval {
+
+using nodes::Node_UP;
+using nodes::Operator_UP;
+using nodes::Call_UP;
+
+namespace {
+
+//-----------------------------------------------------------------------------
+
+class Params {
+private:
+ std::map<vespalib::string,size_t> _params;
+protected:
+ size_t lookup(vespalib::stringref token) const {
+ auto result = _params.find(token);
+ return (result == _params.end()) ? UNDEF : result->second;
+ }
+ size_t lookup_add(vespalib::stringref token) {
+ size_t result = lookup(token);
+ if (result == UNDEF) {
+ result = _params.size();
+ _params[token] = result;
+ }
+ return result;
+ }
+public:
+ static const size_t UNDEF = -1;
+ virtual bool implicit() const = 0;
+ virtual size_t resolve(vespalib::stringref token) const = 0;
+ std::vector<vespalib::string> extract() const {
+ std::vector<vespalib::string> params_out;
+ params_out.resize(_params.size());
+ for (const auto &item: _params) {
+ params_out[item.second] = item.first;
+ }
+ return params_out;
+ }
+ virtual ~Params() {}
+};
+
+struct ExplicitParams : Params {
+ explicit ExplicitParams(const std::vector<vespalib::string> &params_in) {
+ for (const auto &param: params_in) {
+ assert(lookup(param) == UNDEF);
+ lookup_add(param);
+ }
+ }
+ virtual bool implicit() const { return false; }
+ virtual size_t resolve(vespalib::stringref token) const override {
+ return lookup(token);
+ }
+};
+
+struct ImplicitParams : Params {
+ virtual bool implicit() const { return true; }
+ virtual size_t resolve(vespalib::stringref token) const override {
+ return const_cast<ImplicitParams*>(this)->lookup_add(token);
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+class ParseContext
+{
+private:
+ const char *_begin;
+ const char *_pos;
+ const char *_end;
+ char _curr;
+ vespalib::string _scratch;
+ vespalib::string _failure;
+ std::vector<Node_UP> _expression_stack;
+ std::vector<Operator_UP> _operator_stack;
+ std::vector<vespalib::string> _let_names;
+ size_t _operator_mark;
+ const Params &_params;
+ const SymbolExtractor *_symbol_extractor;
+
+public:
+ ParseContext(const Params &params, const char *str, size_t len,
+ const SymbolExtractor *symbol_extractor)
+ : _begin(str), _pos(str), _end(str + len), _curr(0),
+ _scratch(), _failure(),
+ _expression_stack(), _operator_stack(),
+ _let_names(),
+ _operator_mark(0),
+ _params(params),
+ _symbol_extractor(symbol_extractor)
+ {
+ if (_pos < _end) {
+ _curr = *_pos;
+ }
+ }
+ ~ParseContext() {
+ for (size_t i = 0; i < _expression_stack.size(); ++i) {
+ delete_node(std::move(_expression_stack[i]));
+ }
+ _expression_stack.clear();
+ }
+
+ void fail(const vespalib::string &msg) {
+ if (_failure.empty()) {
+ _failure = msg;
+ _curr = 0;
+ }
+ }
+ bool failed() const { return !_failure.empty(); }
+ void next() { _curr = (_curr && (_pos < _end)) ? *(++_pos) : 0; }
+
+ struct InputMark {
+ const char *pos;
+ char curr;
+ };
+
+ InputMark get_input_mark() const { return InputMark{_pos, _curr}; }
+ void restore_input_mark(InputMark mark) {
+ if ((_curr == 0) && (mark.curr != 0)) {
+ _failure.clear();
+ }
+ _pos = mark.pos;
+ _curr = mark.curr;
+ }
+
+ char get() const { return _curr; }
+ bool eos() const { return !_curr; }
+ void eat(char c) {
+ if (_curr == c) {
+ next();
+ } else {
+ fail(make_string("expected '%c', but got '%c'", c, _curr));
+ }
+ }
+ void skip_spaces() {
+ while (!eos() && isspace(_curr)) {
+ next();
+ }
+ }
+ vespalib::string &scratch() {
+ _scratch.clear();
+ return _scratch;
+ }
+ vespalib::string &peek(vespalib::string &str, size_t n) {
+ const char *p = _pos;
+ for (size_t i = 0; i < n; ++i, ++p) {
+ if (_curr != 0 && p < _end) {
+ str.push_back(*p);
+ } else {
+ str.push_back(0);
+ }
+ }
+ return str;
+ }
+ void skip(size_t n) {
+ for (size_t i = 0; i < n; ++i) {
+ next();
+ }
+ }
+
+ void push_let_binding(const vespalib::string &name) {
+ _let_names.push_back(name);
+ }
+
+ void pop_let_binding() {
+ assert(!_let_names.empty());
+ _let_names.pop_back();
+ }
+
+ int resolve_let_ref(const vespalib::string &name) const {
+ for (int i = (int(_let_names.size()) - 1); i >= 0; --i) {
+ if (name == _let_names[i]) {
+ return -(i + 1);
+ }
+ }
+ return nodes::Symbol::UNDEF;
+ }
+
+ int resolve_parameter(const vespalib::string &name) const {
+ size_t param_id = _params.resolve(name);
+ if (param_id == Params::UNDEF) {
+ return nodes::Symbol::UNDEF;
+ }
+ return param_id;
+ }
+
+ void extract_symbol(vespalib::string &symbol_out, InputMark before_symbol) {
+ if (_symbol_extractor == nullptr) {
+ return;
+ }
+ symbol_out.clear();
+ restore_input_mark(before_symbol);
+ if (!eos()) {
+ const char *new_pos = nullptr;
+ _symbol_extractor->extract_symbol(_pos, _end, new_pos, symbol_out);
+ if ((new_pos != nullptr) && (new_pos > _pos) && (new_pos <= _end)) {
+ _pos = new_pos;
+ _curr = (_pos < _end) ? *_pos : 0;
+ } else {
+ symbol_out.clear();
+ }
+ }
+ }
+
+ Node_UP get_result() {
+ if (!eos() || (num_expressions() != 1) || (num_operators() > 0)) {
+ fail("incomplete parse");
+ }
+ if (!_failure.empty()) {
+ vespalib::string before(_begin, (_pos - _begin));
+ vespalib::string after(_pos, (_end - _pos));
+ return Node_UP(new nodes::Error(make_string("[%s]...[%s]...[%s]",
+ before.c_str(), _failure.c_str(), after.c_str())));
+ }
+ return pop_expression();
+ }
+
+ void apply_operator() {
+ Operator_UP op = pop_operator();
+ Node_UP rhs = pop_expression();
+ Node_UP lhs = pop_expression();
+ op->bind(std::move(lhs), std::move(rhs));
+ push_expression(std::move(op));
+ }
+ size_t num_expressions() const { return _expression_stack.size(); }
+ void push_expression(Node_UP node) {
+ _expression_stack.push_back(std::move(node));
+ }
+ Node_UP pop_expression() {
+ if (_expression_stack.empty()) {
+ fail("expression stack underflow");
+ return Node_UP(new nodes::Number(0.0));
+ }
+ Node_UP node = std::move(_expression_stack.back());
+ _expression_stack.pop_back();
+ return node;
+ }
+ size_t num_operators() const { return _operator_stack.size(); }
+
+ size_t operator_mark() const { return _operator_mark; }
+ void operator_mark(size_t mark) { _operator_mark = mark; }
+
+ void push_operator(Operator_UP node) {
+ while ((_operator_stack.size() > _operator_mark) &&
+ (_operator_stack.back()->do_before(*node)))
+ {
+ apply_operator();
+ }
+ _operator_stack.push_back(std::move(node));
+ }
+ Operator_UP pop_operator() {
+ assert(!_operator_stack.empty());
+ Operator_UP node = std::move(_operator_stack.back());
+ _operator_stack.pop_back();
+ return node;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+void parse_expression(ParseContext &ctx);
+
+int unhex(char c) {
+ if (c >= '0' && c <= '9') {
+ return (c - '0');
+ }
+ if (c >= 'a' && c <= 'f') {
+ return ((c - 'a') + 10);
+ }
+ if (c >= 'A' && c <= 'F') {
+ return ((c - 'A') + 10);
+ }
+ return -1;
+}
+
+void parse_string(ParseContext &ctx) {
+ vespalib::string &str = ctx.scratch();
+ ctx.eat('"');
+ while (!ctx.eos() && ctx.get() != '"') {
+ if (ctx.get() == '\\') {
+ ctx.next();
+ if (ctx.get() == 'x') {
+ ctx.next();
+ int hex1 = unhex(ctx.get());
+ ctx.next();
+ int hex2 = unhex(ctx.get());
+ if (hex1 < 0 || hex2 < 0) {
+ ctx.fail("bad hex quote");
+ }
+ str.push_back((hex1 << 4) + hex2);
+ } else {
+ switch(ctx.get()) {
+ case '"': str.push_back('"'); break;
+ case '\\': str.push_back('\\'); break;
+ case 'f': str.push_back('\f'); break;
+ case 'n': str.push_back('\n'); break;
+ case 'r': str.push_back('\r'); break;
+ case 't': str.push_back('\t'); break;
+ default: ctx.fail("bad quote"); break;
+ }
+ }
+ } else {
+ str.push_back(ctx.get()); // default case
+ }
+ ctx.next();
+ }
+ ctx.eat('"');
+ ctx.push_expression(Node_UP(new nodes::String(str)));
+}
+
+void parse_number(ParseContext &ctx) {
+ vespalib::string &str = ctx.scratch();
+ str.push_back(ctx.get());
+ ctx.next();
+ while (ctx.get() >= '0' && ctx.get() <= '9') {
+ str.push_back(ctx.get());
+ ctx.next();
+ }
+ if (ctx.get() == '.') {
+ str.push_back(ctx.get());
+ ctx.next();
+ while (ctx.get() >= '0' && ctx.get() <= '9') {
+ str.push_back(ctx.get());
+ ctx.next();
+ }
+ }
+ if (ctx.get() == 'e' || ctx.get() == 'E') {
+ str.push_back(ctx.get());
+ ctx.next();
+ if (ctx.get() == '+' || ctx.get() == '-') {
+ str.push_back(ctx.get());
+ ctx.next();
+ }
+ while (ctx.get() >= '0' && ctx.get() <= '9') {
+ str.push_back(ctx.get());
+ ctx.next();
+ }
+ }
+ char *end = nullptr;
+ double value = strtod(str.c_str(), &end);
+ if (!str.empty() && end == str.data() + str.size()) {
+ ctx.push_expression(Node_UP(new nodes::Number(value)));
+ } else {
+ ctx.fail(make_string("invalid number: '%s'", str.c_str()));
+ }
+ return;
+}
+
+// NOTE: using non-standard definition of identifiers
+// (to match ranking expression parser in Java)
+bool is_ident(char c, bool first) {
+ return ((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ (c == '_') || (c == '@') ||
+ (c == '$' && !first));
+}
+
+vespalib::string get_ident(ParseContext &ctx) {
+ ctx.skip_spaces();
+ vespalib::string ident;
+ if (is_ident(ctx.get(), true)) {
+ ident.push_back(ctx.get());
+ for (ctx.next(); is_ident(ctx.get(), false); ctx.next()) {
+ ident.push_back(ctx.get());
+ }
+ }
+ return ident;
+}
+
+void parse_if(ParseContext &ctx) {
+ parse_expression(ctx);
+ Node_UP cond = ctx.pop_expression();
+ ctx.eat(',');
+ parse_expression(ctx);
+ Node_UP true_expr = ctx.pop_expression();
+ ctx.eat(',');
+ parse_expression(ctx);
+ Node_UP false_expr = ctx.pop_expression();
+ double p_true = 0.5;
+ if (ctx.get() == ',') {
+ ctx.eat(',');
+ parse_number(ctx);
+ Node_UP p_true_node = ctx.pop_expression();
+ auto p_true_number = nodes::as<nodes::Number>(*p_true_node);
+ if (p_true_number) {
+ p_true = p_true_number->value();
+ }
+ }
+ ctx.push_expression(Node_UP(new nodes::If(std::move(cond), std::move(true_expr), std::move(false_expr), p_true)));
+}
+
+void parse_let(ParseContext &ctx) {
+ vespalib::string name = get_ident(ctx);
+ ctx.skip_spaces();
+ ctx.eat(',');
+ parse_expression(ctx);
+ Node_UP value = ctx.pop_expression();
+ ctx.eat(',');
+ ctx.push_let_binding(name);
+ parse_expression(ctx);
+ Node_UP expr = ctx.pop_expression();
+ ctx.pop_let_binding();
+ ctx.push_expression(Node_UP(new nodes::Let(name, std::move(value), std::move(expr))));
+}
+
+void parse_call(ParseContext &ctx, Call_UP call) {
+ for (size_t i = 0; i < call->num_params(); ++i) {
+ if (i > 0) {
+ ctx.eat(',');
+ }
+ parse_expression(ctx);
+ call->bind_next(ctx.pop_expression());
+ }
+ ctx.push_expression(std::move(call));
+}
+
+std::map<vespalib::string, vespalib::string> get_tensor_address(ParseContext &ctx) {
+ std::map<vespalib::string, vespalib::string> address;
+ ctx.eat('{');
+ ctx.skip_spaces();
+ while (!ctx.eos() && ctx.get() != '}') {
+ if (!address.empty()) {
+ ctx.eat(',');
+ }
+ vespalib::string dimension = get_ident(ctx);
+ ctx.skip_spaces();
+ ctx.eat(':');
+ vespalib::string label = get_ident(ctx);
+ ctx.skip_spaces();
+ address[dimension] = label;
+ ctx.skip_spaces();
+ }
+ ctx.eat('}');
+ return address;
+}
+
+double get_number_value(ParseContext &ctx) {
+ bool negative = false;
+ if (ctx.get() == '-') {
+ negative = true;
+ ctx.next();
+ }
+ parse_number(ctx);
+ Node_UP node = ctx.pop_expression();
+ auto number = nodes::as<nodes::Number>(*node);
+ if (!number) {
+ return error_value;
+ }
+ return (negative) ? -number->value() : number->value();
+}
+
+// NOTE: verbatim tensors are parsed as leafs; no nesting
+// format: {{dimension:label, ...}:2.5, ...}
+void parse_tensor(ParseContext &ctx) {
+ std::unique_ptr<nodes::Tensor> tensor(new nodes::Tensor());
+ ctx.eat('{');
+ ctx.skip_spaces();
+ size_t tensor_size = 0;
+ while (!ctx.eos() && ctx.get() != '}') {
+ if (++tensor_size > 1) {
+ ctx.eat(',');
+ ctx.skip_spaces();
+ }
+ auto address = get_tensor_address(ctx);
+ ctx.skip_spaces();
+ ctx.eat(':');
+ ctx.skip_spaces();
+ double value = get_number_value(ctx);
+ tensor->add(address, value);
+ ctx.skip_spaces();
+ }
+ ctx.eat('}');
+ ctx.push_expression(std::move(tensor));
+}
+
+void parse_tensor_sum(ParseContext &ctx) {
+ parse_expression(ctx);
+ Node_UP child = ctx.pop_expression();
+ if (ctx.get() == ',') {
+ ctx.next();
+ vespalib::string dimension = get_ident(ctx);
+ ctx.skip_spaces();
+ ctx.push_expression(Node_UP(new nodes::TensorSum(std::move(child), dimension)));
+ } else {
+ ctx.push_expression(Node_UP(new nodes::TensorSum(std::move(child))));
+ }
+}
+
+void parse_tensor_match(ParseContext &ctx) {
+ parse_expression(ctx);
+ Node_UP lhs = ctx.pop_expression();
+ ctx.eat(',');
+ parse_expression(ctx);
+ Node_UP rhs = ctx.pop_expression();
+ ctx.push_expression(Node_UP(new nodes::TensorMatch(std::move(lhs), std::move(rhs))));
+}
+
+bool try_parse_call(ParseContext &ctx, const vespalib::string &name) {
+ ctx.skip_spaces();
+ if (ctx.get() == '(') {
+ ctx.eat('(');
+ if (name == "if") {
+ parse_if(ctx);
+ } else if (name == "let") {
+ parse_let(ctx);
+ } else {
+ Call_UP call = nodes::CallRepo::instance().create(name);
+ if (call.get() != nullptr) {
+ parse_call(ctx, std::move(call));
+ } else if (name == "sum") {
+ parse_tensor_sum(ctx);
+ } else if (name == "match") {
+ parse_tensor_match(ctx);
+ } else {
+ ctx.fail(make_string("unknown function: '%s'", name.c_str()));
+ return false;
+ }
+ }
+ ctx.eat(')');
+ return true;
+ }
+ return false;
+}
+
+int parse_symbol(ParseContext &ctx, vespalib::string &name, ParseContext::InputMark before_name) {
+ int id = ctx.resolve_let_ref(name);
+ if (id != nodes::Symbol::UNDEF) {
+ return id;
+ }
+ ctx.extract_symbol(name, before_name);
+ return ctx.resolve_parameter(name);
+}
+
+void parse_symbol_or_call(ParseContext &ctx) {
+ ParseContext::InputMark before_name = ctx.get_input_mark();
+ vespalib::string name = get_ident(ctx);
+ if (!try_parse_call(ctx, name)) {
+ int id = parse_symbol(ctx, name, before_name);
+ if (name.empty()) {
+ ctx.fail("missing value");
+ } else if (id == nodes::Symbol::UNDEF) {
+ ctx.fail(make_string("unknown symbol: '%s'", name.c_str()));
+ } else {
+ ctx.push_expression(Node_UP(new nodes::Symbol(id)));
+ }
+ }
+}
+
+void parse_array(ParseContext &ctx) {
+ std::unique_ptr<nodes::Array> array(new nodes::Array());
+ ctx.eat('[');
+ ctx.skip_spaces();
+ size_t size = 0;
+ while (!ctx.eos() && ctx.get() != ']') {
+ if (++size > 1) {
+ ctx.eat(',');
+ }
+ parse_expression(ctx);
+ array->add(ctx.pop_expression());
+ }
+ ctx.eat(']');
+ ctx.push_expression(std::move(array));
+}
+
+void parse_value(ParseContext &ctx) {
+ ctx.skip_spaces();
+ if (ctx.get() == '-') {
+ ctx.next();
+ parse_value(ctx);
+ ctx.push_expression(Node_UP(new nodes::Neg(ctx.pop_expression())));
+ } else if (ctx.get() == '!') {
+ ctx.next();
+ parse_value(ctx);
+ ctx.push_expression(Node_UP(new nodes::Not(ctx.pop_expression())));
+ } else if (ctx.get() == '(') {
+ ctx.next();
+ parse_expression(ctx);
+ ctx.eat(')');
+ } else if (ctx.get() == '[') {
+ parse_array(ctx);
+ } else if (ctx.get() == '{') {
+ parse_tensor(ctx);
+ } else if (ctx.get() == '"') {
+ parse_string(ctx);
+ } else if (isdigit(ctx.get())) {
+ parse_number(ctx);
+ } else {
+ parse_symbol_or_call(ctx);
+ }
+}
+
+void parse_operator(ParseContext &ctx) {
+ ctx.skip_spaces();
+ vespalib::string &str = ctx.peek(ctx.scratch(), nodes::OperatorRepo::instance().max_size());
+ Operator_UP op = nodes::OperatorRepo::instance().create(str);
+ if (op.get() != nullptr) {
+ ctx.push_operator(std::move(op));
+ ctx.skip(str.size());
+ } else {
+ ctx.fail(make_string("invalid operator: '%c'", ctx.get()));
+ }
+}
+
+void parse_expression(ParseContext &ctx) {
+ size_t old_mark = ctx.operator_mark();
+ ctx.operator_mark(ctx.num_operators());
+ for (;;) {
+ parse_value(ctx);
+ ctx.skip_spaces();
+ if (ctx.eos() || ctx.get() == ')' || ctx.get() == ',' || ctx.get() == ']') {
+ while (ctx.num_operators() > ctx.operator_mark()) {
+ ctx.apply_operator();
+ }
+ ctx.operator_mark(old_mark);
+ return;
+ }
+ parse_operator(ctx);
+ }
+}
+
+Function parse_function(const Params &params, vespalib::stringref expression,
+ const SymbolExtractor *symbol_extractor)
+{
+ ParseContext ctx(params, expression.data(), expression.size(), symbol_extractor);
+ parse_expression(ctx);
+ if (ctx.failed() && params.implicit()) {
+ return Function(ctx.get_result(), std::vector<vespalib::string>());
+ }
+ return Function(ctx.get_result(), params.extract());
+}
+
+} // namespace vespalib::<unnamed>
+
+//-----------------------------------------------------------------------------
+
+bool
+Function::has_error() const
+{
+ auto error = nodes::as<nodes::Error>(*_root);
+ return error;
+}
+
+vespalib::string
+Function::get_error() const
+{
+ auto error = nodes::as<nodes::Error>(*_root);
+ return error ? error->message() : "";
+}
+
+Function
+Function::parse(vespalib::stringref expression)
+{
+ return parse_function(ImplicitParams(), expression, nullptr);
+}
+
+Function
+Function::parse(vespalib::stringref expression, const SymbolExtractor &symbol_extractor)
+{
+ return parse_function(ImplicitParams(), expression, &symbol_extractor);
+}
+
+Function
+Function::parse(const std::vector<vespalib::string> &params, vespalib::stringref expression)
+{
+ return parse_function(ExplicitParams(params), expression, nullptr);
+}
+
+Function
+Function::parse(const std::vector<vespalib::string> &params, vespalib::stringref expression,
+ const SymbolExtractor &symbol_extractor)
+{
+ return parse_function(ExplicitParams(params), expression, &symbol_extractor);
+}
+
+//-----------------------------------------------------------------------------
+
+bool
+Function::unwrap(vespalib::stringref input,
+ vespalib::string &wrapper,
+ vespalib::string &body,
+ vespalib::string &error)
+{
+ size_t pos = 0;
+ for (; pos < input.size() && isspace(input[pos]); ++pos);
+ size_t wrapper_begin = pos;
+ for (; pos < input.size() && isalpha(input[pos]); ++pos);
+ size_t wrapper_end = pos;
+ if (wrapper_end == wrapper_begin) {
+ error = "could not extract wrapper name";
+ return false;
+ }
+ for (; pos < input.size() && isspace(input[pos]); ++pos);
+ if (pos == input.size() || input[pos] != '(') {
+ error = "could not match opening '('";
+ return false;
+ }
+ size_t body_begin = (pos + 1);
+ size_t body_end = (input.size() - 1);
+ for (; body_end > body_begin && isspace(input[body_end]); --body_end);
+ if (input[body_end] != ')') {
+ error = "could not match closing ')'";
+ return false;
+ }
+ assert(body_end >= body_begin);
+ wrapper = vespalib::stringref(input.data() + wrapper_begin, wrapper_end - wrapper_begin);
+ body = vespalib::stringref(input.data() + body_begin, body_end - body_begin);
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/function.h b/vespalib/src/vespa/vespalib/eval/function.h
new file mode 100644
index 00000000000..ac097afb22e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/function.h
@@ -0,0 +1,70 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <cmath>
+#include <memory>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <map>
+#include "basic_nodes.h"
+#include "delete_node.h"
+#include "value.h"
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * Interface used to perform custom symbol extraction. This is
+ * typically used by the ranking framework to extend what will be
+ * parsed as parameter names.
+ **/
+struct SymbolExtractor {
+ virtual void extract_symbol(const char *pos_in, const char *end_in,
+ const char *&pos_out, vespalib::string &symbol_out) const = 0;
+ virtual ~SymbolExtractor() {}
+};
+
+struct NodeVisitor;
+
+/**
+ * When you parse an expression you get a Function. It contains the
+ * AST root and the names of all parameters. A function can only be
+ * evaluated using the appropriate number of parameters.
+ **/
+class Function
+{
+private:
+ nodes::Node_UP _root;
+ std::vector<vespalib::string> _params;
+
+public:
+ Function() : _root(new nodes::Number(0.0)), _params() {}
+ Function(nodes::Node_UP root_in, std::vector<vespalib::string> &&params_in)
+ : _root(std::move(root_in)), _params(std::move(params_in)) {}
+ Function(Function &&rhs) : _root(std::move(rhs._root)), _params(std::move(rhs._params)) {}
+ ~Function() { delete_node(std::move(_root)); }
+ size_t num_params() const { return _params.size(); }
+ vespalib::stringref param_name(size_t idx) const { return _params[idx]; }
+ bool has_error() const;
+ vespalib::string get_error() const;
+ const nodes::Node &root() const { return *_root; }
+ static Function parse(vespalib::stringref expression);
+ static Function parse(vespalib::stringref expression, const SymbolExtractor &symbol_extractor);
+ static Function parse(const std::vector<vespalib::string> &params, vespalib::stringref expression);
+ static Function parse(const std::vector<vespalib::string> &params, vespalib::stringref expression,
+ const SymbolExtractor &symbol_extractor);
+ vespalib::string dump() const {
+ nodes::DumpContext dump_context(_params);
+ return _root->dump(dump_context);
+ }
+ // Utility function used to unwrap an expression contained inside
+ // a named wrapper. For example 'max(x+y)' -> 'max', 'x+y'
+ static bool unwrap(vespalib::stringref input,
+ vespalib::string &wrapper,
+ vespalib::string &body,
+ vespalib::string &error);
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/gbdt.cpp b/vespalib/src/vespa/vespalib/eval/gbdt.cpp
new file mode 100644
index 00000000000..66ae096bac6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/gbdt.cpp
@@ -0,0 +1,132 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "gbdt.h"
+#include "basic_nodes.h"
+#include "call_nodes.h"
+#include "operator_nodes.h"
+#include "vm_forest.h"
+#include "deinline_forest.h"
+
+namespace vespalib {
+namespace eval {
+namespace gbdt {
+
+//-----------------------------------------------------------------------------
+
+std::vector<const nodes::Node *> extract_trees(const nodes::Node &node) {
+ std::vector<const nodes::Node *> trees;
+ std::vector<const nodes::Node *> todo;
+ if (node.is_tree()) {
+ trees.push_back(&node);
+ } else if (node.is_forest()) {
+ todo.push_back(&node);
+ }
+ while (!todo.empty()) {
+ const nodes::Node &forest = *todo.back(); todo.pop_back();
+ for (size_t i = 0; i < forest.num_children(); ++i) {
+ const nodes::Node &child = forest.get_child(i);
+ if (child.is_tree()) {
+ trees.push_back(&child);
+ } else if (child.is_forest()) {
+ todo.push_back(&child);
+ }
+ }
+ }
+ return trees;
+}
+
+//-----------------------------------------------------------------------------
+
+TreeStats::TreeStats(const nodes::Node &tree)
+ : size(0),
+ num_less_checks(0),
+ num_in_checks(0),
+ num_tuned_checks(0),
+ max_set_size(0),
+ expected_path_length(0.0),
+ average_path_length(0.0)
+{
+ size_t sum_path = 0.0;
+ expected_path_length = traverse(tree, 0, sum_path);
+ average_path_length = double(sum_path) / double(size);
+}
+
+double
+TreeStats::traverse(const nodes::Node &node, size_t depth, size_t &sum_path) {
+ auto if_node = nodes::as<nodes::If>(node);
+ if (if_node) {
+ double p_true = if_node->p_true();
+ if (p_true != 0.5) {
+ ++num_tuned_checks;
+ }
+ double true_path = traverse(if_node->true_expr(), depth + 1, sum_path);
+ double false_path = traverse(if_node->false_expr(), depth + 1, sum_path);
+ auto less = nodes::as<nodes::Less>(if_node->cond());
+ auto in = nodes::as<nodes::In>(if_node->cond());
+ if (less) {
+ ++num_less_checks;
+ } else {
+ assert(in);
+ ++num_in_checks;
+ auto array = nodes::as<nodes::Array>(in->rhs());
+ size_t array_size = (array) ? array->size() : 1;
+ max_set_size = std::max(max_set_size, array_size);
+ }
+ return 1.0 + (p_true * true_path) + ((1.0 - p_true) * false_path);
+ } else {
+ ++size;
+ sum_path += depth;
+ return 0.0;
+ }
+}
+
+ForestStats::ForestStats(const std::vector<const nodes::Node *> &trees)
+ : num_trees(trees.size()),
+ total_size(0),
+ tree_sizes(),
+ total_less_checks(0),
+ total_in_checks(0),
+ total_tuned_checks(0),
+ max_set_size(0),
+ total_expected_path_length(0.0),
+ total_average_path_length(0.0)
+{
+ std::map<size_t,size_t> size_map;
+ for (const nodes::Node *tree: trees) {
+ TreeStats stats(*tree);
+ total_size += stats.size;
+ ++size_map[stats.size];
+ total_less_checks += stats.num_less_checks;
+ total_in_checks += stats.num_in_checks;
+ total_tuned_checks += stats.num_tuned_checks;
+ max_set_size = std::max(max_set_size, stats.max_set_size);
+ total_expected_path_length += stats.expected_path_length;
+ total_average_path_length += stats.average_path_length;
+ }
+ for (auto const &size: size_map) {
+ tree_sizes.push_back(TreeSize{size.first, size.second});
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+Optimize::Result
+Optimize::select_best(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees)
+{
+ double path_len = stats.total_average_path_length;
+ if ((stats.tree_sizes.back().size > 12) && (path_len > 2500.0)) {
+ return apply_chain(VMForest::optimize_chain, stats, trees);
+ }
+ return Optimize::Result();
+}
+
+Optimize::Chain Optimize::best({select_best});
+Optimize::Chain Optimize::none;
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::eval::gbdt
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/gbdt.h b/vespalib/src/vespa/vespalib/eval/gbdt.h
new file mode 100644
index 00000000000..c7ec59b603c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/gbdt.h
@@ -0,0 +1,115 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vector>
+
+namespace vespalib {
+namespace eval {
+
+namespace nodes { class Node; }
+
+namespace gbdt {
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Function used to map out individual GBDT trees from a GBDT forest.
+ **/
+std::vector<const nodes::Node *> extract_trees(const nodes::Node &node);
+
+/**
+ * Statistics for a single GBDT tree.
+ **/
+struct TreeStats {
+ size_t size;
+ size_t num_less_checks;
+ size_t num_in_checks;
+ size_t num_tuned_checks;
+ size_t max_set_size;
+ double expected_path_length;
+ double average_path_length;
+ explicit TreeStats(const nodes::Node &tree);
+private:
+ double traverse(const nodes::Node &tree, size_t depth, size_t &sum_path);
+};
+
+/**
+ * Statistics for a GBDT forest.
+ **/
+struct ForestStats {
+ struct TreeSize {
+ size_t size;
+ size_t count;
+ };
+ size_t num_trees;
+ size_t total_size;
+ std::vector<TreeSize> tree_sizes;
+ size_t total_less_checks;
+ size_t total_in_checks;
+ size_t total_tuned_checks;
+ size_t max_set_size;
+ double total_expected_path_length;
+ double total_average_path_length;
+ explicit ForestStats(const std::vector<const nodes::Node *> &trees);
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * A Forest object represents deletable custom prepared state that may
+ * be used to evaluate a GBDT forest from within LLVM generated
+ * machine code. It is very important that the evaluation function
+ * used is passed exactly the subclass of Forest it expects. This is
+ * why Optimize::Result bundles together both the prepared state
+ * (Forest object) and the evaluation function reference; they are
+ * chosen at the same time at the same place.
+ **/
+struct Forest {
+ using UP = std::unique_ptr<Forest>;
+ using eval_function = double (*)(const Forest *self, const double *args);
+ virtual ~Forest() {}
+};
+
+/**
+ * Definitions and helper functions related to custom GBDT forest
+ * optimization. The optimization chain named 'best' is used by
+ * default. The one named 'none' results in no special handling for
+ * GBDT forests.
+ **/
+struct Optimize {
+ struct Result {
+ Forest::UP forest;
+ Forest::eval_function eval;
+ Result() : forest(nullptr), eval(nullptr) {}
+ Result(Forest::UP &&forest_in, Forest::eval_function eval_in)
+ : forest(std::move(forest_in)), eval(eval_in) {}
+ Result(Result &&rhs) : forest(std::move(rhs.forest)), eval(rhs.eval) {}
+ bool valid() const { return (forest.get() != nullptr); }
+ };
+ using optimize_function = Result (*)(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees);
+ using Chain = std::vector<optimize_function>;
+ static Result select_best(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees);
+ static Chain best;
+ static Chain none;
+ static Result apply_chain(const Chain &chain,
+ const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees) {
+ for (optimize_function optimize: chain) {
+ Result result = optimize(stats, trees);
+ if (result.valid()) {
+ return result;
+ }
+ }
+ return Result();
+ }
+ // Optimize() = delete;
+};
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::eval::gbdt
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/interpreted_function.cpp b/vespalib/src/vespa/vespalib/eval/interpreted_function.cpp
new file mode 100644
index 00000000000..bfa48683e57
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/interpreted_function.cpp
@@ -0,0 +1,399 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "interpreted_function.h"
+#include "node_visitor.h"
+#include "node_traverser.h"
+#include "check_type.h"
+#include <cmath>
+#include <vespa/vespalib/util/approx.h>
+#include "operation.h"
+#include <set>
+#include "tensor_spec.h"
+#include "simple_tensor_engine.h"
+
+namespace vespalib {
+namespace eval {
+
+namespace {
+
+using namespace nodes;
+using State = InterpretedFunction::State;
+using Instruction = InterpretedFunction::Instruction;
+
+//-----------------------------------------------------------------------------
+
+template <typename T, typename IN>
+uint64_t wrap_param(const IN &value_in) {
+ const T &value = value_in;
+ return (uint64_t)&value;
+}
+
+template <typename T>
+const T &unwrap_param(uint64_t param) { return *((const T *)param); }
+
+//-----------------------------------------------------------------------------
+
+void op_load_const(State &state, uint64_t param) {
+ state.stack.push_back(unwrap_param<Value>(param));
+}
+
+void op_load_param(State &state, uint64_t param) {
+ state.stack.push_back(state.params[param]);
+}
+
+void op_load_let(State &state, uint64_t param) {
+ state.stack.push_back(state.let_values[param]);
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename OP1>
+void op_unary(State &state, uint64_t) {
+ state.replace(1, OP1().perform(state.peek(0), state.stash));
+}
+
+template <typename OP2>
+void op_binary(State &state, uint64_t) {
+ state.replace(2, OP2().perform(state.peek(1), state.peek(0), state.stash));
+}
+
+//-----------------------------------------------------------------------------
+
+void op_skip(State &state, uint64_t param) {
+ state.program_offset += param;
+}
+
+void op_skip_if_false(State &state, uint64_t param) {
+ ++state.if_cnt;
+ if (!state.peek(0).as_bool()) {
+ state.program_offset += param;
+ }
+ state.stack.pop_back();
+}
+
+//-----------------------------------------------------------------------------
+
+void op_store_let(State &state, uint64_t) {
+ state.let_values.push_back(state.peek(0));
+ state.stack.pop_back();
+}
+
+void op_evict_let(State &state, uint64_t) {
+ state.let_values.pop_back();
+}
+
+//-----------------------------------------------------------------------------
+
+// compare lhs with a set member, short-circuit if found
+void op_check_member(State &state, uint64_t param) {
+ if (state.peek(1).equal(state.peek(0))) {
+ state.replace(2, state.stash.create<DoubleValue>(1.0));
+ state.program_offset += param;
+ } else {
+ state.stack.pop_back();
+ }
+}
+
+// set member not found, replace lhs with false
+void op_not_member(State &state, uint64_t) {
+ state.stack.pop_back();
+ state.stack.push_back(state.stash.create<DoubleValue>(0.0));
+}
+
+//-----------------------------------------------------------------------------
+
+void op_tensor_sum(State &state, uint64_t) {
+ const eval::Tensor *tensor = state.peek(0).as_tensor();
+ if (tensor != nullptr) {
+ state.replace(1, tensor->engine().reduce(*tensor, operation::Add(), state.stash));
+ } else {
+ state.replace(1, state.stash.create<ErrorValue>());
+ }
+}
+
+void op_tensor_sum_dimension(State &state, uint64_t param) {
+ const eval::Tensor *tensor = state.peek(0).as_tensor();
+ if (tensor != nullptr) {
+ const vespalib::string &dimension = unwrap_param<vespalib::string>(param);
+ state.replace(1, tensor->engine().reduce(*tensor, operation::Add(), {dimension}, state.stash));
+ } else {
+ state.replace(1, state.stash.create<ErrorValue>());
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+struct ProgramBuilder : public NodeVisitor, public NodeTraverser {
+ std::vector<Instruction> &program;
+ Stash &stash;
+ const TensorEngine &tensor_engine;
+
+ ProgramBuilder(std::vector<Instruction> &program_in, Stash &stash_in, const TensorEngine &tensor_engine_in)
+ : program(program_in), stash(stash_in), tensor_engine(tensor_engine_in) {}
+
+ //-------------------------------------------------------------------------
+
+ virtual void visit(const Number &node) {
+ program.emplace_back(op_load_const, wrap_param<Value>(stash.create<DoubleValue>(node.value())));
+ }
+ virtual void visit(const Symbol &node) {
+ if (node.id() >= 0) { // param value
+ program.emplace_back(op_load_param, node.id());
+ } else { // let binding
+ int let_offset = -(node.id() + 1);
+ program.emplace_back(op_load_let, let_offset);
+ }
+ }
+ virtual void visit(const String &node) {
+ program.emplace_back(op_load_const, wrap_param<Value>(stash.create<DoubleValue>(node.hash())));
+ }
+ virtual void visit(const Array &node) {
+ program.emplace_back(op_load_const, wrap_param<Value>(stash.create<DoubleValue>(node.size())));
+ }
+ virtual void visit(const Neg &) {
+ program.emplace_back(op_unary<operation::Neg>);
+ }
+ virtual void visit(const Not &) {
+ program.emplace_back(op_unary<operation::Not>);
+ }
+ virtual void visit(const If &node) {
+ node.cond().traverse(*this);
+ size_t after_cond = program.size();
+ program.emplace_back(op_skip_if_false);
+ node.true_expr().traverse(*this);
+ size_t after_true = program.size();
+ program.emplace_back(op_skip);
+ node.false_expr().traverse(*this);
+ program[after_cond].update_param(after_true - after_cond);
+ program[after_true].update_param(program.size() - after_true - 1);
+ }
+ virtual void visit(const Let &node) {
+ node.value().traverse(*this);
+ program.emplace_back(op_store_let);
+ node.expr().traverse(*this);
+ program.emplace_back(op_evict_let);
+ }
+ virtual void visit(const Error &) {
+ program.emplace_back(op_load_const, wrap_param<Value>(stash.create<ErrorValue>()));
+ }
+ virtual void visit(const nodes::Tensor &node) {
+ std::set<vespalib::string> dimension_names;
+ for (const auto &cell: node.cells()) {
+ const auto &address = cell.first;
+ for (const auto &binding: address) {
+ dimension_names.insert(binding.first);
+ }
+ }
+ std::vector<ValueType::Dimension> dimensions;
+ for (const auto &name: dimension_names) {
+ dimensions.emplace_back(name);
+ }
+ if (dimensions.empty() && false) { // XXX: 0-dimensional tensor should be double
+ double value = 0.0;
+ for (const auto &cell: node.cells()) {
+ value = cell.second;
+ }
+ program.emplace_back(op_load_const, wrap_param<Value>(stash.create<DoubleValue>(value)));
+ } else {
+ TensorSpec spec(ValueType::tensor_type(dimensions).to_spec());
+ for (const auto &cell: node.cells()) {
+ const auto &address = cell.first;
+ TensorSpec::Address spec_address;
+ for (const auto &binding: address) {
+ spec_address.emplace(binding.first, TensorSpec::Label(binding.second));
+ }
+ spec.add(spec_address, cell.second);
+ }
+ std::unique_ptr<eval::Tensor> tensor = tensor_engine.create(spec);
+ program.emplace_back(op_load_const,
+ wrap_param<Value>(stash.create<TensorValue>(std::move(tensor))));
+ }
+ }
+ virtual void visit(const TensorSum &node) {
+ if (node.dimension().empty()) {
+ program.emplace_back(op_tensor_sum);
+ } else {
+ program.emplace_back(op_tensor_sum_dimension,
+ wrap_param<vespalib::string>(stash.create<vespalib::string>(node.dimension())));
+ }
+ }
+ virtual void visit(const TensorMatch &) {
+ program.emplace_back(op_binary<operation::Mul>);
+ }
+ virtual void visit(const Add &) {
+ program.emplace_back(op_binary<operation::Add>);
+ }
+ virtual void visit(const Sub &) {
+ program.emplace_back(op_binary<operation::Sub>);
+ }
+ virtual void visit(const Mul &) {
+ program.emplace_back(op_binary<operation::Mul>);
+ }
+ virtual void visit(const Div &) {
+ program.emplace_back(op_binary<operation::Div>);
+ }
+ virtual void visit(const Pow &) {
+ program.emplace_back(op_binary<operation::Pow>);
+ }
+ virtual void visit(const Equal &) {
+ program.emplace_back(op_binary<operation::Equal>);
+ }
+ virtual void visit(const NotEqual &) {
+ program.emplace_back(op_binary<operation::NotEqual>);
+ }
+ virtual void visit(const Approx &) {
+ program.emplace_back(op_binary<operation::Approx>);
+ }
+ virtual void visit(const Less &) {
+ program.emplace_back(op_binary<operation::Less>);
+ }
+ virtual void visit(const LessEqual &) {
+ program.emplace_back(op_binary<operation::LessEqual>);
+ }
+ virtual void visit(const Greater &) {
+ program.emplace_back(op_binary<operation::Greater>);
+ }
+ virtual void visit(const GreaterEqual &) {
+ program.emplace_back(op_binary<operation::GreaterEqual>);
+ }
+ virtual void visit(const In &node) {
+ std::vector<size_t> checks;
+ node.lhs().traverse(*this);
+ auto array = as<Array>(node.rhs());
+ if (array) {
+ for (size_t i = 0; i < array->size(); ++i) {
+ array->get(i).traverse(*this);
+ checks.push_back(program.size());
+ program.emplace_back(op_check_member);
+ }
+ } else {
+ node.rhs().traverse(*this);
+ checks.push_back(program.size());
+ program.emplace_back(op_check_member);
+ }
+ for (size_t i = 0; i < checks.size(); ++i) {
+ program[checks[i]].update_param(program.size() - checks[i]);
+ }
+ program.emplace_back(op_not_member);
+ }
+ virtual void visit(const And &) {
+ program.emplace_back(op_binary<operation::And>);
+ }
+ virtual void visit(const Or &) {
+ program.emplace_back(op_binary<operation::Or>);
+ }
+ virtual void visit(const Cos &) {
+ program.emplace_back(op_unary<operation::Cos>);
+ }
+ virtual void visit(const Sin &) {
+ program.emplace_back(op_unary<operation::Sin>);
+ }
+ virtual void visit(const Tan &) {
+ program.emplace_back(op_unary<operation::Tan>);
+ }
+ virtual void visit(const Cosh &) {
+ program.emplace_back(op_unary<operation::Cosh>);
+ }
+ virtual void visit(const Sinh &) {
+ program.emplace_back(op_unary<operation::Sinh>);
+ }
+ virtual void visit(const Tanh &) {
+ program.emplace_back(op_unary<operation::Tanh>);
+ }
+ virtual void visit(const Acos &) {
+ program.emplace_back(op_unary<operation::Acos>);
+ }
+ virtual void visit(const Asin &) {
+ program.emplace_back(op_unary<operation::Asin>);
+ }
+ virtual void visit(const Atan &) {
+ program.emplace_back(op_unary<operation::Atan>);
+ }
+ virtual void visit(const Exp &) {
+ program.emplace_back(op_unary<operation::Exp>);
+ }
+ virtual void visit(const Log10 &) {
+ program.emplace_back(op_unary<operation::Log10>);
+ }
+ virtual void visit(const Log &) {
+ program.emplace_back(op_unary<operation::Log>);
+ }
+ virtual void visit(const Sqrt &) {
+ program.emplace_back(op_unary<operation::Sqrt>);
+ }
+ virtual void visit(const Ceil &) {
+ program.emplace_back(op_unary<operation::Ceil>);
+ }
+ virtual void visit(const Fabs &) {
+ program.emplace_back(op_unary<operation::Fabs>);
+ }
+ virtual void visit(const Floor &) {
+ program.emplace_back(op_unary<operation::Floor>);
+ }
+ virtual void visit(const Atan2 &) {
+ program.emplace_back(op_binary<operation::Atan2>);
+ }
+ virtual void visit(const Ldexp &) {
+ program.emplace_back(op_binary<operation::Ldexp>);
+ }
+ virtual void visit(const Pow2 &) {
+ program.emplace_back(op_binary<operation::Pow>);
+ }
+ virtual void visit(const Fmod &) {
+ program.emplace_back(op_binary<operation::Fmod>);
+ }
+ virtual void visit(const Min &) {
+ program.emplace_back(op_binary<operation::Min>);
+ }
+ virtual void visit(const Max &) {
+ program.emplace_back(op_binary<operation::Max>);
+ }
+ virtual void visit(const IsNan &) {
+ program.emplace_back(op_unary<operation::IsNan>);
+ }
+
+ //-------------------------------------------------------------------------
+
+ virtual bool open(const Node &node) {
+ if (check_type<Array, If, Let, In>(node)) {
+ node.accept(*this);
+ return false;
+ }
+ return true;
+ }
+
+ virtual void close(const Node &node) {
+ node.accept(*this);
+ }
+};
+
+} // namespace vespalib::<unnamed>
+
+InterpretedFunction::InterpretedFunction(const TensorEngine &engine, const nodes::Node &root, size_t num_params_in)
+ : _program(),
+ _stash(),
+ _num_params(num_params_in),
+ _tensor_engine(engine)
+{
+ ProgramBuilder program_builder(_program, _stash, _tensor_engine);
+ root.traverse(program_builder);
+}
+
+const Value &
+InterpretedFunction::eval(Context &ctx) const
+{
+ State &state = ctx._state;
+ state.clear();
+ assert(state.params.size() == _num_params);
+ while (state.program_offset < _program.size()) {
+ _program[state.program_offset++].perform(state);
+ }
+ if (state.stack.size() != 1) {
+ state.stack.push_back(state.stash.create<ErrorValue>());
+ }
+ return state.stack.back();
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/interpreted_function.h b/vespalib/src/vespa/vespalib/eval/interpreted_function.h
new file mode 100644
index 00000000000..a271ee90153
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/interpreted_function.h
@@ -0,0 +1,98 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "function.h"
+#include <vespa/vespalib/util/stash.h>
+#include "simple_tensor_engine.h"
+
+namespace vespalib {
+namespace eval {
+
+namespace nodes { class Node; }
+class TensorEngine;
+
+/**
+ * A Function that has been prepared for execution. This will
+ * typically run slower than a compiled function but faster than
+ * evaluating the Function AST directly. The
+ * InterpretedFunction::Context class is used to keep track of the
+ * run-time state related to the evaluation of an interpreted
+ * function. The result of an evaluation is only valid until either
+ * the context is destructed or the context is re-used to perform
+ * another evaluation.
+ **/
+class InterpretedFunction
+{
+public:
+ struct State {
+ std::vector<Value::CREF> params;
+ Stash stash;
+ std::vector<Value::CREF> stack;
+ std::vector<Value::CREF> let_values;
+ uint32_t program_offset;
+ uint32_t if_cnt;
+ State() : params(), stash(), stack(), let_values(), program_offset(0) {}
+ void clear() {
+ stash.clear();
+ stack.clear();
+ let_values.clear();
+ program_offset = 0;
+ if_cnt = 0;
+ }
+ const Value &peek(size_t ridx) const {
+ return stack[stack.size() - 1 - ridx];
+ }
+ void replace(size_t prune_cnt, const Value &value) {
+ for (size_t i = 0; i < prune_cnt; ++i) {
+ stack.pop_back();
+ }
+ stack.push_back(value);
+ }
+ };
+ class Context {
+ friend class InterpretedFunction;
+ private:
+ State _state;
+ Stash _param_stash;
+ public:
+ void clear_params() {
+ _state.params.clear();
+ _param_stash.clear();
+ }
+ void add_param(const Value &param) { _state.params.push_back(param); }
+ void add_param(double param) { add_param(_param_stash.create<DoubleValue>(param)); }
+ uint32_t if_cnt() const { return _state.if_cnt; }
+ };
+ using op_function = void (*)(State &, uint64_t);
+ class Instruction {
+ private:
+ op_function function;
+ uint64_t param;
+ public:
+ explicit Instruction(op_function function_in)
+ : function(function_in), param(0) {}
+ Instruction(op_function function_in, uint64_t param_in)
+ : function(function_in), param(param_in) {}
+ void update_param(uint64_t param_in) { param = param_in; }
+ void perform(State &state) const { function(state, param); }
+ };
+
+private:
+ std::vector<Instruction> _program;
+ Stash _stash;
+ size_t _num_params;
+ const TensorEngine &_tensor_engine;
+
+public:
+ typedef std::unique_ptr<InterpretedFunction> UP;
+ InterpretedFunction(const TensorEngine &engine, const nodes::Node &root, size_t num_params_in);
+ InterpretedFunction(const TensorEngine &engine, const Function &function)
+ : InterpretedFunction(engine, function.root(), function.num_params()) {}
+ InterpretedFunction(InterpretedFunction &&rhs) = default;
+ size_t num_params() const { return _num_params; }
+ const Value &eval(Context &ctx) const;
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/key_gen.cpp b/vespalib/src/vespa/vespalib/eval/key_gen.cpp
new file mode 100644
index 00000000000..13795486142
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/key_gen.cpp
@@ -0,0 +1,96 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "key_gen.h"
+#include "node_visitor.h"
+#include "node_traverser.h"
+#include "compiled_function.h"
+
+namespace vespalib {
+namespace eval {
+
+using namespace nodes;
+
+namespace {
+
+struct KeyGen : public NodeVisitor, public NodeTraverser {
+ vespalib::string key;
+
+ // build
+ void add_double(double value) { key.append(&value, sizeof(value)); }
+ void add_size(size_t value) { key.append(&value, sizeof(value)); }
+ void add_int(int value) { key.append(&value, sizeof(value)); }
+ void add_hash(uint32_t value) { key.append(&value, sizeof(value)); }
+ void add_byte(uint8_t value) { key.append(&value, sizeof(value)); }
+ void add_bool(bool value) { key.push_back(value ? '1' : '0'); }
+
+ // visit
+ virtual void visit(const Number &node) { add_byte( 1); add_double(node.value()); }
+ virtual void visit(const Symbol &node) { add_byte( 2); add_int(node.id()); }
+ virtual void visit(const String &node) { add_byte( 3); add_hash(node.hash()); }
+ virtual void visit(const Array &node) { add_byte( 4); add_size(node.size()); }
+ virtual void visit(const Neg &) { add_byte( 5); }
+ virtual void visit(const Not &) { add_byte( 6); }
+ virtual void visit(const If &node) { add_byte( 7); add_double(node.p_true()); }
+ virtual void visit(const Let &) { add_byte( 8); }
+ virtual void visit(const Error &) { add_byte( 9); }
+ virtual void visit(const nodes::Tensor&) { add_byte( 0); }
+ virtual void visit(const TensorSum &) { add_byte( 0); }
+ virtual void visit(const TensorMatch &) { add_byte( 0); }
+ virtual void visit(const Add &) { add_byte(10); }
+ virtual void visit(const Sub &) { add_byte(11); }
+ virtual void visit(const Mul &) { add_byte(12); }
+ virtual void visit(const Div &) { add_byte(13); }
+ virtual void visit(const Pow &) { add_byte(14); }
+ virtual void visit(const Equal &) { add_byte(15); }
+ virtual void visit(const NotEqual &) { add_byte(16); }
+ virtual void visit(const Approx &) { add_byte(17); }
+ virtual void visit(const Less &) { add_byte(18); }
+ virtual void visit(const LessEqual &) { add_byte(19); }
+ virtual void visit(const Greater &) { add_byte(20); }
+ virtual void visit(const GreaterEqual &) { add_byte(21); }
+ virtual void visit(const In &) { add_byte(22); }
+ virtual void visit(const And &) { add_byte(23); }
+ virtual void visit(const Or &) { add_byte(24); }
+ virtual void visit(const Cos &) { add_byte(25); }
+ virtual void visit(const Sin &) { add_byte(26); }
+ virtual void visit(const Tan &) { add_byte(27); }
+ virtual void visit(const Cosh &) { add_byte(28); }
+ virtual void visit(const Sinh &) { add_byte(29); }
+ virtual void visit(const Tanh &) { add_byte(30); }
+ virtual void visit(const Acos &) { add_byte(31); }
+ virtual void visit(const Asin &) { add_byte(32); }
+ virtual void visit(const Atan &) { add_byte(33); }
+ virtual void visit(const Exp &) { add_byte(34); }
+ virtual void visit(const Log10 &) { add_byte(35); }
+ virtual void visit(const Log &) { add_byte(36); }
+ virtual void visit(const Sqrt &) { add_byte(37); }
+ virtual void visit(const Ceil &) { add_byte(38); }
+ virtual void visit(const Fabs &) { add_byte(39); }
+ virtual void visit(const Floor &) { add_byte(40); }
+ virtual void visit(const Atan2 &) { add_byte(41); }
+ virtual void visit(const Ldexp &) { add_byte(42); }
+ virtual void visit(const Pow2 &) { add_byte(43); }
+ virtual void visit(const Fmod &) { add_byte(44); }
+ virtual void visit(const Min &) { add_byte(45); }
+ virtual void visit(const Max &) { add_byte(46); }
+ virtual void visit(const IsNan &) { add_byte(47); }
+
+ // traverse
+ virtual bool open(const Node &node) { node.accept(*this); return true; }
+ virtual void close(const Node &) {}
+};
+
+} // namespace vespalib::eval::<unnamed>
+
+vespalib::string gen_key(const Function &function, PassParams pass_params)
+{
+ KeyGen key_gen;
+ key_gen.add_bool(pass_params == PassParams::ARRAY);
+ key_gen.add_size(function.num_params());
+ function.root().traverse(key_gen);
+ return key_gen.key;
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/key_gen.h b/vespalib/src/vespa/vespalib/eval/key_gen.h
new file mode 100644
index 00000000000..c8479b1b457
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/key_gen.h
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+namespace eval {
+
+class Function;
+enum class PassParams;
+
+/**
+ * Function used to generate a binary key that may be used to query
+ * the compilation cache.
+ **/
+vespalib::string gen_key(const Function &function, PassParams pass_params);
+
+} // namespace vespalib::eval
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/eval/llvm_wrapper.cpp b/vespalib/src/vespa/vespalib/eval/llvm_wrapper.cpp
new file mode 100644
index 00000000000..d846b197d8d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/llvm_wrapper.cpp
@@ -0,0 +1,607 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "llvm_wrapper.h"
+#include "node_visitor.h"
+#include "node_traverser.h"
+#include <llvm/Analysis/Verifier.h>
+#include <llvm/IR/IRBuilder.h>
+#include <llvm/IR/Intrinsics.h>
+#include <llvm/ExecutionEngine/ExecutionEngine.h>
+#include <llvm/Analysis/Passes.h>
+#include <llvm/IR/DataLayout.h>
+#include <llvm/Transforms/Scalar.h>
+#include <llvm/LinkAllPasses.h>
+#include <llvm/Transforms/IPO/PassManagerBuilder.h>
+#include "gbdt.h"
+#include "check_type.h"
+#include <vespa/vespalib/stllike/hash_set.h>
+#include <vespa/vespalib/util/approx.h>
+
+double vespalib_eval_ldexp(double a, double b) { return ldexp(a, b); }
+double vespalib_eval_min(double a, double b) { return std::min(a, b); }
+double vespalib_eval_max(double a, double b) { return std::max(a, b); }
+double vespalib_eval_isnan(double a) { return (std::isnan(a) ? 1.0 : 0.0); }
+double vespalib_eval_approx(double a, double b) { return (vespalib::approx_equal(a, b) ? 1.0 : 0.0); }
+
+namespace vespalib {
+namespace eval {
+
+using namespace nodes;
+
+namespace {
+
+struct SetMemberHash : PluginState {
+ vespalib::hash_set<double> members;
+ explicit SetMemberHash(const Array &array) : members(array.size() * 3) {
+ for (size_t i = 0; i < array.size(); ++i) {
+ members.insert(array.get(i).get_const_value());
+ }
+ }
+ static bool check_membership(const PluginState *state, double value) {
+ const SetMemberHash &my_state = *((const SetMemberHash *)state);
+ return (my_state.members.find(value) != my_state.members.end());
+ }
+};
+
+struct FunctionBuilder : public NodeVisitor, public NodeTraverser {
+
+ llvm::ExecutionEngine &engine;
+ llvm::LLVMContext &context;
+ llvm::Module &module;
+ llvm::IRBuilder<> builder;
+ std::vector<llvm::Value*> params;
+ std::vector<llvm::Value*> values;
+ std::vector<llvm::Value*> let_values;
+ llvm::Function *function;
+ bool use_array;
+ bool inside_forest;
+ const Node *forest_end;
+ const gbdt::Optimize::Chain &forest_optimizers;
+ std::vector<gbdt::Forest::UP> &forests;
+ std::vector<PluginState::UP> &plugin_state;
+
+ FunctionBuilder(llvm::ExecutionEngine &engine_in,
+ llvm::LLVMContext &context_in,
+ llvm::Module &module_in,
+ const vespalib::string &name_in,
+ size_t num_params_in,
+ bool use_array_in,
+ const gbdt::Optimize::Chain &forest_optimizers_in,
+ std::vector<gbdt::Forest::UP> &forests_out,
+ std::vector<PluginState::UP> &plugin_state_out)
+ : engine(engine_in),
+ context(context_in),
+ module(module_in),
+ builder(context),
+ params(),
+ values(),
+ let_values(),
+ function(nullptr),
+ use_array(use_array_in),
+ inside_forest(false),
+ forest_end(nullptr),
+ forest_optimizers(forest_optimizers_in),
+ forests(forests_out),
+ plugin_state(plugin_state_out)
+ {
+ std::vector<llvm::Type*> param_types;
+ if (use_array_in) {
+ param_types.push_back(builder.getDoubleTy()->getPointerTo());
+ } else {
+ param_types.resize(num_params_in, builder.getDoubleTy());
+ }
+ llvm::FunctionType *function_type = llvm::FunctionType::get(builder.getDoubleTy(), param_types, false);
+ function = llvm::Function::Create(function_type, llvm::Function::ExternalLinkage, name_in.c_str(), &module);
+ function->addFnAttr(llvm::Attribute::AttrKind::NoInline);
+ llvm::BasicBlock *block = llvm::BasicBlock::Create(context, "entry", function);
+ builder.SetInsertPoint(block);
+ for (llvm::Function::arg_iterator itr = function->arg_begin(); itr != function->arg_end(); ++itr) {
+ params.push_back(itr);
+ }
+ }
+
+ //-------------------------------------------------------------------------
+
+ llvm::Value *get_param(size_t idx) {
+ if (!use_array) {
+ assert(idx < params.size());
+ return params[idx];
+ }
+ assert(params.size() == 1);
+ llvm::Value *param_array = params[0];
+ llvm::Value *addr = builder.CreateGEP(param_array, builder.getInt64(idx));
+ return builder.CreateLoad(addr);
+ }
+
+ //-------------------------------------------------------------------------
+
+ void push(llvm::Value *value) {
+ values.push_back(value);
+ }
+
+ llvm::Value *pop_bool() {
+ assert(!values.empty());
+ llvm::Value *value = values.back();
+ values.pop_back();
+ if (value->getType()->isIntegerTy(1)) {
+ return value;
+ }
+ assert(value->getType()->isDoubleTy());
+ return builder.CreateFCmpUNE(value, llvm::ConstantFP::get(context, llvm::APFloat(0.0)), "as_bool");
+ }
+
+ llvm::Value *pop_double() {
+ assert(!values.empty());
+ llvm::Value *value = values.back();
+ values.pop_back();
+ if (value->getType()->isDoubleTy()) {
+ return value;
+ }
+ assert(value->getType()->isIntegerTy(1));
+ return builder.CreateUIToFP(value, builder.getDoubleTy(), "as_double");
+ }
+
+ //-------------------------------------------------------------------------
+
+ bool try_optimize_forest(const Node &item) {
+ auto trees = gbdt::extract_trees(item);
+ gbdt::ForestStats stats(trees);
+ auto optimize_result = gbdt::Optimize::apply_chain(forest_optimizers, stats, trees);
+ if (!optimize_result.valid()) {
+ return false;
+ }
+ forests.push_back(std::move(optimize_result.forest));
+ void *eval_ptr = (void *) optimize_result.eval;
+ gbdt::Forest *forest = forests.back().get();
+ std::vector<llvm::Type*> param_types;
+ param_types.push_back(builder.getVoidTy()->getPointerTo());
+ param_types.push_back(builder.getDoubleTy()->getPointerTo());
+ llvm::FunctionType *function_type = llvm::FunctionType::get(builder.getDoubleTy(), param_types, false);
+ llvm::PointerType *function_pointer_type = llvm::PointerType::get(function_type, 0);
+ llvm::Value *eval_fun = builder.CreateIntToPtr(builder.getInt64((uint64_t)eval_ptr), function_pointer_type, "inject_eval");
+ llvm::Value *ctx = builder.CreateIntToPtr(builder.getInt64((uint64_t)forest), builder.getVoidTy()->getPointerTo(), "inject_ctx");
+ push(builder.CreateCall2(eval_fun, ctx, function->arg_begin(), "call_eval"));
+ return true;
+ }
+
+ //-------------------------------------------------------------------------
+
+ bool open(const Node &node) {
+ if (node.is_const()) {
+ push_double(node.get_const_value());
+ return false;
+ }
+ if (!inside_forest && use_array && node.is_forest()) {
+ if (try_optimize_forest(node)) {
+ return false;
+ }
+ inside_forest = true;
+ forest_end = &node;
+ }
+ if (check_type<Array, If, Let, In>(node)) {
+ node.accept(*this);
+ return false;
+ }
+ return true;
+ }
+
+ void close(const Node &node) {
+ node.accept(*this);
+ if (inside_forest && (forest_end == &node)) {
+ inside_forest = false;
+ forest_end = nullptr;
+ }
+ }
+
+ //-------------------------------------------------------------------------
+
+ void build_root(const Node &node) {
+ node.traverse(*this);
+ }
+
+ void build_forest_fragment(const std::vector<const Node *> &trees) {
+ inside_forest = true;
+ assert(!trees.empty());
+ llvm::Value *sum = nullptr;
+ for (auto tree: trees) {
+ tree->traverse(*this);
+ llvm::Value *tree_value = pop_double();
+ sum = (sum)
+ ? builder.CreateFAdd(sum, tree_value, "add_tree")
+ : tree_value;
+ }
+ push(sum);
+ inside_forest = false;
+ }
+
+ void *compile() {
+ builder.CreateRet(pop_double());
+ assert(values.empty());
+ llvm::verifyFunction(*function);
+ return engine.getPointerToFunction(function);
+ }
+
+ //-------------------------------------------------------------------------
+
+ void push_double(double value) {
+ push(llvm::ConstantFP::get(builder.getDoubleTy(), value));
+ }
+
+ void push_error() {
+ push_double(error_value);
+ }
+
+ void make_call_1(llvm::Function *fun) {
+ if (fun == nullptr || fun->arg_size() != 1) {
+ return push_error();
+ }
+ llvm::Value *a = pop_double();
+ push(builder.CreateCall(fun, a));
+ }
+ void make_call_1(const llvm::Intrinsic::ID &id) {
+ make_call_1(llvm::Intrinsic::getDeclaration(&module, id, builder.getDoubleTy()));
+ }
+ void make_call_1(const char *name) {
+ make_call_1(dynamic_cast<llvm::Function*>(module.getOrInsertFunction(name,
+ builder.getDoubleTy(),
+ builder.getDoubleTy(), nullptr)));
+ }
+
+ void make_call_2(llvm::Function *fun) {
+ if (fun == nullptr || fun->arg_size() != 2) {
+ return push_error();
+ }
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateCall2(fun, a, b));
+ }
+ void make_call_2(const llvm::Intrinsic::ID &id) {
+ make_call_2(llvm::Intrinsic::getDeclaration(&module, id, builder.getDoubleTy()));
+ }
+ void make_call_2(const char *name) {
+ make_call_2(dynamic_cast<llvm::Function*>(module.getOrInsertFunction(name,
+ builder.getDoubleTy(),
+ builder.getDoubleTy(),
+ builder.getDoubleTy(), nullptr)));
+ }
+
+ //-------------------------------------------------------------------------
+
+ // basic nodes
+
+ virtual void visit(const Number &item) {
+ push_double(item.value());
+ }
+ virtual void visit(const Symbol &item) {
+ if (item.id() >= 0) {
+ push(get_param(item.id()));
+ } else {
+ int let_offset = -(item.id() + 1);
+ assert(size_t(let_offset) < let_values.size());
+ push(let_values[let_offset]);
+ }
+ }
+ virtual void visit(const String &item) {
+ push_double(item.hash());
+ }
+ virtual void visit(const Array &item) {
+ // NB: visit not open
+ push_double(item.size());
+ }
+ virtual void visit(const Neg &) {
+ llvm::Value *child = pop_double();
+ push(builder.CreateFNeg(child, "neg_res"));
+ }
+ virtual void visit(const Not &) {
+ llvm::Value *child = pop_bool();
+ push(builder.CreateNot(child, "not_res"));
+ }
+ virtual void visit(const If &item) {
+ // NB: visit not open
+ llvm::BasicBlock *true_block = llvm::BasicBlock::Create(context, "true_block", function);
+ llvm::BasicBlock *false_block = llvm::BasicBlock::Create(context, "false_block", function);
+ llvm::BasicBlock *merge_block = llvm::BasicBlock::Create(context, "merge_block", function);
+ item.cond().traverse(*this); // NB: recursion
+ llvm::Value *cond = pop_bool();
+ builder.CreateCondBr(cond, true_block, false_block);
+ // true block
+ builder.SetInsertPoint(true_block);
+ item.true_expr().traverse(*this); // NB: recursion
+ llvm::Value *true_res = pop_double();
+ llvm::BasicBlock *true_end = builder.GetInsertBlock();
+ builder.CreateBr(merge_block);
+ // false block
+ builder.SetInsertPoint(false_block);
+ item.false_expr().traverse(*this); // NB: recursion
+ llvm::Value *false_res = pop_double();
+ llvm::BasicBlock *false_end = builder.GetInsertBlock();
+ builder.CreateBr(merge_block);
+ // merge block
+ builder.SetInsertPoint(merge_block);
+ llvm::PHINode *phi = builder.CreatePHI(builder.getDoubleTy(), 2, "if_res");
+ phi->addIncoming(true_res, true_end);
+ phi->addIncoming(false_res, false_end);
+ push(phi);
+ }
+ virtual void visit(const Let &item) {
+ // NB: visit not open
+ item.value().traverse(*this); // NB: recursion
+ let_values.push_back(pop_double());
+ item.expr().traverse(*this); // NB: recursion
+ let_values.pop_back();
+ }
+ virtual void visit(const Error &) {
+ push_error();
+ }
+
+ // tensor nodes
+
+ virtual void visit(const nodes::Tensor &item) {
+ // verbatim_tensor -> sum(verbatim_tensor)
+ double value = 0.0;
+ for (const auto &cell: item.cells()) {
+ value += cell.second;
+ }
+ push_double(value);
+ }
+ virtual void visit(const TensorSum &) {
+ // sum(x) -> x
+ }
+ virtual void visit(const TensorMatch &) {
+ // match(a,b) -> a * b
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFMul(a, b, "match_res"));
+ }
+
+ // operator nodes
+
+ virtual void visit(const Add &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFAdd(a, b, "add_res"));
+ }
+ virtual void visit(const Sub &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFSub(a, b, "sub_res"));
+ }
+ virtual void visit(const Mul &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFMul(a, b, "mul_res"));
+ }
+ virtual void visit(const Div &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFDiv(a, b, "div_res"));
+ }
+ virtual void visit(const Pow &) {
+ make_call_2(llvm::Intrinsic::pow);
+ }
+ virtual void visit(const Equal &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFCmpOEQ(a, b, "cmp_eq_res"));
+ }
+ virtual void visit(const NotEqual &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFCmpUNE(a, b, "cmp_ne_res"));
+ }
+ virtual void visit(const Approx &) {
+ make_call_2("vespalib_eval_approx");
+ }
+ virtual void visit(const Less &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFCmpOLT(a, b, "cmp_lt_res"));
+ }
+ virtual void visit(const LessEqual &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFCmpOLE(a, b, "cmp_le_res"));
+ }
+ virtual void visit(const Greater &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFCmpOGT(a, b, "cmp_gt_res"));
+ }
+ virtual void visit(const GreaterEqual &) {
+ llvm::Value *b = pop_double();
+ llvm::Value *a = pop_double();
+ push(builder.CreateFCmpOGE(a, b, "cmp_ge_res"));
+ }
+ virtual void visit(const In &item) {
+ // NB: visit not open
+ item.lhs().traverse(*this); // NB: recursion
+ llvm::Value *lhs = pop_double();
+ auto array = as<Array>(item.rhs());
+ if (array) {
+ if (array->is_const() && array->size() > 8) {
+ // build call to hash lookup
+ plugin_state.emplace_back(new SetMemberHash(*array));
+ void *call_ptr = (void *) SetMemberHash::check_membership;
+ PluginState *state = plugin_state.back().get();
+ std::vector<llvm::Type*> param_types;
+ param_types.push_back(builder.getVoidTy()->getPointerTo());
+ param_types.push_back(builder.getDoubleTy());
+ llvm::FunctionType *function_type = llvm::FunctionType::get(builder.getInt1Ty(), param_types, false);
+ llvm::PointerType *function_pointer_type = llvm::PointerType::get(function_type, 0);
+ llvm::Value *call_fun = builder.CreateIntToPtr(builder.getInt64((uint64_t)call_ptr), function_pointer_type, "inject_call_addr");
+ llvm::Value *ctx = builder.CreateIntToPtr(builder.getInt64((uint64_t)state), builder.getVoidTy()->getPointerTo(), "inject_ctx");
+ push(builder.CreateCall2(call_fun, ctx, lhs, "call_check_membership"));
+ } else {
+ // build explicit code to check all set members
+ llvm::Value *found = builder.getFalse();
+ for (size_t i = 0; i < array->size(); ++i) {
+ array->get(i).traverse(*this); // NB: recursion
+ llvm::Value *elem = pop_double();
+ llvm::Value *elem_eq = builder.CreateFCmpOEQ(lhs, elem, "elem_eq");
+ found = builder.CreateOr(found, elem_eq, "found");
+ }
+ push(found);
+ }
+ } else {
+ item.rhs().traverse(*this); // NB: recursion
+ llvm::Value *rhs = pop_double();
+ push(builder.CreateFCmpOEQ(lhs, rhs, "rhs_eq"));
+ }
+ }
+ virtual void visit(const And &) {
+ llvm::Value *b = pop_bool();
+ llvm::Value *a = pop_bool();
+ push(builder.CreateAnd(a, b, "and_res"));
+ }
+ virtual void visit(const Or &) {
+ llvm::Value *b = pop_bool();
+ llvm::Value *a = pop_bool();
+ push(builder.CreateOr(a, b, "or_res"));
+ }
+
+ // call nodes
+
+ virtual void visit(const Cos &) {
+ make_call_1(llvm::Intrinsic::cos);
+ }
+ virtual void visit(const Sin &) {
+ make_call_1(llvm::Intrinsic::sin);
+ }
+ virtual void visit(const Tan &) {
+ make_call_1("tan");
+ }
+ virtual void visit(const Cosh &) {
+ make_call_1("cosh");
+ }
+ virtual void visit(const Sinh &) {
+ make_call_1("sinh");
+ }
+ virtual void visit(const Tanh &) {
+ make_call_1("tanh");
+ }
+ virtual void visit(const Acos &) {
+ make_call_1("acos");
+ }
+ virtual void visit(const Asin &) {
+ make_call_1("asin");
+ }
+ virtual void visit(const Atan &) {
+ make_call_1("atan");
+ }
+ virtual void visit(const Exp &) {
+ make_call_1(llvm::Intrinsic::exp);
+ }
+ virtual void visit(const Log10 &) {
+ make_call_1(llvm::Intrinsic::log10);
+ }
+ virtual void visit(const Log &) {
+ make_call_1(llvm::Intrinsic::log);
+ }
+ virtual void visit(const Sqrt &) {
+ make_call_1(llvm::Intrinsic::sqrt);
+ }
+ virtual void visit(const Ceil &) {
+ make_call_1(llvm::Intrinsic::ceil);
+ }
+ virtual void visit(const Fabs &) {
+ make_call_1(llvm::Intrinsic::fabs);
+ }
+ virtual void visit(const Floor &) {
+ make_call_1(llvm::Intrinsic::floor);
+ }
+ virtual void visit(const Atan2 &) {
+ make_call_2("atan2");
+ }
+ virtual void visit(const Ldexp &) {
+ make_call_2("vespalib_eval_ldexp");
+ }
+ virtual void visit(const Pow2 &) {
+ make_call_2(llvm::Intrinsic::pow);
+ }
+ virtual void visit(const Fmod &) {
+ make_call_2("fmod");
+ }
+ virtual void visit(const Min &) {
+ make_call_2("vespalib_eval_min");
+ }
+ virtual void visit(const Max &) {
+ make_call_2("vespalib_eval_max");
+ }
+ virtual void visit(const IsNan &) {
+ make_call_1("vespalib_eval_isnan");
+ }
+};
+
+} // namespace vespalib::eval::<unnamed>
+
+struct InitializeNativeTarget {
+ InitializeNativeTarget() {
+ LLVMInitializeNativeTarget();
+ }
+} initialize_native_target;
+
+std::recursive_mutex LLVMWrapper::_global_llvm_lock;
+
+LLVMWrapper::LLVMWrapper()
+ : _context(nullptr),
+ _module(nullptr),
+ _engine(nullptr),
+ _num_functions(0),
+ _forests(),
+ _plugin_state()
+{
+ std::lock_guard<std::recursive_mutex> guard(_global_llvm_lock);
+ _context = new llvm::LLVMContext();
+ _module = new llvm::Module("LLVMWrapper", *_context);
+ _engine = llvm::EngineBuilder(_module).setOptLevel(llvm::CodeGenOpt::Aggressive).create();
+ assert(_engine != nullptr && "llvm jit not available for your platform");
+}
+
+LLVMWrapper::LLVMWrapper(LLVMWrapper &&rhs)
+ : _context(rhs._context),
+ _module(rhs._module),
+ _engine(rhs._engine),
+ _num_functions(rhs._num_functions),
+ _forests(std::move(rhs._forests)),
+ _plugin_state(std::move(rhs._plugin_state))
+{
+ rhs._context = nullptr;
+ rhs._module = nullptr;
+ rhs._engine = nullptr;
+}
+
+void *
+LLVMWrapper::compile_function(size_t num_params, bool use_array, const Node &root,
+ const gbdt::Optimize::Chain &forest_optimizers)
+{
+ std::lock_guard<std::recursive_mutex> guard(_global_llvm_lock);
+ FunctionBuilder builder(*_engine, *_context, *_module,
+ vespalib::make_string("f%zu", ++_num_functions),
+ num_params, use_array,
+ forest_optimizers, _forests, _plugin_state);
+ builder.build_root(root);
+ return builder.compile();
+}
+
+void *
+LLVMWrapper::compile_forest_fragment(const std::vector<const Node *> &fragment)
+{
+ std::lock_guard<std::recursive_mutex> guard(_global_llvm_lock);
+ FunctionBuilder builder(*_engine, *_context, *_module,
+ vespalib::make_string("f%zu", ++_num_functions),
+ 0, true,
+ gbdt::Optimize::none, _forests, _plugin_state);
+ builder.build_forest_fragment(fragment);
+ return builder.compile();
+}
+
+LLVMWrapper::~LLVMWrapper() {
+ std::lock_guard<std::recursive_mutex> guard(_global_llvm_lock);
+ delete _engine;
+ // _module is owned by _engine
+ delete _context;
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/llvm_wrapper.h b/vespalib/src/vespa/vespalib/eval/llvm_wrapper.h
new file mode 100644
index 00000000000..dc9c4d8b71b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/llvm_wrapper.h
@@ -0,0 +1,66 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "function.h"
+#include "gbdt.h"
+
+#include <llvm/IR/LLVMContext.h>
+#include <llvm/IR/Module.h>
+#include <llvm/ExecutionEngine/ExecutionEngine.h>
+#include <llvm/PassManager.h>
+#include <mutex>
+
+extern "C" {
+ double vespalib_eval_ldexp(double a, double b);
+ double vespalib_eval_min(double a, double b);
+ double vespalib_eval_max(double a, double b);
+ double vespalib_eval_isnan(double a);
+ double vespalib_eval_approx(double a, double b);
+};
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * Simple interface used to track and clean up custom state. This is
+ * typically used to destruct native objects that are invoked from
+ * within the generated machine code as part of evaluation. An example
+ * is that large set membership checks against constant values will be
+ * transformed into lookups in a pre-generated hash table.
+ **/
+struct PluginState {
+ using UP = std::unique_ptr<PluginState>;
+ virtual ~PluginState() {}
+};
+
+/**
+ * Stuff related to LLVM code generation is wrapped in this
+ * class. This is mostly used by the CompiledFunction class.
+ **/
+class LLVMWrapper
+{
+private:
+ llvm::LLVMContext *_context;
+ llvm::Module *_module; // owned by engine
+ llvm::ExecutionEngine *_engine;
+ size_t _num_functions;
+ std::vector<gbdt::Forest::UP> _forests;
+ std::vector<PluginState::UP> _plugin_state;
+
+ static std::recursive_mutex _global_llvm_lock;
+
+public:
+ LLVMWrapper();
+ LLVMWrapper(LLVMWrapper &&rhs);
+ void *compile_function(size_t num_params, bool use_array, const nodes::Node &root,
+ const gbdt::Optimize::Chain &forest_optimizers);
+ void *compile_forest_fragment(const std::vector<const nodes::Node *> &fragment);
+ const std::vector<gbdt::Forest::UP> &get_forests() const { return _forests; }
+ void dump() const { _module->dump(); }
+ ~LLVMWrapper();
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/eval/node_traverser.h b/vespalib/src/vespa/vespalib/eval/node_traverser.h
new file mode 100644
index 00000000000..0ba32a728c3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/node_traverser.h
@@ -0,0 +1,28 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "basic_nodes.h"
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * Interface used when traversing nodes. The open function is called
+ * before any children are traversed and the close function is called
+ * after all children are traversed. Children are traversed in the
+ * order defined by the Node::get_child function. If open returns
+ * false; no children of the node will be traversed and close will not
+ * be called for the node.
+ **/
+struct NodeTraverser {
+
+ virtual bool open(const nodes::Node &) = 0;
+ virtual void close(const nodes::Node &) = 0;
+
+ virtual ~NodeTraverser() {}
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/eval/node_types.cpp b/vespalib/src/vespa/vespalib/eval/node_types.cpp
new file mode 100644
index 00000000000..87120f79e00
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/node_types.cpp
@@ -0,0 +1,304 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "check_type.h"
+#include "function.h"
+#include "node_traverser.h"
+#include "node_types.h"
+#include "node_visitor.h"
+
+namespace vespalib {
+namespace eval {
+namespace nodes {
+namespace {
+
+class State
+{
+private:
+ const std::vector<ValueType> &_params;
+ std::map<const Node *, ValueType> &_type_map;
+ std::vector<ValueType> _let_types;
+ std::vector<ValueType> _types;
+
+public:
+ State(const std::vector<ValueType> &params,
+ std::map<const Node *, ValueType> &type_map)
+ : _params(params), _type_map(type_map), _let_types(), _types() {}
+
+ const ValueType &param_type(size_t idx) {
+ assert(idx < _params.size());
+ return _params[idx];
+ }
+ const ValueType &let_type(size_t idx) {
+ assert(idx < _let_types.size());
+ return _let_types[idx];
+ }
+ const ValueType &peek(size_t ridx) const {
+ assert(_types.size() > ridx);
+ return _types[_types.size() - 1 - ridx];
+ }
+ void bind(size_t prune_cnt, const ValueType &type_ref, const Node &node) {
+ ValueType type = type_ref; // need copy since type_ref might be inside _types
+ assert(_types.size() >= prune_cnt);
+ for (size_t i = 0; i < prune_cnt; ++i) {
+ _types.pop_back();
+ }
+ _types.push_back(type);
+ _type_map.emplace(&node, type);
+ }
+ void push_let(const ValueType &type) {
+ _let_types.push_back(type);
+ }
+ void pop_let() {
+ assert(!_let_types.empty());
+ _let_types.pop_back();
+ }
+ void assert_valid_end_state() const {
+ assert(_let_types.empty());
+ assert(_types.size() == 1);
+ }
+};
+
+void action_bind_let(State &state) {
+ state.push_let(state.peek(0));
+}
+
+void action_unbind_let(State &state) {
+ state.pop_let();
+}
+
+struct TypeResolver : public NodeVisitor, public NodeTraverser {
+ State state;
+ using action_function = void (*)(State &);
+ std::vector<std::pair<const Node *, action_function>> actions;
+ TypeResolver(const std::vector<ValueType> &params_in,
+ std::map<const Node *, ValueType> &type_map_out)
+ : state(params_in, type_map_out), actions() {}
+
+ //-------------------------------------------------------------------------
+
+ void assert_valid_end_state() const {
+ assert(actions.empty());
+ state.assert_valid_end_state();
+ }
+
+ void add_action(const Node &trigger, action_function action) {
+ actions.emplace_back(&trigger, action);
+ }
+
+ void check_actions(const Node &node) {
+ if (!actions.empty() && (actions.back().first == &node)) {
+ actions.back().second(state);
+ actions.pop_back();
+ }
+ }
+
+ //-------------------------------------------------------------------------
+
+ void bind_type(const ValueType &type, const Node &node) {
+ state.bind(node.num_children(), type, node);
+ }
+
+ bool check_error(const Node &node) {
+ for (size_t i = 0; i < node.num_children(); ++i) {
+ if (state.peek(i).is_error()) {
+ bind_type(ValueType::error_type(), node);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void resolve_op1(const Node &node) {
+ bind_type(state.peek(0), node);
+ }
+
+ bool maybe_resolve_op2(const Node &node) {
+ if (state.peek(1).is_any() || state.peek(0).is_any()) {
+ bind_type(ValueType::any_type(), node);
+ } else if (state.peek(1).is_double()) {
+ bind_type(state.peek(0), node);
+ } else if (state.peek(0).is_double()) {
+ bind_type(state.peek(1), node);
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+ void resolve_op2(const Node &node) {
+ if (!maybe_resolve_op2(node)) {
+ bind_type(ValueType::error_type(), node);
+ }
+ }
+
+ void resolve_op2_union(const Node &node) {
+ if (!maybe_resolve_op2(node)) {
+ bind_type(state.peek(1).add_dimensions_from(state.peek(0)), node);
+ }
+ }
+
+ //-------------------------------------------------------------------------
+
+ virtual void visit(const Number &node) {
+ bind_type(ValueType::double_type(), node);
+ }
+ virtual void visit(const Symbol &node) {
+ if (node.id() >= 0) { // param value
+ bind_type(state.param_type(node.id()), node);
+ } else { // let binding
+ int let_offset = -(node.id() + 1);
+ bind_type(state.let_type(let_offset), node);
+ }
+ }
+ virtual void visit(const String &node) {
+ bind_type(ValueType::double_type(), node);
+ }
+ virtual void visit(const Array &node) {
+ bind_type(ValueType::double_type(), node);
+ }
+ virtual void visit(const Neg &node) { resolve_op1(node); }
+ virtual void visit(const Not &node) { resolve_op1(node); }
+ virtual void visit(const If &node) {
+ ValueType true_type = state.peek(1);
+ ValueType false_type = state.peek(0);
+ if (true_type == false_type) {
+ bind_type(true_type, node);
+ } else if (true_type.is_tensor() && false_type.is_tensor()) {
+ bind_type(ValueType::tensor_type({}), node);
+ } else {
+ bind_type(ValueType::any_type(), node);
+ }
+ }
+ virtual void visit(const Let &node) {
+ bind_type(state.peek(0), node);
+ }
+ virtual void visit(const Error &node) {
+ bind_type(ValueType::error_type(), node);
+ }
+ virtual void visit(const Tensor &node) {
+ bind_type(ValueType::tensor_type({}), node);
+ }
+ virtual void visit(const TensorSum &node) {
+ const ValueType &child = state.peek(0);
+ if (node.dimension().empty()) {
+ if (child.is_any()) {
+ bind_type(ValueType::any_type(), node);
+ } else {
+ bind_type(ValueType::double_type(), node);
+ }
+ } else {
+ bind_type(child.remove_dimensions({node.dimension()}), node);
+ }
+ }
+ virtual void visit(const TensorMatch &node) {
+ if (state.peek(1).is_any() || state.peek(0).is_any()) {
+ bind_type(ValueType::any_type(), node);
+ } else if ((state.peek(1) == state.peek(0)) &&
+ (!state.peek(1).unknown_dimensions() && !state.peek(0).unknown_dimensions()))
+ {
+ bind_type(state.peek(0), node);
+ } else if ((state.peek(1).is_tensor() && state.peek(0).is_tensor()) &&
+ (state.peek(1).unknown_dimensions() || state.peek(0).unknown_dimensions()))
+ {
+ bind_type(ValueType::any_type(), node);
+ } else {
+ bind_type(ValueType::error_type(), node);
+ }
+ }
+ virtual void visit(const Add &node) { resolve_op2_union(node); }
+ virtual void visit(const Sub &node) { resolve_op2_union(node); }
+ virtual void visit(const Mul &node) { resolve_op2_union(node); }
+ virtual void visit(const Div &node) { resolve_op2(node); }
+ virtual void visit(const Pow &node) { resolve_op2(node); }
+ virtual void visit(const Equal &node) { resolve_op2(node); }
+ virtual void visit(const NotEqual &node) { resolve_op2(node); }
+ virtual void visit(const Approx &node) { resolve_op2(node); }
+ virtual void visit(const Less &node) { resolve_op2(node); }
+ virtual void visit(const LessEqual &node) { resolve_op2(node); }
+ virtual void visit(const Greater &node) { resolve_op2(node); }
+ virtual void visit(const GreaterEqual &node) { resolve_op2(node); }
+ virtual void visit(const In &node) {
+ bind_type(ValueType::double_type(), node);
+ }
+ virtual void visit(const And &node) { resolve_op2(node); }
+ virtual void visit(const Or &node) { resolve_op2(node); }
+ virtual void visit(const Cos &node) { resolve_op1(node); }
+ virtual void visit(const Sin &node) { resolve_op1(node); }
+ virtual void visit(const Tan &node) { resolve_op1(node); }
+ virtual void visit(const Cosh &node) { resolve_op1(node); }
+ virtual void visit(const Sinh &node) { resolve_op1(node); }
+ virtual void visit(const Tanh &node) { resolve_op1(node); }
+ virtual void visit(const Acos &node) { resolve_op1(node); }
+ virtual void visit(const Asin &node) { resolve_op1(node); }
+ virtual void visit(const Atan &node) { resolve_op1(node); }
+ virtual void visit(const Exp &node) { resolve_op1(node); }
+ virtual void visit(const Log10 &node) { resolve_op1(node); }
+ virtual void visit(const Log &node) { resolve_op1(node); }
+ virtual void visit(const Sqrt &node) { resolve_op1(node); }
+ virtual void visit(const Ceil &node) { resolve_op1(node); }
+ virtual void visit(const Fabs &node) { resolve_op1(node); }
+ virtual void visit(const Floor &node) { resolve_op1(node); }
+ virtual void visit(const Atan2 &node) { resolve_op2(node); }
+ virtual void visit(const Ldexp &node) { resolve_op2(node); }
+ virtual void visit(const Pow2 &node) { resolve_op2(node); }
+ virtual void visit(const Fmod &node) { resolve_op2(node); }
+ virtual void visit(const Min &node) { resolve_op2_union(node); }
+ virtual void visit(const Max &node) { resolve_op2_union(node); }
+ virtual void visit(const IsNan &node) { resolve_op1(node); }
+
+ //-------------------------------------------------------------------------
+
+ virtual bool open(const Node &node) {
+ auto let = as<Let>(node);
+ if (let) {
+ add_action(let->expr(), action_unbind_let);
+ add_action(let->value(), action_bind_let);
+ }
+ return true;
+ }
+
+ virtual void close(const Node &node) {
+ if (!check_error(node)) {
+ node.accept(*this);
+ }
+ check_actions(node);
+ }
+};
+
+} // namespace vespalib::eval::nodes::<unnamed>
+} // namespace vespalib::eval::nodes
+
+NodeTypes::NodeTypes(const Function &function, const std::vector<ValueType> &input_types)
+ : _not_found(ValueType::error_type()),
+ _type_map()
+{
+ assert(input_types.size() == function.num_params());
+ nodes::TypeResolver resolver(input_types, _type_map);
+ function.root().traverse(resolver);
+ resolver.assert_valid_end_state();
+}
+
+const ValueType &
+NodeTypes::get_type(const nodes::Node &node) const
+{
+ auto pos = _type_map.find(&node);
+ if (pos == _type_map.end()) {
+ return _not_found;
+ }
+ return pos->second;
+}
+
+bool
+NodeTypes::all_types_are_double() const
+{
+ for (const auto &entry: _type_map) {
+ if (!entry.second.is_double()) {
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/node_types.h b/vespalib/src/vespa/vespalib/eval/node_types.h
new file mode 100644
index 00000000000..c137d6dc43b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/node_types.h
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value_type.h"
+#include <map>
+
+namespace vespalib {
+namespace eval {
+
+namespace nodes { class Node; }
+class Function;
+
+/**
+ * Class keeping track of the output type of all intermediate
+ * calculations for a single function. The constructor performs type
+ * resolution for each node in the AST based on the type of all
+ * function parameters.
+ **/
+class NodeTypes
+{
+private:
+ ValueType _not_found;
+ std::map<const nodes::Node*,ValueType> _type_map;
+public:
+ NodeTypes(const Function &function, const std::vector<ValueType> &input_types);
+ const ValueType &get_type(const nodes::Node &node) const;
+ bool all_types_are_double() const;
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/node_visitor.h b/vespalib/src/vespa/vespalib/eval/node_visitor.h
new file mode 100644
index 00000000000..d8401f2d765
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/node_visitor.h
@@ -0,0 +1,140 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "basic_nodes.h"
+#include "tensor_nodes.h"
+#include "operator_nodes.h"
+#include "call_nodes.h"
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * Interface implemented by Node visitors to resolve the actual type
+ * of an abstract Node. This is typically used when directly
+ * evaluating an AST, when creating a binary compile cache key or when
+ * compiling an AST to machine code using LLVM.
+ **/
+struct NodeVisitor {
+
+ // basic nodes
+ virtual void visit(const nodes::Number &) = 0;
+ virtual void visit(const nodes::Symbol &) = 0;
+ virtual void visit(const nodes::String &) = 0;
+ virtual void visit(const nodes::Array &) = 0;
+ virtual void visit(const nodes::Neg &) = 0;
+ virtual void visit(const nodes::Not &) = 0;
+ virtual void visit(const nodes::If &) = 0;
+ virtual void visit(const nodes::Let &) = 0;
+ virtual void visit(const nodes::Error &) = 0;
+
+ // tensor nodes
+ virtual void visit(const nodes::Tensor &) = 0;
+ virtual void visit(const nodes::TensorSum &) = 0;
+ virtual void visit(const nodes::TensorMatch &) = 0;
+
+ // operator nodes
+ virtual void visit(const nodes::Add &) = 0;
+ virtual void visit(const nodes::Sub &) = 0;
+ virtual void visit(const nodes::Mul &) = 0;
+ virtual void visit(const nodes::Div &) = 0;
+ virtual void visit(const nodes::Pow &) = 0;
+ virtual void visit(const nodes::Equal &) = 0;
+ virtual void visit(const nodes::NotEqual &) = 0;
+ virtual void visit(const nodes::Approx &) = 0;
+ virtual void visit(const nodes::Less &) = 0;
+ virtual void visit(const nodes::LessEqual &) = 0;
+ virtual void visit(const nodes::Greater &) = 0;
+ virtual void visit(const nodes::GreaterEqual &) = 0;
+ virtual void visit(const nodes::In &) = 0;
+ virtual void visit(const nodes::And &) = 0;
+ virtual void visit(const nodes::Or &) = 0;
+
+ // call nodes
+ virtual void visit(const nodes::Cos &) = 0;
+ virtual void visit(const nodes::Sin &) = 0;
+ virtual void visit(const nodes::Tan &) = 0;
+ virtual void visit(const nodes::Cosh &) = 0;
+ virtual void visit(const nodes::Sinh &) = 0;
+ virtual void visit(const nodes::Tanh &) = 0;
+ virtual void visit(const nodes::Acos &) = 0;
+ virtual void visit(const nodes::Asin &) = 0;
+ virtual void visit(const nodes::Atan &) = 0;
+ virtual void visit(const nodes::Exp &) = 0;
+ virtual void visit(const nodes::Log10 &) = 0;
+ virtual void visit(const nodes::Log &) = 0;
+ virtual void visit(const nodes::Sqrt &) = 0;
+ virtual void visit(const nodes::Ceil &) = 0;
+ virtual void visit(const nodes::Fabs &) = 0;
+ virtual void visit(const nodes::Floor &) = 0;
+ virtual void visit(const nodes::Atan2 &) = 0;
+ virtual void visit(const nodes::Ldexp &) = 0;
+ virtual void visit(const nodes::Pow2 &) = 0;
+ virtual void visit(const nodes::Fmod &) = 0;
+ virtual void visit(const nodes::Min &) = 0;
+ virtual void visit(const nodes::Max &) = 0;
+ virtual void visit(const nodes::IsNan &) = 0;
+
+ virtual ~NodeVisitor() {}
+};
+
+/**
+ * Node visitor helper class that can be subclassed to ignore handling
+ * of all types not specifically handled.
+ **/
+struct EmptyNodeVisitor : NodeVisitor {
+ virtual void visit(const nodes::Number &) {}
+ virtual void visit(const nodes::Symbol &) {}
+ virtual void visit(const nodes::String &) {}
+ virtual void visit(const nodes::Array &) {}
+ virtual void visit(const nodes::Neg &) {}
+ virtual void visit(const nodes::Not &) {}
+ virtual void visit(const nodes::If &) {}
+ virtual void visit(const nodes::Let &) {}
+ virtual void visit(const nodes::Error &) {}
+ virtual void visit(const nodes::Tensor &) {}
+ virtual void visit(const nodes::TensorSum &) {}
+ virtual void visit(const nodes::TensorMatch &) {}
+ virtual void visit(const nodes::Add &) {}
+ virtual void visit(const nodes::Sub &) {}
+ virtual void visit(const nodes::Mul &) {}
+ virtual void visit(const nodes::Div &) {}
+ virtual void visit(const nodes::Pow &) {}
+ virtual void visit(const nodes::Equal &) {}
+ virtual void visit(const nodes::NotEqual &) {}
+ virtual void visit(const nodes::Approx &) {}
+ virtual void visit(const nodes::Less &) {}
+ virtual void visit(const nodes::LessEqual &) {}
+ virtual void visit(const nodes::Greater &) {}
+ virtual void visit(const nodes::GreaterEqual &) {}
+ virtual void visit(const nodes::In &) {}
+ virtual void visit(const nodes::And &) {}
+ virtual void visit(const nodes::Or &) {}
+ virtual void visit(const nodes::Cos &) {}
+ virtual void visit(const nodes::Sin &) {}
+ virtual void visit(const nodes::Tan &) {}
+ virtual void visit(const nodes::Cosh &) {}
+ virtual void visit(const nodes::Sinh &) {}
+ virtual void visit(const nodes::Tanh &) {}
+ virtual void visit(const nodes::Acos &) {}
+ virtual void visit(const nodes::Asin &) {}
+ virtual void visit(const nodes::Atan &) {}
+ virtual void visit(const nodes::Exp &) {}
+ virtual void visit(const nodes::Log10 &) {}
+ virtual void visit(const nodes::Log &) {}
+ virtual void visit(const nodes::Sqrt &) {}
+ virtual void visit(const nodes::Ceil &) {}
+ virtual void visit(const nodes::Fabs &) {}
+ virtual void visit(const nodes::Floor &) {}
+ virtual void visit(const nodes::Atan2 &) {}
+ virtual void visit(const nodes::Ldexp &) {}
+ virtual void visit(const nodes::Pow2 &) {}
+ virtual void visit(const nodes::Fmod &) {}
+ virtual void visit(const nodes::Min &) {}
+ virtual void visit(const nodes::Max &) {}
+ virtual void visit(const nodes::IsNan &) {}
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/operation.cpp b/vespalib/src/vespa/vespalib/eval/operation.cpp
new file mode 100644
index 00000000000..bcd4c5171d2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/operation.cpp
@@ -0,0 +1,89 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "operation.h"
+#include "value.h"
+#include "operation_visitor.h"
+
+namespace vespalib {
+namespace eval {
+
+const Value &
+UnaryOperation::perform(const Value &lhs, Stash &stash) const {
+ if (lhs.is_error()) {
+ return stash.create<ErrorValue>();
+ } else if (lhs.is_double()) {
+ return stash.create<DoubleValue>(eval(lhs.as_double()));
+ } else {
+ return lhs.apply(*this, stash);
+ }
+}
+
+const Value &
+BinaryOperation::perform(const Value &lhs, const Value &rhs, Stash &stash) const {
+ if (lhs.is_error() || rhs.is_error()) {
+ return stash.create<ErrorValue>();
+ } else if (lhs.is_double() && rhs.is_double()) {
+ return stash.create<DoubleValue>(eval(lhs.as_double(), rhs.as_double()));
+ } else if (lhs.is_double()) {
+ BindLeft unary_op(*this, lhs.as_double());
+ return rhs.apply(unary_op, stash);
+ } else if (rhs.is_double()) {
+ BindRight unary_op(*this, rhs.as_double());
+ return lhs.apply(unary_op, stash);
+ } else {
+ return lhs.apply(*this, rhs, stash);
+ }
+}
+
+template <typename T> void Op1<T>::accept(OperationVisitor &visitor) const {
+ visitor.visit(static_cast<const T&>(*this));
+}
+
+template <typename T> void Op2<T>::accept(OperationVisitor &visitor) const {
+ visitor.visit(static_cast<const T&>(*this));
+}
+
+namespace operation {
+double Neg::eval(double a) const { return -a; }
+double Not::eval(double a) const { return (a != 0.0) ? 0.0 : 1.0; }
+double Add::eval(double a, double b) const { return (a + b); }
+double Sub::eval(double a, double b) const { return (a - b); }
+double Mul::eval(double a, double b) const { return (a * b); }
+double Div::eval(double a, double b) const { return (a / b); }
+double Pow::eval(double a, double b) const { return pow(a, b); }
+double Equal::eval(double a, double b) const { return (a == b) ? 1.0 : 0.0; }
+double NotEqual::eval(double a, double b) const { return (a != b) ? 1.0 : 0.0; }
+double Approx::eval(double a, double b) const { return approx_equal(a, b); }
+double Less::eval(double a, double b) const { return (a < b) ? 1.0 : 0.0; }
+double LessEqual::eval(double a, double b) const { return (a <= b) ? 1.0 : 0.0; }
+double Greater::eval(double a, double b) const { return (a > b) ? 1.0 : 0.0; }
+double GreaterEqual::eval(double a, double b) const { return (a >= b) ? 1.0 : 0.0; }
+double And::eval(double a, double b) const { return ((a != 0.0) && (b != 0.0)) ? 1.0 : 0.0; }
+double Or::eval(double a, double b) const { return ((a != 0.0) || (b != 0.0)) ? 1.0 : 0.0; }
+double Cos::eval(double a) const { return cos(a); }
+double Sin::eval(double a) const { return sin(a); }
+double Tan::eval(double a) const { return tan(a); }
+double Cosh::eval(double a) const { return cosh(a); }
+double Sinh::eval(double a) const { return sinh(a); }
+double Tanh::eval(double a) const { return tanh(a); }
+double Acos::eval(double a) const { return acos(a); }
+double Asin::eval(double a) const { return asin(a); }
+double Atan::eval(double a) const { return atan(a); }
+double Exp::eval(double a) const { return exp(a); }
+double Log10::eval(double a) const { return log10(a); }
+double Log::eval(double a) const { return log(a); }
+double Sqrt::eval(double a) const { return sqrt(a); }
+double Ceil::eval(double a) const { return ceil(a); }
+double Fabs::eval(double a) const { return fabs(a); }
+double Floor::eval(double a) const { return floor(a); }
+double Atan2::eval(double a, double b) const { return atan2(a, b); }
+double Ldexp::eval(double a, double b) const { return ldexp(a, b); }
+double Fmod::eval(double a, double b) const { return fmod(a, b); }
+double Min::eval(double a, double b) const { return std::min(a, b); }
+double Max::eval(double a, double b) const { return std::max(a, b); }
+double IsNan::eval(double a) const { return std::isnan(a) ? 1.0 : 0.0; }
+} // namespace vespalib::eval::operation
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/operation.h b/vespalib/src/vespa/vespalib/eval/operation.h
new file mode 100644
index 00000000000..11fbc2cdad4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/operation.h
@@ -0,0 +1,136 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value.h"
+#include <cmath>
+#include <vespa/vespalib/util/approx.h>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace eval {
+
+struct OperationVisitor;
+
+/**
+ * An Operation represents the action taken based on what is described
+ * by an Operator or a Call AST node. All operations have underlying
+ * numeric meaning (that can be overridden for complex value
+ * types). They no longer have any textual counterpart and are only
+ * separated by the number of values they operate on.
+ **/
+struct Operation {
+ virtual void accept(OperationVisitor &visitor) const = 0;
+ virtual ~Operation() {}
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * An Operation performing a calculation based on a single input
+ * value.
+ **/
+struct UnaryOperation : Operation {
+ const Value &perform(const Value &a, Stash &stash) const;
+ virtual double eval(double a) const = 0;
+};
+
+/**
+ * An Operation performing a calculation based on two input values.
+ **/
+struct BinaryOperation : Operation {
+ const Value &perform(const Value &a, const Value &b, Stash &stash) const;
+ virtual double eval(double a, double b) const = 0;
+};
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+struct Op1 : UnaryOperation {
+ virtual void accept(OperationVisitor &visitor) const override;
+};
+
+template <typename T>
+struct Op2 : BinaryOperation {
+ virtual void accept(OperationVisitor &visitor) const override;
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * This class binds the first parameter of a binary operation to a
+ * numeric value, acting as a unary operation. Note that using
+ * visitation will still reveal the underlying operation type.
+ **/
+class BindLeft : public UnaryOperation
+{
+private:
+ const BinaryOperation &_op;
+ double _a;
+public:
+ BindLeft(const BinaryOperation &op, double a) : _op(op), _a(a) {}
+ double eval(double b) const override { return _op.eval(_a, b); }
+ virtual void accept(OperationVisitor &visitor) const override { _op.accept(visitor); }
+};
+
+/**
+ * This class binds the second parameter of a binary operation to a
+ * numeric value, acting as a unary operation. Note that using
+ * visitation will still reveal the underlying operation type.
+ **/
+class BindRight : public UnaryOperation
+{
+private:
+ const BinaryOperation &_op;
+ double _b;
+public:
+ BindRight(const BinaryOperation &op, double b) : _op(op), _b(b) {}
+ double eval(double a) const override { return _op.eval(a, _b); }
+ virtual void accept(OperationVisitor &visitor) const override { _op.accept(visitor); }
+};
+
+//-----------------------------------------------------------------------------
+
+namespace operation {
+struct Neg : Op1<Neg> { double eval(double a) const override; };
+struct Not : Op1<Not> { double eval(double a) const override; };
+struct Add : Op2<Add> { double eval(double a, double b) const override; };
+struct Sub : Op2<Sub> { double eval(double a, double b) const override; };
+struct Mul : Op2<Mul> { double eval(double a, double b) const override; };
+struct Div : Op2<Div> { double eval(double a, double b) const override; };
+struct Pow : Op2<Pow> { double eval(double a, double b) const override; };
+struct Equal : Op2<Equal> { double eval(double a, double b) const override; };
+struct NotEqual : Op2<NotEqual> { double eval(double a, double b) const override; };
+struct Approx : Op2<Approx> { double eval(double a, double b) const override; };
+struct Less : Op2<Less> { double eval(double a, double b) const override; };
+struct LessEqual : Op2<LessEqual> { double eval(double a, double b) const override; };
+struct Greater : Op2<Greater> { double eval(double a, double b) const override; };
+struct GreaterEqual : Op2<GreaterEqual> { double eval(double a, double b) const override; };
+struct And : Op2<And> { double eval(double a, double b) const override; };
+struct Or : Op2<Or> { double eval(double a, double b) const override; };
+struct Cos : Op1<Cos> { double eval(double a) const override; };
+struct Sin : Op1<Sin> { double eval(double a) const override; };
+struct Tan : Op1<Tan> { double eval(double a) const override; };
+struct Cosh : Op1<Cosh> { double eval(double a) const override; };
+struct Sinh : Op1<Sinh> { double eval(double a) const override; };
+struct Tanh : Op1<Tanh> { double eval(double a) const override; };
+struct Acos : Op1<Acos> { double eval(double a) const override; };
+struct Asin : Op1<Asin> { double eval(double a) const override; };
+struct Atan : Op1<Atan> { double eval(double a) const override; };
+struct Exp : Op1<Exp> { double eval(double a) const override; };
+struct Log10 : Op1<Log10> { double eval(double a) const override; };
+struct Log : Op1<Log> { double eval(double a) const override; };
+struct Sqrt : Op1<Sqrt> { double eval(double a) const override; };
+struct Ceil : Op1<Ceil> { double eval(double a) const override; };
+struct Fabs : Op1<Fabs> { double eval(double a) const override; };
+struct Floor : Op1<Floor> { double eval(double a) const override; };
+struct Atan2 : Op2<Atan2> { double eval(double a, double b) const override; };
+struct Ldexp : Op2<Ldexp> { double eval(double a, double b) const override; };
+struct Fmod : Op2<Fmod> { double eval(double a, double b) const override; };
+struct Min : Op2<Min> { double eval(double a, double b) const override; };
+struct Max : Op2<Max> { double eval(double a, double b) const override; };
+struct IsNan : Op1<IsNan> { double eval(double a) const override; };
+} // namespace vespalib::eval::operation
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/operation_visitor.h b/vespalib/src/vespa/vespalib/eval/operation_visitor.h
new file mode 100644
index 00000000000..13d8bf7eb40
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/operation_visitor.h
@@ -0,0 +1,103 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "operation.h"
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * Interface implemented by Operation visitors to resolve the actual
+ * type of an abstract Operation.
+ **/
+struct OperationVisitor {
+ virtual void visit(const operation::Neg &) = 0;
+ virtual void visit(const operation::Not &) = 0;
+ virtual void visit(const operation::Add &) = 0;
+ virtual void visit(const operation::Sub &) = 0;
+ virtual void visit(const operation::Mul &) = 0;
+ virtual void visit(const operation::Div &) = 0;
+ virtual void visit(const operation::Pow &) = 0;
+ virtual void visit(const operation::Equal &) = 0;
+ virtual void visit(const operation::NotEqual &) = 0;
+ virtual void visit(const operation::Approx &) = 0;
+ virtual void visit(const operation::Less &) = 0;
+ virtual void visit(const operation::LessEqual &) = 0;
+ virtual void visit(const operation::Greater &) = 0;
+ virtual void visit(const operation::GreaterEqual &) = 0;
+ virtual void visit(const operation::And &) = 0;
+ virtual void visit(const operation::Or &) = 0;
+ virtual void visit(const operation::Cos &) = 0;
+ virtual void visit(const operation::Sin &) = 0;
+ virtual void visit(const operation::Tan &) = 0;
+ virtual void visit(const operation::Cosh &) = 0;
+ virtual void visit(const operation::Sinh &) = 0;
+ virtual void visit(const operation::Tanh &) = 0;
+ virtual void visit(const operation::Acos &) = 0;
+ virtual void visit(const operation::Asin &) = 0;
+ virtual void visit(const operation::Atan &) = 0;
+ virtual void visit(const operation::Exp &) = 0;
+ virtual void visit(const operation::Log10 &) = 0;
+ virtual void visit(const operation::Log &) = 0;
+ virtual void visit(const operation::Sqrt &) = 0;
+ virtual void visit(const operation::Ceil &) = 0;
+ virtual void visit(const operation::Fabs &) = 0;
+ virtual void visit(const operation::Floor &) = 0;
+ virtual void visit(const operation::Atan2 &) = 0;
+ virtual void visit(const operation::Ldexp &) = 0;
+ virtual void visit(const operation::Fmod &) = 0;
+ virtual void visit(const operation::Min &) = 0;
+ virtual void visit(const operation::Max &) = 0;
+ virtual void visit(const operation::IsNan &) = 0;
+ virtual ~OperationVisitor() {}
+};
+
+/**
+ * Operation visitor helper class that can be subclassed to implement
+ * common handling of all types not specifically handled.
+ **/
+struct DefaultOperationVisitor : OperationVisitor {
+ virtual void visitDefault(const Operation &) = 0;
+ virtual void visit(const operation::Neg &op) override { visitDefault(op); }
+ virtual void visit(const operation::Not &op) override { visitDefault(op); }
+ virtual void visit(const operation::Add &op) override { visitDefault(op); }
+ virtual void visit(const operation::Sub &op) override { visitDefault(op); }
+ virtual void visit(const operation::Mul &op) override { visitDefault(op); }
+ virtual void visit(const operation::Div &op) override { visitDefault(op); }
+ virtual void visit(const operation::Pow &op) override { visitDefault(op); }
+ virtual void visit(const operation::Equal &op) override { visitDefault(op); }
+ virtual void visit(const operation::NotEqual &op) override { visitDefault(op); }
+ virtual void visit(const operation::Approx &op) override { visitDefault(op); }
+ virtual void visit(const operation::Less &op) override { visitDefault(op); }
+ virtual void visit(const operation::LessEqual &op) override { visitDefault(op); }
+ virtual void visit(const operation::Greater &op) override { visitDefault(op); }
+ virtual void visit(const operation::GreaterEqual &op) override { visitDefault(op); }
+ virtual void visit(const operation::And &op) override { visitDefault(op); }
+ virtual void visit(const operation::Or &op) override { visitDefault(op); }
+ virtual void visit(const operation::Cos &op) override { visitDefault(op); }
+ virtual void visit(const operation::Sin &op) override { visitDefault(op); }
+ virtual void visit(const operation::Tan &op) override { visitDefault(op); }
+ virtual void visit(const operation::Cosh &op) override { visitDefault(op); }
+ virtual void visit(const operation::Sinh &op) override { visitDefault(op); }
+ virtual void visit(const operation::Tanh &op) override { visitDefault(op); }
+ virtual void visit(const operation::Acos &op) override { visitDefault(op); }
+ virtual void visit(const operation::Asin &op) override { visitDefault(op); }
+ virtual void visit(const operation::Atan &op) override { visitDefault(op); }
+ virtual void visit(const operation::Exp &op) override { visitDefault(op); }
+ virtual void visit(const operation::Log10 &op) override { visitDefault(op); }
+ virtual void visit(const operation::Log &op) override { visitDefault(op); }
+ virtual void visit(const operation::Sqrt &op) override { visitDefault(op); }
+ virtual void visit(const operation::Ceil &op) override { visitDefault(op); }
+ virtual void visit(const operation::Fabs &op) override { visitDefault(op); }
+ virtual void visit(const operation::Floor &op) override { visitDefault(op); }
+ virtual void visit(const operation::Atan2 &op) override { visitDefault(op); }
+ virtual void visit(const operation::Ldexp &op) override { visitDefault(op); }
+ virtual void visit(const operation::Fmod &op) override { visitDefault(op); }
+ virtual void visit(const operation::Min &op) override { visitDefault(op); }
+ virtual void visit(const operation::Max &op) override { visitDefault(op); }
+ virtual void visit(const operation::IsNan &op) override { visitDefault(op); }
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/operator_nodes.cpp b/vespalib/src/vespa/vespalib/eval/operator_nodes.cpp
new file mode 100644
index 00000000000..ab6955a8248
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/operator_nodes.cpp
@@ -0,0 +1,48 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "operator_nodes.h"
+#include "node_visitor.h"
+
+namespace vespalib {
+namespace eval {
+namespace nodes {
+
+template <typename T> void OperatorHelper<T>::accept(NodeVisitor &visitor) const {
+ visitor.visit(static_cast<const T&>(*this));
+}
+
+OperatorRepo OperatorRepo::_instance;
+OperatorRepo::OperatorRepo() : _map(), _max_size(0) {
+ add(nodes::Add());
+ add(nodes::Sub());
+ add(nodes::Mul());
+ add(nodes::Div());
+ add(nodes::Pow());
+ add(nodes::Equal());
+ add(nodes::NotEqual());
+ add(nodes::Approx());
+ add(nodes::Less());
+ add(nodes::LessEqual());
+ add(nodes::Greater());
+ add(nodes::GreaterEqual());
+ add(nodes::In());
+ add(nodes::And());
+ add(nodes::Or());
+}
+
+vespalib::string
+In::dump(DumpContext &ctx) const
+{
+ vespalib::string str;
+ str += "(";
+ str += lhs().dump(ctx);
+ str += " in ";
+ str += rhs().dump(ctx);
+ str += ")";
+ return str;
+}
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/operator_nodes.h b/vespalib/src/vespa/vespalib/eval/operator_nodes.h
new file mode 100644
index 00000000000..34b1e60d571
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/operator_nodes.h
@@ -0,0 +1,178 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <cmath>
+#include <memory>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include "basic_nodes.h"
+#include <map>
+
+namespace vespalib {
+namespace eval {
+
+struct NodeVisitor;
+
+namespace nodes {
+
+/**
+ * Common superclass for AST nodes describing infix operators. Each
+ * operator has a left hand side expression and a right hand side
+ * expression. The parser will use Operator instances to resolve
+ * precedence.
+ **/
+class Operator : public Node {
+public:
+ enum Order { LEFT, RIGHT };
+
+private:
+ vespalib::string _op_str;
+ int _priority;
+ Order _order;
+ Node_UP _lhs;
+ Node_UP _rhs;
+ bool _is_const;
+
+public:
+ Operator(const vespalib::string &op_str_in, int priority_in, Order order_in)
+ : _op_str(op_str_in), _priority(priority_in), _order(order_in), _lhs(), _rhs(), _is_const(false) {}
+ vespalib::string op_str() const { return _op_str; }
+ int priority() const { return _priority; }
+ Order order() const { return _order; }
+ const Node &lhs() const { return *_lhs; }
+ const Node &rhs() const { return *_rhs; }
+ virtual bool is_const() const override { return _is_const; }
+ virtual size_t num_children() const override { return (_lhs && _rhs) ? 2 : 0; }
+ virtual const Node &get_child(size_t idx) const override {
+ assert(idx < 2);
+ return (idx == 0) ? lhs() : rhs();
+ }
+ virtual void detach_children(NodeHandler &handler) override {
+ handler.handle(std::move(_lhs));
+ handler.handle(std::move(_rhs));
+ }
+
+ bool do_before(const Operator &other) {
+ if (priority() > other.priority()) {
+ return true;
+ }
+ if (other.priority() > priority()) {
+ return false;
+ }
+ assert(order() == other.order());
+ return (order() == LEFT);
+ }
+
+ virtual void bind(Node_UP lhs_in, Node_UP rhs_in) {
+ _lhs = std::move(lhs_in);
+ _rhs = std::move(rhs_in);
+ _is_const = (_lhs->is_const() && _rhs->is_const());
+ }
+
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "(";
+ str += _lhs->dump(ctx);
+ str += op_str();
+ str += _rhs->dump(ctx);
+ str += ")";
+ return str;
+ }
+};
+typedef std::unique_ptr<Operator> Operator_UP;
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Repository for known operators. This is used by the parser to
+ * create appropriate operator nodes.
+ **/
+class OperatorRepo {
+private:
+ static OperatorRepo _instance;
+ typedef nodes::Operator_UP (*factory_type)();
+ std::map<vespalib::string,factory_type> _map;
+ size_t _max_size;
+ template <typename T>
+ void add(const T &op) {
+ vespalib::string op_str = op.op_str();
+ _max_size = std::max(_max_size, op_str.size());
+ _map[op_str] = T::create;
+ }
+ OperatorRepo();
+public:
+ static const OperatorRepo &instance() { return _instance; }
+ size_t max_size() const { return _max_size; }
+ nodes::Operator_UP create(vespalib::string &tmp) const {
+ for (; !tmp.empty(); tmp.resize(tmp.size() - 1)) {
+ auto result = _map.find(tmp);
+ if (result != _map.end()) {
+ return result->second();
+ }
+ }
+ return nodes::Operator_UP(nullptr);
+ }
+ std::vector<vespalib::string> get_names() const {
+ std::vector<vespalib::string> ret;
+ for (const auto &entry: _map) {
+ ret.push_back(entry.first);
+ }
+ return ret;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+struct OperatorHelper : Operator {
+ using Helper = OperatorHelper<T>;
+ OperatorHelper(const vespalib::string &op_str_in, int priority_in, Operator::Order order_in)
+ : Operator(op_str_in, priority_in, order_in) {}
+ virtual void accept(NodeVisitor &visitor) const override;
+ static Operator_UP create() { return Operator_UP(new T()); }
+};
+
+//-----------------------------------------------------------------------------
+
+class Add : public OperatorHelper<Add> {
+private:
+ bool _is_forest;
+public:
+ Add() : Helper("+", 101, LEFT), _is_forest(false) {}
+ virtual bool is_forest() const override { return _is_forest; }
+ bool check_forest() const {
+ bool lhs_ok = (lhs().is_tree() || lhs().is_forest());
+ bool rhs_ok = (rhs().is_tree() || rhs().is_forest());
+ return (lhs_ok && rhs_ok);
+ }
+ virtual void bind(Node_UP lhs_in, Node_UP rhs_in) override {
+ OperatorHelper<Add>::bind(std::move(lhs_in), std::move(rhs_in));
+ _is_forest = check_forest();
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+struct Sub : OperatorHelper<Sub> { Sub() : Helper("-", 101, LEFT) {}};
+struct Mul : OperatorHelper<Mul> { Mul() : Helper("*", 102, LEFT) {}};
+struct Div : OperatorHelper<Div> { Div() : Helper("/", 102, LEFT) {}};
+struct Pow : OperatorHelper<Pow> { Pow() : Helper("^", 103, RIGHT) {}};
+struct Equal : OperatorHelper<Equal> { Equal() : Helper("==", 10, LEFT) {}};
+struct NotEqual : OperatorHelper<NotEqual> { NotEqual() : Helper("!=", 10, LEFT) {}};
+struct Approx : OperatorHelper<Approx> { Approx() : Helper("~=", 10, LEFT) {}};
+struct Less : OperatorHelper<Less> { Less() : Helper("<", 10, LEFT) {}};
+struct LessEqual : OperatorHelper<LessEqual> { LessEqual() : Helper("<=", 10, LEFT) {}};
+struct Greater : OperatorHelper<Greater> { Greater() : Helper(">", 10, LEFT) {}};
+struct GreaterEqual : OperatorHelper<GreaterEqual> { GreaterEqual() : Helper(">=", 10, LEFT) {}};
+struct In : OperatorHelper<In> { In() : Helper("in", 10, LEFT) {}
+ virtual vespalib::string dump(DumpContext &ctx) const override;
+};
+struct And : OperatorHelper<And> { And() : Helper("&&", 2, LEFT) {}};
+struct Or : OperatorHelper<Or> { Or() : Helper("||", 1, LEFT) {}};
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/simple_tensor.cpp b/vespalib/src/vespa/vespalib/eval/simple_tensor.cpp
new file mode 100644
index 00000000000..afd1ee50f54
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/simple_tensor.cpp
@@ -0,0 +1,467 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "simple_tensor.h"
+#include "simple_tensor_engine.h"
+#include "operation.h"
+#include <algorithm>
+
+namespace vespalib {
+namespace eval {
+
+using Address = SimpleTensor::Address;
+using Cell = SimpleTensor::Cell;
+using Cells = SimpleTensor::Cells;
+using IndexList = std::vector<size_t>;
+using Label = SimpleTensor::Label;
+using CellRef = std::reference_wrapper<const Cell>;
+
+namespace {
+
+void assert_type(const ValueType &type) {
+ assert(!type.is_abstract());
+ assert(type.is_double() || type.is_tensor());
+}
+
+void assert_address(const Address &address, const ValueType &type) {
+ assert(address.size() == type.dimensions().size());
+ for (size_t i = 0; i < address.size(); ++i) {
+ if (type.dimensions()[i].is_mapped()) {
+ assert(address[i].is_mapped());
+ } else {
+ assert(address[i].is_indexed());
+ assert(address[i].index < type.dimensions()[i].size);
+ }
+ }
+}
+
+Address select(const Address &address, const IndexList &selector) {
+ Address result;
+ for (size_t index: selector) {
+ result.push_back(address[index]);
+ }
+ return result;
+}
+
+Address select(const Address &a, const Address &b, const IndexList &selector) {
+ Address result;
+ for (size_t index: selector) {
+ if (index < a.size()) {
+ result.push_back(a[index]);
+ } else {
+ result.push_back(b[index - a.size()]);
+ }
+ }
+ return result;
+}
+
+/**
+ * Helper class used when building SimpleTensors. While a tensor
+ * in its final form simply contains a collection of cells, the
+ * builder keeps track of cell values as a block map instead. Each
+ * block is a dense multi-dimensional array that is addressed by
+ * the combination of all mapped Labels in a cell address. The
+ * indexed labels from the same cell address is used to address
+ * the appropriate cell value within the block. The reason for
+ * this is to make it easier to make sure that the indexed
+ * dimensions have entries for all valid Lables (densify with 0.0
+ * as default value).
+ **/
+class Builder {
+private:
+ class Block {
+ private:
+ const ValueType &_type;
+ const IndexList &_indexed;
+ std::vector<double> _values;
+ size_t offset_of(const Address &address) const {
+ size_t offset = 0;
+ for (size_t index: _indexed) {
+ size_t label = address[index].index;
+ size_t size = _type.dimensions()[index].size;
+ offset = (offset * size) + label;
+ }
+ return offset;
+ }
+ void subconvert(Address &address, size_t n, Cells &cells_out) const {
+ if (n < _indexed.size()) {
+ Label &label = address[_indexed[n]];
+ size_t size = _type.dimensions()[_indexed[n]].size;
+ for (label.index = 0; label.index < size; ++label.index) {
+ subconvert(address, n + 1, cells_out);
+ }
+ } else {
+ cells_out.emplace_back(address, _values[offset_of(address)]);
+ }
+ }
+ public:
+ Block(const ValueType &type, const IndexList &indexed, size_t num_values)
+ : _type(type), _indexed(indexed), _values(num_values, 0.0) {}
+ void set(const Address &address, double value) { _values[offset_of(address)] = value; }
+ void convert(const Address &block_key, const IndexList &mapped, Cells &cells_out) const {
+ Address address(_type.dimensions().size(), Label(size_t(0)));
+ for (size_t i = 0; i < mapped.size(); ++i) {
+ address[mapped[i]] = block_key[i];
+ }
+ subconvert(address, 0, cells_out);
+ }
+ };
+ using BlockMap = std::map<Address,Block>;
+ ValueType _type;
+ IndexList _mapped;
+ IndexList _indexed;
+ size_t _block_size;
+ BlockMap _blocks;
+public:
+ explicit Builder(const ValueType &type)
+ : _type(type),
+ _mapped(),
+ _indexed(),
+ _block_size(1),
+ _blocks()
+ {
+ assert_type(_type);
+ for (size_t i = 0; i < type.dimensions().size(); ++i) {
+ const auto &dimension = _type.dimensions()[i];
+ if (dimension.is_mapped()) {
+ _mapped.push_back(i);
+ } else {
+ _block_size *= dimension.size;
+ _indexed.push_back(i);
+ }
+ }
+ if (_mapped.empty()) {
+ _blocks.emplace(Address(), Block(_type, _indexed, _block_size));
+ }
+ }
+ void set(const Address &address, double value) {
+ assert_address(address, _type);
+ Address block_key = select(address, _mapped);
+ auto pos = _blocks.find(block_key);
+ if (pos == _blocks.end()) {
+ pos = _blocks.emplace(block_key, Block(_type, _indexed, _block_size)).first;
+ }
+ pos->second.set(address, value);
+ }
+ void set(const TensorSpec::Address &label_map, double value) {
+ Address address;
+ for (const auto &dimension: _type.dimensions()) {
+ auto pos = label_map.find(dimension.name);
+ assert(pos != label_map.end());
+ address.emplace_back(pos->second);
+ }
+ set(address, value);
+ }
+ std::unique_ptr<SimpleTensor> build() {
+ Cells cells;
+ for (const auto &entry: _blocks) {
+ entry.second.convert(entry.first, _mapped, cells);
+ }
+ return std::make_unique<SimpleTensor>(_type, std::move(cells));
+ }
+};
+
+/**
+ * Helper class used to analyze the combination of types for binary
+ * operations performed on SimpleTensors. The type of each tensor is
+ * used as input. The constructor will calculate the result type of
+ * the operation as well as which dimensions from each tensor is
+ * overlapping with the other tensor and also how to build the final
+ * address by indicating which labels to select from the concatenation
+ * of the input addresses.
+ **/
+struct TypeAnalyzer {
+ using DimensionList = std::vector<ValueType::Dimension>;
+ ValueType result_type;
+ IndexList overlap_a;
+ IndexList overlap_b;
+ IndexList selector;
+ TypeAnalyzer(const ValueType &lhs, const ValueType &rhs)
+ : result_type(ValueType::any_type()), overlap_a(), overlap_b(), selector()
+ {
+ DimensionList union_dims;
+ const auto &a = lhs.dimensions();
+ const auto &b = rhs.dimensions();
+ size_t b_idx = 0;
+ for (size_t a_idx = 0; a_idx < a.size(); ++a_idx) {
+ while ((b_idx < b.size()) && (b[b_idx].name < a[a_idx].name)) {
+ selector.push_back(a.size() + b_idx);
+ union_dims.push_back(b[b_idx++]);
+ }
+ if ((b_idx < b.size()) && (b[b_idx].name == a[a_idx].name)) {
+ assert(a[a_idx].is_mapped() == b[b_idx].is_mapped());
+ overlap_a.push_back(a_idx);
+ overlap_b.push_back(b_idx);
+ if (b[b_idx].size < a[a_idx].size) {
+ selector.push_back(a.size() + b_idx);
+ union_dims.push_back(b[b_idx]);
+ } else {
+ selector.push_back(a_idx);
+ union_dims.push_back(a[a_idx]);
+ }
+ ++b_idx;
+ } else {
+ selector.push_back(a_idx);
+ union_dims.push_back(a[a_idx]);
+ }
+ }
+ while (b_idx < b.size()) {
+ selector.push_back(a.size() + b_idx);
+ union_dims.push_back(b[b_idx++]);
+ }
+ if (union_dims.empty()) {
+ result_type = ValueType::double_type();
+ } else {
+ result_type = ValueType::tensor_type(union_dims);
+ }
+ assert(selector.size() == result_type.dimensions().size());
+ assert(overlap_a.size() == overlap_b.size());
+ assert_type(result_type);
+ }
+};
+
+/**
+ * A view is a total ordering of cells from a SimpleTensor according
+ * to a subset of the dimensions in the tensor type.
+ **/
+class View {
+public:
+ /**
+ * A range of cells within a view with equal values for all labels
+ * corresponding to the dimensions of the view.
+ **/
+ class EqualRange {
+ private:
+ const CellRef *_begin;
+ const CellRef *_end;
+ public:
+ EqualRange(const CellRef *begin_in, const CellRef *end_in)
+ : _begin(begin_in), _end(end_in) {}
+ const CellRef *begin() const { return _begin; };
+ const CellRef *end() const { return _end; }
+ bool empty() const { return (_begin == _end); }
+ };
+private:
+ /**
+ * Address comparator only looking at a subset of the labels.
+ **/
+ struct Less {
+ IndexList selector;
+ explicit Less(const IndexList &selector_in) : selector(selector_in) {}
+ bool operator()(const CellRef &a, const CellRef &b) const {
+ for (size_t idx: selector) {
+ if (a.get().address[idx] != b.get().address[idx]) {
+ return (a.get().address[idx] < b.get().address[idx]);
+ }
+ }
+ return false;
+ }
+ };
+ Less _less;
+ std::vector<CellRef> _refs;
+
+ EqualRange make_range(const CellRef *begin) const {
+ const CellRef *end = (begin < refs_end()) ? (begin + 1) : begin;
+ while ((end < refs_end()) && !_less(*(end - 1), *end)) {
+ ++end;
+ }
+ return EqualRange(begin, end);
+ }
+
+public:
+ View(const SimpleTensor &tensor, const IndexList &selector_in)
+ : _less(selector_in), _refs()
+ {
+ _refs.reserve(tensor.cells().size());
+ for (const auto &cell: tensor.cells()) {
+ _refs.emplace_back(cell);
+ }
+ std::sort(_refs.begin(), _refs.end(), _less);
+ }
+ const IndexList &selector() const { return _less.selector; }
+ const CellRef *refs_begin() const { return &_refs[0]; }
+ const CellRef *refs_end() const { return (refs_begin() + _refs.size()); }
+ EqualRange first_range() const { return make_range(refs_begin()); }
+ EqualRange next_range(const EqualRange &prev) const { return make_range(prev.end()); }
+};
+
+/**
+ * Helper class used to find matching EqualRanges from two different
+ * SimpleTensor Views.
+ **/
+class ViewMatcher {
+public:
+ /**
+ * Comparator used to cross-compare addresses across two different
+ * views only looking at the overlapping dimensions between the
+ * views.
+ **/
+ struct CrossCompare {
+ enum class Result { LESS, EQUAL, GREATER };
+ IndexList a_selector;
+ IndexList b_selector;
+ CrossCompare(const IndexList &a_selector_in, const IndexList &b_selector_in)
+ : a_selector(a_selector_in), b_selector(b_selector_in)
+ {
+ assert(a_selector.size() == b_selector.size());
+ }
+ Result compare(const Cell &a, const Cell &b) const {
+ for (size_t i = 0; i < a_selector.size(); ++i) {
+ if (a.address[a_selector[i]] != b.address[b_selector[i]]) {
+ if (a.address[a_selector[i]] < b.address[b_selector[i]]) {
+ return Result::LESS;
+ } else {
+ return Result::GREATER;
+ }
+ }
+ }
+ return Result::EQUAL;
+ }
+ };
+ using EqualRange = View::EqualRange;
+
+private:
+ const View &_a;
+ const View &_b;
+ EqualRange _a_range;
+ EqualRange _b_range;
+ CrossCompare _cmp;
+
+ bool has_a() const { return !_a_range.empty(); }
+ bool has_b() const { return !_b_range.empty(); }
+ void next_a() { _a_range = _a.next_range(_a_range); }
+ void next_b() { _b_range = _b.next_range(_b_range); }
+
+ void find_match() {
+ while (valid()) {
+ switch (_cmp.compare(*get_a().begin(), *get_b().begin())) {
+ case CrossCompare::Result::LESS:
+ next_a();
+ break;
+ case CrossCompare::Result::GREATER:
+ next_b();
+ break;
+ case CrossCompare::Result::EQUAL:
+ return;
+ }
+ }
+ }
+
+public:
+ ViewMatcher(const View &a, const View &b)
+ : _a(a), _b(b), _a_range(_a.first_range()), _b_range(b.first_range()),
+ _cmp(a.selector(), b.selector())
+ {
+ find_match();
+ }
+ bool valid() const { return (has_a() && has_b()); }
+ const EqualRange &get_a() const { return _a_range; }
+ const EqualRange &get_b() const { return _b_range; }
+ void next() {
+ next_a();
+ next_b();
+ find_match();
+ }
+};
+
+} // namespace vespalib::eval::<unnamed>
+
+constexpr size_t TensorSpec::Label::npos;
+constexpr size_t SimpleTensor::Label::npos;
+
+SimpleTensor::SimpleTensor(const ValueType &type_in, Cells &&cells_in)
+ : Tensor(SimpleTensorEngine::ref()),
+ _type(type_in),
+ _cells(std::move(cells_in))
+{
+ assert_type(_type);
+ for (const auto &cell: _cells) {
+ assert_address(cell.address, _type);
+ }
+}
+
+std::unique_ptr<SimpleTensor>
+SimpleTensor::reduce(const BinaryOperation &op, const std::vector<vespalib::string> &dimensions) const
+{
+ ValueType result_type = _type.remove_dimensions(dimensions);
+ Builder builder(result_type);
+ IndexList selector = TypeAnalyzer(_type, result_type).overlap_a;
+ View view(*this, selector);
+ for (View::EqualRange range = view.first_range(); !range.empty(); range = view.next_range(range)) {
+ auto pos = range.begin();
+ double value = (pos++)->get().value;
+ for (; pos != range.end(); ++pos) {
+ value = op.eval(value, pos->get().value);
+ }
+ builder.set(select(range.begin()->get().address, selector), value);
+ }
+ return builder.build();
+}
+
+std::unique_ptr<SimpleTensor>
+SimpleTensor::create(const TensorSpec &spec)
+{
+ Builder builder(ValueType::from_spec(spec.type()));
+ for (const auto &cell: spec.cells()) {
+ builder.set(cell.first, cell.second);
+ }
+ return builder.build();
+}
+
+bool
+SimpleTensor::equal(const SimpleTensor &a, const SimpleTensor &b)
+{
+ if (a.type() != b.type()) {
+ return false;
+ }
+ TypeAnalyzer type_info(a.type(), b.type());
+ View view_a(a, type_info.overlap_a);
+ View view_b(b, type_info.overlap_b);
+ const CellRef *pos_a = view_a.refs_begin();
+ const CellRef *end_a = view_a.refs_end();
+ const CellRef *pos_b = view_b.refs_begin();
+ const CellRef *end_b = view_b.refs_end();
+ ViewMatcher::CrossCompare cmp(view_a.selector(), view_b.selector());
+ while ((pos_a != end_a) && (pos_b != end_b)) {
+ if (cmp.compare(pos_a->get(), pos_b->get()) != ViewMatcher::CrossCompare::Result::EQUAL) {
+ return false;
+ }
+ if (pos_a->get().value != pos_b->get().value) {
+ return false;
+ }
+ ++pos_a;
+ ++pos_b;
+ }
+ return ((pos_a == end_a) && (pos_b == end_b));
+}
+
+std::unique_ptr<SimpleTensor>
+SimpleTensor::perform(const UnaryOperation &op, const SimpleTensor &a)
+{
+ Cells cells(a.cells());
+ for (auto &cell: cells) {
+ cell.value = op.eval(cell.value);
+ }
+ return std::make_unique<SimpleTensor>(a.type(), std::move(cells));
+}
+
+std::unique_ptr<SimpleTensor>
+SimpleTensor::perform(const BinaryOperation &op, const SimpleTensor &a, const SimpleTensor &b)
+{
+ TypeAnalyzer type_info(a.type(), b.type());
+ Builder builder(type_info.result_type);
+ View view_a(a, type_info.overlap_a);
+ View view_b(b, type_info.overlap_b);
+ for (ViewMatcher matcher(view_a, view_b); matcher.valid(); matcher.next()) {
+ for (const auto &ref_a: matcher.get_a()) {
+ for (const auto &ref_b: matcher.get_b()) {
+ builder.set(select(ref_a.get().address, ref_b.get().address, type_info.selector),
+ op.eval(ref_a.get().value, ref_b.get().value));
+ }
+ }
+ }
+ return builder.build();
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/simple_tensor.h b/vespalib/src/vespa/vespalib/eval/simple_tensor.h
new file mode 100644
index 00000000000..f2471b0cd04
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/simple_tensor.h
@@ -0,0 +1,84 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/stash.h>
+#include <memory>
+#include <map>
+#include "value_type.h"
+#include "tensor.h"
+#include "tensor_spec.h"
+
+namespace vespalib {
+namespace eval {
+
+struct UnaryOperation;
+struct BinaryOperation;
+
+/**
+ * A tensor supporting a mix of indexed and mapped dimensions. The
+ * goal for this class is to be a simple, complete and correct
+ * reference implementation supporting all relevant tensor operations.
+ **/
+class SimpleTensor : public Tensor
+{
+public:
+ /**
+ * A label for a single dimension. This is either a string
+ * (mapped) or an integer (indexed). A sequence of Labels form an
+ * Address. The labels must have the same order as the dimensions
+ * in the tensor type (which are sorted on dimension name). Labels
+ * for mapped dimensions must be strings and labels for indexed
+ * dimensions must be integers smaller than the dimension size.
+ **/
+ struct Label {
+ size_t index;
+ vespalib::string name;
+ static constexpr size_t npos = -1;
+ Label(const TensorSpec::Label &label)
+ : index(label.index), name(label.name) {}
+ bool operator<(const Label &rhs) const {
+ if (index != rhs.index) {
+ return (index < rhs.index);
+ }
+ return (name < rhs.name);
+ }
+ bool operator==(const Label &rhs) const {
+ return ((index == rhs.index) && (name == rhs.name));
+ }
+ bool operator!=(const Label &rhs) const { return !(*this == rhs); }
+ bool is_mapped() const { return (index == npos); }
+ bool is_indexed() const { return (index != npos); }
+ };
+ using Address = std::vector<Label>;
+
+ /**
+ * A tensor has a type and contains a collection of Cells. Each
+ * cell has an Address and a value.
+ **/
+ struct Cell {
+ Address address;
+ double value;
+ Cell(const Address &address_in, double value_in)
+ : address(address_in), value(value_in) {}
+ };
+ using Cells = std::vector<Cell>;
+
+private:
+ ValueType _type;
+ Cells _cells;
+
+public:
+ SimpleTensor(const ValueType &type_in, Cells &&cells_in);
+ const ValueType &type() const { return _type; }
+ const Cells &cells() const { return _cells; }
+ std::unique_ptr<SimpleTensor> reduce(const BinaryOperation &op, const std::vector<vespalib::string> &dimensions) const;
+ static std::unique_ptr<SimpleTensor> create(const TensorSpec &spec);
+ static bool equal(const SimpleTensor &a, const SimpleTensor &b);
+ static std::unique_ptr<SimpleTensor> perform(const UnaryOperation &op, const SimpleTensor &a);
+ static std::unique_ptr<SimpleTensor> perform(const BinaryOperation &op, const SimpleTensor &a, const SimpleTensor &b);
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/simple_tensor_engine.cpp b/vespalib/src/vespa/vespalib/eval/simple_tensor_engine.cpp
new file mode 100644
index 00000000000..c948bcf6b1e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/simple_tensor_engine.cpp
@@ -0,0 +1,95 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "simple_tensor_engine.h"
+#include "simple_tensor.h"
+#include "operation.h"
+
+namespace vespalib {
+namespace eval {
+
+namespace {
+
+std::vector<vespalib::string> dimension_names(const ValueType &type) {
+ std::vector<vespalib::string> result;
+ for (const auto &dimension: type.dimensions()) {
+ result.push_back(dimension.name);
+ }
+ return result;
+}
+
+} // namespace vespalib::eval::<unnamed>
+
+const SimpleTensorEngine SimpleTensorEngine::_engine;
+
+ValueType
+SimpleTensorEngine::type_of(const Tensor &tensor) const
+{
+ assert(&tensor.engine() == this);
+ const SimpleTensor &simple_tensor = static_cast<const SimpleTensor&>(tensor);
+ return simple_tensor.type();
+}
+
+std::unique_ptr<eval::Tensor>
+SimpleTensorEngine::create(const TensorSpec &spec) const
+{
+ return SimpleTensor::create(spec);
+}
+
+bool
+SimpleTensorEngine::equal(const Tensor &a, const Tensor &b) const
+{
+ assert(&a.engine() == this);
+ assert(&b.engine() == this);
+ const SimpleTensor &simple_a = static_cast<const SimpleTensor&>(a);
+ const SimpleTensor &simple_b = static_cast<const SimpleTensor&>(b);
+ return SimpleTensor::equal(simple_a, simple_b);
+}
+
+const Value &
+SimpleTensorEngine::reduce(const eval::Tensor &tensor, const BinaryOperation &op, Stash &stash) const
+{
+ assert(&tensor.engine() == this);
+ const SimpleTensor &simple_tensor = static_cast<const SimpleTensor&>(tensor);
+ std::vector<vespalib::string> dimensions = dimension_names(simple_tensor.type());
+ auto result = simple_tensor.reduce(op, dimensions);
+ assert(result->type().is_double());
+ assert(result->cells().size() == 1u);
+ return stash.create<DoubleValue>(result->cells()[0].value);
+}
+
+const Value &
+SimpleTensorEngine::reduce(const eval::Tensor &tensor, const BinaryOperation &op, const std::vector<vespalib::string> &dimensions, Stash &stash) const
+{
+ assert(&tensor.engine() == this);
+ const SimpleTensor &simple_tensor = static_cast<const SimpleTensor&>(tensor);
+ auto result = simple_tensor.reduce(op, dimensions);
+ if (result->type().is_double()) {
+ assert(result->cells().size() == 1u);
+ return stash.create<DoubleValue>(result->cells()[0].value);
+ }
+ return stash.create<TensorValue>(std::move(result));
+}
+
+const Value &
+SimpleTensorEngine::perform(const UnaryOperation &op, const eval::Tensor &a, Stash &stash) const
+{
+ assert(&a.engine() == this);
+ const SimpleTensor &simple_a = static_cast<const SimpleTensor&>(a);
+ auto result = SimpleTensor::perform(op, simple_a);
+ return stash.create<TensorValue>(std::move(result));
+}
+
+const Value &
+SimpleTensorEngine::perform(const BinaryOperation &op, const eval::Tensor &a, const eval::Tensor &b, Stash &stash) const
+{
+ assert(&a.engine() == this);
+ assert(&b.engine() == this);
+ const SimpleTensor &simple_a = static_cast<const SimpleTensor&>(a);
+ const SimpleTensor &simple_b = static_cast<const SimpleTensor&>(b);
+ auto result = SimpleTensor::perform(op, simple_a, simple_b);
+ return stash.create<TensorValue>(std::move(result));
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/simple_tensor_engine.h b/vespalib/src/vespa/vespalib/eval/simple_tensor_engine.h
new file mode 100644
index 00000000000..03307e48833
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/simple_tensor_engine.h
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "tensor_engine.h"
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * This is a TensorEngine implementation for the SimpleTensor
+ * reference implementation.
+ **/
+class SimpleTensorEngine : public TensorEngine
+{
+private:
+ SimpleTensorEngine() {}
+ static const SimpleTensorEngine _engine;
+public:
+ static const TensorEngine &ref() { return _engine; };
+ ValueType type_of(const Tensor &tensor) const override;
+ std::unique_ptr<Tensor> create(const TensorSpec &spec) const override;
+ bool equal(const Tensor &a, const Tensor &b) const override;
+ const Value &reduce(const Tensor &tensor, const BinaryOperation &op, Stash &stash) const override;
+ const Value &reduce(const Tensor &tensor, const BinaryOperation &op, const std::vector<vespalib::string> &dimensions, Stash &stash) const override;
+ const Value &perform(const UnaryOperation &op, const Tensor &a, Stash &stash) const override;
+ const Value &perform(const BinaryOperation &op, const Tensor &a, const Tensor &b, Stash &stash) const override;
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/tensor.h b/vespalib/src/vespa/vespalib/eval/tensor.h
new file mode 100644
index 00000000000..4798385ee6f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/tensor.h
@@ -0,0 +1,38 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value_type.h"
+
+namespace vespalib {
+namespace eval {
+
+class TensorEngine;
+
+/**
+ * Base class for all tensors. Tensor operations are defined by the
+ * TensorEngine interface. The Tensor class itself is used as a tagged
+ * transport mechanism. Each Tensor is connected to a distinct engine
+ * which can be used to operate on it. When operating on multiple
+ * tensors at the same time they all need to be connected to the same
+ * engine. TensorEngines should only have a single static instance per
+ * implementation.
+ **/
+class Tensor
+{
+private:
+ const TensorEngine &_engine;
+protected:
+ explicit Tensor(const TensorEngine &engine_in)
+ : _engine(engine_in) {}
+public:
+ Tensor(const Tensor &) = delete;
+ Tensor(Tensor &&) = delete;
+ Tensor &operator=(const Tensor &) = delete;
+ Tensor &operator=(Tensor &&) = delete;
+ const TensorEngine &engine() const { return _engine; }
+ virtual ~Tensor() {}
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/tensor_engine.cpp b/vespalib/src/vespa/vespalib/eval/tensor_engine.cpp
new file mode 100644
index 00000000000..6ca06e68618
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/tensor_engine.cpp
@@ -0,0 +1,10 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_engine.h"
+
+namespace vespalib {
+namespace eval {
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/tensor_engine.h b/vespalib/src/vespa/vespalib/eval/tensor_engine.h
new file mode 100644
index 00000000000..abc2e89f468
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/tensor_engine.h
@@ -0,0 +1,51 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <memory>
+#include <vector>
+#include <vespa/vespalib/stllike/string.h>
+#include "value_type.h"
+
+namespace vespalib {
+
+class Stash;
+
+namespace eval {
+
+class Value;
+class Tensor;
+class TensorSpec;
+struct UnaryOperation;
+struct BinaryOperation;
+
+/**
+ * Top-level API for a tensor implementation. All Tensor operations
+ * are defined by the TensorEngine interface. The Tensor class itself
+ * is used as a tagged transport mechanism. Each Tensor is connected
+ * to a distinct engine which can be used to operate on it. When
+ * operating on multiple tensors at the same time they all need to be
+ * connected to the same engine. TensorEngines should only have a
+ * single static instance per implementation.
+ **/
+struct TensorEngine
+{
+ using ValueType = eval::ValueType;
+ using Tensor = eval::Tensor;
+ using TensorSpec = eval::TensorSpec;
+ using Value = eval::Value;
+ using BinaryOperation = eval::BinaryOperation;
+ using UnaryOperation = eval::UnaryOperation;
+
+ virtual ValueType type_of(const Tensor &tensor) const = 0;
+ virtual std::unique_ptr<Tensor> create(const TensorSpec &spec) const = 0;
+ virtual bool equal(const Tensor &a, const Tensor &b) const = 0;
+ virtual const Value &reduce(const Tensor &tensor, const BinaryOperation &op, Stash &stash) const = 0;
+ virtual const Value &reduce(const Tensor &tensor, const BinaryOperation &op, const std::vector<vespalib::string> &dimensions, Stash &stash) const = 0;
+ virtual const Value &perform(const UnaryOperation &op, const Tensor &a, Stash &stash) const = 0;
+ virtual const Value &perform(const BinaryOperation &op, const Tensor &a, const Tensor &b, Stash &stash) const = 0;
+ virtual ~TensorEngine() {}
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/tensor_nodes.cpp b/vespalib/src/vespa/vespalib/eval/tensor_nodes.cpp
new file mode 100644
index 00000000000..a46170cfdf0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/tensor_nodes.cpp
@@ -0,0 +1,17 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_nodes.h"
+#include "node_visitor.h"
+
+namespace vespalib {
+namespace eval {
+namespace nodes {
+
+void Tensor ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void TensorSum ::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+void TensorMatch::accept(NodeVisitor &visitor) const { visitor.visit(*this); }
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/tensor_nodes.h b/vespalib/src/vespa/vespalib/eval/tensor_nodes.h
new file mode 100644
index 00000000000..2c0fc7004b9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/tensor_nodes.h
@@ -0,0 +1,103 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "basic_nodes.h"
+#include <vespa/vespalib/stllike/string.h>
+#include <map>
+
+namespace vespalib {
+namespace eval {
+namespace nodes {
+
+class Tensor : public Leaf {
+private:
+ typedef std::map<vespalib::string, vespalib::string> Address;
+ std::map<Address,double> _cells;
+public:
+ Tensor() : _cells() {}
+ void add(const Address &address, double value) {
+ _cells[address] = value;
+ }
+ const std::map<Address,double> &cells() const { return _cells; }
+ virtual vespalib::string dump(DumpContext &) const {
+ vespalib::string str;
+ str += "{";
+ CommaTracker cell_list;
+ for (const auto &cell: _cells) {
+ cell_list.maybe_comma(str);
+ str += "{";
+ CommaTracker dimension_list;
+ for (const auto &dimension: cell.first) {
+ dimension_list.maybe_comma(str);
+ str += make_string("%s:%s", dimension.first.c_str(), dimension.second.c_str());
+ }
+ str += make_string("}:%g", cell.second);
+ }
+ str += "}";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const override;
+};
+
+class TensorSum : public Node {
+private:
+ Node_UP _child;
+ vespalib::string _dimension;
+public:
+ TensorSum(Node_UP child) : _child(std::move(child)), _dimension() {}
+ TensorSum(Node_UP child, const vespalib::string &dimension_in)
+ : _child(std::move(child)), _dimension(dimension_in) {}
+ const vespalib::string &dimension() const { return _dimension; }
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "sum(";
+ str += _child->dump(ctx);
+ if (!_dimension.empty()) {
+ str += ",";
+ str += _dimension;
+ }
+ str += ")";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const;
+ virtual size_t num_children() const { return 1; }
+ virtual const Node &get_child(size_t idx) const {
+ assert(idx == 0);
+ return *_child;
+ }
+ virtual void detach_children(NodeHandler &handler) {
+ handler.handle(std::move(_child));
+ }
+};
+
+class TensorMatch : public Node {
+private:
+ Node_UP _lhs;
+ Node_UP _rhs;
+public:
+ TensorMatch(Node_UP lhs, Node_UP rhs) : _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
+ virtual vespalib::string dump(DumpContext &ctx) const {
+ vespalib::string str;
+ str += "match(";
+ str += _lhs->dump(ctx);
+ str += ",";
+ str += _rhs->dump(ctx);
+ str += ")";
+ return str;
+ }
+ virtual void accept(NodeVisitor &visitor) const;
+ virtual size_t num_children() const { return 2; }
+ virtual const Node &get_child(size_t idx) const {
+ assert(idx < 2);
+ return ((idx == 0) ? *_lhs : *_rhs);
+ }
+ virtual void detach_children(NodeHandler &handler) {
+ handler.handle(std::move(_lhs));
+ handler.handle(std::move(_rhs));
+ }
+};
+
+} // namespace vespalib::eval::nodes
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/tensor_spec.cpp b/vespalib/src/vespa/vespalib/eval/tensor_spec.cpp
new file mode 100644
index 00000000000..28cda1b2962
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/tensor_spec.cpp
@@ -0,0 +1,10 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_spec.h"
+
+namespace vespalib {
+namespace eval {
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/tensor_spec.h b/vespalib/src/vespa/vespalib/eval/tensor_spec.h
new file mode 100644
index 00000000000..0c86a4042f6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/tensor_spec.h
@@ -0,0 +1,45 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <memory>
+#include <map>
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * An implementation-independent specification of the type and
+ * contents of a tensor.
+ **/
+class TensorSpec
+{
+public:
+ struct Label {
+ size_t index;
+ vespalib::string name;
+ static constexpr size_t npos = -1;
+ Label(size_t index_in) : index(index_in), name() {}
+ Label(const vespalib::string &name_in) : index(npos), name(name_in) {}
+ Label(const char *name_in) : index(npos), name(name_in) {}
+ bool is_mapped() const { return (index == npos); }
+ bool is_indexed() const { return (index != npos); }
+ };
+ using Address = std::map<vespalib::string,Label>;
+ using Cell = std::pair<Address,double>;
+private:
+ vespalib::string _type;
+ std::vector<Cell> _cells;
+public:
+ TensorSpec(const vespalib::string &type_spec) : _type(type_spec), _cells() {}
+ TensorSpec &add(const Address &address, double value) {
+ _cells.emplace_back(address, value);
+ return *this;
+ }
+ const vespalib::string &type() const { return _type; }
+ const std::vector<Cell> &cells() const { return _cells; }
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/value.cpp b/vespalib/src/vespa/vespalib/eval/value.cpp
new file mode 100644
index 00000000000..b228c642eae
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/value.cpp
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "value.h"
+#include "operation_visitor.h"
+#include "tensor_engine.h"
+
+namespace vespalib {
+namespace eval {
+
+const Value &
+Value::apply(const UnaryOperation &, Stash &stash) const
+{
+ return stash.create<ErrorValue>();
+}
+
+const Value &
+Value::apply(const BinaryOperation &, const Value &, Stash &stash) const
+{
+ return stash.create<ErrorValue>();
+}
+
+bool
+TensorValue::equal(const Value &rhs) const
+{
+ return (rhs.is_tensor() && _value->engine().equal(*_value, *rhs.as_tensor()));
+}
+
+const Value &
+TensorValue::apply(const UnaryOperation &op, Stash &stash) const
+{
+ return _value->engine().perform(op, *_value, stash);
+}
+
+const Value &
+TensorValue::apply(const BinaryOperation &op, const Value &rhs, Stash &stash) const
+{
+ const Tensor *other = rhs.as_tensor();
+ if ((other == nullptr) || (&other->engine() != &_value->engine())) {
+ return stash.create<ErrorValue>();
+ }
+ return _value->engine().perform(op, *_value, *other, stash);
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/value.h b/vespalib/src/vespa/vespalib/eval/value.h
new file mode 100644
index 00000000000..22e90b9327f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/value.h
@@ -0,0 +1,75 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <memory>
+#include <vespa/vespalib/util/stash.h>
+#include "tensor.h"
+
+namespace vespalib {
+namespace eval {
+
+class Tensor;
+
+constexpr double error_value = 31212.0;
+
+struct UnaryOperation;
+struct BinaryOperation;
+
+/**
+ * An abstract Value. Calculation using abstract values should be done
+ * using the perform function on the appropriate Operation.
+ **/
+struct Value {
+ typedef std::unique_ptr<Value> UP;
+ typedef std::reference_wrapper<const Value> CREF;
+ virtual bool is_error() const { return false; }
+ virtual bool is_double() const { return false; }
+ virtual bool is_tensor() const { return false; }
+ virtual double as_double() const { return 0.0; }
+ virtual bool as_bool() const { return false; }
+ virtual const Tensor *as_tensor() const { return nullptr; }
+ virtual bool equal(const Value &rhs) const = 0;
+ virtual const Value &apply(const UnaryOperation &op, Stash &stash) const;
+ virtual const Value &apply(const BinaryOperation &op, const Value &rhs, Stash &stash) const;
+ virtual ~Value() {}
+};
+
+struct ErrorValue : public Value {
+ virtual bool is_error() const override { return true; }
+ virtual double as_double() const { return error_value; }
+ virtual bool equal(const Value &) const override { return false; }
+};
+
+class DoubleValue : public Value
+{
+private:
+ double _value;
+public:
+ DoubleValue(double value) : _value(value) {}
+ bool is_double() const override { return true; }
+ double as_double() const override { return _value; }
+ bool as_bool() const override { return (_value != 0.0); }
+ bool equal(const Value &rhs) const override {
+ return (rhs.is_double() && (_value == rhs.as_double()));
+ }
+};
+
+class TensorValue : public Value
+{
+private:
+ std::unique_ptr<Tensor> _value;
+public:
+ TensorValue(std::unique_ptr<Tensor> value) : _value(std::move(value)) {}
+ bool is_tensor() const override { return true; }
+ const Tensor *as_tensor() const override { return _value.get(); }
+ bool equal(const Value &rhs) const override;
+ const Value &apply(const UnaryOperation &op, Stash &stash) const override;
+ const Value &apply(const BinaryOperation &op, const Value &rhs, Stash &stash) const override;
+};
+
+} // namespace vespalib::eval
+} // namespace vespalib
+
+VESPA_CAN_SKIP_DESTRUCTION(::vespalib::eval::DoubleValue);
diff --git a/vespalib/src/vespa/vespalib/eval/value_type.cpp b/vespalib/src/vespa/vespalib/eval/value_type.cpp
new file mode 100644
index 00000000000..e0c0d7f6fe1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/value_type.cpp
@@ -0,0 +1,171 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "value_type.h"
+#include "value_type_spec.h"
+
+namespace vespalib {
+namespace eval {
+
+namespace {
+
+using Dimension = ValueType::Dimension;
+using DimensionList = std::vector<Dimension>;
+
+void sort_dimensions(DimensionList &dimensions) {
+ std::sort(dimensions.begin(), dimensions.end(),
+ [](const auto &a, const auto &b){ return (a.name < b.name); });
+}
+
+bool has_duplicates(const DimensionList &dimensions) {
+ for (size_t i = 1; i < dimensions.size(); ++i) {
+ if (dimensions[i - 1].name == dimensions[i].name) {
+ return true;
+ }
+ }
+ return false;
+}
+
+struct DimensionResult {
+ bool mismatch;
+ DimensionList dimensions;
+ DimensionResult() : mismatch(false), dimensions() {}
+ void add(const Dimension &a) {
+ dimensions.push_back(a);
+ }
+ void unify(const Dimension &a, const Dimension &b) {
+ if (a.is_mapped() == b.is_mapped()) {
+ add(Dimension(a.name, std::min(a.size, b.size)));
+ } else {
+ mismatch = true;
+ }
+ }
+};
+
+DimensionResult join(const DimensionList &lhs, const DimensionList &rhs) {
+ DimensionResult result;
+ auto pos = rhs.begin();
+ auto end = rhs.end();
+ for (const Dimension &dim: lhs) {
+ while ((pos != end) && (pos->name < dim.name)) {
+ result.add(*pos++);
+ }
+ if ((pos != end) && (pos->name == dim.name)) {
+ result.unify(dim, *pos++);
+ } else {
+ result.add(dim);
+ }
+ }
+ while (pos != end) {
+ result.add(*pos++);
+ }
+ return result;
+}
+
+DimensionResult intersect(const DimensionList &lhs, const DimensionList &rhs) {
+ DimensionResult result;
+ auto pos = rhs.begin();
+ auto end = rhs.end();
+ for (const Dimension &dim: lhs) {
+ while ((pos != end) && (pos->name < dim.name)) {
+ ++pos;
+ }
+ if ((pos != end) && (pos->name == dim.name)) {
+ result.unify(dim, *pos++);
+ }
+ }
+ return result;
+}
+
+} // namespace vespalib::tensor::<unnamed>
+
+constexpr size_t ValueType::Dimension::npos;
+
+ValueType
+ValueType::remove_dimensions(const std::vector<vespalib::string> &dimensions_in) const
+{
+ if (!maybe_tensor() || dimensions_in.empty()) {
+ return error_type();
+ }
+ if (unknown_dimensions()) {
+ return any_type();
+ }
+ size_t removed = 0;
+ std::vector<Dimension> result;
+ for (const Dimension &d: _dimensions) {
+ if (std::find(dimensions_in.begin(), dimensions_in.end(), d.name) == dimensions_in.end()) {
+ result.push_back(d);
+ } else {
+ ++removed;
+ }
+ }
+ if (removed != dimensions_in.size()) {
+ return error_type();
+ }
+ if (result.empty()) {
+ return ValueType::double_type();
+ }
+ return ValueType(_type, std::move(result));
+}
+
+ValueType
+ValueType::add_dimensions_from(const ValueType &rhs) const
+{
+ if (!maybe_tensor() || !rhs.maybe_tensor()) {
+ return error_type();
+ }
+ if (unknown_dimensions() || rhs.unknown_dimensions()) {
+ return any_type();
+ }
+ DimensionResult result = join(_dimensions, rhs._dimensions);
+ if (result.mismatch) {
+ return error_type();
+ }
+ return ValueType(_type, std::move(result.dimensions));
+}
+
+ValueType
+ValueType::keep_dimensions_in(const ValueType &rhs) const
+{
+ if (!maybe_tensor() || !rhs.maybe_tensor()) {
+ return error_type();
+ }
+ if (unknown_dimensions() || rhs.unknown_dimensions()) {
+ return any_type();
+ }
+ DimensionResult result = intersect(_dimensions, rhs._dimensions);
+ if (result.mismatch) {
+ return error_type();
+ }
+ return ValueType(_type, std::move(result.dimensions));
+}
+
+ValueType
+ValueType::tensor_type(std::vector<Dimension> dimensions_in)
+{
+ sort_dimensions(dimensions_in);
+ if (has_duplicates(dimensions_in)) {
+ return error_type();
+ }
+ return ValueType(Type::TENSOR, std::move(dimensions_in));
+}
+
+ValueType
+ValueType::from_spec(const vespalib::string &spec)
+{
+ return value_type::from_spec(spec);
+}
+
+vespalib::string
+ValueType::to_spec() const
+{
+ return value_type::to_spec(*this);
+}
+
+std::ostream &
+operator<<(std::ostream &os, const ValueType &type) {
+ return os << type.to_spec();
+}
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/value_type.h b/vespalib/src/vespa/vespalib/eval/value_type.h
new file mode 100644
index 00000000000..8e926cc3a72
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/value_type.h
@@ -0,0 +1,84 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vector>
+#include <memory>
+
+namespace vespalib {
+namespace eval {
+
+/**
+ * The type of a Value. This is used for type-resolution during
+ * compilation of interpreted functions using boxed polymorphic
+ * values.
+ **/
+class ValueType
+{
+public:
+ enum class Type { ANY, ERROR, DOUBLE, TENSOR };
+ struct Dimension {
+ static constexpr size_t npos = -1;
+ vespalib::string name;
+ size_t size;
+ Dimension(const vespalib::string &name_in)
+ : name(name_in), size(npos) {}
+ Dimension(const vespalib::string &name_in, size_t size_in)
+ : name(name_in), size(size_in) {}
+ bool operator==(const Dimension &rhs) const {
+ return ((name == rhs.name) && (size == rhs.size));
+ }
+ bool operator!=(const Dimension &rhs) const { return !(*this == rhs); }
+ bool is_mapped() const { return (size == npos); }
+ bool is_indexed() const { return (size != npos); }
+ bool is_bound() const { return ((size != npos) && (size != 0)); }
+ };
+
+private:
+ Type _type;
+ std::vector<Dimension> _dimensions;
+
+ explicit ValueType(Type type_in)
+ : _type(type_in), _dimensions() {}
+ ValueType(Type type_in, std::vector<Dimension> &&dimensions_in)
+ : _type(type_in), _dimensions(std::move(dimensions_in)) {}
+
+public:
+ Type type() const { return _type; }
+ bool is_any() const { return (_type == Type::ANY); }
+ bool is_error() const { return (_type == Type::ERROR); }
+ bool is_double() const { return (_type == Type::DOUBLE); }
+ bool is_tensor() const { return (_type == Type::TENSOR); }
+ const std::vector<Dimension> &dimensions() const { return _dimensions; }
+ bool maybe_tensor() const { return (is_any() || is_tensor()); }
+ bool unknown_dimensions() const { return (maybe_tensor() && _dimensions.empty()); }
+ bool is_abstract() const {
+ for (const auto &dimension: _dimensions) {
+ if (dimension.is_indexed() && !dimension.is_bound()) {
+ return true;
+ }
+ }
+ return (is_any() || (is_tensor() && (dimensions().empty())));
+ }
+ bool operator==(const ValueType &rhs) const {
+ return ((_type == rhs._type) && (_dimensions == rhs._dimensions));
+ }
+ bool operator!=(const ValueType &rhs) const { return !(*this == rhs); }
+
+ ValueType remove_dimensions(const std::vector<vespalib::string> &dimensions_in) const;
+ ValueType add_dimensions_from(const ValueType &rhs) const;
+ ValueType keep_dimensions_in(const ValueType &rhs) const;
+
+ static ValueType any_type() { return ValueType(Type::ANY); }
+ static ValueType error_type() { return ValueType(Type::ERROR); };
+ static ValueType double_type() { return ValueType(Type::DOUBLE); }
+ static ValueType tensor_type(std::vector<Dimension> dimensions_in);
+ static ValueType from_spec(const vespalib::string &spec);
+ vespalib::string to_spec() const;
+};
+
+std::ostream &operator<<(std::ostream &os, const ValueType &type);
+
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/value_type_spec.cpp b/vespalib/src/vespa/vespalib/eval/value_type_spec.cpp
new file mode 100644
index 00000000000..6d3aabef142
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/value_type_spec.cpp
@@ -0,0 +1,211 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "value_type.h"
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <algorithm>
+#include "value_type_spec.h"
+#include <vespa/vespalib/util/stringfmt.h>
+
+namespace vespalib {
+namespace eval {
+namespace value_type {
+
+namespace {
+
+class ParseContext
+{
+private:
+ const char *_pos;
+ const char *_end;
+ const char *&_pos_after;
+ char _curr;
+ bool _failed;
+
+public:
+ ParseContext(const char *pos, const char *end, const char *&pos_out)
+ : _pos(pos), _end(end), _pos_after(pos_out), _curr(0), _failed(false)
+ {
+ if (_pos < _end) {
+ _curr = *_pos;
+ }
+ }
+ ~ParseContext() {
+ if (!_failed) {
+ _pos_after = _pos;
+ } else {
+ _pos_after = nullptr;
+ }
+ }
+ void fail() {
+ _failed = true;
+ _curr = 0;
+ }
+ bool failed() const { return _failed; }
+ void next() { _curr = (_curr && (_pos < _end)) ? *(++_pos) : 0; }
+ char get() const { return _curr; }
+ bool eos() const { return !_curr; }
+ void eat(char c) {
+ if (_curr == c) {
+ next();
+ } else {
+ fail();
+ }
+ }
+ void skip_spaces() {
+ while (!eos() && isspace(_curr)) {
+ next();
+ }
+ }
+};
+
+bool is_ident(char c, bool first) {
+ return ((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c == '_') ||
+ (c >= '0' && c <= '9' && !first));
+}
+
+vespalib::string parse_ident(ParseContext &ctx) {
+ ctx.skip_spaces();
+ vespalib::string ident;
+ if (is_ident(ctx.get(), true)) {
+ ident.push_back(ctx.get());
+ for (ctx.next(); is_ident(ctx.get(), false); ctx.next()) {
+ ident.push_back(ctx.get());
+ }
+ }
+ ctx.skip_spaces();
+ return ident;
+}
+
+size_t parse_int(ParseContext &ctx) {
+ vespalib::string num;
+ for (; isdigit(ctx.get()); ctx.next()) {
+ num.push_back(ctx.get());
+ }
+ if (num.empty()) {
+ ctx.fail();
+ }
+ return atoi(num.c_str());
+}
+
+ValueType::Dimension parse_dimension(ParseContext &ctx) {
+ ValueType::Dimension dimension(parse_ident(ctx));
+ ctx.skip_spaces();
+ if (ctx.get() == '{') {
+ ctx.next(); // '{'
+ ctx.skip_spaces();
+ ctx.eat('}');
+ } else if (ctx.get() == '[') {
+ ctx.next(); // '['
+ ctx.skip_spaces();
+ if (ctx.get() == ']') {
+ dimension.size = 0;
+ } else {
+ dimension.size = parse_int(ctx);
+ ctx.skip_spaces();
+ }
+ ctx.eat(']');
+ } else {
+ ctx.fail();
+ }
+ return dimension;
+}
+
+std::vector<ValueType::Dimension> parse_dimension_list(ParseContext &ctx) {
+ std::vector<ValueType::Dimension> list;
+ ctx.skip_spaces();
+ if (ctx.get() == '(') {
+ ctx.eat('(');
+ ctx.skip_spaces();
+ while (!ctx.eos() && (ctx.get() != ')')) {
+ if (!list.empty()) {
+ ctx.eat(',');
+ }
+ list.push_back(parse_dimension(ctx));
+ ctx.skip_spaces();
+ }
+ ctx.eat(')');
+ }
+ ctx.skip_spaces();
+ return list;
+}
+
+} // namespace vespalib::eval::value_type::<anonymous>
+
+ValueType
+parse_spec(const char *pos_in, const char *end_in, const char *&pos_out)
+{
+ ParseContext ctx(pos_in, end_in, pos_out);
+ vespalib::string type_name = parse_ident(ctx);
+ if (type_name == "any") {
+ return ValueType::any_type();
+ } else if (type_name == "error") {
+ return ValueType::error_type();
+ } else if (type_name == "double") {
+ return ValueType::double_type();
+ } else if (type_name == "tensor") {
+ std::vector<ValueType::Dimension> list = parse_dimension_list(ctx);
+ if (!ctx.failed()) {
+ return ValueType::tensor_type(std::move(list));
+ }
+ } else {
+ ctx.fail();
+ }
+ return ValueType::error_type();
+}
+
+ValueType
+from_spec(const vespalib::string &spec)
+{
+ const char *after = nullptr;
+ const char *end = spec.data() + spec.size();
+ ValueType type = parse_spec(spec.data(), end, after);
+ if (after != end) {
+ return ValueType::error_type();
+ }
+ return type;
+}
+
+vespalib::string
+to_spec(const ValueType &type)
+{
+ asciistream os;
+ size_t cnt = 0;
+ switch (type.type()) {
+ case ValueType::Type::ANY:
+ os << "any";
+ break;
+ case ValueType::Type::ERROR:
+ os << "error";
+ break;
+ case ValueType::Type::DOUBLE:
+ os << "double";
+ break;
+ case ValueType::Type::TENSOR:
+ os << "tensor";
+ if (!type.dimensions().empty()) {
+ os << "(";
+ for (const auto &d: type.dimensions()) {
+ if (cnt++ > 0) {
+ os << ",";
+ }
+ if (d.size == ValueType::Dimension::npos) {
+ os << d.name << "{}";
+ } else if (d.size == 0) {
+ os << d.name << "[]";
+ } else {
+ os << d.name << "[" << d.size << "]";
+ }
+ }
+ os << ")";
+ }
+ break;
+ }
+ return os.str();
+}
+
+} // namespace vespalib::eval::value_type
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/value_type_spec.h b/vespalib/src/vespa/vespalib/eval/value_type_spec.h
new file mode 100644
index 00000000000..dedfeec929e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/value_type_spec.h
@@ -0,0 +1,18 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "value_type.h"
+
+namespace vespalib {
+namespace eval {
+namespace value_type {
+
+ValueType parse_spec(const char *pos_in, const char *end_in, const char *&pos_out);
+
+ValueType from_spec(const vespalib::string &str);
+vespalib::string to_spec(const ValueType &type);
+
+} // namespace vespalib::eval::value_type
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/vm_forest.cpp b/vespalib/src/vespa/vespalib/eval/vm_forest.cpp
new file mode 100644
index 00000000000..d9e9106065b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/vm_forest.cpp
@@ -0,0 +1,255 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "gbdt.h"
+#include "vm_forest.h"
+#include "basic_nodes.h"
+#include "call_nodes.h"
+#include "operator_nodes.h"
+
+namespace vespalib {
+namespace eval {
+namespace gbdt {
+
+namespace {
+
+//-----------------------------------------------------------------------------
+
+constexpr uint32_t LEAF = 0;
+constexpr uint32_t LESS = 1;
+constexpr uint32_t IN = 2;
+
+// layout:
+//
+// <feature+types>: [feature ref|my type|left child type|right child type]
+// bits: 20 4 4 4
+//
+// LEAF: [const]
+// bits: 64
+//
+// LESS: [<feature+types>][const][skip]
+// bits 32 64 32
+//
+// IN: [<feature+types>][skip|set size](set size)X[const]
+// bits 32 24 8 64
+
+const double *as_double_ptr(const uint32_t *pos) {
+ return reinterpret_cast<const double*>(pos);
+}
+
+bool find_in(double value, const double *set, const double *end) {
+ for (; set < end; ++set) {
+ if (value == *set) {
+ return true;
+ }
+ }
+ return false;
+}
+
+double less_only_find_leaf(const double *input, const uint32_t *pos, uint32_t node_type) {
+ for (;;) {
+ if (input[pos[0] >> 12] < *as_double_ptr(pos + 1)) {
+ node_type = (pos[0] & 0xf0) >> 4;
+ pos += 4;
+ } else {
+ node_type = (pos[0] & 0xf);
+ pos += 4 + pos[3];
+ }
+ if (node_type == LEAF) {
+ return *as_double_ptr(pos);
+ }
+ }
+}
+
+double general_find_leaf(const double *input, const uint32_t *pos, uint32_t node_type) {
+ for (;;) {
+ if (node_type == LESS) {
+ if (input[pos[0] >> 12] < *as_double_ptr(pos + 1)) {
+ node_type = (pos[0] & 0xf0) >> 4;
+ pos += 4;
+ } else {
+ node_type = (pos[0] & 0xf);
+ pos += 4 + pos[3];
+ }
+ if (node_type == LEAF) {
+ return *as_double_ptr(pos);
+ }
+ } else {
+ if (find_in(input[pos[0] >> 12], as_double_ptr(pos + 2),
+ as_double_ptr(pos + 2 + (2 * (pos[1] & 0xff)))))
+ {
+ node_type = (pos[0] & 0xf0) >> 4;
+ pos += 2 + (2 * (pos[1] & 0xff));
+ } else {
+ node_type = (pos[0] & 0xf);
+ pos += (2 + (2 * (pos[1] & 0xff))) + (pos[1] >> 8);
+ }
+ if (node_type == LEAF) {
+ return *as_double_ptr(pos);
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+void encode_const(double value, std::vector<uint32_t> &model_out) {
+ union {
+ double d[1];
+ uint32_t i[2];
+ } buf;
+ assert(sizeof(buf) == sizeof(double));
+ buf.d[0] = value;
+ model_out.push_back(buf.i[0]);
+ model_out.push_back(buf.i[1]);
+}
+
+uint32_t encode_node(const nodes::Node &node_in, std::vector<uint32_t> &model_out);
+
+void encode_less(const nodes::Less &less,
+ const nodes::Node &left_child, const nodes::Node &right_child,
+ std::vector<uint32_t> &model_out)
+{
+ size_t meta_idx = model_out.size();
+ auto symbol = nodes::as<nodes::Symbol>(less.lhs());
+ assert(symbol && (symbol->id() >= 0));
+ model_out.push_back(uint32_t(symbol->id()) << 12);
+ assert(less.rhs().is_const());
+ encode_const(less.rhs().get_const_value(), model_out);
+ size_t skip_idx = model_out.size();
+ model_out.push_back(0); // left child size placeholder
+ uint32_t left_type = encode_node(left_child, model_out);
+ model_out[skip_idx] = (model_out.size() - (skip_idx + 1));
+ uint32_t right_type = encode_node(right_child, model_out);
+ model_out[meta_idx] |= ((LESS << 8) | (left_type << 4) | right_type);
+}
+
+void encode_in(const nodes::In &in,
+ const nodes::Node &left_child, const nodes::Node &right_child,
+ std::vector<uint32_t> &model_out)
+{
+ size_t meta_idx = model_out.size();
+ auto symbol = nodes::as<nodes::Symbol>(in.lhs());
+ assert(symbol && (symbol->id() >= 0));
+ model_out.push_back(uint32_t(symbol->id()) << 12);
+ assert(in.rhs().is_const());
+ auto array = nodes::as<nodes::Array>(in.rhs());
+ size_t set_size_idx = model_out.size();
+ if (array) {
+ model_out.push_back(array->size());
+ for (size_t i = 0; i < array->size(); ++i) {
+ encode_const(array->get(i).get_const_value(), model_out);
+ }
+ } else {
+ model_out.push_back(1);
+ encode_const(in.rhs().get_const_value(), model_out);
+ }
+ size_t left_idx = model_out.size();
+ uint32_t left_type = encode_node(left_child, model_out);
+ model_out[set_size_idx] |= (model_out.size() - left_idx) << 8;
+ uint32_t right_type = encode_node(right_child, model_out);
+ model_out[meta_idx] |= ((IN << 8) | (left_type << 4) | right_type);
+}
+
+uint32_t encode_node(const nodes::Node &node_in, std::vector<uint32_t> &model_out) {
+ auto if_node = nodes::as<nodes::If>(node_in);
+ if (if_node) {
+ auto less = nodes::as<nodes::Less>(if_node->cond());
+ auto in = nodes::as<nodes::In>(if_node->cond());
+ if (less) {
+ encode_less(*less, if_node->true_expr(), if_node->false_expr(), model_out);
+ return LESS;
+ } else {
+ assert(in);
+ encode_in(*in, if_node->true_expr(), if_node->false_expr(), model_out);
+ return IN;
+ }
+ } else {
+ assert(node_in.is_const());
+ encode_const(node_in.get_const_value(), model_out);
+ return LEAF;
+ }
+}
+
+void encode_tree(const nodes::Node &root_in, std::vector<uint32_t> &model_out) {
+ size_t size_idx = model_out.size();
+ model_out.push_back(0); // tree size placeholder
+ encode_node(root_in, model_out);
+ model_out[size_idx] = (model_out.size() - (size_idx + 1));
+}
+
+//-----------------------------------------------------------------------------
+
+Optimize::Result optimize(const std::vector<const nodes::Node *> &trees,
+ Forest::eval_function eval)
+{
+ std::vector<uint32_t> model;
+ for (const nodes::Node *tree: trees) {
+ encode_tree(*tree, model);
+ }
+ return Optimize::Result(Forest::UP(new VMForest(std::move(model))), eval);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::eval::gbdt::<unnamed>
+
+//-----------------------------------------------------------------------------
+
+Optimize::Result
+VMForest::less_only_optimize(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees)
+{
+ if (stats.total_in_checks > 0) {
+ return Optimize::Result();
+ }
+ return optimize(trees, less_only_eval);
+}
+
+double
+VMForest::less_only_eval(const Forest *forest, const double *input)
+{
+ const VMForest &self = *((const VMForest *)forest);
+ const uint32_t *pos = &self._model[0];
+ const uint32_t *end = pos + self._model.size();
+ double sum = 0.0;
+ while (pos < end) {
+ uint32_t tree_size = *pos++;
+ sum += less_only_find_leaf(input, pos, (*pos & 0xf00) >> 8);
+ pos += tree_size;
+ }
+ return sum;
+}
+
+Optimize::Result
+VMForest::general_optimize(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees)
+{
+ if (stats.max_set_size > 255) {
+ return Optimize::Result();
+ }
+ return optimize(trees, general_eval);
+}
+
+double
+VMForest::general_eval(const Forest *forest, const double *input)
+{
+ const VMForest &self = *((const VMForest *)forest);
+ const uint32_t *pos = &self._model[0];
+ const uint32_t *end = pos + self._model.size();
+ double sum = 0.0;
+ while (pos < end) {
+ uint32_t tree_size = *pos++;
+ sum += general_find_leaf(input, pos, (*pos & 0xf00) >> 8);
+ pos += tree_size;
+ }
+ return sum;
+}
+
+Optimize::Chain VMForest::optimize_chain({less_only_optimize, general_optimize});
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::eval::gbdt
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/eval/vm_forest.h b/vespalib/src/vespa/vespalib/eval/vm_forest.h
new file mode 100644
index 00000000000..48e2bdf9cf6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/eval/vm_forest.h
@@ -0,0 +1,35 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "gbdt.h"
+
+namespace vespalib {
+namespace eval {
+namespace gbdt {
+
+/**
+ * GBDT forest optimizer using a compact tree representation combined
+ * with a leaf-node search and aggregate evaluation strategy. This
+ * code is very similar to the old VM instruction for MLR expressions.
+ **/
+class VMForest : public Forest
+{
+private:
+ std::vector<uint32_t> _model;
+
+public:
+ VMForest(std::vector<uint32_t> &&model) : _model(std::move(model)) {}
+ static Optimize::Result less_only_optimize(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees);
+ static double less_only_eval(const Forest *forest, const double *);
+ static Optimize::Result general_optimize(const ForestStats &stats,
+ const std::vector<const nodes::Node *> &trees);
+ static double general_eval(const Forest *forest, const double *);
+ static Optimize::Chain optimize_chain;
+};
+
+} // namespace vespalib::eval::gbdt
+} // namespace vespalib::eval
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/geo/.gitignore b/vespalib/src/vespa/vespalib/geo/.gitignore
new file mode 100644
index 00000000000..ee8938b6bf4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/geo/.gitignore
@@ -0,0 +1,6 @@
+*.So
+*.exe
+*.ilk
+*.pdb
+.depend*
+Makefile
diff --git a/vespalib/src/vespa/vespalib/geo/CMakeLists.txt b/vespalib/src/vespa/vespalib/geo/CMakeLists.txt
new file mode 100644
index 00000000000..10ab3d5fcc8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/geo/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_geo OBJECT
+ SOURCES
+ zcurve.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/geo/zcurve.cpp b/vespalib/src/vespa/vespalib/geo/zcurve.cpp
new file mode 100644
index 00000000000..07435f90aff
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/geo/zcurve.cpp
@@ -0,0 +1,189 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/geo/zcurve.h>
+#include <vespa/vespalib/util/priority_queue.h>
+#include <vespa/vespalib/util/fiddle.h>
+#include <vespa/log/log.h>
+LOG_SETUP(".vespalib.geo.zcurve");
+
+namespace vespalib {
+namespace geo {
+
+namespace {
+
+class ZAreaQueue
+{
+private:
+ struct MaxAreaErrorCmp {
+ bool operator()(const ZCurve::Area &a, const ZCurve::Area &b) const {
+ return (a.error() > b.error());
+ }
+ };
+ typedef ZCurve::Area Area;
+ typedef ZCurve::Range Range;
+ typedef ZCurve::RangeVector RangeVector;
+ typedef PriorityQueue<Area, MaxAreaErrorCmp, LeftArrayHeap> Queue;
+
+ Queue _queue;
+ int64_t _total_estimate;
+
+public:
+ ZAreaQueue() : _queue(), _total_estimate(0) {}
+
+ int64_t total_estimate() const { return _total_estimate; }
+
+ void put(Area area) {
+ _total_estimate += area.estimate();
+ _queue.push(std::move(area));
+ }
+
+ Area get() {
+ assert(!_queue.empty());
+ Area area(_queue.front());
+ _queue.pop_front();
+ _total_estimate -= area.estimate();
+ return area;
+ }
+
+ size_t size() const { return _queue.size(); }
+
+ RangeVector extract_ranges() {
+ RangeVector ranges;
+ ranges.reserve(_queue.size());
+ while (!_queue.empty()) {
+ const Area &area = _queue.any();
+ ranges.push_back(Range(area.min.z, area.max.z));
+ _queue.pop_any();
+ }
+ return ranges;
+ }
+};
+
+class ZAreaSplitter
+{
+private:
+ typedef ZCurve::Area Area;
+ typedef ZCurve::RangeVector RangeVector;
+
+ ZAreaQueue _queue;
+
+public:
+ ZAreaSplitter(int min_x, int min_y, int max_x, int max_y) : _queue() {
+ assert(min_x <= max_x);
+ assert(min_y <= max_y);
+ bool cross_x = (min_x < 0) != (max_x < 0);
+ bool cross_y = (min_y < 0) != (max_y < 0);
+ if (cross_x) {
+ if (cross_y) {
+ _queue.put(Area(min_x, min_y, -1, -1));
+ _queue.put(Area( 0, min_y, max_x, -1));
+ _queue.put(Area(min_x, 0, -1, max_y));
+ _queue.put(Area( 0, 0, max_x, max_y));
+ } else {
+ _queue.put(Area(min_x, min_y, -1, max_y));
+ _queue.put(Area( 0, min_y, max_x, max_y));
+ }
+ } else {
+ if (cross_y) {
+ _queue.put(Area(min_x, min_y, max_x, -1));
+ _queue.put(Area(min_x, 0, max_x, max_y));
+ } else {
+ _queue.put(Area(min_x, min_y, max_x, max_y));
+ }
+ }
+ }
+
+ size_t num_ranges() const { return _queue.size(); }
+
+ int64_t total_estimate() const { return _queue.total_estimate(); }
+
+ void split_worst() {
+ Area area = _queue.get();
+ uint32_t x_first_max, x_last_min;
+ uint32_t y_first_max, y_last_min;
+ uint32_t x_bits = bits::split_range(area.min.x, area.max.x, x_first_max, x_last_min);
+ uint32_t y_bits = bits::split_range(area.min.y, area.max.y, y_first_max, y_last_min);
+ if (x_bits > y_bits) {
+ _queue.put(Area(area.min.x, area.min.y, x_first_max, area.max.y));
+ _queue.put(Area(x_last_min, area.min.y, area.max.x, area.max.y));
+ } else {
+ assert(y_bits > 0);
+ _queue.put(Area(area.min.x, area.min.y, area.max.x, y_first_max));
+ _queue.put(Area(area.min.x, y_last_min, area.max.x, area.max.y));
+ }
+ }
+
+ RangeVector extract_ranges() { return _queue.extract_ranges(); }
+};
+
+} // namespace vespalib::geo::<unnamed>
+
+ZCurve::BoundingBox::BoundingBox(int32_t minx,
+ int32_t maxx,
+ int32_t miny,
+ int32_t maxy)
+ : _zMinx(ZCurve::encode(minx, 0)),
+ _zMaxx(ZCurve::encode(maxx, 0)),
+ _zMiny(ZCurve::encode(0, miny)),
+ _zMaxy(ZCurve::encode(0, maxy))
+{
+}
+
+ZCurve::RangeVector
+ZCurve::find_ranges(int min_x, int min_y,
+ int max_x, int max_y)
+{
+ int64_t total_size = ((max_x - min_x + 1L) * (max_y - min_y + 1L));
+ int64_t estimate_target = (total_size * 4);
+ ZAreaSplitter splitter(min_x, min_y, max_x, max_y);
+ while (splitter.total_estimate() > estimate_target && splitter.num_ranges() < 42) {
+ splitter.split_worst();
+ }
+ RangeVector ranges = splitter.extract_ranges();
+ std::sort(ranges.begin(), ranges.end());
+ LOG(debug, "split bounding box into %zu z-ranges", ranges.size());
+ return ranges;
+}
+
+int64_t
+ZCurve::encodeSlow(int32_t x, int32_t y)
+{
+ uint64_t res = 0;
+ uint32_t ibit = 1;
+ uint64_t obit = 1;
+ for (;
+ ibit != 0;
+ ibit <<= 1, obit <<= 2)
+ {
+ if (static_cast<uint32_t>(x) & ibit)
+ res |= obit;
+ if (static_cast<uint32_t>(y) & ibit)
+ res |= (obit << 1);
+ }
+ return static_cast<int64_t>(res);
+}
+
+
+void
+ZCurve::decodeSlow(int64_t enc, int32_t *xp, int32_t *yp)
+{
+ uint32_t x = 0;
+ uint32_t y = 0;
+ uint64_t ibit = 1;
+ uint32_t obit = 1;
+ for (;
+ ibit != 0;
+ ibit <<= 2, obit <<= 1)
+ {
+ if ((static_cast<uint64_t>(enc) & ibit) != 0)
+ x |= obit;
+ if ((static_cast<uint64_t>(enc) & (ibit << 1)) != 0)
+ y |= obit;
+ }
+ *xp = static_cast<int32_t>(x);
+ *yp = static_cast<int32_t>(y);
+}
+
+}
+}
diff --git a/vespalib/src/vespa/vespalib/geo/zcurve.h b/vespalib/src/vespa/vespalib/geo/zcurve.h
new file mode 100644
index 00000000000..8986cdd35ba
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/geo/zcurve.h
@@ -0,0 +1,254 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @file zcurve.h
+ * @author Tor Egge
+ *
+ * $Id$
+ */
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include <cassert>
+
+namespace vespalib {
+namespace geo {
+
+/**
+ * @brief Utility methods for a Z-curve (Morton-order) encoder and decoder.
+ */
+class ZCurve
+{
+public:
+
+ /**
+ * @brief Represents a box in the xy-space, storing the max/min x
+ * and y values as interleaved z-code.
+ */
+ class BoundingBox
+ {
+ private:
+ int64_t _zMinx; /* Min X coordinate, interleaved (Z curve) */
+ int64_t _zMaxx; /* Max X coordinate, interleaved (Z curve) */
+ int64_t _zMiny; /* Min Y coordinate, interleaved (Z curve) */
+ int64_t _zMaxy; /* Max Y coordinate, interleaved (Z curve) */
+
+ public:
+ BoundingBox(int32_t minx,
+ int32_t maxx,
+ int32_t miny,
+ int32_t maxy);
+
+ ~BoundingBox(void)
+ {
+ }
+
+ int64_t
+ getzMinx(void) const
+ {
+ return _zMinx;
+ }
+
+ int64_t
+ getzMaxx(void) const
+ {
+ return _zMaxx;
+ }
+
+ int64_t
+ getzMiny(void) const
+ {
+ return _zMiny;
+ }
+
+ int64_t
+ getzMaxy(void) const
+ {
+ return _zMaxy;
+ }
+
+ /**
+ * Returns true if the given z-encoded xy coordinate is
+ * outside this BoundingBox, false otherwise.
+ *
+ * @param docxy Z-encoded xy-value.
+ * @return true if the given coordinate is outside this box.
+ */
+ bool
+ getzFailBoundingBoxTest(int64_t docxy) const
+ {
+ int64_t doczy = docxy & UINT64_C(0xaaaaaaaaaaaaaaaa);
+ int64_t doczx = docxy & UINT64_C(0x5555555555555555);
+
+ return (doczy < getzMiny() ||
+ doczy > getzMaxy() ||
+ static_cast<int64_t>(doczx << 1) <
+ static_cast<int64_t>(getzMinx() << 1) ||
+ static_cast<int64_t>(doczx << 1) >
+ static_cast<int64_t>(getzMaxx() << 1));
+ }
+ };
+
+ /**
+ * Encode two 32 bit integers by bit-interleaving them into one 64 bit
+ * integer value. The x-direction owns the least significant bit (bit
+ * 0). Both x and y can have negative values.<p>
+ *
+ * This is a time-efficient implementation. In the first step, the input
+ * value is split in two blocks, one containing the most significant bits,
+ * and the other containing the least significant bits. The most
+ * significant block is then shifted left for as many bits it contains.
+ * For each following step every block from the previous step is split in
+ * the same manner, with a least and most significant block, and the most
+ * significant blocks are shifted left for as many bits they contain (half
+ * the number from the previous step). This continues until each block has
+ * only one bit.<p>
+ *
+ * This algorithm works by placing the LSB of all blocks in the correct
+ * position after the bit-shifting is done in each step. This algorithm
+ * is quite similar to computing the Hamming Weight (or population count)
+ * of a bit string, see http://en.wikipedia.org/wiki/Hamming_weight.<p>
+ *
+ * The encoding operations in this method should require 42 cpu operations,
+ * of which many can be executed in parallell.<p>
+ *
+ * @param x x value
+ * @param y y value
+ * @return The bit-interleaved long containing x and y.
+ */
+ static int64_t
+ encode(int32_t x, int32_t y)
+ {
+
+ uint64_t rx = (static_cast<uint64_t>(static_cast<uint32_t>(x) &
+ 0xffff0000u) << 16) |
+ (static_cast<uint32_t>(x) & 0x0000ffffu);
+ uint64_t ry = (static_cast<uint64_t>(static_cast<uint32_t>(y) &
+ 0xffff0000u) << 16) |
+ (static_cast<uint32_t>(y) & 0x0000ffffu);
+ rx = ((rx & UINT64_C(0xff00ff00ff00ff00)) << 8) |
+ (rx & UINT64_C(0x00ff00ff00ff00ff));
+ ry = ((ry & UINT64_C(0xff00ff00ff00ff00)) << 8) |
+ (ry & UINT64_C(0x00ff00ff00ff00ff));
+ rx = ((rx & UINT64_C(0xf0f0f0f0f0f0f0f0)) << 4) |
+ (rx & UINT64_C(0x0f0f0f0f0f0f0f0f));
+ ry = ((ry & UINT64_C(0xf0f0f0f0f0f0f0f0)) << 4) |
+ (ry & UINT64_C(0x0f0f0f0f0f0f0f0f));
+ rx = ((rx & UINT64_C(0xcccccccccccccccc)) << 2) |
+ (rx & UINT64_C(0x3333333333333333));
+ ry = ((ry & UINT64_C(0xcccccccccccccccc)) << 2) |
+ (ry & UINT64_C(0x3333333333333333));
+ rx = ((rx & UINT64_C(0xaaaaaaaaaaaaaaaa)) << 1) |
+ (rx & UINT64_C(0x5555555555555555));
+ ry = ((ry & UINT64_C(0xaaaaaaaaaaaaaaaa)) << 1) |
+ (ry & UINT64_C(0x5555555555555555));
+ return static_cast<int64_t>(rx | (ry << 1));
+ }
+
+ /**
+ * Decode a 64-bit z-value to 32-bit x and y values.
+ *
+ * @param enc The bit-interleaved z-value containing x and y.
+ * @param xp Return value, pointer to the decoded x value.
+ * @param yp Return value, pointer to the decoded y value.
+ */
+ static void
+ decode(int64_t enc, int32_t *xp, int32_t *yp)
+ {
+ uint64_t x = static_cast<uint64_t>(enc) & UINT64_C(0x5555555555555555);
+ uint64_t y = static_cast<uint64_t>(enc) & UINT64_C(0xaaaaaaaaaaaaaaaa);
+
+ x = ((x & UINT64_C(0xcccccccccccccccc)) >> 1) |
+ (x & UINT64_C(0x3333333333333333));
+ y = ((y & UINT64_C(0xcccccccccccccccc)) >> 1) |
+ (y & UINT64_C(0x3333333333333333));
+ x = ((x & UINT64_C(0xf0f0f0f0f0f0f0f0)) >> 2) |
+ (x & UINT64_C(0x0f0f0f0f0f0f0f0f));
+ y = ((y & UINT64_C(0xf0f0f0f0f0f0f0f0)) >> 2) |
+ (y & UINT64_C(0x0f0f0f0f0f0f0f0f));
+ x = ((x & UINT64_C(0xff00ff00ff00ff00)) >> 4) |
+ (x & UINT64_C(0x00ff00ff00ff00ff));
+ y = ((y & UINT64_C(0xff00ff00ff00ff00)) >> 4) |
+ (y & UINT64_C(0x00ff00ff00ff00ff));
+ x = ((x & UINT64_C(0xffff0000ffff0000)) >> 8) |
+ (x & UINT64_C(0x0000ffff0000ffff));
+ y = ((y & UINT64_C(0xffff0000ffff0000)) >> 8) |
+ (y & UINT64_C(0x0000ffff0000ffff));
+ x = ((x & UINT64_C(0xffffffff00000000)) >> 16) |
+ (x & UINT64_C(0x00000000ffffffff));
+ y = ((y & UINT64_C(0xffffffff00000000)) >> 16) |
+ (y & UINT64_C(0x00000000ffffffff));
+ *xp = static_cast<int32_t>(x);
+ *yp = static_cast<int32_t>(y >> 1);
+ }
+
+ /**
+ * A point in space, holding both x,y and z coordinates, where z
+ * is not z, but Z.
+ **/
+ struct Point {
+ const int32_t x;
+ const int32_t y;
+ const int64_t z;
+ Point(int32_t x_, int32_t y_) : x(x_), y(y_), z(encode(x_, y_)) {}
+ };
+
+ /**
+ * An area defined by its upper left and lower right corners. The
+ * z-coordinates between these corners act as a spacial
+ * over-estimation of the actual area. These areas may never cross
+ * signed borders, since that would break the whole concept of
+ * hierarchical spatial partitioning.
+ **/
+ struct Area {
+ const Point min;
+ const Point max;
+ Area(const Area &rhs) = default;
+ Area(int32_t min_x, int32_t min_y,
+ int32_t max_x, int32_t max_y)
+ : min(min_x, min_y), max(max_x, max_y)
+ {
+ assert((min_x <= max_x) && ((min_x < 0) == (max_x < 0)));
+ assert((min_y <= max_y) && ((min_y < 0) == (max_y < 0)));
+ }
+ Area &operator=(Area &&rhs) { new ((void*)this) Area(rhs); return *this; }
+ int64_t size() const { return (max.x - min.x + 1) * (max.y - min.y + 1); }
+ int64_t estimate() const { return (max.z - min.z + 1); }
+ int64_t error() const { return estimate() - size(); }
+ };
+
+ class Range
+ {
+ private:
+ int64_t _min;
+ int64_t _max;
+
+ public:
+ Range(int64_t min_, int64_t max_) : _min(std::min(min_, max_)), _max(std::max(min_, max_)) {}
+ int64_t min() const { return _min; }
+ int64_t max() const { return _max; }
+ void min(int64_t value) { _min = value; }
+ void max(int64_t value) { _max = value; }
+ bool operator<(const Range &rhs) const { return (_min < rhs._min); }
+ };
+ typedef std::vector<Range> RangeVector;
+
+ /**
+ * Given an inclusive bounding box, return a set of ranges in
+ * z-curve values that contain all points inside the bounding
+ * box. Note that the returned ranges may contain points that are
+ * outside the bounding box. NB: not yet even remotely optimal.
+ **/
+ static RangeVector find_ranges(int min_x, int min_y,
+ int max_x, int max_y);
+
+ static int64_t
+ encodeSlow(int32_t x, int32_t y);
+
+ static void
+ decodeSlow(int64_t enc, int32_t *xp, int32_t *yp);
+};
+
+}
+}
+
diff --git a/vespalib/src/vespa/vespalib/io/.gitignore b/vespalib/src/vespa/vespalib/io/.gitignore
new file mode 100644
index 00000000000..ee8938b6bf4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/io/.gitignore
@@ -0,0 +1,6 @@
+*.So
+*.exe
+*.ilk
+*.pdb
+.depend*
+Makefile
diff --git a/vespalib/src/vespa/vespalib/io/CMakeLists.txt b/vespalib/src/vespa/vespalib/io/CMakeLists.txt
new file mode 100644
index 00000000000..701bdd45414
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/io/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_io OBJECT
+ SOURCES
+ fileutil.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/io/fileutil.cpp b/vespalib/src/vespa/vespalib/io/fileutil.cpp
new file mode 100644
index 00000000000..d72797fe869
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/io/fileutil.cpp
@@ -0,0 +1,754 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/io/fileutil.h>
+
+#include <errno.h>
+#include <vespa/log/log.h>
+#include <iostream>
+#include <sstream>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/util/error.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+
+LOG_SETUP(".vespalib.io.fileutil");
+
+namespace vespalib {
+
+namespace {
+
+ FileInfo::UP
+ processStat(struct stat& filestats, bool result, const stringref & path) {
+ FileInfo::UP resval;
+ if (result) {
+ resval.reset(new FileInfo);
+ resval->_plainfile = S_ISREG(filestats.st_mode);
+ resval->_directory = S_ISDIR(filestats.st_mode);
+ resval->_symlink = S_ISLNK(filestats.st_mode);
+ resval->_size = filestats.st_size;
+ } else if (errno != ENOENT) {
+ asciistream ost;
+ ost << "An IO error occured while statting '" << path << "'. "
+ << "errno(" << errno << "): " << getErrorString(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ LOG(debug, "stat(%s): Existed? %s, Plain file? %s, Directory? %s, "
+ "Size: %" PRIu64,
+ path.c_str(),
+ resval.get() ? "true" : "false",
+ resval.get() && resval->_plainfile ? "true" : "false",
+ resval.get() && resval->_directory ? "true" : "false",
+ resval.get() ? resval->_size : 0);
+ return resval;
+ }
+
+string
+safeStrerror(int errnum)
+{
+ return getErrorString(errnum);
+}
+
+}
+
+bool
+FileInfo::operator==(const FileInfo& fi) const
+{
+ return (_size == fi._size && _plainfile == fi._plainfile
+ && _directory == fi._directory);
+}
+
+std::ostream&
+operator<<(std::ostream& out, const FileInfo& info)
+{
+ out << "FileInfo(size: " << info._size;
+ if (info._plainfile) out << ", plain file";
+ if (info._directory) out << ", directory";
+ out << ")";
+ return out;
+}
+
+File::File(const stringref & filename)
+ : _fd(-1),
+ _flags(0),
+ _filename(filename),
+ _close(true),
+ _fileReads(0),
+ _fileWrites(0)
+{
+}
+
+File::File(int fileDescriptor, const stringref & filename)
+ : _fd(fileDescriptor),
+ _flags(0),
+ _filename(filename),
+ _close(true),
+ _fileReads(0),
+ _fileWrites(0)
+{
+}
+
+File::~File()
+{
+ if (_close && _fd != -1) close();
+}
+
+File::File(File& f)
+ : _fd(f._fd),
+ _flags(f._flags),
+ _filename(f._filename),
+ _close(f._close),
+ _fileReads(f._fileReads),
+ _fileWrites(f._fileWrites)
+{
+ f._fd = -1;
+ f._flags = 0;
+ f._close = true;
+ f._fileReads = 0;
+ f._fileWrites = 0;
+}
+
+File&
+File::operator=(File& f)
+{
+ if (_close && _fd != -1) close();
+ _fd = f._fd;
+ _flags = f._flags;
+ _filename = f._filename;
+ _close = f._close;
+ _fileReads = f._fileReads;
+ _fileWrites = f._fileWrites;
+ f._fd = -1;
+ f._flags = 0;
+ f._close = true;
+ f._fileReads = 0;
+ f._fileWrites = 0;
+ return *this;
+}
+
+void
+File::setFilename(const stringref & filename)
+{
+ if (_filename == filename) return;
+ if (_close && _fd != -1) close();
+ _filename = filename;
+ _fd = -1;
+ _flags = 0;
+ _close = true;
+}
+
+namespace {
+ int openAndCreateDirsIfMissing(const stringref & filename, int flags,
+ bool createDirsIfMissing)
+ {
+ int fd = ::open(filename.c_str(), flags, 0644);
+ if (fd < 0 && errno == ENOENT && ((flags & O_CREAT) != 0)
+ && createDirsIfMissing)
+ {
+ string::size_type pos = filename.rfind('/');
+ if (pos != string::npos) {
+ string path(filename.substr(0, pos));
+ mkdir(path);
+ LOG(spam, "open(%s, %d): Retrying open after creating parent "
+ "directories.", filename.c_str(), flags);
+ fd = ::open(filename.c_str(), flags, 0644);
+ }
+ }
+ return fd;
+ }
+}
+
+void
+File::open(int flags, bool autoCreateDirectories) {
+ if ((flags & File::READONLY) != 0) {
+ if ((flags & File::CREATE) != 0) {
+ throw IllegalArgumentException(
+ "Cannot use READONLY and CREATE options at the same time",
+ VESPA_STRLOC);
+ }
+ if ((flags & File::TRUNC) != 0) {
+ throw IllegalArgumentException(
+ "Cannot use READONLY and TRUNC options at the same time",
+ VESPA_STRLOC);
+ }
+ if (autoCreateDirectories) {
+ throw IllegalArgumentException(
+ "No point in auto-creating directories on read only access",
+ VESPA_STRLOC);
+ }
+ }
+ int openflags = ((flags & File::READONLY) != 0 ? O_RDONLY : O_RDWR)
+ | ((flags & File::CREATE) != 0 ? O_CREAT : 0)
+ | ((flags & File::DIRECTIO) != 0 ? O_DIRECT : 0)
+ | ((flags & File::TRUNC) != 0 ? O_TRUNC: 0);
+ int fd = openAndCreateDirsIfMissing(_filename, openflags,
+ autoCreateDirectories);
+ if (fd < 0 && ((flags & File::DIRECTIO) != 0)) {
+ openflags = (openflags ^ O_DIRECT);
+ flags = (flags ^ DIRECTIO);
+ LOG(debug, "open(%s, %d): Retrying without direct IO due to failure "
+ "opening with errno(%d): %s",
+ _filename.c_str(), flags, errno, safeStrerror(errno).c_str());
+ fd = openAndCreateDirsIfMissing(_filename, openflags,
+ autoCreateDirectories);
+ }
+ if (fd < 0) {
+ asciistream ost;
+ ost << "open(" << _filename << ", 0x"
+ << hex << flags << dec << "): Failed, errno(" << errno
+ << "): " << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ _flags = flags;
+ _fd = fd;
+ LOG(debug, "open(%s, %d). File opened with file descriptor %d.",
+ _filename.c_str(), flags, fd);
+}
+
+void
+File::closeFileWhenDestructed(bool closeOnDestruct)
+{
+ _close = closeOnDestruct;
+}
+
+FileInfo
+File::stat() const
+{
+ struct ::stat filestats;
+ FileInfo::UP result;
+ if (isOpen()) {
+ result = processStat(filestats, fstat(_fd, &filestats) == 0, _filename);
+ assert(result.get()); // The file must exist in a file instance
+ } else {
+ result = processStat(filestats,
+ ::stat(_filename.c_str(), &filestats) == 0,
+ _filename);
+ // If the file does not exist yet, act like it does. It will
+ // probably be created when opened.
+ if (result.get() == 0) {
+ result.reset(new FileInfo());
+ result->_size = 0;
+ result->_directory = false;
+ result->_plainfile = true;
+ }
+ }
+ return *result;
+}
+
+void
+File::resize(off_t size)
+{
+ if (ftruncate(_fd, size) != 0) {
+ asciistream ost;
+ ost << "resize(" << _filename << ", " << size << "): Failed, errno("
+ << errno << "): " << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ LOG(debug, "resize(%s): Resized to %" PRIu64 " bytes.",
+ _filename.c_str(), size);
+}
+
+void
+File::verifyDirectIO(uint64_t buf, size_t bufsize, off_t offset) const
+{
+ if (offset % 512 != 0) {
+ LOG(error,
+ "Access to file %s failed because offset %zd wasn't 512-byte "
+ "aligned. Buffer memory address was %zx, length %zu",
+ _filename.c_str(), offset, buf, bufsize);
+ assert(false);
+ }
+ if (buf % 512 != 0) {
+ LOG(error,
+ "Access to file %s failed because buffer memory address %zx "
+ "wasn't 512-byte aligned. Offset was %zd, length %zu",
+ _filename.c_str(), buf, offset, bufsize);
+ assert(false);
+ }
+ if (bufsize % 512 != 0) {
+ LOG(error,
+ "Access to file %s failed because buffer size %zu wasn't 512-byte "
+ "aligned. Buffer memory address was %zx, offset %zd",
+ _filename.c_str(), bufsize, buf, offset);
+ assert(false);
+ }
+}
+
+off_t
+File::write(const void *buf, size_t bufsize, off_t offset)
+{
+ ++_fileWrites;
+ size_t left = bufsize;
+ LOG(debug, "write(%s): Writing %" PRIu64 " bytes at offset %" PRIu64 ".",
+ _filename.c_str(), bufsize, offset);
+
+ if (_flags & DIRECTIO) {
+ verifyDirectIO((uint64_t)buf, bufsize, offset);
+ }
+
+ while (left > 0) {
+ ssize_t written = ::pwrite(_fd, buf, left, offset);
+ if (written > 0) {
+ LOG(spam, "write(%s): Wrote %" PRIu64 " bytes at offset %" PRIu64 ".",
+ _filename.c_str(), written, offset);
+ left -= written;
+ buf = ((const char*) buf) + written;
+ offset += written;
+ } else if (written == 0) {
+ LOG(spam, "write(%s): Wrote %" PRIu64 " bytes at offset %" PRIu64 ".",
+ _filename.c_str(), written, offset);
+ assert(false); // Can this happen?
+ } else if (errno != EINTR && errno != EAGAIN) {
+ asciistream ost;
+ ost << "write(" << _fd << ", " << buf
+ << ", " << left << ", " << offset << "), Failed, errno("
+ << errno << "): " << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ }
+ return bufsize;
+}
+
+size_t
+File::read(void *buf, size_t bufsize, off_t offset) const
+{
+ ++_fileReads;
+ size_t remaining = bufsize;
+ LOG(debug, "read(%s): Reading %" PRIu64 " bytes from offset %" PRIu64 ".",
+ _filename.c_str(), bufsize, offset);
+
+ if (_flags & DIRECTIO) {
+ verifyDirectIO((uint64_t)buf, bufsize, offset);
+ }
+
+ while (remaining > 0) {
+ ssize_t bytesread = ::pread(_fd, buf, remaining, offset);
+ if (bytesread > 0) {
+ LOG(spam, "read(%s): Read %" PRIu64 " bytes from offset %" PRIu64 ".",
+ _filename.c_str(), bytesread, offset);
+ remaining -= bytesread;
+ buf = ((char*) buf) + bytesread;
+ offset += bytesread;
+ } else if (bytesread == 0) { // EOF
+ LOG(spam, "read(%s): Found EOF. Zero bytes read from offset %"
+ PRIu64 ".",
+ _filename.c_str(), offset);
+ break;
+ } else if (errno != EINTR && errno != EAGAIN) {
+ asciistream ost;
+ ost << "read(" << _fd << ", " << buf << ", " << remaining << ", "
+ << offset << "): Failed, errno(" << errno << "): "
+ << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ }
+ return bufsize - remaining;
+}
+
+vespalib::string
+File::readAll() const
+{
+ vespalib::string content;
+
+ // Limit ourselves to 4K on the stack. If this becomes a problem we should
+ // allocate on the heap.
+ char buffer[4096];
+ off_t offset = 0;
+
+ while (true) {
+ size_t numRead = read(buffer, sizeof(buffer), offset);
+ offset += numRead;
+ content.append(buffer, numRead);
+
+ if (numRead < sizeof(buffer)) {
+ // EOF
+ return content;
+ }
+ }
+}
+
+vespalib::string
+File::readAll(const vespalib::stringref & path)
+{
+ File file(path);
+ file.open(File::READONLY);
+ return file.readAll();
+}
+
+void
+File::sync()
+{
+ if (_fd != -1) {
+ if (::fsync(_fd) == 0) {
+ LOG(debug, "sync(%s): File synchronized with disk.",
+ _filename.c_str());
+ } else {
+ asciistream ost;
+ ost << "sync(" << _filename << "): Failed, errno(" << errno << "): "
+ << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ } else {
+ LOG(debug, "sync(%s): Called on closed file.",
+ _filename.c_str());
+ }
+}
+
+bool
+File::close()
+{
+ if (_fd != -1) {
+ if (::close(_fd) == 0) {
+ LOG(debug, "close(%s): Closed file with descriptor %i.",
+ _filename.c_str(), _fd);
+ _fd = -1;
+ return true;
+ } else {
+ LOG(warning, "close(%s): Failed to close file. errno(%d): %s",
+ _filename.c_str(), errno, safeStrerror(errno).c_str());
+ _fd = -1;
+ return false;
+ }
+ } else {
+ LOG(debug, "close(%s): Called on closed file.",
+ _filename.c_str());
+ }
+ return true;
+}
+
+bool
+File::unlink()
+{
+ close();
+ return vespalib::unlink(_filename);
+}
+
+string
+getCurrentDirectory()
+{
+ MallocAutoPtr ptr = getcwd(0, 0);
+ if (ptr.get() != 0) {
+ return string(static_cast<char*>(ptr.get()));
+ }
+ asciistream ost;
+ ost << "getCurrentDirectory(): Failed, errno(" << errno
+ << "): " << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+}
+
+bool
+mkdir(const stringref & directory, bool recursive)
+{
+ if (::mkdir(directory.c_str(), 0777) == 0) {
+ LOG(debug, "mkdir(%s): Created directory", directory.c_str());
+ return true;
+ }
+ if (recursive && errno == ENOENT) {
+ string::size_type slashpos = directory.rfind('/');
+ if (slashpos != string::npos) {
+ /* Recursively make superdirs.*/
+ string superdir = directory.substr(0, slashpos);
+ mkdir(superdir, recursive);
+ if (::mkdir(directory.c_str(), 0777) == 0) {
+ LOG(debug, "mkdir(%s): Created directory recursively",
+ directory.c_str());
+ return true;
+ }
+ }
+ }
+ if (errno == EEXIST) {
+ // Use stat rather than lstat since we don't really care if the path
+ // component is a symbolic link as long as it points to a directory.
+ FileInfo::UP info(vespalib::stat(directory));
+ if (info.get() != 0 && info->_directory) {
+ LOG(debug, "mkdir(%s): Directory existed", directory.c_str());
+ return false;
+ } else if (info.get() != 0) {
+ asciistream ost;
+ ost << "mkdir(" << directory << (recursive ? ", recursive" : "")
+ << "): Failed.";
+ if (info->_plainfile) {
+ ost << " A plain file already exist.";
+ } else {
+ ost << " A file of some sort already exist.";
+ }
+ throw IoException(
+ ost.str(), IoException::ILLEGAL_PATH, VESPA_STRLOC);
+ }
+ }
+ asciistream ost;
+ ost << "mkdir(" << directory << (recursive ? ", recursive" : "")
+ << "): Failed, errno(" << errno << "): " << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+}
+
+void
+symlink(const stringref & oldPath,
+ const stringref & newPath)
+{
+ if (::symlink(oldPath.c_str(), newPath.c_str())) {
+ asciistream ss;
+ const int err = errno;
+ ss << "symlink(" << oldPath << ", " << newPath
+ << "): Failed, errno(" << err << "): "
+ << safeStrerror(err);
+ throw IoException(ss.str(), IoException::getErrorType(err), VESPA_STRLOC);
+ }
+}
+
+string
+readLink(const stringref & path)
+{
+ char buf[256];
+ ssize_t bytes(::readlink(path.c_str(), buf, sizeof(buf)));
+ if (bytes < 0) {
+ asciistream ss;
+ const int err = errno;
+ ss << "readlink(" << path << "): Failed, errno(" << err << "): "
+ << safeStrerror(err);
+ throw IoException(ss.str(), IoException::getErrorType(err), VESPA_STRLOC);
+ }
+ return string(buf, bytes);
+}
+
+void
+chdir(const stringref & directory)
+{
+ if (::chdir(directory.c_str()) != 0) {
+ asciistream ost;
+ ost << "chdir(" << directory << "): Failed, errno(" << errno << "): "
+ << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ LOG(debug, "chdir(%s): Working directory changed.",
+ directory.c_str());
+}
+
+bool
+rmdir(const stringref & directory, bool recursive)
+{
+ string dirname(directory);
+ if (!dirname.empty() && *dirname.rbegin() == '/') {
+ dirname.resize(dirname.size() - 1);
+ }
+ if (dirname.empty()) {
+ LOG(debug, "rmdir(%s): Not allowing deletion of '/'.",
+ directory.c_str());
+ return false;
+ }
+ if (recursive) {
+ FastOS_DirectoryScan dir(dirname.c_str());
+ while (dir.ReadNext()) {
+ if (strcmp(dir.GetName(), "..") != 0 &&
+ strcmp(dir.GetName(), ".") != 0)
+ {
+ string fullpath(dirname + "/" + dir.GetName());
+ if (dir.IsDirectory()) {
+ rmdir(fullpath, true);
+ } else {
+ if (::unlink(fullpath.c_str()) != 0) {
+ asciistream ost;
+ ost << "rmdir(" << fullpath
+ << (recursive ? ", recursive" : "")
+ << "): Failed, errno(" << errno << "): "
+ << safeStrerror(errno);
+ throw IoException(ost.str(),
+ IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ }
+ }
+ }
+ }
+ if (::rmdir(dirname.c_str()) == 0) {
+ LOG(debug, "rmdir(%s): Directory deleted.",
+ directory.c_str());
+ return true;
+ }
+ if (errno == ENOENT) {
+ LOG(debug, "rmdir(%s): No directory to delete.",
+ directory.c_str());
+ return false;
+ }
+ asciistream ost;
+ ost << "rmdir(" << dirname << (recursive ? ", recursive" : "")
+ << "): Failed, errno(" << errno << "): " << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+}
+
+FileInfo::UP
+stat(const stringref & path)
+{
+ struct ::stat filestats;
+ return processStat(filestats, ::stat(path.c_str(), &filestats) == 0, path);
+}
+
+FileInfo::UP
+lstat(const stringref & path)
+{
+ struct ::stat filestats;
+ return processStat(filestats, ::lstat(path.c_str(), &filestats) == 0, path);
+}
+
+bool
+unlink(const stringref & filename)
+{
+ if (::unlink(filename.c_str()) != 0) {
+ if (errno == ENOENT) {
+ return false;
+ }
+ asciistream ost;
+ ost << "unlink(" << filename << "): Failed, errno(" << errno << "): "
+ << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ LOG(debug, "unlink(%s): File deleted.", filename.c_str());
+ return true;
+}
+
+bool
+rename(const stringref & frompath, const stringref & topath,
+ bool copyDeleteBetweenFilesystems, bool createTargetDirectoryIfMissing)
+{
+ LOG(spam, "rename(%s, %s): Renaming file%s.",
+ frompath.c_str(), topath.c_str(),
+ createTargetDirectoryIfMissing
+ ? " recursively creating target directory if missing" : "");
+ if (::rename(frompath.c_str(), topath.c_str()) != 0) {
+ if (errno == ENOENT) {
+ if (!fileExists(frompath)) return false;
+ if (createTargetDirectoryIfMissing) {
+ string::size_type pos = topath.rfind('/');
+ if (pos != string::npos) {
+ string path(topath.substr(0, pos));
+ vespalib::mkdir(path);
+ LOG(debug, "rename(%s, %s): Created target directory. "
+ "Calling recursively.",
+ frompath.c_str(), topath.c_str());
+ return rename(frompath, topath,
+ copyDeleteBetweenFilesystems, false);
+ }
+ } else {
+ asciistream ost;
+ ost << "rename(" << frompath << ", " << topath
+ << (copyDeleteBetweenFilesystems ? ", revert to copy" : "")
+ << (createTargetDirectoryIfMissing
+ ? ", create missing target" : "")
+ << "): Failed, target path does not exist.";
+ throw IoException(ost.str(), IoException::NOT_FOUND,
+ VESPA_STRLOC);
+ }
+ } else if (errno == EXDEV && copyDeleteBetweenFilesystems) {
+ if (!fileExists(frompath)) {
+ LOG(debug, "rename(%s, %s): Renaming non-existing file across "
+ "filesystems returned EXDEV rather than ENOENT.",
+ frompath.c_str(), topath.c_str());
+ return false;
+ }
+ LOG(debug, "rename(%s, %s): Cannot rename across filesystems. "
+ "Copying and deleting instead.",
+ frompath.c_str(), topath.c_str());
+ copy(frompath, topath, createTargetDirectoryIfMissing);
+ unlink(frompath);
+ return true;
+ }
+ asciistream ost;
+ ost << "rename(" << frompath << ", " << topath
+ << (copyDeleteBetweenFilesystems ? ", revert to copy" : "")
+ << (createTargetDirectoryIfMissing ? ", create missing target" : "")
+ << "): Failed, errno(" << errno << "): " << safeStrerror(errno);
+ throw IoException(ost.str(), IoException::getErrorType(errno),
+ VESPA_STRLOC);
+ }
+ LOG(debug, "rename(%s, %s): Renamed.", frompath.c_str(), topath.c_str());
+ return true;
+}
+
+namespace {
+
+ uint32_t bufferSize = 1024 * 1024;
+ uint32_t diskAlignmentSize = 512;
+
+}
+
+void
+copy(const stringref & frompath, const stringref & topath,
+ bool createTargetDirectoryIfMissing, bool useDirectIO)
+{
+ // Get aligned buffer, so it works with direct IO
+ LOG(spam, "copy(%s, %s): Copying file%s.",
+ frompath.c_str(), topath.c_str(),
+ createTargetDirectoryIfMissing
+ ? " recursively creating target directory if missing" : "");
+ MallocAutoPtr buffer(getAlignedBuffer(bufferSize));
+
+ File source(frompath);
+ File target(topath);
+ source.open(File::READONLY | (useDirectIO ? File::DIRECTIO : 0));
+ size_t sourceSize = source.getFileSize();
+ if (useDirectIO && sourceSize % diskAlignmentSize != 0) {
+ LOG(warning, "copy(%s, %s): Cannot use direct IO to write new file, "
+ "as source file has size %" PRIu64 ", which is not "
+ "dividable by the disk alignment size of %u.",
+ frompath.c_str(), topath.c_str(), sourceSize, diskAlignmentSize);
+ useDirectIO = false;
+ }
+ target.open(File::CREATE | File::TRUNC | (useDirectIO ? File::DIRECTIO : 0),
+ createTargetDirectoryIfMissing);
+ off_t offset = 0;
+ for (;;) {
+ size_t bytesRead = source.read(buffer.get(), bufferSize, offset);
+ target.write(buffer.get(), bytesRead, offset);
+ if (bytesRead < bufferSize) break;
+ offset += bytesRead;
+ }
+ LOG(debug, "copy(%s, %s): Completed.", frompath.c_str(), topath.c_str());
+}
+
+DirectoryList
+listDirectory(const stringref & path)
+{
+ DIR* dir = ::opendir(path.c_str());
+ struct dirent* entry;
+ DirectoryList result;
+ if (dir) while ((entry = readdir(dir))) {
+ string name(reinterpret_cast<const char*>(&entry->d_name));
+ assert(!name.empty());
+ if (name[0] == '.' && (name.size() == 1
+ || (name.size() == 2 && name[1] == '.')))
+ {
+ continue; // Ignore '.' and '..' files
+ }
+ result.push_back(name);
+ } else {
+ throw IoException("Failed to list directory '" + path + "'",
+ IoException::getErrorType(errno), VESPA_STRLOC);
+ }
+ ::closedir(dir);
+ return result;
+}
+
+MallocAutoPtr
+getAlignedBuffer(size_t size)
+{
+ void *ptr;
+ int result = posix_memalign(&ptr, diskAlignmentSize, size);
+ assert(result == 0);
+ (void)result;
+ return MallocAutoPtr(ptr);
+}
+
+} // vespalib
diff --git a/vespalib/src/vespa/vespalib/io/fileutil.h b/vespalib/src/vespa/vespalib/io/fileutil.h
new file mode 100644
index 00000000000..a5db031ccee
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/io/fileutil.h
@@ -0,0 +1,451 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @file fileutil.h
+ *
+ * This class contains file utilities that gives a C++ interface to
+ * file operations, and which throws exceptions on failures. The exceptions
+ * should contain decent failure messages, such that you don't have to worry
+ * about the errno error codes.
+ *
+ * It provides the following:
+ * - A C++ interface for file IO.
+ * - Exceptions for critical behavior, such that one don't need to handle
+ * critical errors low level in code (if using exceptions that is).
+ * - Functionality for recursive deletion of directories.
+ * - Functionality for copying instead of renaming moving between filesystems.
+ * - Functionality for creating missing parent directories on operations
+ * creating files and directories.
+ * - Functionality for lazy file opening. (Useful when using caches)
+ * - An interface that doesn't expose low level C++ file IO, so it can
+ * hopefully stay static even if we want to change low level implementation.
+ * - Ownership of file descriptor to avoid leaks on exceptions.
+ * - A low level layer that can be used to inject disk errors in tests, and
+ * count operation types and the like. Useful in testing.
+ *
+ * @author Hakon Humberset
+ */
+
+#pragma once
+
+#include <unistd.h>
+#include <string>
+#include <memory>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/util/memory.h>
+
+namespace vespalib {
+
+/**
+ * @brief Simple metadata about a file or directory.
+ **/
+struct FileInfo {
+ typedef std::unique_ptr<FileInfo> UP;
+
+ bool _plainfile;
+ bool _directory;
+ bool _symlink;
+ off_t _size;
+
+ bool operator==(const FileInfo&) const;
+};
+
+std::ostream& operator<<(std::ostream&, const FileInfo&);
+
+/**
+ * @brief A File instance is used to access a single open file.
+ *
+ * By using this class you get automatic closing of files when the
+ * object is destructed, and since the class knows the filename, you
+ * will get sensible exceptions containing file names if something
+ * goes wrong.
+ */
+class File {
+private:
+ int _fd;
+ int _flags;
+ vespalib::string _filename;
+ bool _close;
+ mutable int _fileReads; // Tracks number of file reads done on this file
+ mutable int _fileWrites; // Tracks number of file writes done in this file
+
+ /**
+ * Verify that direct I/O alignment preconditions hold. Triggers assertion
+ * failure on violations.
+ */
+ void verifyDirectIO(uint64_t buf, size_t bufsize, off_t offset) const;
+
+public:
+ typedef std::unique_ptr<File> UP;
+
+ /**
+ * If failing to open file using direct IO it will retry using cached IO.
+ */
+ enum Flag { READONLY = 1, CREATE = 2, DIRECTIO = 4, TRUNC = 8 };
+
+ /** Create a file instance, without opening the file. */
+ File(const vespalib::stringref & filename);
+
+ /** Create a file instance of an already open file. */
+ File(int fileDescriptor, const vespalib::stringref & filename);
+
+ /** Copying a file instance, moves any open file descriptor. */
+ File(File& f);
+ File& operator=(File& f);
+
+ /** Closes the file if not instructed to do otherwise. */
+ virtual ~File();
+
+ /**
+ * Make this instance point at another file.
+ * Closes the old file it it was open.
+ */
+ void setFilename(const vespalib::stringref & filename);
+
+ const vespalib::string& getFilename() const { return _filename; }
+
+ virtual void open(int flags, bool autoCreateDirectories = false);
+
+ bool isOpen() const { return (_fd != -1); }
+ bool isOpenWithDirectIO() const { return ((_flags & DIRECTIO) != 0); }
+
+ /**
+ * Whether or not file should be closed when this instance is destructed.
+ * By default it will be closed.
+ */
+ void closeFileWhenDestructed(bool close);
+
+ virtual int getFileDescriptor() const { return _fd; }
+
+ /**
+ * Get information about the current file. If file is opened, file descriptor
+ * will be used for stat. If file is not open, and the file does not exist
+ * yet, you will get fileinfo describing an empty file.
+ */
+ virtual FileInfo stat() const;
+
+ /**
+ * Get the filesize of a file, specified by a file descriptor.
+ *
+ * @throw IoException If we failed to stat the file.
+ */
+ virtual off_t getFileSize() const { return stat()._size; }
+
+ /**
+ * Resize the currently open file to a given size,
+ * truncating or extending file with 0 bytes according to what the former
+ * size was.
+ *
+ * @param size new size of file
+ * @throw IoException If we failed to resize the file.
+ */
+ virtual void resize(off_t size);
+
+ /**
+ * Writes data to file.
+ *
+ * If file is opened in direct I/O mode, arguments buf, bufsize and offset
+ * MUST all be 512-byte aligned!
+ *
+ * @param buf The buffer to get data from.
+ * @param bufsize Number of bytes to write.
+ * @param offset The position in the file where write should happen.
+ * @throw IoException If we failed to write to the file.
+ * @return Always return bufsize.
+ */
+ virtual off_t write(const void *buf, size_t bufsize, off_t offset);
+
+ /**
+ * Read characters from a file.
+ *
+ * If file is opened in direct I/O mode, arguments buf, bufsize and offset
+ * MUST all be 512-byte aligned!
+ *
+ * @param buf The buffer into which to read.
+ * @param bufsize Maximum number of bytes to read.
+ * @param offset Position in file to read from.
+ * @throw IoException If we failed to read from file.
+ * @return The number of bytes actually read. If less than
+ * bufsize, this indicates that EOF was reached.
+ */
+ virtual size_t read(void *buf, size_t bufsize, off_t offset) const;
+
+ /**
+ * Read the file into a string.
+ *
+ * This is a small wrapper around read(), see there for more info.
+ *
+ * @throw IoException If we failed to read from file.
+ * @return The content of the file.
+ */
+ vespalib::string readAll() const;
+
+ /**
+ * Read a file into a string.
+ *
+ * This is a convenience function for the member functions open() and
+ * readAll(), see there for more details.
+ *
+ * @throw IoException If we failed to read from file.
+ * @return The content of the file.
+ */
+ static vespalib::string readAll(const vespalib::stringref & path);
+
+ virtual void sync();
+ virtual bool close();
+ virtual bool unlink();
+
+ int getFileReadCount() const { return _fileReads; }
+ int getFileWriteCount() const { return _fileWrites; }
+};
+
+/**
+ * @brief A File instance that automatically opens once needed.
+ */
+class LazyFile : public File {
+ int _flags;
+ bool _autoCreateDirectories;
+
+public:
+ typedef std::unique_ptr<LazyFile> UP;
+
+ LazyFile(const vespalib::stringref & filename, int flags,
+ bool autoCreateDirs = false)
+ : File(filename),
+ _flags(flags),
+ _autoCreateDirectories(autoCreateDirs) {}
+
+ LazyFile(LazyFile& other)
+ : File(other),
+ _flags(other._flags),
+ _autoCreateDirectories(other._autoCreateDirectories) {}
+
+ LazyFile& operator=(LazyFile& other) {
+ File::operator=(other);
+ _flags = other._flags;
+ _autoCreateDirectories = other._autoCreateDirectories;
+ return *this;
+ }
+
+ int getFlags() const { return _flags; }
+ void setFlags(int flags) { _flags = flags; }
+ void setAutoCreateDirectories(bool autoCreate)
+ { _autoCreateDirectories = autoCreate; }
+ bool autoCreateDirectories() const { return _autoCreateDirectories; }
+
+ int getFileDescriptor() const {
+ if (!isOpen()) {
+ const_cast<LazyFile&>(*this).open(_flags, _autoCreateDirectories);
+ }
+ return File::getFileDescriptor();
+ }
+
+ void resize(off_t size) {
+ if (!isOpen()) { open(_flags, _autoCreateDirectories); }
+ File::resize(size);
+ }
+
+ off_t write(const void *buf, size_t bufsize, off_t offset) {
+ if (!isOpen()) { open(_flags, _autoCreateDirectories); }
+ return File::write(buf, bufsize, offset);
+ }
+
+ size_t read(void *buf, size_t bufsize, off_t offset) const {
+ if (!isOpen()) {
+ const_cast<LazyFile&>(*this).open(_flags, _autoCreateDirectories);
+ }
+ return File::read(buf, bufsize, offset);
+ }
+};
+
+/**
+ * Get the current working directory.
+ *
+ * @throw IoException On failure.
+ */
+extern vespalib::string getCurrentDirectory();
+
+/**
+ * Creates a directory.
+ *
+ * @param directory The directory to create.
+ * @param recursive If set, create all parent directories needed if missing.
+ * @throw IoException If we failed create the directory.
+ *
+ * @return True if it did not exist, false if it did.
+ */
+extern bool mkdir(const vespalib::stringref & directory, bool recursive = true);
+
+/**
+ * Change working directory.
+ *
+ * @param directory The directory to change to.
+ * @throw IoException If we failed to change to the new working directory.
+ */
+extern void chdir(const vespalib::stringref & directory);
+
+/**
+ * Remove a directory.
+ *
+ * @param directory The directory name.
+ * @param recursive If set, remove all content of the directory to. If not
+ * set, fail if the directory is not empty.
+ * @throw IoException If we failed to remove the directory.
+ *
+ * @return True if directory existed, false if not.
+ */
+extern bool rmdir(const vespalib::stringref & directory, bool recursive = false);
+
+/**
+ * Stat a file.
+ *
+ * @throw IoException If we failed to stat the file.
+ * @return A file info object if everything went well, a null pointer if the
+ * file was not found.
+ */
+extern FileInfo::UP stat(const vespalib::stringref & path);
+
+/**
+ * Stat a file. Give info on symlink rather than on file pointed to.
+ *
+ * @throw IoException If we failed to stat the file.
+ * @return A file info object if everything went well, a null pointer if the
+ * file was not found.
+ */
+extern FileInfo::UP lstat(const vespalib::stringref & path);
+
+/**
+ * Check if a file exists or not. See also pathExists.
+ *
+ * @throw IoException If we failed to stat the file.
+ */
+extern inline bool fileExists(const vespalib::stringref & path) {
+ return (stat(path).get() != 0);
+}
+
+/**
+ * Check if a path exists, i.e. whether it's a symbolic link, regular file,
+ * directory, etc.
+ *
+ * This function is the same as fileExists, except if path is a symbolic link:
+ * This function returns true, while fileExists returns true only if the path
+ * the symbolic link points to exists.
+ */
+extern inline bool pathExists(const vespalib::stringref & path) {
+ return (lstat(path).get() != 0);
+}
+
+/**
+ * Get the filesize of the given file. Ignoring if it exists or not.
+ * (None-existing files will be reported to have size zero)
+ */
+extern inline off_t getFileSize(const vespalib::stringref & path) {
+ FileInfo::UP info(stat(path));
+ return (info.get() == 0 ? 0 : info->_size);
+}
+
+/**
+ * Check if a file is a plain file or not.
+ *
+ * @return True if it is a plain file, false if it don't exist or isn't.
+ * @throw IoException If we failed to stat the file.
+ */
+extern inline bool isPlainFile(const vespalib::stringref & path) {
+ FileInfo::UP info(stat(path));
+ return (info.get() && info->_plainfile);
+}
+
+/**
+ * Check if a file is a directory or not.
+ *
+ * @return True if it is a directory, false if it don't exist or isn't.
+ * @throw IoException If we failed to stat the file.
+ */
+extern inline bool isDirectory(const vespalib::stringref & path) {
+ FileInfo::UP info(stat(path));
+ return (info.get() && info->_directory);
+}
+
+/**
+ * Check whether a path is a symlink.
+ *
+ * @return True if path exists and is a symbolic link.
+ * @throw IoException If there's an unexpected stat failure.
+ */
+extern inline bool isSymLink(const vespalib::stringref & path) {
+ FileInfo::UP info(lstat(path));
+ return (info.get() && info->_symlink);
+}
+
+/**
+ * Creates a symbolic link named newPath which contains the string oldPath.
+ *
+ * IMPORTANT: from the spec:
+ * "Symbolic links are interpreted at run time as if the contents of the link had
+ * been substituted into the path being followed to find a file or directory."
+ *
+ * This means oldPath is _relative_ to the directory in which newPath resides!
+ *
+ * @param oldPath Target of symbolic link.
+ * @param newPath Relative link to be created. See above note for semantics.
+ * @throw IoException if we fail to create the symlink.
+ */
+extern void symlink(const vespalib::stringref & oldPath,
+ const vespalib::stringref & newPath);
+
+/**
+ * Read and return the contents of symbolic link at the given path.
+ *
+ * @param path Path to symbolic link.
+ * @return Contents of symbolic link.
+ * @throw IoException if we cannot read the link.
+ */
+extern vespalib::string readLink(const vespalib::stringref & path);
+
+/**
+ * Remove the given file.
+ *
+ * @param filename name of file.
+ * @return True if file was removed, false if it did not exist.
+ * @throw IoException If we failed to unlink the file.
+ */
+extern bool unlink(const vespalib::stringref & filename);
+
+/**
+ * Rename the file at frompath to topath.
+ *
+ * @param frompath old name of file.
+ * @param topath new name of file.
+ *
+ * @param copyDeleteBetweenFilesystems whether a copy-and-delete
+ * operation should be performed if rename crosses a file system
+ * boundary, or not.
+ *
+ * @param createTargetDirectoryIfMissing whether the target directory
+ * should be created if it's missing, or not.
+ *
+ * @throw IoException If we failed to rename the file.
+ * @return True if file was renamed, false if frompath did not exist.
+ */
+extern bool rename(const vespalib::stringref & frompath,
+ const vespalib::stringref & topath,
+ bool copyDeleteBetweenFilesystems = true,
+ bool createTargetDirectoryIfMissing = false);
+
+/**
+ * Copies a file to a destination using Direct IO.
+ */
+extern void copy(const vespalib::stringref & frompath,
+ const vespalib::stringref & topath,
+ bool createTargetDirectoryIfMissing = false,
+ bool useDirectIO = true);
+
+/**
+ * List the contents of the given directory.
+ */
+typedef std::vector<vespalib::string> DirectoryList;
+extern DirectoryList listDirectory(const vespalib::stringref & path);
+
+extern MallocAutoPtr getAlignedBuffer(size_t size);
+
+} // vespalib
+
diff --git a/vespalib/src/vespa/vespalib/net/CMakeLists.txt b/vespalib/src/vespa/vespalib/net/CMakeLists.txt
new file mode 100644
index 00000000000..05eb0879152
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_net OBJECT
+ SOURCES
+ server_socket.cpp
+ socket.cpp
+ socket_address.cpp
+ socket_handle.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/net/server_socket.cpp b/vespalib/src/vespa/vespalib/net/server_socket.cpp
new file mode 100644
index 00000000000..409431ff06a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/server_socket.cpp
@@ -0,0 +1,37 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "server_socket.h"
+
+namespace vespalib {
+
+SocketAddress
+ServerSocket::address() const
+{
+ return SocketAddress::address_of(_handle.get());
+}
+
+void
+ServerSocket::shutdown()
+{
+ if (valid()) {
+ ::shutdown(_handle.get(), SHUT_RDWR);
+ }
+}
+
+Socket::UP
+ServerSocket::accept()
+{
+ SocketHandle handle(::accept(_handle.get(), nullptr, 0));
+ return std::make_unique<Socket>(std::move(handle));
+}
+
+ServerSocket::UP
+ServerSocket::listen(int port)
+{
+ SocketHandle handle = SocketAddress::select_local(port).listen();
+ return std::make_unique<ServerSocket>(std::move(handle));
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/net/server_socket.h b/vespalib/src/vespa/vespalib/net/server_socket.h
new file mode 100644
index 00000000000..9b969c7f7c6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/server_socket.h
@@ -0,0 +1,29 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include "socket_handle.h"
+#include "socket_address.h"
+#include "socket.h"
+
+namespace vespalib {
+
+class ServerSocket
+{
+private:
+ SocketHandle _handle;
+
+public:
+ typedef std::unique_ptr<ServerSocket> UP;
+ ServerSocket(const ServerSocket &rhs) = delete;
+ ServerSocket &operator=(const ServerSocket &rhs) = delete;
+ explicit ServerSocket(SocketHandle handle) : _handle(std::move(handle)) {}
+ bool valid() const { return _handle.valid(); }
+ SocketAddress address() const;
+ void shutdown();
+ Socket::UP accept();
+ static ServerSocket::UP listen(int port);
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/net/socket.cpp b/vespalib/src/vespa/vespalib/net/socket.cpp
new file mode 100644
index 00000000000..02f59117a45
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/socket.cpp
@@ -0,0 +1,58 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "socket.h"
+
+namespace vespalib {
+
+SocketAddress
+Socket::address() const
+{
+ return SocketAddress::address_of(_handle.get());
+}
+
+SocketAddress
+Socket::peer_address() const
+{
+ return SocketAddress::peer_address(_handle.get());
+}
+
+void
+Socket::shutdown()
+{
+ if (valid()) {
+ ::shutdown(_handle.get(), SHUT_RDWR);
+ }
+}
+
+ssize_t
+Socket::read(char *buf, size_t len)
+{
+ for (;;) {
+ ssize_t result = ::read(_handle.get(), buf, len);
+ if ((result >= 0) || (errno != EINTR)) {
+ return result;
+ }
+ }
+}
+
+ssize_t
+Socket::write(const char *buf, size_t len)
+{
+ for (;;) {
+ ssize_t result = ::write(_handle.get(), buf, len);
+ if ((result >= 0) || (errno != EINTR)) {
+ return result;
+ }
+ }
+}
+
+Socket::UP
+Socket::connect(const vespalib::string &host, int port)
+{
+ SocketHandle handle = SocketAddress::select_remote(port, host.c_str()).connect();
+ return std::make_unique<Socket>(std::move(handle));
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/net/socket.h b/vespalib/src/vespa/vespalib/net/socket.h
new file mode 100644
index 00000000000..ffd6d6494af
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/socket.h
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include "socket_handle.h"
+#include "socket_address.h"
+
+namespace vespalib {
+
+class Socket
+{
+private:
+ SocketHandle _handle;
+
+public:
+ typedef std::unique_ptr<Socket> UP;
+ Socket(const Socket &rhs) = delete;
+ Socket &operator=(const Socket &rhs) = delete;
+ explicit Socket(SocketHandle handle) : _handle(std::move(handle)) {}
+ bool valid() const { return _handle.valid(); }
+ SocketAddress address() const;
+ SocketAddress peer_address() const;
+ void shutdown();
+ ssize_t read(char *buf, size_t len);
+ ssize_t write(const char *buf, size_t len);
+ static Socket::UP connect(const vespalib::string &host, int port);
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/net/socket_address.cpp b/vespalib/src/vespa/vespalib/net/socket_address.cpp
new file mode 100644
index 00000000000..e6cbfa117a3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/socket_address.cpp
@@ -0,0 +1,157 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "socket_address.h"
+#include <vespa/vespalib/util/stringfmt.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+namespace vespalib {
+
+vespalib::string
+SocketAddress::ip_address() const
+{
+ vespalib::string result = "invalid";
+ if (is_ipv4()) {
+ char buf[INET_ADDRSTRLEN];
+ const sockaddr_in *addr = reinterpret_cast<const sockaddr_in *>(&_addr);
+ result = inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf));
+ } else if (is_ipv6()) {
+ char buf[INET6_ADDRSTRLEN];
+ const sockaddr_in6 *addr = reinterpret_cast<const sockaddr_in6 *>(&_addr);
+ result = inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf));
+ }
+ return result;
+}
+
+SocketAddress::SocketAddress(const sockaddr *addr_in, socklen_t addrlen_in)
+ : _size(addrlen_in),
+ _addr()
+{
+ memset(&_addr, 0, sizeof(_addr));
+ memcpy(&_addr, addr_in, _size);
+}
+
+int
+SocketAddress::port() const
+{
+ if (is_ipv4()) {
+ const sockaddr_in *addr = reinterpret_cast<const sockaddr_in *>(&_addr);
+ return ntohs(addr->sin_port);
+ }
+ if (is_ipv6()) {
+ const sockaddr_in6 *addr = reinterpret_cast<const sockaddr_in6 *>(&_addr);
+ return ntohs(addr->sin6_port);
+ }
+ return -1;
+}
+
+vespalib::string
+SocketAddress::spec() const
+{
+ if (is_ipv4()) {
+ return make_string("tcp/%s:%d", ip_address().c_str(), port());
+ }
+ return make_string("tcp/[%s]:%d", ip_address().c_str(), port());
+}
+
+SocketHandle
+SocketAddress::connect() const
+{
+ if (valid()) {
+ SocketHandle handle(socket(_addr.ss_family, SOCK_STREAM, 0));
+ if (handle && (::connect(handle.get(), addr(), _size) == 0)) {
+ return handle;
+ }
+ }
+ return SocketHandle();
+}
+
+SocketHandle
+SocketAddress::listen(int backlog) const
+{
+ if (valid()) {
+ SocketHandle handle(socket(_addr.ss_family, SOCK_STREAM, 0));
+ if (handle) {
+ if (is_ipv6()) {
+ int disable = 0;
+ setsockopt(handle.get(), IPPROTO_IPV6, IPV6_V6ONLY, &disable, sizeof(disable));
+ }
+ if (port() != 0) {
+ int enable = 1;
+ setsockopt(handle.get(), SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable));
+ }
+ if ((bind(handle.get(), addr(), _size) == 0) &&
+ (::listen(handle.get(), backlog) == 0))
+ {
+ return handle;
+ }
+ }
+ }
+ return SocketHandle();
+}
+
+SocketAddress
+SocketAddress::address_of(int sockfd)
+{
+ SocketAddress result;
+ sockaddr *addr = reinterpret_cast<sockaddr *>(&result._addr);
+ socklen_t addr_len = sizeof(result._addr);
+ if (getsockname(sockfd, addr, &addr_len) == 0) {
+ assert(addr_len <= sizeof(result._addr));
+ result._size = addr_len;
+ }
+ return result;
+}
+
+SocketAddress
+SocketAddress::peer_address(int sockfd)
+{
+ SocketAddress result;
+ sockaddr *addr = reinterpret_cast<sockaddr *>(&result._addr);
+ socklen_t addr_len = sizeof(result._addr);
+ if (getpeername(sockfd, addr, &addr_len) == 0) {
+ assert(addr_len <= sizeof(result._addr));
+ result._size = addr_len;
+ }
+ return result;
+}
+
+std::vector<SocketAddress>
+SocketAddress::resolve(int port, const char *node) {
+ std::vector<SocketAddress> result;
+ addrinfo hints;
+ memset(&hints, 0, sizeof(addrinfo));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = 0;
+ hints.ai_flags = (AI_PASSIVE | AI_NUMERICSERV | AI_ADDRCONFIG);
+ vespalib::string service = make_string("%d", port);
+ addrinfo *list = nullptr;
+ if (getaddrinfo(node, service.c_str(), &hints, &list) == 0) {
+ for (const addrinfo *info = list; info != nullptr; info = info->ai_next) {
+ result.push_back(SocketAddress(info->ai_addr, info->ai_addrlen));
+ }
+ freeaddrinfo(list);
+ }
+ return result;
+}
+
+SocketAddress
+SocketAddress::select_local(int port, const char *node)
+{
+ auto prefer_ipv6 = [](const auto &a, const auto &b) { return (!a.is_ipv6() && b.is_ipv6()); };
+ return select(prefer_ipv6, port, node);
+}
+
+SocketAddress
+SocketAddress::select_remote(int port, const char *node)
+{
+ auto prefer_ipv4 = [](const auto &a, const auto &b) { return (!a.is_ipv4() && b.is_ipv4()); };
+ return select(prefer_ipv4, port, node);
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/net/socket_address.h b/vespalib/src/vespa/vespalib/net/socket_address.h
new file mode 100644
index 00000000000..f1a893cfc75
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/socket_address.h
@@ -0,0 +1,58 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include "socket_handle.h"
+
+namespace vespalib {
+
+/**
+ * Wrapper class for low-level TCP/IP socket addresses.
+ **/
+class SocketAddress
+{
+private:
+ socklen_t _size;
+ sockaddr_storage _addr;
+
+ const sockaddr *addr() const { return reinterpret_cast<const sockaddr *>(&_addr); }
+ explicit SocketAddress(const sockaddr *addr_in, socklen_t addrlen_in);
+public:
+ SocketAddress() { memset(this, 0, sizeof(SocketAddress)); }
+ SocketAddress(const SocketAddress &rhs) { memcpy(this, &rhs, sizeof(SocketAddress)); }
+ SocketAddress &operator=(const SocketAddress &rhs) {
+ memcpy(this, &rhs, sizeof(SocketAddress));
+ return *this;
+ }
+ bool valid() const { return (_size >= sizeof(sa_family_t)); }
+ bool is_ipv4() const { return (valid() && (_addr.ss_family == AF_INET)); }
+ bool is_ipv6() const { return (valid() && (_addr.ss_family == AF_INET6)); }
+ int port() const;
+ vespalib::string ip_address() const;
+ vespalib::string spec() const;
+ SocketHandle connect() const;
+ SocketHandle listen(int backlog = 500) const;
+ static SocketAddress address_of(int sockfd);
+ static SocketAddress peer_address(int sockfd);
+ static std::vector<SocketAddress> resolve(int port, const char *node = nullptr);
+ static SocketAddress select_local(int port, const char *node = nullptr);
+ static SocketAddress select_remote(int port, const char *node = nullptr);
+ template <typename SELECTOR>
+ static SocketAddress select(const SELECTOR &replace, int port, const char *node = nullptr) {
+ auto list = resolve(port, node);
+ if (!list.empty()) {
+ size_t best = 0;
+ for (size_t i = 1; i < list.size(); ++i) {
+ if (replace(list[best], list[i])) {
+ best = i;
+ }
+ }
+ return list[best];
+ }
+ return SocketAddress();
+ }
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/net/socket_handle.cpp b/vespalib/src/vespa/vespalib/net/socket_handle.cpp
new file mode 100644
index 00000000000..04af33b5561
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/socket_handle.cpp
@@ -0,0 +1,9 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "socket_handle.h"
+
+namespace vespalib {
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/net/socket_handle.h b/vespalib/src/vespa/vespalib/net/socket_handle.h
new file mode 100644
index 00000000000..81c1ffc6df1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/net/socket_handle.h
@@ -0,0 +1,50 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+namespace vespalib {
+
+/**
+ * Thin wrapper around a socket file descriptor handling
+ * ownership. The destructor will close the underlying descriptor if
+ * it was valid.
+ **/
+class SocketHandle
+{
+private:
+ int _fd;
+
+ static void maybe_close(int fd) {
+ if (fd >= 0) {
+ close(fd);
+ }
+ }
+
+public:
+ SocketHandle() : _fd(-1) {}
+ explicit SocketHandle(int sockfd) : _fd(sockfd) {}
+ SocketHandle(const SocketHandle &) = delete;
+ SocketHandle &operator=(const SocketHandle &) = delete;
+ SocketHandle(SocketHandle &&rhs) : _fd(rhs.release()) {}
+ SocketHandle &operator=(SocketHandle &&rhs) {
+ maybe_close(_fd);
+ _fd = rhs.release();
+ return *this;
+ }
+ bool valid() const { return (_fd >= 0); }
+ operator bool() const { return valid(); }
+ int get() const { return _fd; }
+ int release() {
+ int old_fd = _fd;
+ _fd = -1;
+ return old_fd;
+ }
+ void reset(int fd = -1) {
+ maybe_close(_fd);
+ _fd = fd;
+ }
+ ~SocketHandle() { maybe_close(_fd); }
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/objects/CMakeLists.txt b/vespalib/src/vespa/vespalib/objects/CMakeLists.txt
new file mode 100644
index 00000000000..7473092ad8b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/objects/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_objects OBJECT
+ SOURCES
+ nbostream.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/objects/nbostream.cpp b/vespalib/src/vespa/vespalib/objects/nbostream.cpp
new file mode 100644
index 00000000000..40df53b377e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/objects/nbostream.cpp
@@ -0,0 +1,82 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/objects/nbostream.h>
+#include <vespa/vespalib/util/optimized.h>
+#include <stdexcept>
+#include <iostream>
+
+namespace vespalib {
+
+std::ostream & operator << (std::ostream & os, const HexDump & hd)
+{
+ static const char * hexChar = "0123456789ABCDEF";
+ os << hd._sz << ' ';
+ const uint8_t *c = static_cast<const uint8_t *>(hd._buf);
+ for (size_t i(0); i < hd._sz; i++) {
+ os << hexChar[c[i] >> 4] << hexChar[c[i] & 0xf];
+ }
+ return os;
+}
+
+void nbostream::fail(State s)
+{
+ _state = static_cast<State>(_state | s);
+ throw IllegalStateException(vespalib::make_string("Stream failed bufsize(%lu), readp(%d), writep(%d)", (unsigned long)_wbuf.size(), _rp, _wp), VESPA_STRLOC);
+}
+
+void nbostream::reserve(size_t sz)
+{
+ if (capacity() < sz) {
+ extend(sz - capacity());
+ }
+}
+
+void nbostream::compact()
+{
+ memmove(&_wbuf[0], &_rbuf[_rp], left());
+ _wp = left();
+ _rp = 0;
+}
+
+
+void nbostream::extend(size_t extraSize)
+{
+ if (&_wbuf[0] != _rbuf.c_str()) {
+ _wbuf.resize(roundUp2inN(_rbuf.size() + extraSize));
+ compact();
+ _rbuf = ConstBufferRef(&_wbuf[0], _wbuf.capacity());
+ }
+ if (_rp != 0) {
+ compact();
+ }
+ if (space() < extraSize) {
+ _wbuf.resize(roundUp2inN(_wbuf.size() + extraSize));
+ _rbuf = ConstBufferRef(&_wbuf[0], _wbuf.capacity());
+ }
+}
+
+void nbostream::swap(Buffer & buf) {
+ if (_rp != 0) {
+ compact();
+ }
+ _wbuf.resize(size());
+ _wbuf.swap(buf);
+ _rbuf = ConstBufferRef(&_wbuf[0], _wbuf.capacity());
+ _wp = _wbuf.size();
+ _rp = 0;
+ _state = ok;
+}
+
+void nbostream::swap(nbostream & os)
+{
+ std::swap(_rp, os._rp);
+ std::swap(_wp, os._wp);
+ std::swap(_state, os._state);
+ _wbuf.swap(os._wbuf);
+ std::swap(_rbuf, os._rbuf);
+}
+
+
+}
diff --git a/vespalib/src/vespa/vespalib/objects/nbostream.h b/vespalib/src/vespa/vespalib/objects/nbostream.h
new file mode 100644
index 00000000000..b905e586c9f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/objects/nbostream.h
@@ -0,0 +1,334 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include <vector>
+#include <string>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/array.h>
+#include <vespa/vespalib/util/buffer.h>
+
+namespace vespalib {
+
+/*
+ * Helper class to provide hex dump of the contents in a buffer.
+ */
+class HexDump
+{
+public:
+ HexDump(const void * buf, size_t sz) : _buf(buf), _sz(sz) { }
+ friend std::ostream & operator << (std::ostream & os, const HexDump & hd);
+private:
+ const void * _buf;
+ size_t _sz;
+};
+
+
+/**
+ * Class for streaming data in network byte order, used to serialize
+ * and deserialize objects. The java code corresponding to the C++
+ * code using this class will typically use a bytebuffer or a
+ * GrowableByteBuffer for serialization and deserialization.
+ */
+class nbostream
+{
+ public:
+ typedef Array<char, DefaultAlloc> Buffer;
+ enum State { ok=0, eof=0x01};
+ nbostream(size_t initialSize=1024) :
+ _wbuf(),
+ _rbuf(),
+ _rp(0),
+ _wp(0),
+ _state(ok),
+ _longLivedBuffer(false)
+ {
+ extend(initialSize);
+ }
+
+ nbostream(const void * buf, size_t sz, bool longLivedBuffer=false) :
+ _wbuf(),
+ _rbuf(buf, sz),
+ _rp(0),
+ _wp(sz),
+ _state(ok),
+ _longLivedBuffer(longLivedBuffer)
+ {
+ }
+
+ nbostream(DefaultAlloc && buf, size_t sz) :
+ _wbuf(std::move(buf), sz),
+ _rbuf(&_wbuf[0], sz),
+ _rp(0),
+ _wp(sz),
+ _state(ok),
+ _longLivedBuffer(false)
+ {
+ assert(_wbuf.size() >= sz);
+ }
+
+ nbostream(const nbostream & rhs) :
+ _wbuf(),
+ _rbuf(),
+ _rp(0),
+ _wp(0),
+ _state(ok),
+ _longLivedBuffer(false)
+ {
+ extend(rhs.size());
+ _wp = rhs.size();
+ memcpy(&_wbuf[0], &rhs._rbuf[rhs._rp], _wp);
+ }
+ nbostream & operator = (const nbostream & rhs) {
+ if (this != &rhs) {
+ nbostream n(rhs);
+ swap(n);
+ }
+ return *this;
+ }
+ nbostream & operator << (double v) { double n(n2h(v)); write8(&n); return *this; }
+ nbostream & operator >> (double & v) { double n; read8(&n); v = n2h(n); return *this; }
+ nbostream & operator << (float v) { float n(n2h(v)); write4(&n); return *this; }
+ nbostream & operator >> (float & v) { float n; read4(&n); v = n2h(n); return *this; }
+ nbostream & operator << (int64_t v) { int64_t n(n2h(v)); write8(&n); return *this; }
+ nbostream & operator >> (int64_t & v) { int64_t n; read8(&n); v = n2h(n); return *this; }
+ nbostream & operator << (uint64_t v) { uint64_t n(n2h(v)); write8(&n); return *this; }
+ nbostream & operator >> (uint64_t & v) { uint64_t n; read8(&n); v = n2h(n); return *this; }
+ nbostream & operator << (int32_t v) { int32_t n(n2h(v)); write4(&n); return *this; }
+ nbostream & operator >> (int32_t & v) { int32_t n; read4(&n); v = n2h(n); return *this; }
+ nbostream & operator << (uint32_t v) { uint32_t n(n2h(v)); write4(&n); return *this; }
+ nbostream & operator >> (uint32_t & v) { uint32_t n; read4(&n); v = n2h(n); return *this; }
+ nbostream & operator << (int16_t v) { int16_t n(n2h(v)); write2(&n); return *this; }
+ nbostream & operator >> (int16_t & v) { int16_t n; read2(&n); v = n2h(n); return *this; }
+ nbostream & operator << (uint16_t v) { uint16_t n(n2h(v)); write2(&n); return *this; }
+ nbostream & operator >> (uint16_t & v) { uint16_t n; read2(&n); v = n2h(n); return *this; }
+ nbostream & operator << (int8_t v) { write1(&v); return *this; }
+ nbostream & operator >> (int8_t & v) { read1(&v); return *this; }
+ nbostream & operator << (uint8_t v) { write1(&v); return *this; }
+ nbostream & operator >> (uint8_t & v) { read1(&v); return *this; }
+ nbostream & operator << (char v) { write1(&v); return *this; }
+ nbostream & operator >> (char & v) { read1(&v); return *this; }
+ nbostream & operator << (bool v) { write1(&v); return *this; }
+ nbostream & operator >> (bool & v) { read1(&v); return *this; }
+ nbostream & operator << (const std::string & v) { uint32_t sz(v.size()); (*this) << sz; write(v.c_str(), sz); return *this; }
+ nbostream & operator >> (std::string & v) {
+ uint32_t sz;
+ (*this) >> sz;
+ if (__builtin_expect(left() >= sz, true)) {
+ v.assign(&_rbuf[_rp], sz);
+ _rp += sz;
+ } else {
+ fail(eof);
+ }
+ return *this;
+ }
+ nbostream & operator << (const char * v) { uint32_t sz(strlen(v)); (*this) << sz; write(v, sz); return *this; }
+ nbostream & operator << (const vespalib::stringref & v) { uint32_t sz(v.size()); (*this) << sz; write(v.c_str(), sz); return *this; }
+ nbostream & operator << (const vespalib::string & v) { uint32_t sz(v.size()); (*this) << sz; write(v.c_str(), sz); return *this; }
+ nbostream & operator >> (vespalib::string & v) {
+ uint32_t sz; (*this) >> sz;
+ if (__builtin_expect(left() >= sz, true)) {
+ v.assign(&_rbuf[_rp], sz);
+ _rp += sz;
+ } else {
+ fail(eof);
+ }
+ return *this;
+ }
+ template <typename T>
+ nbostream & operator << (const vespalib::Array<T> & v) {
+ uint32_t sz(v.size());
+ (*this) << sz;
+ for(size_t i(0); i < sz; i++) {
+ (*this) << v[i];
+ }
+ return *this;
+ }
+ template <typename T>
+ nbostream & operator >> (vespalib::Array<T> & v) {
+ uint32_t sz;
+ (*this) >> sz;
+ v.resize(sz);
+ for(size_t i(0); i < sz; i++) {
+ (*this) >> v[i];
+ }
+ return *this;
+ }
+ template <typename T>
+ nbostream & operator << (const std::vector<T> & v) {
+ uint32_t sz(v.size());
+ (*this) << sz;
+ for(size_t i(0); i < sz; i++) {
+ (*this) << v[i];
+ }
+ return *this;
+ }
+ template <typename T>
+ nbostream & operator >> (std::vector<T> & v) {
+ uint32_t sz;
+ (*this) >> sz;
+ v.resize(sz);
+ for(size_t i(0); i < sz; i++) {
+ (*this) >> v[i];
+ }
+ return *this;
+ }
+
+ template <typename T, typename U>
+ nbostream &
+ operator<<(const std::pair<T, U> &val)
+ {
+ *this << val.first << val.second;
+ return *this;
+ }
+
+ template <typename T, typename U>
+ nbostream &
+ operator>>(std::pair<T, U> &val)
+ {
+ *this >> val.first >> val.second;
+ return *this;
+ }
+
+ // For checkpointing where capacity should be restored
+ template <typename T>
+ nbostream &
+ saveVector(const std::vector<T> &val)
+ {
+ size_t valCapacity = val.capacity();
+ size_t valSize = val.size();
+ assert(valCapacity >= valSize);
+ *this << valCapacity << valSize;
+ for (const T & v : val) {
+ *this << v;
+ }
+ return *this;
+ }
+
+ // For checkpointing where capacity should be restored
+ template <typename T>
+ nbostream &
+ restoreVector(std::vector<T> &val)
+ {
+ size_t valCapacity = 0;
+ size_t valSize = 0;
+ *this >> valCapacity >> valSize;
+ assert(valCapacity >= valSize);
+ val.reserve(valCapacity);
+ val.clear();
+ T i;
+ for (size_t j = 0; j < valSize; ++j) {
+ *this >> i;
+ val.push_back(i);
+ }
+ return *this;
+ }
+
+ size_t size() const { return left(); }
+ size_t capacity() const { return _wbuf.size(); }
+ bool empty() const { return size() == 0; }
+ const char * c_str() const { return &_rbuf[0]; }
+ const char * peek() const { return &_rbuf[_rp]; }
+ size_t rp() const { return _rp; }
+ nbostream & rp(size_t pos) { if (pos > _wp) fail(eof); _rp = pos; return *this; }
+ size_t wp() const { return _wp; }
+ State state() const { return _state; }
+ bool good() const { return _state == ok; }
+ void clear() { _wbuf.clear(); _wp = _rp = 0; _state = ok; }
+ void adjustReadPos(ssize_t adj) { uint32_t npos = _rp + adj; if (__builtin_expect(npos > _wp, false)) { fail(eof); } _rp = npos; }
+ friend std::ostream & operator << (std::ostream & os, const nbostream & s) { return os << HexDump(&s._rbuf[s._rp], s.left()); }
+ static bool n2h(bool v) { return v; }
+ static int8_t n2h(int8_t v) { return v; }
+ static uint8_t n2h(uint8_t v) { return v; }
+ static char n2h(char v) { return v; }
+ static int16_t n2h(int16_t v) { return ntohs(v); }
+ static uint16_t n2h(uint16_t v) { return ntohs(v); }
+ static int32_t n2h(int32_t v) { return ntohl(v); }
+ static uint32_t n2h(uint32_t v) { return ntohl(v); }
+ static int64_t n2h(int64_t v) { return ntohll(v); }
+ static uint64_t n2h(uint64_t v) { return ntohll(v); }
+ static float n2h(float v) { union { uint32_t _u; float _f; } uf; uf._f = v; uf._u = ntohl(uf._u); return uf._f; }
+ static double n2h(double v) { union { uint64_t _u; double _f; } uf; uf._f = v; uf._u = ntohll(uf._u); return uf._f; }
+ void write(const void *v, size_t sz) {
+ if (__builtin_expect(space() < sz, false)) {
+ extend(sz);
+ }
+ memcpy(&_wbuf[_wp], v, sz);
+ _wp += sz;
+ }
+ void read(void *v, size_t sz) {
+ if (__builtin_expect(left() >= sz, true)) {
+ memcpy(v, &_rbuf[_rp], sz);
+ _rp += sz;
+ } else {
+ memset(v, 0, sz);
+ fail(eof);
+ }
+ }
+ void swap(Buffer & buf);
+ void swap(nbostream & os);
+ /**
+ * This flag can be used to tell that a buffer will live at least as long as
+ * any objects it will be the backing for. In those cases there is no need for
+ * client to make a copy of the buffer content. Use it care and in environments
+ * you have full control over.
+ *
+ */
+ bool isLongLivedBuffer() const { return _longLivedBuffer; }
+ void reserve(size_t sz);
+ void putInt1_4Bytes(uint32_t val) {
+ if (val < 0x80) {
+ *this << static_cast<uint8_t>(val);
+ } else {
+ *this << (val | 0x80000000);
+ }
+ }
+ template <typename T>
+ T readValue() {
+ T val;
+ *this >> val;
+ return val;
+ }
+ uint32_t getInt1_4Bytes() {
+ char first_byte = *peek();
+ if (!(first_byte & 0x80)) {
+ return readValue<uint8_t>();
+ } else {
+ return readValue<uint32_t>() & 0x7fffffff;
+ }
+ }
+ void writeSmallString(vespalib::stringref value) {
+ putInt1_4Bytes(value.size());
+ write(value.data(), value.size());
+ }
+ void readSmallString(vespalib::string &value) {
+ size_t strSize = getInt1_4Bytes();
+ const char *cstr = peek();
+ value.assign(cstr, strSize);
+ adjustReadPos(strSize);
+ }
+ private:
+ static uint64_t ntohll(uint64_t v) { union { uint64_t _ll; uint32_t _l[2]; } w, r; r._ll = v; w._l[0] = n2h(r._l[1]); w._l[1] = n2h(r._l[0]); return w._ll; }
+ void read1(void *v) { read(v, 1); }
+ void read2(void *v) { read(v, 2); }
+ void read4(void *v) { read(v, 4); }
+ void read8(void *v) { read(v, 8); }
+ void write1(const void *v) { write(v, 1); }
+ void write2(const void *v) { write(v, 2); }
+ void write4(const void *v) { write(v, 4); }
+ void write8(const void *v) { write(v, 8); }
+ void fail(State s);
+ uint32_t left() const { return _wp - _rp; }
+ uint32_t space() const { return _wbuf.size() - _wp; }
+ void compact();
+ void extend(size_t newSize);
+ Buffer _wbuf;
+ ConstBufferRef _rbuf;
+ uint32_t _rp;
+ uint32_t _wp;
+ State _state;
+ const bool _longLivedBuffer;
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/stllike/.gitignore b/vespalib/src/vespa/vespalib/stllike/.gitignore
new file mode 100644
index 00000000000..583460ae288
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/.gitignore
@@ -0,0 +1,3 @@
+*.So
+.depend
+Makefile
diff --git a/vespalib/src/vespa/vespalib/stllike/CMakeLists.txt b/vespalib/src/vespa/vespalib/stllike/CMakeLists.txt
new file mode 100644
index 00000000000..c03dc4d1703
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_stllike OBJECT
+ SOURCES
+ asciistream.cpp
+ hashtable.cpp
+ string.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/stllike/asciistream.cpp b/vespalib/src/vespa/vespalib/stllike/asciistream.cpp
new file mode 100644
index 00000000000..f49e1a29581
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/asciistream.cpp
@@ -0,0 +1,581 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <algorithm>
+#include <limits>
+#include <stdexcept>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/util/memory.h>
+
+namespace vespalib {
+
+namespace {
+ std::vector<string> getPrecisions(const char type) {
+ std::vector<string> result(VESPALIB_ASCIISTREAM_MAX_PRECISION + 1);
+ for (uint32_t i=0; i<result.size(); ++i) {
+ char buf[8];
+ int count = snprintf(buf, sizeof(buf), "%%.%u%c", i, type);
+ assert(size_t(count) < sizeof(buf)); // Assert no truncation.
+ (void) count;
+ result[i] = buf;
+ }
+ return result;
+ }
+ std::vector<string> fixedPrecisions = getPrecisions('f');
+ std::vector<string> scientificPrecisions = getPrecisions('e');
+ std::vector<string> autoPrecisions = getPrecisions('g');
+}
+
+asciistream::asciistream() :
+ _rPos(0),
+ _wbuf(),
+ _rbuf(_wbuf.c_str(), _wbuf.size()),
+ _base(dec),
+ _floatSpec(automatic),
+ _floatModifier(defaultdotting),
+ _width(0),
+ _fill(' '),
+ _precision(6)
+{
+}
+
+asciistream::asciistream(const stringref & buf) :
+ _rPos(0),
+ _wbuf(),
+ _rbuf(buf),
+ _base(dec),
+ _floatSpec(automatic),
+ _floatModifier(defaultdotting),
+ _width(0),
+ _fill(' '),
+ _precision(6)
+{
+ if (buf[buf.size()] != '\0') {
+ _wbuf = buf;
+ _rbuf = _wbuf;
+ }
+}
+
+asciistream::~asciistream()
+{
+}
+
+asciistream::asciistream(const asciistream & rhs) :
+ _rPos(0),
+ _wbuf(rhs.str()),
+ _rbuf(_wbuf.c_str(), _wbuf.size()),
+ _base(rhs._base),
+ _floatSpec(rhs._floatSpec),
+ _floatModifier(rhs._floatModifier),
+ _width(rhs._width),
+ _fill(rhs._fill),
+ _precision(rhs._precision)
+{
+}
+
+asciistream & asciistream::operator = (const asciistream & rhs)
+{
+ if (this != &rhs) {
+ asciistream newStream(rhs);
+ swap(newStream);
+ }
+ return *this;
+}
+
+void asciistream::swap(asciistream & rhs)
+{
+ std::swap(_rPos, rhs._rPos);
+ std::swap(_wbuf, rhs._wbuf);
+ std::swap(_base, rhs._base);
+ std::swap(_floatSpec, rhs._floatSpec);
+ std::swap(_floatModifier, rhs._floatModifier);
+ std::swap(_width, rhs._width);
+ std::swap(_precision, rhs._precision);
+ std::swap(_fill, rhs._fill);
+ _rbuf = _wbuf;
+}
+
+namespace {
+
+int getValue(double & val, const char *buf) __attribute__((noinline));
+int getValue(float & val, const char *buf) __attribute__((noinline));
+int getValue(uint64_t & val, const char *buf) __attribute__((noinline));
+int getValue(int64_t & val, const char *buf) __attribute__((noinline));
+void throwInputError(int e, const char * t, const char * buf) __attribute__((noinline));
+void throwUnderflow(size_t pos) __attribute__((noinline));
+
+void throwInputError(int e, const char * t, const char * buf)
+{
+ if (e == 0) {
+ throw IllegalArgumentException("Failed decoding a " + string(t) + " from '" + string(buf) + "'.", VESPA_STRLOC);
+ } else if (errno == ERANGE) {
+ throw IllegalArgumentException(string(t) + " value is outside of range '" + string(buf) + "'.", VESPA_STRLOC);
+ } else if (errno == EINVAL) {
+ throw IllegalArgumentException("Illegal " + string(t) + " value '" + string(buf) + "'.", VESPA_STRLOC);
+ } else {
+ throw IllegalArgumentException("Unknown error decoding an " + string(t) + " from '" + string(buf) + "'.", VESPA_STRLOC);
+ }
+}
+
+void throwUnderflow(size_t pos)
+{
+ throw IllegalArgumentException(make_string("buffer underflow at pos %ld.", pos), VESPA_STRLOC);
+}
+
+int getValue(double & val, const char *buf)
+{
+ char *ebuf;
+ errno = 0;
+ val = strtod(buf, &ebuf);
+ if ((errno != 0) || (buf == ebuf)) {
+ throwInputError(errno, "double", buf);
+ }
+ return ebuf - buf;
+}
+
+int getValue(float & val, const char *buf)
+{
+ char *ebuf;
+ errno = 0;
+ val = strtof(buf, &ebuf);
+ if ((errno != 0) || (buf == ebuf)) {
+ throwInputError(errno, "float", buf);
+ }
+ return ebuf - buf;
+}
+
+int getValue(uint64_t & val, const char *buf)
+{
+ char *ebuf;
+ errno = 0;
+ val = strtoul(buf, &ebuf, 0);
+ if ((errno != 0) || (buf == ebuf)) {
+ throwInputError(errno, "uint64_t", buf);
+ }
+ return ebuf - buf;
+}
+
+int getValue(int64_t & val, const char *buf)
+{
+ char *ebuf;
+ errno = 0;
+ val = strtol(buf, &ebuf, 0);
+ if ((errno != 0) || (buf == ebuf)) {
+ throwInputError(errno, "int64_t", buf);
+ }
+ return ebuf - buf;
+}
+
+}
+
+asciistream & asciistream::operator >> (bool & v)
+{
+ for (;(_rPos < length()) && std::isspace(_rbuf[_rPos]); _rPos++);
+ if (_rPos < length()) {
+ v = (_rbuf[_rPos++] != '0');
+ } else {
+ throwUnderflow(_rPos);
+ }
+ return *this;
+}
+
+asciistream & asciistream::operator >> (char & v)
+{
+ for (;(_rPos < length()) && std::isspace(_rbuf[_rPos]); _rPos++);
+ if (_rPos < length()) {
+ v = _rbuf[_rPos++];
+ } else {
+ throwUnderflow(_rPos);
+ }
+ return *this;
+}
+
+asciistream & asciistream::operator >> (unsigned char & v)
+{
+ for (;(_rPos < length()) && std::isspace(_rbuf[_rPos]); _rPos++);
+ if (_rPos < length()) {
+ v = _rbuf[_rPos++];
+ } else {
+ throwUnderflow(_rPos);
+ }
+ return *this;
+}
+
+asciistream & asciistream::operator >> (uint16_t & v)
+{
+ uint64_t l(0);
+ size_t r = getValue(l, &_rbuf[_rPos]);
+ if (l > std::numeric_limits<uint16_t>::max()) {
+ throw IllegalArgumentException(make_string("An uint16_t can not represent '%ld'.", l), VESPA_STRLOC);
+ }
+ _rPos += r;
+ v = l;
+ return *this;
+}
+
+asciistream & asciistream::operator >> (uint32_t & v)
+{
+ uint64_t l(0);
+ size_t r = getValue(l, &_rbuf[_rPos]);
+ if (l > std::numeric_limits<uint32_t>::max()) {
+ throw IllegalArgumentException(make_string("An uint32_t can not represent '%ld'.", l), VESPA_STRLOC);
+ }
+ _rPos += r;
+ v = l;
+ return *this;
+}
+
+asciistream & asciistream::operator >> (uint64_t & v)
+{
+ uint64_t l(0);
+ _rPos += getValue(l, &_rbuf[_rPos]);
+ v = l;
+ return *this;
+}
+
+asciistream & asciistream::operator >> (int16_t & v)
+{
+ int64_t l(0);
+ size_t r = getValue(l, &_rbuf[_rPos]);
+ if ((l < std::numeric_limits<int16_t>::min()) || (l > std::numeric_limits<int16_t>::max())) {
+ throw IllegalArgumentException(make_string("An int16_t can not represent '%ld'.", l), VESPA_STRLOC);
+ }
+ _rPos += r;
+ v = l;
+ return *this;
+}
+
+asciistream & asciistream::operator >> (int32_t & v)
+{
+ int64_t l(0);
+ size_t r = getValue(l, &_rbuf[_rPos]);
+ if ((l < std::numeric_limits<int32_t>::min()) || (l > std::numeric_limits<int32_t>::max())) {
+ throw IllegalArgumentException(make_string("An int32_t can not represent '%ld'.", l), VESPA_STRLOC);
+ }
+ _rPos += r;
+ v = l;
+ return *this;
+}
+
+asciistream & asciistream::operator >> (int64_t & v)
+{
+ int64_t l(0);
+ _rPos += getValue(l, &_rbuf[_rPos]);
+ v = l;
+ return *this;
+}
+
+asciistream & asciistream::operator >> (double & v)
+{
+ double l(0);
+ _rPos += getValue(l, &_rbuf[_rPos]);
+ v = l;
+ return *this;
+}
+
+asciistream & asciistream::operator >> (float & v)
+{
+ float l(0);
+ _rPos += getValue(l, &_rbuf[_rPos]);
+ v = l;
+ return *this;
+}
+
+void asciistream::eatWhite()
+{
+ for (;(_rPos < length()) && isspace(_rbuf[_rPos]); _rPos++);
+}
+
+void asciistream::eatNonWhite()
+{
+ for (;(_rPos < length()) && !isspace(_rbuf[_rPos]); _rPos++);
+}
+
+asciistream & asciistream::operator >> (std::string & v)
+{
+ eatWhite();
+ size_t start(_rPos);
+ eatNonWhite();
+ v.assign(&_rbuf[start], _rPos-start);
+ return *this;
+}
+
+asciistream & asciistream::operator >> (string & v)
+{
+ eatWhite();
+ size_t start(_rPos);
+ eatNonWhite();
+ v.assign(&_rbuf[start], _rPos-start);
+ return *this;
+}
+
+
+namespace {
+const char * _C_char = "0123456789abcdefg";
+
+char * prependInt(char * tmp, Base base)
+{
+ if (base == bin) {
+ tmp[1] = 'b';
+ tmp[0] = '0';
+ return tmp;
+ }
+ return tmp + 2;
+}
+
+char * prependSign(bool sign, char * tmp)
+{
+ if (sign) {
+ tmp[0] = '-';
+ return tmp;
+ }
+ return tmp + 1;
+}
+
+template <uint8_t base>
+uint8_t printInt(uint64_t r, char * tmp, uint8_t i) __attribute__((noinline));
+
+template <uint8_t base>
+uint8_t printInt(uint64_t r, char * tmp, uint8_t i)
+{
+ for(; r; i--, r/=base) {
+ uint8_t d = r%base;
+ tmp[i-1] = (base <= 10) ? d + '0' : _C_char[d];
+ }
+ return i;
+}
+
+}
+
+
+asciistream & asciistream::operator << (int64_t v)
+{
+ char tmp[72];
+ uint8_t i(sizeof(tmp));
+ bool negative(false);
+ if (v == 0) {
+ tmp[--i] = '0';
+ } else {
+ if (v < 0) {
+ v = -v;
+ negative = true;
+ }
+ switch (_base) {
+ case 2:
+ i = printInt<2>(v, tmp, i); break;
+ case 8:
+ i = printInt<8>(v, tmp, i); break;
+ case 10:
+ i = printInt<10>(v, tmp, i); break;
+ case 16:
+ i = printInt<16>(v, tmp, i); break;
+ default:
+ assert(!"unhandled number base");
+ }
+ }
+ const char *final = prependSign(negative, prependInt(tmp+i-2, _base)-1);
+ doFill(sizeof(tmp)-(final-tmp));
+ write(final, sizeof(tmp)-(final-tmp));
+ return *this;
+}
+
+void asciistream::doReallyFill(size_t currWidth)
+{
+ for (; _width > currWidth; currWidth++) {
+ write(&_fill, 1);
+ }
+}
+
+asciistream & asciistream::operator << (uint64_t v)
+{
+ char tmp[72];
+ uint8_t i(sizeof(tmp));
+ if (v == 0) {
+ tmp[--i] = '0';
+ } else {
+ switch (_base) {
+ case 2:
+ i = printInt<2>(v, tmp, i); break;
+ case 8:
+ i = printInt<8>(v, tmp, i); break;
+ case 10:
+ i = printInt<10>(v, tmp, i); break;
+ case 16:
+ i = printInt<16>(v, tmp, i); break;
+ default:
+ assert(!"unhandled number base");
+ }
+ }
+ const char *final = prependInt(tmp+i-2, _base);
+ doFill(sizeof(tmp)-(final-tmp));
+ write(final, sizeof(tmp)-(final-tmp));
+ return *this;
+}
+
+namespace {
+struct BaseStateSaver {
+ asciistream& _stream;
+ Base _savedBase;
+ BaseStateSaver(asciistream& stream, Base base)
+ : _stream(stream), _savedBase(base) {}
+ ~BaseStateSaver() {
+ _stream << Base(_savedBase);
+ }
+};
+}
+
+asciistream& asciistream::operator<<(const void* p)
+{
+ BaseStateSaver saver(*this, _base);
+ return *this << "0x" << hex << reinterpret_cast<uint64_t>(p);
+}
+
+asciistream & asciistream::operator << (float v)
+{
+ if ((_floatSpec == fixed)) {
+ printFixed(v);
+ } else {
+ printScientific(v);
+ }
+ return *this;
+}
+
+asciistream & asciistream::operator << (double v)
+{
+ if ((_floatSpec == fixed)) {
+ printFixed(v);
+ } else {
+ printScientific(v);
+ }
+ return *this;
+}
+
+template <typename T>
+void asciistream::printFixed(T v)
+{
+ char tmp[sizeof(T)*64]; // Double::max printed fixed takes 316 bytes with default
+ // precision, a high precision adds even more.
+ const char *spec = fixedPrecisions[_precision].c_str();
+ int len = snprintf(tmp, sizeof(tmp), spec, v);
+ assert(len < static_cast<int>(sizeof(tmp)));
+ doFill(len);
+ write(tmp, len);
+}
+
+namespace {
+ bool hasDotOrIsScientific(const char* string, size_t len) {
+ for (size_t i=0; i<len; ++i) {
+ switch (string[i]) {
+ case '.':
+ case ',':
+ case 'e':
+ case 'E':
+ return true;
+ default:
+ break;
+ }
+ }
+ return false;
+ }
+}
+
+template <typename T>
+void asciistream::printScientific(T v)
+{
+ char tmp[sizeof(T)*8];
+ const char *spec = (((_floatSpec == scientific)
+ ? scientificPrecisions[_precision]
+ : autoPrecisions[_precision])).c_str();
+ int len = snprintf(tmp, sizeof(tmp), spec, v);
+ assert(len < static_cast<int>(sizeof(tmp)));
+ doFill(len);
+ write(tmp, len);
+ if (_floatModifier == forcedot && !hasDotOrIsScientific(tmp, len)) {
+ write(".0", 2);
+ }
+}
+
+void asciistream::write(const void * buf, size_t len)
+{
+ if (_rPos > 0 && _rPos == length()) {
+ clear();
+ }
+ if (_rbuf.c_str() != _wbuf.c_str()) {
+ if (_wbuf.empty()) {
+ _wbuf = _rbuf; // Read only to RW
+ } else {
+ abort(); // Impossible
+ }
+ }
+ _wbuf.append(buf, len);
+ _rbuf = _wbuf;
+}
+
+std::vector<string> asciistream::getlines(char delim)
+{
+ std::vector<string> lines;
+ while (!eof()) {
+ lines.push_back(getline(delim));
+ }
+ return lines;
+}
+
+string asciistream::getline(char delim)
+{
+ string line;
+ const size_t start(_rPos);
+ const size_t end(_rbuf.size());
+ for (; (_rPos < end) && (_rbuf[_rPos] != delim); _rPos++);
+ if (_rPos > start) {
+ line.assign(&_rbuf[start], _rPos - start);
+ }
+ if (_rPos < end) {
+ _rPos++; // eat the terminating\n
+ }
+ return line;
+}
+
+asciistream asciistream::createFromFile(const stringref & fileName)
+{
+ FastOS_File file(fileName.c_str());
+ asciistream is;
+ if (file.OpenReadOnly()) {
+ ssize_t sz = file.getSize();
+ if (sz < 0) {
+ throw IoException("Failed getting size of file " + fileName + " : Error=" + file.getLastErrorString(), IoException::UNSPECIFIED, VESPA_STRLOC);
+ }
+ MallocPtr buf(sz);
+ ssize_t actual = file.Read(buf, sz);
+ if (actual != sz) {
+ asciistream e;
+ e << "Failed reading " << sz << " bytes from file " << fileName;
+ throw IoException(e.str() + " : Error=" + file.getLastErrorString(), IoException::UNSPECIFIED, VESPA_STRLOC);
+ }
+ is << stringref(buf.c_str(), buf.size());
+ }
+ return is;
+}
+
+asciistream asciistream::createFromDevice(const stringref & fileName)
+{
+ FastOS_File file(fileName.c_str());
+ asciistream is;
+ if (file.OpenReadOnly()) {
+ char buf[8192];
+ for (ssize_t actual = file.Read(buf, sizeof(buf)); actual > 0; actual = file.Read(buf, sizeof(buf))) {
+ is << stringref(buf, actual);
+ }
+ }
+ return is;
+}
+
+ssize_t getline(asciistream & is, string & line, char delim)
+{
+ line = is.getline(delim);
+ return line.size();
+}
+
+
+}
diff --git a/vespalib/src/vespa/vespalib/stllike/asciistream.h b/vespalib/src/vespa/vespalib/stllike/asciistream.h
new file mode 100644
index 00000000000..4e7ad81d205
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/asciistream.h
@@ -0,0 +1,148 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include <string>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+///Modifiers to make usage similar to std::stream
+enum Base {bin=2, oct=8, dec=10, hex=16};
+
+///Modifiers to make usage similar to std::stream
+enum FloatSpec {automatic, fixed, scientific};
+
+enum FloatModifier {defaultdotting, forcedot};
+
+#define VESPALIB_ASCIISTREAM_MAX_PRECISION 32
+
+/**
+ * This is a simple stream intended for building strings the stream
+ * way. Everything is streamed into an underlying memory buffer that
+ * can be retrieved as a string. It is supposed to be compliant to the
+ * std::stringstream API. The stream has both a read and a write
+ * pointer, so it can be used for both input and output.
+ *
+ * However it is considerably more lightweight than the std::stream
+ * variant. It does not support 'locale' and other expensive stuff;
+ * and can be seen as "convenience without sacrificing speed".
+*/
+class asciistream
+{
+public:
+ asciistream();
+ asciistream(const stringref & buf);
+ ~asciistream();
+ asciistream(const asciistream & rhs);
+ asciistream & operator = (const asciistream & rhs);
+ void swap(asciistream & rhs);
+ asciistream & operator << (bool v) { if (v) { *this << '1'; } else { *this << '0'; } return *this; }
+ asciistream & operator << (char v) { doFill(1); write(&v, 1); return *this; }
+ asciistream & operator << (unsigned char v) { doFill(1); write(&v, 1); return *this; }
+ asciistream & operator << (const char * v) { if (v != NULL) { size_t n(strlen(v)); doFill(n); write(v, n); } return *this; }
+ asciistream & operator << (const string & v) { doFill(v.size()); write(v.c_str(), v.size()); return *this; }
+ asciistream & operator << (const stringref & v) { doFill(v.size()); write(v.c_str(), v.size()); return *this; }
+ asciistream & operator << (const std::string & v) { doFill(v.size()); write(v.c_str(), v.size()); return *this; }
+ asciistream & operator << (int16_t v) { return *this << static_cast<int64_t>(v); }
+ asciistream & operator << (uint16_t v) { return *this << static_cast<uint64_t>(v); }
+ asciistream & operator << (int32_t v) { return *this << static_cast<int64_t>(v); }
+ asciistream & operator << (uint32_t v) { return *this << static_cast<uint64_t>(v); }
+ asciistream & operator << (const void* p);
+ asciistream & operator << (int64_t v);
+ asciistream & operator << (uint64_t v);
+ asciistream & operator << (float v);
+ asciistream & operator << (double v);
+ asciistream & operator << (Base v) { _base = v; return *this; }
+ asciistream & operator >> (Base v) { _base = v; return *this; }
+ asciistream & operator << (FloatSpec v) { _floatSpec = v; return *this; }
+ asciistream & operator >> (FloatSpec v) { _floatSpec = v; return *this; }
+ asciistream & operator << (FloatModifier v) { _floatModifier = v; return *this; }
+ asciistream & operator >> (FloatModifier v) { _floatModifier = v; return *this; }
+ asciistream & operator >> (bool & v);
+ asciistream & operator >> (char & v);
+ asciistream & operator >> (unsigned char & v);
+ asciistream & operator >> (std::string & v);
+ asciistream & operator >> (string & v);
+ asciistream & operator >> (uint16_t & v);
+ asciistream & operator >> (int16_t & v);
+ asciistream & operator >> (int32_t & v);
+ asciistream & operator >> (uint32_t & v);
+ asciistream & operator >> (int64_t & v);
+ asciistream & operator >> (uint64_t & v);
+ asciistream & operator >> (float & v);
+ asciistream & operator >> (double & v);
+ stringref str() const { return stringref(c_str(), size()); }
+ const char * c_str() const { return _rbuf.c_str() + _rPos; }
+ size_t size() const { return length() - _rPos; }
+ bool empty() const { return size() == 0; }
+ bool eof() const { return empty(); }
+ bool fail() const { return false; }
+ size_t capacity() const { return _wbuf.capacity(); }
+ void clear() { _rPos = 0; _wbuf.clear(); _rbuf = _wbuf; }
+ class Width {
+ public:
+ Width(size_t width) : _width(width) { }
+ size_t getWidth() const { return _width; }
+ private:
+ uint32_t _width;
+ };
+ class Fill {
+ public:
+ Fill(char fill) : _fill(fill) { }
+ char getFill() const { return _fill; }
+ private:
+ char _fill;
+ };
+ class Precision {
+ public:
+ Precision(size_t precision) : _precision(precision) { }
+ size_t getPrecision() const { return _precision; }
+ private:
+ uint32_t _precision;
+ };
+ asciistream & operator << (Width v) { _width = v.getWidth(); return *this; }
+ asciistream & operator >> (Width v) { _width = v.getWidth(); return *this; }
+ asciistream & operator << (Fill v) { _fill = v.getFill(); return *this; }
+ asciistream & operator >> (Fill v) { _fill = v.getFill(); return *this; }
+ asciistream & operator << (Precision v) { assert(v.getPrecision() <= VESPALIB_ASCIISTREAM_MAX_PRECISION); _precision = v.getPrecision(); return *this; }
+ asciistream & operator >> (Precision v) { assert(v.getPrecision() <= VESPALIB_ASCIISTREAM_MAX_PRECISION); _precision = v.getPrecision(); return *this; }
+ void eatWhite();
+ static asciistream createFromFile(const vespalib::stringref & fileName);
+ static asciistream createFromDevice(const vespalib::stringref & fileName);
+ string getline(char delim='\n');
+ std::vector<string> getlines(char delim='\n');
+private:
+ template <typename T>
+ void printFixed(T v) __attribute__((noinline));
+ template <typename T>
+ void printScientific(T v) __attribute__((noinline));
+ void eatNonWhite();
+ void doReallyFill(size_t currWidth);
+ void doFill(size_t currWidth) {
+ if (_width > currWidth) {
+ doReallyFill(currWidth);
+ }
+ _width = 0;
+ }
+ void write(const void * buf, size_t len);
+ size_t length() const { return _rbuf.size(); }
+ size_t _rPos;
+ string _wbuf;
+ stringref _rbuf;
+ Base _base;
+ FloatSpec _floatSpec;
+ FloatModifier _floatModifier;
+ uint32_t _width;
+ char _fill;
+ uint8_t _precision;
+};
+
+ssize_t getline(asciistream & is, vespalib::string & line, char delim='\n');
+
+inline asciistream::Width setw(size_t v) { return asciistream::Width(v); }
+inline asciistream::Fill setfill(char v) { return asciistream::Fill(v); }
+inline asciistream::Precision setprecision(size_t v) { return asciistream::Precision(v); }
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/stllike/hash_fun.h b/vespalib/src/vespa/vespalib/stllike/hash_fun.h
new file mode 100644
index 00000000000..6a7533f8298
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/hash_fun.h
@@ -0,0 +1,92 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <string>
+#include <stdint.h>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+template<typename K> struct hash {
+ // specializations operate as functor for known key types
+ size_t operator() (const K & v) const {
+ return v.hash();
+ }
+};
+
+template<> struct hash<char> {
+ size_t operator() (char arg) const { return arg; }
+};
+template<> struct hash<int8_t> {
+ size_t operator() (int8_t arg) const { return arg; }
+};
+template<> struct hash<int16_t> {
+ size_t operator() (int16_t arg) const { return arg; }
+};
+template<> struct hash<int32_t> {
+ size_t operator() (int32_t arg) const { return arg; }
+};
+template<> struct hash<int64_t> {
+ size_t operator() (int64_t arg) const { return arg; }
+};
+
+template<> struct hash<uint8_t> {
+ size_t operator() (uint8_t arg) const { return arg; }
+};
+template<> struct hash<uint16_t> {
+ size_t operator() (uint16_t arg) const { return arg; }
+};
+template<> struct hash<uint32_t> {
+ size_t operator() (uint32_t arg) const { return arg; }
+};
+template<> struct hash<uint64_t> {
+ size_t operator() (uint64_t arg) const { return arg; }
+};
+
+template<> struct hash<float> {
+ union U { float f; uint32_t i; };
+ size_t operator() (float arg) const { U t; t.f = arg; return t.i; }
+};
+template<> struct hash<double> {
+ union U { double f; uint64_t i; };
+ size_t operator() (double arg) const { U t; t.f = arg; return t.i; }
+};
+
+template<typename T> struct hash<T *> {
+ size_t operator() (const T * arg) const { return size_t(arg); }
+};
+template<typename T> struct hash<const T *> {
+ size_t operator() (const T * arg) const { return size_t(arg); }
+};
+
+// reuse old string hash function
+extern size_t hashValue(const char *str);
+extern size_t hashValue(const void *str, size_t sz);
+
+template<> struct hash<const char *> {
+ size_t operator() (const char * arg) const { return hashValue(arg); }
+};
+
+template<> struct hash<vespalib::stringref> {
+ size_t operator() (const vespalib::stringref & arg) const { return hashValue(arg.c_str(), arg.size()); }
+};
+
+template<> struct hash<vespalib::string> {
+ size_t operator() (const vespalib::string & arg) const { return hashValue(arg.c_str()); }
+};
+
+template<> struct hash<std::string> {
+ size_t operator() (const std::string& arg) const { return hashValue(arg.c_str()); }
+};
+
+template<typename V> struct size {
+ size_t operator() (const V & arg) const { return arg.size(); }
+};
+
+template<typename V> struct zero {
+ size_t operator() (const V & ) const { return 0; }
+};
+
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/stllike/hash_map.h b/vespalib/src/vespa/vespalib/stllike/hash_map.h
new file mode 100644
index 00000000000..22f352fcd99
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/hash_map.h
@@ -0,0 +1,79 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/hashtable.h>
+
+namespace vespalib {
+
+template< typename K, typename V, typename H = vespalib::hash<K>, typename EQ = std::equal_to<K>, typename M=hashtable_base::prime_modulator >
+class hash_map
+{
+public:
+ typedef std::pair<K, V> value_type;
+ typedef K key_type;
+ typedef V mapped_type;
+private:
+ typedef hashtable< K, value_type, H, EQ, std::_Select1st< value_type >, M > HashTable;
+ HashTable _ht;
+public:
+ typedef typename HashTable::iterator iterator;
+ typedef typename HashTable::const_iterator const_iterator;
+ typedef typename HashTable::insert_result insert_result;
+public:
+ hash_map(size_t reserveSize=0) : _ht(reserveSize) { }
+ iterator begin() { return _ht.begin(); }
+ iterator end() { return _ht.end(); }
+ const_iterator begin() const { return _ht.begin(); }
+ const_iterator end() const { return _ht.end(); }
+ size_t capacity() const { return _ht.capacity(); }
+ size_t size() const { return _ht.size(); }
+ bool empty() const { return _ht.empty(); }
+ insert_result insert(const value_type & value) { return _ht.insert(value); }
+ template <typename InputIt>
+ void insert(InputIt first, InputIt last);
+ const V & operator [] (const K & key) const { return _ht.find(key)->second; }
+ V & operator [] (const K & key) { return _ht.insert(value_type(key, V())).first->second; }
+ void erase(const K & key) { return _ht.erase(key); }
+ void erase(iterator it) { return _ht.erase(it->first); }
+ void erase(const_iterator it) { return _ht.erase(it->first); }
+ iterator find(const K & key) { return _ht.find(key); }
+ const_iterator find(const K & key) const { return _ht.find(key); }
+ void clear() { _ht.clear(); }
+ void resize(size_t newSize) { _ht.resize(newSize); }
+ void swap(hash_map & rhs) { _ht.swap(rhs._ht); }
+ bool operator == (const hash_map & rhs) const;
+ size_t getMemoryConsumption() const { return _ht.getMemoryConsumption(); }
+ size_t getMemoryUsed() const { return _ht.getMemoryUsed(); }
+};
+
+template <typename K, typename V, typename H, typename EQ, typename M>
+bool hash_map<K, V, H, EQ, M>::operator ==(const hash_map & rhs) const {
+ bool identical(rhs.size() == size());
+ if (identical) {
+ for(const_iterator at(begin()), mat(end()); identical && at != mat; at++) {
+ const_iterator bt = rhs.find(at->first);
+ identical = (bt != rhs.end()) && (*at == *bt);
+ }
+ }
+ return identical;
+}
+
+template <typename K, typename V, typename H, typename EQ, typename M>
+template <typename InputIt>
+void hash_map<K, V, H, EQ, M>::insert(InputIt first, InputIt last) {
+ while (first != last) {
+ _ht.insert(*first);
+ ++first;
+ }
+}
+
+template< typename K, typename V, typename H, typename EQ, typename M >
+void swap(hash_map<K, V, H, EQ, M> & a, hash_map<K, V, H, EQ, M> & b)
+{
+ a.swap(b);
+}
+
+
+}
+
+
diff --git a/vespalib/src/vespa/vespalib/stllike/hash_set.h b/vespalib/src/vespa/vespalib/stllike/hash_set.h
new file mode 100644
index 00000000000..ff7049b7784
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/hash_set.h
@@ -0,0 +1,97 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/hashtable.h>
+#include <initializer_list>
+
+namespace vespalib {
+
+template< typename K, typename H = vespalib::hash<K>, typename EQ = std::equal_to<K>, typename M=hashtable_base::prime_modulator>
+class hash_set
+{
+private:
+ typedef hashtable< K, K, H, EQ, std::_Identity<K>, M> HashTable;
+ HashTable _ht;
+public:
+ typedef typename HashTable::iterator iterator;
+ typedef typename HashTable::const_iterator const_iterator;
+ typedef typename HashTable::insert_result insert_result;
+public:
+ hash_set(size_t reserveSize=0) : _ht(reserveSize) { }
+ hash_set(size_t reserveSize, const H & hasher, const EQ & equal) : _ht(reserveSize, hasher, equal) { }
+ template <typename InputIterator>
+ hash_set(InputIterator first, InputIterator last)
+ : _ht(0)
+ {
+ insert(first, last);
+ }
+ hash_set(std::initializer_list<K> input)
+ : _ht(0)
+ {
+ insert(input.begin(), input.end());
+ }
+ iterator begin() { return _ht.begin(); }
+ iterator end() { return _ht.end(); }
+ const_iterator begin() const { return _ht.begin(); }
+ const_iterator end() const { return _ht.end(); }
+ size_t capacity() const { return _ht.capacity(); }
+ size_t size() const { return _ht.size(); }
+ bool empty() const { return _ht.empty(); }
+ insert_result insert(const K & value) { return _ht.insert(value); }
+ template<typename InputIt>
+ void insert(InputIt first, InputIt last) {
+ _ht.resize(last-first + capacity());
+ for(;first < last; first++) {
+ _ht.insert(*first);
+ }
+ }
+ void erase(const K & key) { return _ht.erase(key); }
+ void erase(const iterator & it) { return _ht.erase(it); }
+ iterator find(const K & key) { return _ht.find(key); }
+ const_iterator find(const K & key) const { return _ht.find(key); }
+
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ const_iterator find(const AltKey & key) const { return _ht.template find<AltKey, AltExtract, AltHash, AltEqual>(key); }
+
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ iterator find(const AltKey & key) { return _ht.template find<AltKey, AltExtract, AltHash, AltEqual>(key); }
+
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ const_iterator find(const AltKey & key, const AltExtract & altExtract) const {
+ return _ht.template find<AltKey, AltExtract, AltHash, AltEqual>(key, altExtract);
+ }
+
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ iterator find(const AltKey & key, const AltExtract & altExtract) {
+ return _ht.template find<AltKey, AltExtract, AltHash, AltEqual>(key, altExtract);
+ }
+
+ void clear() { _ht.clear(); }
+ void resize(size_t newSize) { _ht.resize(newSize); }
+ void swap(hash_set & rhs) { _ht.swap(rhs._ht); }
+
+ bool operator==(const hash_set &rhs) const {
+ bool equal = (size() == rhs.size());
+ if (equal) {
+ for (auto itr = begin(), endItr = end(); equal && itr != endItr; ++itr) {
+ equal = (rhs.find(*itr) != rhs.end());
+ }
+ }
+ return equal;
+ }
+
+ /**
+ * Get an approximate number of memory consumed by hash set. Not including
+ * any data K would store outside of sizeof(K) of course.
+ */
+ size_t getMemoryConsumption() const { return _ht.getMemoryConsumption(); }
+};
+
+template< typename K, typename H, typename EQ, typename M >
+void swap(hash_set<K, H, EQ, M> & a, hash_set<K, H, EQ, M> & b)
+{
+ a.swap(b);
+}
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/stllike/hashtable.cpp b/vespalib/src/vespa/vespalib/stllike/hashtable.cpp
new file mode 100644
index 00000000000..e2da6b255af
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/hashtable.cpp
@@ -0,0 +1,54 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/stllike/hashtable.h>
+
+namespace {
+
+static const unsigned long __stl_prime_list[] =
+{
+ 7ul, 17ul, 53ul, 97ul, 193ul,
+ 389ul, 769ul, 1543ul, 3079ul, 6151ul,
+ 12289ul, 24593ul, 49157ul, 98317ul, 196613ul,
+ 393241ul, 786433ul, 1572869ul, 3145739ul, 6291469ul,
+ 12582917ul, 25165843ul, 50331653ul, 100663319ul, 201326611ul,
+ 402653189ul, 805306457ul, 1610612741ul, 3221225473ul, 4294967291ul
+};
+
+static const unsigned long __simple_modulator_list[] =
+{
+ 0x8ul,
+ 0x10ul, 0x20ul, 0x40ul, 0x80ul,
+ 0x100ul, 0x200ul, 0x400ul, 0x800ul,
+ 0x1000ul, 0x2000ul, 0x4000ul, 0x8000ul,
+ 0x10000ul, 0x20000ul, 0x40000ul, 0x80000ul,
+ 0x100000ul, 0x200000ul, 0x400000ul, 0x800000ul,
+ 0x1000000ul, 0x2000000ul, 0x4000000ul, 0x8000000ul,
+ 0x10000000ul, 0x20000000ul, 0x40000000ul, 0x80000000ul,
+ 0x100000000ul
+};
+
+}
+
+namespace vespalib {
+
+size_t
+hashtable_base::getModulo(size_t newSize, const unsigned long * list, size_t sz)
+{
+ const unsigned long* first = list;
+ const unsigned long* last = list + sz;
+ const unsigned long* pos = std::lower_bound(first, last, newSize);
+ return (pos == last) ? *(last - 1) : *pos;
+}
+
+size_t
+hashtable_base::getModuloStl(size_t newSize)
+{
+ return getModulo(newSize, __stl_prime_list, sizeof(__stl_prime_list)/sizeof(__stl_prime_list[0]));
+}
+
+size_t
+hashtable_base::getModuloSimple(size_t newSize)
+{
+ return getModulo(newSize, __simple_modulator_list, sizeof(__simple_modulator_list)/sizeof(__simple_modulator_list[0]));
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/stllike/hashtable.h b/vespalib/src/vespa/vespalib/stllike/hashtable.h
new file mode 100644
index 00000000000..6515f30bf57
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/hashtable.h
@@ -0,0 +1,554 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vector>
+#include <iterator>
+#include <cstddef>
+#include <bits/stl_algo.h>
+#include <bits/stl_function.h>
+#include <vespa/vespalib/util/array.h>
+
+#include "hash_fun.h"
+
+namespace vespalib {
+
+/**
+ Yet another hashtable implementation. This one is justified by
+ different memory management.
+
+ The interface is tried to keep similar to stl version. However the
+ are some major differences. In order to avoid an allocation /
+ deallocation for every object inserted / erased, it stores all
+ objects in a std::vector. This should significantly speed up
+ things. However it does remove properties that the stl versions
+ have. The most obvious is that insert might invalidate iterators.
+ That is due to possible resizing of memory store. That can be
+ avoided by using a deque. However a deque is more complex and will
+ be slower. Since speed is here preferred over functionality that is
+ not yet done.
+ The same trick could be done for tree based map/set.
+ An entry can be valid or invalid(not set, or erased).
+ The entry contains the element + a next index.
+
+ After selecting the proper prime number for modulo operation, the
+ vector reserves requested space. Resize (triggered by full vector)
+ doubles size. Then the first 'prime' entries are initialized to
+ invalid. Then the objects are filled in. If the selected bucket is
+ invalid the element is inserted directly. If not it is
+ 'push_back'ed, on the vector and linked in after the head element
+ for that bucket. Erased elements are marked invalid, but not
+ reused. They are reclaimed on resize.
+
+ Advantage:
+ - Significantly faster insert on average. No alloc/dealloc per element.
+ Disadvantage:
+ - insert spikes due to possible resize.
+ - not fully stl-compliant.
+ Conclusion:
+ - Probably very good for typical use. Fx duplicate removal.
+ Advice:
+ - If you know how many elements you are going to put in, construct
+ the hash with 2 times the amount. Since a hash will never be
+ fully filled.
+ ( hash_set<T>(2*num_expected_elements) ).
+**/
+
+class hashtable_base
+{
+public:
+ typedef unsigned int next_t;
+ /**
+ * This is a standard modulator that does modulo/hashTableSize.
+ * Hashtable size is selected from a a set of prime numbers.
+ **/
+ class prime_modulator
+ {
+ public:
+ prime_modulator(next_t sizeOfHashTable) : _modulo(sizeOfHashTable) { }
+ next_t modulo(next_t hash) const { return hash % _modulo; }
+ next_t getTableSize() const { return _modulo; }
+ static next_t selectHashTableSize(size_t sz) { return hashtable_base::getModuloStl(sz); }
+ private:
+ next_t _modulo;
+ };
+ /**
+ * This is a simple and fast modulator that uses simple and by hashTableSize-1.
+ * Hashtable size is selected by selecting the next 2^N that fits the requested size.
+ **/
+ class and_modulator
+ {
+ public:
+ and_modulator(next_t sizeOfHashTable) : _mask(sizeOfHashTable-1) { }
+ next_t modulo(next_t hash) const { return hash & _mask; }
+ next_t getTableSize() const { return _mask + 1; }
+ static next_t selectHashTableSize(size_t sz) { return hashtable_base::getModuloSimple(sz); }
+ private:
+ next_t _mask;
+ };
+protected:
+ struct DefaultMoveHandler
+ {
+ void move(next_t from, next_t to) {
+ (void) from;
+ (void) to;
+ }
+ };
+private:
+ static size_t getModuloStl(size_t newSize);
+ static size_t getModuloSimple(size_t newSize);
+ static size_t getModulo(size_t newSize, const unsigned long * list, size_t sz);
+};
+
+template<typename V>
+class hash_node {
+public:
+ using next_t=hashtable_base::next_t;
+ enum {npos=-1u, invalid=-2u};
+ hash_node() : _next(invalid) {}
+ hash_node(const V & node, next_t next=npos)
+ : _next(next), _node(node) {}
+ hash_node(V &&node, next_t next=npos)
+ : _next(next), _node(std::move(node)) {}
+ hash_node(hash_node &&) = default;
+ hash_node &operator=(hash_node &&) = default;
+ hash_node(const hash_node &) = default; // These will not be created
+ hash_node &operator=(const hash_node &) = default; // if V is non-copyable.
+ V & getValue() { return _node; }
+ const V & getValue() const { return _node; }
+ next_t getNext() const { return _next; }
+ void setNext(next_t next) { _next = next; }
+ void invalidate() { _next = invalid; _node = V(); }
+ void terminate() { _next = npos; }
+ bool valid() const { return _next != invalid; }
+ bool hasNext() const { return valid() && (_next != npos); }
+ void swap(hash_node & rhs) {
+ std::swap(_next, rhs._next);
+ std::swap(_node, rhs._node);
+ }
+private:
+ next_t _next;
+ V _node;
+};
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator = hashtable_base::prime_modulator>
+class hashtable : public hashtable_base
+{
+private:
+ using Node=hash_node<Value>;
+protected:
+ typedef vespalib::Array<Node, vespalib::DefaultAlloc > NodeStore;
+ virtual void move(NodeStore && oldStore);
+public:
+ class const_iterator;
+ class iterator {
+ public:
+ typedef std::ptrdiff_t difference_type;
+ typedef Value value_type;
+ typedef Value& reference;
+ typedef Value* pointer;
+ typedef std::forward_iterator_tag iterator_category;
+
+ iterator(hashtable * hash, next_t start) : _hash(start), _subNode(start), _hashTable(hash) {
+ advanceToNextValidHash();
+ }
+ iterator(hashtable * hash, next_t start, next_t subNode) : _hash(start), _subNode(subNode), _hashTable(hash) { }
+ Value & operator * () const { return _hashTable->get(_subNode); }
+ Value * operator -> () const { return & _hashTable->get(_subNode); }
+ iterator & operator ++ () {
+ if (_hashTable->_nodes[_subNode].hasNext()) {
+ _subNode = _hashTable->_nodes[_subNode].getNext();
+ } else {
+ _hash++;
+ advanceToNextValidHash();
+ }
+ return *this;
+ }
+ iterator operator ++ (int) {
+ iterator prev = *this;
+ ++(*this);
+ return prev;
+ }
+ bool operator==(const iterator& rhs) const { return (_subNode == rhs._subNode); }
+ bool operator!=(const iterator& rhs) const { return (_subNode != rhs._subNode); }
+ /// Carefull about this one. Only used by lrucache.
+ next_t getInternalIndex() const { return _subNode; }
+ void setInternalIndex(next_t n) { _subNode = n; }
+ next_t getHash() const { return _hash; }
+ private:
+ void advanceToNextValidHash() {
+ for (;(_hash < _hashTable->getTableSize()) && ! _hashTable->_nodes[_hash].valid(); _hash++) { }
+ _subNode = (_hash < _hashTable->getTableSize()) ? _hash : Node::npos;
+ }
+ next_t _hash;
+ next_t _subNode;
+ hashtable * _hashTable;
+
+ friend class hashtable::const_iterator;
+ };
+ class const_iterator {
+ public:
+ typedef std::ptrdiff_t difference_type;
+ typedef const Value value_type;
+ typedef const Value& reference;
+ typedef const Value* pointer;
+ typedef std::forward_iterator_tag iterator_category;
+
+ const_iterator(const hashtable * hash, next_t start) : _hash(start), _subNode(start), _hashTable(hash) {
+ advanceToNextValidHash();
+ }
+ const_iterator(const hashtable * hash, next_t start, next_t subNode) : _hash(start), _subNode(subNode), _hashTable(hash) { }
+ const_iterator(const iterator &i)
+ : _hash(i._hash), _subNode(i._subNode), _hashTable(i._hashTable) {}
+ const Value & operator * () const { return _hashTable->get(_subNode); }
+ const Value * operator -> () const { return & _hashTable->get(_subNode); }
+ const_iterator & operator ++ () {
+ if (_hashTable->_nodes[_subNode].hasNext()) {
+ _subNode = _hashTable->_nodes[_subNode].getNext();
+ } else {
+ _hash++;
+ advanceToNextValidHash();
+ }
+ return *this;
+ }
+ const_iterator operator ++ (int) {
+ const_iterator prev = *this;
+ ++(*this);
+ return prev;
+ }
+ bool operator==(const const_iterator& rhs) const { return (_subNode == rhs._subNode); }
+ bool operator!=(const const_iterator& rhs) const { return (_subNode != rhs._subNode); }
+ next_t getInternalIndex() const { return _subNode; }
+ next_t getHash() const { return _hash; }
+ private:
+ void advanceToNextValidHash() {
+ for (;(_hash < _hashTable->getTableSize()) && ! _hashTable->_nodes[_hash].valid(); _hash++) { }
+ _subNode = (_hash < _hashTable->getTableSize()) ? _hash : Node::npos;
+ }
+ next_t _hash;
+ next_t _subNode;
+ const hashtable * _hashTable;
+ };
+ typedef std::pair<iterator, bool> insert_result;
+
+public:
+ hashtable(size_t reservedSpace);
+ hashtable(size_t reservedSpace, const Hash & hasher, const Equal & equal);
+ virtual ~hashtable();
+ iterator begin() { return iterator(this, 0); }
+ iterator end() { return iterator(this, Node::npos); }
+ const_iterator begin() const { return const_iterator(this, 0); }
+ const_iterator end() const { return const_iterator(this, Node::npos); }
+ size_t capacity() const { return _nodes.capacity(); }
+ size_t size() const { return _count; }
+ bool empty() const { return _count == 0; }
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ iterator find(const AltKey & key, const AltExtract & altExtract);
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ iterator find(const AltKey & key) { return find<AltKey, AltExtract, AltHash, AltEqual>(key, AltExtract()); }
+ iterator find(const Key & key);
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ const_iterator find(const AltKey & key, const AltExtract & altExtract) const;
+ template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual >
+ const_iterator find(const AltKey & key) const { return find<AltKey, AltExtract, AltHash, AltEqual>(key, AltExtract()); }
+ const_iterator find(const Key & key) const;
+ template <typename V>
+ insert_result insert(V && node) { return insertInternal(std::forward<V>(node)); }
+ void erase(const Key & key) {
+ const_iterator found(find(key));
+ if (found != end()) {
+ DefaultMoveHandler moveHandler;
+ erase(moveHandler, found);
+ }
+ }
+ void reserve(size_t sz) {
+ if (sz > _nodes.capacity()) {
+ resize(sz);
+ }
+ }
+ void clear() { _nodes.clear(); resize(getTableSize()); }
+ void resize(size_t newSize);
+ void swap(hashtable & rhs);
+
+ /**
+ * Get an approximate number of the memory allocated (in bytes) by this hash table.
+ * Not including any data K would store outside of sizeof(K) of course.
+ */
+ size_t getMemoryConsumption() const;
+
+ /**
+ * Get an approximate number of memory used (in bytes) by this hash table.
+ * Note that getMemoryConsumption() >= getMemoryUsed().
+ */
+ size_t getMemoryUsed() const;
+
+protected:
+ /// These two methods are only for the ones that know what they are doing.
+ /// valid input here are stuff returned from iterator.getInternalIndex.
+ template <typename V>
+ insert_result insertInternal(V && node);
+ Value & getByInternalIndex(size_t index) { return _nodes[index].getValue(); }
+ const Value & getByInternalIndex(size_t index) const { return _nodes[index].getValue(); }
+ template <typename MoveHandler>
+ void erase(MoveHandler & moveHandler, const const_iterator & key);
+private:
+ Modulator _modulator;
+ size_t _count;
+ NodeStore _nodes;
+ Hash _hasher;
+ Equal _equal;
+ KeyExtract _keyExtractor;
+ Value & get(size_t index) { return _nodes[index].getValue(); }
+ const Value & get(size_t index) const { return _nodes[index].getValue(); }
+ next_t modulator(next_t key) const { return _modulator.modulo(key); }
+ next_t getTableSize() const { return _modulator.getTableSize(); }
+ next_t hash(const Key & key) const { return modulator(_hasher(key)); }
+ template <typename MoveHandler>
+ void move(MoveHandler & moveHandler, next_t from, next_t to) {
+ _nodes[to].swap(_nodes[from]);
+ moveHandler.move(from, to);
+ }
+ template <typename MoveHandler>
+ void reclaim(MoveHandler & moveHandler, next_t node);
+};
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+void hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::swap(hashtable & rhs)
+{
+ std::swap(_modulator, rhs._modulator);
+ std::swap(_count, rhs._count);
+ _nodes.swap(rhs._nodes);
+ std::swap(_hasher, rhs._hasher);
+ std::swap(_equal, rhs._equal);
+ std::swap(_keyExtractor, rhs._keyExtractor);
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::hashtable(size_t reservedSpace) :
+ _modulator(1),
+ _count(0),
+ _nodes(1)
+{
+ if (reservedSpace > 0) {
+ resize(reservedSpace);
+ }
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::hashtable(size_t reservedSpace, const Hash & hasher, const Equal & equal) :
+ _modulator(1),
+ _count(0),
+ _nodes(1),
+ _hasher(hasher),
+ _equal(equal)
+{
+ if (reservedSpace > 0) {
+ resize(reservedSpace);
+ }
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::~hashtable()
+{
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+typename hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::iterator
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::find(const Key & key)
+{
+ next_t h = hash(key);
+ if (_nodes[h].valid()) {
+ next_t start(h);
+ do {
+ if (_equal(_keyExtractor(_nodes[h].getValue()), key)) {
+ return iterator(this, start, h);
+ }
+ h = _nodes[h].getNext();
+ } while (h != Node::npos);
+ }
+ return end();
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+typename hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::const_iterator
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::find(const Key & key) const
+{
+ next_t h = hash(key);
+ if (_nodes[h].valid()) {
+ next_t start(h);
+ do {
+ if (_equal(_keyExtractor(_nodes[h].getValue()), key)) {
+ return const_iterator(this, start, h);
+ }
+ h = _nodes[h].getNext();
+ } while (h != Node::npos);
+ }
+ return end();
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual>
+typename hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::const_iterator
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::find(const AltKey & key, const AltExtract & altExtract) const
+{
+ AltHash altHasher;
+ next_t h = modulator(altHasher(key));
+ if (_nodes[h].valid()) {
+ next_t start(h);
+ AltEqual altEqual;
+ do {
+ if (altEqual(altExtract(_keyExtractor(_nodes[h].getValue())), key)) {
+ return const_iterator(this, start, h);
+ }
+ h = _nodes[h].getNext();
+ } while (h != Node::npos);
+ }
+ return end();
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual>
+typename hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::iterator
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::find(const AltKey & key, const AltExtract & altExtract)
+{
+ AltHash altHasher;
+ next_t h = modulator(altHasher(key));
+ if (_nodes[h].valid()) {
+ next_t start(h);
+ AltEqual altEqual;
+ do {
+ if (altEqual(altExtract(_keyExtractor(_nodes[h].getValue())), key)) {
+ return iterator(this, start, h);
+ }
+ h = _nodes[h].getNext();
+ } while (h != Node::npos);
+ }
+ return end();
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+template< typename V >
+typename hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::insert_result
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::insertInternal(V && node)
+{
+ const next_t h = hash(_keyExtractor(node));
+ if ( ! _nodes[h].valid() ) {
+ _nodes[h] = std::forward<V>(node);
+ _count++;
+ return insert_result(iterator(this, h, h), true);
+ } else if (_nodes.size() <= _nodes.capacity()) {
+ for (next_t c(h); c != Node::npos; c = _nodes[c].getNext()) {
+ if (_equal(_keyExtractor(_nodes[c].getValue()), _keyExtractor(node))) {
+ return insert_result(iterator(this, h, c), false);
+ }
+ }
+ if (_nodes.size() < _nodes.capacity()) {
+ const next_t p(_nodes[h].getNext());
+ const next_t newIdx(_nodes.size());
+ _nodes[h].setNext(newIdx);
+ new (_nodes.push_back_fast()) Node(std::forward<V>(node), p);
+ _count++;
+ return insert_result(iterator(this, h, newIdx), true);
+ } else {
+ resize(_nodes.capacity()*2);
+ return insertInternal(std::forward<V>(node));
+ }
+ } else {
+ resize(_nodes.capacity()*2);
+ return insertInternal(std::forward<V>(node));
+ }
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+template<typename MoveHandler>
+void hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::reclaim(MoveHandler & moveHandler, next_t node)
+{
+ size_t last(_nodes.size()-1);
+ if (last >= getTableSize()) {
+ if (last != node) {
+ next_t h = hash(_keyExtractor(_nodes[last].getValue()));
+ for (next_t n(_nodes[h].getNext()); n != last; n=_nodes[h].getNext()) {
+ h = n;
+ }
+ move(moveHandler, last, node);
+ _nodes[h].setNext(node);
+ }
+ _nodes.resize(last);
+ }
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+template <typename MoveHandler>
+void
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::erase(MoveHandler & moveHandler, const const_iterator & it)
+{
+ next_t h = it.getHash();
+ next_t prev = Node::npos;
+ do {
+ if (h == it.getInternalIndex()) {
+ if (prev != Node::npos) {
+ _nodes[prev].setNext(_nodes[h].getNext());
+ reclaim(moveHandler, h);
+ } else {
+ if (_nodes[h].hasNext()) {
+ next_t next = _nodes[h].getNext();
+ move(moveHandler, next, h);
+ reclaim(moveHandler, next);
+ } else {
+ _nodes[h].invalidate();
+ }
+ }
+ _count--;
+ return;
+ }
+ prev = h;
+ h = _nodes[h].getNext();
+ } while (h != Node::npos);
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+void
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::resize(size_t newSize)
+{
+ newSize = roundUp2inN(newSize);
+ next_t newModulo = Modulator::selectHashTableSize(newSize/3);
+ if (newModulo > newSize) {
+ newSize = newModulo;
+ }
+ NodeStore newStore;
+ newStore.reserve(roundUp2inN(newSize));
+ newStore.resize(newModulo);
+ _modulator = Modulator(newModulo);
+ _count = 0;
+ _nodes.swap(newStore);
+ move(std::move(newStore));
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+void
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::move(NodeStore && oldStore)
+{
+ for(typename NodeStore::iterator it(oldStore.begin()), mt(oldStore.end()); it != mt; it++) {
+ if (it->valid()) {
+ insert(std::move(it->getValue()));
+ }
+ }
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+size_t
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::getMemoryConsumption() const
+{
+ return sizeof(hashtable<Key, Value, Hash, Equal, KeyExtract>)
+ + _nodes.capacity() * sizeof(Node);
+}
+
+template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator >
+size_t
+hashtable<Key, Value, Hash, Equal, KeyExtract, Modulator>::getMemoryUsed() const
+{
+ return sizeof(hashtable<Key, Value, Hash, Equal, KeyExtract>)
+ + _nodes.size() * sizeof(Node);
+}
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/stllike/lexical_cast.h b/vespalib/src/vespa/vespalib/stllike/lexical_cast.h
new file mode 100644
index 00000000000..74ef0e4c9eb
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/lexical_cast.h
@@ -0,0 +1,18 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/asciistream.h>
+
+namespace vespalib {
+
+template <typename T>
+T lexical_cast(const stringref s)
+{
+ T v;
+ asciistream is(s);
+ is >> v;
+ return v;
+}
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/stllike/string.cpp b/vespalib/src/vespa/vespalib/stllike/string.cpp
new file mode 100644
index 00000000000..8313427d553
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/string.cpp
@@ -0,0 +1,58 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <iostream>
+
+namespace vespalib {
+
+const stringref::size_type stringref::npos;
+
+std::ostream & operator << (std::ostream & os, const stringref & v)
+{
+ return os.write(v.c_str(), v.size());
+}
+
+template<uint32_t SS>
+std::ostream & operator << (std::ostream & os, const small_string<SS> & v)
+{
+ return os << v.buffer();
+}
+
+template<uint32_t SS>
+std::istream & operator >> (std::istream & is, small_string<SS> & v)
+{
+ std::string s;
+ is >> s;
+ v = s;
+ return is;
+}
+
+template std::ostream & operator << (std::ostream & os, const vespalib::string & v);
+template std::istream & operator >> (std::istream & is, vespalib::string & v);
+
+vespalib::string
+operator + (const vespalib::stringref & a, const char * b)
+{
+ vespalib::string t(a);
+ t += b;
+ return t;
+}
+
+vespalib::string
+operator + (const char * a, const vespalib::stringref & b)
+{
+ vespalib::string t(a);
+ t += b;
+ return t;
+}
+
+vespalib::string
+operator + (const vespalib::stringref & a, const vespalib::stringref & b)
+{
+ vespalib::string t(a);
+ t += b;
+ return t;
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/stllike/string.h b/vespalib/src/vespa/vespalib/stllike/string.h
new file mode 100644
index 00000000000..b15885e39b2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/string.h
@@ -0,0 +1,840 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <assert.h>
+#include <string>
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <vespa/vespalib/util/alloc.h>
+
+namespace vespalib {
+
+/**
+ * This class holds a reference to an external chunk of memory.
+ * It behaves like a string in many respects.
+ * It is the responsibility of the programmer to ensure that the
+ * memory referenced is valid and preferably unchanged for the
+ * lifetime of the stringref; said lifetime should generally be short.
+ **/
+class stringref
+{
+public:
+ typedef const char * const_iterator;
+ typedef size_t size_type;
+ static const size_type npos = static_cast<size_type>(-1);
+ stringref() : _s(""), _sz(0) { }
+ stringref(const char * s) : _s(s), _sz(strlen(s)) { }
+ stringref(const char * s, size_type sz) : _s(s), _sz(sz) { }
+ stringref(const std::string & s) : _s(s.c_str()), _sz(s.size()) { }
+
+ /**
+ * return a pointer to the data held, or NULL.
+ * Note that the data may not be zero terminated, and a default
+ * constructed stringref will give a NULL pointer back. If you
+ * need to make sure c_str() gives a valid zero-terminated string
+ * you should make a vespalib::string from the stringref.
+ **/
+ const char * c_str() const { return _s; }
+
+ /** return a pointer to the data held, or NULL. See c_str(). */
+ const char * data() const { return _s; }
+
+ size_type size() const { return _sz; }
+ size_type length() const { return size(); }
+ bool empty() const { return _sz == 0; }
+ const char * begin() const { return c_str(); }
+ const char * end() const { return begin() + size(); }
+ const char * rbegin() const { return end() - 1; }
+ const char * rend() const { return begin() - 1; }
+ stringref substr(size_type start, size_type sz=npos) const {
+ if (start < size()) {
+ return stringref(c_str() + start, std::min(sz, size()-start));
+ }
+ return stringref();
+ }
+
+ /**
+ * Find the first occurrence of a string, searching from @c start
+ *
+ * @param s characters to search for. Must be zero terminated to make sense.
+ * @param start index at which the search will be started
+ * @return index from the start of the string at which the character
+ * was found, or npos if the character could not be located
+ */
+ size_type find(const char * s, size_type start=0) const {
+ const char *buf = begin()+start;
+ const char *found = (const char *)strstr(buf, s);
+ return (found != NULL) ? (found - begin()) : (size_type)npos;
+ }
+ /**
+ * Find the first occurrence of a string, searching from @c start
+ *
+ * @param s characters to search for. Must be zero terminated to make sense.
+ * @param start index at which the search will be started
+ * @return index from the start of the string at which the character
+ * was found, or npos if the character could not be located
+ */
+ size_type find(const stringref & s, size_type start=0) const {
+ const char *buf = begin()+start;
+ const char *e = end() - s.size();
+ while (buf <= e) {
+ size_t i(0);
+ for (; (i < s.size()) && (buf[i] == s[i]); i++);
+ if (i == s.size()) {
+ return buf - begin();
+ } else {
+ buf++;
+ }
+ }
+ return npos;
+ }
+ /**
+ * Find the first occurrence of a character, searching from @c start
+ *
+ * @param c character to search for
+ * @param start index at which the search will be started
+ * @return index from the start of the string at which the character
+ * was found, or npos if the character could not be located
+ */
+ size_type find(char c, size_type start=0) const {
+ const char *buf = begin()+start;
+ const char *found = (const char *)memchr(buf, c, _sz-start);
+ return (found != NULL) ? (found - begin()) : (size_type)npos;
+ }
+ /**
+ * Find the last occurrence of a substring, starting at e and
+ * searching in reverse order.
+ *
+ * @param s substring to search for
+ * @param e index from which the search will be started
+ * @return index from the start of the string at which the substring
+ * was found, or npos if the substring could not be located
+ */
+ size_type rfind(char c, size_type e=npos) const {
+ if (!empty()) {
+ const char *b = begin();
+ for (size_type i(std::min(size()-1, e)); i > 0; i--) {
+ if (c == b[i]) {
+ return i;
+ }
+ }
+ }
+ return npos;
+ }
+ /**
+ * Find the last occurrence of a substring, starting at e and
+ * searching in reverse order.
+ *
+ * @param s substring to search for
+ * @param e index from which the search will be started
+ * @return index from the start of the string at which the substring
+ * was found, or npos if the substring could not be located
+ */
+ size_type rfind(const char * s, size_type e=npos) const {
+ size_type n = strlen(s);
+ if (n <= size()) {
+ size_type sz = std::min(size()-n, e);
+ const char *b = begin();
+ do {
+ if (s[0] == b[sz]) {
+ bool found(true);
+ for(size_t i(1); found && (i < n); i++) {
+ found = s[i] == b[sz+i];
+ }
+ if (found) {
+ return sz;
+ }
+ }
+ } while (sz-- > 0);
+ }
+ return npos;
+ }
+ int compare(const stringref & s) const { return compare(s.c_str(), s.size()); }
+ int compare(const char *s, size_type sz) const {
+ int diff(memcmp(_s, s, std::min(sz, size())));
+ return (diff != 0) ? diff : (size() - sz);
+ }
+ const char & operator [] (size_t i) const { return _s[i]; }
+ operator std::string () const { return std::string(_s, _sz); }
+ bool operator < (const char * s) const { return compare(s, strlen(s)) < 0; }
+ bool operator < (const std::string & s) const { return compare(s.c_str(), s.size()) < 0; }
+ bool operator < (const stringref & s) const { return compare(s.c_str(), s.size()) < 0; }
+ bool operator <= (const char * s) const { return compare(s, strlen(s)) <= 0; }
+ bool operator <= (const std::string & s) const { return compare(s.c_str(), s.size()) <= 0; }
+ bool operator <= (const stringref & s) const { return compare(s.c_str(), s.size()) <= 0; }
+ bool operator != (const char * s) const { return compare(s, strlen(s)) != 0; }
+ bool operator != (const std::string & s) const { return compare(s.c_str(), s.size()) != 0; }
+ bool operator != (const stringref & s) const { return compare(s.c_str(), s.size()) != 0; }
+ bool operator == (const char * s) const { return compare(s, strlen(s)) == 0; }
+ bool operator == (const std::string & s) const { return compare(s.c_str(), s.size()) == 0; }
+ bool operator == (const stringref & s) const { return compare(s.c_str(), s.size()) == 0; }
+ bool operator >= (const char * s) const { return compare(s, strlen(s)) >= 0; }
+ bool operator >= (const std::string & s) const { return compare(s.c_str(), s.size()) >= 0; }
+ bool operator >= (const stringref & s) const { return compare(s.c_str(), s.size()) >= 0; }
+ bool operator > (const char * s) const { return compare(s, strlen(s)) > 0; }
+ bool operator > (const std::string & s) const { return compare(s.c_str(), s.size()) > 0; }
+ bool operator > (const stringref & s) const { return compare(s.c_str(), s.size()) > 0; }
+private:
+ const char *_s;
+ size_type _sz;
+ friend bool operator == (const std::string & a, const stringref & b) { return b == a; }
+ friend bool operator != (const std::string & a, const stringref & b) { return b != a; }
+ friend std::ostream & operator << (std::ostream & os, const stringref & v);
+};
+
+
+/**
+ * class intended as a mostly-drop-in replacement for std::string
+ * optimized for good multi-core performance using the well-known
+ * "small-string optimization" where a small chunk of memory is
+ * allocated internally in the object; as long as only small strings
+ * are used the internal chunk will be used and no extra allocation
+ * will happen. The template parameter StackSize must be positive,
+ * should be at least 8 and preferably a multiple of 8 for good
+ * performance. The size of strings is currently limited to 4GB, but
+ * no checking is done - if a string grows too big the size will just
+ * wrap.
+ **/
+template <uint32_t StackSize>
+class small_string
+{
+public:
+ typedef size_t size_type;
+ typedef char * iterator;
+ typedef const char * const_iterator;
+ typedef char * reverse_iterator;
+ typedef const char * const_reverse_iterator;
+ static const size_type npos = static_cast<size_type>(-1);
+ small_string() : _buf(_stack), _sz(0), _bufferSize(StackSize) { _stack[0] = '\0'; }
+ small_string(const char * s) : _buf(_stack), _sz(s ? strlen(s) : 0) { init(s); }
+ small_string(const void * s, size_type sz) : _buf(_stack), _sz(sz) { init(s); }
+ small_string(const stringref & s) : _buf(_stack), _sz(s.size()) { init(s.c_str()); }
+ small_string(const std::string & s) : _buf(_stack), _sz(s.size()) { init(s.c_str()); }
+ small_string(const small_string & rhs) : _buf(_stack), _sz(rhs.size()) { init(rhs.c_str()); }
+ small_string(const small_string & rhs, size_type pos, size_type sz=npos)
+ : _buf(_stack), _sz(std::min(sz, rhs.size()-pos))
+ {
+ init(rhs.c_str()+pos);
+ }
+ small_string(size_type sz, char c)
+ : _buf(_stack), _sz(0), _bufferSize(StackSize)
+ {
+ reserve(sz);
+ memset(buffer(), c, sz);
+ _sz = sz;
+ *end() = '\0';
+ }
+
+ template<typename Iterator>
+ small_string(Iterator s, Iterator e);
+
+ ~small_string() {
+ if (__builtin_expect(isAllocated(), false)) {
+ free(buffer());
+ }
+ }
+ small_string& operator= (const small_string &rhs) {
+ return assign(rhs.c_str(), rhs.size());
+ }
+ small_string & operator= (const stringref &rhs) {
+ return assign(rhs.c_str(), rhs.size());
+ }
+ small_string& operator= (const char *s) {
+ return assign(s);
+ }
+ small_string& operator= (const std::string &rhs) {
+ return operator= (stringref(rhs));
+ }
+ void swap(small_string & rhs) {
+ std::swap(*this, rhs);
+ }
+ operator std::string () const { return std::string(c_str(), size()); }
+ operator stringref () const { return stringref(c_str(), size()); }
+ char at(size_t i) const { return buffer()[i]; }
+ char & at(size_t i) { return buffer()[i]; }
+ const char & operator [] (size_t i) const { return buffer()[i]; }
+ char & operator [] (size_t i) { return buffer()[i]; }
+
+ /** if there is a newline at the end of the string, remove it and return true */
+ bool chomp() {
+ if (size() > 0 && *rbegin() == '\n') {
+ _resize(size() - 1);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Remove the last character of the string
+ */
+ void pop_back() {
+ _resize(size() - 1);
+ }
+
+ /**
+ * Find the last occurrence of a substring, starting at e and
+ * searching in reverse order.
+ *
+ * @param s substring to search for
+ * @param e index from which the search will be started
+ * @return index from the start of the string at which the substring
+ * was found, or npos if the substring could not be located
+ */
+ size_type rfind(const char * s, size_type e=npos) const {
+ size_type n = strlen(s);
+ if (n <= size()) {
+ size_type sz = std::min(size()-n, e);
+ const char *b = buffer();
+ do {
+ if (s[0] == b[sz]) {
+ bool found(true);
+ for(size_t i(1); found && (i < n); i++) {
+ found = s[i] == b[sz+i];
+ }
+ if (found) {
+ return sz;
+ }
+ }
+ } while (sz-- > 0);
+ }
+ return npos;
+ }
+
+ /**
+ * Find the last occurrence of a character, starting at e and
+ * searching in reverse order.
+ *
+ * @param c character to search for
+ * @param e index at which the search will be started
+ * @return index from the start of the string at which the character
+ * was found, or npos if the character could not be located
+ */
+ size_type rfind(char c, size_type e=npos) const {
+ size_type sz = std::min(size()-1, e)+1;
+ const char *b = buffer();
+ while (sz-- > 0) {
+ if (c == b[sz]) {
+ return sz;
+ }
+ }
+ return npos;
+ }
+ size_type find_last_of(char c, size_type e=npos) const { return rfind(c, e); }
+ size_type find_first_of(char c, size_type start=0) const { return find(c, start); }
+
+ size_type find_first_not_of(char c, size_type start=0) const {
+ size_t p(start);
+ const char *buf = buffer();
+ for(size_t m(size()); (p < m) && (buf[p] == c); p++);
+ return (p < size()) ? p : (size_type)npos;
+ }
+
+ /**
+ * Find the first occurrence of a substring, searching from @c start
+ *
+ * @param s substring to search for
+ * @param start index from which the search will be started
+ * @return index from the start of the string at which the substring
+ * was found, or npos if the substring could not be located
+ */
+ size_type find(const small_string & s, size_type start=0) const { return find(s.c_str(), start); }
+
+ /**
+ * Find the first occurrence of a substring, searching from @c start
+ *
+ * @param s substring to search for
+ * @param start index at which the search will be started
+ * @return index from the start of the string at which the substring
+ * was found, or npos if the substring could not be located
+ */
+ size_type find(const char * s, size_type start=0) const {
+ const char *buf = buffer()+start;
+ const char *found = strstr(buf, s);
+ return (found != NULL) ? (found - buffer()) : (size_type)npos;
+ }
+
+ /**
+ * Find the first occurrence of a character, searching from @c start
+ *
+ * @param s character to search for
+ * @param start index at which the search will be started
+ * @return index from the start of the string at which the character
+ * was found, or npos if the character could not be located
+ */
+ size_type find(char c, size_type start=0) const {
+ const char *buf = buffer()+start;
+ const char *found = (const char *)memchr(buf, c, _sz-start);
+ return (found != NULL) ? (found - buffer()) : (size_type)npos;
+ }
+ small_string & assign(const char * s) { return assign(s, strlen(s)); }
+ small_string & assign(const void * s, size_type sz) {
+ if (__builtin_expect(capacity() >= sz, true)) {
+ char *buf = buffer();
+ memmove(buf, s, sz);
+ buf[sz] = '\0';
+ _sz = sz;
+ } else {
+ assign_slower(s, sz);
+ }
+ return *this;
+ }
+ small_string & assign(const stringref &s, size_type pos, size_type sz) {
+ return assign(s.c_str() + pos, sz);
+ }
+ small_string & assign(const stringref &rhs) {
+ if (c_str() != rhs.c_str()) assign(rhs.c_str(), rhs.size());
+ return *this;
+ }
+ small_string & push_back(char c) { return append(&c, 1); }
+ small_string & append(char c) { return append(&c, 1); }
+ small_string & append(const char * s) { return append(s, strlen(s)); }
+ small_string & append(const stringref & s) { return append(s.c_str(), s.size()); }
+ small_string & append(const std::string & s) { return append(s.c_str(), s.size()); }
+ small_string & append(const small_string & s) { return append(s.c_str(), s.size()); }
+ small_string & append(const void * s, size_type sz);
+ small_string & operator += (char c) { return append(c); }
+ small_string & operator += (const char * s) { return append(s); }
+ small_string & operator += (const stringref & s) { return append(s); }
+ small_string & operator += (const std::string & s) { return append(s); }
+ small_string & operator += (const small_string & s) { return append(s); }
+
+ /**
+ * Return a new string comprised of the contents of a sub-range of this
+ * string, starting at start and spanning sz characters.
+ *
+ * @param start position at which the first character of the substring is to start
+ * @param sz length of substring. If start+sz is beyond the
+ * end of the string, only the remaining part will be returned.
+ * @return a substring of *this
+ */
+ small_string substr(size_type start, size_type sz=npos) const {
+ if (start < size()) {
+ const char *s = c_str();
+ return small_string(s + start, std::min(sz, size()-start));
+ }
+ return small_string();
+ }
+
+ small_string & insert(iterator p, const_iterator f, const_iterator l) { return insert(p-c_str(), f, l-f); }
+ small_string & insert(size_type start, const stringref & v) { return insert(start, v.c_str(), v.size()); }
+ small_string & insert(size_type start, const void * v, size_type sz);
+
+ /**
+ * Erases the content of the string, leaving it zero-length.
+ * Does not alter string capacity.
+ */
+ void clear() {
+ _sz = 0;
+ buffer()[0] = 0;
+ }
+
+ /**
+ * Frees any heap-allocated storage for the string and erases its content,
+ * leaving it zero-length. Capacity is reset to the original small
+ * string stack size
+ */
+ void reset() {
+ if (isAllocated()) {
+ free(buffer());
+ _bufferSize = StackSize;
+ _buf = _stack;
+ }
+ clear();
+ }
+ const_iterator begin() const { return buffer(); }
+ const_iterator end() const { return buffer() + size(); }
+ iterator begin() { return buffer(); }
+ iterator end() { return buffer() + size(); }
+ const_reverse_iterator rbegin() const { return end() - 1; }
+ const_reverse_iterator rend() const { return begin() - 1; }
+ reverse_iterator rbegin() { return end() - 1; }
+ reverse_iterator rend() { return begin() - 1; }
+ const char * c_str() const { return buffer(); }
+ const char * data() const { return buffer(); }
+ size_type size() const { return _sz; }
+ size_type length() const { return size(); }
+ bool empty() const { return _sz == 0; }
+
+ /**
+ * at position p1, replace n1 characters with the contents of s
+ *
+ * @param p1 the position where the replacement is put, must be inside old string
+ * @param n1 how many old characters should be replaced, cannot go outside old string
+ * @param s new replacement content
+ **/
+ small_string& replace (size_t p1, size_t n1, const small_string& s ) {
+ return replace(p1, n1, s.c_str(), s.size());
+ }
+
+ /**
+ * at position p1, replace n1 characters with
+ * the n2 characters of s starting at position p2
+ *
+ * @param p1 the position where the replacement is put, must be inside old string
+ * @param n1 how many old characters should be replaced, cannot go outside old string
+ * @param s where to get new replacement content
+ * @param p2 position in s where replacement content starts
+ * @param n2 how many new characters to use
+ **/
+ small_string& replace (size_t p1, size_t n1, const small_string& s, size_t p2, size_t n2 ) {
+ assert(s.size() >= (p2+n2));
+ return replace(p1, n1, s.c_str()+p2, n2);
+ }
+
+ /**
+ * at position p1, replace n1 characters with
+ * the n2 first characters of s
+ *
+ * @param p1 the position where the replacement is put, must be inside old string
+ * @param n1 how many old characters should be replaced, cannot go outside old string
+ * @param s pointer to new content
+ * @param n2 how many new characters to use
+ **/
+ small_string& replace (size_t p1, size_t n1, const char *s, size_t n2 ) {
+ assert (size() >= (p1 + n1));
+ const size_t newSz = n2 + size() - n1;
+ if (n1 < n2) {
+ reserve(newSz);
+ }
+ size_t rest = size()-(p1+n1);
+ memmove(buffer()+p1+n2, buffer()+p1+n1, rest);
+ memcpy(buffer()+p1, s, n2);
+ _resize(newSz);
+ return *this;
+ }
+
+ /**
+ * at position p1, replace n1 characters with the contents of s
+ *
+ * @param p1 the position where the replacement is put, must be inside old string
+ * @param n1 how many old characters should be replaced, cannot go outside old string
+ * @param s pointer to new replacement content
+ **/
+ small_string& replace (size_t p1, size_t n1, const char* s ) {
+ return replace(p1, n1, s, strlen(s));
+ }
+
+ /* not implemented?
+ small_string& replace ( size_t p1, size_t n1, size_t n2, char c );
+ */
+
+ bool operator < (const char * s) const { return compare(s, strlen(s)) < 0; }
+ bool operator < (const std::string & s) const { return compare(s.c_str(), s.size()) < 0; }
+ bool operator < (const small_string & s) const { return compare(s.c_str(), s.size()) < 0; }
+ bool operator < (const stringref & s) const { return compare(s.c_str(), s.size()) < 0; }
+ bool operator <= (const char * s) const { return compare(s, strlen(s)) <= 0; }
+ bool operator <= (const std::string & s) const { return compare(s.c_str(), s.size()) <= 0; }
+ bool operator <= (const small_string & s) const { return compare(s.c_str(), s.size()) <= 0; }
+ bool operator <= (const stringref & s) const { return compare(s.c_str(), s.size()) <= 0; }
+ bool operator == (const char * s) const { return compare(s, strlen(s)) == 0; }
+ bool operator == (const std::string & s) const { return compare(s.c_str(), s.size()) == 0; }
+ bool operator == (const small_string & s) const { return compare(s.c_str(), s.size()) == 0; }
+ bool operator == (const stringref & s) const { return compare(s.c_str(), s.size()) == 0; }
+ bool operator != (const char * s) const { return compare(s, strlen(s)) != 0; }
+ bool operator != (const std::string & s) const { return compare(s.c_str(), s.size()) != 0; }
+ bool operator != (const small_string & s) const { return compare(s.c_str(), s.size()) != 0; }
+ bool operator != (const stringref & s) const { return compare(s.c_str(), s.size()) != 0; }
+ bool operator >= (const char * s) const { return compare(s, strlen(s)) >= 0; }
+ bool operator >= (const std::string & s) const { return compare(s.c_str(), s.size()) >= 0; }
+ bool operator >= (const small_string & s) const { return compare(s.c_str(), s.size()) >= 0; }
+ bool operator >= (const stringref & s) const { return compare(s.c_str(), s.size()) >= 0; }
+ bool operator > (const char * s) const { return compare(s, strlen(s)) > 0; }
+ bool operator > (const std::string & s) const { return compare(s.c_str(), s.size()) > 0; }
+ bool operator > (const small_string & s) const { return compare(s.c_str(), s.size()) > 0; }
+ bool operator > (const stringref & s) const { return compare(s.c_str(), s.size()) > 0; }
+
+ template<typename T> bool operator != (const T& s) const { return ! operator == (s); }
+
+ int compare(const small_string & s) const { return compare(s.c_str(), s.size()); }
+ int compare(const char *s, size_t sz) const {
+ int diff(memcmp(buffer(), s, std::min(sz, size())));
+ return (diff != 0) ? diff : (size() - sz);
+ }
+
+ size_type capacity() const { return _bufferSize - 1; }
+
+ /**
+ * Make string exactly newSz in length removing characters at
+ * the end as required or padding with pad character.
+ *
+ * @param newSz new size of string. Must be less than string capacity
+ * @param c default character to use when initializing uninitialized memory.
+ */
+
+ void resize(size_type newSz, char padding = '\0') {
+ if (newSz > capacity()) {
+ reserve(newSz);
+ }
+ if (newSz > size()) {
+ memset(buffer()+size(), padding, newSz - size());
+ }
+ _resize(newSz);
+ }
+
+ /**
+ * Will extend the string within its current buffer. Assumes memory is already initialized.
+ * Can not extend beyond capacity.
+ * Not this is non-STL.
+ *
+ * @param newSz new size of string.
+ */
+ void append_from_reserved(size_type sz) {
+ assert(size() + sz <= capacity());
+ _resize(size() + sz);
+ }
+
+ /**
+ * Ensure string has at least newCapacity characters of available
+ * storage. If newCapacity is beyond the initial small string
+ * stack size, heap storage will be used instead.
+ *
+ * @param newCapacity new minimum capacity of string
+ */
+ void reserve(size_type newCapacity) {
+ reserveBytes(newCapacity + 1);
+ }
+private:
+ void assign_slower(const void * s, size_type sz) __attribute((noinline));
+ void init_slower(const void *s) __attribute((noinline));
+ void reserveBytes(size_type newBufferSize) {
+ if (newBufferSize > _bufferSize) {
+ if (isAllocated()) {
+ _buf = (char *) realloc(_buf, newBufferSize);
+ } else {
+ char *tmp = (char *) malloc(newBufferSize);
+ memcpy(tmp, _stack, _sz);
+ tmp[_sz] = '\0';
+ _buf = tmp;
+ }
+ _bufferSize = newBufferSize;
+ }
+ }
+ typedef uint32_t isize_type;
+ bool needAlloc(isize_type add) const { return (add + _sz + 1) > _bufferSize; }
+ bool isAllocated() const { return _buf != _stack; }
+ char * buffer() { return _buf; }
+ const char * buffer() const { return _buf; }
+ void appendAlloc(const void * s, size_type sz) __attribute__((noinline));
+ void init(const void *s) {
+ if (__builtin_expect(_sz < StackSize, true)) {
+ _bufferSize = StackSize;
+ memcpy(_stack, s, _sz);
+ _stack[_sz] = '\0';
+ } else {
+ init_slower(s);
+ }
+ }
+ void _resize(size_type newSz) {
+ _sz = newSz;
+ *end() = '\0';
+ }
+ char * _buf;
+ isize_type _sz;
+ isize_type _bufferSize;
+ char _stack[StackSize];
+ template <uint32_t SS>
+ friend std::ostream & operator << (std::ostream & os, const small_string<SS> & v);
+ template <uint32_t SS>
+ friend std::istream & operator >> (std::istream & is, small_string<SS> & v);
+};
+
+template <uint32_t StackSize>
+template<typename Iterator>
+small_string<StackSize>::small_string(Iterator s, Iterator e) :
+ _buf(_stack),
+ _sz(0),
+ _bufferSize(StackSize)
+{
+ _stack[0] = '\0';
+ for(; s != e; s++) {
+ append(*s);
+ }
+}
+
+template <uint32_t StackSize>
+void small_string<StackSize>::assign_slower(const void * s, size_type sz)
+{
+ reset();
+ append(s, sz);
+}
+
+template <uint32_t StackSize>
+void small_string<StackSize>::init_slower(const void *s)
+{
+ _bufferSize = _sz+1;
+ _buf = (char *) malloc(_bufferSize);
+ memcpy(_buf, s, _sz);
+ _buf[_sz] = '\0';
+}
+
+template <uint32_t StackSize>
+void small_string<StackSize>::appendAlloc(const void * s, size_type addSz)
+{
+ size_type newBufferSize = roundUp2inN(_sz+addSz+1);
+ char * buf = (char *) malloc(newBufferSize);
+ memcpy(buf, buffer(), _sz);
+ if (isAllocated()) {
+ free(_buf);
+ }
+ memcpy(buf+_sz, s, addSz);
+ _buf = buf;
+ _bufferSize = newBufferSize;
+ _sz += addSz;
+ _buf[_sz] = '\0';
+}
+
+template <uint32_t StackSize>
+small_string<StackSize> &
+small_string<StackSize>::insert(size_type start, const void * v, size_type sz)
+{
+ if (start < size()) {
+ if ((static_cast<const char *>(v)+sz < c_str()) || (c_str()+size() < v)) {
+ reserve(size() + sz);
+ memmove(begin() + start + sz, c_str() + start, size() - start + 1);
+ memcpy(begin() + start, v, sz);
+ _sz += sz;
+ } else {
+ small_string n;
+ n.reserve(size() + sz);
+ n.append(c_str(), start);
+ n.append(v, sz);
+ n.append(c_str() + start, size() - start);
+ swap(n);
+ }
+ } else {
+ append(v, sz);
+ }
+ return *this;
+}
+
+
+template <uint32_t StackSize>
+small_string<StackSize> &
+small_string<StackSize>::append(const void * s, size_type addSz)
+{
+ if (needAlloc(addSz)) {
+ appendAlloc(s, addSz);
+ } else {
+ char * buf(buffer());
+ memmove(buf+_sz, s, addSz);
+ _sz += addSz;
+ buf[_sz] = '\0';
+ }
+ return *this;
+}
+
+template <uint32_t StackSize>
+const size_t small_string<StackSize>::npos;
+
+typedef small_string<48> string;
+
+template<uint32_t StackSize>
+vespalib::small_string<StackSize>
+operator + (const vespalib::small_string<StackSize> & a, const vespalib::small_string<StackSize> & b)
+{
+ vespalib::small_string<StackSize> t(a);
+ t += b;
+ return t;
+}
+
+template<uint32_t StackSize>
+vespalib::small_string<StackSize>
+operator + (const vespalib::small_string<StackSize> & a, const vespalib::stringref & b)
+{
+ vespalib::small_string<StackSize> t(a);
+ t += b;
+ return t;
+}
+
+template<uint32_t StackSize>
+vespalib::small_string<StackSize>
+operator + (const vespalib::stringref & a, const vespalib::small_string<StackSize> & b)
+{
+ vespalib::small_string<StackSize> t(a);
+ t += b;
+ return t;
+}
+
+template<uint32_t StackSize>
+vespalib::small_string<StackSize>
+operator + (const vespalib::small_string<StackSize> & a, const char * b)
+{
+ vespalib::small_string<StackSize> t(a);
+ t += b;
+ return t;
+}
+
+template<uint32_t StackSize>
+vespalib::small_string<StackSize>
+operator + (const char * a, const vespalib::small_string<StackSize> & b)
+{
+ vespalib::small_string<StackSize> t(a);
+ t += b;
+ return t;
+}
+
+template<typename T, uint32_t StackSize>
+bool
+operator == (const T& a, const vespalib::small_string<StackSize>& b)
+{
+ return b == a;
+}
+
+template<typename T, uint32_t StackSize>
+bool
+operator != (const T& a, const vespalib::small_string<StackSize>& b)
+{
+ return b != a;
+}
+
+template<typename T, uint32_t StackSize>
+bool
+operator < (const T& a, const vespalib::small_string<StackSize>& b)
+{
+ return b > a;
+}
+
+vespalib::string operator + (const vespalib::stringref & a, const vespalib::stringref & b);
+vespalib::string operator + (const char * a, const vespalib::stringref & b);
+vespalib::string operator + (const vespalib::stringref & a, const char * b);
+
+inline bool contains(const stringref & text, const stringref & key) {
+ return text.find(key) != stringref::npos;
+}
+
+inline bool starts_with(const stringref & text, const stringref & key) {
+ if (text.size() >= key.size()) {
+ return memcmp(text.begin(), key.begin(), key.size()) == 0;
+ }
+ return false;
+}
+
+inline bool ends_with(const stringref & text, const stringref & key) {
+ if (text.size() >= key.size()) {
+ return memcmp(text.end()-key.size(), key.begin(), key.size()) == 0;
+ }
+ return false;
+}
+
+/**
+ * Utility function to format an unsigned integer into a new
+ * vespalib::string instance.
+ **/
+static inline vespalib::string stringify(uint64_t number)
+{
+ char digits[64];
+ int numdigits = 0;
+ do {
+ digits[numdigits++] = '0' + (number % 10);
+ number /= 10;
+ } while (number > 0);
+ vespalib::string retval;
+ while (numdigits > 0) {
+ retval.append(digits[--numdigits]);
+ }
+ return retval;
+}
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/stllike/vector_map.h b/vespalib/src/vespa/vespalib/stllike/vector_map.h
new file mode 100644
index 00000000000..99ce53e57bf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/stllike/vector_map.h
@@ -0,0 +1,88 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vector>
+#include <algorithm>
+
+namespace vespalib {
+/**
+ * This is an ordered map that uses a vector of pair as its backing store.
+ * The advantages over an std::map are that
+ * - it does not allocate entries individually.
+ * - it gives very good cache locality.
+ * - adding element in keyorder is very cheap.
+ * - so is removing in reverse key order.
+ *
+ * Disadvantages
+ * - it is kept sorted by insertion. So that is an O(N),
+ * compared to O(log(N)) for std::map or O(1) for std::unordered_map.
+ * - Same goes for erase.
+ * - iterators are invalidated by the same rules as an std::vector.
+ *
+ **/
+template< typename K, typename V, typename LT = std::less<K> >
+class vector_map
+{
+public:
+ typedef std::pair<K, V> value_type;
+ typedef K key_type;
+ typedef V mapped_type;
+private:
+ typedef std::vector< value_type> OrderedList;
+ friend bool operator < (const std::pair<K, V> & a, const std::pair<K, V> & b) {
+ LT lt;
+ return lt(a.first, b.first);
+ }
+ LT _lt;
+ OrderedList _ht;
+public:
+ typedef typename OrderedList::iterator iterator;
+ typedef typename OrderedList::const_iterator const_iterator;
+public:
+ vector_map(size_t reserveSize=0) : _ht(reserveSize) { }
+ iterator begin() { return _ht.begin(); }
+ iterator end() { return _ht.end(); }
+ const_iterator begin() const { return _ht.begin(); }
+ const_iterator end() const { return _ht.end(); }
+ size_t capacity() const { return _ht.capacity(); }
+ size_t size() const { return _ht.size(); }
+ bool empty() const { return _ht.empty(); }
+ V & operator [] (const K & key) const { return _ht.find(key)->second; }
+ V & operator [] (const K & key) {
+ value_type v(key, V());
+ LT lt;
+ iterator f = std::lower_bound(begin(), end(), v);
+ if ((f == end()) || lt(key, f->first)) {
+ f = _ht.insert(f, v);
+ }
+ return f->second;
+ }
+ void erase(const K & key) { return _ht.erase(find(key)); }
+ void erase(iterator it) { return _ht.erase(it); }
+ void erase(const_iterator it) { return _ht.erase(it); }
+ iterator find(const K & key) {
+ iterator f = std::lower_bound(begin(), end(), value_type(key, V()));
+ LT lt;
+ return ((f != end()) && !lt(key, f->first)) ? f : end();
+ }
+ const_iterator find(const K & key) const {
+ const_iterator f = std::lower_bound(begin(), end(), value_type(key, V()));
+ LT lt;
+ return ((f != end()) && !lt(key, f->first)) ? f : end();
+ }
+ void clear() { _ht.clear(); }
+ void reserve(size_t sz) { _ht.reserve(sz); }
+ void swap(vector_map & rhs) { _ht.swap(rhs._ht); }
+ bool operator == (const vector_map & rhs) const;
+};
+
+template< typename K, typename V, typename LT >
+void swap(vector_map<K, V, LT> & a, vector_map<K, V, LT> & b)
+{
+ a.swap(b);
+}
+
+
+}
+
+
diff --git a/vespalib/src/vespa/vespalib/tensor/CMakeLists.txt b/vespalib/src/vespa/vespalib/tensor/CMakeLists.txt
new file mode 100644
index 00000000000..d2b1f8c9955
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_tensor
+ SOURCES
+ default_tensor_engine.cpp
+ tensor.cpp
+ tensor_address.cpp
+ tensor_apply.cpp
+ tensor_factory.cpp
+ tensor_function.cpp
+ tensor_mapper.cpp
+ tensor_type.cpp
+ tensor_type_spec.cpp
+ $<TARGET_OBJECTS:vespalib_vespalib_tensor_compact>
+ $<TARGET_OBJECTS:vespalib_vespalib_tensor_dense>
+ $<TARGET_OBJECTS:vespalib_vespalib_tensor_serialization>
+ $<TARGET_OBJECTS:vespalib_vespalib_tensor_simple>
+ INSTALL lib64
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/tensor/cell_function.h b/vespalib/src/vespa/vespalib/tensor/cell_function.h
new file mode 100644
index 00000000000..778f9dea3d0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/cell_function.h
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <functional>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Interface for a function to be applied on cells in a tensor.
+ */
+struct CellFunction
+{
+ typedef std::reference_wrapper<const CellFunction> CREF;
+ virtual ~CellFunction() {}
+ virtual double apply(double value) const = 0;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/CMakeLists.txt b/vespalib/src/vespa/vespalib/tensor/compact/CMakeLists.txt
new file mode 100644
index 00000000000..c3322946593
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_tensor_compact OBJECT
+ SOURCES
+ compact_tensor.cpp
+ compact_tensor_dimension_sum.cpp
+ compact_tensor_product.cpp
+ compact_tensor_v2.cpp
+ compact_tensor_v2_dimension_sum.cpp
+ compact_tensor_v2_match.cpp
+ compact_tensor_v2_product.cpp
+ compact_tensor_address.cpp
+ compact_tensor_address_builder.cpp
+ compact_tensor_builder.cpp
+ compact_tensor_v2_builder.cpp
+ compact_tensor_unsorted_address_builder.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp
new file mode 100644
index 00000000000..caa54bc7606
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp
@@ -0,0 +1,210 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor.h"
+#include "compact_tensor_address_builder.h"
+#include "compact_tensor_dimension_sum.h"
+#include "compact_tensor_product.h"
+#include <vespa/vespalib/tensor/join_tensors.h>
+#include <vespa/vespalib/tensor/tensor_apply.h>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+#include <sstream>
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+void
+copyCells(CompactTensor::Cells &cells,
+ const CompactTensor::Cells &cells_in,
+ Stash &stash)
+{
+ for (const auto &cell : cells_in) {
+ CompactTensorAddressRef oldRef = cell.first;
+ CompactTensorAddressRef newRef(oldRef, stash);
+ cells[newRef] = cell.second;
+ }
+}
+
+}
+
+CompactTensor::CompactTensor(const Dimensions &dimensions_in,
+ const Cells &cells_in)
+ : _cells(),
+ _dimensions(dimensions_in),
+ _stash(STASH_CHUNK_SIZE)
+{
+ copyCells(_cells, cells_in, _stash);
+}
+
+
+CompactTensor::CompactTensor(Dimensions &&dimensions_in,
+ Cells &&cells_in, Stash &&stash_in)
+ : _cells(std::move(cells_in)),
+ _dimensions(std::move(dimensions_in)),
+ _stash(std::move(stash_in))
+{
+}
+
+
+bool
+CompactTensor::operator==(const CompactTensor &rhs) const
+{
+ return _dimensions == rhs._dimensions && _cells == rhs._cells;
+}
+
+
+CompactTensor::Dimensions
+CompactTensor::combineDimensionsWith(const CompactTensor &rhs) const
+{
+ Dimensions result;
+ std::set_union(_dimensions.cbegin(), _dimensions.cend(),
+ rhs._dimensions.cbegin(), rhs._dimensions.cend(),
+ std::back_inserter(result));
+ return result;
+}
+
+TensorType
+CompactTensor::getType() const
+{
+ return TensorType::sparse(_dimensions);
+}
+
+double
+CompactTensor::sum() const
+{
+ double result = 0.0;
+ for (const auto &cell : _cells) {
+ result += cell.second;
+ }
+ return result;
+}
+
+Tensor::UP
+CompactTensor::add(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
+ return joinTensors(*this, rhs,
+ [](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
+}
+
+Tensor::UP
+CompactTensor::subtract(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
+ return joinTensorsNegated(*this, rhs,
+ [](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
+ // Note that -rhsCell.second is passed to the lambda function, that is why we do addition.
+}
+
+Tensor::UP
+CompactTensor::multiply(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ return CompactTensorProduct(*this, static_cast<const CompactTensor &>(arg)).result();
+}
+
+Tensor::UP
+CompactTensor::min(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
+ return joinTensors(*this, rhs,
+ [](double lhsValue, double rhsValue) { return std::min(lhsValue, rhsValue); });
+}
+
+Tensor::UP
+CompactTensor::max(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
+ return joinTensors(*this, rhs,
+ [](double lhsValue, double rhsValue) { return std::max(lhsValue, rhsValue); });
+}
+
+Tensor::UP
+CompactTensor::match(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
+ DirectTensorBuilder<CompactTensor> builder(combineDimensionsWith(rhs));
+ for (const auto &lhsCell : cells()) {
+ auto rhsItr = rhs.cells().find(lhsCell.first);
+ if (rhsItr != rhs.cells().end()) {
+ builder.insertCell(lhsCell.first, lhsCell.second * rhsItr->second);
+ }
+ }
+ return builder.build();
+}
+
+Tensor::UP
+CompactTensor::apply(const CellFunction &func) const
+{
+ return TensorApply<CompactTensor>(*this, func).result();
+}
+
+Tensor::UP
+CompactTensor::sum(const vespalib::string &dimension) const
+{
+ return CompactTensorDimensionSum(*this, dimension).result();
+}
+
+bool
+CompactTensor::equals(const Tensor &arg) const
+{
+ return *this == static_cast<const CompactTensor &>(arg);
+}
+
+vespalib::string
+CompactTensor::toString() const
+{
+ std::ostringstream stream;
+ stream << *this;
+ return stream.str();
+}
+
+Tensor::UP
+CompactTensor::clone() const
+{
+ return std::make_unique<CompactTensor>(_dimensions, _cells);
+}
+
+void
+CompactTensor::print(std::ostream &out) const
+{
+ out << "{ ";
+ bool first = true;
+ CompactTensorAddress addr;
+ for (const auto &cell : cells()) {
+ if (!first) {
+ out << ", ";
+ }
+ addr.deserializeFromSparseAddressRef(cell.first);
+ out << addr << ":" << cell.second;
+ first = false;
+ }
+ out << " }";
+}
+
+void
+CompactTensor::accept(TensorVisitor &visitor) const
+{
+ CompactTensorAddress caddr;
+ TensorAddressBuilder addrBuilder;
+ TensorAddress addr;
+ for (const auto &cell : _cells) {
+ caddr.deserializeFromSparseAddressRef(cell.first);
+ addrBuilder.clear();
+ for (const auto &element : caddr.elements()) {
+ addrBuilder.add(element.dimension(), element.label());
+ }
+ addr = addrBuilder.build();
+ visitor.visit(addr, cell.second);
+ }
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.h
new file mode 100644
index 00000000000..2f32baa9b4c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.h
@@ -0,0 +1,63 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/cell_function.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include "compact_tensor_address.h"
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A tensor implementation using serialized tensor addresses to
+ * improve CPU cache and TLB hit ratio, relative to SimpleTensor
+ * implementation.
+ */
+class CompactTensor : public Tensor
+{
+public:
+ typedef vespalib::hash_map<CompactTensorAddressRef, double> Cells;
+ typedef TensorDimensions Dimensions;
+
+ static constexpr size_t STASH_CHUNK_SIZE = 16384u;
+
+private:
+ Cells _cells;
+ Dimensions _dimensions;
+ Stash _stash;
+
+public:
+ explicit CompactTensor(const Dimensions &dimensions_in,
+ const Cells &cells_in);
+ CompactTensor(Dimensions &&dimensions_in,
+ Cells &&cells_in, Stash &&stash_in);
+ const Cells &cells() const { return _cells; }
+ const Dimensions &dimensions() const { return _dimensions; }
+ bool operator==(const CompactTensor &rhs) const;
+ Dimensions combineDimensionsWith(const CompactTensor &rhs) const;
+
+ virtual TensorType getType() const override;
+ virtual double sum() const override;
+ virtual Tensor::UP add(const Tensor &arg) const override;
+ virtual Tensor::UP subtract(const Tensor &arg) const override;
+ virtual Tensor::UP multiply(const Tensor &arg) const override;
+ virtual Tensor::UP min(const Tensor &arg) const override;
+ virtual Tensor::UP max(const Tensor &arg) const override;
+ virtual Tensor::UP match(const Tensor &arg) const override;
+ virtual Tensor::UP apply(const CellFunction &func) const override;
+ virtual Tensor::UP sum(const vespalib::string &dimension) const override;
+ virtual bool equals(const Tensor &arg) const override;
+ virtual void print(std::ostream &out) const override;
+ virtual vespalib::string toString() const override;
+ virtual Tensor::UP clone() const override;
+ virtual void accept(TensorVisitor &visitor) const override;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.cpp
new file mode 100644
index 00000000000..e3cada25285
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.cpp
@@ -0,0 +1,132 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_address.h"
+#include "compact_tensor_v2_address_decoder.h"
+#include <algorithm>
+
+namespace vespalib {
+namespace tensor {
+
+namespace
+{
+
+void
+setupElements(CompactTensorAddress::Elements &elements,
+ CompactTensorAddressRef ref)
+{
+ const char *cur = static_cast<const char *>(ref.start());
+ const char *end = cur + ref.size();
+ while (cur != end) {
+ const char *dim = cur;
+ while (*cur) {
+ ++cur;
+ }
+ ++cur;
+ const char *label = cur;
+ while (*cur) {
+ ++cur;
+ }
+ ++cur;
+ elements.emplace_back(vespalib::stringref(dim, label - 1 - dim),
+ vespalib::stringref(label, cur - 1 - label));
+ }
+}
+
+
+}
+
+
+
+CompactTensorAddress::CompactTensorAddress()
+ : _elements()
+{
+}
+
+CompactTensorAddress::CompactTensorAddress(const Elements &elements_in)
+ : _elements(elements_in)
+{
+}
+
+bool
+CompactTensorAddress::hasDimension(const vespalib::string &dimension) const
+{
+ for (const auto &elem : _elements) {
+ if (elem.dimension() == dimension) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool
+CompactTensorAddress::operator<(const CompactTensorAddress &rhs) const
+{
+ size_t minSize = std::min(_elements.size(), rhs._elements.size());
+ for (size_t i = 0; i < minSize; ++i) {
+ if (_elements[i] != rhs._elements[i]) {
+ return _elements[i] < rhs._elements[i];
+ }
+ }
+ return _elements.size() < rhs._elements.size();
+}
+
+bool
+CompactTensorAddress::operator==(const CompactTensorAddress &rhs) const
+{
+ return _elements == rhs._elements;
+}
+
+
+void
+CompactTensorAddress::deserializeFromSparseAddressRef(CompactTensorAddressRef
+ ref)
+{
+ _elements.clear();
+ setupElements(_elements, ref);
+}
+
+
+void
+CompactTensorAddress::deserializeFromAddressRefV2(CompactTensorAddressRef ref,
+ const TensorDimensions &
+ dimensions)
+{
+ _elements.clear();
+ CompactTensorV2AddressDecoder addr(ref);
+ for (auto &dim : dimensions) {
+ auto label = addr.decodeLabel();
+ if (label.size() != 0u) {
+ _elements.emplace_back(dim, label);
+ }
+ }
+ assert(!addr.valid());
+}
+
+
+
+std::ostream &
+operator<<(std::ostream &out, const CompactTensorAddress::Elements &elements)
+{
+ out << "{";
+ bool first = true;
+ for (const auto &elem : elements) {
+ if (!first) {
+ out << ",";
+ }
+ out << elem.dimension() << ":" << elem.label();
+ first = false;
+ }
+ out << "}";
+ return out;
+}
+
+std::ostream &
+operator<<(std::ostream &out, const CompactTensorAddress &value)
+{
+ out << value.elements();
+ return out;
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.h
new file mode 100644
index 00000000000..509c267323c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address.h
@@ -0,0 +1,76 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <iostream>
+#include <vector>
+#include "compact_tensor_address_ref.h"
+#include <vespa/vespalib/tensor/types.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A compact sparse immutable address to a tensor cell.
+ *
+ * Only dimensions which have a different label than "undefined" are
+ * explicitly included.
+ *
+ * Tensor addresses are ordered by the natural order of the elements
+ * in sorted order.
+ */
+class CompactTensorAddress
+{
+public:
+ class Element
+ {
+ private:
+ vespalib::stringref _dimension;
+ vespalib::stringref _label;
+
+ public:
+ Element(vespalib::stringref dimension_in,
+ vespalib::stringref label_in)
+ : _dimension(dimension_in), _label(label_in)
+ {}
+ vespalib::stringref dimension() const { return _dimension; }
+ vespalib::stringref label() const { return _label; }
+ bool operator<(const Element &rhs) const {
+ if (_dimension == rhs._dimension) {
+ // Define sort order when dimension is the same to be able
+ // to do set operations over element vectors.
+ return _label < rhs._label;
+ }
+ return _dimension < rhs._dimension;
+ }
+ bool operator==(const Element &rhs) const {
+ return (_dimension == rhs._dimension) && (_label == rhs._label);
+ }
+ bool operator!=(const Element &rhs) const {
+ return !(*this == rhs);
+ }
+ };
+
+ typedef std::vector<Element> Elements;
+
+private:
+ Elements _elements;
+
+public:
+ CompactTensorAddress();
+ explicit CompactTensorAddress(const Elements &elements_in);
+ const Elements &elements() const { return _elements; }
+ bool hasDimension(const vespalib::string &dimension) const;
+ bool operator<(const CompactTensorAddress &rhs) const;
+ bool operator==(const CompactTensorAddress &rhs) const;
+ void deserializeFromSparseAddressRef(CompactTensorAddressRef ref);
+ void deserializeFromAddressRefV2(CompactTensorAddressRef ref,
+ const TensorDimensions &dimensions);
+};
+
+std::ostream &operator<<(std::ostream &out, const CompactTensorAddress::Elements &elements);
+std::ostream &operator<<(std::ostream &out, const CompactTensorAddress &value);
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.cpp
new file mode 100644
index 00000000000..03f2ec0fd15
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.cpp
@@ -0,0 +1,38 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_address_builder.h"
+#include <algorithm>
+
+namespace vespalib {
+namespace tensor {
+
+namespace
+{
+
+void
+append(std::vector<char> &address, vespalib::stringref str)
+{
+ const char *cstr = str.c_str();
+ address.insert(address.end(), cstr, cstr + str.size() + 1);
+}
+
+}
+
+CompactTensorAddressBuilder::CompactTensorAddressBuilder()
+ : _address()
+{
+}
+
+
+void
+CompactTensorAddressBuilder::add(vespalib::stringref dimension,
+ vespalib::stringref label)
+{
+ append(_address, dimension);
+ append(_address, label);
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.h
new file mode 100644
index 00000000000..2981352eef5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_builder.h
@@ -0,0 +1,36 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vector>
+#include "compact_tensor_address_ref.h"
+
+namespace vespalib {
+namespace tensor {
+
+
+class CompactTensorAddress;
+
+/**
+ * A writer to serialize tensor addresses into a compact representation.
+ *
+ * Format: (dimStr NUL labelStr NUL)*
+ */
+class CompactTensorAddressBuilder
+{
+private:
+ std::vector<char> _address;
+public:
+ CompactTensorAddressBuilder();
+ void add(vespalib::stringref dimension, vespalib::stringref label);
+ void clear() { _address.clear(); }
+ CompactTensorAddressRef getAddressRef() const {
+ return CompactTensorAddressRef(&_address[0], _address.size());
+ }
+ bool empty() const { return _address.empty(); }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_ref.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_ref.h
new file mode 100644
index 00000000000..fa49e2fd39c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_address_ref.h
@@ -0,0 +1,72 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vector>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+
+// From vespalib/util/hashmap.h
+size_t hashValue(const void * buf, size_t sz);
+
+namespace tensor {
+
+/**
+ * A reference to a compact sparse immutable address to a tensor cell.
+ */
+class CompactTensorAddressRef
+{
+ const void *_start;
+ size_t _size;
+ size_t _hash;
+public:
+ CompactTensorAddressRef()
+ : _start(nullptr), _size(0u), _hash(0u)
+ {
+ }
+
+ CompactTensorAddressRef(const void *start_in, size_t size_in)
+ : _start(start_in), _size(size_in),
+ _hash(calcHash())
+ {
+ }
+
+ CompactTensorAddressRef(const CompactTensorAddressRef rhs, Stash &stash)
+ : _start(nullptr),
+ _size(rhs._size),
+ _hash(rhs._hash)
+ {
+ void *res = stash.alloc(rhs._size);
+ memcpy(res, rhs._start, rhs._size);
+ _start = res;
+ }
+
+ size_t hash() const { return _hash; }
+
+ size_t calcHash() const { return hashValue(_start, _size); }
+
+ bool operator<(const CompactTensorAddressRef &rhs) const {
+ size_t minSize = std::min(_size, rhs._size);
+ int res = memcmp(_start, rhs._start, minSize);
+ if (res != 0) {
+ return res < 0;
+ }
+ return _size < rhs._size;
+ }
+
+ bool operator==(const CompactTensorAddressRef &rhs) const
+ {
+ if (_size != rhs._size || _hash != rhs._hash) {
+ return false;
+ }
+ return memcmp(_start, rhs._start, _size) == 0;
+ }
+
+ const void *start() const { return _start; }
+ size_t size() const { return _size; }
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.cpp
new file mode 100644
index 00000000000..e7a677253bd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.cpp
@@ -0,0 +1,82 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "compact_tensor_builder.h"
+#include <vespa/vespalib/tensor/tensor.h>
+
+namespace vespalib {
+namespace tensor {
+
+CompactTensorBuilder::CompactTensorBuilder()
+ : TensorBuilder(),
+ _addressBuilder(),
+ _normalizedAddressBuilder(),
+ _cells(),
+ _stash(CompactTensor::STASH_CHUNK_SIZE),
+ _dimensionsEnum(),
+ _dimensions()
+{
+}
+
+CompactTensorBuilder::~CompactTensorBuilder()
+{
+}
+
+
+TensorBuilder::Dimension
+CompactTensorBuilder::define_dimension(const vespalib::string &dimension)
+{
+ auto it = _dimensionsEnum.find(dimension);
+ if (it != _dimensionsEnum.end()) {
+ return it->second;
+ }
+ Dimension res = _dimensionsEnum.size();
+ auto insres = _dimensionsEnum.insert(std::make_pair(dimension, res));
+ assert(insres.second);
+ assert(insres.first->second == res);
+ assert(_dimensions.size() == res);
+ _dimensions.push_back(dimension);
+ return res;
+}
+
+TensorBuilder &
+CompactTensorBuilder::add_label(Dimension dimension,
+ const vespalib::string &label)
+{
+ assert(dimension <= _dimensions.size());
+ _addressBuilder.add(_dimensions[dimension], label);
+ return *this;
+}
+
+TensorBuilder &
+CompactTensorBuilder::add_cell(double value)
+{
+ _addressBuilder.buildTo(_normalizedAddressBuilder);
+ CompactTensorAddressRef taddress(_normalizedAddressBuilder.getAddressRef());
+ // Make a persistent copy of compact tensor address owned by _stash
+ CompactTensorAddressRef address(taddress, _stash);
+ _cells[address] = value;
+ _addressBuilder.clear();
+ _normalizedAddressBuilder.clear();
+ return *this;
+}
+
+
+Tensor::UP
+CompactTensorBuilder::build()
+{
+ assert(_addressBuilder.empty());
+ CompactTensor::Dimensions dimensions(_dimensions.begin(),
+ _dimensions.end());
+ std::sort(dimensions.begin(), dimensions.end());
+ Tensor::UP ret = std::make_unique<CompactTensor>(std::move(dimensions),
+ std::move(_cells),
+ std::move(_stash));
+ CompactTensor::Cells().swap(_cells);
+ _dimensionsEnum.clear();
+ _dimensions.clear();
+ return ret;
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.h
new file mode 100644
index 00000000000..d40235c8e92
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_builder.h
@@ -0,0 +1,42 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "compact_tensor.h"
+#include "compact_tensor_address_builder.h"
+#include "compact_tensor_unsorted_address_builder.h"
+#include <vespa/vespalib/tensor/tensor_builder.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A builder of compact tensors.
+ */
+class CompactTensorBuilder : public TensorBuilder
+{
+ CompactTensorUnsortedAddressBuilder _addressBuilder; // unsorted dimensions
+ CompactTensorAddressBuilder _normalizedAddressBuilder; // sorted dimensions
+ CompactTensor::Cells _cells;
+ Stash _stash;
+ vespalib::hash_map<vespalib::string, uint32_t> _dimensionsEnum;
+ std::vector<vespalib::string> _dimensions;
+public:
+ CompactTensorBuilder();
+ virtual ~CompactTensorBuilder();
+
+ virtual Dimension
+ define_dimension(const vespalib::string &dimension) override;
+ virtual TensorBuilder &
+ add_label(Dimension dimension,
+ const vespalib::string &label) override;
+ virtual TensorBuilder &add_cell(double value) override;
+
+ virtual Tensor::UP build() override;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.cpp
new file mode 100644
index 00000000000..18fdb83ed96
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.cpp
@@ -0,0 +1,60 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_dimension_sum.h"
+#include <vespa/vespalib/tensor/tensor_address_element_iterator.h>
+#include <vespa/vespalib/tensor/decoded_tensor_address_store.h>
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+template <class AddressBuilder, class Address>
+void
+removeDimension(AddressBuilder &addressBuilder,
+ const Address &address,
+ const vespalib::stringref dimension)
+{
+ addressBuilder.clear();
+ for (const auto &elem : address.elements()) {
+ if (elem.dimension() != dimension) {
+ addressBuilder.add(elem.dimension(), elem.label());
+ }
+ }
+}
+
+TensorDimensions
+removeDimension(const TensorDimensions &dimensions,
+ const vespalib::string &dimension)
+{
+ TensorDimensions result = dimensions;
+ auto itr = std::lower_bound(result.begin(), result.end(), dimension);
+ if (itr != result.end() && *itr == dimension) {
+ result.erase(itr);
+ }
+ return result;
+}
+
+}
+
+CompactTensorDimensionSum::CompactTensorDimensionSum(const TensorImplType &
+ tensor,
+ const vespalib::string &
+ dimension)
+ : Parent(removeDimension(tensor.dimensions(), dimension))
+{
+ AddressBuilderType reducedAddress;
+ DecodedTensorAddressStore<AddressType> cellAddr;
+ for (const auto &cell : tensor.cells()) {
+ cellAddr.set(cell.first);
+ removeDimension<AddressBuilderType, AddressType>
+ (reducedAddress, cellAddr.get(cell.first), dimension);
+ _builder.insertCell(reducedAddress, cell.second,
+ [](double cellValue, double rhsValue) { return cellValue + rhsValue; });
+ }
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.h
new file mode 100644
index 00000000000..7a5df115020
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_dimension_sum.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns a tensor with the given dimension removed and the cell values in that dimension summed.
+ */
+class CompactTensorDimensionSum : public TensorOperation<CompactTensor>
+{
+public:
+ using TensorImplType = CompactTensor;
+ using Parent = TensorOperation<CompactTensor>;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using AddressType = typename Parent::AddressType;
+ using Parent::_builder;
+ CompactTensorDimensionSum(const TensorImplType &tensor,
+ const vespalib::string &dimension);
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.cpp
new file mode 100644
index 00000000000..d66ae2d1fec
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.cpp
@@ -0,0 +1,128 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_product.h"
+#include <vespa/vespalib/tensor/tensor_address_element_iterator.h>
+#include <vespa/vespalib/tensor/dimensions_vector_iterator.h>
+#include <vespa/vespalib/tensor/decoded_tensor_address_store.h>
+#include <vespa/vespalib/tensor/join_tensor_addresses.h>
+#include <type_traits>
+
+constexpr bool onthefly_tensor_address_decoding = true;
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+template <class Dimensions>
+void
+calcIntersectDimensions(DimensionsVector &res,
+ const Dimensions &lhs, const Dimensions &rhs)
+{
+ std::set_intersection(lhs.cbegin(), lhs.cend(), rhs.cbegin(), rhs.cend(),
+ std::back_inserter(res));
+}
+
+
+template <class Dimensions>
+void
+calcIntersectDimensions(DimensionsSet &res,
+ const Dimensions &lhs, const Dimensions &rhs)
+{
+ for (const auto &dimension : lhs) {
+ if (std::binary_search(rhs.begin(), rhs.end(), dimension)) {
+ res.insert(vespalib::stringref(dimension.c_str(),
+ dimension.size()));
+ }
+ }
+}
+
+
+}
+
+
+template <class DimensionsCollection>
+void
+CompactTensorProduct::template bruteForceProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ DimensionsCollection iDims;
+ calcIntersectDimensions<Dimensions>(iDims,
+ lhs.dimensions(), rhs.dimensions());
+ using RhsAddressType =
+ typename std::conditional<onthefly_tensor_address_decoding,
+ AddressRefType, AddressType>::type;
+ DecodedTensorAddressStore<AddressType> lhsAddr;
+ DecodedTensorAddressStore<RhsAddressType> rhsAddr;
+ AddressBuilderType combinedAddress;
+ for (const auto &lhsCell : lhs.cells()) {
+ lhsAddr.set(lhsCell.first);
+ for (const auto &rhsCell : rhs.cells()) {
+ rhsAddr.set(rhsCell.first);
+ bool combineSuccess = joinTensorAddresses<AddressBuilderType,
+ AddressType, RhsAddressType>
+ (combinedAddress, iDims,
+ lhsAddr.get(lhsCell.first),
+ rhsAddr.get(rhsCell.first));
+ if (combineSuccess) {
+ _builder.insertCell(combinedAddress, lhsCell.second * rhsCell.second);
+ }
+ }
+ }
+}
+
+
+void
+CompactTensorProduct::fastProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ const typename TensorImplType::Cells &rhsCells = rhs.cells();
+ for (const auto &lhsCell : lhs.cells()) {
+ auto itr = rhsCells.find(lhsCell.first);
+ if (itr != rhsCells.end()) {
+ _builder.insertCell(lhsCell.first, lhsCell.second * itr->second);
+ }
+ }
+}
+
+
+CompactTensorProduct::CompactTensorProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+ : Parent(lhs.combineDimensionsWith(rhs))
+{
+#if 0
+ /* Commented ut for now since we want to see brute force performance. */
+ // All dimensions are common
+ if (lhs.dimensions().size() == rhs.dimensions().size() &&
+ lhs.dimensions().size() == _builder.dimensions().size()) {
+ fastProduct(lhs, rhs);
+ return;
+ }
+ // TODO: Handle zero cells or zero dimensions cases
+ // No dimensions are common
+ if (lhs.dimensions().size() + rhs.dimensions().size() ==
+ _builder.dimensions().size()) {
+ bruteForceNoCommonDimensionProduct(lhs, rhs);
+ return;
+ }
+ // lhs dimensions equals common dimensions
+ if (rhs.dimensions().size() == _builder.dimensions().size()) {
+ }
+ // rhs dimensions equals common dimensions
+ if (lhs.dimensions().size() == _builder.dimensions().size()) {
+ }
+#endif
+#if 1
+ // few common dimensions
+ bruteForceProduct<DimensionsVector>(lhs, rhs);
+#else
+ // many common dimensions, too expensive to iterate through all of
+ // them if each cell has relatively few dimensions.
+ bruteForceProduct<DimensionsSet>(lhs, rhs);
+#endif
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.h
new file mode 100644
index 00000000000..0c2db688730
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_product.h
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns the sparse tensor product of the two given tensors.
+ * This is all combinations of all cells in the first tensor with all cells of
+ * the second tensor, except the combinations which would have multiple labels
+ * for the same dimension due to shared dimensions between the two tensors.
+ *
+ * If there are no overlapping dimensions this is the regular tensor product.
+ * If the two tensors have exactly the same dimensions this is the Hadamard product.
+ *
+ * The sparse tensor is associative and commutative. Its dimensions are the
+ * set of the dimensions of the two input tensors.
+ */
+class CompactTensorProduct : public TensorOperation<CompactTensor>
+{
+public:
+ using TensorImplType = CompactTensor;
+ using Parent = TensorOperation<CompactTensor>;
+ using Dimensions = typename Parent::Dimensions;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using AddressRefType = typename Parent::AddressRefType;
+ using AddressType = typename Parent::AddressType;
+ using Parent::_builder;
+
+private:
+ template <class DimensionsCollection>
+ void
+ bruteForceProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+
+ void
+ fastProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+
+public:
+ CompactTensorProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.cpp
new file mode 100644
index 00000000000..a88cd40afc2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.cpp
@@ -0,0 +1,65 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_unsorted_address_builder.h"
+#include "compact_tensor_address_builder.h"
+#include "compact_tensor_v2_address_builder.h"
+#include <algorithm>
+
+namespace vespalib {
+namespace tensor {
+
+CompactTensorUnsortedAddressBuilder::CompactTensorUnsortedAddressBuilder()
+ : _elementStrings(),
+ _elements()
+{
+}
+
+
+void
+CompactTensorUnsortedAddressBuilder::buildTo(CompactTensorAddressBuilder &
+ builder)
+{
+ const char *base = &_elementStrings[0];
+ std::sort(_elements.begin(), _elements.end(),
+ [=](const ElementRef &lhs, const ElementRef &rhs)
+ { return lhs.getDimension(base) < rhs.getDimension(base); });
+ // build normalized address with sorted dimensions
+ for (const auto &element : _elements) {
+ builder.add(element.getDimension(base), element.getLabel(base));
+ }
+}
+
+void
+CompactTensorUnsortedAddressBuilder::buildTo(CompactTensorV2AddressBuilder &
+ builder,
+ const TensorDimensions &
+ dimensions)
+{
+ const char *base = &_elementStrings[0];
+ std::sort(_elements.begin(), _elements.end(),
+ [=](const ElementRef &lhs, const ElementRef &rhs)
+ { return lhs.getDimension(base) < rhs.getDimension(base); });
+ // build normalized address with sorted dimensions
+ auto dimsItr = dimensions.cbegin();
+ auto dimsItrEnd = dimensions.cend();
+ for (const auto &element : _elements) {
+ while ((dimsItr != dimsItrEnd) &&
+ (*dimsItr < element.getDimension(base))) {
+ builder.addUndefined();
+ ++dimsItr;
+ }
+ assert((dimsItr != dimsItrEnd) &&
+ (*dimsItr == element.getDimension(base)));
+ builder.add(element.getLabel(base));
+ ++dimsItr;
+ }
+ while (dimsItr != dimsItrEnd) {
+ builder.addUndefined();
+ ++dimsItr;
+ }
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.h
new file mode 100644
index 00000000000..a3c9b4d8ca0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_unsorted_address_builder.h
@@ -0,0 +1,83 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vector>
+#include <vespa/vespalib/tensor/types.h>
+
+namespace vespalib {
+namespace tensor {
+
+class CompactTensorAddressBuilder;
+class CompactTensorV2AddressBuilder;
+
+/**
+ * A builder that buffers up a tensor address with unsorted
+ * dimensions.
+ */
+class CompactTensorUnsortedAddressBuilder
+{
+ struct ElementStringRef
+ {
+ uint32_t _base;
+ uint32_t _len;
+ ElementStringRef(uint32_t base, uint32_t len)
+ : _base(base), _len(len)
+ {
+ }
+ vespalib::stringref asStringRef(const char *base) const
+ {
+ return vespalib::stringref(base + _base, _len);
+ }
+ };
+ struct ElementRef
+ {
+ ElementStringRef _dimension;
+ ElementStringRef _label;
+ ElementRef(ElementStringRef dimension,
+ ElementStringRef label)
+ : _dimension(dimension),
+ _label(label)
+ {
+ }
+ vespalib::stringref getDimension(const char *base) const {
+ return _dimension.asStringRef(base);
+ }
+ vespalib::stringref getLabel(const char *base) const {
+ return _label.asStringRef(base);
+ }
+ };
+ std::vector<char> _elementStrings; // unsorted dimensions
+ std::vector<ElementRef> _elements; // unsorted dimensions
+
+ ElementStringRef
+ append(vespalib::stringref str)
+ {
+ const char *cstr = str.c_str();
+ uint32_t start = _elementStrings.size();
+ _elementStrings.insert(_elementStrings.end(),
+ cstr, cstr + str.size() + 1);
+ return ElementStringRef(start, str.size());
+ }
+
+public:
+ CompactTensorUnsortedAddressBuilder();
+ bool empty() const { return _elementStrings.empty(); }
+ void add(vespalib::stringref dimension, vespalib::stringref label)
+ {
+ _elements.emplace_back(append(dimension), append(label));
+ }
+ /*
+ * Sort the stored tensor address and pass it over to a strict
+ * tensor address builder in sorted order.
+ */
+ void buildTo(CompactTensorAddressBuilder &builder);
+ void buildTo(CompactTensorV2AddressBuilder &builder,
+ const TensorDimensions &dimensions);
+ void clear() { _elementStrings.clear(); _elements.clear(); }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp
new file mode 100644
index 00000000000..056637f2a1c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp
@@ -0,0 +1,207 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_v2.h"
+#include "compact_tensor_v2_address_builder.h"
+#include "compact_tensor_v2_dimension_sum.h"
+#include "compact_tensor_v2_match.h"
+#include "compact_tensor_v2_product.h"
+#include "join_compact_tensors_v2.h"
+#include <vespa/vespalib/tensor/tensor_apply.h>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+#include <sstream>
+
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+using Cells = CompactTensorV2::Cells;
+
+void
+copyCells(Cells &cells, const Cells &cells_in, Stash &stash)
+{
+ for (const auto &cell : cells_in) {
+ CompactTensorAddressRef oldRef = cell.first;
+ CompactTensorAddressRef newRef(oldRef, stash);
+ cells[newRef] = cell.second;
+ }
+}
+
+}
+
+CompactTensorV2::CompactTensorV2(const Dimensions &dimensions_in,
+ const Cells &cells_in)
+ : _cells(),
+ _dimensions(dimensions_in),
+ _stash(STASH_CHUNK_SIZE)
+{
+ copyCells(_cells, cells_in, _stash);
+}
+
+
+CompactTensorV2::CompactTensorV2(Dimensions &&dimensions_in,
+ Cells &&cells_in, Stash &&stash_in)
+ : _cells(std::move(cells_in)),
+ _dimensions(std::move(dimensions_in)),
+ _stash(std::move(stash_in))
+{
+}
+
+
+bool
+CompactTensorV2::operator==(const CompactTensorV2 &rhs) const
+{
+ return _dimensions == rhs._dimensions && _cells == rhs._cells;
+}
+
+
+CompactTensorV2::Dimensions
+CompactTensorV2::combineDimensionsWith(const CompactTensorV2 &rhs) const
+{
+ Dimensions result;
+ std::set_union(_dimensions.cbegin(), _dimensions.cend(),
+ rhs._dimensions.cbegin(), rhs._dimensions.cend(),
+ std::back_inserter(result));
+ return result;
+}
+
+TensorType
+CompactTensorV2::getType() const
+{
+ return TensorType::sparse(_dimensions);
+}
+
+double
+CompactTensorV2::sum() const
+{
+ double result = 0.0;
+ for (const auto &cell : _cells) {
+ result += cell.second;
+ }
+ return result;
+}
+
+Tensor::UP
+CompactTensorV2::add(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
+ return joinCompactTensorsV2(*this, rhs,
+ [](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
+}
+
+Tensor::UP
+CompactTensorV2::subtract(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
+ // Note that -rhsCell.second is passed to the lambda function, that is why we do addition.
+ return joinCompactTensorsV2Negated(*this, rhs,
+ [](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
+}
+
+Tensor::UP
+CompactTensorV2::multiply(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ return CompactTensorV2Product(*this, static_cast<const CompactTensorV2 &>(arg)).result();
+}
+
+Tensor::UP
+CompactTensorV2::min(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
+ return joinCompactTensorsV2(*this, rhs,
+ [](double lhsValue, double rhsValue) { return std::min(lhsValue, rhsValue); });
+}
+
+Tensor::UP
+CompactTensorV2::max(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
+ return joinCompactTensorsV2(*this, rhs,
+ [](double lhsValue, double rhsValue) { return std::max(lhsValue, rhsValue); });
+}
+
+Tensor::UP
+CompactTensorV2::match(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ return CompactTensorV2Match(*this, static_cast<const CompactTensorV2 &>(arg)).result();
+}
+
+Tensor::UP
+CompactTensorV2::apply(const CellFunction &func) const
+{
+ return TensorApply<CompactTensorV2>(*this, func).result();
+}
+
+Tensor::UP
+CompactTensorV2::sum(const vespalib::string &dimension) const
+{
+ return CompactTensorV2DimensionSum(*this, dimension).result();
+}
+
+bool
+CompactTensorV2::equals(const Tensor &arg) const
+{
+ return *this == static_cast<const CompactTensorV2 &>(arg);
+}
+
+vespalib::string
+CompactTensorV2::toString() const
+{
+ std::ostringstream stream;
+ stream << *this;
+ return stream.str();
+}
+
+Tensor::UP
+CompactTensorV2::clone() const
+{
+ return std::make_unique<CompactTensorV2>(_dimensions, _cells);
+}
+
+void
+CompactTensorV2::print(std::ostream &out) const
+{
+ out << "{ ";
+ bool first = true;
+ CompactTensorAddress addr;
+ for (const auto &cell : cells()) {
+ if (!first) {
+ out << ", ";
+ }
+ addr.deserializeFromAddressRefV2(cell.first, _dimensions);
+ out << addr << ":" << cell.second;
+ first = false;
+ }
+ out << " }";
+}
+
+void
+CompactTensorV2::accept(TensorVisitor &visitor) const
+{
+ TensorAddressBuilder addrBuilder;
+ TensorAddress addr;
+ for (const auto &cell : _cells) {
+ CompactTensorV2AddressDecoder decoder(cell.first);
+ addrBuilder.clear();
+ for (const auto &dimension : _dimensions) {
+ auto label = decoder.decodeLabel();
+ if (label.size() != 0u) {
+ addrBuilder.add(dimension, label);
+ }
+ }
+ assert(!decoder.valid());
+ addr = addrBuilder.build();
+ visitor.visit(addr, cell.second);
+ }
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.h
new file mode 100644
index 00000000000..d45dd4a0004
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.h
@@ -0,0 +1,63 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/cell_function.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include "compact_tensor_address.h"
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A tensor implementation using serialized tensor addresses to
+ * improve CPU cache and TLB hit ratio, relative to SimpleTensor
+ * implementation.
+ */
+class CompactTensorV2 : public Tensor
+{
+public:
+ typedef vespalib::hash_map<CompactTensorAddressRef, double> Cells;
+ typedef TensorDimensions Dimensions;
+
+ static constexpr size_t STASH_CHUNK_SIZE = 16384u;
+
+private:
+ Cells _cells;
+ Dimensions _dimensions;
+ Stash _stash;
+
+public:
+ explicit CompactTensorV2(const Dimensions &dimensions_in,
+ const Cells &cells_in);
+ CompactTensorV2(Dimensions &&dimensions_in,
+ Cells &&cells_in, Stash &&stash_in);
+ const Cells &cells() const { return _cells; }
+ const Dimensions &dimensions() const { return _dimensions; }
+ bool operator==(const CompactTensorV2 &rhs) const;
+ Dimensions combineDimensionsWith(const CompactTensorV2 &rhs) const;
+
+ virtual TensorType getType() const override;
+ virtual double sum() const override;
+ virtual Tensor::UP add(const Tensor &arg) const override;
+ virtual Tensor::UP subtract(const Tensor &arg) const override;
+ virtual Tensor::UP multiply(const Tensor &arg) const override;
+ virtual Tensor::UP min(const Tensor &arg) const override;
+ virtual Tensor::UP max(const Tensor &arg) const override;
+ virtual Tensor::UP match(const Tensor &arg) const override;
+ virtual Tensor::UP apply(const CellFunction &func) const override;
+ virtual Tensor::UP sum(const vespalib::string &dimension) const override;
+ virtual bool equals(const Tensor &arg) const override;
+ virtual void print(std::ostream &out) const override;
+ virtual vespalib::string toString() const override;
+ virtual Tensor::UP clone() const override;
+ virtual void accept(TensorVisitor &visitor) const override;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_builder.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_builder.h
new file mode 100644
index 00000000000..a029d84433f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_builder.h
@@ -0,0 +1,49 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vector>
+#include "compact_tensor_address_ref.h"
+
+namespace vespalib {
+namespace tensor {
+
+
+class CompactTensorAddress;
+
+/**
+ * A writer to serialize tensor addresses into a compact representation.
+ * All dimensions in the tensors are present, empty label is the "undefined"
+ * value.
+ *
+ * Format: (labelStr NUL)*
+ */
+class CompactTensorV2AddressBuilder
+{
+private:
+ std::vector<char> _address;
+
+ void
+ append(vespalib::stringref str)
+ {
+ const char *cstr = str.c_str();
+ _address.insert(_address.end(), cstr, cstr + str.size() + 1);
+ }
+public:
+ CompactTensorV2AddressBuilder()
+ : _address()
+ {
+ }
+ void add(vespalib::stringref label) { append(label); }
+ void addUndefined() { _address.emplace_back('\0'); }
+ void clear() { _address.clear(); }
+ CompactTensorAddressRef getAddressRef() const {
+ return CompactTensorAddressRef(&_address[0], _address.size());
+ }
+ bool empty() const { return _address.empty(); }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_decoder.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_decoder.h
new file mode 100644
index 00000000000..3d22ad69b6f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_decoder.h
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include "compact_tensor_address_ref.h"
+
+namespace vespalib {
+
+
+namespace tensor {
+
+/**
+ * A decoder for a serialized tensor address, with only labels present.
+ */
+class CompactTensorV2AddressDecoder
+{
+ const char *_cur;
+ const char *_end;
+public:
+ CompactTensorV2AddressDecoder(CompactTensorAddressRef ref)
+ : _cur(static_cast<const char *>(ref.start())),
+ _end(_cur + ref.size())
+ {
+ }
+
+ bool valid() const { return _cur != _end; }
+
+ void skipLabel() {
+ while (*_cur != '\0') {
+ ++_cur;
+ }
+ ++_cur;
+ }
+ vespalib::stringref decodeLabel() {
+ const char *base = _cur;
+ skipLabel();
+ return vespalib::stringref(base, _cur - base - 1);
+ }
+
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_padder.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_padder.h
new file mode 100644
index 00000000000..9ab2c8833ba
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_address_padder.h
@@ -0,0 +1,69 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "compact_tensor_v2_address_builder.h"
+#include "compact_tensor_v2_address_decoder.h"
+
+namespace vespalib {
+namespace tensor {
+
+
+/**
+ * This class transforms serialized compact tensor v2 addresses by padding
+ * in "undefined" labels for new dimensions.
+ */
+class CompactTensorV2AddressPadder : public CompactTensorV2AddressBuilder
+{
+ enum class PadOp
+ {
+ PAD,
+ COPY
+ };
+
+ std::vector<PadOp> _padOps;
+
+public:
+ CompactTensorV2AddressPadder(const TensorDimensions &resultDims,
+ const TensorDimensions &inputDims)
+ : CompactTensorV2AddressBuilder(),
+ _padOps()
+ {
+ auto resultDimsItr = resultDims.cbegin();
+ auto resultDimsItrEnd = resultDims.cend();
+ for (auto &dim : inputDims) {
+ while (resultDimsItr != resultDimsItrEnd && *resultDimsItr < dim) {
+ _padOps.push_back(PadOp::PAD);
+ ++resultDimsItr;
+ }
+ assert(resultDimsItr != resultDimsItrEnd && *resultDimsItr == dim);
+ _padOps.push_back(PadOp::COPY);
+ ++resultDimsItr;
+ }
+ while (resultDimsItr != resultDimsItrEnd) {
+ _padOps.push_back(PadOp::PAD);
+ ++resultDimsItr;
+ }
+ }
+
+ void
+ padAddress(CompactTensorAddressRef ref)
+ {
+ clear();
+ CompactTensorV2AddressDecoder addr(ref);
+ for (auto op : _padOps) {
+ switch (op) {
+ case PadOp::PAD:
+ addUndefined();
+ break;
+ default:
+ add(addr.decodeLabel());
+ }
+ }
+ assert(!addr.valid());
+ }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.cpp
new file mode 100644
index 00000000000..379943f10eb
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.cpp
@@ -0,0 +1,99 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "compact_tensor_v2_builder.h"
+#include <vespa/vespalib/tensor/tensor.h>
+
+namespace vespalib {
+namespace tensor {
+
+CompactTensorV2Builder::CompactTensorV2Builder()
+ : TensorBuilder(),
+ _addressBuilder(),
+ _normalizedAddressBuilder(),
+ _cells(),
+ _stash(CompactTensorV2::STASH_CHUNK_SIZE),
+ _dimensionsEnum(),
+ _dimensions(),
+ _sortedDimensions()
+{
+}
+
+CompactTensorV2Builder::~CompactTensorV2Builder()
+{
+}
+
+
+void
+CompactTensorV2Builder::makeSortedDimensions()
+{
+ assert(_sortedDimensions.empty());
+ assert(_cells.empty());
+ _sortedDimensions = _dimensions;
+ std::sort(_sortedDimensions.begin(), _sortedDimensions.end());
+}
+
+
+TensorBuilder::Dimension
+CompactTensorV2Builder::define_dimension(const vespalib::string &dimension)
+{
+ auto it = _dimensionsEnum.find(dimension);
+ if (it != _dimensionsEnum.end()) {
+ return it->second;
+ }
+ Dimension res = _dimensionsEnum.size();
+ auto insres = _dimensionsEnum.insert(std::make_pair(dimension, res));
+ assert(insres.second);
+ assert(insres.first->second == res);
+ assert(_dimensions.size() == res);
+ _dimensions.push_back(dimension);
+ return res;
+}
+
+TensorBuilder &
+CompactTensorV2Builder::add_label(Dimension dimension,
+ const vespalib::string &label)
+{
+ assert(dimension <= _dimensions.size());
+ _addressBuilder.add(_dimensions[dimension], label);
+ return *this;
+}
+
+TensorBuilder &
+CompactTensorV2Builder::add_cell(double value)
+{
+ if (_dimensions.size() != _sortedDimensions.size()) {
+ makeSortedDimensions();
+ }
+ _addressBuilder.buildTo(_normalizedAddressBuilder, _sortedDimensions);
+ CompactTensorAddressRef taddress(_normalizedAddressBuilder.getAddressRef());
+ // Make a persistent copy of compact tensor address owned by _stash
+ CompactTensorAddressRef address(taddress, _stash);
+ _cells[address] = value;
+ _addressBuilder.clear();
+ _normalizedAddressBuilder.clear();
+ return *this;
+}
+
+
+Tensor::UP
+CompactTensorV2Builder::build()
+{
+ assert(_addressBuilder.empty());
+ if (_dimensions.size() != _sortedDimensions.size()) {
+ makeSortedDimensions();
+ }
+ CompactTensorV2::Dimensions dimensions(_sortedDimensions.begin(),
+ _sortedDimensions.end());
+ Tensor::UP ret = std::make_unique<CompactTensorV2>(std::move(dimensions),
+ std::move(_cells),
+ std::move(_stash));
+ CompactTensorV2::Cells().swap(_cells);
+ _dimensionsEnum.clear();
+ _dimensions.clear();
+ _sortedDimensions.clear();
+ return ret;
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h
new file mode 100644
index 00000000000..a206d882f32
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_builder.h
@@ -0,0 +1,45 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "compact_tensor_v2.h"
+#include "compact_tensor_v2_address_builder.h"
+#include "compact_tensor_unsorted_address_builder.h"
+#include <vespa/vespalib/tensor/tensor_builder.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/util/stash.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A builder of compact tensors.
+ */
+class CompactTensorV2Builder : public TensorBuilder
+{
+ CompactTensorUnsortedAddressBuilder _addressBuilder; // unsorted dimensions
+ CompactTensorV2AddressBuilder _normalizedAddressBuilder; // sorted dimensions
+ CompactTensorV2::Cells _cells;
+ Stash _stash;
+ vespalib::hash_map<vespalib::string, uint32_t> _dimensionsEnum;
+ std::vector<vespalib::string> _dimensions;
+ std::vector<vespalib::string> _sortedDimensions;
+
+ void makeSortedDimensions();
+public:
+ CompactTensorV2Builder();
+ virtual ~CompactTensorV2Builder();
+
+ virtual Dimension
+ define_dimension(const vespalib::string &dimension) override;
+ virtual TensorBuilder &
+ add_label(Dimension dimension,
+ const vespalib::string &label) override;
+ virtual TensorBuilder &add_cell(double value) override;
+
+ virtual Tensor::UP build() override;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.cpp
new file mode 100644
index 00000000000..d76078ba52e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.cpp
@@ -0,0 +1,89 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_v2_dimension_sum.h"
+#include "compact_tensor_v2_address_decoder.h"
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+enum class AddressOp
+{
+ REMOVE,
+ COPY
+};
+
+using ReduceOps = std::vector<AddressOp>;
+
+
+ReduceOps
+buildReduceOps(const TensorDimensions &dims,
+ const vespalib::stringref &dimension)
+{
+ ReduceOps ops;
+ for (auto &dim : dims) {
+ if (dim == dimension) {
+ ops.push_back(AddressOp::REMOVE);
+ } else {
+ ops.push_back(AddressOp::COPY);
+ }
+ }
+ return ops;
+}
+
+
+void
+reduceAddress(CompactTensorV2AddressBuilder &builder,
+ CompactTensorAddressRef ref,
+ const ReduceOps &ops)
+{
+ builder.clear();
+ CompactTensorV2AddressDecoder addr(ref);
+ for (auto op : ops) {
+ switch (op) {
+ case AddressOp::REMOVE:
+ addr.skipLabel();
+ break;
+ case AddressOp::COPY:
+ builder.add(addr.decodeLabel());
+ break;
+ }
+ }
+ assert(!addr.valid());
+}
+
+TensorDimensions
+removeDimension(const TensorDimensions &dimensions,
+ const vespalib::string &dimension)
+{
+ TensorDimensions result = dimensions;
+ auto itr = std::lower_bound(result.begin(), result.end(), dimension);
+ if (itr != result.end() && *itr == dimension) {
+ result.erase(itr);
+ }
+ return result;
+}
+
+}
+
+CompactTensorV2DimensionSum::CompactTensorV2DimensionSum(const TensorImplType &
+ tensor,
+ const
+ vespalib::string &
+ dimension)
+ : Parent(removeDimension(tensor.dimensions(), dimension))
+{
+ ReduceOps ops(buildReduceOps(tensor.dimensions(), dimension));
+ AddressBuilderType reducedAddress;
+ for (const auto &cell : tensor.cells()) {
+ reduceAddress(reducedAddress, cell.first, ops);
+ _builder.insertCell(reducedAddress, cell.second,
+ [](double cellValue, double rhsValue) { return cellValue + rhsValue; });
+ }
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.h
new file mode 100644
index 00000000000..959135ce91c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_dimension_sum.h
@@ -0,0 +1,26 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns a tensor with the given dimension removed and the cell values in that dimension summed.
+ */
+class CompactTensorV2DimensionSum : public TensorOperation<CompactTensorV2>
+{
+public:
+ using TensorImplType = CompactTensorV2;
+ using Parent = TensorOperation<CompactTensorV2>;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using AddressType = typename Parent::AddressType;
+ using Parent::_builder;
+ CompactTensorV2DimensionSum(const TensorImplType &tensor,
+ const vespalib::string &dimension);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.cpp
new file mode 100644
index 00000000000..c8044a5f828
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.cpp
@@ -0,0 +1,125 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_v2_match.h"
+#include "compact_tensor_v2_address_decoder.h"
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+enum class AddressOp
+{
+ REMOVE,
+ PAD,
+ COPY
+};
+
+
+void
+buildTransformOps(std::vector<AddressOp> &ops,
+ const TensorDimensions &lhs,
+ const TensorDimensions &rhs)
+{
+ auto rhsItr = rhs.cbegin();
+ auto rhsItrEnd = rhs.cend();
+ for (auto &lhsDim : lhs) {
+ while (rhsItr != rhsItrEnd && *rhsItr < lhsDim) {
+ ops.push_back(AddressOp::PAD);
+ ++rhsItr;
+ }
+ if (rhsItr != rhsItrEnd && *rhsItr == lhsDim) {
+ ops.push_back(AddressOp::COPY);
+ ++rhsItr;
+ } else {
+ ops.push_back(AddressOp::REMOVE);
+ }
+ }
+ while (rhsItr != rhsItrEnd) {
+ ops.push_back(AddressOp::PAD);
+ ++rhsItr;
+ }
+}
+
+
+bool
+transformAddress(CompactTensorV2AddressBuilder &builder,
+ CompactTensorAddressRef ref,
+ const std::vector<AddressOp> &ops)
+{
+ builder.clear();
+ CompactTensorV2AddressDecoder addr(ref);
+ for (auto op : ops) {
+ switch (op) {
+ case AddressOp::REMOVE:
+ {
+ auto label = addr.decodeLabel();
+ if (label.size() != 0u) {
+ return false;
+ }
+ }
+ break;
+ case AddressOp::PAD:
+ builder.addUndefined();
+ break;
+ case AddressOp::COPY:
+ builder.add(addr.decodeLabel());
+ }
+ }
+ assert(!addr.valid());
+ return true;
+}
+
+}
+
+
+void
+CompactTensorV2Match::fastMatch(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ for (const auto &lhsCell : lhs.cells()) {
+ auto rhsItr = rhs.cells().find(lhsCell.first);
+ if (rhsItr != rhs.cells().end()) {
+ _builder.insertCell(lhsCell.first, lhsCell.second * rhsItr->second);
+ }
+ }
+}
+
+void
+CompactTensorV2Match::slowMatch(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ std::vector<AddressOp> ops;
+ CompactTensorV2AddressBuilder addressBuilder;
+ CompactTensorV2AddressPadder addressPadder(_builder.dimensions(),
+ lhs.dimensions());
+ buildTransformOps(ops, lhs.dimensions(), rhs.dimensions());
+ for (const auto &lhsCell : lhs.cells()) {
+ if (!transformAddress(addressBuilder, lhsCell.first, ops)) {
+ continue;
+ }
+ CompactTensorAddressRef ref(addressBuilder.getAddressRef());
+ auto rhsItr = rhs.cells().find(ref);
+ if (rhsItr != rhs.cells().end()) {
+ addressPadder.padAddress(lhsCell.first);
+ _builder.insertCell(addressPadder, lhsCell.second * rhsItr->second);
+ }
+ }
+}
+
+CompactTensorV2Match::CompactTensorV2Match(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+ : Parent(lhs.combineDimensionsWith(rhs))
+{
+ if ((lhs.dimensions().size() == rhs.dimensions().size()) &&
+ (lhs.dimensions().size() == _builder.dimensions().size())) {
+ fastMatch(lhs, rhs);
+ } else {
+ slowMatch(lhs, rhs);
+ }
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.h
new file mode 100644
index 00000000000..99fc3ce457a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_match.h
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns the match product of two tensors.
+ * This returns a tensor which contains the matching cells in the two tensors,
+ * with their values multiplied.
+ *
+ * If the two tensors have exactly the same dimensions, this is the Hadamard product.
+ */
+class CompactTensorV2Match : public TensorOperation<CompactTensorV2>
+{
+public:
+ using Parent = TensorOperation<CompactTensorV2>;
+ using typename Parent::TensorImplType;
+ using Parent::_builder;
+private:
+ void fastMatch(const TensorImplType &lhs, const TensorImplType &rhs);
+ void slowMatch(const TensorImplType &lhs, const TensorImplType &rhs);
+public:
+ CompactTensorV2Match(const TensorImplType &lhs, const TensorImplType &rhs);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.cpp
new file mode 100644
index 00000000000..3eeb68b3098
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.cpp
@@ -0,0 +1,148 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_tensor_v2_product.h"
+#include "compact_tensor_v2_address_decoder.h"
+#include <type_traits>
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+enum class AddressOp
+{
+ LHS,
+ RHS,
+ BOTH
+};
+
+using CombineOps = std::vector<AddressOp>;
+
+CombineOps
+buildCombineOps(const TensorDimensions &lhs,
+ const TensorDimensions &rhs)
+{
+ CombineOps ops;
+ auto rhsItr = rhs.cbegin();
+ auto rhsItrEnd = rhs.cend();
+ for (auto &lhsDim : lhs) {
+ while (rhsItr != rhsItrEnd && *rhsItr < lhsDim) {
+ ops.push_back(AddressOp::RHS);
+ ++rhsItr;
+ }
+ if (rhsItr != rhsItrEnd && *rhsItr == lhsDim) {
+ ops.push_back(AddressOp::BOTH);
+ ++rhsItr;
+ } else {
+ ops.push_back(AddressOp::LHS);
+ }
+ }
+ while (rhsItr != rhsItrEnd) {
+ ops.push_back(AddressOp::RHS);
+ ++rhsItr;
+ }
+ return ops;
+}
+
+
+bool
+combineAddresses(CompactTensorV2AddressBuilder &builder,
+ CompactTensorAddressRef lhsRef,
+ CompactTensorAddressRef rhsRef,
+ const CombineOps &ops)
+{
+ builder.clear();
+ CompactTensorV2AddressDecoder lhs(lhsRef);
+ CompactTensorV2AddressDecoder rhs(rhsRef);
+ for (auto op : ops) {
+ switch (op) {
+ case AddressOp::LHS:
+ builder.add(lhs.decodeLabel());
+ break;
+ case AddressOp::RHS:
+ builder.add(rhs.decodeLabel());
+ break;
+ case AddressOp::BOTH:
+ auto lhsLabel(lhs.decodeLabel());
+ auto rhsLabel(rhs.decodeLabel());
+ if (lhsLabel != rhsLabel) {
+ return false;
+ }
+ builder.add(lhsLabel);
+ }
+ }
+ assert(!lhs.valid());
+ assert(!rhs.valid());
+ return true;
+}
+
+}
+
+
+void
+CompactTensorV2Product::bruteForceProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ CombineOps ops(buildCombineOps(lhs.dimensions(), rhs.dimensions()));
+ CompactTensorV2AddressBuilder addressBuilder;
+ for (const auto &lhsCell : lhs.cells()) {
+ for (const auto &rhsCell : rhs.cells()) {
+ bool combineSuccess = combineAddresses(addressBuilder,
+ lhsCell.first, rhsCell.first,
+ ops);
+ if (combineSuccess) {
+ _builder.insertCell(addressBuilder.getAddressRef(),
+ lhsCell.second * rhsCell.second);
+ }
+ }
+ }
+}
+
+
+void
+CompactTensorV2Product::fastProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ const typename TensorImplType::Cells &rhsCells = rhs.cells();
+ for (const auto &lhsCell : lhs.cells()) {
+ auto itr = rhsCells.find(lhsCell.first);
+ if (itr != rhsCells.end()) {
+ _builder.insertCell(lhsCell.first,
+ lhsCell.second * itr->second);
+ }
+ }
+}
+
+
+CompactTensorV2Product::CompactTensorV2Product(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+ : Parent(lhs.combineDimensionsWith(rhs))
+{
+#if 0
+ /* Commented ut for now since we want to see brute force performance. */
+ // All dimensions are common
+ if (lhs.dimensions().size() == rhs.dimensions().size() &&
+ lhs.dimensions().size() == _builder.dimensions().size()) {
+ fastProduct(lhs, rhs);
+ return;
+ }
+ // TODO: Handle zero cells or zero dimensions cases
+ // No dimensions are common
+ if (lhs.dimensions().size() + rhs.dimensions().size() ==
+ _builder.dimensions().size()) {
+ bruteForceNoCommonDimensionProduct(lhs, rhs);
+ return;
+ }
+ // lhs dimensions equals common dimensions
+ if (rhs.dimensions().size() == _builder.dimensions().size()) {
+ }
+ // rhs dimensions equals common dimensions
+ if (lhs.dimensions().size() == _builder.dimensions().size()) {
+ }
+#endif
+ bruteForceProduct(lhs, rhs);
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.h b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.h
new file mode 100644
index 00000000000..c0e2f8f4088
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2_product.h
@@ -0,0 +1,47 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns the sparse tensor product of the two given tensors.
+ * This is all combinations of all cells in the first tensor with all cells of
+ * the second tensor, except the combinations which would have multiple labels
+ * for the same dimension due to shared dimensions between the two tensors.
+ *
+ * If there are no overlapping dimensions this is the regular tensor product.
+ * If the two tensors have exactly the same dimensions this is the Hadamard product.
+ *
+ * The sparse tensor is associative and commutative. Its dimensions are the
+ * set of the dimensions of the two input tensors.
+ */
+class CompactTensorV2Product : public TensorOperation<CompactTensorV2>
+{
+public:
+ using TensorImplType = CompactTensorV2;
+ using Parent = TensorOperation<CompactTensorV2>;
+ using Dimensions = typename Parent::Dimensions;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using AddressRefType = typename Parent::AddressRefType;
+ using AddressType = typename Parent::AddressType;
+ using Parent::_builder;
+
+private:
+ void
+ bruteForceProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+
+ void
+ fastProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+
+public:
+ CompactTensorV2Product(const TensorImplType &lhs,
+ const TensorImplType &rhs);
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_builder.h b/vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_builder.h
new file mode 100644
index 00000000000..ffd0133f4f0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_builder.h
@@ -0,0 +1,108 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/direct_tensor_builder.h>
+#include "compact_tensor.h"
+#include "compact_tensor_address_builder.h"
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Utility class to build tensors of type CompactTensor, to be used by
+ * tensor operations.
+ */
+template <> class DirectTensorBuilder<CompactTensor>
+{
+public:
+ using TensorImplType = CompactTensor;
+ using Dimensions = typename TensorImplType::Dimensions;
+ using Cells = typename TensorImplType::Cells;
+ using AddressBuilderType = CompactTensorAddressBuilder;
+ using AddressRefType = CompactTensorAddressRef;
+ using AddressType = CompactTensorAddress;
+
+private:
+ Stash _stash;
+ Dimensions _dimensions;
+ Cells _cells;
+
+public:
+ void
+ copyCells(const Cells &cells_in)
+ {
+ for (const auto &cell : cells_in) {
+ CompactTensorAddressRef oldRef = cell.first;
+ CompactTensorAddressRef newRef(oldRef, _stash);
+ _cells[newRef] = cell.second;
+ }
+ }
+
+ DirectTensorBuilder()
+ : _stash(TensorImplType::STASH_CHUNK_SIZE),
+ _dimensions(),
+ _cells()
+ {
+ }
+
+ DirectTensorBuilder(const Dimensions &dimensions_in)
+ : _stash(TensorImplType::STASH_CHUNK_SIZE),
+ _dimensions(dimensions_in),
+ _cells()
+ {
+ }
+
+ DirectTensorBuilder(const Dimensions &dimensions_in,
+ const Cells &cells_in)
+ : _stash(TensorImplType::STASH_CHUNK_SIZE),
+ _dimensions(dimensions_in),
+ _cells()
+ {
+ copyCells(cells_in);
+ }
+
+ Tensor::UP build() {
+ return std::make_unique<CompactTensor>(std::move(_dimensions),
+ std::move(_cells),
+ std::move(_stash));
+ }
+
+ template <class Function>
+ void insertCell(CompactTensorAddressRef address, double value,
+ Function &&func)
+ {
+ CompactTensorAddressRef oldRef(address);
+ auto res = _cells.insert(std::make_pair(oldRef, value));
+ if (res.second) {
+ // Replace key with own copy
+ res.first->first = CompactTensorAddressRef(oldRef, _stash);
+ } else {
+ res.first->second = func(res.first->second, value);
+ }
+ }
+
+ void insertCell(CompactTensorAddressRef address, double value) {
+ // This address should not already exist and a new cell should be inserted.
+ insertCell(address, value, [](double, double) -> double { abort(); });
+ }
+
+ template <class Function>
+ void insertCell(CompactTensorAddressBuilder &address, double value,
+ Function &&func)
+ {
+ insertCell(address.getAddressRef(), value, func);
+ }
+
+ void insertCell(CompactTensorAddressBuilder &address, double value) {
+ // This address should not already exist and a new cell should be inserted.
+ insertCell(address.getAddressRef(), value,
+ [](double, double) -> double { abort(); });
+ }
+
+ Dimensions &dimensions() { return _dimensions; }
+ Cells &cells() { return _cells; }
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_v2_builder.h b/vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_v2_builder.h
new file mode 100644
index 00000000000..6864895547a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/direct_compact_tensor_v2_builder.h
@@ -0,0 +1,135 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/direct_tensor_builder.h>
+#include "compact_tensor_v2.h"
+#include "compact_tensor_v2_address_builder.h"
+#include "compact_tensor_v2_address_padder.h"
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Utility class to build tensors of type CompactTensorV2, to be used by
+ * tensor operations.
+ */
+template <> class DirectTensorBuilder<CompactTensorV2>
+{
+public:
+ using TensorImplType = CompactTensorV2;
+ using Dimensions = typename TensorImplType::Dimensions;
+ using Cells = typename TensorImplType::Cells;
+ using AddressBuilderType = CompactTensorV2AddressBuilder;
+ using AddressRefType = CompactTensorAddressRef;
+ using AddressType = CompactTensorAddress;
+
+private:
+ Stash _stash;
+ Dimensions _dimensions;
+ Cells _cells;
+
+public:
+ void
+ copyCells(const Cells &cells_in)
+ {
+ for (const auto &cell : cells_in) {
+ CompactTensorAddressRef oldRef = cell.first;
+ CompactTensorAddressRef newRef(oldRef, _stash);
+ _cells[newRef] = cell.second;
+ }
+ }
+
+ void
+ copyCells(const Cells &cells_in, const Dimensions &cells_in_dimensions)
+ {
+ CompactTensorV2AddressPadder addressPadder(_dimensions,
+ cells_in_dimensions);
+ for (const auto &cell : cells_in) {
+ addressPadder.padAddress(cell.first);
+ CompactTensorAddressRef oldRef = addressPadder.getAddressRef();
+ CompactTensorAddressRef newRef(oldRef, _stash);
+ _cells[newRef] = cell.second;
+ }
+ }
+
+ DirectTensorBuilder()
+ : _stash(TensorImplType::STASH_CHUNK_SIZE),
+ _dimensions(),
+ _cells()
+ {
+ }
+
+ DirectTensorBuilder(const Dimensions &dimensions_in)
+ : _stash(TensorImplType::STASH_CHUNK_SIZE),
+ _dimensions(dimensions_in),
+ _cells()
+ {
+ }
+
+ DirectTensorBuilder(const Dimensions &dimensions_in,
+ const Cells &cells_in)
+ : _stash(TensorImplType::STASH_CHUNK_SIZE),
+ _dimensions(dimensions_in),
+ _cells()
+ {
+ copyCells(cells_in);
+ }
+
+ DirectTensorBuilder(const Dimensions &dimensions_in,
+ const Cells &cells_in,
+ const Dimensions &cells_dimensions)
+ : _stash(TensorImplType::STASH_CHUNK_SIZE),
+ _dimensions(dimensions_in),
+ _cells()
+ {
+ if (dimensions_in.size() == cells_dimensions.size()) {
+ copyCells(cells_in);
+ } else {
+ copyCells(cells_in, cells_dimensions);
+ }
+ }
+
+ Tensor::UP build() {
+ return std::make_unique<CompactTensorV2>(std::move(_dimensions),
+ std::move(_cells),
+ std::move(_stash));
+ }
+
+ template <class Function>
+ void insertCell(CompactTensorAddressRef address, double value,
+ Function &&func)
+ {
+ CompactTensorAddressRef oldRef(address);
+ auto res = _cells.insert(std::make_pair(oldRef, value));
+ if (res.second) {
+ // Replace key with own copy
+ res.first->first = CompactTensorAddressRef(oldRef, _stash);
+ } else {
+ res.first->second = func(res.first->second, value);
+ }
+ }
+
+ void insertCell(CompactTensorAddressRef address, double value) {
+ // This address should not already exist and a new cell should be inserted.
+ insertCell(address, value, [](double, double) -> double { abort(); });
+ }
+
+ template <class Function>
+ void insertCell(CompactTensorV2AddressBuilder &address, double value,
+ Function &&func)
+ {
+ insertCell(address.getAddressRef(), value, func);
+ }
+
+ void insertCell(CompactTensorV2AddressBuilder &address, double value) {
+ // This address should not already exist and a new cell should be inserted.
+ insertCell(address.getAddressRef(), value, [](double, double) -> double { abort(); });
+ }
+
+ Dimensions &dimensions() { return _dimensions; }
+ Cells &cells() { return _cells; }
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/join_compact_tensors_v2.h b/vespalib/src/vespa/vespalib/tensor/compact/join_compact_tensors_v2.h
new file mode 100644
index 00000000000..0fd89c4ec7b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/compact/join_compact_tensors_v2.h
@@ -0,0 +1,62 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+namespace tensor {
+
+/*
+ * Join the cells of two tensors.
+ * The given function is used to calculate the resulting cell value for overlapping cells.
+ */
+template <typename Function>
+Tensor::UP
+joinCompactTensorsV2(const CompactTensorV2 &lhs, const CompactTensorV2 &rhs,
+ Function &&func)
+{
+ DirectTensorBuilder<CompactTensorV2> builder(lhs.combineDimensionsWith(rhs),
+ lhs.cells(), lhs.dimensions());
+ if (builder.dimensions().size() == rhs.dimensions().size()) {
+ for (const auto &rhsCell : rhs.cells()) {
+ builder.insertCell(rhsCell.first, rhsCell.second, func);
+ }
+ } else {
+ CompactTensorV2AddressPadder addressPadder(builder.dimensions(),
+ rhs.dimensions());
+ for (const auto &rhsCell : rhs.cells()) {
+ addressPadder.padAddress(rhsCell.first);
+ builder.insertCell(addressPadder, rhsCell.second, func);
+ }
+ }
+ return builder.build();
+}
+
+/*
+ * Join the cells of two tensors, where the rhs values are treated as negated values.
+ * The given function is used to calculate the resulting cell value for overlapping cells.
+ */
+template <typename Function>
+Tensor::UP
+joinCompactTensorsV2Negated(const CompactTensorV2 &lhs,
+ const CompactTensorV2 &rhs,
+ Function &&func)
+{
+ DirectTensorBuilder<CompactTensorV2> builder(lhs.combineDimensionsWith(rhs),
+ lhs.cells(), lhs.dimensions());
+ if (builder.dimensions().size() == rhs.dimensions().size()) {
+ for (const auto &rhsCell : rhs.cells()) {
+ builder.insertCell(rhsCell.first, -rhsCell.second, func);
+ }
+ } else {
+ CompactTensorV2AddressPadder addressPadder(builder.dimensions(),
+ rhs.dimensions());
+ for (const auto &rhsCell : rhs.cells()) {
+ addressPadder.padAddress(rhsCell.first);
+ builder.insertCell(addressPadder, -rhsCell.second, func);
+ }
+ }
+ return builder.build();
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/decoded_tensor_address_store.h b/vespalib/src/vespa/vespalib/tensor/decoded_tensor_address_store.h
new file mode 100644
index 00000000000..b2d8d1b07ce
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/decoded_tensor_address_store.h
@@ -0,0 +1,57 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A utility class to store decoded tensor address based on data stored
+ * in tensors.
+ */
+template <class AddressT> class DecodedTensorAddressStore;
+
+/**
+ * A utility class to store decoded tensor address. TensorAddress
+ * doesn't need any decoding, just pass through the argument
+ * (e.g. tensor address in tensor hash table).
+ */
+template <> class DecodedTensorAddressStore<TensorAddress>
+{
+public:
+ void set(const TensorAddress &) { }
+ static const TensorAddress &get(const TensorAddress &rhs) { return rhs; }
+};
+
+/**
+ * A utility class to store decoded tensor address.
+ * CompactTensorAddress needs decoding.
+ */
+template <> class DecodedTensorAddressStore<CompactTensorAddress>
+{
+private:
+ CompactTensorAddress _address;
+public:
+ void set(const CompactTensorAddressRef rhs)
+ { _address.deserializeFromSparseAddressRef(rhs); }
+ const CompactTensorAddress &get(const CompactTensorAddressRef &)
+ { return _address; }
+};
+
+/**
+ * A utility class to store decoded tensor address. Just pass through
+ * the argument (e.g. tensor address ref in tensor hash table).
+ * CompactTensorAddressRef is encoded, decoding is performed on the
+ * fly while iterating.
+ */
+template <> class DecodedTensorAddressStore<CompactTensorAddressRef>
+{
+public:
+ void set(const CompactTensorAddressRef &) { }
+ static CompactTensorAddressRef get(const CompactTensorAddressRef rhs)
+ { return rhs; }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/default_tensor.h b/vespalib/src/vespa/vespalib/tensor/default_tensor.h
new file mode 100644
index 00000000000..e1eef7c1d03
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/default_tensor.h
@@ -0,0 +1,17 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "compact/compact_tensor.h"
+#include "compact/compact_tensor_builder.h"
+
+namespace vespalib {
+namespace tensor {
+
+struct DefaultTensor {
+ using type = CompactTensor;
+ using builder = CompactTensorBuilder;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/default_tensor_engine.cpp b/vespalib/src/vespa/vespalib/tensor/default_tensor_engine.cpp
new file mode 100644
index 00000000000..40ca3930680
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/default_tensor_engine.cpp
@@ -0,0 +1,195 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "default_tensor_engine.h"
+#include <vespa/vespalib/eval/value.h>
+#include <vespa/vespalib/eval/tensor_spec.h>
+#include <vespa/vespalib/eval/operation_visitor.h>
+#include "tensor.h"
+#include "dense/dense_tensor_builder.h"
+#include "default_tensor.h"
+
+namespace vespalib {
+namespace tensor {
+
+using ErrorValue = eval::ErrorValue;
+using DoubleValue = eval::DoubleValue;
+using TensorValue = eval::TensorValue;
+
+const DefaultTensorEngine DefaultTensorEngine::_engine;
+
+eval::ValueType
+DefaultTensorEngine::type_of(const Tensor &tensor) const
+{
+ assert(&tensor.engine() == this);
+ const tensor::Tensor &my_tensor = static_cast<const tensor::Tensor &>(tensor);
+ return my_tensor.getType().as_value_type();
+}
+
+std::unique_ptr<eval::Tensor>
+DefaultTensorEngine::create(const TensorSpec &spec) const
+{
+ ValueType type = ValueType::from_spec(spec.type());
+ bool is_dense = false;
+ bool is_sparse = false;
+ for (const auto &dimension: type.dimensions()) {
+ if (dimension.is_mapped()) {
+ is_sparse = true;
+ }
+ if (dimension.is_indexed()) {
+ is_dense = true;
+ }
+ }
+ if (type.dimensions().empty()) {
+ // XXX: should be number instead, but need to match empty sparse tensors elsewhere
+ is_sparse = true;
+ }
+ assert(is_dense != is_sparse);
+ if (is_dense) {
+ DenseTensorBuilder builder;
+ std::map<vespalib::string,DenseTensorBuilder::Dimension> dimension_map;
+ for (const auto &dimension: type.dimensions()) {
+ dimension_map[dimension.name] = builder.defineDimension(dimension.name, dimension.size);
+ }
+ for (const auto &cell: spec.cells()) {
+ const auto &address = cell.first;
+ for (const auto &binding: address) {
+ builder.addLabel(dimension_map[binding.first], binding.second.index);
+ }
+ builder.addCell(cell.second);
+ }
+ return builder.build();
+ } else { // sparse
+ DefaultTensor::builder builder;
+ std::map<vespalib::string,DefaultTensor::builder::Dimension> dimension_map;
+ for (const auto &dimension: type.dimensions()) {
+ dimension_map[dimension.name] = builder.define_dimension(dimension.name);
+ }
+ for (const auto &cell: spec.cells()) {
+ const auto &address = cell.first;
+ for (const auto &binding: address) {
+ builder.add_label(dimension_map[binding.first], binding.second.name);
+ }
+ builder.add_cell(cell.second);
+ }
+ return builder.build();
+ }
+}
+
+bool
+DefaultTensorEngine::equal(const Tensor &a, const Tensor &b) const
+{
+ assert(&a.engine() == this);
+ assert(&b.engine() == this);
+ const tensor::Tensor &my_a = static_cast<const tensor::Tensor &>(a);
+ const tensor::Tensor &my_b = static_cast<const tensor::Tensor &>(b);
+ return my_a.equals(my_b);
+}
+
+struct IsAddOperation : public eval::DefaultOperationVisitor {
+ bool result = false;
+ void visitDefault(const eval::Operation &) override {}
+ void visit(const eval::operation::Add &) override { result = true; }
+};
+
+const eval::Value &
+DefaultTensorEngine::reduce(const Tensor &tensor, const BinaryOperation &op, Stash &stash) const
+{
+ assert(&tensor.engine() == this);
+ const tensor::Tensor &my_tensor = static_cast<const tensor::Tensor &>(tensor);
+ IsAddOperation check;
+ op.accept(check);
+ if (check.result) {
+ return stash.create<eval::DoubleValue>(my_tensor.sum());
+ } else {
+ return stash.create<ErrorValue>();
+ }
+}
+
+const eval::Value &
+DefaultTensorEngine::reduce(const Tensor &tensor, const BinaryOperation &op, const std::vector<vespalib::string> &dimensions, Stash &stash) const
+{
+ assert(&tensor.engine() == this);
+ const tensor::Tensor &my_tensor = static_cast<const tensor::Tensor &>(tensor);
+ IsAddOperation check;
+ op.accept(check);
+ if (check.result) {
+ tensor::Tensor::UP result;
+ for (const auto &dimension: dimensions) {
+ if (result) {
+ result = result->sum(dimension);
+ } else {
+ result = my_tensor.sum(dimension);
+ }
+ }
+ return stash.create<TensorValue>(std::move(result));
+ } else {
+ return stash.create<ErrorValue>();
+ }
+ return stash.create<ErrorValue>();
+}
+
+struct CellFunctionAdapter : tensor::CellFunction {
+ const eval::UnaryOperation &op;
+ CellFunctionAdapter(const eval::UnaryOperation &op_in) : op(op_in) {}
+ virtual double apply(double value) const override { return op.eval(value); }
+};
+
+const eval::Value &
+DefaultTensorEngine::perform(const UnaryOperation &op, const Tensor &a, Stash &stash) const
+{
+ assert(&a.engine() == this);
+ const tensor::Tensor &my_a = static_cast<const tensor::Tensor &>(a);
+ CellFunctionAdapter cell_function(op);
+ return stash.create<TensorValue>(my_a.apply(cell_function));
+}
+
+struct TensorOperationOverride : eval::DefaultOperationVisitor {
+ const tensor::Tensor &lhs;
+ const tensor::Tensor &rhs;
+ tensor::Tensor::UP result;
+ TensorOperationOverride(const tensor::Tensor &lhs_in,
+ const tensor::Tensor &rhs_in)
+ : lhs(lhs_in), rhs(rhs_in), result() {}
+ virtual void visitDefault(const eval::Operation &) override {
+ // empty result indicates error
+ }
+ virtual void visit(const eval::operation::Add &) override {
+ result = lhs.add(rhs);
+ }
+ virtual void visit(const eval::operation::Sub &) override {
+ result = lhs.subtract(rhs);
+ }
+ virtual void visit(const eval::operation::Mul &) override {
+ if (lhs.getType() == rhs.getType()) {
+ result = lhs.match(rhs);
+ } else {
+ result = lhs.multiply(rhs);
+ }
+ }
+ virtual void visit(const eval::operation::Min &) override {
+ result = lhs.min(rhs);
+ }
+ virtual void visit(const eval::operation::Max &) override {
+ result = lhs.max(rhs);
+ }
+};
+
+const eval::Value &
+DefaultTensorEngine::perform(const BinaryOperation &op, const Tensor &a, const Tensor &b, Stash &stash) const
+{
+ assert(&a.engine() == this);
+ assert(&b.engine() == this);
+ const tensor::Tensor &my_a = static_cast<const tensor::Tensor &>(a);
+ const tensor::Tensor &my_b = static_cast<const tensor::Tensor &>(b);
+ TensorOperationOverride tensor_override(my_a, my_b);
+ op.accept(tensor_override);
+ if (tensor_override.result) {
+ return stash.create<TensorValue>(std::move(tensor_override.result));
+ } else {
+ return stash.create<ErrorValue>();
+ }
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/default_tensor_engine.h b/vespalib/src/vespa/vespalib/tensor/default_tensor_engine.h
new file mode 100644
index 00000000000..32e9d787925
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/default_tensor_engine.h
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/eval/tensor_engine.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * This is a tensor engine implementation wrapping the default tensor
+ * implementations (dense/sparse).
+ **/
+class DefaultTensorEngine : public eval::TensorEngine
+{
+private:
+ DefaultTensorEngine() {}
+ static const DefaultTensorEngine _engine;
+public:
+ static const TensorEngine &ref() { return _engine; };
+ ValueType type_of(const Tensor &tensor) const override;
+ std::unique_ptr<Tensor> create(const TensorSpec &spec) const override;
+ bool equal(const Tensor &a, const Tensor &b) const override;
+ const Value &reduce(const Tensor &tensor, const BinaryOperation &op, Stash &stash) const override;
+ const Value &reduce(const Tensor &tensor, const BinaryOperation &op, const std::vector<vespalib::string> &dimensions, Stash &stash) const override;
+ const Value &perform(const UnaryOperation &op, const Tensor &a, Stash &stash) const override;
+ const Value &perform(const BinaryOperation &op, const Tensor &a, const Tensor &b, Stash &stash) const override;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/CMakeLists.txt b/vespalib/src/vespa/vespalib/tensor/dense/CMakeLists.txt
new file mode 100644
index 00000000000..e80083056ca
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_tensor_dense OBJECT
+ SOURCES
+ dense_tensor.cpp
+ dense_tensor_builder.cpp
+ dense_tensor_dimension_sum.cpp
+ dense_tensor_product.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp
new file mode 100644
index 00000000000..7aaa4e0a71a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp
@@ -0,0 +1,360 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "dense_tensor.h"
+#include "dense_tensor_dimension_sum.h"
+#include "dense_tensor_product.h"
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+#include <sstream>
+
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+string
+dimensionsMetaAsString(const DenseTensor::DimensionsMeta &dimensionsMeta)
+{
+ std::ostringstream oss;
+ bool first = true;
+ oss << "[";
+ for (const auto &dimMeta : dimensionsMeta) {
+ if (!first) {
+ oss << ",";
+ }
+ first = false;
+ oss << dimMeta;
+ }
+ oss << "]";
+ return oss.str();
+}
+
+size_t
+calcCellsSize(const DenseTensor::DimensionsMeta &dimensionsMeta)
+{
+ size_t cellsSize = 1;
+ for (const auto &dimMeta : dimensionsMeta) {
+ cellsSize *= dimMeta.size();
+ }
+ return cellsSize;
+}
+
+
+void
+checkCellsSize(const DenseTensor &arg)
+{
+ auto cellsSize = calcCellsSize(arg.dimensionsMeta());
+ if (arg.cells().size() != cellsSize) {
+ throw IllegalStateException(make_string("wrong cell size, "
+ "expected=%zu, "
+ "actual=%zu",
+ cellsSize,
+ arg.cells().size()));
+ }
+}
+
+void
+checkDimensions(const DenseTensor &lhs, const DenseTensor &rhs,
+ vespalib::stringref operation)
+{
+ if (lhs.dimensionsMeta() != rhs.dimensionsMeta()) {
+ throw IllegalStateException(make_string("mismatching dimensions meta for "
+ "dense tensor %s, "
+ "lhs dimensions meta = '%s', "
+ "rhs dimensions meta = '%s'",
+ operation.c_str(),
+ dimensionsMetaAsString(lhs.dimensionsMeta()).c_str(),
+ dimensionsMetaAsString(rhs.dimensionsMeta()).c_str()));
+ }
+ checkCellsSize(lhs);
+ checkCellsSize(rhs);
+}
+
+
+/*
+ * Join the cells of two tensors.
+ *
+ * The given function is used to calculate the resulting cell value
+ * for overlapping cells.
+ */
+template <typename Function>
+Tensor::UP
+joinDenseTensors(const DenseTensor &lhs, const DenseTensor &rhs,
+ Function &&func)
+{
+ DenseTensor::Cells cells;
+ cells.reserve(lhs.cells().size());
+ auto rhsCellItr = rhs.cells().cbegin();
+ for (const auto &lhsCell : lhs.cells()) {
+ cells.push_back(func(lhsCell, *rhsCellItr));
+ ++rhsCellItr;
+ }
+ assert(rhsCellItr == rhs.cells().cend());
+ return std::make_unique<DenseTensor>(lhs.dimensionsMeta(),
+ std::move(cells));
+}
+
+/*
+ * Join the cells of two tensors, where the rhs values are treated as negated values.
+ * The given function is used to calculate the resulting cell value for overlapping cells.
+ */
+template <typename Function>
+Tensor::UP
+joinDenseTensorsNegated(const DenseTensor &lhs,
+ const DenseTensor &rhs,
+ Function &&func)
+{
+ DenseTensor::Cells cells;
+ cells.reserve(lhs.cells().size());
+ auto rhsCellItr = rhs.cells().cbegin();
+ for (const auto &lhsCell : lhs.cells()) {
+ cells.push_back(func(lhsCell, - *rhsCellItr));
+ ++rhsCellItr;
+ }
+ assert(rhsCellItr == rhs.cells().cend());
+ return std::make_unique<DenseTensor>(lhs.dimensionsMeta(),
+ std::move(cells));
+}
+
+
+}
+
+
+void
+DenseTensor::CellsIterator::next()
+{
+ ++_cellIdx;
+ if (valid()) {
+ for (int64_t i = (_address.size() - 1); i >= 0; --i) {
+ _address[i] = (_address[i] + 1) % _dimensionsMeta[i].size();
+ if (_address[i] != 0) {
+ // Outer dimension labels can only be increased when this label wraps around.
+ break;
+ }
+ }
+ }
+}
+
+DenseTensor::DenseTensor()
+ : _dimensionsMeta(),
+ _cells(1)
+{
+}
+
+DenseTensor::DenseTensor(const DimensionsMeta &dimensionsMeta_in,
+ const Cells &cells_in)
+ : _dimensionsMeta(dimensionsMeta_in),
+ _cells(cells_in)
+{
+ checkCellsSize(*this);
+}
+
+
+DenseTensor::DenseTensor(const DimensionsMeta &dimensionsMeta_in,
+ Cells &&cells_in)
+ : _dimensionsMeta(dimensionsMeta_in),
+ _cells(std::move(cells_in))
+{
+ checkCellsSize(*this);
+}
+
+DenseTensor::DenseTensor(DimensionsMeta &&dimensionsMeta_in,
+ Cells &&cells_in)
+ : _dimensionsMeta(std::move(dimensionsMeta_in)),
+ _cells(std::move(cells_in))
+{
+ checkCellsSize(*this);
+}
+
+bool
+DenseTensor::operator==(const DenseTensor &rhs) const
+{
+ return (_dimensionsMeta == rhs._dimensionsMeta) &&
+ (_cells == rhs._cells);
+}
+
+TensorType
+DenseTensor::getType() const
+{
+ std::vector<TensorType::Dimension> dimensions;
+ dimensions.reserve(_dimensionsMeta.size());
+ for (const auto &dimensionMeta : _dimensionsMeta) {
+ dimensions.emplace_back(dimensionMeta.dimension(),
+ dimensionMeta.size());
+ }
+ return TensorType::dense(dimensions);
+}
+
+double
+DenseTensor::sum() const
+{
+ double result = 0.0;
+ for (const auto &cell : _cells) {
+ result += cell;
+ }
+ return result;
+}
+
+Tensor::UP
+DenseTensor::add(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
+ checkDimensions(*this, rhs, "add");
+ return joinDenseTensors(*this, rhs,
+ [](double lhsValue, double rhsValue)
+ { return lhsValue + rhsValue; });
+}
+
+Tensor::UP
+DenseTensor::subtract(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
+ // Note that - *rhsCellItr is passed to the lambda function, that is why we do addition.
+ checkDimensions(*this, rhs, "subtract");
+ return joinDenseTensorsNegated(*this, rhs,
+ [](double lhsValue, double rhsValue)
+ { return lhsValue + rhsValue; });
+}
+
+Tensor::UP
+DenseTensor::multiply(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
+ return DenseTensorProduct(*this, rhs).result();
+}
+
+Tensor::UP
+DenseTensor::min(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
+ checkDimensions(*this, rhs, "min");
+ return joinDenseTensors(*this, rhs,
+ [](double lhsValue, double rhsValue)
+ { return std::min(lhsValue, rhsValue); });
+}
+
+Tensor::UP
+DenseTensor::max(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
+ checkDimensions(*this, rhs, "max");
+ return joinDenseTensors(*this, rhs,
+ [](double lhsValue, double rhsValue)
+ { return std::max(lhsValue,rhsValue); });
+}
+
+Tensor::UP
+DenseTensor::match(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
+ checkDimensions(*this, rhs, "match");
+ return joinDenseTensors(*this, rhs,
+ [](double lhsValue, double rhsValue)
+ { return (lhsValue * rhsValue); });
+}
+
+Tensor::UP
+DenseTensor::apply(const CellFunction &func) const
+{
+ Cells newCells(_cells.size());
+ auto itr = newCells.begin();
+ for (const auto &cell : _cells) {
+ *itr = func.apply(cell);
+ ++itr;
+ }
+ assert(itr == newCells.end());
+ return std::make_unique<DenseTensor>(_dimensionsMeta,
+ std::move(newCells));
+}
+
+Tensor::UP
+DenseTensor::sum(const vespalib::string &dimension) const
+{
+ return DenseTensorDimensionSum(*this, dimension).result();
+}
+
+bool
+DenseTensor::equals(const Tensor &arg) const
+{
+ return *this == static_cast<const DenseTensor &>(arg);
+}
+
+vespalib::string
+DenseTensor::toString() const
+{
+ std::ostringstream stream;
+ stream << *this;
+ return stream.str();
+}
+
+Tensor::UP
+DenseTensor::clone() const
+{
+ return std::make_unique<DenseTensor>(_dimensionsMeta, _cells);
+}
+
+void
+DenseTensor::print(std::ostream &out) const
+{
+ // TODO (geirst): print on common format.
+ out << "[ ";
+ bool first = true;
+ for (const auto &dimMeta : _dimensionsMeta) {
+ if (!first) {
+ out << ", ";
+ }
+ out << dimMeta;
+ first = false;
+ }
+ out << " ] { ";
+ first = true;
+ for (const auto &cell : cells()) {
+ if (!first) {
+ out << ", ";
+ }
+ out << cell;
+ first = false;
+ }
+ out << " }";
+}
+
+void
+DenseTensor::accept(TensorVisitor &visitor) const
+{
+ DenseTensor::CellsIterator iterator(_dimensionsMeta, _cells);
+ TensorAddressBuilder addressBuilder;
+ TensorAddress address;
+ vespalib::string label;
+ while (iterator.valid()) {
+ addressBuilder.clear();
+ auto rawIndex = iterator.address().begin();
+ for (const auto &dimension : _dimensionsMeta) {
+ label = vespalib::make_string("%zu", *rawIndex);
+ addressBuilder.add(dimension.dimension(), label);
+ ++rawIndex;
+ }
+ address = addressBuilder.build();
+ visitor.visit(address, iterator.cell());
+ iterator.next();
+ }
+}
+
+std::ostream &
+operator<<(std::ostream &out, const DenseTensor::DimensionMeta &value)
+{
+ out << value.dimension() << ":" << value.size();
+ return out;
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.h b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.h
new file mode 100644
index 00000000000..7b4adc8e7a4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.h
@@ -0,0 +1,112 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/types.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * TODO
+ */
+class DenseTensor : public Tensor
+{
+public:
+ typedef std::unique_ptr<DenseTensor> UP;
+ using Cells = std::vector<double>;
+
+ class DimensionMeta
+ {
+ vespalib::string _dimension;
+ size_t _size;
+
+ public:
+ DimensionMeta(const vespalib::string & dimension_in, size_t size_in)
+ : _dimension(dimension_in),
+ _size(size_in)
+ {
+ }
+
+ const vespalib::string &dimension() const { return _dimension; }
+ size_t size() const { return _size; }
+
+ bool operator==(const DimensionMeta &rhs) const {
+ return (_dimension == rhs._dimension) &&
+ (_size == rhs._size);
+ }
+ bool operator!=(const DimensionMeta &rhs) const {
+ return !(*this == rhs);
+ }
+ bool operator<(const DimensionMeta &rhs) const {
+ if (_dimension == rhs._dimension) {
+ return _size < rhs._size;
+ }
+ return _dimension < rhs._dimension;
+ }
+ };
+
+ using DimensionsMeta = std::vector<DimensionMeta>;
+
+ class CellsIterator
+ {
+ private:
+ const DimensionsMeta &_dimensionsMeta;
+ const Cells &_cells;
+ size_t _cellIdx;
+ std::vector<size_t> _address;
+
+ public:
+ CellsIterator(const DimensionsMeta &dimensionsMeta,
+ const Cells &cells)
+ : _dimensionsMeta(dimensionsMeta),
+ _cells(cells),
+ _cellIdx(0),
+ _address(dimensionsMeta.size(), 0)
+ {}
+ bool valid() const { return _cellIdx < _cells.size(); }
+ void next();
+ double cell() const { return _cells[_cellIdx]; }
+ const std::vector<size_t> &address() const { return _address; }
+ };
+
+
+private:
+ DimensionsMeta _dimensionsMeta;
+ Cells _cells;
+
+public:
+ DenseTensor();
+ DenseTensor(const DimensionsMeta &dimensionsMeta_in,
+ const Cells &cells_in);
+ DenseTensor(const DimensionsMeta &dimensionsMeta_in,
+ Cells &&cells_in);
+ DenseTensor(DimensionsMeta &&dimensionsMeta_in,
+ Cells &&cells_in);
+ const DimensionsMeta &dimensionsMeta() const { return _dimensionsMeta; }
+ const Cells &cells() const { return _cells; }
+ bool operator==(const DenseTensor &rhs) const;
+ CellsIterator cellsIterator() const { return CellsIterator(_dimensionsMeta, _cells); }
+
+ virtual TensorType getType() const override;
+ virtual double sum() const override;
+ virtual Tensor::UP add(const Tensor &arg) const override;
+ virtual Tensor::UP subtract(const Tensor &arg) const override;
+ virtual Tensor::UP multiply(const Tensor &arg) const override;
+ virtual Tensor::UP min(const Tensor &arg) const override;
+ virtual Tensor::UP max(const Tensor &arg) const override;
+ virtual Tensor::UP match(const Tensor &arg) const override;
+ virtual Tensor::UP apply(const CellFunction &func) const override;
+ virtual Tensor::UP sum(const vespalib::string &dimension) const override;
+ virtual bool equals(const Tensor &arg) const override;
+ virtual void print(std::ostream &out) const override;
+ virtual vespalib::string toString() const override;
+ virtual Tensor::UP clone() const override;
+ virtual void accept(TensorVisitor &visitor) const override;
+};
+
+std::ostream &operator<<(std::ostream &out, const DenseTensor::DimensionMeta &value);
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.cpp b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.cpp
new file mode 100644
index 00000000000..ab0404f320b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.cpp
@@ -0,0 +1,166 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "dense_tensor_builder.h"
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <memory>
+#include <string>
+
+using vespalib::IllegalArgumentException;
+using vespalib::make_string;
+
+namespace vespalib {
+namespace tensor {
+
+using DimensionMeta = DenseTensor::DimensionMeta;
+
+namespace {
+
+constexpr size_t UNDEFINED_LABEL = std::numeric_limits<size_t>::max();
+
+void
+validateLabelInRange(size_t label, size_t dimensionSize, const vespalib::string &dimension)
+{
+ if (label >= dimensionSize) {
+ throw IllegalArgumentException(make_string(
+ "Label '%zu' for dimension '%s' is outside range [0, %zu>",
+ label, dimension.c_str(), dimensionSize));
+ }
+}
+
+void
+validateLabelNotSpecified(size_t oldLabel, const vespalib::string &dimension)
+{
+ if (oldLabel != UNDEFINED_LABEL) {
+ throw IllegalArgumentException(make_string(
+ "Label for dimension '%s' is already specified with value '%zu'",
+ dimension.c_str(), oldLabel));
+ }
+}
+
+}
+
+void
+DenseTensorBuilder::allocateCellsStorage()
+{
+ size_t cellsSize = 1;
+ for (const auto &dimensionMeta : _dimensionsMeta) {
+ cellsSize *= dimensionMeta.size();
+ }
+ _cells.resize(cellsSize, 0);
+}
+
+
+void
+DenseTensorBuilder::sortDimensions()
+{
+ std::sort(_dimensionsMeta.begin(), _dimensionsMeta.end(),
+ [](const DimensionMeta &lhs, const DimensionMeta &rhs)
+ { return lhs.dimension() < rhs.dimension(); });
+ _dimensionsMapping.resize(_dimensionsMeta.size());
+ Dimension dim = 0;
+ for (const auto &dimension : _dimensionsMeta) {
+ auto itr = _dimensionsEnum.find(dimension.dimension());
+ assert(itr != _dimensionsEnum.end());
+ _dimensionsMapping[itr->second] = dim;
+ ++dim;
+ }
+}
+
+size_t
+DenseTensorBuilder::calculateCellAddress()
+{
+ size_t result = 0;
+ size_t multiplier = 1;
+ for (int64_t i = (_addressBuilder.size() - 1); i >= 0; --i) {
+ const size_t label = _addressBuilder[i];
+ const auto &dimMeta = _dimensionsMeta[i];
+ if (label == UNDEFINED_LABEL) {
+ throw IllegalArgumentException(make_string("Label for dimension '%s' is undefined. "
+ "Expected a value in the range [0, %zu>",
+ dimMeta.dimension().c_str(), dimMeta.size()));
+ }
+ result += (label * multiplier);
+ multiplier *= dimMeta.size();
+ _addressBuilder[i] = UNDEFINED_LABEL;
+ }
+ return result;
+}
+
+DenseTensorBuilder::DenseTensorBuilder()
+ : _dimensionsEnum(),
+ _dimensionsMeta(),
+ _cells(),
+ _addressBuilder(),
+ _dimensionsMapping()
+{
+}
+
+DenseTensorBuilder::Dimension
+DenseTensorBuilder::defineDimension(const vespalib::string &dimension,
+ size_t dimensionSize)
+{
+ auto itr = _dimensionsEnum.find(dimension);
+ if (itr != _dimensionsEnum.end()) {
+ return itr->second;
+ }
+ assert(_cells.empty());
+ Dimension result = _dimensionsEnum.size();
+ _dimensionsEnum.insert(std::make_pair(dimension, result));
+ _dimensionsMeta.emplace_back(dimension, dimensionSize);
+ _addressBuilder.push_back(UNDEFINED_LABEL);
+ assert(_dimensionsMeta.size() == (result + 1));
+ assert(_addressBuilder.size() == (result + 1));
+ return result;
+}
+
+DenseTensorBuilder &
+DenseTensorBuilder::addLabel(Dimension dimension, size_t label)
+{
+ if (_cells.empty()) {
+ sortDimensions();
+ allocateCellsStorage();
+ }
+ assert(dimension < _dimensionsMeta.size());
+ assert(dimension < _addressBuilder.size());
+ Dimension mappedDimension = _dimensionsMapping[dimension];
+ const auto &dimMeta = _dimensionsMeta[mappedDimension];
+ validateLabelInRange(label, dimMeta.size(), dimMeta.dimension());
+ validateLabelNotSpecified(_addressBuilder[mappedDimension],
+ dimMeta.dimension());
+ _addressBuilder[mappedDimension] = label;
+ return *this;
+}
+
+DenseTensorBuilder &
+DenseTensorBuilder::addCell(double value)
+{
+ if (_cells.empty()) {
+ sortDimensions();
+ allocateCellsStorage();
+ }
+ size_t cellAddress = calculateCellAddress();
+ assert(cellAddress < _cells.size());
+ _cells[cellAddress] = value;
+ return *this;
+}
+
+Tensor::UP
+DenseTensorBuilder::build()
+{
+ if (_cells.empty()) {
+ allocateCellsStorage();
+ }
+ Tensor::UP result = std::make_unique<DenseTensor>(std::move(_dimensionsMeta),
+ std::move(_cells));
+ _dimensionsEnum.clear();
+ _dimensionsMeta.clear();
+ DenseTensor::Cells().swap(_cells);
+ _addressBuilder.clear();
+ _dimensionsMapping.clear();
+ return result;
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.h b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.h
new file mode 100644
index 00000000000..1533ff3ba61
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_builder.h
@@ -0,0 +1,41 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "dense_tensor.h"
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/tensor/tensor_builder.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A builder of for dense tensors.
+ */
+class DenseTensorBuilder
+{
+public:
+ using Dimension = TensorBuilder::Dimension;
+
+private:
+ vespalib::hash_map<vespalib::string, size_t> _dimensionsEnum;
+ DenseTensor::DimensionsMeta _dimensionsMeta;
+ DenseTensor::Cells _cells;
+ std::vector<size_t> _addressBuilder;
+ std::vector<Dimension> _dimensionsMapping;
+
+ void allocateCellsStorage();
+ void sortDimensions();
+ size_t calculateCellAddress();
+
+public:
+ DenseTensorBuilder();
+
+ Dimension defineDimension(const vespalib::string &dimension, size_t dimensionSize);
+ DenseTensorBuilder &addLabel(Dimension dimension, size_t label);
+ DenseTensorBuilder &addCell(double value);
+ Tensor::UP build();
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.cpp b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.cpp
new file mode 100644
index 00000000000..f94c9137798
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.cpp
@@ -0,0 +1,106 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "dense_tensor_dimension_sum.h"
+
+namespace vespalib {
+namespace tensor {
+
+using DimensionsMeta = DenseTensor::DimensionsMeta;
+
+namespace {
+
+DimensionsMeta
+removeDimension(const DimensionsMeta &dimensionsMeta,
+ const string &dimension)
+{
+ DimensionsMeta result = dimensionsMeta;
+ auto itr = std::lower_bound(result.begin(), result.end(), dimension,
+ [](const auto &dimMeta, const auto &dimension_in)
+ { return dimMeta.dimension() < dimension_in; });
+ if ((itr != result.end()) && (itr->dimension() == dimension)) {
+ result.erase(itr);
+ }
+ return result;
+}
+
+size_t
+calcCellsSize(const DimensionsMeta &dimensionsMeta)
+{
+ size_t cellsSize = 1;
+ for (const auto &dimMeta : dimensionsMeta) {
+ cellsSize *= dimMeta.size();
+ }
+ return cellsSize;
+}
+
+struct DimensionSummer
+{
+ size_t _innerDimSize;
+ size_t _sumDimSize;
+ size_t _outerDimSize;
+ using Cells = DenseTensor::Cells;
+
+ DimensionSummer(const DimensionsMeta &dimensionsMeta,
+ const string &dimension)
+ : _innerDimSize(1),
+ _sumDimSize(1),
+ _outerDimSize(1)
+ {
+ auto itr = std::lower_bound(dimensionsMeta.cbegin(), dimensionsMeta.cend(), dimension,
+ [](const auto &dimMeta, const auto &dimension_in)
+ { return dimMeta.dimension() < dimension_in; });
+ if ((itr != dimensionsMeta.end()) && (itr->dimension() == dimension)) {
+ for (auto outerItr = dimensionsMeta.cbegin(); outerItr != itr; ++outerItr) {
+ _outerDimSize *= outerItr->size();
+ }
+ _sumDimSize = itr->size();
+ for (++itr; itr != dimensionsMeta.cend(); ++itr) {
+ _innerDimSize *= itr->size();
+ }
+ } else {
+ _outerDimSize = calcCellsSize(dimensionsMeta);
+ }
+ }
+
+ void
+ sumCells(Cells &cells, const Cells &cells_in) const
+ {
+ auto itr_in = cells_in.cbegin();
+ auto itr = cells.begin();
+ for (size_t outerDim = 0; outerDim < _outerDimSize;
+ ++outerDim) {
+ auto saved_itr = itr;
+ for (size_t sumDim = 0; sumDim < _sumDimSize; ++sumDim) {
+ itr = saved_itr;
+ for (size_t innerDim = 0; innerDim < _innerDimSize;
+ ++innerDim) {
+ *itr += *itr_in;
+ ++itr;
+ ++itr_in;
+ }
+ }
+ }
+ assert(itr == cells.end());
+ assert(itr_in == cells_in.cend());
+ }
+};
+
+
+}
+
+
+DenseTensorDimensionSum::DenseTensorDimensionSum(const TensorImplType &tensor,
+ const string &dimension)
+ : _dimensionsMeta(removeDimension(tensor.dimensionsMeta(),
+ dimension)),
+ _cells(calcCellsSize(_dimensionsMeta))
+{
+ DimensionSummer dimensionSummer(tensor.dimensionsMeta(),
+ dimension);
+ dimensionSummer.sumCells(_cells, tensor.cells());
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.h b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.h
new file mode 100644
index 00000000000..c61e07d5c3a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_dimension_sum.h
@@ -0,0 +1,36 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "dense_tensor.h"
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns a tensor with the given dimension removed and the cell values in that dimension summed.
+ */
+class DenseTensorDimensionSum
+{
+public:
+ using TensorImplType = DenseTensor;
+private:
+ using DimensionMeta = DenseTensor::DimensionMeta;
+ using DimensionsMeta = DenseTensor::DimensionsMeta;
+ using Cells = DenseTensor::Cells;
+
+ DimensionsMeta _dimensionsMeta;
+ Cells _cells;
+
+public:
+ DenseTensorDimensionSum(const TensorImplType &tensor,
+ const vespalib::string &dimension);
+
+ Tensor::UP result() {
+ return std::make_unique<DenseTensor>(std::move(_dimensionsMeta),
+ std::move(_cells));
+ }
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.cpp b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.cpp
new file mode 100644
index 00000000000..fff5f21d3d1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.cpp
@@ -0,0 +1,204 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "dense_tensor_product.h"
+#include <vespa/vespalib/util/exceptions.h>
+
+namespace vespalib {
+namespace tensor {
+
+using DimensionsMeta = DenseTensor::DimensionsMeta;
+using CellsIterator = DenseTensor::CellsIterator;
+using Address = std::vector<size_t>;
+
+using vespalib::IllegalArgumentException;
+using vespalib::make_string;
+
+namespace {
+
+enum class AddressCombineOp
+{
+ LHS,
+ RHS,
+ BOTH
+};
+
+using AddressCombineOps = std::vector<AddressCombineOp>;
+
+class AddressReader
+{
+private:
+ const Address &_address;
+ size_t _idx;
+
+public:
+ AddressReader(const Address &address)
+ : _address(address),
+ _idx(0)
+ {}
+ size_t nextLabel() {
+ return _address[_idx++];
+ }
+ bool valid() {
+ return _idx < _address.size();
+ }
+};
+
+class CellsInserter
+{
+private:
+ const DimensionsMeta &_dimensionsMeta;
+ DenseTensor::Cells &_cells;
+
+ size_t calculateCellAddress(const Address &address) {
+ assert(address.size() == _dimensionsMeta.size());
+ size_t result = 0;
+ for (size_t i = 0; i < address.size(); ++i) {
+ result *= _dimensionsMeta[i].size();
+ result += address[i];
+ }
+ return result;
+ }
+
+public:
+ CellsInserter(const DimensionsMeta &dimensionsMeta,
+ DenseTensor::Cells &cells)
+ : _dimensionsMeta(dimensionsMeta),
+ _cells(cells)
+ {}
+ void insertCell(const Address &address, double cellValue) {
+ size_t cellAddress = calculateCellAddress(address);
+ assert(cellAddress < _cells.size());
+ _cells[cellAddress] = cellValue;
+ }
+};
+
+void
+validateDimensionsMeta(const DimensionsMeta &dimensionsMeta)
+{
+ for (size_t i = 1; i < dimensionsMeta.size(); ++i) {
+ const auto &prevDimMeta = dimensionsMeta[i-1];
+ const auto &currDimMeta = dimensionsMeta[i];
+ if ((prevDimMeta.dimension() == currDimMeta.dimension()) &&
+ (prevDimMeta.size() != currDimMeta.size())) {
+ throw IllegalArgumentException(make_string(
+ "Shared dimension '%s' in dense tensor product has mis-matching label ranges: "
+ "[0, %zu> vs [0, %zu>. This is not supported.",
+ prevDimMeta.dimension().c_str(), prevDimMeta.size(), currDimMeta.size()));
+ }
+ }
+}
+
+DimensionsMeta
+combineDimensions(const DimensionsMeta &lhs, const DimensionsMeta &rhs)
+{
+ DimensionsMeta result;
+ std::set_union(lhs.cbegin(), lhs.cend(),
+ rhs.cbegin(), rhs.cend(),
+ std::back_inserter(result));
+ validateDimensionsMeta(result);
+ return result;
+}
+
+size_t
+calculateCellsSize(const DimensionsMeta &dimensionsMeta)
+{
+ size_t cellsSize = 1;
+ for (const auto &dimMeta : dimensionsMeta) {
+ cellsSize *= dimMeta.size();
+ }
+ return cellsSize;
+}
+
+AddressCombineOps
+buildCombineOps(const DimensionsMeta &lhs,
+ const DimensionsMeta &rhs)
+{
+ AddressCombineOps ops;
+ auto rhsItr = rhs.cbegin();
+ auto rhsItrEnd = rhs.cend();
+ for (const auto &lhsDim : lhs) {
+ while ((rhsItr != rhsItrEnd) && (rhsItr->dimension() < lhsDim.dimension())) {
+ ops.push_back(AddressCombineOp::RHS);
+ ++rhsItr;
+ }
+ if ((rhsItr != rhsItrEnd) && (rhsItr->dimension() == lhsDim.dimension())) {
+ ops.push_back(AddressCombineOp::BOTH);
+ ++rhsItr;
+ } else {
+ ops.push_back(AddressCombineOp::LHS);
+ }
+ }
+ while (rhsItr != rhsItrEnd) {
+ ops.push_back(AddressCombineOp::RHS);
+ ++rhsItr;
+ }
+ return ops;
+}
+
+bool
+combineAddress(Address &combinedAddress,
+ const CellsIterator &lhsItr,
+ const CellsIterator &rhsItr,
+ const AddressCombineOps &ops)
+{
+ combinedAddress.clear();
+ AddressReader lhsReader(lhsItr.address());
+ AddressReader rhsReader(rhsItr.address());
+ for (const auto &op : ops) {
+ switch (op) {
+ case AddressCombineOp::LHS:
+ combinedAddress.emplace_back(lhsReader.nextLabel());
+ break;
+ case AddressCombineOp::RHS:
+ combinedAddress.emplace_back(rhsReader.nextLabel());
+ break;
+ case AddressCombineOp::BOTH:
+ size_t lhsLabel = lhsReader.nextLabel();
+ size_t rhsLabel = rhsReader.nextLabel();
+ if (lhsLabel != rhsLabel) {
+ return false;
+ }
+ combinedAddress.emplace_back(lhsLabel);
+ }
+ }
+ assert(!lhsReader.valid());
+ assert(!rhsReader.valid());
+ return true;
+}
+
+}
+
+void
+DenseTensorProduct::bruteForceProduct(const DenseTensor &lhs,
+ const DenseTensor &rhs)
+{
+ AddressCombineOps ops = buildCombineOps(lhs.dimensionsMeta(), rhs.dimensionsMeta());
+ Address combinedAddress;
+ CellsInserter cellsInserter(_dimensionsMeta, _cells);
+ for (CellsIterator lhsItr = lhs.cellsIterator(); lhsItr.valid(); lhsItr.next()) {
+ for (CellsIterator rhsItr = rhs.cellsIterator(); rhsItr.valid(); rhsItr.next()) {
+ bool combineSuccess = combineAddress(combinedAddress, lhsItr, rhsItr, ops);
+ if (combineSuccess) {
+ cellsInserter.insertCell(combinedAddress, lhsItr.cell() * rhsItr.cell());
+ }
+ }
+ }
+}
+
+DenseTensorProduct::DenseTensorProduct(const DenseTensor &lhs,
+ const DenseTensor &rhs)
+ : _dimensionsMeta(combineDimensions(lhs.dimensionsMeta(), rhs.dimensionsMeta())),
+ _cells(calculateCellsSize(_dimensionsMeta))
+{
+ bruteForceProduct(lhs, rhs);
+}
+
+Tensor::UP
+DenseTensorProduct::result()
+{
+ return std::make_unique<DenseTensor>(std::move(_dimensionsMeta), std::move(_cells));
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.h b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.h
new file mode 100644
index 00000000000..5615067119b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor_product.h
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "dense_tensor.h"
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns the tensor product of the two given dense tensors.
+ * This is all combinations of all cells in the first tensor with all cells of
+ * the second tensor.
+ *
+ * Shared dimensions must have the same label range from [0, dimSize>.
+ */
+class DenseTensorProduct
+{
+private:
+ DenseTensor::DimensionsMeta _dimensionsMeta;
+ DenseTensor::Cells _cells;
+
+ void bruteForceProduct(const DenseTensor &lhs, const DenseTensor &rhs);
+
+public:
+ DenseTensorProduct(const DenseTensor &lhs, const DenseTensor &rhs);
+ Tensor::UP result();
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/dimensions_vector_iterator.h b/vespalib/src/vespa/vespalib/tensor/dimensions_vector_iterator.h
new file mode 100644
index 00000000000..f23c4b6e20f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/dimensions_vector_iterator.h
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+namespace tensor {
+
+using DimensionsVector = std::vector<vespalib::stringref>;
+
+/**
+ * An iterator for a dimensions vector used to simplify 3-way merge
+ * between two tensor addresses and a dimension vector.
+ */
+class DimensionsVectorIterator
+{
+ using InnerIterator = DimensionsVector::const_iterator;
+ InnerIterator _itr;
+ InnerIterator _itrEnd;
+public:
+ DimensionsVectorIterator(const DimensionsVector &dimensions)
+ : _itr(dimensions.cbegin()),
+ _itrEnd(dimensions.cend())
+ {
+ }
+ bool valid() const { return (_itr != _itrEnd); }
+ vespalib::stringref dimension() const { return *_itr; }
+ template <typename Iterator>
+ bool beforeDimension(const Iterator &rhs) const {
+ if (!valid()) {
+ return false;
+ }
+ if (!rhs.valid()) {
+ return true;
+ }
+ return (*_itr < rhs.dimension());
+ }
+ bool atDimension(vespalib::stringref rhsDimension) const
+ {
+ return (valid() && (*_itr == rhsDimension));
+ }
+ void next() { ++_itr; }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/direct_tensor_builder.h b/vespalib/src/vespa/vespalib/tensor/direct_tensor_builder.h
new file mode 100644
index 00000000000..d07bcf68486
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/direct_tensor_builder.h
@@ -0,0 +1,15 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Forward declaration of utility class to build tensor of type TensorT,
+ * to be used by tensor operations.
+ */
+template <typename TensorT> class DirectTensorBuilder;
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/join_tensor_addresses.h b/vespalib/src/vespa/vespalib/tensor/join_tensor_addresses.h
new file mode 100644
index 00000000000..d691732b800
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/join_tensor_addresses.h
@@ -0,0 +1,128 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+namespace tensor {
+
+/*
+ * Combine two tensor addresses, but fail if dimension label doesn't match
+ * for common dimensions. Use 3-way merge between two tensors and a vector
+ * of dimensions. To be used when we have few common dimensions.
+ * The commonDimensions parameter is the intersection of the
+ * dimensions in the two input tensors.
+ */
+template <class AddressBuilder, class LhsAddress, class RhsAddress>
+bool
+joinTensorAddresses(AddressBuilder &combined,
+ const DimensionsVector &commonDimensions,
+ const LhsAddress &lhs,
+ const RhsAddress &rhs)
+{
+ TensorAddressElementIterator<LhsAddress> lhsItr(lhs);
+ TensorAddressElementIterator<RhsAddress> rhsItr(rhs);
+ DimensionsVectorIterator dimsItr(commonDimensions);
+ combined.clear();
+ while (lhsItr.valid()) {
+ while (dimsItr.beforeDimension(lhsItr)) {
+ rhsItr.addElements(combined, dimsItr);
+ if (rhsItr.atDimension(dimsItr.dimension())) {
+ // needed dimension missing from lhs
+ return false;
+ }
+ dimsItr.next();
+ }
+ if (dimsItr.atDimension(lhsItr.dimension())) {
+ rhsItr.addElements(combined, dimsItr);
+ if (!rhsItr.atDimension(dimsItr.dimension())) {
+ // needed dimension missing from rhs
+ return false;
+ }
+ if (lhsItr.label() != rhsItr.label()) {
+ // dimension exists in both rhs and lhs, but labels don't match
+ return false;
+ }
+ // common dimension, labels match
+ lhsItr.addElement(combined);
+ lhsItr.next();
+ rhsItr.next();
+ dimsItr.next();
+ continue;
+ }
+ rhsItr.addElements(combined, lhsItr);
+ assert(lhsItr.beforeDimension(rhsItr));
+ lhsItr.addElement(combined);
+ lhsItr.next();
+ }
+ while (dimsItr.valid()) {
+ rhsItr.addElements(combined, dimsItr);
+ if (rhsItr.atDimension(dimsItr.dimension())) {
+ // needed dimension missing from lhs
+ return false;
+ }
+ dimsItr.next();
+ }
+ rhsItr.addElements(combined);
+ // All matching
+ return true;
+}
+
+/*
+ * Combine two tensor addresses, but fail if dimension label doesn't match
+ * for common dimensions. Use 3-way merge between two tensors and a vector
+ * of dimensions. To be used when we have many common dimensions.
+ * The commonDimensions parameter is the intersection of the
+ * dimensions in the two input tensors.
+ */
+template <class AddressBuilder, class LhsAddress, class RhsAddress>
+bool
+joinTensorAddresses(AddressBuilder &combined,
+ const DimensionsSet &commonDimensions,
+ const LhsAddress &lhs,
+ const RhsAddress &rhs)
+{
+ TensorAddressElementIterator<LhsAddress> lhsItr(lhs);
+ TensorAddressElementIterator<RhsAddress> rhsItr(rhs);
+ combined.clear();
+ if (lhsItr.valid() && rhsItr.valid()) {
+ for (;;) {
+ if (lhsItr.beforeDimension(rhsItr)) {
+ if (!lhsItr.addElements(combined, commonDimensions, rhsItr)) {
+ return false;
+ }
+ if (!lhsItr.valid()) {
+ break;
+ }
+ }
+ if (lhsItr.dimension() == rhsItr.dimension()) {
+ if (lhsItr.label() != rhsItr.label()) {
+ return false;
+ }
+ lhsItr.addElement(combined);
+ lhsItr.next();
+ rhsItr.next();
+ if (!lhsItr.valid() || !rhsItr.valid()) {
+ break;
+ }
+ continue;
+ }
+ if (!rhsItr.addElements(combined, commonDimensions, lhsItr)) {
+ return false;
+ }
+ if (!rhsItr.valid()) {
+ break;
+ }
+ }
+ }
+ if (!lhsItr.addElements(combined, commonDimensions)) {
+ return false;
+ }
+ if (!rhsItr.addElements(combined, commonDimensions)) {
+ return false;
+ }
+ // All matching
+ return true;
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/join_tensors.h b/vespalib/src/vespa/vespalib/tensor/join_tensors.h
new file mode 100644
index 00000000000..b5feb99b5d5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/join_tensors.h
@@ -0,0 +1,48 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "tensor.h"
+#include "direct_tensor_builder.h"
+
+namespace vespalib {
+namespace tensor {
+
+/*
+ * Join the cells of two tensors.
+ * The given function is used to calculate the resulting cell value for overlapping cells.
+ */
+template <typename TensorImplType, typename Function>
+Tensor::UP
+joinTensors(const TensorImplType &lhs,
+ const TensorImplType &rhs,
+ Function &&func)
+{
+ DirectTensorBuilder<TensorImplType>
+ builder(lhs.combineDimensionsWith(rhs), lhs.cells());
+ for (const auto &rhsCell : rhs.cells()) {
+ builder.insertCell(rhsCell.first, rhsCell.second, func);
+ }
+ return builder.build();
+}
+
+/*
+ * Join the cells of two tensors, where the rhs values are treated as negated values.
+ * The given function is used to calculate the resulting cell value for overlapping cells.
+ */
+template <typename TensorImplType, typename Function>
+Tensor::UP
+joinTensorsNegated(const TensorImplType &lhs,
+ const TensorImplType &rhs,
+ Function &&func)
+{
+ DirectTensorBuilder<TensorImplType>
+ builder(lhs.combineDimensionsWith(rhs), lhs.cells());
+ for (const auto &rhsCell : rhs.cells()) {
+ builder.insertCell(rhsCell.first, -rhsCell.second, func);
+ }
+ return builder.build();
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/CMakeLists.txt b/vespalib/src/vespa/vespalib/tensor/serialization/CMakeLists.txt
new file mode 100644
index 00000000000..246e1b17535
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_tensor_serialization OBJECT
+ SOURCES
+ compact_binary_format.cpp
+ dense_binary_format.cpp
+ slime_binary_format.cpp
+ typed_binary_format.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.cpp b/vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.cpp
new file mode 100644
index 00000000000..f2871025f58
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.cpp
@@ -0,0 +1,127 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "compact_binary_format.h"
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/tensor_builder.h>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+#include <vespa/vespalib/objects/nbostream.h>
+#include <sstream>
+
+
+using vespalib::nbostream;
+
+namespace vespalib {
+namespace tensor {
+
+
+namespace {
+
+vespalib::string undefinedLabel("");
+
+void
+writeTensorAddress(nbostream &output,
+ const TensorType &type,
+ const TensorAddress &value)
+{
+ auto elemItr = value.elements().cbegin();
+ auto elemItrEnd = value.elements().cend();
+ for (const auto &dimension : type.dimensions()) {
+ if (elemItr != elemItrEnd && dimension.name == elemItr->dimension()) {
+ output.writeSmallString(elemItr->label());
+ ++elemItr;
+ } else {
+ output.writeSmallString(undefinedLabel);
+ }
+ }
+ assert(elemItr == elemItrEnd);
+}
+
+}
+
+class CompactBinaryFormatSerializer : public TensorVisitor
+{
+ uint32_t _numCells;
+ nbostream _cells;
+ TensorType _type;
+
+public:
+ CompactBinaryFormatSerializer();
+ virtual ~CompactBinaryFormatSerializer() override;
+ virtual void visit(const TensorAddress &address, double value) override;
+ void serialize(nbostream &stream, const Tensor &tensor);
+};
+
+CompactBinaryFormatSerializer::CompactBinaryFormatSerializer()
+ : _numCells(0u),
+ _cells(),
+ _type(TensorType::invalid())
+{
+}
+
+
+CompactBinaryFormatSerializer::~CompactBinaryFormatSerializer()
+{
+}
+
+void
+CompactBinaryFormatSerializer::visit(const TensorAddress &address,
+ double value)
+{
+ ++_numCells;
+ writeTensorAddress(_cells, _type, address);
+ _cells << value;
+}
+
+
+void
+CompactBinaryFormatSerializer::serialize(nbostream &stream,
+ const Tensor &tensor)
+{
+ _type = tensor.getType();
+ tensor.accept(*this);
+ stream.putInt1_4Bytes(_type.dimensions().size());
+ for (const auto &dimension : _type.dimensions()) {
+ stream.writeSmallString(dimension.name);
+ }
+ stream.putInt1_4Bytes(_numCells);
+ stream.write(_cells.peek(), _cells.size());
+}
+
+
+void
+CompactBinaryFormat::serialize(nbostream &stream, const Tensor &tensor)
+{
+ CompactBinaryFormatSerializer serializer;
+ serializer.serialize(stream, tensor);
+}
+
+
+void
+CompactBinaryFormat::deserialize(nbostream &stream, TensorBuilder &builder)
+{
+ vespalib::string str;
+ size_t dimensionsSize = stream.getInt1_4Bytes();
+ std::vector<TensorBuilder::Dimension> dimensions;
+ while (dimensions.size() < dimensionsSize) {
+ stream.readSmallString(str);
+ dimensions.emplace_back(builder.define_dimension(str));
+ }
+ size_t cellsSize = stream.getInt1_4Bytes();
+ double cellValue = 0.0;
+ for (size_t cellIdx = 0; cellIdx < cellsSize; ++cellIdx) {
+ for (size_t dimension = 0; dimension < dimensionsSize; ++dimension) {
+ stream.readSmallString(str);
+ if (!str.empty()) {
+ builder.add_label(dimensions[dimension], str);
+ }
+ }
+ stream >> cellValue;
+ builder.add_cell(cellValue);
+ }
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.h b/vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.h
new file mode 100644
index 00000000000..fd3abdc2b71
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/compact_binary_format.h
@@ -0,0 +1,25 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+class nbostream;
+
+namespace tensor {
+
+class Tensor;
+class TensorBuilder;
+
+/**
+ * Class for serializing a tensor.
+ */
+class CompactBinaryFormat
+{
+public:
+ static void serialize(nbostream &stream, const Tensor &tensor);
+ static void deserialize(nbostream &stream, TensorBuilder &builder);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.cpp b/vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.cpp
new file mode 100644
index 00000000000..f074f8d4335
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.cpp
@@ -0,0 +1,60 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "dense_binary_format.h"
+#include <vespa/vespalib/tensor/dense/dense_tensor.h>
+#include <vespa/vespalib/objects/nbostream.h>
+
+
+using vespalib::nbostream;
+
+namespace vespalib {
+namespace tensor {
+
+
+void
+DenseBinaryFormat::serialize(nbostream &stream, const DenseTensor &tensor)
+{
+ stream.putInt1_4Bytes(tensor.dimensionsMeta().size());
+ size_t cellsSize = 1;
+ for (const auto &dimension : tensor.dimensionsMeta()) {
+ stream.writeSmallString(dimension.dimension());
+ stream.putInt1_4Bytes(dimension.size());
+ cellsSize *= dimension.size();
+ }
+ const DenseTensor::Cells &cells = tensor.cells();
+ assert(cells.size() == cellsSize);
+ for (const auto &value : cells) {
+ stream << value;
+ }
+}
+
+
+std::unique_ptr<DenseTensor>
+DenseBinaryFormat::deserialize(nbostream &stream)
+{
+ vespalib::string dimensionName;
+ DenseTensor::DimensionsMeta dimensionsMeta;
+ DenseTensor::Cells cells;
+ size_t dimensionsSize = stream.getInt1_4Bytes();
+ size_t dimensionSize;
+ size_t cellsSize = 1;
+ while (dimensionsMeta.size() < dimensionsSize) {
+ stream.readSmallString(dimensionName);
+ dimensionSize = stream.getInt1_4Bytes();
+ dimensionsMeta.emplace_back(dimensionName, dimensionSize);
+ cellsSize *= dimensionSize;
+ }
+ cells.reserve(cellsSize);
+ double cellValue = 0.0;
+ for (size_t i = 0; i < cellsSize; ++i) {
+ stream >> cellValue;
+ cells.emplace_back(cellValue);
+ }
+ return std::make_unique<DenseTensor>(std::move(dimensionsMeta),
+ std::move(cells));
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.h b/vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.h
new file mode 100644
index 00000000000..cb080b6b4ee
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/dense_binary_format.h
@@ -0,0 +1,24 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+class nbostream;
+
+namespace tensor {
+
+class DenseTensor;
+
+/**
+ * Class for serializing a dense tensor.
+ */
+class DenseBinaryFormat
+{
+public:
+ static void serialize(nbostream &stream, const DenseTensor &tensor);
+ static std::unique_ptr<DenseTensor> deserialize(nbostream &stream);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.cpp b/vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.cpp
new file mode 100644
index 00000000000..1e746c2a9a8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.cpp
@@ -0,0 +1,107 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "slime_binary_format.h"
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/tensor_builder.h>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+#include <vespa/vespalib/data/slime/inserter.h>
+#include <vespa/vespalib/data/slime/cursor.h>
+#include <vespa/vespalib/data/slime/slime.h>
+
+
+namespace vespalib {
+namespace tensor {
+
+
+using slime::Inserter;
+using slime::SlimeInserter;
+using slime::Cursor;
+using slime::ObjectInserter;
+using slime::Memory;
+
+namespace {
+
+Memory memory_address("address");
+Memory memory_cells("cells");
+Memory memory_dimensions("dimensions");
+Memory memory_value("value");
+
+void writeTensorAddress(Cursor &cursor, const TensorAddress &value) {
+ ObjectInserter addressInserter(cursor, memory_address);
+ Cursor &addressCursor = addressInserter.insertObject();
+ for (const auto &elem : value.elements()) {
+ Memory dimension(elem.dimension());
+ Memory label(elem.label());
+ addressCursor.setString(dimension, label);
+ }
+}
+
+}
+
+class SlimeBinaryFormatSerializer : public TensorVisitor
+{
+ Cursor &_tensor; // cursor for whole tensor
+ Cursor &_dimensions; // cursor for dimensions array
+ Cursor &_cells; // cursor for cells array
+public:
+ SlimeBinaryFormatSerializer(Inserter &inserter);
+ virtual ~SlimeBinaryFormatSerializer() override;
+ virtual void visit(const TensorAddress &address, double value) override;
+ void serialize(const Tensor &tensor);
+};
+
+SlimeBinaryFormatSerializer::SlimeBinaryFormatSerializer(Inserter &inserter)
+ : _tensor(inserter.insertObject()),
+ _dimensions(_tensor.setArray(memory_dimensions)),
+ _cells(_tensor.setArray(memory_cells))
+{
+}
+
+
+SlimeBinaryFormatSerializer::~SlimeBinaryFormatSerializer()
+{
+}
+
+void
+SlimeBinaryFormatSerializer::visit(const TensorAddress &address,
+ double value)
+{
+ Cursor &cellCursor = _cells.addObject();
+ writeTensorAddress(cellCursor, address);
+ cellCursor.setDouble(memory_value, value);
+}
+
+
+void
+SlimeBinaryFormatSerializer::serialize(const Tensor &tensor)
+{
+ TensorType type(tensor.getType());
+ for (const auto & dimension : type.dimensions()) {
+ _dimensions.addString(Memory(dimension.name));
+ }
+ tensor.accept(*this);
+}
+
+
+void
+SlimeBinaryFormat::serialize(Inserter &inserter, const Tensor &tensor)
+{
+ SlimeBinaryFormatSerializer serializer(inserter);
+ serializer.serialize(tensor);
+}
+
+
+std::unique_ptr<Slime>
+SlimeBinaryFormat::serialize(const Tensor &tensor)
+{
+ auto slime = std::make_unique<Slime>();
+ SlimeInserter inserter(*slime);
+ serialize(inserter, tensor);
+ return std::move(slime);
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.h b/vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.h
new file mode 100644
index 00000000000..0af80c5de61
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/slime_binary_format.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+class Slime;
+
+namespace slime { class Inserter; }
+
+namespace tensor {
+
+class Tensor;
+class TensorBuilder;
+
+/**
+ * Class for serializing a tensor into a slime object.
+ */
+class SlimeBinaryFormat
+{
+public:
+ static void serialize(slime::Inserter &inserter, const Tensor &tensor);
+ static std::unique_ptr<Slime> serialize(const Tensor &tensor);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.cpp b/vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.cpp
new file mode 100644
index 00000000000..d3d0ae40545
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.cpp
@@ -0,0 +1,58 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "typed_binary_format.h"
+#include "compact_binary_format.h"
+#include "dense_binary_format.h"
+#include <vespa/vespalib/objects/nbostream.h>
+#include <vespa/vespalib/tensor/default_tensor.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor.h>
+
+using vespalib::nbostream;
+
+namespace vespalib {
+namespace tensor {
+
+
+void
+TypedBinaryFormat::serialize(nbostream &stream, const Tensor &tensor)
+{
+ const DenseTensor *denseTensor = dynamic_cast<const DenseTensor *>(&tensor);
+ if (denseTensor != nullptr) {
+ stream.putInt1_4Bytes(DENSE_BINARY_FORMAT_TYPE);
+ DenseBinaryFormat::serialize(stream, *denseTensor);
+ } else {
+ stream.putInt1_4Bytes(COMPACT_BINARY_FORMAT_TYPE);
+ CompactBinaryFormat::serialize(stream, tensor);
+ }
+}
+
+
+void
+TypedBinaryFormat::deserialize(nbostream &stream, TensorBuilder &builder)
+{
+ auto formatId = stream.getInt1_4Bytes();
+ assert(formatId == COMPACT_BINARY_FORMAT_TYPE);
+ CompactBinaryFormat::deserialize(stream, builder);
+}
+
+
+std::unique_ptr<Tensor>
+TypedBinaryFormat::deserialize(nbostream &stream)
+{
+ auto formatId = stream.getInt1_4Bytes();
+ if (formatId == COMPACT_BINARY_FORMAT_TYPE) {
+ DefaultTensor::builder builder;
+ CompactBinaryFormat::deserialize(stream, builder);
+ return builder.build();
+ }
+ if (formatId == DENSE_BINARY_FORMAT_TYPE) {
+ return DenseBinaryFormat::deserialize(stream);
+ }
+ abort();
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.h b/vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.h
new file mode 100644
index 00000000000..31bd12ddfc0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/serialization/typed_binary_format.h
@@ -0,0 +1,28 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+class nbostream;
+
+namespace tensor {
+
+class Tensor;
+class TensorBuilder;
+
+/**
+ * Class for serializing a tensor.
+ */
+class TypedBinaryFormat
+{
+ static constexpr uint32_t COMPACT_BINARY_FORMAT_TYPE = 1u;
+ static constexpr uint32_t DENSE_BINARY_FORMAT_TYPE = 2u;
+public:
+ static void serialize(nbostream &stream, const Tensor &tensor);
+ static void deserialize(nbostream &stream, TensorBuilder &builder);
+ static std::unique_ptr<Tensor> deserialize(nbostream &stream);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/CMakeLists.txt b/vespalib/src/vespa/vespalib/tensor/simple/CMakeLists.txt
new file mode 100644
index 00000000000..deeb18030e4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_tensor_simple OBJECT
+ SOURCES
+ simple_tensor.cpp
+ simple_tensor_builder.cpp
+ simple_tensor_dimension_sum.cpp
+ simple_tensor_product.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/direct_simple_tensor_builder.h b/vespalib/src/vespa/vespalib/tensor/simple/direct_simple_tensor_builder.h
new file mode 100644
index 00000000000..525d0ef9864
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/direct_simple_tensor_builder.h
@@ -0,0 +1,93 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/direct_tensor_builder.h>
+#include "simple_tensor.h"
+#include <vespa/vespalib/tensor/tensor_address_builder.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Utility class to build tensors of type SimpleTensor, to be used by
+ * tensor operations.
+ */
+template <> class DirectTensorBuilder<SimpleTensor>
+{
+public:
+ using TensorImplType = SimpleTensor;
+ using Dimensions = typename TensorImplType::Dimensions;
+ using Cells = typename TensorImplType::Cells;
+ using AddressBuilderType = TensorAddressBuilder;
+ using AddressRefType = TensorAddress;
+ using AddressType = TensorAddress;
+
+private:
+ Dimensions _dimensions;
+ Cells _cells;
+
+public:
+ DirectTensorBuilder()
+ : _dimensions(),
+ _cells()
+ {
+ }
+
+ DirectTensorBuilder(const Dimensions &dimensions_in)
+ : _dimensions(dimensions_in),
+ _cells()
+ {
+ }
+
+ DirectTensorBuilder(const Dimensions &dimensions_in,
+ const Cells &cells_in)
+ : _dimensions(dimensions_in),
+ _cells(cells_in)
+ {
+ }
+
+ Tensor::UP build() {
+ return std::make_unique<SimpleTensor>(std::move(_dimensions),
+ std::move(_cells));
+ }
+
+ template <class Function>
+ void insertCell(const TensorAddress &address, double value,
+ Function &&func)
+ {
+ auto res = _cells.insert(std::make_pair(address, value));
+ if (!res.second) {
+ res.first->second = func(res.first->second, value);
+ }
+ }
+
+ void insertCell(const TensorAddress &address, double value) {
+ // This address should not already exist and a new cell should be inserted.
+ insertCell(address, value, [](double, double) -> double { abort(); });
+ }
+
+ // Note: moves data from TensorAddressBuilder to new TensorAddress.
+ template <class Function>
+ void insertCell(TensorAddressBuilder &address, double value,
+ Function &&func)
+ {
+ auto res =
+ _cells.insert(std::make_pair(address.build(), value));
+ if (!res.second) {
+ res.first->second = func(res.first->second, value);
+ }
+ }
+
+ void insertCell(TensorAddressBuilder &address, double value) {
+ // This address should not already exist and a new cell should be inserted.
+ insertCell(address, value, [](double, double) -> double { abort(); });
+ }
+
+ Dimensions &dimensions() { return _dimensions; }
+ Cells &cells() { return _cells; }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp
new file mode 100644
index 00000000000..0d284b7e9b6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp
@@ -0,0 +1,222 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "simple_tensor.h"
+#include "simple_tensor_dimension_sum.h"
+#include "simple_tensor_product.h"
+#include <vespa/vespalib/tensor/join_tensors.h>
+#include <vespa/vespalib/tensor/tensor_apply.h>
+#include <sstream>
+#include <vespa/vespalib/tensor/tensor_visitor.h>
+
+namespace vespalib {
+namespace tensor {
+
+SimpleTensor::SimpleTensor(const Dimensions &dimensions_in, const Cells &cells_in)
+ : _dimensions(dimensions_in),
+ _cells(cells_in)
+{
+}
+
+SimpleTensor::SimpleTensor(Dimensions &&dimensions_in, Cells &&cells_in)
+ : _dimensions(std::move(dimensions_in)),
+ _cells(std::move(cells_in))
+{
+}
+
+bool
+SimpleTensor::operator==(const SimpleTensor &rhs) const
+{
+ return _dimensions == rhs._dimensions && _cells == rhs._cells;
+}
+
+SimpleTensor::Dimensions
+SimpleTensor::combineDimensionsWith(const SimpleTensor &rhs) const
+{
+ Dimensions result;
+ std::set_union(_dimensions.cbegin(), _dimensions.cend(),
+ rhs._dimensions.cbegin(), rhs._dimensions.cend(),
+ std::back_inserter(result));
+ return result;
+}
+
+TensorType
+SimpleTensor::getType() const
+{
+ return TensorType::sparse(_dimensions);
+}
+
+double
+SimpleTensor::sum() const
+{
+ double result = 0.0;
+ for (const auto &cell : _cells) {
+ result += cell.second;
+ }
+ return result;
+}
+
+Tensor::UP
+SimpleTensor::add(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
+ return joinTensors(*this, rhs,
+ [](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
+}
+
+Tensor::UP
+SimpleTensor::subtract(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
+ // Note that -rhsCell.second is passed to the lambda function, that is why we do addition.
+ return joinTensorsNegated(*this, rhs,
+ [](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
+}
+
+Tensor::UP
+SimpleTensor::multiply(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ return SimpleTensorProduct(*this, static_cast<const SimpleTensor &>(arg)).result();
+}
+
+Tensor::UP
+SimpleTensor::min(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
+ return joinTensors(*this, rhs,
+ [](double lhsValue, double rhsValue){ return std::min(lhsValue, rhsValue); });
+}
+
+Tensor::UP
+SimpleTensor::max(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
+ return joinTensors(*this, rhs,
+ [](double lhsValue, double rhsValue){ return std::max(lhsValue, rhsValue); });
+}
+
+Tensor::UP
+SimpleTensor::match(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
+ DirectTensorBuilder<SimpleTensor> builder(combineDimensionsWith(rhs));
+ for (const auto &lhsCell : cells()) {
+ auto rhsItr = rhs.cells().find(lhsCell.first);
+ if (rhsItr != rhs.cells().end()) {
+ builder.insertCell(lhsCell.first, lhsCell.second * rhsItr->second);
+ }
+ }
+ return builder.build();
+}
+
+Tensor::UP
+SimpleTensor::apply(const CellFunction &func) const
+{
+ return TensorApply<SimpleTensor>(*this, func).result();
+}
+
+Tensor::UP
+SimpleTensor::sum(const vespalib::string &dimension) const
+{
+ return SimpleTensorDimensionSum(*this, dimension).result();
+}
+
+bool
+SimpleTensor::equals(const Tensor &arg) const
+{
+ // TODO (geirst): Better type handling when multiple implementations are available.
+ return *this == static_cast<const SimpleTensor &>(arg);
+}
+
+vespalib::string
+SimpleTensor::toString() const
+{
+ std::ostringstream stream;
+ stream << *this;
+ return stream.str();
+}
+
+Tensor::UP
+SimpleTensor::clone() const
+{
+ return std::make_unique<SimpleTensor>(_dimensions, _cells);
+}
+
+namespace {
+
+TensorAddress
+getAddressNotFoundInCells(const SimpleTensor::Dimensions &dimensions,
+ const SimpleTensor::Cells &cells)
+{
+ TensorDimensionsSet dimensionsNotFoundInCells(dimensions.begin(),
+ dimensions.end());
+ for (const auto &cell : cells) {
+ for (const auto &elem : cell.first.elements()) {
+ dimensionsNotFoundInCells.erase(elem.dimension());
+ }
+ }
+ SimpleTensor::Dimensions
+ missingDimensions(dimensionsNotFoundInCells.begin(),
+ dimensionsNotFoundInCells.end());
+ std::sort(missingDimensions.begin(), missingDimensions.end());
+ TensorAddress::Elements elements;
+ for (const auto &dimension : missingDimensions) {
+ elements.emplace_back(dimension, "-");
+ }
+ return TensorAddress(elements);
+}
+
+void
+printCells(const SimpleTensor::Cells &cells, std::ostream &out)
+{
+ out << "{ ";
+ bool first = true;
+ for (const auto &cell : cells) {
+ if (!first) {
+ out << ", ";
+ }
+ out << cell.first << ":" << cell.second;
+ first = false;
+ }
+ out << " }";
+}
+
+}
+
+void
+SimpleTensor::print(std::ostream &out) const
+{
+ // This address represents the extra tensor dimensions that are not
+ // explicitly found in the tensor cells.
+ TensorAddress extraDimensionsAddress = getAddressNotFoundInCells(dimensions(), cells());
+ if (extraDimensionsAddress.elements().empty()) {
+ printCells(cells(), out);
+ } else {
+ out << "( ";
+ printCells(cells(), out);
+ out << " * ";
+ // Multiplying with this cell gives us a way of representing the extra tensor
+ // dimensions without having explicit syntax for printing dimensions.
+ SimpleTensor::Cells extraDimensionsCell;
+ extraDimensionsCell.insert(std::make_pair(extraDimensionsAddress, 1.0));
+ printCells(extraDimensionsCell, out);
+ out << " )";
+ }
+}
+
+void
+SimpleTensor::accept(TensorVisitor &visitor) const
+{
+ for (const auto &cell : _cells) {
+ visitor.visit(cell.first, cell.second);
+ }
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.h b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.h
new file mode 100644
index 00000000000..0525649ff57
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.h
@@ -0,0 +1,60 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/cell_function.h>
+#include <vespa/vespalib/tensor/tensor.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include <vespa/vespalib/tensor/types.h>
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <set>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A sparse multi-dimensional array.
+ *
+ * A sparse tensor is a set of cells containing scalar values.
+ * Each cell is identified by its address, which consists of a set of dimension -> label pairs,
+ * where both dimension and label is a string on the form of an identifier or integer.
+ */
+class SimpleTensor : public Tensor
+{
+public:
+ typedef std::unique_ptr<SimpleTensor> UP;
+ typedef vespalib::hash_map<TensorAddress, double> Cells;
+ typedef TensorDimensions Dimensions;
+
+private:
+ Dimensions _dimensions;
+ Cells _cells;
+
+public:
+ SimpleTensor(const Dimensions &dimensions_in, const Cells &cells_in);
+ SimpleTensor(Dimensions &&dimensions_in, Cells &&cells_in);
+ const Cells &cells() const { return _cells; }
+ const Dimensions &dimensions() const { return _dimensions; }
+ bool operator==(const SimpleTensor &rhs) const;
+ Dimensions combineDimensionsWith(const SimpleTensor &rhs) const;
+
+ virtual TensorType getType() const override;
+ virtual double sum() const override;
+ virtual Tensor::UP add(const Tensor &arg) const override;
+ virtual Tensor::UP subtract(const Tensor &arg) const override;
+ virtual Tensor::UP multiply(const Tensor &arg) const override;
+ virtual Tensor::UP min(const Tensor &arg) const override;
+ virtual Tensor::UP max(const Tensor &arg) const override;
+ virtual Tensor::UP match(const Tensor &arg) const override;
+ virtual Tensor::UP apply(const CellFunction &func) const override;
+ virtual Tensor::UP sum(const vespalib::string &dimension) const override;
+ virtual bool equals(const Tensor &arg) const override;
+ virtual void print(std::ostream &out) const override;
+ virtual vespalib::string toString() const override;
+ virtual Tensor::UP clone() const override;
+ virtual void accept(TensorVisitor &visitor) const override;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.cpp b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.cpp
new file mode 100644
index 00000000000..1d24dd9147d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.cpp
@@ -0,0 +1,72 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "simple_tensor_builder.h"
+#include <vespa/vespalib/tensor/tensor.h>
+
+namespace vespalib {
+namespace tensor {
+
+
+SimpleTensorBuilder::SimpleTensorBuilder()
+ : TensorBuilder(),
+ _addressBuilder(),
+ _cells(),
+ _dimensionsEnum(),
+ _dimensions()
+{
+}
+
+SimpleTensorBuilder::~SimpleTensorBuilder()
+{
+}
+
+
+TensorBuilder::Dimension
+SimpleTensorBuilder::define_dimension(const vespalib::string &dimension)
+{
+ auto it = _dimensionsEnum.find(dimension);
+ if (it != _dimensionsEnum.end()) {
+ return it->second;
+ }
+ Dimension res = _dimensionsEnum.size();
+ auto insres = _dimensionsEnum.insert(std::make_pair(dimension, res));
+ assert(insres.second);
+ assert(insres.first->second == res);
+ assert(_dimensions.size() == res);
+ _dimensions.push_back(dimension);
+ return res;
+}
+
+TensorBuilder &
+SimpleTensorBuilder::add_label(Dimension dimension,
+ const vespalib::string &label)
+{
+ assert(dimension <= _dimensions.size());
+ _addressBuilder.add(_dimensions[dimension], label);
+ return *this;
+}
+
+TensorBuilder &
+SimpleTensorBuilder::add_cell(double value)
+{
+ _cells[_addressBuilder.build()] = value;
+ _addressBuilder.clear();
+ return *this;
+}
+
+
+Tensor::UP
+SimpleTensorBuilder::build()
+{
+ SimpleTensor::Dimensions dimensions(_dimensions.begin(), _dimensions.end());
+ std::sort(dimensions.begin(), dimensions.end());
+ Tensor::UP ret = std::make_unique<SimpleTensor>(std::move(dimensions), std::move(_cells));
+ SimpleTensor::Cells().swap(_cells);
+ _dimensionsEnum.clear();
+ _dimensions.clear();
+ return ret;
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.h b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.h
new file mode 100644
index 00000000000..81d94921b03
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_builder.h
@@ -0,0 +1,42 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "simple_tensor.h"
+#include <vespa/vespalib/tensor/tensor_builder.h>
+#include <vespa/vespalib/tensor/tensor_address.h>
+#include <vespa/vespalib/tensor/tensor_address_builder.h>
+#include <vespa/vespalib/stllike/hash_map.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A simple builder of tensors (sparse multi-dimensional array).
+ *
+ * A sparse tensor is a set of cells containing scalar values.
+ * Each cell is identified by its address, which consists of a set of dimension -> label pairs,
+ * where both dimension and label is a string on the form of an identifier or integer.
+ */
+class SimpleTensorBuilder : public TensorBuilder
+{
+ TensorAddressBuilder _addressBuilder;
+ SimpleTensor::Cells _cells;
+ vespalib::hash_map<vespalib::string, uint32_t> _dimensionsEnum;
+ std::vector<vespalib::string> _dimensions;
+public:
+ SimpleTensorBuilder();
+ virtual ~SimpleTensorBuilder();
+
+ virtual Dimension
+ define_dimension(const vespalib::string &dimension) override;
+ virtual TensorBuilder &
+ add_label(Dimension dimension,
+ const vespalib::string &label) override;
+ virtual TensorBuilder &add_cell(double value) override;
+
+ virtual Tensor::UP build() override;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.cpp b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.cpp
new file mode 100644
index 00000000000..435034b8f35
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.cpp
@@ -0,0 +1,56 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "simple_tensor_dimension_sum.h"
+#include <vespa/vespalib/tensor/tensor_address_element_iterator.h>
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+template <class AddressBuilder, class Address>
+void
+removeDimension(AddressBuilder &addressBuilder,
+ const Address &address,
+ const vespalib::stringref dimension)
+{
+ addressBuilder.clear();
+ for (const auto &elem : address.elements()) {
+ if (elem.dimension() != dimension) {
+ addressBuilder.add(elem.dimension(), elem.label());
+ }
+ }
+}
+
+TensorDimensions
+removeDimension(const TensorDimensions &dimensions,
+ const vespalib::string &dimension)
+{
+ TensorDimensions result = dimensions;
+ auto itr = std::lower_bound(result.begin(), result.end(), dimension);
+ if (itr != result.end() && *itr == dimension) {
+ result.erase(itr);
+ }
+ return result;
+}
+
+}
+
+SimpleTensorDimensionSum::SimpleTensorDimensionSum(const TensorImplType &tensor,
+ const vespalib::string &
+ dimension)
+ : Parent(removeDimension(tensor.dimensions(), dimension))
+{
+ AddressBuilderType reducedAddress;
+ for (const auto &cell : tensor.cells()) {
+ removeDimension<AddressBuilderType, AddressType>
+ (reducedAddress, cell.first, dimension);
+ _builder.insertCell(reducedAddress, cell.second,
+ [](double cellValue, double rhsValue) { return cellValue + rhsValue; });
+ }
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.h b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.h
new file mode 100644
index 00000000000..adcbb2c1825
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_dimension_sum.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns a tensor with the given dimension removed and the cell values in that dimension summed.
+ */
+class SimpleTensorDimensionSum : public TensorOperation<SimpleTensor>
+{
+public:
+ using TensorImplType = SimpleTensor;
+ using Parent = TensorOperation<SimpleTensor>;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using AddressType = typename Parent::AddressType;
+ using Parent::_builder;
+ SimpleTensorDimensionSum(const TensorImplType &tensor,
+ const vespalib::string &dimension);
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.cpp b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.cpp
new file mode 100644
index 00000000000..b4e7eaf119b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.cpp
@@ -0,0 +1,117 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "simple_tensor_product.h"
+#include <vespa/vespalib/tensor/tensor_address_element_iterator.h>
+#include <vespa/vespalib/tensor/dimensions_vector_iterator.h>
+#include <vespa/vespalib/tensor/join_tensor_addresses.h>
+#include <type_traits>
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+template <class Dimensions>
+void
+calcIntersectDimensions(DimensionsVector &res,
+ const Dimensions &lhs, const Dimensions &rhs)
+{
+ std::set_intersection(lhs.cbegin(), lhs.cend(), rhs.cbegin(), rhs.cend(),
+ std::back_inserter(res));
+}
+
+
+template <class Dimensions>
+void
+calcIntersectDimensions(DimensionsSet &res,
+ const Dimensions &lhs, const Dimensions &rhs)
+{
+ for (const auto &dimension : lhs) {
+ if (std::binary_search(rhs.begin(), rhs.end(), dimension)) {
+ res.insert(vespalib::stringref(dimension.c_str(),
+ dimension.size()));
+ }
+ }
+}
+
+
+}
+
+
+template <class DimensionsCollection>
+void
+SimpleTensorProduct::template bruteForceProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ DimensionsCollection iDims;
+ calcIntersectDimensions<Dimensions>(iDims,
+ lhs.dimensions(), rhs.dimensions());
+ AddressBuilderType combinedAddress;
+ for (const auto &lhsCell : lhs.cells()) {
+ for (const auto &rhsCell : rhs.cells()) {
+ bool combineSuccess = joinTensorAddresses<AddressBuilderType,
+ AddressType, AddressType>
+ (combinedAddress, iDims,
+ lhsCell.first, rhsCell.first);
+ if (combineSuccess) {
+ _builder.insertCell(combinedAddress, lhsCell.second * rhsCell.second);
+ }
+ }
+ }
+}
+
+
+void
+SimpleTensorProduct::fastProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+{
+ const typename TensorImplType::Cells &rhsCells = rhs.cells();
+ for (const auto &lhsCell : lhs.cells()) {
+ auto itr = rhsCells.find(lhsCell.first);
+ if (itr != rhsCells.end()) {
+ _builder.insertCell(lhsCell.first, lhsCell.second * itr->second);
+ }
+ }
+}
+
+
+SimpleTensorProduct::SimpleTensorProduct(const TensorImplType &lhs,
+ const TensorImplType &rhs)
+ : Parent(lhs.combineDimensionsWith(rhs))
+{
+#if 0
+ /* Commented ut for now since we want to see brute force performance. */
+ // All dimensions are common
+ if (lhs.dimensions().size() == rhs.dimensions().size() &&
+ lhs.dimensions().size() == _builder.dimensions().size()) {
+ fastProduct(lhs, rhs);
+ return;
+ }
+ // TODO: Handle zero cells or zero dimensions cases
+ // No dimensions are common
+ if (lhs.dimensions().size() + rhs.dimensions().size() ==
+ _builder.dimensions().size()) {
+ bruteForceNoCommonDimensionProduct(lhs, rhs);
+ return;
+ }
+ // lhs dimensions equals common dimensions
+ if (rhs.dimensions().size() == _builder.dimensions().size()) {
+ }
+ // rhs dimensions equals common dimensions
+ if (lhs.dimensions().size() == _builder.dimensions().size()) {
+ }
+#endif
+#if 1
+ // few common dimensions
+ bruteForceProduct<DimensionsVector>(lhs, rhs);
+#else
+ // many common dimensions, too expensive to iterate through all of
+ // them if each cell has relatively few dimensions.
+ bruteForceProduct<DimensionsSet>(lhs, rhs);
+#endif
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.h b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.h
new file mode 100644
index 00000000000..c811dd2d699
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor_product.h
@@ -0,0 +1,47 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/tensor_operation.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns the sparse tensor product of the two given tensors.
+ * This is all combinations of all cells in the first tensor with all cells of
+ * the second tensor, except the combinations which would have multiple labels
+ * for the same dimension due to shared dimensions between the two tensors.
+ *
+ * If there are no overlapping dimensions this is the regular tensor product.
+ * If the two tensors have exactly the same dimensions this is the Hadamard product.
+ *
+ * The sparse tensor is associative and commutative. Its dimensions are the
+ * set of the dimensions of the two input tensors.
+ */
+class SimpleTensorProduct : public TensorOperation<SimpleTensor>
+{
+public:
+ using TensorImplType = SimpleTensor;
+ using Parent = TensorOperation<SimpleTensor>;
+ using Dimensions = typename Parent::Dimensions;
+ using AddressBuilderType = typename Parent::AddressBuilderType;
+ using AddressRefType = typename Parent::AddressRefType;
+ using AddressType = typename Parent::AddressType;
+ using Parent::_builder;
+
+private:
+ template <class DimensionsCollection>
+ void
+ bruteForceProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+
+ void
+ fastProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+
+public:
+ SimpleTensorProduct(const TensorImplType &lhs, const TensorImplType &rhs);
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor.cpp b/vespalib/src/vespa/vespalib/tensor/tensor.cpp
new file mode 100644
index 00000000000..11ef2b0ad00
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor.cpp
@@ -0,0 +1,24 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor.h"
+#include <sstream>
+#include "default_tensor_engine.h"
+
+namespace vespalib {
+namespace tensor {
+
+Tensor::Tensor()
+ : eval::Tensor(DefaultTensorEngine::ref())
+{
+}
+
+std::ostream &
+operator<<(std::ostream &out, const Tensor &value)
+{
+ value.print(out);
+ return out;
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor.h b/vespalib/src/vespa/vespalib/tensor/tensor.h
new file mode 100644
index 00000000000..a38c1c6bfcc
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor.h
@@ -0,0 +1,50 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "cell_function.h"
+#include "tensor_address.h"
+#include "tensor_type.h"
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/eval/tensor.h>
+
+namespace vespalib {
+namespace tensor {
+
+class TensorVisitor;
+
+/**
+ * Interface for operations on a tensor (sparse multi-dimensional array).
+ *
+ * A sparse tensor is a set of cells containing scalar values.
+ * Each cell is identified by its address, which consists of a set of dimension -> label pairs,
+ * where both dimension and label is a string on the form of an identifier or integer.
+ */
+struct Tensor : public eval::Tensor
+{
+ typedef std::unique_ptr<Tensor> UP;
+ typedef std::reference_wrapper<const Tensor> CREF;
+
+ Tensor();
+ virtual ~Tensor() {}
+ virtual TensorType getType() const = 0;
+ virtual double sum() const = 0;
+ virtual Tensor::UP add(const Tensor &arg) const = 0;
+ virtual Tensor::UP subtract(const Tensor &arg) const = 0;
+ virtual Tensor::UP multiply(const Tensor &arg) const = 0;
+ virtual Tensor::UP min(const Tensor &arg) const = 0;
+ virtual Tensor::UP max(const Tensor &arg) const = 0;
+ virtual Tensor::UP match(const Tensor &arg) const = 0;
+ virtual Tensor::UP apply(const CellFunction &func) const = 0;
+ virtual Tensor::UP sum(const vespalib::string &dimension) const = 0;
+ virtual bool equals(const Tensor &arg) const = 0;
+ virtual void print(std::ostream &out) const = 0;
+ virtual vespalib::string toString() const = 0;
+ virtual Tensor::UP clone() const = 0;
+ virtual void accept(TensorVisitor &visitor) const = 0;
+};
+
+std::ostream &operator<<(std::ostream &out, const Tensor &value);
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_address.cpp b/vespalib/src/vespa/vespalib/tensor/tensor_address.cpp
new file mode 100644
index 00000000000..58db18dc40e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_address.cpp
@@ -0,0 +1,87 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_address.h"
+#include <algorithm>
+
+namespace vespalib {
+namespace tensor {
+
+const vespalib::string TensorAddress::Element::UNDEFINED_LABEL = "(undefined)";
+
+TensorAddress::TensorAddress()
+ : _elements()
+{
+}
+
+TensorAddress::TensorAddress(const Elements &elements_in)
+ : _elements(elements_in)
+{
+ std::sort(_elements.begin(), _elements.end());
+}
+
+bool
+TensorAddress::hasDimension(const vespalib::string &dimension) const
+{
+ for (const auto &elem : _elements) {
+ if (elem.dimension() == dimension) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool
+TensorAddress::operator<(const TensorAddress &rhs) const
+{
+ if (_elements.size() == rhs._elements.size()) {
+ for (size_t i = 0; i < _elements.size(); ++i) {
+ if (_elements[i] != rhs._elements[i]) {
+ return _elements[i] < rhs._elements[i];
+ }
+ }
+ }
+ return _elements.size() < rhs._elements.size();
+}
+
+bool
+TensorAddress::operator==(const TensorAddress &rhs) const
+{
+ return _elements == rhs._elements;
+}
+
+size_t
+TensorAddress::hash() const
+{
+ size_t hashCode = 1;
+ for (const auto &elem : _elements) {
+ hashCode = 31 * hashCode + elem.hash();
+ }
+ return hashCode;
+}
+
+std::ostream &
+operator<<(std::ostream &out, const TensorAddress::Elements &elements)
+{
+ out << "{";
+ bool first = true;
+ for (const auto &elem : elements) {
+ if (!first) {
+ out << ",";
+ }
+ out << elem.dimension() << ":" << elem.label();
+ first = false;
+ }
+ out << "}";
+ return out;
+}
+
+std::ostream &
+operator<<(std::ostream &out, const TensorAddress &value)
+{
+ out << value.elements();
+ return out;
+}
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_address.h b/vespalib/src/vespa/vespalib/tensor/tensor_address.h
new file mode 100644
index 00000000000..42dceb65ae2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_address.h
@@ -0,0 +1,81 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/hash_fun.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <iostream>
+#include <map>
+#include <vector>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * A sparse immutable address to a tensor cell.
+ *
+ * Only dimensions which have a different label than "undefined" are explicitly included.
+ * Tensor addresses are ordered by increasing size primarily,
+ * and by the natural order of the elements in sorted order secondarily.
+ */
+class TensorAddress
+{
+public:
+ typedef std::unique_ptr<TensorAddress> UP;
+
+ class Element
+ {
+ private:
+ vespalib::string _dimension;
+ vespalib::string _label;
+
+ public:
+ static const vespalib::string UNDEFINED_LABEL;
+ Element(const vespalib::string &dimension_in, const vespalib::string &label_in)
+ : _dimension(dimension_in), _label(label_in)
+ {}
+ const vespalib::string &dimension() const { return _dimension; }
+ const vespalib::string &label() const { return _label; }
+ bool operator<(const Element &rhs) const {
+ if (_dimension == rhs._dimension) {
+ // Define sort order when dimension is the same to be able
+ // to do set operations over element vectors.
+ return _label < rhs._label;
+ }
+ return _dimension < rhs._dimension;
+ }
+ bool operator==(const Element &rhs) const {
+ return (_dimension == rhs._dimension) && (_label == rhs._label);
+ }
+ bool operator!=(const Element &rhs) const {
+ return !(*this == rhs);
+ }
+ size_t hash() const {
+ return hashValue(_dimension.c_str()) + hashValue(_label.c_str());
+ }
+ };
+
+ typedef std::vector<Element> Elements;
+
+private:
+ Elements _elements;
+
+public:
+ TensorAddress();
+ explicit TensorAddress(const Elements &elements_in);
+ explicit TensorAddress(Elements &&elements_in)
+ : _elements(std::move(elements_in))
+ {
+ }
+ const Elements &elements() const { return _elements; }
+ bool hasDimension(const vespalib::string &dimension) const;
+ bool operator<(const TensorAddress &rhs) const;
+ bool operator==(const TensorAddress &rhs) const;
+ size_t hash() const;
+};
+
+std::ostream &operator<<(std::ostream &out, const TensorAddress::Elements &elements);
+std::ostream &operator<<(std::ostream &out, const TensorAddress &value);
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_address_builder.h b/vespalib/src/vespa/vespalib/tensor/tensor_address_builder.h
new file mode 100644
index 00000000000..46ce3088528
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_address_builder.h
@@ -0,0 +1,31 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "tensor_address.h"
+
+namespace vespalib {
+namespace tensor {
+
+
+/**
+ * A builder for tensor addresses.
+ */
+class TensorAddressBuilder
+{
+ TensorAddress::Elements _elements;
+public:
+ TensorAddressBuilder()
+ : _elements()
+ {
+ }
+ void add(vespalib::stringref dimension, vespalib::stringref label) {
+ _elements.emplace_back(dimension, label);
+ }
+ TensorAddress build() { return TensorAddress(_elements); }
+ void clear(void) { _elements.clear(); }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_address_element_iterator.h b/vespalib/src/vespa/vespalib/tensor/tensor_address_element_iterator.h
new file mode 100644
index 00000000000..3a260c7c693
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_address_element_iterator.h
@@ -0,0 +1,218 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+namespace tensor {
+
+using DimensionsSet = vespalib::hash_set<vespalib::stringref>;
+
+/**
+ * An iterator for tensor address elements used to simplify 3-way merge
+ * between two tensor addresses and a dimension vector.
+ */
+template <class Address>
+class TensorAddressElementIterator {
+ using InnerIterator = typename Address::Elements::const_iterator;
+ InnerIterator _itr;
+ InnerIterator _itrEnd;
+public:
+ TensorAddressElementIterator(const Address &address)
+ : _itr(address.elements().cbegin()),
+ _itrEnd(address.elements().cend())
+ {
+ }
+ bool valid() const { return (_itr != _itrEnd); }
+ vespalib::stringref dimension() const { return _itr->dimension(); }
+ vespalib::stringref label() const { return _itr->label(); }
+ template <class Iterator>
+ bool beforeDimension(const Iterator &rhs) const {
+ if (!valid()) {
+ return false;
+ }
+ if (!rhs.valid()) {
+ return true;
+ }
+ return (_itr->dimension() < rhs.dimension());
+ }
+ bool atDimension(vespalib::stringref rhsDimension) const
+ {
+ return (valid() && (_itr->dimension() == rhsDimension));
+ }
+ void next() { ++_itr; }
+ template <class AddressBuilder>
+ void
+ addElement(AddressBuilder &builder) {
+ builder.add(_itr->dimension(), _itr->label());
+ }
+ template <class AddressBuilder, class Iterator>
+ void addElements(AddressBuilder &builder, const Iterator &limit)
+ {
+ while (beforeDimension(limit)) {
+ addElement(builder);
+ next();
+ }
+ }
+ template <class AddressBuilder, class Iterator>
+ bool addElements(AddressBuilder &builder, const DimensionsSet &dims,
+ const Iterator &limit)
+ {
+ do {
+ if (dims.find(_itr->dimension()) != dims.end()) {
+ return false;
+ }
+ addElement(builder);
+ next();
+ } while (beforeDimension(limit));
+ return true;
+ }
+ template <class AddressBuilder>
+ void addElements(AddressBuilder &builder)
+ {
+ while (valid()) {
+ addElement(builder);
+ next();
+ }
+ }
+ template <class AddressBuilder>
+ bool addElements(AddressBuilder &builder, const DimensionsSet &dims)
+ {
+ while (valid()) {
+ if (dims.find(_itr->dimension()) != dims.end()) {
+ return false;
+ }
+ addElement(builder);
+ next();
+ }
+ return true;
+ }
+
+ bool skipToDimension(vespalib::stringref rhsDimension) {
+ for (;;) {
+ if (!valid()) {
+ return false;
+ }
+ if (dimension() < rhsDimension) {
+ next();
+ } else {
+ return (dimension() == rhsDimension);
+ }
+ }
+ }
+};
+
+
+/**
+ * An iterator for tensor address elements used to simplify 3-way merge
+ * between two tensor addresses and a dimension vector.
+ * This is a specialization to perform decoding on the fly while iterating.
+ */
+template <>
+class TensorAddressElementIterator<CompactTensorAddressRef> {
+ const char *_itr;
+ const char *_itrEnd;
+ vespalib::stringref _dimension;
+ vespalib::stringref _label;
+
+ size_t
+ simple_strlen(const char *str) {
+ const char *strend = str;
+ for (; *strend != '\0'; ++strend) {
+ }
+ return (strend - str);
+ }
+
+ void decodeElement()
+ {
+ _dimension = vespalib::stringref(_itr, simple_strlen(_itr));
+ const char *labelp = _dimension.c_str() + _dimension.size() + 1;
+ _label = vespalib::stringref(labelp, simple_strlen(labelp));
+ _itr = _label.c_str() + _label.size() + 1;
+ }
+public:
+ TensorAddressElementIterator(CompactTensorAddressRef address)
+ : _itr(static_cast<const char *>(address.start())),
+ _itrEnd(_itr + address.size()),
+ _dimension(),
+ _label()
+ {
+ if (_itr != _itrEnd) {
+ decodeElement();
+ }
+ }
+ bool valid() const { return (_dimension.size() != 0u); }
+ vespalib::stringref dimension() const { return _dimension; }
+ vespalib::stringref label() const { return _label; }
+ template <class Iterator>
+ bool beforeDimension(const Iterator &rhs) const {
+ if (!valid()) {
+ return false;
+ }
+ if (!rhs.valid()) {
+ return true;
+ }
+ return (_dimension < rhs.dimension());
+ }
+ bool atDimension(vespalib::stringref rhsDimension) const
+ {
+ return (_dimension == rhsDimension);
+ }
+ void next() {
+ if (_itr != _itrEnd) {
+ decodeElement();
+ } else {
+ _dimension = vespalib::stringref();
+ _label = vespalib::stringref();
+ }
+ }
+ template <class AddressBuilder>
+ void
+ addElement(AddressBuilder &builder) {
+ builder.add(_dimension, _label);
+ }
+ template <class AddressBuilder, class Iterator>
+ void addElements(AddressBuilder &builder, const Iterator &limit)
+ {
+ while (beforeDimension(limit)) {
+ addElement(builder);
+ next();
+ }
+ }
+ template <class AddressBuilder, class Iterator>
+ bool addElements(AddressBuilder &builder, const DimensionsSet &dims,
+ const Iterator &limit)
+ {
+ do {
+ if (dims.find(_dimension) != dims.end()) {
+ return false;
+ }
+ addElement(builder);
+ next();
+ } while (beforeDimension(limit));
+ return true;
+ }
+ template <class AddressBuilder>
+ void addElements(AddressBuilder &builder)
+ {
+ while (valid()) {
+ addElement(builder);
+ next();
+ }
+ }
+ template <class AddressBuilder>
+ bool addElements(AddressBuilder &builder, const DimensionsSet &dims)
+ {
+ while (valid()) {
+ if (dims.find(_dimension) != dims.end()) {
+ return false;
+ }
+ addElement(builder);
+ next();
+ }
+ return true;
+ }
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_apply.cpp b/vespalib/src/vespa/vespalib/tensor/tensor_apply.cpp
new file mode 100644
index 00000000000..ad9cab61243
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_apply.cpp
@@ -0,0 +1,24 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_apply.h"
+
+namespace vespalib {
+namespace tensor {
+
+template <class TensorT>
+TensorApply<TensorT>::TensorApply(const TensorImplType &tensor,
+ const CellFunction &func)
+ : Parent(tensor.dimensions())
+{
+ for (const auto &cell : tensor.cells()) {
+ _builder.insertCell(cell.first, func.apply(cell.second));
+ }
+}
+
+template class TensorApply<SimpleTensor>;
+template class TensorApply<CompactTensor>;
+template class TensorApply<CompactTensorV2>;
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_apply.h b/vespalib/src/vespa/vespalib/tensor/tensor_apply.h
new file mode 100644
index 00000000000..7fc9cd2ccfa
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_apply.h
@@ -0,0 +1,29 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "cell_function.h"
+#include "tensor_operation.h"
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Returns a tensor with the given function applied to all cells in the input tensor.
+ */
+template <class TensorT>
+class TensorApply : public TensorOperation<TensorT>
+{
+public:
+ using Parent = TensorOperation<TensorT>;
+ using typename Parent::TensorImplType;
+ using Parent::_builder;
+ TensorApply(const TensorImplType &tensor, const CellFunction &func);
+};
+
+extern template class TensorApply<SimpleTensor>;
+extern template class TensorApply<CompactTensor>;
+extern template class TensorApply<CompactTensorV2>;
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_builder.h b/vespalib/src/vespa/vespalib/tensor/tensor_builder.h
new file mode 100644
index 00000000000..2b97d09a1e6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_builder.h
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+namespace tensor {
+
+class Tensor;
+
+/**
+ * An interfrace for builder of tensors (sparse multi-dimensional array).
+ *
+ * A sparse tensor is a set of cells containing scalar values. Each
+ * cell is identified by its address, which consists of a set of
+ * dimension -> label pairs, where both dimension and label is a
+ * string on the form of an identifier or integer.
+ */
+class TensorBuilder
+{
+public:
+ using Dimension = uint32_t;
+ virtual ~TensorBuilder() { }
+
+ virtual Dimension define_dimension(const vespalib::string &dimension) = 0;
+ virtual TensorBuilder &
+ add_label(Dimension dimension, const vespalib::string &label) = 0;
+ virtual TensorBuilder &add_cell(double value) = 0;
+ virtual std::unique_ptr<Tensor> build() = 0;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_factory.cpp b/vespalib/src/vespa/vespalib/tensor/tensor_factory.cpp
new file mode 100644
index 00000000000..f8496180f7f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_factory.cpp
@@ -0,0 +1,76 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor.h"
+#include "tensor_factory.h"
+#include "tensor_builder.h"
+#include <vespa/vespalib/tensor/dense/dense_tensor_builder.h>
+
+namespace vespalib {
+namespace tensor {
+
+std::unique_ptr<Tensor>
+TensorFactory::create(const TensorCells &cells,
+ TensorBuilder &builder) {
+ for (const auto &cell : cells) {
+ for (const auto &addressElem : cell.first) {
+ const auto &dimension = addressElem.first;
+ builder.define_dimension(dimension);
+ }
+ }
+ for (const auto &cell : cells) {
+ for (const auto &addressElem : cell.first) {
+ const auto &dimension = addressElem.first;
+ const auto &label = addressElem.second;
+ builder.add_label(builder.define_dimension(dimension), label);
+ }
+ builder.add_cell(cell.second);
+ }
+ return builder.build();
+}
+
+
+std::unique_ptr<Tensor>
+TensorFactory::create(const TensorCells &cells,
+ const TensorDimensions &dimensions,
+ TensorBuilder &builder) {
+ for (const auto &dimension : dimensions) {
+ builder.define_dimension(dimension);
+ }
+ return create(cells, builder);
+}
+
+
+std::unique_ptr<Tensor>
+TensorFactory::createDense(const DenseTensorCells &cells)
+{
+ std::map<std::string, size_t> dimensionSizes;
+ DenseTensorBuilder builder;
+ for (const auto &cell : cells) {
+ for (const auto &addressElem : cell.first) {
+ dimensionSizes[addressElem.first] =
+ std::max(dimensionSizes[addressElem.first],
+ (addressElem.second + 1));
+ }
+ }
+ std::map<std::string,
+ typename DenseTensorBuilder::Dimension> dimensionEnums;
+ for (const auto &dimensionElem : dimensionSizes) {
+ dimensionEnums[dimensionElem.first] =
+ builder.defineDimension(dimensionElem.first,
+ dimensionElem.second);
+ }
+ for (const auto &cell : cells) {
+ for (const auto &addressElem : cell.first) {
+ const auto &dimension = addressElem.first;
+ size_t label = addressElem.second;
+ builder.addLabel(dimensionEnums[dimension], label);
+ }
+ builder.addCell(cell.second);
+ }
+ return builder.build();
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_factory.h b/vespalib/src/vespa/vespalib/tensor/tensor_factory.h
new file mode 100644
index 00000000000..db66cf7bedf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_factory.h
@@ -0,0 +1,30 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "types.h"
+
+namespace vespalib {
+namespace tensor {
+
+
+class Tensor;
+class TensorBuilder;
+
+/**
+ * A factory for creating tensors based on stl structures (TensorCells and
+ * TensorDimensions) in unit tests.
+ */
+class TensorFactory {
+public:
+ static std::unique_ptr<Tensor>
+ create(const TensorCells &cells, TensorBuilder &builder);
+ static std::unique_ptr<Tensor>
+ create(const TensorCells &cells, const TensorDimensions &dimensions,
+ TensorBuilder &builder);
+ static std::unique_ptr<Tensor>
+ createDense(const DenseTensorCells &cells);
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_function.cpp b/vespalib/src/vespa/vespalib/tensor/tensor_function.cpp
new file mode 100644
index 00000000000..a89dd3c22de
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_function.cpp
@@ -0,0 +1,359 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_function.h"
+
+namespace vespalib {
+namespace tensor {
+namespace function {
+namespace {
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Base function class keeping track of result type.
+ **/
+class FunctionBase : public Node
+{
+private:
+ TensorType _type;
+protected:
+ explicit FunctionBase(const TensorType &type_in) : _type(type_in) {}
+ const TensorType &type() const override { return _type; }
+
+ // helper function used to unwrap tensor value from eval result
+ static const Tensor &eval_tensor(Node &node, const Input &input) {
+ return node.eval(input).as_tensor;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Function mixin class used to keep tensor results alive.
+ **/
+class TensorCache : public FunctionBase
+{
+private:
+ Tensor::UP _my_result;
+protected:
+ explicit TensorCache(const TensorType &type_in)
+ : FunctionBase(type_in), _my_result() {}
+ const Tensor &store_tensor(Tensor::UP result) {
+ _my_result = std::move(result);
+ return *_my_result;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Resolve an input tensor value.
+ **/
+class InputTensor : public FunctionBase
+{
+private:
+ size_t _tensor_id;
+
+ static TensorType infer_type(const TensorType &type_in) {
+ if (type_in.is_tensor()) {
+ return type_in;
+ } else {
+ return TensorType::invalid();
+ }
+ }
+
+public:
+ InputTensor(const TensorType &type_in, size_t tensor_id)
+ : FunctionBase(infer_type(type_in)), _tensor_id(tensor_id) {}
+ Result eval(const Input &input) override {
+ return input.get_tensor(_tensor_id);
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Sum all the cells in a tensor.
+ **/
+class Sum : public FunctionBase
+{
+private:
+ Node_UP _child;
+
+ static TensorType infer_type(const TensorType &child_type) {
+ if (child_type.is_tensor()) {
+ return TensorType::number();
+ } else {
+ return TensorType::invalid();
+ }
+ }
+
+public:
+ explicit Sum(Node_UP child)
+ : FunctionBase(infer_type(child->type())),
+ _child(std::move(child)) {}
+
+ Result eval(const Input &input) override {
+ return eval_tensor(*_child, input).sum();
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Perform sum over a tensor dimension.
+ **/
+class DimensionSum : public TensorCache
+{
+private:
+ Node_UP _child;
+ vespalib::string _dimension;
+
+ static TensorType infer_type(const TensorType &child_type, const vespalib::string &dimension) {
+ return child_type.remove_dimensions({dimension});
+ }
+
+public:
+ DimensionSum(Node_UP child, const vespalib::string &dimension)
+ : TensorCache(infer_type(child->type(), dimension)),
+ _child(std::move(child)), _dimension(dimension) {}
+
+ Result eval(const Input &input) override {
+ return store_tensor(eval_tensor(*_child, input).sum(_dimension));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Apply a cell function to all cells in a tensor.
+ **/
+class Apply : public TensorCache
+{
+private:
+ Node_UP _child;
+ size_t _cell_function_id;
+
+ static TensorType infer_type(const TensorType &child_type) {
+ if (child_type.is_tensor()) {
+ return child_type;
+ } else {
+ return TensorType::invalid();
+ }
+ }
+
+public:
+ Apply(Node_UP child, size_t cell_function_id)
+ : TensorCache(infer_type(child->type())),
+ _child(std::move(child)), _cell_function_id(cell_function_id) {}
+
+ Result eval(const Input &input) override {
+ const auto &cell_function = input.get_cell_function(_cell_function_id);
+ return store_tensor(eval_tensor(*_child, input).apply(cell_function));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Add two tensors.
+ **/
+class Add : public TensorCache
+{
+private:
+ Node_UP _lhs;
+ Node_UP _rhs;
+
+ static TensorType infer_type(const TensorType &lhs_type, const TensorType &rhs_type) {
+ return lhs_type.add_dimensions_from(rhs_type);
+ }
+
+public:
+ Add(Node_UP lhs, Node_UP rhs)
+ : TensorCache(infer_type(lhs->type(), rhs->type())),
+ _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
+
+ Result eval(const Input &input) override {
+ return store_tensor(eval_tensor(*_lhs, input)
+ .add(eval_tensor(*_rhs, input)));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Subtract two tensors.
+ **/
+class Subtract : public TensorCache
+{
+private:
+ Node_UP _lhs;
+ Node_UP _rhs;
+
+ static TensorType infer_type(const TensorType &lhs_type, const TensorType &rhs_type) {
+ return lhs_type.add_dimensions_from(rhs_type);
+ }
+
+public:
+ Subtract(Node_UP lhs, Node_UP rhs)
+ : TensorCache(infer_type(lhs->type(), rhs->type())),
+ _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
+
+ Result eval(const Input &input) override {
+ return store_tensor(eval_tensor(*_lhs, input)
+ .subtract(eval_tensor(*_rhs, input)));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Multiply two tensors.
+ **/
+class Multiply : public TensorCache
+{
+private:
+ Node_UP _lhs;
+ Node_UP _rhs;
+
+ static TensorType infer_type(const TensorType &lhs_type, const TensorType &rhs_type) {
+ return lhs_type.add_dimensions_from(rhs_type);
+ }
+
+public:
+ Multiply(Node_UP lhs, Node_UP rhs)
+ : TensorCache(infer_type(lhs->type(), rhs->type())),
+ _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
+
+ Result eval(const Input &input) override {
+ return store_tensor(eval_tensor(*_lhs, input)
+ .multiply(eval_tensor(*_rhs, input)));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Cellwise min between two tensors.
+ **/
+class Min : public TensorCache
+{
+private:
+ Node_UP _lhs;
+ Node_UP _rhs;
+
+ static TensorType infer_type(const TensorType &lhs_type, const TensorType &rhs_type) {
+ return lhs_type.add_dimensions_from(rhs_type);
+ }
+
+public:
+ Min(Node_UP lhs, Node_UP rhs)
+ : TensorCache(infer_type(lhs->type(), rhs->type())),
+ _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
+
+ Result eval(const Input &input) override {
+ return store_tensor(eval_tensor(*_lhs, input)
+ .min(eval_tensor(*_rhs, input)));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Cellwise max between two tensors.
+ **/
+class Max : public TensorCache
+{
+private:
+ Node_UP _lhs;
+ Node_UP _rhs;
+
+ static TensorType infer_type(const TensorType &lhs_type, const TensorType &rhs_type) {
+ return lhs_type.add_dimensions_from(rhs_type);
+ }
+
+public:
+ Max(Node_UP lhs, Node_UP rhs)
+ : TensorCache(infer_type(lhs->type(), rhs->type())),
+ _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
+
+ Result eval(const Input &input) override {
+ return store_tensor(eval_tensor(*_lhs, input)
+ .max(eval_tensor(*_rhs, input)));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Match two tensors.
+ **/
+class Match : public TensorCache
+{
+private:
+ Node_UP _lhs;
+ Node_UP _rhs;
+
+ static TensorType infer_type(const TensorType &lhs_type, const TensorType &rhs_type) {
+ return lhs_type.keep_dimensions_in(rhs_type);
+ }
+
+public:
+ Match(Node_UP lhs, Node_UP rhs)
+ : TensorCache(infer_type(lhs->type(), rhs->type())),
+ _lhs(std::move(lhs)), _rhs(std::move(rhs)) {}
+
+ Result eval(const Input &input) override {
+ return store_tensor(eval_tensor(*_lhs, input)
+ .match(eval_tensor(*_rhs, input)));
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::tensor::function::<unnamed>
+
+Node_UP input(const TensorType &type, size_t tensor_id) {
+ return std::make_unique<InputTensor>(type, tensor_id);
+}
+
+Node_UP sum(Node_UP child) {
+ return std::make_unique<Sum>(std::move(child));
+}
+
+Node_UP dimension_sum(Node_UP child, const vespalib::string &dimension) {
+ return std::make_unique<DimensionSum>(std::move(child), dimension);
+}
+
+Node_UP apply(Node_UP child, size_t cell_function_id) {
+ return std::make_unique<Apply>(std::move(child), cell_function_id);
+}
+
+Node_UP add(Node_UP lhs, Node_UP rhs) {
+ return std::make_unique<Add>(std::move(lhs), std::move(rhs));
+}
+
+Node_UP subtract(Node_UP lhs, Node_UP rhs) {
+ return std::make_unique<Subtract>(std::move(lhs), std::move(rhs));
+}
+
+Node_UP multiply(Node_UP lhs, Node_UP rhs) {
+ return std::make_unique<Multiply>(std::move(lhs), std::move(rhs));
+}
+
+Node_UP min(Node_UP lhs, Node_UP rhs) {
+ return std::make_unique<Min>(std::move(lhs), std::move(rhs));
+}
+
+Node_UP max(Node_UP lhs, Node_UP rhs) {
+ return std::make_unique<Max>(std::move(lhs), std::move(rhs));
+}
+
+Node_UP match(Node_UP lhs, Node_UP rhs) {
+ return std::make_unique<Match>(std::move(lhs), std::move(rhs));
+}
+
+} // namespace vespalib::tensor::function
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_function.h b/vespalib/src/vespa/vespalib/tensor/tensor_function.h
new file mode 100644
index 00000000000..1bc55b30206
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_function.h
@@ -0,0 +1,110 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "tensor_type.h"
+#include "tensor.h"
+#include <memory>
+
+namespace vespalib {
+namespace tensor {
+
+//-----------------------------------------------------------------------------
+
+/**
+ * A tensor function that can be evaluated. A TensorFunction will
+ * typically be produced by an implementation-specific compile step
+ * that takes an implementation-independent intermediate
+ * representation of the tensor function as input (tree of
+ * function::Node objects).
+ **/
+struct TensorFunction
+{
+ typedef std::unique_ptr<TensorFunction> UP;
+
+ /**
+ * A tensor function will evaluate to either a tensor or a double
+ * value. The result type indicated by the tensor function
+ * intermediate representation will indicate which form is valid.
+ **/
+ union Result {
+ double as_double;
+ Tensor::CREF as_tensor;
+ Result(const Result &rhs) { memcpy(this, &rhs, sizeof(Result)); }
+ Result(double value) : as_double(value) {}
+ Result(const Tensor &value) : as_tensor(value) {}
+ ~Result() {}
+ };
+
+ /**
+ * Interface used to obtain input to a tensor function.
+ **/
+ struct Input {
+ virtual const Tensor &get_tensor(size_t id) const = 0;
+ virtual const CellFunction &get_cell_function(size_t id) const = 0;
+ virtual ~Input() {}
+ };
+
+ /**
+ * Evaluate this tensor function based on the given input. This
+ * function is defined as non-const because it will return tensors
+ * by reference. Intermediate results are typically kept alive
+ * until the next time eval is called. The return value must
+ * conform to the result type indicated by the intermediate
+ * representation describing this tensor function.
+ *
+ * @return result of evaluating this tensor function
+ * @param input external stuff needed to evaluate this function
+ **/
+ virtual Result eval(const Input &input) = 0;
+
+ virtual ~TensorFunction() {}
+};
+
+//-----------------------------------------------------------------------------
+
+namespace function {
+
+/**
+ * Interface used to describe a tensor function as a tree of nodes
+ * with information about operation sequencing and intermediate result
+ * types. Each node in the tree will describe a single tensor
+ * operation. This is the intermediate representation of a tensor
+ * function.
+ *
+ * Since tensor operations currently are part of the tensor interface,
+ * the intermediate representation of a tensor function can also be
+ * used to evaluate the tensor function by performing the appropriate
+ * operations directly on the input tensors. In other words, the
+ * intermediate representation 'compiles to itself'.
+ **/
+struct Node : public TensorFunction
+{
+ /**
+ * The result type of the tensor operation represented by this
+ * Node.
+ *
+ * @return tensor operation result type.
+ **/
+ virtual const TensorType &type() const = 0;
+};
+
+using Node_UP = std::unique_ptr<Node>;
+
+Node_UP input(const TensorType &type, size_t tensor_id);
+Node_UP sum(Node_UP child);
+Node_UP dimension_sum(Node_UP child, const vespalib::string &dimension);
+Node_UP apply(Node_UP child, size_t cell_function_id);
+Node_UP add(Node_UP lhs, Node_UP rhs);
+Node_UP subtract(Node_UP lhs, Node_UP rhs);
+Node_UP multiply(Node_UP lhs, Node_UP rhs);
+Node_UP min(Node_UP lhs, Node_UP rhs);
+Node_UP max(Node_UP lhs, Node_UP rhs);
+Node_UP match(Node_UP lhs, Node_UP rhs);
+
+} // namespace vespalib::tensor::function
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_mapper.cpp b/vespalib/src/vespa/vespalib/tensor/tensor_mapper.cpp
new file mode 100644
index 00000000000..7ab9f56b5be
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_mapper.cpp
@@ -0,0 +1,292 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_mapper.h"
+#include "tensor.h"
+#include "tensor_visitor.h"
+#include <vespa/vespalib/tensor/simple/direct_simple_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/direct_compact_tensor_v2_builder.h>
+#include <vespa/vespalib/tensor/compact/direct_compact_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/compact_tensor_address_ref.h>
+#include <vespa/vespalib/tensor/dense/dense_tensor.h>
+#include "tensor_address_element_iterator.h"
+#include "default_tensor.h"
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+class SparseTensorMapperBase
+{
+protected:
+ static TensorDimensions mapDimensions(const TensorType &type);
+};
+
+TensorDimensions
+SparseTensorMapperBase::mapDimensions(const TensorType &type)
+{
+ TensorDimensions dimensions;
+ dimensions.reserve(type.dimensions().size());
+ for (const auto &dimension : type.dimensions()) {
+ dimensions.emplace_back(dimension.name);
+ }
+ return dimensions;
+}
+
+template <class TensorT>
+class SparseTensorMapper : public TensorVisitor, public SparseTensorMapperBase
+{
+ using Builder = DirectTensorBuilder<TensorT>;
+ using AddressBuilderType = typename Builder::AddressBuilderType;
+
+ Builder _builder;
+ AddressBuilderType _addressBuilder;
+
+ void mapAddress(const TensorAddress &address);
+ virtual void visit(const TensorAddress &address, double value) override;
+
+ SparseTensorMapper(const TensorType &type);
+
+ ~SparseTensorMapper();
+
+ std::unique_ptr<Tensor> build();
+public:
+ static std::unique_ptr<Tensor>
+ map(const Tensor &tensor, const TensorType &type);
+};
+
+template <class TensorT>
+SparseTensorMapper<TensorT>::
+SparseTensorMapper(const TensorType &type)
+ : TensorVisitor(),
+ SparseTensorMapperBase(),
+ _builder(mapDimensions(type)),
+ _addressBuilder()
+{
+}
+
+template <class TensorT>
+SparseTensorMapper<TensorT>::~SparseTensorMapper()
+{
+}
+
+template <class TensorT>
+std::unique_ptr<Tensor>
+SparseTensorMapper<TensorT>::build()
+{
+ return _builder.build();
+}
+
+template <>
+void
+SparseTensorMapper<CompactTensorV2>::
+mapAddress(const TensorAddress &address)
+{
+ _addressBuilder.clear();
+ TensorAddressElementIterator<TensorAddress> addressIterator(address);
+ for (const auto &dimension : _builder.dimensions()) {
+ if (addressIterator.skipToDimension(dimension)) {
+ _addressBuilder.add(addressIterator.label());
+ addressIterator.next();
+ } else {
+ // output dimension not in input
+ _addressBuilder.addUndefined();
+ }
+ }
+}
+
+template <class TensorT>
+void
+SparseTensorMapper<TensorT>::mapAddress(const TensorAddress &address)
+{
+ _addressBuilder.clear();
+ TensorAddressElementIterator<TensorAddress> addressIterator(address);
+ for (const auto &dimension : _builder.dimensions()) {
+ if (addressIterator.skipToDimension(dimension)) {
+ _addressBuilder.add(dimension, addressIterator.label());
+ addressIterator.next();
+ } else {
+ // output dimension not in input
+ }
+ }
+}
+
+template <class TensorT>
+void
+SparseTensorMapper<TensorT>::visit(const TensorAddress &address, double value)
+{
+ mapAddress(address);
+ _builder.insertCell(_addressBuilder, value,
+ [](double oldValue, double newValue)
+ { return oldValue + newValue; });
+}
+
+template <class TensorT>
+std::unique_ptr<Tensor>
+SparseTensorMapper<TensorT>::map(const Tensor &tensor,
+ const TensorType &type)
+{
+ SparseTensorMapper<TensorT> mapper(type);
+ tensor.accept(mapper);
+ return mapper.build();
+}
+
+class DenseTensorMapper : public TensorVisitor
+{
+ DenseTensor::DimensionsMeta _dimensionsMeta;
+ DenseTensor::Cells _cells;
+ static constexpr uint32_t BAD_LABEL = std::numeric_limits<uint32_t>::max();
+ static constexpr uint32_t BAD_ADDRESS =
+ std::numeric_limits<uint32_t>::max();
+
+ static uint32_t mapLabelToNumber(vespalib::stringref label);
+ uint32_t mapAddressToIndex(const TensorAddress &address);
+ virtual void visit(const TensorAddress &address, double value) override;
+
+ DenseTensorMapper(const TensorType &type);
+ ~DenseTensorMapper();
+
+ std::unique_ptr<Tensor> build();
+public:
+ static std::unique_ptr<Tensor>
+ map(const Tensor &tensor, const TensorType &type);
+};
+
+DenseTensorMapper::DenseTensorMapper(const TensorType &type)
+ : _dimensionsMeta(),
+ _cells()
+{
+ _dimensionsMeta.reserve(type.dimensions().size());
+ size_t size = 1;
+ for (const auto &dimension : type.dimensions()) {
+ size *= dimension.size;
+ _dimensionsMeta.emplace_back(dimension.name, dimension.size);
+ }
+ _cells.resize(size);
+}
+
+DenseTensorMapper::~DenseTensorMapper()
+{
+}
+
+std::unique_ptr<Tensor>
+DenseTensorMapper::build()
+{
+ return std::make_unique<DenseTensor>(std::move(_dimensionsMeta),
+ std::move(_cells));
+}
+
+uint32_t
+DenseTensorMapper::mapLabelToNumber(vespalib::stringref label)
+{
+ uint32_t result = 0;
+ for (char c : label) {
+ if (c < '0' || c > '9') {
+ return BAD_LABEL; // bad char
+ }
+ result = result * 10 + (c - '0');
+ if (result > 100000000) {
+ return BAD_LABEL; // overflow
+ }
+ }
+ return result;
+}
+
+uint32_t
+DenseTensorMapper::mapAddressToIndex(const TensorAddress &address)
+{
+ uint32_t idx = 0;
+ TensorAddressElementIterator<TensorAddress> addressIterator(address);
+ for (const auto &dimension : _dimensionsMeta) {
+ if (addressIterator.skipToDimension(dimension.dimension())) {
+ uint32_t label = mapLabelToNumber(addressIterator.label());
+ if (label == BAD_LABEL || label >= dimension.size()) {
+ return BAD_ADDRESS;
+ }
+ idx = idx * dimension.size() + label;
+ addressIterator.next();
+ } else {
+ // output dimension not in input
+ idx = idx * dimension.size();
+ }
+ }
+ return idx;
+}
+
+void
+DenseTensorMapper::visit(const TensorAddress &address, double value)
+{
+ uint32_t idx = mapAddressToIndex(address);
+ if (idx != BAD_ADDRESS) {
+ assert(idx < _cells.size());
+ _cells[idx] += value;
+ }
+}
+
+std::unique_ptr<Tensor>
+DenseTensorMapper::map(const Tensor &tensor, const TensorType &type)
+{
+ DenseTensorMapper mapper(type);
+ tensor.accept(mapper);
+ return mapper.build();
+}
+
+} // namespace vespalib::tensor::<anonymous>
+
+TensorMapper::TensorMapper(const TensorType &type)
+ : _type(type)
+{
+}
+
+TensorMapper::~TensorMapper()
+{
+}
+
+template <typename TensorT>
+std::unique_ptr<Tensor>
+TensorMapper::mapToSparse(const Tensor &tensor, const TensorType &type)
+{
+ assert(type.type() == TensorType::Type::SPARSE);
+ return SparseTensorMapper<TensorT>::map(tensor, type);
+}
+
+std::unique_ptr<Tensor>
+TensorMapper::mapToDense(const Tensor &tensor, const TensorType &type)
+{
+ assert(type.type() == TensorType::Type::DENSE);
+ return DenseTensorMapper::map(tensor, type);
+}
+
+std::unique_ptr<Tensor>
+TensorMapper::map(const Tensor &tensor)
+{
+ switch (_type.type()) {
+ case TensorType::Type::INVALID:
+ case TensorType::Type::NUMBER:
+ return std::unique_ptr<Tensor>();
+ case TensorType::Type::SPARSE:
+ return mapToSparse<DefaultTensor::type>(tensor, _type);
+ case TensorType::Type::DENSE:
+ return mapToDense(tensor, _type);
+ }
+ abort();
+}
+
+template
+std::unique_ptr<Tensor>
+TensorMapper::mapToSparse<SimpleTensor>(const Tensor &tensor,
+ const TensorType &type);
+
+template
+std::unique_ptr<Tensor>
+TensorMapper::mapToSparse<CompactTensor>(const Tensor &tensor,
+ const TensorType &type);
+
+template
+std::unique_ptr<Tensor>
+TensorMapper::mapToSparse<CompactTensorV2>(const Tensor &tensor,
+ const TensorType &type);
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_mapper.h b/vespalib/src/vespa/vespalib/tensor/tensor_mapper.h
new file mode 100644
index 00000000000..f6eb087bc60
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_mapper.h
@@ -0,0 +1,43 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "tensor_type.h"
+
+namespace vespalib {
+namespace tensor {
+
+class Tensor;
+
+/**
+ * Class to map a tensor to a given tensor type. Dimensions in input
+ * tensor not present in tensor type are ignored. Dimensions in tensor
+ * type not present in input tensor gets default label (undefined
+ * (empty string) for sparse tensors, 0 for dense tensors). Values are
+ * accumulated for identical mapped addresses.
+ *
+ * Dense tensor type has further restrictions: label must contain only
+ * numerical digits (0-9). Empty string equals 0. If the label is
+ * parsed to a value outside the dimension range or the parsing fails,
+ * then the cell ((address, value) pair) is ignored.
+ */
+class TensorMapper
+{
+ TensorType _type;
+public:
+ TensorMapper(const TensorType &type);
+ ~TensorMapper();
+
+ template <typename TensorT>
+ static std::unique_ptr<Tensor>
+ mapToSparse(const Tensor &tensor, const TensorType &type);
+
+ static std::unique_ptr<Tensor>
+ mapToDense(const Tensor &tensor, const TensorType &type);
+
+ std::unique_ptr<Tensor> map(const Tensor &tensor);
+};
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_operation.h b/vespalib/src/vespa/vespalib/tensor/tensor_operation.h
new file mode 100644
index 00000000000..e115ec153b7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_operation.h
@@ -0,0 +1,55 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/tensor/simple/simple_tensor.h>
+#include "direct_tensor_builder.h"
+#include <vespa/vespalib/tensor/simple/direct_simple_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/direct_compact_tensor_builder.h>
+#include <vespa/vespalib/tensor/compact/direct_compact_tensor_v2_builder.h>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Base class for an operation over tensors.
+ */
+template <class TensorT>
+class TensorOperation
+{
+public:
+ using TensorImplType = TensorT;
+ using MyTensorBuilder = DirectTensorBuilder<TensorT>;
+ using Dimensions = typename TensorImplType::Dimensions;
+ using Cells = typename TensorImplType::Cells;
+ using AddressBuilderType = typename MyTensorBuilder::AddressBuilderType;
+ using AddressRefType = typename MyTensorBuilder::AddressRefType;
+ using AddressType = typename MyTensorBuilder::AddressType;
+protected:
+ MyTensorBuilder _builder;
+ Dimensions &_dimensions;
+ Cells &_cells;
+
+public:
+ TensorOperation()
+ : _builder(),
+ _dimensions(_builder.dimensions()),
+ _cells(_builder.cells())
+ {}
+ TensorOperation(const Dimensions &dimensions)
+ : _builder(dimensions),
+ _dimensions(_builder.dimensions()),
+ _cells(_builder.cells())
+ {}
+ TensorOperation(const Dimensions &dimensions, const Cells &cells)
+ : _builder(dimensions, cells),
+ _dimensions(_builder.dimensions()),
+ _cells(_builder.cells())
+ {}
+ Tensor::UP result() {
+ return _builder.build();
+ }
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_type.cpp b/vespalib/src/vespa/vespalib/tensor/tensor_type.cpp
new file mode 100644
index 00000000000..e52f45ab4c4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_type.cpp
@@ -0,0 +1,214 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include "tensor_type.h"
+#include <algorithm>
+#include <ostream>
+#include "tensor_type_spec.h"
+
+using vespalib::eval::ValueType;
+
+namespace vespalib {
+namespace tensor {
+
+namespace {
+
+void sort_dimensions(std::vector<TensorType::Dimension> &dimensions) {
+ std::sort(dimensions.begin(), dimensions.end(),
+ [](const auto &a, const auto &b){ return (a.name < b.name); });
+}
+
+bool has_duplicates(const std::vector<TensorType::Dimension> &dimensions) {
+ for (size_t i = 1; i < dimensions.size(); ++i) {
+ if (dimensions[i - 1].name == dimensions[i].name) {
+ return true;
+ }
+ }
+ return false;
+}
+
+struct DimensionMatcher {
+ bool mismatch;
+ const std::vector<TensorType::Dimension> &dimension_list;
+ explicit DimensionMatcher(const std::vector<TensorType::Dimension> &dimension_list_in)
+ : mismatch(false), dimension_list(dimension_list_in) {}
+ bool find(const TensorType::Dimension &dimension) {
+ for (const auto &d: dimension_list) {
+ if (dimension.name == d.name) {
+ if (dimension.size != d.size) {
+ mismatch = true;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+};
+
+} // namespace vespalib::tensor::<unnamed>
+
+constexpr size_t TensorType::Dimension::npos;
+
+TensorType
+TensorType::remove_dimensions(const std::vector<vespalib::string> &dimensions_in) const
+{
+ if (!is_tensor()) {
+ return invalid();
+ }
+ size_t removed = 0;
+ std::vector<Dimension> result;
+ for (const Dimension &d: _dimensions) {
+ if (std::find(dimensions_in.begin(), dimensions_in.end(), d.name) == dimensions_in.end()) {
+ result.push_back(d);
+ } else {
+ ++removed;
+ }
+ }
+ if (removed != dimensions_in.size()) {
+ return invalid();
+ }
+ return TensorType(_type, std::move(result));
+}
+
+TensorType
+TensorType::add_dimensions_from(const TensorType &rhs) const
+{
+ if (!is_tensor() || (_type != rhs._type)) {
+ return invalid();
+ }
+ std::vector<Dimension> result(_dimensions);
+ DimensionMatcher matcher(result);
+ for (const Dimension &d: rhs._dimensions) {
+ if (!matcher.find(d)) {
+ result.push_back(d);
+ }
+ }
+ if (matcher.mismatch) {
+ return invalid();
+ }
+ sort_dimensions(result);
+ return TensorType(_type, std::move(result));
+}
+
+TensorType
+TensorType::keep_dimensions_in(const TensorType &rhs) const
+{
+ if (!is_tensor() || (_type != rhs._type)) {
+ return invalid();
+ }
+ std::vector<Dimension> result;
+ DimensionMatcher matcher(rhs._dimensions);
+ for (const Dimension &d: _dimensions) {
+ if (matcher.find(d)) {
+ result.push_back(d);
+ }
+ }
+ if (matcher.mismatch) {
+ return invalid();
+ }
+ return TensorType(_type, std::move(result));
+}
+
+ValueType
+TensorType::as_value_type() const
+{
+ if (is_number()) {
+ return ValueType::double_type();
+ }
+ if (is_tensor()) {
+ std::vector<ValueType::Dimension> my_dimensions;
+ for (const auto &dimension: dimensions()) {
+ my_dimensions.emplace_back(dimension.name, dimension.size);
+ }
+ return ValueType::tensor_type(std::move(my_dimensions));
+ }
+ return ValueType::error_type();
+}
+
+TensorType
+TensorType::invalid()
+{
+ return TensorType(Type::INVALID);
+}
+
+TensorType
+TensorType::number()
+{
+ return TensorType(Type::NUMBER);
+}
+
+TensorType
+TensorType::sparse(const std::vector<vespalib::string> &dimensions_in)
+{
+ std::vector<Dimension> dimensions;
+ for (const auto &dimension_name: dimensions_in) {
+ dimensions.emplace_back(dimension_name);
+ }
+ sort_dimensions(dimensions);
+ if (has_duplicates(dimensions)) {
+ return invalid();
+ }
+ return TensorType(Type::SPARSE, std::move(dimensions));
+}
+
+TensorType
+TensorType::dense(std::vector<Dimension> dimensions_in)
+{
+ sort_dimensions(dimensions_in);
+ if (has_duplicates(dimensions_in)) {
+ return invalid();
+ }
+ return TensorType(Type::DENSE, std::move(dimensions_in));
+}
+
+std::ostream &operator<<(std::ostream &os, const TensorType &type) {
+ size_t cnt = 0;
+ switch (type.type()) {
+ case TensorType::Type::INVALID:
+ os << "INVALID";
+ break;
+ case TensorType::Type::NUMBER:
+ os << "NUMBER";
+ break;
+ case TensorType::Type::SPARSE:
+ os << "SPARSE(";
+ for (const auto &d: type.dimensions()) {
+ if (cnt++ > 0) {
+ os << ",";
+ }
+ os << d.name;
+ }
+ os << ")";
+ break;
+ case TensorType::Type::DENSE:
+ os << "DENSE(";
+ for (const auto &d: type.dimensions()) {
+ if (cnt++ > 0) {
+ os << ",";
+ }
+ os << vespalib::make_string("{%s:%zu}", d.name.c_str(), d.size);
+ }
+ os << ")";
+ break;
+ }
+ return os;
+}
+
+
+TensorType
+TensorType::fromSpec(const vespalib::string &str)
+{
+ return tensor_type::fromSpec(str);
+}
+
+
+vespalib::string
+TensorType::toSpec() const
+{
+ return tensor_type::toSpec(*this);
+}
+
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_type.h b/vespalib/src/vespa/vespalib/tensor/tensor_type.h
new file mode 100644
index 00000000000..1ff5fea758b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_type.h
@@ -0,0 +1,87 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/eval/value_type.h>
+#include <vector>
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * The type of 'a single tensor' or 'the result of a tensor
+ * operation'.
+ *
+ * TensorType is a value class containing implementation-independent
+ * type information for a single tensor or the result of a tensor
+ * operation. The type of the result of a tensor operation depends
+ * only on the types of the input values and the type of the operation
+ * itself. Illegal operations will result in the type INVALID. For the
+ * collapsing operation 'sum', the result will be of type NUMBER. Both
+ * SPARSE and DENSE tensor types will contain information about their
+ * dimensions. Dimension 'size' is only relevant for DENSE tensors and
+ * will be set to 'npos' for SPARSE tensors.
+ **/
+class TensorType
+{
+public:
+ enum class Type { INVALID, NUMBER, SPARSE, DENSE };
+ struct Dimension {
+ static constexpr size_t npos = -1;
+ vespalib::string name;
+ size_t size;
+ explicit Dimension(const vespalib::string &name_in)
+ : name(name_in), size(npos) {}
+ Dimension(const vespalib::string &name_in, size_t size_in)
+ : name(name_in), size(size_in) {}
+ bool operator==(const Dimension &rhs) const {
+ return ((name == rhs.name) && (size == rhs.size));
+ }
+ bool operator!=(const Dimension &rhs) const { return !(*this == rhs); }
+ };
+
+private:
+ Type _type;
+ std::vector<Dimension> _dimensions;
+
+ explicit TensorType(Type type_in) // INVALID/NUMBER
+ : _type(type_in), _dimensions() {}
+ TensorType(Type type_in, std::vector<Dimension> &&dimensions_in) // SPARSE/DENSE
+ : _type(type_in), _dimensions(std::move(dimensions_in)) {}
+
+public:
+ Type type() const { return _type; }
+ bool is_valid() const { return (_type != Type::INVALID); }
+ bool is_number() const { return (_type == Type::NUMBER); }
+ bool is_tensor() const {
+ return ((_type == Type::SPARSE) || (_type == Type::DENSE));
+ }
+ const std::vector<Dimension> &dimensions() const { return _dimensions; }
+
+ bool operator==(const TensorType &rhs) const {
+ if ((_type == Type::INVALID) || (rhs._type == Type::INVALID)) {
+ return false;
+ }
+ return ((_type == rhs._type) && (_dimensions == rhs._dimensions));
+ }
+ bool operator!=(const TensorType &rhs) const { return !(*this == rhs); }
+
+ TensorType remove_dimensions(const std::vector<vespalib::string> &dimensions_in) const;
+ TensorType add_dimensions_from(const TensorType &rhs) const;
+ TensorType keep_dimensions_in(const TensorType &rhs) const;
+
+ eval::ValueType as_value_type() const;
+
+ static TensorType invalid();
+ static TensorType number();
+ static TensorType sparse(const std::vector<vespalib::string> &dimensions_in);
+ static TensorType dense(std::vector<Dimension> dimensions_in);
+ static TensorType fromSpec(const vespalib::string &str);
+ vespalib::string toSpec() const;
+};
+
+std::ostream &operator<<(std::ostream &os, const TensorType &type);
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_type_spec.cpp b/vespalib/src/vespa/vespalib/tensor/tensor_type_spec.cpp
new file mode 100644
index 00000000000..cb0acc498b9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_type_spec.cpp
@@ -0,0 +1,223 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "tensor_type.h"
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <algorithm>
+#include "tensor_type_spec.h"
+
+namespace vespalib {
+namespace tensor {
+namespace tensor_type {
+
+namespace {
+
+class Tokenizer {
+ const char *_cur;
+ const char *_end;
+
+ static bool atSpace(char c) { return ((c == ' ') || (c == '\t') ||
+ (c == '\n') || (c == '\r')); }
+ static bool atNumber(char c) { return ((c >= '0') && (c <= '9')); }
+ static bool atNameBreak(char c) {
+ return (atSpace(c) || (c == '[') || (c == ']') || (c == '{') ||
+ (c == '}') || (c == '(') || (c == ')') || (c == ','));
+ }
+public:
+ Tokenizer(const vespalib::string &str)
+ : _cur(str.c_str()),
+ _end(_cur + str.size())
+ {
+ }
+
+ bool atEnd() const { return _cur == _end; }
+ void step() { ++_cur; }
+ void skipSpace() { while (!atEnd() && atSpace(*_cur)) { step(); } }
+ char cur() { skipSpace(); return (atEnd() ? '\0' : *_cur); }
+
+ void dimensionNameScan() {
+ while (!atEnd() && !atNameBreak(*_cur)) {
+ step();
+ }
+ }
+
+ void numberScan() {
+ while (!atEnd() && atNumber(*_cur)) { step(); }
+ }
+
+ stringref getDimensionName() {
+ skipSpace();
+ const char *start = _cur;
+ dimensionNameScan();
+ return stringref(start, _cur - start);
+ }
+
+ stringref getNumber() {
+ skipSpace();
+ const char *start = _cur;
+ numberScan();
+ return stringref(start, _cur - start);
+ }
+};
+
+
+class Parser
+{
+ std::vector<TensorType::Dimension> _dimensions;
+ vespalib::string _dimensionName;
+ vespalib::string _dimensionSizeStr;
+ bool _parseError;
+ bool _denseDim;
+ bool _sparseDim;
+
+ void parseDenseDimension(Tokenizer &tok) {
+ tok.step(); // step over open bracket
+ _dimensionSizeStr = tok.getNumber();
+ if (_dimensionSizeStr.empty() || (tok.cur() != ']')) {
+ _parseError = true; // no close bracket or empty dim size
+ return;
+ }
+ tok.step(); // step over close bracket
+ long dimensionSize = atol(_dimensionSizeStr.c_str());
+ if (dimensionSize <= 0) {
+ _parseError = true; // bad dim size
+ } else {
+ _dimensions.emplace_back(_dimensionName, dimensionSize);
+ _denseDim = true;
+ }
+ }
+
+ void parseSparseDimension(Tokenizer &tok)
+ {
+ tok.step(); // step over open brace
+ if (tok.cur() != '}') {
+ _parseError = true; // no close brace
+ } else {
+ tok.step(); // step over close brace
+ _dimensions.emplace_back(_dimensionName);
+ _sparseDim = true;
+ }
+ }
+
+ void parseDimension(Tokenizer &tok) {
+ _dimensionName = tok.getDimensionName();
+ if (_dimensionName.empty()) {
+ _parseError = true; // no dimension name
+ } else if (tok.cur() == '[') {
+ parseDenseDimension(tok);
+ } else if (tok.cur() == '{') {
+ parseSparseDimension(tok);
+ } else {
+ _parseError = true; // no open brace or bracket
+ }
+ }
+public:
+
+ Parser()
+ : _dimensions(),
+ _dimensionName(),
+ _dimensionSizeStr(),
+ _parseError(false),
+ _denseDim(false),
+ _sparseDim(false)
+ {
+ }
+
+ void parse(Tokenizer &tok) {
+ tok.skipSpace();
+ _dimensionName = tok.getDimensionName();
+ if (_dimensionName != "tensor" || tok.cur() != '(') {
+ _parseError = true; // doesn't start with tensor and left parenthesis
+ } else {
+ tok.step(); // step over left parentesis
+ }
+ while (!_parseError && tok.cur() != ')') {
+ parseDimension(tok);
+ if (tok.cur() == ',') {
+ tok.step();
+ tok.skipSpace();
+ } else if (tok.cur() != ')') {
+ _parseError = true; // no comma between dimensions
+ }
+ }
+ if (_parseError) {
+ } else if (tok.cur() != ')') {
+ _parseError = true; // no right parenthesis at end
+ } else {
+ tok.step(); // step over right parenthesis
+ tok.skipSpace();
+ if (!tok.atEnd()) {
+ _parseError = true; // more unparsed data
+ }
+ }
+ }
+
+ bool invalid() const { return (_parseError || (_denseDim && _sparseDim)); }
+ bool sparse() const { return _sparseDim; }
+ std::vector<TensorType::Dimension> &dimensions() { return _dimensions; }
+};
+
+} // namespace vespalib::tensor::tensor_type::<anonymous>
+
+
+TensorType
+fromSpec(const vespalib::string &str)
+{
+ Tokenizer tok(str);
+ Parser parser;
+ parser.parse(tok);
+ if (parser.invalid()) {
+ return TensorType::invalid();
+ }
+
+ if (parser.sparse()) {
+ std::vector<vespalib::string> dimensions;
+ for (const auto &dim : parser.dimensions()) {
+ dimensions.emplace_back(dim.name);
+ }
+ return TensorType::sparse(dimensions);
+ } else {
+ return TensorType::dense(parser.dimensions());
+ }
+}
+
+
+vespalib::string
+toSpec(const TensorType &type)
+{
+ asciistream os;
+ size_t cnt = 0;
+ switch (type.type()) {
+ case TensorType::Type::INVALID:
+ os << "invalid";
+ break;
+ case TensorType::Type::NUMBER:
+ os << "number";
+ break;
+ case TensorType::Type::SPARSE:
+ os << "tensor(";
+ for (const auto &d: type.dimensions()) {
+ if (cnt++ > 0) {
+ os << ",";
+ }
+ os << d.name << "{}";
+ }
+ os << ")";
+ break;
+ case TensorType::Type::DENSE:
+ os << "tensor(";
+ for (const auto &d: type.dimensions()) {
+ if (cnt++ > 0) {
+ os << ",";
+ }
+ os << d.name << "[" << d.size << "]";
+ }
+ os << ")";
+ break;
+ }
+ return os.str();
+}
+
+} // namespace vespalib::tensor::tensor_type
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_type_spec.h b/vespalib/src/vespa/vespalib/tensor/tensor_type_spec.h
new file mode 100644
index 00000000000..0eb713a8a36
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_type_spec.h
@@ -0,0 +1,16 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "tensor_type.h"
+
+namespace vespalib {
+namespace tensor {
+namespace tensor_type {
+
+TensorType fromSpec(const vespalib::string &str);
+vespalib::string toSpec(const TensorType &type);
+
+} // namespace vespalib::tensor::tensor_type
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/tensor_visitor.h b/vespalib/src/vespa/vespalib/tensor/tensor_visitor.h
new file mode 100644
index 00000000000..11aa8a8dad8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/tensor_visitor.h
@@ -0,0 +1,24 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "tensor_address.h"
+#include <vespa/vespalib/stllike/string.h>
+#include "types.h"
+
+namespace vespalib {
+namespace tensor {
+
+/**
+ * Class for visiting a tensor. First visit must specify dimensions,
+ * remaining visits must specify tensor addresses and values.
+ */
+class TensorVisitor
+{
+public:
+ virtual ~TensorVisitor() {}
+ virtual void visit(const TensorAddress &address, double value) = 0;
+};
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/tensor/types.h b/vespalib/src/vespa/vespalib/tensor/types.h
new file mode 100644
index 00000000000..6dcdfb5f0d8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/tensor/types.h
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <map>
+#include <set>
+#include <vespa/vespalib/stllike/hash_set.h>
+
+namespace vespalib {
+namespace tensor {
+
+using TensorCells = std::map<std::map<vespalib::string, vespalib::string>, double>;
+using TensorDimensions = std::vector<vespalib::string>;
+using TensorDimensionsSet = vespalib::hash_set<vespalib::string>;
+using DenseTensorCells = std::map<std::map<vespalib::string, size_t>, double>;
+
+} // namespace vespalib::tensor
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/test/CMakeLists.txt b/vespalib/src/vespa/vespalib/test/CMakeLists.txt
new file mode 100644
index 00000000000..10f06d8760d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/test/CMakeLists.txt
@@ -0,0 +1,5 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_test INTERFACE
+ SOURCES
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/test/insertion_operators.h b/vespalib/src/vespa/vespalib/test/insertion_operators.h
new file mode 100644
index 00000000000..8ed52062281
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/test/insertion_operators.h
@@ -0,0 +1,45 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <ostream>
+#include <set>
+#include <vector>
+
+namespace std {
+
+template <typename T>
+std::ostream &
+operator<<(std::ostream &os, const std::set<T> &set)
+{
+ os << "{";
+ bool first = true;
+ for (const auto &entry : set) {
+ if (!first) {
+ os << ",";
+ }
+ os << entry;
+ first = false;
+ }
+ os << "}";
+ return os;
+}
+
+template <typename T>
+std::ostream &
+operator<<(std::ostream &os, const std::vector<T> &set)
+{
+ os << "[";
+ bool first = true;
+ for (const auto &entry : set) {
+ if (!first) {
+ os << ",";
+ }
+ os << entry;
+ first = false;
+ }
+ os << "]";
+ return os;
+}
+
+} // namespace std
+
diff --git a/vespalib/src/vespa/vespalib/testkit/.gitignore b/vespalib/src/vespa/vespalib/testkit/.gitignore
new file mode 100644
index 00000000000..bde868e4154
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/.gitignore
@@ -0,0 +1,4 @@
+/*.So
+/.depend
+/Makefile
+/make_fixture_macros
diff --git a/vespalib/src/vespa/vespalib/testkit/CMakeLists.txt b/vespalib/src/vespa/vespalib/testkit/CMakeLists.txt
new file mode 100644
index 00000000000..51a69191619
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_testkit OBJECT
+ SOURCES
+ test_comparators.cpp
+ test_hook.cpp
+ test_master.cpp
+ test_state_guard.cpp
+ testapp.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/testkit/create-test.sh b/vespalib/src/vespa/vespalib/testkit/create-test.sh
new file mode 100755
index 00000000000..5ffc43c7020
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/create-test.sh
@@ -0,0 +1,71 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+gen_ignore_file() {
+ echo "generating '$1' ..."
+ echo ".depend" > $1
+ echo "Makefile" >> $1
+ echo "${test}_test" >> $1
+}
+
+gen_project_file() {
+ echo "generating '$1' ..."
+ echo "APPLICATION ${test}_test" > $1
+ echo "OBJS $test" >> $1
+ echo "LIBS vespalib/vespalib" >> $1
+ echo "EXTERNALLIBS log" >> $1
+ echo "" >> $1
+ echo "CUSTOMMAKE" >> $1
+ echo "test: depend ${test}_test" >> $1
+ echo -e "\t@./${test}_test" >> $1
+}
+
+gen_source() {
+ echo "generating '$1' ..."
+ echo "#include <vespa/log/log.h>" > $1
+ echo "LOG_SETUP(\"${test}_test\");" >> $1
+ echo "#include <vespa/fastos/fastos.h>" >> $1
+ echo "#include <vespa/vespalib/testkit/testapp.h>" >> $1
+ echo "" >> $1
+ echo "TEST_SETUP(Test);" >> $1
+ echo "" >> $1
+ echo "int" >> $1
+ echo "Test::Main()" >> $1
+ echo "{" >> $1
+ echo " TEST_INIT(\"${test}_test\");" >> $1
+ echo " TEST_DONE();" >> $1
+ echo "}" >> $1
+}
+
+gen_desc() {
+ echo "generating '$1' ..."
+ echo "$test test. Take a look at $test.cpp for details." > $1
+}
+
+gen_file_list() {
+ echo "generating '$1' ..."
+ echo "$test.cpp" > $1
+}
+
+if [ $# -ne 1 ]; then
+ echo "usage: $0 <name>"
+ echo " name: name of the test to create"
+ exit 1
+fi
+
+test=$1
+if [ -e $test ]; then
+ echo "$test already present, don't want to mess it up..."
+ exit 1
+fi
+
+echo "creating directory '$test' ..."
+mkdir -p $test || exit 1
+cd $test || exit 1
+test=`basename $test`
+
+gen_ignore_file .cvsignore
+gen_project_file fastos.project
+gen_source $test.cpp
+gen_desc DESC
+gen_file_list FILES
diff --git a/vespalib/src/vespa/vespalib/testkit/generate-test-makefile.sh b/vespalib/src/vespa/vespalib/testkit/generate-test-makefile.sh
new file mode 100755
index 00000000000..5eb7bcf5587
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/generate-test-makefile.sh
@@ -0,0 +1,71 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+dirname=`dirname $0`
+basedir=`readlink -f $dirname`
+progname=`basename $0 .sh`
+if [ $# -lt 3 ]; then
+ echo "usage: $0 <rundir> <testlist> <top>"
+ echo " rundir: where to run and generate output"
+ echo " testlist: file with test names (relative to rundir)"
+ echo " top: path to top (relative to rundir)"
+ exit 1
+fi
+
+rundir=$1
+mkdir -p $1
+cd $1 || exit 1
+testlistfile=$2
+testlist=`cat $2` || exit 1
+top_path=$3
+testmakefile=Makefile
+rm -f $testmakefile
+
+# Generate all target
+echo "all:" >> $testmakefile
+echo -e "\t\$(MAKE) clean" >> $testmakefile
+echo -e "\t\$(MAKE) init" >> $testmakefile
+echo -e "\t\$(MAKE) runtests" >> $testmakefile
+echo -e "\t\$(MAKE) generate-report" >> $testmakefile
+
+# Generate targets for each test
+testnamelist=""
+test_cnt=0
+for test in $testlist; do
+ test_cnt=$(($test_cnt + 1))
+
+ testpath=$test
+ case $test in
+ \!*) testpath=${test#!};;
+ \?*) testpath=${test#?};;
+ esac
+ test_name="test-"`echo $testpath | sed -e "s=^tests/==;s=/=.=g"`
+ testnamelist="$testnamelist $test_name"
+
+ echo "" >> $testmakefile
+ echo "$test_name:" >> $testmakefile
+ echo -e "\t@sh $basedir/run-test.sh . $test $test_cnt $top_path" >> $testmakefile
+done
+
+echo "" >> $testmakefile
+echo "init:" >> $testmakefile
+echo -e "\tdate +%s > tmp.start-time" >> $testmakefile
+echo "" >> $testmakefile
+echo -e "runtests:$testnamelist" >> $testmakefile
+
+# Generate generate report target
+echo "" >> $testmakefile
+echo "generate-report:" >> $testmakefile
+echo -e "\t@sh $basedir/generate-test-report.sh . $testlistfile" >> $testmakefile
+
+# Generate clean target
+echo "" >> $testmakefile
+echo "clean:" >> $testmakefile
+echo -e "\trm -f test-report.html" >> $testmakefile
+echo -e "\trm -f test-report.html.top" >> $testmakefile
+echo -e "\trm -f test-report.html.bottom" >> $testmakefile
+echo -e "\trm -f test-report.html.entry" >> $testmakefile
+echo -e "\trm -f test-report.html.summary" >> $testmakefile
+echo -e "\trm -f test.*.*.files.html" >> $testmakefile
+echo -e "\trm -f test.*.*.file.*" >> $testmakefile
+echo -e "\trm -f test-report.json" >> $testmakefile
+echo -e "\trm -f tmp.*" >> $testmakefile
diff --git a/vespalib/src/vespa/vespalib/testkit/generate-test-report.sh b/vespalib/src/vespa/vespalib/testkit/generate-test-report.sh
new file mode 100755
index 00000000000..1fae95071d5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/generate-test-report.sh
@@ -0,0 +1,210 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+top_color="bgcolor=\"#ccccff\""
+row_color="bgcolor=\"#eeeeff\""
+pass_color="bgcolor=\"#ccffcc\""
+fail_color="bgcolor=\"#ffcccc\""
+ignore_color="bgcolor=\"#ffffcc\""
+
+#
+# Generate top of HTML report
+# $1 - output file
+#
+gen_report_top() {
+ dst=$1
+ date=`date "+%Y-%m-%d %H:%M:%S"`
+ echo "<html>" > $dst
+ echo "<title>Test Report ($date)</title>" >> $dst
+ echo "<body bgcolor=\"#ffffff\">" >> $dst
+ echo "<h1>Test Report ($date)</h1>" >> $dst
+}
+
+#
+# Generate top of JSON report
+# $1 - output file
+#
+gen_report_top_json() {
+ dst=$1
+ echo "{" >> $dst
+}
+
+#
+# Generate bottom of HTML report
+# $1 - output file
+#
+gen_report_bottom() {
+ dst=$1
+ echo "</body>" > $dst
+ echo "</html>" >> $dst
+}
+
+#
+# Generate bottom of JSON report
+# $1 - output file
+#
+gen_report_bottom_json() {
+ dst=$1
+ echo "}" >> $dst
+}
+
+#
+# Generate top of test table
+# $1 - output file
+#
+gen_report_entry_init() {
+ dst=$1
+ echo "<h2>Details</h2>" > $dst
+ echo "<table cellspacing=\"2\" cellpadding=\"5\" border=\"0\">" >> $dst
+ echo "<tr>" >> $dst
+ echo "<th align=\"left\" $top_color>Test</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Result</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Time (s)</th>" >> $dst
+ echo "</tr>" >> $dst
+}
+
+#
+# Generate top of tests entry
+# $1 - output file
+#
+gen_report_entry_init_json() {
+ dst=$1
+ echo "\"test_suites\": [" >> $dst
+}
+
+#
+# Generate bottom of test table
+# $1 - output file
+#
+gen_report_entry_fini() {
+ dst=$1
+ echo "</table>" >> $dst
+}
+
+#
+# Generate end of tests entry
+# $1 - output file
+#
+gen_report_entry_fini_json() {
+ dst=$1
+ echo "]," >> $dst
+}
+
+#
+# Generate test report summary
+# $1 - output file
+# $test_cnt - total number of tests
+# $pass_cnt - number of tests passed
+# $fail_cnt - number of tests failed
+# $ignore_cnt - number of tests ignored
+# $elapsed - total time spent tesing
+#
+gen_report_summary() {
+ dst=$1
+ echo "<h2>Summary</h2>" > $dst
+ echo "<table cellspacing=\"2\" cellpadding=\"5\" border=\"0\">" >> $dst
+ echo "<tr>" >> $dst
+ echo "<th align=\"left\" $top_color>Tests</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Pass</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Fail</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Ignore</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Time (s)</th>" >> $dst
+ echo "</tr>" >> $dst
+ echo "<tr>" >> $dst
+ echo "<td align=\"right\" $row_color>$test_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$pass_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$fail_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$ignore_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$elapsed</td>" >> $dst
+ echo "</tr>" >> $dst
+ echo "</table>" >> $dst
+}
+
+gen_report_summary_json() {
+ dst=$1
+ echo "\"summary\": {" >> $dst
+ echo "\"total\": $test_cnt," >> $dst
+ echo "\"pass\": $pass_cnt," >> $dst
+ echo "\"fail\": $fail_cnt," >> $dst
+ echo "\"ignore\": $ignore_cnt," >> $dst
+ echo "\"time\": $elapsed" >> $dst
+ echo "}" >> $dst
+}
+
+progname=`basename $0 .sh`
+if [ $# -lt 2 ]; then
+ echo "usage: $0 <rundir> <testlist>"
+ echo " rundir: where to run and generate output"
+ echo " testlist: file with test names (relative to rundir)"
+ exit 1
+fi
+
+rundir=$1
+testlist=`cat $2` || exit 1
+
+report=test-report.html
+jsonreport=test-report.json
+gen_report_top $report.top
+gen_report_top_json $jsonreport
+gen_report_entry_init $report.entry
+gen_report_entry_init_json $jsonreport
+
+test_cnt=0
+fail_cnt=0
+pass_cnt=0
+ignore_cnt=0
+for test in $testlist; do
+ test_cnt=$(($test_cnt + 1))
+ negate=false
+ ignore=false
+ case $test in
+ \!*) negate=true; prefix="[!]"; test=${test#!};;
+ \?*) ignore=true; prefix="[?]"; test=${test#?};;
+ esac
+ prefix=""
+ test_name="${prefix}"`echo $test | sed -e "s=^tests/==;s=/=.=g"`
+ test=`basename $test`
+ test_result=test.$test_cnt.$test_name.result
+ read result < $test_result
+ if [ $result -eq 0 ]; then
+ if $ignore; then
+ ignore_cnt=$(($ignore_cnt + 1))
+ else
+ pass_cnt=$(($pass_cnt + 1))
+ fi
+ else
+ if $ignore; then
+ ignore_cnt=$(($ignore_cnt + 1))
+ else
+ fail_cnt=$(($fail_cnt + 1))
+ cat test.$test_cnt.$test_name.log.file.txt
+ fi
+ fi
+ # Unfortunately, the JSON format is a bit context sensitive, so we need to do the old comma-before-entry-except-first logic
+ if [ $test_cnt -gt 1 ]; then
+ echo "," >> $jsonreport
+ fi
+ test_report=tmp.report.$test_name.json
+ cat $test_report >> $jsonreport
+ rm -f $test_report
+ rm -f $test_result
+done
+
+date +%s > tmp.end-time
+elapsed=$((`cat tmp.end-time` - `cat tmp.start-time`))
+gen_report_entry_fini $report.entry
+gen_report_entry_fini_json $jsonreport
+gen_report_summary $report.summary
+gen_report_summary_json $jsonreport
+gen_report_bottom $report.bottom
+gen_report_bottom_json $jsonreport
+cat $report.top $report.summary $report.entry $report.bottom > $report
+
+echo "summary: test/pass/fail/ignore: $test_cnt/$pass_cnt/$fail_cnt/$ignore_cnt"
+if [ $fail_cnt -eq 0 ]; then
+ echo "SUCCESS"
+ exit 0
+else
+ echo "FAILURE"
+ exit 1
+fi
diff --git a/vespalib/src/vespa/vespalib/testkit/generated_fixture_macros.h b/vespalib/src/vespa/vespalib/testkit/generated_fixture_macros.h
new file mode 100644
index 00000000000..438b8bbcdf0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/generated_fixture_macros.h
@@ -0,0 +1,691 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// macros for up to 9 test fixtures, generated by vespalib/testkit/make_fixture_macros
+
+// common test macro implementation for 0 test fixtures BEGIN
+
+#define TEST_IMPL(name, ignore, threads) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ struct Test : vespalib::TestFixtureWrapper { \
+ virtual void test_entry_point(); \
+ }; \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ Test test; \
+ return runTest(test, threads); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+void TEST_CAT(TestKitHook, __LINE__)::Test::test_entry_point()
+
+// common test macro implementation for 0 test fixtures END
+
+// test macro variants for 0 test fixtures BEGIN
+
+#define TEST(name) TEST_IMPL(name, false, 1)
+#define TEST_MT(name, threads) TEST_IMPL(name, false, threads)
+#define IGNORE_TEST(name) TEST_IMPL(name, true, 1)
+#define IGNORE_TEST_MT(name, threads) TEST_IMPL(name, true, threads)
+
+// test macro variants for 0 test fixtures END
+
+// common test macro implementation for 1 test fixtures BEGIN
+
+#define TEST_F_IMPL(name, ignore, threads, fixture1) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f; \
+ F1 &f1; \
+ Test(F1 &f1_in) : f(f1_in), f1(f1_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ Test<F1> test(f1); \
+ return runTest(test, threads); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1>::test_entry_point()
+
+// common test macro implementation for 1 test fixtures END
+
+// test macro variants for 1 test fixtures BEGIN
+
+#define TEST_F(name, fixture1) TEST_F_IMPL(name, false, 1, fixture1)
+#define TEST_MT_F(name, threads, fixture1) TEST_F_IMPL(name, false, threads, fixture1)
+#define IGNORE_TEST_F(name, fixture1) TEST_F_IMPL(name, true, 1, fixture1)
+#define IGNORE_TEST_MT_F(name, threads, fixture1) TEST_F_IMPL(name, true, threads, fixture1)
+
+// test macro variants for 1 test fixtures END
+
+// common test macro implementation for 2 test fixtures BEGIN
+
+#define TEST_FF_IMPL(name, ignore, threads, fixture1, fixture2) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ Test(F1 &f1_in, F2 &f2_in) : f1(f1_in), f2(f2_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ Test<F1, F2> test(f1, f2); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2>::test_entry_point()
+
+// common test macro implementation for 2 test fixtures END
+
+// test macro variants for 2 test fixtures BEGIN
+
+#define TEST_FF(name, fixture1, fixture2) TEST_FF_IMPL(name, false, 1, fixture1, fixture2)
+#define TEST_MT_FF(name, threads, fixture1, fixture2) TEST_FF_IMPL(name, false, threads, fixture1, fixture2)
+#define IGNORE_TEST_FF(name, fixture1, fixture2) TEST_FF_IMPL(name, true, 1, fixture1, fixture2)
+#define IGNORE_TEST_MT_FF(name, threads, fixture1, fixture2) TEST_FF_IMPL(name, true, threads, fixture1, fixture2)
+
+// test macro variants for 2 test fixtures END
+
+// common test macro implementation for 3 test fixtures BEGIN
+
+#define TEST_FFF_IMPL(name, ignore, threads, fixture1, fixture2, fixture3) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2, typename F3> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ F3 &f3; \
+ Test(F1 &f1_in, F2 &f2_in, F3 &f3_in) : f1(f1_in), f2(f2_in), f3(f3_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2, typename F3> \
+ bool dispatch3(F1 &f1, F2 &f2, F3 *_f3_ptr_) { \
+ std::unique_ptr<F3> _f3_ap_(_f3_ptr_); \
+ F3 &f3 = *_f3_ap_; \
+ Test<F1, F2, F3> test(f1, f2, f3); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch3(f1, f2, new fixture3); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2, typename F3> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2, F3>::test_entry_point()
+
+// common test macro implementation for 3 test fixtures END
+
+// test macro variants for 3 test fixtures BEGIN
+
+#define TEST_FFF(name, fixture1, fixture2, fixture3) TEST_FFF_IMPL(name, false, 1, fixture1, fixture2, fixture3)
+#define TEST_MT_FFF(name, threads, fixture1, fixture2, fixture3) TEST_FFF_IMPL(name, false, threads, fixture1, fixture2, fixture3)
+#define IGNORE_TEST_FFF(name, fixture1, fixture2, fixture3) TEST_FFF_IMPL(name, true, 1, fixture1, fixture2, fixture3)
+#define IGNORE_TEST_MT_FFF(name, threads, fixture1, fixture2, fixture3) TEST_FFF_IMPL(name, true, threads, fixture1, fixture2, fixture3)
+
+// test macro variants for 3 test fixtures END
+
+// common test macro implementation for 4 test fixtures BEGIN
+
+#define TEST_FFFF_IMPL(name, ignore, threads, fixture1, fixture2, fixture3, fixture4) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2, typename F3, typename F4> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ F3 &f3; \
+ F4 &f4; \
+ Test(F1 &f1_in, F2 &f2_in, F3 &f3_in, F4 &f4_in) : f1(f1_in), f2(f2_in), f3(f3_in), f4(f4_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2, typename F3, typename F4> \
+ bool dispatch4(F1 &f1, F2 &f2, F3 &f3, F4 *_f4_ptr_) { \
+ std::unique_ptr<F4> _f4_ap_(_f4_ptr_); \
+ F4 &f4 = *_f4_ap_; \
+ Test<F1, F2, F3, F4> test(f1, f2, f3, f4); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1, typename F2, typename F3> \
+ bool dispatch3(F1 &f1, F2 &f2, F3 *_f3_ptr_) { \
+ std::unique_ptr<F3> _f3_ap_(_f3_ptr_); \
+ F3 &f3 = *_f3_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch4(f1, f2, f3, new fixture4); \
+ } \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch3(f1, f2, new fixture3); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2, typename F3, typename F4> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2, F3, F4>::test_entry_point()
+
+// common test macro implementation for 4 test fixtures END
+
+// test macro variants for 4 test fixtures BEGIN
+
+#define TEST_FFFF(name, fixture1, fixture2, fixture3, fixture4) TEST_FFFF_IMPL(name, false, 1, fixture1, fixture2, fixture3, fixture4)
+#define TEST_MT_FFFF(name, threads, fixture1, fixture2, fixture3, fixture4) TEST_FFFF_IMPL(name, false, threads, fixture1, fixture2, fixture3, fixture4)
+#define IGNORE_TEST_FFFF(name, fixture1, fixture2, fixture3, fixture4) TEST_FFFF_IMPL(name, true, 1, fixture1, fixture2, fixture3, fixture4)
+#define IGNORE_TEST_MT_FFFF(name, threads, fixture1, fixture2, fixture3, fixture4) TEST_FFFF_IMPL(name, true, threads, fixture1, fixture2, fixture3, fixture4)
+
+// test macro variants for 4 test fixtures END
+
+// common test macro implementation for 5 test fixtures BEGIN
+
+#define TEST_FFFFF_IMPL(name, ignore, threads, fixture1, fixture2, fixture3, fixture4, fixture5) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ F3 &f3; \
+ F4 &f4; \
+ F5 &f5; \
+ Test(F1 &f1_in, F2 &f2_in, F3 &f3_in, F4 &f4_in, F5 &f5_in) : f1(f1_in), f2(f2_in), f3(f3_in), f4(f4_in), f5(f5_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5> \
+ bool dispatch5(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 *_f5_ptr_) { \
+ std::unique_ptr<F5> _f5_ap_(_f5_ptr_); \
+ F5 &f5 = *_f5_ap_; \
+ Test<F1, F2, F3, F4, F5> test(f1, f2, f3, f4, f5); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4> \
+ bool dispatch4(F1 &f1, F2 &f2, F3 &f3, F4 *_f4_ptr_) { \
+ std::unique_ptr<F4> _f4_ap_(_f4_ptr_); \
+ F4 &f4 = *_f4_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch5(f1, f2, f3, f4, new fixture5); \
+ } \
+ template <typename F1, typename F2, typename F3> \
+ bool dispatch3(F1 &f1, F2 &f2, F3 *_f3_ptr_) { \
+ std::unique_ptr<F3> _f3_ap_(_f3_ptr_); \
+ F3 &f3 = *_f3_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch4(f1, f2, f3, new fixture4); \
+ } \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch3(f1, f2, new fixture3); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2, typename F3, typename F4, typename F5> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2, F3, F4, F5>::test_entry_point()
+
+// common test macro implementation for 5 test fixtures END
+
+// test macro variants for 5 test fixtures BEGIN
+
+#define TEST_FFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5) TEST_FFFFF_IMPL(name, false, 1, fixture1, fixture2, fixture3, fixture4, fixture5)
+#define TEST_MT_FFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5) TEST_FFFFF_IMPL(name, false, threads, fixture1, fixture2, fixture3, fixture4, fixture5)
+#define IGNORE_TEST_FFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5) TEST_FFFFF_IMPL(name, true, 1, fixture1, fixture2, fixture3, fixture4, fixture5)
+#define IGNORE_TEST_MT_FFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5) TEST_FFFFF_IMPL(name, true, threads, fixture1, fixture2, fixture3, fixture4, fixture5)
+
+// test macro variants for 5 test fixtures END
+
+// common test macro implementation for 6 test fixtures BEGIN
+
+#define TEST_FFFFFF_IMPL(name, ignore, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ F3 &f3; \
+ F4 &f4; \
+ F5 &f5; \
+ F6 &f6; \
+ Test(F1 &f1_in, F2 &f2_in, F3 &f3_in, F4 &f4_in, F5 &f5_in, F6 &f6_in) : f1(f1_in), f2(f2_in), f3(f3_in), f4(f4_in), f5(f5_in), f6(f6_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> \
+ bool dispatch6(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 *_f6_ptr_) { \
+ std::unique_ptr<F6> _f6_ap_(_f6_ptr_); \
+ F6 &f6 = *_f6_ap_; \
+ Test<F1, F2, F3, F4, F5, F6> test(f1, f2, f3, f4, f5, f6); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5> \
+ bool dispatch5(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 *_f5_ptr_) { \
+ std::unique_ptr<F5> _f5_ap_(_f5_ptr_); \
+ F5 &f5 = *_f5_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch6(f1, f2, f3, f4, f5, new fixture6); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4> \
+ bool dispatch4(F1 &f1, F2 &f2, F3 &f3, F4 *_f4_ptr_) { \
+ std::unique_ptr<F4> _f4_ap_(_f4_ptr_); \
+ F4 &f4 = *_f4_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch5(f1, f2, f3, f4, new fixture5); \
+ } \
+ template <typename F1, typename F2, typename F3> \
+ bool dispatch3(F1 &f1, F2 &f2, F3 *_f3_ptr_) { \
+ std::unique_ptr<F3> _f3_ap_(_f3_ptr_); \
+ F3 &f3 = *_f3_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch4(f1, f2, f3, new fixture4); \
+ } \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch3(f1, f2, new fixture3); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2, F3, F4, F5, F6>::test_entry_point()
+
+// common test macro implementation for 6 test fixtures END
+
+// test macro variants for 6 test fixtures BEGIN
+
+#define TEST_FFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6) TEST_FFFFFF_IMPL(name, false, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6)
+#define TEST_MT_FFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6) TEST_FFFFFF_IMPL(name, false, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6)
+#define IGNORE_TEST_FFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6) TEST_FFFFFF_IMPL(name, true, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6)
+#define IGNORE_TEST_MT_FFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6) TEST_FFFFFF_IMPL(name, true, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6)
+
+// test macro variants for 6 test fixtures END
+
+// common test macro implementation for 7 test fixtures BEGIN
+
+#define TEST_FFFFFFF_IMPL(name, ignore, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ F3 &f3; \
+ F4 &f4; \
+ F5 &f5; \
+ F6 &f6; \
+ F7 &f7; \
+ Test(F1 &f1_in, F2 &f2_in, F3 &f3_in, F4 &f4_in, F5 &f5_in, F6 &f6_in, F7 &f7_in) : f1(f1_in), f2(f2_in), f3(f3_in), f4(f4_in), f5(f5_in), f6(f6_in), f7(f7_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> \
+ bool dispatch7(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 *_f7_ptr_) { \
+ std::unique_ptr<F7> _f7_ap_(_f7_ptr_); \
+ F7 &f7 = *_f7_ap_; \
+ Test<F1, F2, F3, F4, F5, F6, F7> test(f1, f2, f3, f4, f5, f6, f7); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> \
+ bool dispatch6(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 *_f6_ptr_) { \
+ std::unique_ptr<F6> _f6_ap_(_f6_ptr_); \
+ F6 &f6 = *_f6_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch7(f1, f2, f3, f4, f5, f6, new fixture7); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5> \
+ bool dispatch5(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 *_f5_ptr_) { \
+ std::unique_ptr<F5> _f5_ap_(_f5_ptr_); \
+ F5 &f5 = *_f5_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch6(f1, f2, f3, f4, f5, new fixture6); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4> \
+ bool dispatch4(F1 &f1, F2 &f2, F3 &f3, F4 *_f4_ptr_) { \
+ std::unique_ptr<F4> _f4_ap_(_f4_ptr_); \
+ F4 &f4 = *_f4_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch5(f1, f2, f3, f4, new fixture5); \
+ } \
+ template <typename F1, typename F2, typename F3> \
+ bool dispatch3(F1 &f1, F2 &f2, F3 *_f3_ptr_) { \
+ std::unique_ptr<F3> _f3_ap_(_f3_ptr_); \
+ F3 &f3 = *_f3_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch4(f1, f2, f3, new fixture4); \
+ } \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch3(f1, f2, new fixture3); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2, F3, F4, F5, F6, F7>::test_entry_point()
+
+// common test macro implementation for 7 test fixtures END
+
+// test macro variants for 7 test fixtures BEGIN
+
+#define TEST_FFFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7) TEST_FFFFFFF_IMPL(name, false, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7)
+#define TEST_MT_FFFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7) TEST_FFFFFFF_IMPL(name, false, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7)
+#define IGNORE_TEST_FFFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7) TEST_FFFFFFF_IMPL(name, true, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7)
+#define IGNORE_TEST_MT_FFFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7) TEST_FFFFFFF_IMPL(name, true, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7)
+
+// test macro variants for 7 test fixtures END
+
+// common test macro implementation for 8 test fixtures BEGIN
+
+#define TEST_FFFFFFFF_IMPL(name, ignore, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ F3 &f3; \
+ F4 &f4; \
+ F5 &f5; \
+ F6 &f6; \
+ F7 &f7; \
+ F8 &f8; \
+ Test(F1 &f1_in, F2 &f2_in, F3 &f3_in, F4 &f4_in, F5 &f5_in, F6 &f6_in, F7 &f7_in, F8 &f8_in) : f1(f1_in), f2(f2_in), f3(f3_in), f4(f4_in), f5(f5_in), f6(f6_in), f7(f7_in), f8(f8_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> \
+ bool dispatch8(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7, F8 *_f8_ptr_) { \
+ std::unique_ptr<F8> _f8_ap_(_f8_ptr_); \
+ F8 &f8 = *_f8_ap_; \
+ Test<F1, F2, F3, F4, F5, F6, F7, F8> test(f1, f2, f3, f4, f5, f6, f7, f8); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> \
+ bool dispatch7(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 *_f7_ptr_) { \
+ std::unique_ptr<F7> _f7_ap_(_f7_ptr_); \
+ F7 &f7 = *_f7_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch8(f1, f2, f3, f4, f5, f6, f7, new fixture8); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> \
+ bool dispatch6(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 *_f6_ptr_) { \
+ std::unique_ptr<F6> _f6_ap_(_f6_ptr_); \
+ F6 &f6 = *_f6_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch7(f1, f2, f3, f4, f5, f6, new fixture7); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5> \
+ bool dispatch5(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 *_f5_ptr_) { \
+ std::unique_ptr<F5> _f5_ap_(_f5_ptr_); \
+ F5 &f5 = *_f5_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch6(f1, f2, f3, f4, f5, new fixture6); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4> \
+ bool dispatch4(F1 &f1, F2 &f2, F3 &f3, F4 *_f4_ptr_) { \
+ std::unique_ptr<F4> _f4_ap_(_f4_ptr_); \
+ F4 &f4 = *_f4_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch5(f1, f2, f3, f4, new fixture5); \
+ } \
+ template <typename F1, typename F2, typename F3> \
+ bool dispatch3(F1 &f1, F2 &f2, F3 *_f3_ptr_) { \
+ std::unique_ptr<F3> _f3_ap_(_f3_ptr_); \
+ F3 &f3 = *_f3_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch4(f1, f2, f3, new fixture4); \
+ } \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch3(f1, f2, new fixture3); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2, F3, F4, F5, F6, F7, F8>::test_entry_point()
+
+// common test macro implementation for 8 test fixtures END
+
+// test macro variants for 8 test fixtures BEGIN
+
+#define TEST_FFFFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8) TEST_FFFFFFFF_IMPL(name, false, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8)
+#define TEST_MT_FFFFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8) TEST_FFFFFFFF_IMPL(name, false, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8)
+#define IGNORE_TEST_FFFFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8) TEST_FFFFFFFF_IMPL(name, true, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8)
+#define IGNORE_TEST_MT_FFFFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8) TEST_FFFFFFFF_IMPL(name, true, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8)
+
+// test macro variants for 8 test fixtures END
+
+// common test macro implementation for 9 test fixtures BEGIN
+
+#define TEST_FFFFFFFFF_IMPL(name, ignore, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9) \
+namespace { \
+struct TEST_CAT(TestKitHook, __LINE__) : vespalib::TestHook { \
+ TEST_CAT(TestKitHook, __LINE__)() : vespalib::TestHook(__FILE__, name, ignore) {} \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> \
+ struct Test : vespalib::TestFixtureWrapper { \
+ F1 &f1; \
+ F2 &f2; \
+ F3 &f3; \
+ F4 &f4; \
+ F5 &f5; \
+ F6 &f6; \
+ F7 &f7; \
+ F8 &f8; \
+ F9 &f9; \
+ Test(F1 &f1_in, F2 &f2_in, F3 &f3_in, F4 &f4_in, F5 &f5_in, F6 &f6_in, F7 &f7_in, F8 &f8_in, F9 &f9_in) : f1(f1_in), f2(f2_in), f3(f3_in), f4(f4_in), f5(f5_in), f6(f6_in), f7(f7_in), f8(f8_in), f9(f9_in) {} \
+ virtual void test_entry_point(); \
+ }; \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> \
+ bool dispatch9(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7, F8 &f8, F9 *_f9_ptr_) { \
+ std::unique_ptr<F9> _f9_ap_(_f9_ptr_); \
+ F9 &f9 = *_f9_ap_; \
+ Test<F1, F2, F3, F4, F5, F6, F7, F8, F9> test(f1, f2, f3, f4, f5, f6, f7, f8, f9); \
+ return runTest(test, threads); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> \
+ bool dispatch8(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7, F8 *_f8_ptr_) { \
+ std::unique_ptr<F8> _f8_ap_(_f8_ptr_); \
+ F8 &f8 = *_f8_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch9(f1, f2, f3, f4, f5, f6, f7, f8, new fixture9); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> \
+ bool dispatch7(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 *_f7_ptr_) { \
+ std::unique_ptr<F7> _f7_ap_(_f7_ptr_); \
+ F7 &f7 = *_f7_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch8(f1, f2, f3, f4, f5, f6, f7, new fixture8); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> \
+ bool dispatch6(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 *_f6_ptr_) { \
+ std::unique_ptr<F6> _f6_ap_(_f6_ptr_); \
+ F6 &f6 = *_f6_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch7(f1, f2, f3, f4, f5, f6, new fixture7); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4, typename F5> \
+ bool dispatch5(F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 *_f5_ptr_) { \
+ std::unique_ptr<F5> _f5_ap_(_f5_ptr_); \
+ F5 &f5 = *_f5_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch6(f1, f2, f3, f4, f5, new fixture6); \
+ } \
+ template <typename F1, typename F2, typename F3, typename F4> \
+ bool dispatch4(F1 &f1, F2 &f2, F3 &f3, F4 *_f4_ptr_) { \
+ std::unique_ptr<F4> _f4_ap_(_f4_ptr_); \
+ F4 &f4 = *_f4_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch5(f1, f2, f3, f4, new fixture5); \
+ } \
+ template <typename F1, typename F2, typename F3> \
+ bool dispatch3(F1 &f1, F2 &f2, F3 *_f3_ptr_) { \
+ std::unique_ptr<F3> _f3_ap_(_f3_ptr_); \
+ F3 &f3 = *_f3_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch4(f1, f2, f3, new fixture4); \
+ } \
+ template <typename F1, typename F2> \
+ bool dispatch2(F1 &f1, F2 *_f2_ptr_) { \
+ std::unique_ptr<F2> _f2_ap_(_f2_ptr_); \
+ F2 &f2 = *_f2_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch3(f1, f2, new fixture3); \
+ } \
+ template <typename F1> \
+ bool dispatch1(F1 *_f1_ptr_) { \
+ std::unique_ptr<F1> _f1_ap_(_f1_ptr_); \
+ F1 &f1 = *_f1_ap_; \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch2(f1, new fixture2); \
+ } \
+ virtual bool run() { \
+ TEST_STATE(name); \
+ size_t num_threads(threads); (void) num_threads; \
+ return dispatch1(new fixture1); \
+ } \
+}; \
+TEST_CAT(TestKitHook, __LINE__) TEST_CAT(testKitHook, __LINE__); \
+} /* end of unnamed namespace */ \
+template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> \
+void TEST_CAT(TestKitHook, __LINE__)::Test<F1, F2, F3, F4, F5, F6, F7, F8, F9>::test_entry_point()
+
+// common test macro implementation for 9 test fixtures END
+
+// test macro variants for 9 test fixtures BEGIN
+
+#define TEST_FFFFFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9) TEST_FFFFFFFFF_IMPL(name, false, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9)
+#define TEST_MT_FFFFFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9) TEST_FFFFFFFFF_IMPL(name, false, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9)
+#define IGNORE_TEST_FFFFFFFFF(name, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9) TEST_FFFFFFFFF_IMPL(name, true, 1, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9)
+#define IGNORE_TEST_MT_FFFFFFFFF(name, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9) TEST_FFFFFFFFF_IMPL(name, true, threads, fixture1, fixture2, fixture3, fixture4, fixture5, fixture6, fixture7, fixture8, fixture9)
+
+// test macro variants for 9 test fixtures END
+
diff --git a/vespalib/src/vespa/vespalib/testkit/progctl.sh b/vespalib/src/vespa/vespalib/testkit/progctl.sh
new file mode 100755
index 00000000000..27f2a176adb
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/progctl.sh
@@ -0,0 +1,180 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+# define prog entry (called from progdefs file)
+# $1 - program name
+# $2 - instance name
+# $3 - usage string
+# $4 - full program name (if not set, $BINREF/$1 will be used)
+prog() {
+ idx=$entry_cnt
+ eval "prog_$idx=\"$1\""
+ eval "instance_$idx=\"$2\""
+ eval "usage_$idx=\"$3\""
+ eval "name_$idx=\"$4\""
+ entry_cnt=$(($entry_cnt + 1))
+}
+
+# initial usage check, then load progdefs
+if [ "$#" -lt 1 ]; then
+ echo "usage: $0 <progdefs> ..."
+ exit 1
+fi
+progdefs=$1
+shift
+usage=""
+name=""
+entry_cnt=0
+
+case $progdefs in */*) ;; *) progdefs="./$progdefs" ;; esac
+
+. $progdefs # read progdefs file
+
+# print dynamic usage based on progdefs
+print_usage() {
+ idx=0
+ while [ $idx -lt $entry_cnt ]; do
+ eval "p=\"\$prog_$idx\""
+ eval "i=\"\$instance_$idx\""
+ echo "usage: ... (start|stop|check) $p $i"
+ idx=$(($idx + 1))
+ done
+ echo "usage: ... (start|stop|check) all"
+ echo "start/stop/check programs."
+ exit 1
+}
+
+# check if given prog/instance pair is available
+# $1 - prog
+# $2 - instance
+check_entry() {
+ idx=0
+ while [ $idx -lt $entry_cnt ]; do
+ eval "p=\"\$prog_$idx\""
+ eval "i=\"\$instance_$idx\""
+ if [ "$p" = "$1" ] && [ "$i" = "$2" ]; then
+ eval "usage=\"\$usage_$idx\""
+ eval "name=\"\$name_$idx\""
+ return 0
+ fi
+ idx=$(($idx + 1))
+ done
+ return 1
+}
+
+# check for correct usage based on progdefs
+check_usage() {
+ if [ "$1" != "start" ] && [ "$1" != "stop" ] && [ "$1" != "check" ]; then
+ print_usage
+ fi
+ if [ "$#" -eq 2 ] && [ "$2" = "all" ]; then
+ return 0
+ fi
+ if [ "$#" -eq 3 ] && check_entry "$2" "$3"; then
+ return 0
+ fi
+ print_usage
+}
+
+# start a single program
+# $1 - program name
+# $2 - instance name
+# $3 - usage string
+# $4 - full program name (if not set, $BINREF/$1 will be used)
+start() {
+ pid=`cat pid."$1"."$2" 2>/dev/null`
+ if [ "X$pid" != "X" ] && kill -0 $pid 2> /dev/null; then
+ return 0
+ fi
+ if [ "X$4" != "X" ]; then
+ $4 $3 > out."$1"."$2" 2>&1 &
+ else
+ $BINREF/$1 $3 > out."$1"."$2" 2>&1 &
+ fi
+ echo "$!" > pid."$1"."$2"
+}
+
+# stop a single program
+# $1 - program name
+# $2 - instance name
+stop() {
+ pid=`cat pid."$1"."$2" 2>/dev/null`
+ if [ "X$pid" = "X" ]; then
+ return 0
+ fi
+ kill $pid > /dev/null 2>&1
+ rm -f pid."$1"."$2"
+}
+
+# check a single program
+# $1 - program name
+# $2 - instance name
+check() {
+ pid=`cat pid."$1"."$2" 2>/dev/null`
+ if [ "X$pid" != "X" ] && kill -0 $pid 2> /dev/null; then
+ echo "$1/$2 is running"
+ else
+ echo "$1/$2 is not running"
+ fi
+}
+
+# start all known programs
+start_all() {
+ idx=0
+ while [ $idx -lt $entry_cnt ]; do
+ eval "p=\$prog_$idx"
+ eval "i=\$instance_$idx"
+ eval "u=\$usage_$idx"
+ eval "n=\$name_$idx"
+ start "$p" "$i" "$u" "$n"
+ idx=$(($idx + 1))
+ done
+}
+
+# stop all known programs
+stop_all() {
+ idx=0
+ while [ $idx -lt $entry_cnt ]; do
+ eval "p=\$prog_$idx"
+ eval "i=\$instance_$idx"
+ stop "$p" "$i"
+ idx=$(($idx + 1))
+ done
+}
+
+# check all known programs
+check_all() {
+ idx=0
+ while [ $idx -lt $entry_cnt ]; do
+ eval "p=\$prog_$idx"
+ eval "i=\$instance_$idx"
+ check "$p" "$i"
+ idx=$(($idx + 1))
+ done
+}
+
+############################
+############################
+
+check_usage "$@"
+
+# handle start/stop/check all
+if [ "$2" = "all" ]; then
+ if [ "$1" = "start" ]; then
+ start_all
+ elif [ "$1" = "stop" ]; then
+ stop_all
+ else
+ check_all
+ fi
+ exit 0
+fi
+
+# handle start/stop/check of single program
+if [ "$1" = "start" ]; then
+ start "$2" "$3" "$usage" "$name"
+elif [ "$1" = "stop" ]; then
+ stop "$2" "$3"
+else
+ check "$2" "$3"
+fi
diff --git a/vespalib/src/vespa/vespalib/testkit/run-test.sh b/vespalib/src/vespa/vespalib/testkit/run-test.sh
new file mode 100755
index 00000000000..3380d9c0277
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/run-test.sh
@@ -0,0 +1,240 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+top_color="bgcolor=\"#ccccff\""
+row_color="bgcolor=\"#eeeeff\""
+pass_color="bgcolor=\"#ccffcc\""
+fail_color="bgcolor=\"#ffcccc\""
+ignore_color="bgcolor=\"#ffffcc\""
+
+
+#
+# Generate a single test table entry
+# $1 - output file
+# $test_name - test name
+# $test_log - href to test log
+# $test_desc - href to test description (or 'false')
+# $test_files - href to test files (or 'false')
+# $test_time - timing info for test run
+#
+# $result - test outcome (0 means pass)
+# $ignore - ignore current test (true/false)
+#
+gen_report_entry() {
+ dst=$1
+ echo "<tr>" >> $dst
+ echo -n "<td $row_color>$test_name (" >> $dst
+ if [ $test_desc != "false" ]; then
+ echo -n "<a href=\"$test_desc\">desc</a> " >> $dst
+ fi
+ echo -n "<a href=\"$test_log\">log</a>" >> $dst
+ if [ $test_files != "false" ]; then
+ echo -n " <a href=\"$test_files\">files</a>" >> $dst
+ fi
+ echo -n ")</td>" >> $dst
+ if [ $result -eq 0 ]; then
+ if $ignore; then
+ echo "<td $ignore_color>PASS</td>" >> $dst
+ else
+ echo "<td $pass_color>PASS</td>" >> $dst
+ fi
+ else
+ if $ignore; then
+ echo "<td $ignore_color>FAIL</td>" >> $dst
+ else
+ echo "<td $fail_color>FAIL</td>" >> $dst
+ fi
+ fi
+ echo "<td $row_color>$test_time</td>" >> $dst
+ echo "</tr>" >> $dst
+}
+
+#
+# Generate a single test entry in JSON
+# Arguments same as for gen_report_entry()
+#
+gen_report_entry_json() {
+ dst=$1
+ echo "{" >> $dst
+ echo "\"name\": \"$test_name\"," >> $dst
+ local log=`cat $test_log | base64 -w 0`
+ echo "\"log\": \"$log\"," >> $dst
+ echo "\"ignored\": $ignore," >> $dst
+ echo "\"time\": $test_run_time," >> $dst
+ local success="true"
+ if [ $result == 0 ]; then
+ success="true"
+ else
+ success="false"
+ fi
+ echo "\"success\": $success" >> $dst
+ echo -n "}" >> $dst
+}
+
+get_file_size () {
+ if [ `uname` = FreeBSD ]; then
+ stat -f "%z" "$1"
+ return 0
+ fi
+ if [ `uname` = Linux ]; then
+ stat -c "%s" "$1"
+ return 0
+ fi
+ ls -l "$1" | awk '{print $5}'
+}
+
+#
+# Generate test file list
+# $1 - output file
+# $test_name - test name
+# $test_path - path to test
+# $test_cnt - total number of tests (so far)
+#
+gen_file_list() {
+ dst=$1
+ echo "<html>" > $dst
+ echo "<title>File List for $test_name</title>" >> $dst
+ echo "<body bgcolor=\"#ffffff\">" >> $dst
+ echo "<h1>File List for $test_name</h1>" >> $dst
+ echo "<table cellspacing=\"2\" cellpadding=\"5\" border=\"0\">" >> $dst
+ echo "<tr>" >> $dst
+ echo "<th align=\"left\" $top_color>Filename</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Size (bytes)</th>" >> $dst
+ echo "</tr>" >> $dst
+ filelist=`cat $test_path/FILES`
+ for file in $filelist; do
+ file_link=test.$test_cnt.$test_name.file.$file.txt
+ file_link=`echo "$file_link" | sed -e "s=/=.=g"`
+ echo "<tr>" >> $dst
+ if [ -f $test_path/$file ]; then
+ cp $test_path/$file $file_link
+ file_size=`get_file_size $file_link`
+ echo "<td $row_color><a href=\"$file_link\">$file</a></td>" >> $dst
+ echo "<td align=\"right\" $row_color>$file_size</td>" >> $dst
+ else
+ echo "<td $row_color>$file</td>" >> $dst
+ echo "<td align=\"right\" $row_color>not found</td>" >> $dst
+ fi
+ echo "</tr>" >> $dst
+ done
+ echo "</table>" >> $dst
+ echo "</body>" >> $dst
+ echo "</html>" >> $dst
+}
+
+#
+# Run one test
+#
+run_one_test() {
+ test=$1
+ test_cnt=$2
+ test_name=$3
+ test_path=$4
+ test_log=$5
+ test_result=$6
+ negate=$7
+ ignore=$8
+
+ rm -f tmp.$test_name.log-control
+ export VESPA_LOG_CONTROL_FILE=`pwd`/tmp.$test_name.log-control
+ # run test
+ local starttime=`date +%s`
+ /usr/bin/time -o tmp.${test}-time sh -c \
+ "(cd $test_path && $MAKE -s test $makeargs) > $test_log 2>&1"
+ result=$?
+ local endtime=`date +%s`
+ test_run_time=$(($endtime - $starttime))
+
+ #If you have run with valgrind check errors
+ if [ $result -eq 0 ]; then
+ valgrind_errors=`grep "ERROR SUMMARY" $test_log | cut -d ' ' -f4`
+ for r in $valgrind_errors
+ do
+ result=$(($result + $r))
+ done
+ fi
+
+ # handle test description
+ if [ -f $test_path/DESC ]; then
+ test_desc=test.$test_cnt.$test_name.desc.file.txt
+ cp $test_path/DESC $test_desc
+ else
+ test_desc="false"
+ fi
+
+ # handle test file list
+ if [ -f $test_path/FILES ]; then
+ test_files=test.$test_cnt.$test_name.files.html
+ gen_file_list $test_files
+ else
+ test_files="false"
+ fi
+
+ # handle test result negation
+ if $negate; then
+ if [ $result -eq 0 ]; then
+ result=1
+ else
+ result=0
+ fi
+ fi
+ result_string=""
+ if [ $result -eq 0 ]; then
+ if $ignore; then
+ result_string="PASS (ignored)"
+ else
+ result_string="PASS"
+ fi
+ else
+ if $ignore; then
+ result_string="FAIL (ignored)"
+ else
+ result_string="FAIL"
+ fi
+ fi
+
+ test_time=`cat tmp.${test}-time`
+ echo $test_name : $result_string
+ echo $result > $test_result
+ gen_report_entry $report.entry
+ gen_report_entry_json tmp.report.$test_name.json
+}
+
+progname=`basename $0 .sh`
+if [ $# -lt 4 ]; then
+ echo "usage: $0 <rundir> <test> <testid> <top>"
+ echo " rundir: where to run and generate output"
+ echo " test: content of testdir"
+ echo" testid: unique id for this test (when run in parallel with other tests)"
+ echo " top: path to top (relative to rundir)"
+ exit 1
+fi
+
+mkdir -p $1
+cd $1 || exit 1
+test=$2
+test_cnt=$3
+top_path=$4
+
+: ${MAKE:=gmake}
+unset MAKELEVEL
+
+report=test-report.html
+jsonreport=test-report.json
+
+negate=false
+ignore=false
+case $test in
+\!*) negate=true; prefix="[!]"; test=${test#!};;
+\?*) ignore=true; prefix="[?]"; test=${test#?};;
+esac
+prefix=""
+test_name="${prefix}"`echo $test | sed -e "s=^tests/==;s=/=.=g"`
+test_path=$top_path/$test
+test=`basename $test`
+test_log=test.$test_cnt.$test_name.log.file.txt
+test_result=test.$test_cnt.$test_name.result
+# run test
+echo "running test '$test_name' ... "
+
+run_one_test $test $test_cnt $test_name $test_path $test_log $test_result $negate $ignore
diff --git a/vespalib/src/vespa/vespalib/testkit/test_comparators.cpp b/vespalib/src/vespa/vespalib/testkit/test_comparators.cpp
new file mode 100644
index 00000000000..51641fe5e78
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_comparators.cpp
@@ -0,0 +1,8 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "test_comparators.h"
+
+namespace vespalib {
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/testkit/test_comparators.h b/vespalib/src/vespa/vespalib/testkit/test_comparators.h
new file mode 100644
index 00000000000..fcaa2e86063
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_comparators.h
@@ -0,0 +1,73 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/util/approx.h>
+
+namespace vespalib {
+
+/**
+ * Collection of generic test comparators.
+ **/
+class TestComparators
+{
+private:
+ TestComparators() {}
+public:
+ /** @brief Functor implementing approximately equals (with an epsilon) */
+ struct approx {
+ double _eps;
+ approx(double eps) : _eps(eps) {}
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const {
+ if (a < b) {
+ return (b - a) <= _eps;
+ } else {
+ return (a - b) <= _eps;
+ }
+ }
+ };
+ /** @brief Functor implementing not approximately equals (with an epsilon) */
+ struct not_approx {
+ approx _approx;
+ not_approx(double eps) : _approx(eps) {}
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const {
+ return !_approx(a, b);
+ }
+ };
+ /** @brief Functor implementing equals */
+ struct equal {
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const { return (a == b); }
+ bool operator()(double a, double b) const { return approx_equal(a, b); }
+ };
+ /** @brief Functor implementing not-equals */
+ struct not_equal {
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const { return !equal()(a, b); }
+ };
+ /** @brief Functor implementing is-less-than */
+ struct less {
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const { return (a < b); }
+ };
+ /** @brief Functor implementing is-less-than-or-equal */
+ struct less_equal {
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const { return less()(a, b) || equal()(a, b); }
+ };
+ /** @brief Functor implementing is-greater-than */
+ struct greater {
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const { return less()(b, a); }
+ };
+ /** @brief Functor implementing is-greater-than-or-equal */
+ struct greater_equal {
+ template <class A, class B>
+ bool operator()(const A &a, const B &b) const { return greater()(a, b) || equal()(a, b); }
+ };
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/testkit/test_hook.cpp b/vespalib/src/vespa/vespalib/testkit/test_hook.cpp
new file mode 100644
index 00000000000..b70c14ffe2b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_hook.cpp
@@ -0,0 +1,140 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "test_hook.h"
+#include "test_master.h"
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/regexp.h>
+
+namespace vespalib {
+
+namespace {
+
+struct FastOSTestThreadRunner : FastOS_Runnable {
+ TestThreadEntry &entry;
+ FastOSTestThreadRunner(TestThreadEntry &entry_in) : entry(entry_in) {}
+ virtual bool DeleteOnCompletion() const { return true; }
+ virtual void Run(FastOS_ThreadInterface *, void *) { entry.threadEntry(); }
+};
+
+struct FastOSTestThreadFactory : TestThreadFactory {
+ FastOS_ThreadPool threadPool;
+ FastOSTestThreadFactory() : threadPool(256 * 1024) {}
+ virtual void createThread(TestThreadEntry &entry) {
+ threadPool.NewThread(new FastOSTestThreadRunner(entry), 0);
+ }
+};
+
+} // namespace vespalib::<unnamed>
+
+__thread TestThreadFactory *TestThreadFactory::factory = 0;
+
+void
+TestThreadWrapper::threadEntry()
+{
+ TestMaster &master = TestMaster::master;
+ std::string oldThreadName = master.getThreadName();
+ std::vector<TestMaster::TraceItem> oldTraceStack = master.getThreadTraceStack();
+ master.setThreadName(make_string("%zu(%zu)", _fixture.thread_id, _fixture.num_threads).c_str());
+ master.setThreadTraceStack(_traceStack);
+ size_t preThreadFailCnt = master.getThreadFailCnt();
+ master.setThreadIgnore(_ignore);
+ master.setThreadUnwind(true);
+ master.setThreadBarrier(&_barrier);
+ _barrier.await();
+ try {
+ _fixture.test_entry_point();
+ } catch (TestMaster::Unwind &) {
+ } catch (std::exception &e) {
+ master.check(false, __FILE__, __LINE__, e.what(), false);
+ } catch (...) {
+ master.check(false, __FILE__, __LINE__, "test threw stuff", false);
+ }
+ _barrier.destroy();
+ master.setThreadBarrier(0);
+ bool fail = (master.getThreadFailCnt() > preThreadFailCnt);
+ master.setThreadUnwind(false);
+ master.setThreadIgnore(false);
+ _result = !fail;
+ _latch.countDown();
+ master.setThreadTraceStack(oldTraceStack);
+ master.setThreadName(oldThreadName.c_str());
+}
+
+TestHook *TestHook::_head = 0;
+TestHook *TestHook::_tail = 0;
+
+TestHook::TestHook(const std::string &file, const std::string &name, bool ignore)
+ : _next(0),
+ _name(name),
+ _tag(make_string("%s:%s", file.c_str(), name.c_str())),
+ _ignore(ignore)
+{
+ if (_head == 0) {
+ assert(_tail == 0);
+ _head = this;
+ _tail = this;
+ } else {
+ assert(_tail != 0);
+ assert(_tail->_next == 0);
+ _tail->_next = this;
+ _tail = this;
+ }
+}
+
+const char *lookup_subset_pattern(const std::string &name) {
+ const char *pattern = getenv("TEST_SUBSET");
+ if (pattern != 0) {
+ fprintf(stderr, "%s: info: only running tests matching '%s'\n",
+ name.c_str(), pattern);
+ } else {
+ pattern = "";
+ }
+ return pattern;
+}
+
+void
+TestHook::runAll()
+{
+ FastOSTestThreadFactory threadFactory;
+ TestThreadFactory::factory = &threadFactory;
+ std::string name = TestMaster::master.getName();
+ Regexp pattern(lookup_subset_pattern(name));
+ size_t testsPassed = 0;
+ size_t testsFailed = 0;
+ size_t testsIgnored = 0;
+ size_t testsSkipped = 0;
+ for (TestHook *test = _head; test != 0; test = test->_next) {
+ if (pattern.match(test->_tag)) {
+ bool ignored = test->_ignore;
+ bool failed = !test->run();
+ if (ignored) {
+ ++testsIgnored;
+ } else if (failed) {
+ ++testsFailed;
+ } else {
+ ++testsPassed;
+ }
+ const char *level = ignored ? "Warn: " : failed ? "ERROR:" : "info: ";
+ fprintf(stderr, "%s: %s status_for_test '%s': %s%s\n",
+ name.c_str(), level, test->_name.c_str(),
+ failed ? "FAIL" : "PASS",
+ ignored ? " (ignored)" : "");
+ } else {
+ ++testsSkipped;
+ }
+ }
+ fprintf(stderr, "%s: info: test summary --- %zu test(s) passed --- %zu test(s) failed\n",
+ name.c_str(), testsPassed, testsFailed);
+ if (testsSkipped > 0) {
+ fprintf(stderr, "%s: info: test summary --- %zu test(s) skipped\n",
+ name.c_str(), testsSkipped);
+ }
+ if (testsIgnored > 0) {
+ fprintf(stderr, "%s: Warn: test summary --- %zu test(s) ignored\n",
+ name.c_str(), testsIgnored);
+ }
+ TestThreadFactory::factory = 0;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/testkit/test_hook.h b/vespalib/src/vespa/vespalib/testkit/test_hook.h
new file mode 100644
index 00000000000..2dc67595736
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_hook.h
@@ -0,0 +1,113 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/util/sync.h>
+#include <vespa/vespalib/util/barrier.h>
+#include <string>
+#include <vector>
+#include "test_master.h"
+
+namespace vespalib {
+
+struct TestThreadEntry {
+ virtual void threadEntry() = 0;
+ virtual ~TestThreadEntry() {}
+};
+
+struct TestThreadFactory {
+ static __thread TestThreadFactory *factory;
+ virtual void createThread(TestThreadEntry &entry) = 0;
+ virtual ~TestThreadFactory() {}
+};
+
+struct TestFixtureWrapper {
+ size_t thread_id;
+ size_t num_threads;
+ TestFixtureWrapper() : thread_id(0), num_threads(1) {}
+ virtual void test_entry_point() = 0;
+ virtual ~TestFixtureWrapper() {}
+};
+
+class TestThreadWrapper : public TestThreadEntry
+{
+private:
+ bool _result;
+ bool _ignore;
+ CountDownLatch &_latch;
+ Barrier &_barrier;
+ const std::vector<TestMaster::TraceItem> &_traceStack;
+ TestFixtureWrapper &_fixture;
+
+public:
+ TestThreadWrapper(bool ignore, CountDownLatch &l, Barrier &b,
+ const std::vector<TestMaster::TraceItem> &traceStack,
+ TestFixtureWrapper &fixture)
+ : _result(false), _ignore(ignore),
+ _latch(l), _barrier(b), _traceStack(traceStack),
+ _fixture(fixture) {}
+
+ virtual void threadEntry();
+ bool getResult() const {
+ return _result;
+ }
+};
+
+#ifndef IAM_DOXYGEN
+class TestHook
+{
+private:
+ static TestHook *_head;
+ static TestHook *_tail;
+ TestHook *_next;
+ std::string _name;
+ std::string _tag;
+ bool _ignore;
+
+ TestHook(const TestHook &);
+ TestHook &operator=(const TestHook &);
+
+protected:
+ TestHook(const std::string &file, const std::string &name, bool ignore);
+ virtual ~TestHook() {}
+
+ template <typename T>
+ bool runTest(const T &fixture, size_t num_threads) {
+ assert(num_threads > 0);
+ typedef std::unique_ptr<TestThreadWrapper> ThreadUP;
+ typedef std::unique_ptr<T> FixtureUP;
+ std::vector<TestMaster::TraceItem> traceStack = TestMaster::master.getThreadTraceStack();
+ CountDownLatch latch(num_threads);
+ Barrier barrier(num_threads);
+ std::vector<FixtureUP> fixtures;
+ std::vector<ThreadUP> threads;
+ threads.reserve(num_threads);
+ fixtures.reserve(num_threads);
+ for (size_t i = 0; i < num_threads; ++i) {
+ FixtureUP fixture_up(new T(fixture));
+ fixture_up->thread_id = i;
+ fixture_up->num_threads = num_threads;
+ threads.emplace_back(new TestThreadWrapper(_ignore, latch, barrier, traceStack, *fixture_up));
+ fixtures.push_back(std::move(fixture_up));
+ }
+ for (size_t i = 1; i < num_threads; ++i) {
+ assert(TestThreadFactory::factory != 0);
+ TestThreadFactory::factory->createThread(*threads[i]);
+ }
+ threads[0]->threadEntry();
+ latch.await();
+ bool result = true;
+ for (size_t i = 0; i < num_threads; ++i) {
+ result = result && threads[i]->getResult();
+ }
+ return result;
+ }
+ virtual bool run() = 0;
+
+public:
+ static void runAll();
+};
+#endif
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/testkit/test_kit.h b/vespalib/src/vespa/vespalib/testkit/test_kit.h
new file mode 100644
index 00000000000..98fb7b42fa0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_kit.h
@@ -0,0 +1,12 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <memory>
+#include <vespa/fastos/fastos.h>
+#include "test_macros.h"
+#include "test_comparators.h"
+#include "test_master.h"
+#include "test_hook.h"
+#include "test_state_guard.h"
+
diff --git a/vespalib/src/vespa/vespalib/testkit/test_macros.h b/vespalib/src/vespa/vespalib/testkit/test_macros.h
new file mode 100644
index 00000000000..f9b762d8d98
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_macros.h
@@ -0,0 +1,89 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#define TEST_STR(str) #str
+#define TEST_CAT_IMPL(a, b) a ## b
+#define TEST_CAT(a, b) TEST_CAT_IMPL(a, b)
+#define TEST_MASTER vespalib::TestMaster::master
+#define TEST_DEBUG(lhsFile, rhsFile) TEST_MASTER.openDebugFiles(lhsFile, rhsFile)
+#define TEST_STATE(msg) vespalib::TestStateGuard TEST_CAT(testStateGuard, __LINE__) (__FILE__, __LINE__, msg)
+#define TEST_DO(doit) do { TEST_STATE(TEST_STR(doit)); doit; } while(false)
+#define TEST_FLUSH() TEST_MASTER.flush(__FILE__, __LINE__)
+#define TEST_TRACE() TEST_MASTER.trace(__FILE__, __LINE__)
+#define TEST_THREAD(name) TEST_MASTER.setThreadName(name)
+#define TEST_BARRIER() TEST_MASTER.awaitThreadBarrier(__FILE__, __LINE__)
+#define TEST_MAIN_IMPL(useProxy) \
+ void test_kit_main(); \
+ struct TestKitApp : FastOS_Application \
+ { \
+ virtual bool useProcessStarter() const { return useProxy; } \
+ virtual int Main(); \
+ }; \
+ int main(int argc, char **argv) \
+ { \
+ TestKitApp app; \
+ return app.Entry(argc, argv); \
+ } \
+ int TestKitApp::Main() { \
+ TEST_MASTER.init(__FILE__); \
+ test_kit_main(); \
+ return (TEST_MASTER.fini() ? 0 : 1); \
+ } \
+ void test_kit_main()
+
+#define TEST_MAIN() TEST_MAIN_IMPL(false)
+#define TEST_MAIN_WITH_PROCESS_PROXY() TEST_MAIN_IMPL(true)
+
+//-----------------------------------------------------------------------------
+#include "generated_fixture_macros.h"
+//-----------------------------------------------------------------------------
+
+#define TEST_RUN_ALL() vespalib::TestHook::runAll()
+
+#define TEST_EXCEPTION_IMPL(statement, exception_type, msg_substr, fatal) \
+ try { \
+ statement; \
+ TEST_MASTER.check(false, __FILE__, __LINE__, \
+ #statement " didn't throw " #exception_type, fatal); \
+ } catch (exception_type &e) { \
+ if (!TEST_MASTER.check(std::string(e.what()).find(msg_substr) \
+ != std::string::npos, __FILE__, __LINE__, \
+ (#msg_substr " should be a substring of \"" + \
+ std::string(e.what()) + "\"").c_str(), \
+ fatal)) throw; \
+ } catch (...) { \
+ TEST_MASTER.check(false, __FILE__, __LINE__, \
+ #statement " threw an unexpected exception", fatal); \
+ throw; \
+ }
+
+#define EXPECT_TRUE(rc) TEST_MASTER.check(rc, __FILE__, __LINE__, TEST_STR(rc), false)
+#define EXPECT_FALSE(rc) TEST_MASTER.check(!(rc), __FILE__, __LINE__, TEST_STR(rc), false)
+#define EXPECT_APPROX(a, b, eps) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " ~= ", a, b, vespalib::TestComparators::approx(eps), false)
+#define EXPECT_NOT_APPROX(a, b, eps) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " !~= ", a, b, vespalib::TestComparators::not_approx(eps), false)
+#define EXPECT_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " == ", a, b, vespalib::TestComparators::equal(), false)
+#define EXPECT_NOT_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " != ", a, b, vespalib::TestComparators::not_equal(), false)
+#define EXPECT_LESS(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " < ", a, b, vespalib::TestComparators::less(), false)
+#define EXPECT_LESS_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " <= ", a, b, vespalib::TestComparators::less_equal(), false)
+#define EXPECT_GREATER(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " > ", a, b, vespalib::TestComparators::greater(), false)
+#define EXPECT_GREATER_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " >= ", a, b, vespalib::TestComparators::greater_equal(), false)
+#define EXPECT_EXCEPTION(statement, exception_type, msg_substr) TEST_EXCEPTION_IMPL(statement, exception_type, msg_substr, false)
+
+#define TEST_ERROR(msg) TEST_MASTER.check(false, __FILE__, __LINE__, msg, false)
+
+
+#define ASSERT_TRUE(rc) TEST_MASTER.check(rc, __FILE__, __LINE__, TEST_STR(rc), true)
+#define ASSERT_FALSE(rc) TEST_MASTER.check(!(rc), __FILE__, __LINE__, TEST_STR(rc), true)
+#define ASSERT_APPROX(a, b, eps) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " ~= ", a, b, vespalib::TestComparators::approx(eps), true)
+#define ASSERT_NOT_APPROX(a, b, eps) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " !~= ", a, b, vespalib::TestComparators::not_approx(eps), true)
+#define ASSERT_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " == ", a, b, vespalib::TestComparators::equal(), true)
+#define ASSERT_NOT_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " != ", a, b, vespalib::TestComparators::not_equal(), true)
+#define ASSERT_LESS(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " < ", a, b, vespalib::TestComparators::less(), true)
+#define ASSERT_LESS_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " <= ", a, b, vespalib::TestComparators::less_equal(), true)
+#define ASSERT_GREATER(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " > ", a, b, vespalib::TestComparators::greater(), true)
+#define ASSERT_GREATER_EQUAL(a, b) TEST_MASTER.compare(__FILE__, __LINE__, TEST_STR(a), TEST_STR(b), " >= ", a, b, vespalib::TestComparators::greater_equal(), true)
+#define ASSERT_EXCEPTION(statement, exception_type, msg_substr) TEST_EXCEPTION_IMPL(statement, exception_type, msg_substr, true)
+
+#define TEST_FATAL(msg) TEST_MASTER.check(false, __FILE__, __LINE__, msg, true)
+
diff --git a/vespalib/src/vespa/vespalib/testkit/test_master.cpp b/vespalib/src/vespa/vespalib/testkit/test_master.cpp
new file mode 100644
index 00000000000..c8a2e75b0e6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_master.cpp
@@ -0,0 +1,351 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "test_master.h"
+
+namespace vespalib {
+
+//-----------------------------------------------------------------------------
+
+TestMaster TestMaster::master;
+
+//-----------------------------------------------------------------------------
+
+__thread TestMaster::ThreadState *TestMaster::_threadState = 0;
+
+//-----------------------------------------------------------------------------
+
+TestMaster::ThreadState &
+TestMaster::threadState(const vespalib::LockGuard &)
+{
+ if (_threadState == 0) {
+ std::ostringstream threadName;
+ threadName << "thread-" << _threadStorage.size();
+ vespalib::LinkedPtr<ThreadState> thread(new ThreadState(threadName.str()));
+ _threadStorage.push_back(thread);
+ _threadState = thread.get();
+ }
+ return *_threadState;
+}
+
+TestMaster::ThreadState &
+TestMaster::threadState()
+{
+ if (_threadState != 0) {
+ return *_threadState;
+ }
+ {
+ vespalib::LockGuard guard(_lock);
+ return threadState(guard);
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+void
+TestMaster::checkFailed(const vespalib::LockGuard &guard,
+ const char *file, uint32_t line, const char *str)
+{
+ ThreadState &thread = threadState(guard);
+ ++thread.failCnt;
+ ++_state.failCnt;
+ fprintf(stderr, "%s: ERROR: check failure #%zu: '%s' in thread '%s' (%s:%d)\n",
+ _name.c_str(), _state.failCnt, str, thread.name.c_str(), file, line);
+ if (!thread.traceStack.empty()) {
+ for (size_t i = thread.traceStack.size(); i-- > 0; ) {
+ const TraceItem &item = thread.traceStack[i];
+ fprintf(stderr, " STATE[%zu]: '%s' (%s:%d)\n",
+ i, item.msg.c_str(), item.file.c_str(), item.line);
+ }
+ }
+}
+
+void
+TestMaster::printDiff(const vespalib::LockGuard &guard,
+ const std::string &text, const std::string &file, uint32_t line,
+ const std::string &lhs, const std::string &rhs)
+{
+ ThreadState &thread = threadState(guard);
+ if (_state.lhsFile == NULL || _state.rhsFile == NULL) {
+ fprintf(stderr,
+ "lhs: %s\n"
+ "rhs: %s\n",
+ lhs.c_str(), rhs.c_str());
+ } else {
+ fprintf(_state.lhsFile,
+ "[check failure #%zu] '%s' in thread '%s' (%s:%d)\n"
+ "%s\n",
+ _state.failCnt, text.c_str(), thread.name.c_str(),
+ file.c_str(), line, lhs.c_str());
+ fprintf(_state.rhsFile,
+ "[check failure #%zu] '%s' in thread '%s' (%s:%d)\n"
+ "%s\n",
+ _state.failCnt, text.c_str(), thread.name.c_str(),
+ file.c_str(), line, rhs.c_str());
+ }
+}
+
+void
+TestMaster::handleFailure(const vespalib::LockGuard &guard, bool fatal)
+{
+ ThreadState &thread = threadState(guard);
+ if (fatal) {
+ if (thread.unwind) {
+ throw Unwind();
+ }
+ fprintf(stderr, "%s: ERROR: vital check failed, aborting\n",
+ _name.c_str());
+ abort();
+ }
+}
+
+void
+TestMaster::closeDebugFiles(const vespalib::LockGuard &)
+{
+ if (_state.lhsFile != NULL) {
+ fclose(_state.lhsFile);
+ _state.lhsFile = NULL;
+ }
+ if (_state.rhsFile != NULL) {
+ fclose(_state.rhsFile);
+ _state.rhsFile = NULL;
+ }
+}
+
+void
+TestMaster::importThreads(const vespalib::LockGuard &)
+{
+ size_t importCnt = 0;
+ for (size_t i = 0; i < _threadStorage.size(); ++i) {
+ ThreadState &thread = *_threadStorage[i];
+ _state.passCnt += thread.passCnt;
+ importCnt += thread.passCnt;
+ thread.passCnt = 0;
+ }
+ if (importCnt > 0) {
+ fprintf(stderr, "%s: info: imported %zu passed check(s) from %zu thread(s)\n",
+ _name.c_str(), importCnt, _threadStorage.size());
+ }
+}
+
+bool
+TestMaster::reportConclusion(const vespalib::LockGuard &)
+{
+ bool ok = (_state.failCnt == 0);
+ fprintf(stderr, "%s: info: summary --- %zu check(s) passed --- %zu check(s) failed\n",
+ _name.c_str(), _state.passCnt, _state.failCnt);
+ fprintf(stderr, "%s: info: CONCLUSION: %s\n", _name.c_str(), ok ? "PASS" : "FAIL");
+ return ok;
+}
+
+//-----------------------------------------------------------------------------
+
+TestMaster::TestMaster()
+ : _lock(),
+ _name("<unnamed>"),
+ _state(),
+ _threadStorage()
+{
+ setThreadName("master");
+}
+
+//-----------------------------------------------------------------------------
+
+void
+TestMaster::init(const char *name)
+{
+ vespalib::LockGuard guard(_lock);
+ _name = name;
+ fprintf(stderr, "%s: info: running test suite '%s'\n", _name.c_str(), _name.c_str());
+}
+
+std::string
+TestMaster::getName()
+{
+ vespalib::LockGuard guard(_lock);
+ return _name;
+}
+
+void
+TestMaster::setThreadName(const char *name)
+{
+ threadState().name = name;
+}
+
+const char *
+TestMaster::getThreadName()
+{
+ return threadState().name.c_str();
+}
+
+void
+TestMaster::setThreadUnwind(bool unwind)
+{
+ threadState().unwind = unwind;
+}
+
+void
+TestMaster::setThreadIgnore(bool ignore)
+{
+ ThreadState &thread = threadState();
+ if (ignore == thread.ignore) {
+ return;
+ }
+ if (ignore) {
+ thread.ignore = true;
+ thread.preIgnoreFailCnt = thread.failCnt;
+ } else {
+ thread.ignore = false;
+ size_t revertCnt = (thread.failCnt - thread.preIgnoreFailCnt);
+ thread.failCnt = thread.preIgnoreFailCnt;
+ if (revertCnt > 0) {
+ vespalib::LockGuard guard(_lock);
+ assert(_state.failCnt >= revertCnt);
+ _state.failCnt -= revertCnt;
+ }
+ }
+}
+
+void
+TestMaster::setThreadBarrier(Barrier *barrier)
+{
+ threadState().barrier = barrier;
+}
+
+void
+TestMaster::awaitThreadBarrier(const char *file, uint32_t line)
+{
+ ThreadState &thread = threadState();
+ if (thread.barrier == 0) {
+ return;
+ }
+ if (!thread.barrier->await()) {
+ check(false, file, line, "test barrier broken", true);
+ }
+}
+
+std::vector<TestMaster::TraceItem>
+TestMaster::getThreadTraceStack()
+{
+ return threadState().traceStack;
+}
+
+void
+TestMaster::setThreadTraceStack(const std::vector<TraceItem> &traceStack)
+{
+ threadState().traceStack = traceStack;
+}
+
+size_t
+TestMaster::getThreadFailCnt()
+{
+ return threadState().failCnt;
+}
+
+TestMaster::Progress
+TestMaster::getProgress()
+{
+ vespalib::LockGuard guard(_lock);
+ return Progress(_state.passCnt, _state.failCnt);
+}
+
+void
+TestMaster::openDebugFiles(const std::string &lhsFile,
+ const std::string &rhsFile)
+{
+ vespalib::LockGuard guard(_lock);
+ closeDebugFiles(guard);
+ _state.lhsFile = fopen(lhsFile.c_str(), "w");
+ _state.rhsFile = fopen(rhsFile.c_str(), "w");
+ if (_state.lhsFile == NULL || _state.rhsFile == NULL) {
+ closeDebugFiles(guard);
+ fprintf(stderr, "%s: Warn: could not open debug files (%s, %s)\n",
+ _name.c_str(), lhsFile.c_str(), rhsFile.c_str());
+ } else {
+ fprintf(_state.lhsFile, "[LHS]\n");
+ fprintf(_state.rhsFile, "[RHS]\n");
+ }
+}
+
+void
+TestMaster::pushState(const char *file, uint32_t line, const char *msg)
+{
+ threadState().traceStack.push_back(TraceItem(file, line, msg));
+}
+
+void
+TestMaster::popState()
+{
+ ThreadState &state = threadState();
+ if (!state.traceStack.empty()) {
+ state.traceStack.pop_back();
+ }
+}
+
+bool
+TestMaster::check(bool rc, const char *file, uint32_t line,
+ const char *str, bool fatal)
+{
+ if (rc) {
+ ++threadState().passCnt;
+ return true;
+ }
+ {
+ vespalib::LockGuard guard(_lock);
+ checkFailed(guard, file, line, str);
+ handleFailure(guard, fatal);
+ }
+ return false;
+}
+
+void
+TestMaster::flush(const char *file, uint32_t line)
+{
+ ThreadState &thread = threadState();
+ if (thread.passCnt > 0) {
+ vespalib::LockGuard guard(_lock);
+ _state.passCnt += thread.passCnt;
+ fprintf(stderr, "%s: info: flushed %zu passed check(s) from thread '%s' (%s:%d)\n",
+ _name.c_str(), thread.passCnt, thread.name.c_str(), file, line);
+ thread.passCnt = 0;
+ }
+}
+
+void
+TestMaster::trace(const char *file, uint32_t line)
+{
+ ThreadState &thread = threadState();
+ fprintf(stderr, "%s: info: trace: thread '%s' (%s:%d)\n",
+ _name.c_str(), thread.name.c_str(), file, line);
+}
+
+bool
+TestMaster::discardFailedChecks(size_t failCnt)
+{
+ vespalib::LockGuard guard(_lock);
+ ThreadState &thread = threadState(guard);
+ if (failCnt == _state.failCnt) {
+ fprintf(stderr, "%s: info: discarding %zu failed check(s)\n", _name.c_str(), _state.failCnt);
+ _state.failCnt = 0;
+ return true;
+ } else {
+ fprintf(stderr, "%s: ERROR: tried to discard %zu failed check(s), but was %zu (+1)\n",
+ _name.c_str(), failCnt, _state.failCnt);
+ ++thread.failCnt;
+ ++_state.failCnt;
+ return false;
+ }
+}
+
+bool
+TestMaster::fini()
+{
+ vespalib::LockGuard guard(_lock);
+ closeDebugFiles(guard);
+ importThreads(guard);
+ return reportConclusion(guard);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/testkit/test_master.h b/vespalib/src/vespa/vespalib/testkit/test_master.h
new file mode 100644
index 00000000000..78035fa2f65
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_master.h
@@ -0,0 +1,123 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/util/sync.h>
+#include <vespa/vespalib/util/barrier.h>
+#include <vespa/vespalib/util/linkedptr.h>
+#include <string>
+#include <vector>
+
+namespace vespalib {
+
+#ifndef IAM_DOXYGEN
+/**
+ * The master of testing.
+ **/
+class TestMaster
+{
+private:
+ TestMaster(const TestMaster &);
+ TestMaster &operator=(const TestMaster &);
+
+public:
+ struct Progress {
+ size_t passCnt;
+ size_t failCnt;
+ Progress(size_t pass, size_t fail) : passCnt(pass), failCnt(fail) {}
+ };
+
+ struct Unwind {};
+
+ static TestMaster master;
+
+ struct TraceItem {
+ std::string file;
+ uint32_t line;
+ std::string msg;
+ TraceItem(const std::string &file_in, uint32_t line_in,
+ const std::string &msg_in)
+ : file(file_in), line(line_in), msg(msg_in) {}
+ };
+
+private:
+ struct ThreadState {
+ std::string name;
+ bool unwind;
+ size_t passCnt;
+ size_t failCnt;
+ bool ignore;
+ size_t preIgnoreFailCnt;
+ std::vector<TraceItem> traceStack;
+ Barrier *barrier;
+ ThreadState(const std::string &n)
+ : name(n), unwind(false), passCnt(0),
+ failCnt(0), ignore(false), preIgnoreFailCnt(0), traceStack(),
+ barrier(0) {}
+ };
+ static __thread ThreadState *_threadState;
+
+ struct SharedState {
+ size_t passCnt;
+ size_t failCnt;
+ FILE *lhsFile;
+ FILE *rhsFile;
+ SharedState() : passCnt(0), failCnt(0),
+ lhsFile(0), rhsFile(0) {}
+ };
+
+private:
+ vespalib::Lock _lock;
+ std::string _name;
+ SharedState _state;
+ std::vector<vespalib::LinkedPtr<ThreadState> > _threadStorage;
+
+private:
+ ThreadState &threadState(const vespalib::LockGuard &);
+ ThreadState &threadState();
+ void checkFailed(const vespalib::LockGuard &,
+ const char *file, uint32_t line, const char *str);
+ void printDiff(const vespalib::LockGuard &,
+ const std::string &text, const std::string &file, uint32_t line,
+ const std::string &lhs, const std::string &rhs);
+ void handleFailure(const vespalib::LockGuard &, bool do_abort);
+ void closeDebugFiles(const vespalib::LockGuard &);
+ void importThreads(const vespalib::LockGuard &);
+ bool reportConclusion(const vespalib::LockGuard &);
+
+private:
+ TestMaster();
+
+public:
+ void init(const char *name);
+ std::string getName();
+ void setThreadName(const char *name);
+ const char *getThreadName();
+ void setThreadUnwind(bool unwind);
+ void setThreadIgnore(bool ignore);
+ void setThreadBarrier(Barrier *barrier);
+ void awaitThreadBarrier(const char *file, uint32_t line);
+ std::vector<TraceItem> getThreadTraceStack();
+ void setThreadTraceStack(const std::vector<TraceItem> &traceStack);
+ size_t getThreadFailCnt();
+ Progress getProgress();
+ void openDebugFiles(const std::string &lhsFile, const std::string &rhsFile);
+ void pushState(const char *file, uint32_t line, const char *msg);
+ void popState();
+ bool check(bool rc, const char *file, uint32_t line,
+ const char *str, bool fatal);
+ template<class A, class B, class OP>
+ bool compare(const char *file, uint32_t line,
+ const char *aName, const char *bName, const char *opText,
+ const A &a, const B &b, const OP &op, bool fatal);
+ void flush(const char *file, uint32_t line);
+ void trace(const char *file, uint32_t line);
+ bool discardFailedChecks(size_t failCnt);
+ bool fini();
+};
+#endif
+
+} // namespace vespalib
+
+#include "test_master.hpp"
+
diff --git a/vespalib/src/vespa/vespalib/testkit/test_master.hpp b/vespalib/src/vespa/vespalib/testkit/test_master.hpp
new file mode 100644
index 00000000000..28d4b8be6a8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_master.hpp
@@ -0,0 +1,35 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <sstream>
+
+namespace vespalib {
+
+template<class A, class B, class OP>
+bool
+TestMaster::compare(const char *file, uint32_t line,
+ const char *aName, const char *bName,
+ const char *opText,
+ const A &a, const B &b, const OP &op, bool fatal)
+{
+ if (op(a,b)) {
+ ++threadState().passCnt;
+ return true;
+ }
+ std::string str;
+ str += aName;
+ str += opText;
+ str += bName;
+ std::ostringstream lhs;
+ std::ostringstream rhs;
+ lhs << a;
+ rhs << b;
+ {
+ vespalib::LockGuard guard(_lock);
+ checkFailed(guard, file, line, str.c_str());
+ printDiff(guard, str, file, line, lhs.str(), rhs.str());
+ handleFailure(guard, fatal);
+ }
+ return false;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/testkit/test_state_guard.cpp b/vespalib/src/vespa/vespalib/testkit/test_state_guard.cpp
new file mode 100644
index 00000000000..0c26d88b1df
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_state_guard.cpp
@@ -0,0 +1,8 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "test_state_guard.h"
+
+namespace vespalib {
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/testkit/test_state_guard.h b/vespalib/src/vespa/vespalib/testkit/test_state_guard.h
new file mode 100644
index 00000000000..f693e22bf2f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/test_state_guard.h
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "test_master.h"
+
+namespace vespalib {
+
+#ifndef IAM_DOXYGEN
+struct TestStateGuard {
+ TestStateGuard(const char *file, uint32_t line, const char *msg) {
+ TestMaster::master.pushState(file, line, msg);
+ }
+ ~TestStateGuard() { TestMaster::master.popState(); }
+};
+#endif
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/testkit/testapp.cpp b/vespalib/src/vespa/vespalib/testkit/testapp.cpp
new file mode 100644
index 00000000000..a4bb01e525c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/testapp.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "testapp.h"
+
+namespace vespalib {
+
+TestMaster &TestApp::master(TestMaster::master);
+
+TestApp::TestApp()
+ : FastOS_Application(),
+ _name("<unnamed>")
+{
+}
+
+TestApp::~TestApp()
+{
+}
+
+void
+TestApp::ReportInit(const char *name)
+{
+ _name = name;
+}
+
+bool
+TestApp::ReportConclusion()
+{
+ return true;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/testkit/testapp.h b/vespalib/src/vespa/vespalib/testkit/testapp.h
new file mode 100644
index 00000000000..644c85e4be7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/testapp.h
@@ -0,0 +1,197 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include "test_kit.h"
+
+#undef TEST_MASTER
+#define TEST_MASTER vespalib::TestApp::master
+
+#define TEST_INIT(name) do { ReportInit(name); TEST_MASTER.init(name); } while(false)
+#define TEST_DONE() do { ReportConclusion(); return TEST_MASTER.fini() ? 0 : 1; } while(false)
+
+#define TEST_APPHOOK(app) \
+ int main(int argc, char **argv) \
+ { \
+ app myapp; \
+ return myapp.Entry(argc, argv); \
+ }
+#define TEST_SETUP(test) \
+ class test : public vespalib::TestApp \
+ { \
+ public: int Main(); \
+ }; \
+ TEST_APPHOOK(test)
+#define TEST_SETUP_WITHPROCESSPROXY(test) \
+ class test : public vespalib::TestApp \
+ { \
+ public: \
+ int Main(); \
+ virtual bool useProcessStarter() const { return true; } \
+ }; \
+ TEST_APPHOOK(test)
+
+namespace vespalib {
+
+/**
+ * @brief TestApp is used to create executable unit tests
+ *
+ * TestApp is a subclass of FastOS_Application that is tailored to
+ * create small executable programs containing unit tests. The idea is
+ * that you create a class that subclasses TestApp and use a set of
+ * macros to test your code. It is similar to the concept used in
+ * cppunit except that your tests become programs rather than library
+ * code.
+ *
+ * Below follows an explanation of all the available macros. Note that
+ * while you can also invoke the methods in this class directly, most
+ * tests will only need to use macros. Also, some features like
+ * grabbing the text making up a boolean expression, the file name and
+ * the line number of a statement is only possible with macros.
+ *
+ * <table>
+ * <tr><td><b>TEST_INIT(name)</b></td><td>
+ * Invokes the ReportInit method. <i>name</i> is the name of this
+ * test.
+ * </td></tr>
+ * <tr><td><b>TEST_GROUP(val)</b></td><td>
+ * Invokes the SetGroupModulo method. <i>val</i> is an integer
+ * defining the number of successful tests that may be logged at
+ * once. If <i>val</i> is 0, all consecutive successful test cases
+ * will be reported at once. If <i>val</i> is 1, all tests will be
+ * reported by separate log messages (this is the default).
+ * </td></tr>
+ * <tr><td><b>TEST_DEBUG(lhsFile, rhsFile)</b></td><td>
+ * Invokes the OpenDebugFiles method. <i>lhs</i> and <i>rhs</i> are
+ * file names for files where we want the left hand side and right
+ * hand side values to be stored. Diffing these files will simplify
+ * debugging of failed tests.
+ * </td></tr>
+ * <tr><td><b>TEST_PUSH_STATE(msg)</b></td><td>
+ * Invokes the PushState function. <i>msg</i> is pushed on the
+ * internal state stack together with the current file and line
+ * number. The state stack is dumped when a test fails, unless the
+ * DumpState function is overridden.
+ * </td></tr>
+ * <tr><td><b>TEST_POP_STATE()</b></td><td>
+ * Invokes the PopState function. The topmost item on the state stack
+ * will be popped. If the state stack is empty, nothing will happen.
+ * </td></tr>
+ * <tr><td><b>TEST_DO(statement)</b></td><td>
+ * Pushes <i>statement</i> on the state stack, performs
+ * <i>statement</i> and finally pops the state stack. The intended
+ * use is to wrap function calls within TEST_DO in order to produce
+ * something that looks like a stack trace when the state stack is
+ * dumped.
+ * </td></tr>
+ * <tr><td><b>EXPECT_TRUE(rc)</b></td><td>
+ * Test that <i>rc</i> evaluates to true. <i>rc</i> must be an
+ * expression that can be evaluated as a boolean. This automatically
+ * creates a test case. The macro invokes the ReportTestResult
+ * method.
+ * </td></tr>
+ * <tr><td><b>ASSERT_TRUE(rc)</b></td><td>
+ * Does the same as EXPECT_TRUE except that the application is
+ * aborted if the test fails. This macro may be used to test that
+ * setup vital to the rest of the tests does not fail.
+ * </td></tr>
+ * <tr><td><b>EXPECT_EQUAL(a, b)</b></td><td>
+ * Test that <i>a</i> == <i>b</i>.
+ * </td></tr>
+ * <tr><td><b>EXPECT_NOT_EQUAL(a, b)</b></td><td>
+ * Test that <i>a</i> != <i>b</i>.
+ * </td></tr>
+ * <tr><td><b>EXPECT_LESS(a, b)</b></td><td>
+ * Test that <i>a</i> &lt; <i>b</i>.
+ * </td></tr>
+ * <tr><td><b>EXPECT_LESS_EQUAL(a, b)</b></td><td>
+ * Test that <i>a</i> &lt;= <i>b</i>.
+ * </td></tr>
+ * <tr><td><b>EXPECT_GREATER(a, b)</b></td><td>
+ * Test that <i>a</i> &gt; <i>b</i>.
+ * </td></tr>
+ * <tr><td><b>EXPECT_GREATER_EQUAL(a, b)</b></td><td>
+ * Test that <i>a</i> &gt;= <i>b</i>.
+ * </td></tr>
+ * <tr><td><b>TEST_FLUSH()</b></td><td>
+ * Invokes the FlushReport method. This is used to force the logging
+ * of successful test cases that are waiting to be logged due to
+ * grouping (see TEST_GROUP).
+ * </td></tr>
+ * <tr><td><b>TEST_DONE()</b></td><td>
+ * Invokes the ReportConclusion method and returns 0 if all test
+ * cases passed, 1 otherwise. This should be the last thing in your
+ * Main method.
+ * </td></tr>
+ * <tr><td><b>TEST_APPHOOK(app)</b></td><td>
+ * Creates the code needed to run the class <i>app</i> that must be
+ * a subclass of FastOS_Application. This will create a canonical
+ * main method launching your fastos application.
+ * </td></tr>
+ * <tr><td><b>TEST_SETUP(test)</b></td><td>
+ * Does the same as TEST_APPHOOK, but also creates a simple class
+ * named <i>test</i> that is a subclass of TestApp and contains only
+ * the Main method. If you want to add some helper methods to your
+ * test, use TEST_APPHOOK, otherwise use this one.
+ * </td></tr>
+ * <tr><td><b>TEST_THREADS()</b></td><td>
+ * This macro is used in tests that require thread support. If no
+ * thread support is available (fastos was compiled without
+ * threads), this macro will invoke the ReportNoThreads and call the
+ * TEST_DONE macro to exit the test. If thread support is available
+ * this macro does nothing.
+ * </td></tr>
+ * </table>
+ *
+ * Simple test example:
+ * <pre>
+ * \#include <vespa/log/log.h>
+ * LOG_SETUP("true_test");
+ * \#include <vespa/fastos/fastos.h>
+ * \#include <vespa/vespalib/testkit/testapp.h>
+ *
+ * TEST_SETUP(Test)
+ *
+ * int
+ * Test::Main()
+ * {
+ * TEST_INIT("true_test");
+ * EXPECT_TRUE(true);
+ * TEST_DONE();
+ * }
+ * </pre>
+ **/
+class TestApp : public FastOS_Application
+{
+private:
+ std::string _name;
+
+public:
+ static TestMaster &master;
+
+ TestApp();
+ virtual ~TestApp();
+
+ /**
+ * @brief Obtain the name of this test
+ *
+ * @return test name
+ **/
+ const char *GetName() { return _name.c_str(); }
+
+ /**
+ * @brief Report test initialization
+ *
+ * @param name the name of this test
+ **/
+ virtual void ReportInit(const char *name);
+
+ /**
+ * @brief Report test summary
+ *
+ * @return true if all test cases passed
+ **/
+ virtual bool ReportConclusion();
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/testkit/testrun.sh b/vespalib/src/vespa/vespalib/testkit/testrun.sh
new file mode 100755
index 00000000000..cea9d310e45
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/testkit/testrun.sh
@@ -0,0 +1,465 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+top_color="bgcolor=\"#ccccff\""
+row_color="bgcolor=\"#eeeeff\""
+pass_color="bgcolor=\"#ccffcc\""
+fail_color="bgcolor=\"#ffcccc\""
+ignore_color="bgcolor=\"#ffffcc\""
+
+#
+# Generate top of HTML report
+# $1 - output file
+#
+gen_report_top() {
+ dst=$1
+ date=`date "+%Y-%m-%d %H:%M:%S"`
+ echo "<html>" > $dst
+ echo "<title>Test Report ($date)</title>" >> $dst
+ echo "<body bgcolor=\"#ffffff\">" >> $dst
+ echo "<h1>Test Report ($date)</h1>" >> $dst
+}
+
+#
+# Generate top of JSON report
+# $1 - output file
+#
+gen_report_top_json() {
+ dst=$1
+ echo "{" >> $dst
+}
+
+#
+# Generate bottom of HTML report
+# $1 - output file
+#
+gen_report_bottom() {
+ dst=$1
+ echo "</body>" > $dst
+ echo "</html>" >> $dst
+}
+
+#
+# Generate bottom of JSON report
+# $1 - output file
+#
+gen_report_bottom_json() {
+ dst=$1
+ echo "}" >> $dst
+}
+
+#
+# Generate top of test table
+# $1 - output file
+#
+gen_report_entry_init() {
+ dst=$1
+ echo "<h2>Details</h2>" > $dst
+ echo "<table cellspacing=\"2\" cellpadding=\"5\" border=\"0\">" >> $dst
+ echo "<tr>" >> $dst
+ echo "<th align=\"left\" $top_color>Test</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Result</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Time (s)</th>" >> $dst
+ echo "</tr>" >> $dst
+}
+
+#
+# Generate top of tests entry
+# $1 - output file
+#
+gen_report_entry_init_json() {
+ dst=$1
+ echo "\"test_suites\": [" >> $dst
+}
+
+#
+# Generate bottom of test table
+# $1 - output file
+#
+gen_report_entry_fini() {
+ dst=$1
+ echo "</table>" >> $dst
+}
+
+#
+# Generate end of tests entry
+# $1 - output file
+#
+gen_report_entry_fini_json() {
+ dst=$1
+ echo "]," >> $dst
+}
+
+#
+# Generate a single test table entry
+# $1 - output file
+# $test_name - test name
+# $test_log - href to test log
+# $test_desc - href to test description (or 'false')
+# $test_files - href to test files (or 'false')
+# $test_time - timing info for test run
+#
+# $result - test outcome (0 means pass)
+# $ignore - ignore current test (true/false)
+#
+gen_report_entry() {
+ dst=$1
+ echo "<tr>" >> $dst
+ echo -n "<td $row_color>$test_name (" >> $dst
+ if [ $test_desc != "false" ]; then
+ echo -n "<a href=\"$test_desc\">desc</a> " >> $dst
+ fi
+ echo -n "<a href=\"$test_log\">log</a>" >> $dst
+ if [ $test_files != "false" ]; then
+ echo -n " <a href=\"$test_files\">files</a>" >> $dst
+ fi
+ echo -n ")</td>" >> $dst
+ if [ $result -eq 0 ]; then
+ if $ignore; then
+ echo "<td $ignore_color>PASS</td>" >> $dst
+ else
+ echo "<td $pass_color>PASS</td>" >> $dst
+ fi
+ else
+ if $ignore; then
+ echo "<td $ignore_color>FAIL</td>" >> $dst
+ else
+ echo "<td $fail_color>FAIL</td>" >> $dst
+ fi
+ fi
+ echo "<td $row_color>$test_time</td>" >> $dst
+ echo "</tr>" >> $dst
+}
+
+#
+# Generate a single test entry in JSON
+# Arguments same as for gen_report_entry()
+#
+gen_report_entry_json() {
+ dst=$1
+ echo "{" >> $dst
+ echo "\"name\": \"$test_name\"," >> $dst
+ local log=`cat $test_log | base64 -w 0`
+ echo "\"log\": \"$log\"," >> $dst
+ echo "\"ignored\": $ignore," >> $dst
+ echo "\"time\": $test_run_time," >> $dst
+ local success="true"
+ if [ $result == 0 ]; then
+ success="true"
+ else
+ success="false"
+ fi
+ echo "\"success\": $success" >> $dst
+ echo -n "}" >> $dst
+}
+
+#
+# Generate test report summary
+# $1 - output file
+# $test_cnt - total number of tests
+# $pass_cnt - number of tests passed
+# $fail_cnt - number of tests failed
+# $ignore_cnt - number of tests ignored
+# $elapsed - total time spent tesing
+#
+gen_report_summary() {
+ dst=$1
+ echo "<h2>Summary</h2>" > $dst
+ echo "<table cellspacing=\"2\" cellpadding=\"5\" border=\"0\">" >> $dst
+ echo "<tr>" >> $dst
+ echo "<th align=\"left\" $top_color>Tests</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Pass</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Fail</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Ignore</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Time (s)</th>" >> $dst
+ echo "</tr>" >> $dst
+ echo "<tr>" >> $dst
+ echo "<td align=\"right\" $row_color>$test_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$pass_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$fail_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$ignore_cnt</td>" >> $dst
+ echo "<td align=\"right\" $row_color>$elapsed</td>" >> $dst
+ echo "</tr>" >> $dst
+ echo "</table>" >> $dst
+}
+
+gen_report_summary_json() {
+ dst=$1
+ echo "\"summary\": {" >> $dst
+ echo "\"total\": $test_cnt," >> $dst
+ echo "\"pass\": $pass_cnt," >> $dst
+ echo "\"fail\": $fail_cnt," >> $dst
+ echo "\"ignore\": $ignore_cnt," >> $dst
+ echo "\"time\": $elapsed" >> $dst
+ echo "}" >> $dst
+}
+
+get_file_size () {
+ if [ `uname` = FreeBSD ]; then
+ stat -f "%z" "$1"
+ return 0
+ fi
+ if [ `uname` = Linux ]; then
+ stat -c "%s" "$1"
+ return 0
+ fi
+ ls -l "$1" | awk '{print $5}'
+}
+
+#
+# Generate test file list
+# $1 - output file
+# $test_name - test name
+# $test_path - path to test
+# $test_cnt - total number of tests (so far)
+#
+gen_file_list() {
+ dst=$1
+ echo "<html>" > $dst
+ echo "<title>File List for $test_name</title>" >> $dst
+ echo "<body bgcolor=\"#ffffff\">" >> $dst
+ echo "<h1>File List for $test_name</h1>" >> $dst
+ echo "<table cellspacing=\"2\" cellpadding=\"5\" border=\"0\">" >> $dst
+ echo "<tr>" >> $dst
+ echo "<th align=\"left\" $top_color>Filename</th>" >> $dst
+ echo "<th align=\"left\" $top_color>Size (bytes)</th>" >> $dst
+ echo "</tr>" >> $dst
+ filelist=`cat $test_path/FILES`
+ for file in $filelist; do
+ file_link=test.$test_cnt.$test_name.file.$file.txt
+ file_link=`echo "$file_link" | sed -e "s=/=.=g"`
+ echo "<tr>" >> $dst
+ if [ -f $test_path/$file ]; then
+ cp $test_path/$file $file_link
+ file_size=`get_file_size $file_link`
+ echo "<td $row_color><a href=\"$file_link\">$file</a></td>" >> $dst
+ echo "<td align=\"right\" $row_color>$file_size</td>" >> $dst
+ else
+ echo "<td $row_color>$file</td>" >> $dst
+ echo "<td align=\"right\" $row_color>not found</td>" >> $dst
+ fi
+ echo "</tr>" >> $dst
+ done
+ echo "</table>" >> $dst
+ echo "</body>" >> $dst
+ echo "</html>" >> $dst
+}
+
+#
+# Run one test
+#
+run_one_test() {
+ test=$1
+ test_cnt=$2
+ test_name=$3
+ test_path=$4
+ test_log=$5
+ test_result=$6
+ negate=$7
+ ignore=$8
+
+ rm -f tmp.$test_name.log-control
+ export VESPA_LOG_CONTROL_FILE=`pwd`/tmp.$test_name.log-control
+ # run test
+ local starttime=`date +%s`
+ /usr/bin/time -o tmp.${test}-time sh -c \
+ "(cd $test_path && $MAKE -s test $makeargs) > $test_log 2>&1"
+ result=$?
+ local endtime=`date +%s`
+ test_run_time=$(($endtime - $starttime))
+
+ #If you have run with valgrind check errors
+ if [ $result -eq 0 ]; then
+ valgrind_errors=`grep "ERROR SUMMARY" $test_log | cut -d ' ' -f4`
+ for r in $valgrind_errors
+ do
+ result=$(($result + $r))
+ done
+ fi
+
+ # handle test description
+ if [ -f $test_path/DESC ]; then
+ test_desc=test.$test_cnt.$test_name.desc.file.txt
+ cp $test_path/DESC $test_desc
+ else
+ test_desc="false"
+ fi
+
+ # handle test file list
+ if [ -f $test_path/FILES ]; then
+ test_files=test.$test_cnt.$test_name.files.html
+ gen_file_list $test_files
+ else
+ test_files="false"
+ fi
+
+ # handle test result negation
+ if $negate; then
+ if [ $result -eq 0 ]; then
+ result=1
+ else
+ result=0
+ fi
+ fi
+ result_string=""
+ if [ $result -eq 0 ]; then
+ if $ignore; then
+ result_string="PASS (ignored)"
+ else
+ result_string="PASS"
+ fi
+ else
+ if $ignore; then
+ result_string="FAIL (ignored)"
+ else
+ result_string="FAIL"
+ fi
+ fi
+
+ test_time=`cat tmp.${test}-time`
+ echo $test_name : $result_string
+ echo $result > $test_result
+ gen_report_entry $report.entry
+ gen_report_entry_json tmp.report.$test_name.json
+}
+
+progname=`basename $0 .sh`
+parallell=1
+if [ $progname = "testrun_sequential" ]; then
+ parallell=0
+fi
+
+if [ $# -lt 3 ]; then
+ echo "usage: $0 <rundir> <testlist> <top> [makeargs]"
+ echo " rundir: where to run and generate output"
+ echo " testlist: file with test names (relative to rundir)"
+ echo " top: path to top (relative to rundir)"
+ exit 1
+fi
+
+makeargs=""
+if [ $# -eq 4 ]; then
+ makeargs=$4
+fi
+echo $makeargs
+
+mkdir -p $1
+cd $1 || exit 1
+testlist=`cat $2` || exit 1
+top_path=$3
+
+: ${MAKE:=gmake}
+unset MAKELEVEL
+
+rm -f test-report.html
+rm -f test-report.html.top
+rm -f test-report.html.bottom
+rm -f test-report.html.entry
+rm -f test-report.html.summary
+rm -f tmp.start-time
+rm -f tmp.end-time
+rm -f tmp.test-time
+rm -f tmp.report.*.json
+rm -f test.*.*.files.html
+rm -f test.*.*.file.*
+rm -f test-report.json
+
+date +%s > tmp.start-time
+
+report=test-report.html
+jsonreport=test-report.json
+gen_report_top $report.top
+gen_report_top_json $jsonreport
+gen_report_entry_init $report.entry
+gen_report_entry_init_json $jsonreport
+
+test_cnt=0
+fail_cnt=0
+pass_cnt=0
+ignore_cnt=0
+
+for test in $testlist; do
+ test_cnt=$(($test_cnt + 1))
+
+ negate=false
+ ignore=false
+ case $test in
+ \!*) negate=true; prefix="[!]"; test=${test#!};;
+ \?*) ignore=true; prefix="[?]"; test=${test#?};;
+ esac
+ prefix=""
+ test_name="${prefix}"`echo $test | sed -e "s=^tests/==;s=/=.=g"`
+ test_path=$top_path/$test
+ test=`basename $test`
+ test_log=test.$test_cnt.$test_name.log.file.txt
+ test_result=test.$test_cnt.$test_name.result
+ # run test
+ echo -n "running test '$test_name' ... "
+
+ if [ $parallell -eq 1 ]; then
+ run_one_test $test $test_cnt $test_name $test_path $test_log $test_result $negate $ignore &
+ echo $!
+ else
+ run_one_test $test $test_cnt $test_name $test_path $test_log $test_result $negate $ignore
+ fi
+
+done
+
+wait
+
+test_cnt=0
+for test in $testlist; do
+ test_cnt=$(($test_cnt + 1))
+ negate=false
+ ignore=false
+ case $test in
+ \!*) negate=true; prefix="[!]"; test=${test#!};;
+ \?*) ignore=true; prefix="[?]"; test=${test#?};;
+ esac
+ prefix=""
+ test_name="${prefix}"`echo $test | sed -e "s=^tests/==;s=/=.=g"`
+ test=`basename $test`
+ test_result=test.$test_cnt.$test_name.result
+ read result < $test_result
+ if [ $result -eq 0 ]; then
+ if $ignore; then
+ ignore_cnt=$(($ignore_cnt + 1))
+ else
+ pass_cnt=$(($pass_cnt + 1))
+ fi
+ else
+ if $ignore; then
+ ignore_cnt=$(($ignore_cnt + 1))
+ else
+ fail_cnt=$(($fail_cnt + 1))
+ cat test.$test_cnt.$test_name.log.file.txt
+ fi
+ fi
+ # Unfortunately, the JSON format is a bit context sensitive, so we need to do the old comma-before-entry-except-first logic
+ if [ $test_cnt -gt 1 ]; then
+ echo "," >> $jsonreport
+ fi
+ test_report=tmp.report.$test_name.json
+ cat $test_report >> $jsonreport
+ rm -f $test_report
+ rm -f $test_result
+done
+
+date +%s > tmp.end-time
+elapsed=$((`cat tmp.end-time` - `cat tmp.start-time`))
+gen_report_entry_fini $report.entry
+gen_report_entry_fini_json $jsonreport
+gen_report_summary $report.summary
+gen_report_summary_json $jsonreport
+gen_report_bottom $report.bottom
+gen_report_bottom_json $jsonreport
+cat $report.top $report.summary $report.entry $report.bottom > $report
+
+echo "summary: test/pass/fail/ignore: $test_cnt/$pass_cnt/$fail_cnt/$ignore_cnt"
+if [ $fail_cnt -eq 0 ]; then
+ echo "SUCCESS"
+ exit 0
+else
+ echo "FAILURE"
+ exit 1
+fi
diff --git a/vespalib/src/vespa/vespalib/text/.gitignore b/vespalib/src/vespa/vespalib/text/.gitignore
new file mode 100644
index 00000000000..ee8938b6bf4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/.gitignore
@@ -0,0 +1,6 @@
+*.So
+*.exe
+*.ilk
+*.pdb
+.depend*
+Makefile
diff --git a/vespalib/src/vespa/vespalib/text/CMakeLists.txt b/vespalib/src/vespa/vespalib/text/CMakeLists.txt
new file mode 100644
index 00000000000..3c91e2c1649
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_text OBJECT
+ SOURCES
+ lowercase.cpp
+ stringtokenizer.cpp
+ utf8.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/text/lowercase.cpp b/vespalib/src/vespa/vespalib/text/lowercase.cpp
new file mode 100644
index 00000000000..62e2491005b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/lowercase.cpp
@@ -0,0 +1,681 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <assert.h>
+#include "lowercase.h"
+#include <vespa/vespalib/text/utf8.h>
+
+#include <vespa/log/log.h>
+LOG_SETUP(".vespalib.lowercase");
+
+namespace vespalib {
+
+vespalib::string
+LowerCase::convert(const vespalib::stringref& input)
+{
+ vespalib::string output;
+ Utf8Reader r(input);
+ Utf8Writer w(output);
+
+ while (r.hasMore()) {
+ uint32_t lower = r.getChar();
+ uint32_t upper = convert(lower);
+ w.putChar(upper);
+ }
+ return output;
+}
+
+
+/*
+ NOTE: the tables below are generated from Java code to
+ make sure they agree with Java's notion of lowercasing
+ AND libyell's notions as well. We may have to hack around
+ to support more than one simultaneous locale later, but
+ from reading JDK7 implementation this only matters for
+ a very few languages.
+*/
+
+unsigned char
+LowerCase::lowercase_0_block[256] = {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 215,
+ 248, 249, 250, 251, 252, 253, 254, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247,
+ 248, 249, 250, 251, 252, 253, 254, 255
+};
+
+
+uint32_t
+LowerCase::lowercase_1_block[256] = {
+ 257, 257, 259, 259, 261, 261, 263, 263,
+ 265, 265, 267, 267, 269, 269, 271, 271,
+ 273, 273, 275, 275, 277, 277, 279, 279,
+ 281, 281, 283, 283, 285, 285, 287, 287,
+ 289, 289, 291, 291, 293, 293, 295, 295,
+ 297, 297, 299, 299, 301, 301, 303, 303,
+ 105, 305, 306, 307, 309, 309, 311, 311,
+ 312, 314, 314, 316, 316, 318, 318, 319,
+ 320, 322, 322, 324, 324, 326, 326, 328,
+ 328, 329, 331, 331, 333, 333, 335, 335,
+ 337, 337, 339, 339, 341, 341, 343, 343,
+ 345, 345, 347, 347, 349, 349, 351, 351,
+ 353, 353, 355, 355, 357, 357, 359, 359,
+ 361, 361, 363, 363, 365, 365, 367, 367,
+ 369, 369, 371, 371, 373, 373, 375, 375,
+ 255, 378, 378, 380, 380, 382, 382, 383,
+ 384, 595, 387, 387, 389, 389, 596, 392,
+ 392, 598, 599, 396, 396, 397, 477, 601,
+ 603, 402, 402, 608, 611, 405, 617, 616,
+ 409, 409, 410, 411, 623, 626, 414, 629,
+ 417, 417, 419, 419, 421, 421, 640, 424,
+ 424, 643, 426, 427, 429, 429, 648, 432,
+ 432, 650, 651, 436, 436, 438, 438, 658,
+ 441, 441, 442, 443, 445, 445, 446, 447,
+ 448, 449, 450, 451, 452, 453, 454, 455,
+ 456, 457, 458, 459, 460, 462, 462, 464,
+ 464, 466, 466, 468, 468, 470, 470, 472,
+ 472, 474, 474, 476, 476, 477, 479, 479,
+ 481, 481, 483, 483, 485, 485, 487, 487,
+ 489, 489, 491, 491, 493, 493, 495, 495,
+ 496, 497, 498, 499, 501, 501, 405, 447,
+ 505, 505, 507, 507, 509, 509, 511, 511
+};
+
+
+uint32_t
+LowerCase::lowercase_2_block[256] = {
+ 513, 513, 515, 515, 517, 517, 519, 519,
+ 521, 521, 523, 523, 525, 525, 527, 527,
+ 529, 529, 531, 531, 533, 533, 535, 535,
+ 537, 537, 539, 539, 541, 541, 543, 543,
+ 414, 545, 547, 547, 549, 549, 551, 551,
+ 553, 553, 555, 555, 557, 557, 559, 559,
+ 561, 561, 563, 563, 564, 565, 566, 567,
+ 568, 569, 11365, 572, 572, 410, 11366, 575,
+ 576, 578, 578, 384, 649, 652, 583, 583,
+ 585, 585, 587, 587, 589, 589, 591, 591,
+ 592, 593, 594, 595, 596, 597, 598, 599,
+ 600, 601, 602, 603, 604, 605, 606, 607,
+ 608, 609, 610, 611, 612, 613, 614, 615,
+ 616, 617, 618, 619, 620, 621, 622, 623,
+ 624, 625, 626, 627, 628, 629, 630, 631,
+ 632, 633, 634, 635, 636, 637, 638, 639,
+ 640, 641, 642, 643, 644, 645, 646, 647,
+ 648, 649, 650, 651, 652, 653, 654, 655,
+ 656, 657, 658, 659, 660, 661, 662, 663,
+ 664, 665, 666, 667, 668, 669, 670, 671,
+ 672, 673, 674, 675, 676, 677, 678, 679,
+ 680, 681, 682, 683, 684, 685, 686, 687,
+ 688, 689, 690, 691, 692, 693, 694, 695,
+ 696, 697, 698, 699, 700, 701, 702, 703,
+ 704, 705, 706, 707, 708, 709, 710, 711,
+ 712, 713, 714, 715, 716, 717, 718, 719,
+ 720, 721, 722, 723, 724, 725, 726, 727,
+ 728, 729, 730, 731, 732, 733, 734, 735,
+ 736, 737, 738, 739, 740, 741, 742, 743,
+ 744, 745, 746, 747, 748, 749, 750, 751,
+ 752, 753, 754, 755, 756, 757, 758, 759,
+ 760, 761, 762, 763, 764, 765, 766, 767
+};
+
+
+uint32_t
+LowerCase::lowercase_3_block[256] = {
+ 768, 769, 770, 771, 772, 773, 774, 775,
+ 776, 777, 778, 779, 780, 781, 782, 783,
+ 784, 785, 786, 787, 788, 789, 790, 791,
+ 792, 793, 794, 795, 796, 797, 798, 799,
+ 800, 801, 802, 803, 804, 805, 806, 807,
+ 808, 809, 810, 811, 812, 813, 814, 815,
+ 816, 817, 818, 819, 820, 821, 822, 823,
+ 824, 825, 826, 827, 828, 829, 830, 831,
+ 832, 833, 834, 835, 836, 837, 838, 839,
+ 840, 841, 842, 843, 844, 845, 846, 847,
+ 848, 849, 850, 851, 852, 853, 854, 855,
+ 856, 857, 858, 859, 860, 861, 862, 863,
+ 864, 865, 866, 867, 868, 869, 870, 871,
+ 872, 873, 874, 875, 876, 877, 878, 879,
+ 880, 881, 882, 883, 884, 885, 886, 887,
+ 888, 889, 890, 891, 892, 893, 894, 895,
+ 896, 897, 898, 899, 900, 901, 940, 903,
+ 941, 942, 943, 907, 972, 909, 973, 974,
+ 912, 945, 946, 947, 948, 949, 950, 951,
+ 952, 953, 954, 955, 956, 957, 958, 959,
+ 960, 961, 930, 963, 964, 965, 966, 967,
+ 968, 969, 970, 971, 940, 941, 942, 943,
+ 944, 945, 946, 947, 948, 949, 950, 951,
+ 952, 953, 954, 955, 956, 957, 958, 959,
+ 960, 961, 962, 963, 964, 965, 966, 967,
+ 968, 969, 970, 971, 972, 973, 974, 975,
+ 976, 977, 978, 979, 980, 981, 982, 983,
+ 985, 985, 987, 987, 989, 989, 991, 991,
+ 993, 993, 995, 995, 997, 997, 999, 999,
+ 1001, 1001, 1003, 1003, 1005, 1005, 1007, 1007,
+ 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1016,
+ 1016, 1017, 1019, 1019, 1020, 891, 892, 893
+};
+
+
+uint32_t
+LowerCase::lowercase_4_block[256] = {
+ 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
+ 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
+ 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079,
+ 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087,
+ 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,
+ 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103,
+ 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079,
+ 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087,
+ 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,
+ 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103,
+ 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
+ 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
+ 1121, 1121, 1123, 1123, 1125, 1125, 1127, 1127,
+ 1129, 1129, 1131, 1131, 1133, 1133, 1135, 1135,
+ 1137, 1137, 1139, 1139, 1141, 1141, 1143, 1143,
+ 1145, 1145, 1147, 1147, 1149, 1149, 1151, 1151,
+ 1153, 1153, 1154, 1155, 1156, 1157, 1158, 1159,
+ 1160, 1161, 1163, 1163, 1165, 1165, 1167, 1167,
+ 1169, 1169, 1171, 1171, 1173, 1173, 1175, 1175,
+ 1177, 1177, 1179, 1179, 1181, 1181, 1183, 1183,
+ 1185, 1185, 1187, 1187, 1189, 1189, 1191, 1191,
+ 1193, 1193, 1195, 1195, 1197, 1197, 1199, 1199,
+ 1201, 1201, 1203, 1203, 1205, 1205, 1207, 1207,
+ 1209, 1209, 1211, 1211, 1213, 1213, 1215, 1215,
+ 1231, 1218, 1218, 1220, 1220, 1222, 1222, 1224,
+ 1224, 1226, 1226, 1228, 1228, 1230, 1230, 1231,
+ 1233, 1233, 1235, 1235, 1237, 1237, 1239, 1239,
+ 1241, 1241, 1243, 1243, 1245, 1245, 1247, 1247,
+ 1249, 1249, 1251, 1251, 1253, 1253, 1255, 1255,
+ 1257, 1257, 1259, 1259, 1261, 1261, 1263, 1263,
+ 1265, 1265, 1267, 1267, 1269, 1269, 1271, 1271,
+ 1273, 1273, 1275, 1275, 1277, 1277, 1279, 1279
+};
+
+
+uint32_t
+LowerCase::lowercase_5_block[256] = {
+ 1281, 1281, 1283, 1283, 1285, 1285, 1287, 1287,
+ 1289, 1289, 1291, 1291, 1293, 1293, 1295, 1295,
+ 1297, 1297, 1299, 1299, 1300, 1301, 1302, 1303,
+ 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311,
+ 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319,
+ 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327,
+ 1328, 1377, 1378, 1379, 1380, 1381, 1382, 1383,
+ 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391,
+ 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,
+ 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407,
+ 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1367,
+ 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375,
+ 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383,
+ 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391,
+ 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,
+ 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407,
+ 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415,
+ 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423,
+ 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431,
+ 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439,
+ 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447,
+ 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455,
+ 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463,
+ 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471,
+ 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479,
+ 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487,
+ 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495,
+ 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503,
+ 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511,
+ 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519,
+ 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527,
+ 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535
+};
+
+
+uint32_t
+LowerCase::lowercase_16_block[256] = {
+ 4096, 4097, 4098, 4099, 4100, 4101, 4102, 4103,
+ 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111,
+ 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119,
+ 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127,
+ 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135,
+ 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143,
+ 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151,
+ 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159,
+ 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167,
+ 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175,
+ 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183,
+ 4184, 4185, 4186, 4187, 4188, 4189, 4190, 4191,
+ 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199,
+ 4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207,
+ 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215,
+ 4216, 4217, 4218, 4219, 4220, 4221, 4222, 4223,
+ 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231,
+ 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239,
+ 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247,
+ 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255,
+ 11520, 11521, 11522, 11523, 11524, 11525, 11526, 11527,
+ 11528, 11529, 11530, 11531, 11532, 11533, 11534, 11535,
+ 11536, 11537, 11538, 11539, 11540, 11541, 11542, 11543,
+ 11544, 11545, 11546, 11547, 11548, 11549, 11550, 11551,
+ 11552, 11553, 11554, 11555, 11556, 11557, 4294, 4295,
+ 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303,
+ 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311,
+ 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319,
+ 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327,
+ 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335,
+ 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343,
+ 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351
+};
+
+
+uint32_t
+LowerCase::lowercase_30_block[256] = {
+ 7681, 7681, 7683, 7683, 7685, 7685, 7687, 7687,
+ 7689, 7689, 7691, 7691, 7693, 7693, 7695, 7695,
+ 7697, 7697, 7699, 7699, 7701, 7701, 7703, 7703,
+ 7705, 7705, 7707, 7707, 7709, 7709, 7711, 7711,
+ 7713, 7713, 7715, 7715, 7717, 7717, 7719, 7719,
+ 7721, 7721, 7723, 7723, 7725, 7725, 7727, 7727,
+ 7729, 7729, 7731, 7731, 7733, 7733, 7735, 7735,
+ 7737, 7737, 7739, 7739, 7741, 7741, 7743, 7743,
+ 7745, 7745, 7747, 7747, 7749, 7749, 7751, 7751,
+ 7753, 7753, 7755, 7755, 7757, 7757, 7759, 7759,
+ 7761, 7761, 7763, 7763, 7765, 7765, 7767, 7767,
+ 7769, 7769, 7771, 7771, 7773, 7773, 7775, 7775,
+ 7777, 7777, 7779, 7779, 7781, 7781, 7783, 7783,
+ 7785, 7785, 7787, 7787, 7789, 7789, 7791, 7791,
+ 7793, 7793, 7795, 7795, 7797, 7797, 7799, 7799,
+ 7801, 7801, 7803, 7803, 7805, 7805, 7807, 7807,
+ 7809, 7809, 7811, 7811, 7813, 7813, 7815, 7815,
+ 7817, 7817, 7819, 7819, 7821, 7821, 7823, 7823,
+ 7825, 7825, 7827, 7827, 7829, 7829, 7830, 7831,
+ 7832, 7833, 7834, 7835, 7836, 7837, 7838, 7839,
+ 7841, 7841, 7843, 7843, 7845, 7845, 7847, 7847,
+ 7849, 7849, 7851, 7851, 7853, 7853, 7855, 7855,
+ 7857, 7857, 7859, 7859, 7861, 7861, 7863, 7863,
+ 7865, 7865, 7867, 7867, 7869, 7869, 7871, 7871,
+ 7873, 7873, 7875, 7875, 7877, 7877, 7879, 7879,
+ 7881, 7881, 7883, 7883, 7885, 7885, 7887, 7887,
+ 7889, 7889, 7891, 7891, 7893, 7893, 7895, 7895,
+ 7897, 7897, 7899, 7899, 7901, 7901, 7903, 7903,
+ 7905, 7905, 7907, 7907, 7909, 7909, 7911, 7911,
+ 7913, 7913, 7915, 7915, 7917, 7917, 7919, 7919,
+ 7921, 7921, 7923, 7923, 7925, 7925, 7927, 7927,
+ 7929, 7929, 7930, 7931, 7932, 7933, 7934, 7935
+};
+
+
+uint32_t
+LowerCase::lowercase_31_block[256] = {
+ 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943,
+ 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943,
+ 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959,
+ 7952, 7953, 7954, 7955, 7956, 7957, 7966, 7967,
+ 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975,
+ 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975,
+ 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991,
+ 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991,
+ 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007,
+ 8000, 8001, 8002, 8003, 8004, 8005, 8014, 8015,
+ 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023,
+ 8024, 8017, 8026, 8019, 8028, 8021, 8030, 8023,
+ 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039,
+ 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039,
+ 8048, 8049, 8050, 8051, 8052, 8053, 8054, 8055,
+ 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063,
+ 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071,
+ 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071,
+ 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087,
+ 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087,
+ 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103,
+ 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103,
+ 8112, 8113, 8114, 8115, 8116, 8117, 8118, 8119,
+ 8112, 8113, 8048, 8123, 8115, 8125, 8126, 8127,
+ 8128, 8129, 8130, 8131, 8132, 8133, 8134, 8135,
+ 8050, 8137, 8052, 8139, 8131, 8141, 8142, 8143,
+ 8144, 8145, 8146, 8147, 8148, 8149, 8150, 8151,
+ 8144, 8145, 8054, 8155, 8156, 8157, 8158, 8159,
+ 8160, 8161, 8162, 8163, 8164, 8165, 8166, 8167,
+ 8160, 8161, 8058, 8171, 8165, 8173, 8174, 8175,
+ 8176, 8177, 8178, 8179, 8180, 8181, 8182, 8183,
+ 8056, 8185, 8060, 8187, 8179, 8189, 8190, 8191
+};
+
+
+uint32_t
+LowerCase::lowercase_33_block[256] = {
+ 8448, 8449, 8450, 8451, 8452, 8453, 8454, 8455,
+ 8456, 8457, 8458, 8459, 8460, 8461, 8462, 8463,
+ 8464, 8465, 8466, 8467, 8468, 8469, 8470, 8471,
+ 8472, 8473, 8474, 8475, 8476, 8477, 8478, 8479,
+ 8480, 8481, 8482, 8483, 8484, 8485, 8486, 8487,
+ 8488, 8489, 8490, 8491, 8492, 8493, 8494, 8495,
+ 8496, 8497, 8526, 8499, 8500, 8501, 8502, 8503,
+ 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511,
+ 8512, 8513, 8514, 8515, 8516, 8517, 8518, 8519,
+ 8520, 8521, 8522, 8523, 8524, 8525, 8526, 8527,
+ 8528, 8529, 8530, 8531, 8532, 8533, 8534, 8535,
+ 8536, 8537, 8538, 8539, 8540, 8541, 8542, 8543,
+ 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551,
+ 8552, 8553, 8554, 8555, 8556, 8557, 8558, 8559,
+ 8560, 8561, 8562, 8563, 8564, 8565, 8566, 8567,
+ 8568, 8569, 8570, 8571, 8572, 8573, 8574, 8575,
+ 8576, 8577, 8578, 8580, 8580, 8581, 8582, 8583,
+ 8584, 8585, 8586, 8587, 8588, 8589, 8590, 8591,
+ 8592, 8593, 8594, 8595, 8596, 8597, 8598, 8599,
+ 8600, 8601, 8602, 8603, 8604, 8605, 8606, 8607,
+ 8608, 8609, 8610, 8611, 8612, 8613, 8614, 8615,
+ 8616, 8617, 8618, 8619, 8620, 8621, 8622, 8623,
+ 8624, 8625, 8626, 8627, 8628, 8629, 8630, 8631,
+ 8632, 8633, 8634, 8635, 8636, 8637, 8638, 8639,
+ 8640, 8641, 8642, 8643, 8644, 8645, 8646, 8647,
+ 8648, 8649, 8650, 8651, 8652, 8653, 8654, 8655,
+ 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663,
+ 8664, 8665, 8666, 8667, 8668, 8669, 8670, 8671,
+ 8672, 8673, 8674, 8675, 8676, 8677, 8678, 8679,
+ 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8687,
+ 8688, 8689, 8690, 8691, 8692, 8693, 8694, 8695,
+ 8696, 8697, 8698, 8699, 8700, 8701, 8702, 8703
+};
+
+
+uint32_t
+LowerCase::lowercase_44_block[256] = {
+ 11312, 11313, 11314, 11315, 11316, 11317, 11318, 11319,
+ 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327,
+ 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335,
+ 11336, 11337, 11338, 11339, 11340, 11341, 11342, 11343,
+ 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351,
+ 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11311,
+ 11312, 11313, 11314, 11315, 11316, 11317, 11318, 11319,
+ 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327,
+ 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335,
+ 11336, 11337, 11338, 11339, 11340, 11341, 11342, 11343,
+ 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351,
+ 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11359,
+ 11361, 11361, 619, 7549, 637, 11365, 11366, 11368,
+ 11368, 11370, 11370, 11372, 11372, 11373, 11374, 11375,
+ 11376, 11377, 11378, 11379, 11380, 11382, 11382, 11383,
+ 11384, 11385, 11386, 11387, 11388, 11389, 11390, 11391,
+ 11393, 11393, 11395, 11395, 11397, 11397, 11399, 11399,
+ 11401, 11401, 11403, 11403, 11405, 11405, 11407, 11407,
+ 11409, 11409, 11411, 11411, 11413, 11413, 11415, 11415,
+ 11417, 11417, 11419, 11419, 11421, 11421, 11423, 11423,
+ 11425, 11425, 11427, 11427, 11429, 11429, 11431, 11431,
+ 11433, 11433, 11435, 11435, 11437, 11437, 11439, 11439,
+ 11441, 11441, 11443, 11443, 11445, 11445, 11447, 11447,
+ 11449, 11449, 11451, 11451, 11453, 11453, 11455, 11455,
+ 11457, 11457, 11459, 11459, 11461, 11461, 11463, 11463,
+ 11465, 11465, 11467, 11467, 11469, 11469, 11471, 11471,
+ 11473, 11473, 11475, 11475, 11477, 11477, 11479, 11479,
+ 11481, 11481, 11483, 11483, 11485, 11485, 11487, 11487,
+ 11489, 11489, 11491, 11491, 11492, 11493, 11494, 11495,
+ 11496, 11497, 11498, 11499, 11500, 11501, 11502, 11503,
+ 11504, 11505, 11506, 11507, 11508, 11509, 11510, 11511,
+ 11512, 11513, 11514, 11515, 11516, 11517, 11518, 11519
+};
+
+
+uint32_t
+LowerCase::lowercase_260_block[256] = {
+ 66600, 66601, 66602, 66603, 66604, 66605, 66606, 66607,
+ 66608, 66609, 66610, 66611, 66612, 66613, 66614, 66615,
+ 66616, 66617, 66618, 66619, 66620, 66621, 66622, 66623,
+ 66624, 66625, 66626, 66627, 66628, 66629, 66630, 66631,
+ 66632, 66633, 66634, 66635, 66636, 66637, 66638, 66639,
+ 66600, 66601, 66602, 66603, 66604, 66605, 66606, 66607,
+ 66608, 66609, 66610, 66611, 66612, 66613, 66614, 66615,
+ 66616, 66617, 66618, 66619, 66620, 66621, 66622, 66623,
+ 66624, 66625, 66626, 66627, 66628, 66629, 66630, 66631,
+ 66632, 66633, 66634, 66635, 66636, 66637, 66638, 66639,
+ 66640, 66641, 66642, 66643, 66644, 66645, 66646, 66647,
+ 66648, 66649, 66650, 66651, 66652, 66653, 66654, 66655,
+ 66656, 66657, 66658, 66659, 66660, 66661, 66662, 66663,
+ 66664, 66665, 66666, 66667, 66668, 66669, 66670, 66671,
+ 66672, 66673, 66674, 66675, 66676, 66677, 66678, 66679,
+ 66680, 66681, 66682, 66683, 66684, 66685, 66686, 66687,
+ 66688, 66689, 66690, 66691, 66692, 66693, 66694, 66695,
+ 66696, 66697, 66698, 66699, 66700, 66701, 66702, 66703,
+ 66704, 66705, 66706, 66707, 66708, 66709, 66710, 66711,
+ 66712, 66713, 66714, 66715, 66716, 66717, 66718, 66719,
+ 66720, 66721, 66722, 66723, 66724, 66725, 66726, 66727,
+ 66728, 66729, 66730, 66731, 66732, 66733, 66734, 66735,
+ 66736, 66737, 66738, 66739, 66740, 66741, 66742, 66743,
+ 66744, 66745, 66746, 66747, 66748, 66749, 66750, 66751,
+ 66752, 66753, 66754, 66755, 66756, 66757, 66758, 66759,
+ 66760, 66761, 66762, 66763, 66764, 66765, 66766, 66767,
+ 66768, 66769, 66770, 66771, 66772, 66773, 66774, 66775,
+ 66776, 66777, 66778, 66779, 66780, 66781, 66782, 66783,
+ 66784, 66785, 66786, 66787, 66788, 66789, 66790, 66791,
+ 66792, 66793, 66794, 66795, 66796, 66797, 66798, 66799,
+ 66800, 66801, 66802, 66803, 66804, 66805, 66806, 66807,
+ 66808, 66809, 66810, 66811, 66812, 66813, 66814, 66815
+};
+
+// special performance hack:
+// concatenation of blocks 0,1,2,3,4,5
+
+uint32_t
+LowerCase::lowercase_0_5_blocks[0x600] = {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 215,
+ 248, 249, 250, 251, 252, 253, 254, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247,
+ 248, 249, 250, 251, 252, 253, 254, 255,
+ 257, 257, 259, 259, 261, 261, 263, 263,
+ 265, 265, 267, 267, 269, 269, 271, 271,
+ 273, 273, 275, 275, 277, 277, 279, 279,
+ 281, 281, 283, 283, 285, 285, 287, 287,
+ 289, 289, 291, 291, 293, 293, 295, 295,
+ 297, 297, 299, 299, 301, 301, 303, 303,
+ 105, 305, 306, 307, 309, 309, 311, 311,
+ 312, 314, 314, 316, 316, 318, 318, 319,
+ 320, 322, 322, 324, 324, 326, 326, 328,
+ 328, 329, 331, 331, 333, 333, 335, 335,
+ 337, 337, 339, 339, 341, 341, 343, 343,
+ 345, 345, 347, 347, 349, 349, 351, 351,
+ 353, 353, 355, 355, 357, 357, 359, 359,
+ 361, 361, 363, 363, 365, 365, 367, 367,
+ 369, 369, 371, 371, 373, 373, 375, 375,
+ 255, 378, 378, 380, 380, 382, 382, 383,
+ 384, 595, 387, 387, 389, 389, 596, 392,
+ 392, 598, 599, 396, 396, 397, 477, 601,
+ 603, 402, 402, 608, 611, 405, 617, 616,
+ 409, 409, 410, 411, 623, 626, 414, 629,
+ 417, 417, 419, 419, 421, 421, 640, 424,
+ 424, 643, 426, 427, 429, 429, 648, 432,
+ 432, 650, 651, 436, 436, 438, 438, 658,
+ 441, 441, 442, 443, 445, 445, 446, 447,
+ 448, 449, 450, 451, 452, 453, 454, 455,
+ 456, 457, 458, 459, 460, 462, 462, 464,
+ 464, 466, 466, 468, 468, 470, 470, 472,
+ 472, 474, 474, 476, 476, 477, 479, 479,
+ 481, 481, 483, 483, 485, 485, 487, 487,
+ 489, 489, 491, 491, 493, 493, 495, 495,
+ 496, 497, 498, 499, 501, 501, 405, 447,
+ 505, 505, 507, 507, 509, 509, 511, 511,
+ 513, 513, 515, 515, 517, 517, 519, 519,
+ 521, 521, 523, 523, 525, 525, 527, 527,
+ 529, 529, 531, 531, 533, 533, 535, 535,
+ 537, 537, 539, 539, 541, 541, 543, 543,
+ 414, 545, 547, 547, 549, 549, 551, 551,
+ 553, 553, 555, 555, 557, 557, 559, 559,
+ 561, 561, 563, 563, 564, 565, 566, 567,
+ 568, 569, 11365, 572, 572, 410, 11366, 575,
+ 576, 578, 578, 384, 649, 652, 583, 583,
+ 585, 585, 587, 587, 589, 589, 591, 591,
+ 592, 593, 594, 595, 596, 597, 598, 599,
+ 600, 601, 602, 603, 604, 605, 606, 607,
+ 608, 609, 610, 611, 612, 613, 614, 615,
+ 616, 617, 618, 619, 620, 621, 622, 623,
+ 624, 625, 626, 627, 628, 629, 630, 631,
+ 632, 633, 634, 635, 636, 637, 638, 639,
+ 640, 641, 642, 643, 644, 645, 646, 647,
+ 648, 649, 650, 651, 652, 653, 654, 655,
+ 656, 657, 658, 659, 660, 661, 662, 663,
+ 664, 665, 666, 667, 668, 669, 670, 671,
+ 672, 673, 674, 675, 676, 677, 678, 679,
+ 680, 681, 682, 683, 684, 685, 686, 687,
+ 688, 689, 690, 691, 692, 693, 694, 695,
+ 696, 697, 698, 699, 700, 701, 702, 703,
+ 704, 705, 706, 707, 708, 709, 710, 711,
+ 712, 713, 714, 715, 716, 717, 718, 719,
+ 720, 721, 722, 723, 724, 725, 726, 727,
+ 728, 729, 730, 731, 732, 733, 734, 735,
+ 736, 737, 738, 739, 740, 741, 742, 743,
+ 744, 745, 746, 747, 748, 749, 750, 751,
+ 752, 753, 754, 755, 756, 757, 758, 759,
+ 760, 761, 762, 763, 764, 765, 766, 767,
+ 768, 769, 770, 771, 772, 773, 774, 775,
+ 776, 777, 778, 779, 780, 781, 782, 783,
+ 784, 785, 786, 787, 788, 789, 790, 791,
+ 792, 793, 794, 795, 796, 797, 798, 799,
+ 800, 801, 802, 803, 804, 805, 806, 807,
+ 808, 809, 810, 811, 812, 813, 814, 815,
+ 816, 817, 818, 819, 820, 821, 822, 823,
+ 824, 825, 826, 827, 828, 829, 830, 831,
+ 832, 833, 834, 835, 836, 837, 838, 839,
+ 840, 841, 842, 843, 844, 845, 846, 847,
+ 848, 849, 850, 851, 852, 853, 854, 855,
+ 856, 857, 858, 859, 860, 861, 862, 863,
+ 864, 865, 866, 867, 868, 869, 870, 871,
+ 872, 873, 874, 875, 876, 877, 878, 879,
+ 880, 881, 882, 883, 884, 885, 886, 887,
+ 888, 889, 890, 891, 892, 893, 894, 895,
+ 896, 897, 898, 899, 900, 901, 940, 903,
+ 941, 942, 943, 907, 972, 909, 973, 974,
+ 912, 945, 946, 947, 948, 949, 950, 951,
+ 952, 953, 954, 955, 956, 957, 958, 959,
+ 960, 961, 930, 963, 964, 965, 966, 967,
+ 968, 969, 970, 971, 940, 941, 942, 943,
+ 944, 945, 946, 947, 948, 949, 950, 951,
+ 952, 953, 954, 955, 956, 957, 958, 959,
+ 960, 961, 962, 963, 964, 965, 966, 967,
+ 968, 969, 970, 971, 972, 973, 974, 975,
+ 976, 977, 978, 979, 980, 981, 982, 983,
+ 985, 985, 987, 987, 989, 989, 991, 991,
+ 993, 993, 995, 995, 997, 997, 999, 999,
+ 1001, 1001, 1003, 1003, 1005, 1005, 1007, 1007,
+ 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1016,
+ 1016, 1017, 1019, 1019, 1020, 891, 892, 893,
+ 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
+ 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
+ 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079,
+ 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087,
+ 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,
+ 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103,
+ 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079,
+ 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087,
+ 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,
+ 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103,
+ 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
+ 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
+ 1121, 1121, 1123, 1123, 1125, 1125, 1127, 1127,
+ 1129, 1129, 1131, 1131, 1133, 1133, 1135, 1135,
+ 1137, 1137, 1139, 1139, 1141, 1141, 1143, 1143,
+ 1145, 1145, 1147, 1147, 1149, 1149, 1151, 1151,
+ 1153, 1153, 1154, 1155, 1156, 1157, 1158, 1159,
+ 1160, 1161, 1163, 1163, 1165, 1165, 1167, 1167,
+ 1169, 1169, 1171, 1171, 1173, 1173, 1175, 1175,
+ 1177, 1177, 1179, 1179, 1181, 1181, 1183, 1183,
+ 1185, 1185, 1187, 1187, 1189, 1189, 1191, 1191,
+ 1193, 1193, 1195, 1195, 1197, 1197, 1199, 1199,
+ 1201, 1201, 1203, 1203, 1205, 1205, 1207, 1207,
+ 1209, 1209, 1211, 1211, 1213, 1213, 1215, 1215,
+ 1231, 1218, 1218, 1220, 1220, 1222, 1222, 1224,
+ 1224, 1226, 1226, 1228, 1228, 1230, 1230, 1231,
+ 1233, 1233, 1235, 1235, 1237, 1237, 1239, 1239,
+ 1241, 1241, 1243, 1243, 1245, 1245, 1247, 1247,
+ 1249, 1249, 1251, 1251, 1253, 1253, 1255, 1255,
+ 1257, 1257, 1259, 1259, 1261, 1261, 1263, 1263,
+ 1265, 1265, 1267, 1267, 1269, 1269, 1271, 1271,
+ 1273, 1273, 1275, 1275, 1277, 1277, 1279, 1279,
+ 1281, 1281, 1283, 1283, 1285, 1285, 1287, 1287,
+ 1289, 1289, 1291, 1291, 1293, 1293, 1295, 1295,
+ 1297, 1297, 1299, 1299, 1300, 1301, 1302, 1303,
+ 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311,
+ 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319,
+ 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327,
+ 1328, 1377, 1378, 1379, 1380, 1381, 1382, 1383,
+ 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391,
+ 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,
+ 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407,
+ 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1367,
+ 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375,
+ 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383,
+ 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391,
+ 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,
+ 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407,
+ 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415,
+ 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423,
+ 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431,
+ 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439,
+ 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447,
+ 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455,
+ 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463,
+ 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471,
+ 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479,
+ 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487,
+ 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495,
+ 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503,
+ 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511,
+ 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519,
+ 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527,
+ 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535
+};
+
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/text/lowercase.h b/vespalib/src/vespa/vespalib/text/lowercase.h
new file mode 100644
index 00000000000..ddfdee06262
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/lowercase.h
@@ -0,0 +1,110 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// $Id$
+
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+/**
+ * @brief Utility class for converting UCS-4 codepoints to lowercase
+ **/
+class LowerCase
+{
+private:
+ static unsigned char lowercase_0_block[256];
+ static uint32_t lowercase_1_block[256];
+ static uint32_t lowercase_2_block[256];
+ static uint32_t lowercase_3_block[256];
+ static uint32_t lowercase_4_block[256];
+ static uint32_t lowercase_5_block[256];
+ static uint32_t lowercase_16_block[256];
+ static uint32_t lowercase_30_block[256];
+ static uint32_t lowercase_31_block[256];
+ static uint32_t lowercase_33_block[256];
+ static uint32_t lowercase_44_block[256];
+ static uint32_t lowercase_260_block[256];
+ static uint32_t lowercase_0_5_blocks[0x600];
+
+public:
+ /**
+ * lowercase a single UCS-4 character.
+ *
+ * Note that this functions expects NFKC normalized input,
+ * so if a character does not transform to itself under NFKC
+ * there will be no match in the lowercasing tables.
+ * For all input not found in the tables, the input is returned
+ * unchanged as output; this includes both genuine lowercase
+ * characters and anything where lowercasing is meaningless.
+ *
+ * @param codepoint the character codepoint to be lowercased.
+ * @return lowercase UCS-4 character (codepoint if no lowercasing is performed).
+ **/
+ static uint32_t convert(uint32_t codepoint)
+ {
+ if (codepoint < 0x100) {
+ return lowercase_0_block[codepoint];
+ } else if (codepoint < 0x600) {
+ return lowercase_0_5_blocks[codepoint];
+ } else {
+ int lowblock = codepoint >> 8;
+ unsigned char lb = codepoint & 0xFF;
+
+ /**/ if (lowblock == 16) {
+ return lowercase_16_block[lb];
+ }
+ else if (lowblock == 30) {
+ return lowercase_30_block[lb];
+ }
+ else if (lowblock == 31) {
+ return lowercase_31_block[lb];
+ }
+ else if (lowblock == 33) {
+ return lowercase_33_block[lb];
+ }
+ else if (lowblock == 44) {
+ return lowercase_44_block[lb];
+ }
+ else if (lowblock == 260) {
+ return lowercase_260_block[lb];
+ }
+ else {
+ return codepoint;
+ }
+ }
+ }
+
+ /**
+ * lowercase a single ASCII (or iso 8859-1) character
+ **/
+ static unsigned char convert(unsigned char c) {
+ return convert((uint32_t)c);
+ }
+
+ /**
+ * lowercase a single ASCII (or iso 8859-1) character
+ **/
+ static char convert(char c) {
+ return convert((unsigned char)c);
+ }
+
+ /**
+ * lowercase a single ASCII (or iso 8859-1) character
+ **/
+ static signed char convert(signed char c) {
+ return convert((unsigned char)c);
+ }
+
+ /**
+ * lowercase a string in UTF-8 format; note that this will replace
+ * any bytes that aren't valid UTF-8 with the Unicode REPLACEMENT
+ * CHARACTER (U+FFFD).
+ **/
+ static vespalib::string convert(const vespalib::stringref& input);
+};
+
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/text/stringtokenizer.cpp b/vespalib/src/vespa/vespalib/text/stringtokenizer.cpp
new file mode 100644
index 00000000000..8ce49bec213
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/stringtokenizer.cpp
@@ -0,0 +1,98 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "stringtokenizer.h"
+#include <set>
+
+namespace {
+
+class AsciiSet
+{
+public:
+ AsciiSet(const vespalib::stringref & s) {
+ memset(_set, 0, sizeof(_set));
+ for (size_t i(0), m(s.size()); i < m; i++) {
+ add(s[i]);
+ }
+ }
+ bool contains(uint8_t c) const {
+ return _set[c];
+ }
+ void add(uint8_t c) {
+ _set[c] = true;
+ }
+private:
+ // For smaller memory footprint it might be changed with using 256 bits instead.
+ bool _set[256];
+};
+
+typedef vespalib::StringTokenizer::Token Token;
+typedef vespalib::StringTokenizer::TokenList TokenList;
+
+/**
+ * strip leading and trailing sequences
+ * of characters contained in the strip set.
+ **/
+Token stripString(const vespalib::stringref & source,
+ const AsciiSet & strip)
+{
+ Token::size_type start = 0;
+ while (start < source.size() && strip.contains(source[start])) {
+ ++start;
+ }
+ Token::size_type stop = source.size();
+ while (stop > start && strip.contains(source[stop - 1])) {
+ --stop;
+ }
+ return source.substr(start, stop - start);
+}
+
+void parse(TokenList& output,
+ const vespalib::stringref & source,
+ const AsciiSet & separators,
+ const AsciiSet & strip)
+{
+ Token::size_type start = 0;
+ for(Token::size_type i = 0; i < source.size(); ++i) {
+ if (separators.contains(source[i])) {
+ output.push_back(stripString(source.substr(start, i-start), strip));
+ start = i+1;
+ }
+ }
+ output.push_back(stripString(source.substr(start), strip));
+ // Don't keep a single empty element
+ if (output.size() == 1 && output[0].size() == 0) output.pop_back();
+}
+
+} // private namespace
+
+namespace vespalib {
+
+StringTokenizer::StringTokenizer(const vespalib::stringref & source,
+ const vespalib::stringref & separators,
+ const vespalib::stringref & strip)
+ : _tokens()
+{
+ AsciiSet sep(separators);
+ AsciiSet str(strip);
+ parse(_tokens, source, sep, str);
+}
+
+void StringTokenizer::removeEmptyTokens()
+{
+ size_t emptyCount(0);
+ for (TokenList::const_iterator it = _tokens.begin(); it != _tokens.end(); ++it) {
+ if (it->empty()) emptyCount++;
+ }
+ if (emptyCount == 0) {
+ return;
+ }
+ TokenList tokenlist;
+ tokenlist.reserve(_tokens.size() - emptyCount);
+ for (TokenList::const_iterator it = _tokens.begin(); it != _tokens.end(); ++it) {
+ if (!it->empty()) tokenlist.push_back(*it);
+ }
+ _tokens.swap(tokenlist);
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/text/stringtokenizer.h b/vespalib/src/vespa/vespalib/text/stringtokenizer.h
new file mode 100644
index 00000000000..365a26a6487
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/stringtokenizer.h
@@ -0,0 +1,68 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @version $Id$
+ * @author Haakon Humberset
+ * @date 2005-09-23
+ *
+ * @brief String tokenizer with a C++ approach.
+ *
+ * Uses vespalib::string and common C++ functions. Gives a simple interface
+ * to a string tokenizer, not necessarily the most efficient one.
+ *
+ * @class vespalib::StringTokenizer
+ */
+
+#pragma once
+
+#include <vector>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+class StringTokenizer {
+public:
+ typedef vespalib::stringref Token;
+ typedef std::vector<Token> TokenList;
+ typedef TokenList::const_iterator Iterator;
+
+ /**
+ * @brief Split source on separators with optional trim.
+ *
+ * Take the source string and split on each occurrence
+ * of a character contained in seperators.
+ * From the resulting tokens, remove leading and
+ * trailing sequences of characters in the strip set.
+ * As a special case, if the input contains only one
+ * token and that token is empty (or empty after
+ * removal of strip characters) the result is an empty
+ * token list.
+ *
+ * @param source The input string to be tokenized
+ * @param separators The characters to be used as token separators
+ * @param strip Characters to be stripped from both ends of each token
+ **/
+ StringTokenizer(const vespalib::stringref & source,
+ const vespalib::stringref & separators = ",",
+ const vespalib::stringref & strip = " \t\f\r\n");
+
+ /** Remove any empty tokens from the token list */
+ void removeEmptyTokens();
+
+ /** How many tokens is in the current token list? */
+ unsigned int size() const { return _tokens.size(); }
+
+ /** Access a token from the current token list */
+ const Token & operator[](unsigned int index) const
+ { return _tokens[index]; }
+
+ Iterator begin() const { return _tokens.begin(); }
+ Iterator end() const { return _tokens.end(); }
+
+ /** Access the entire token list */
+ const TokenList & getTokens() const { return _tokens; }
+
+private:
+ TokenList _tokens;
+};
+}
+
diff --git a/vespalib/src/vespa/vespalib/text/utf8.cpp b/vespalib/src/vespa/vespalib/text/utf8.cpp
new file mode 100644
index 00000000000..686e52c6dcd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/utf8.cpp
@@ -0,0 +1,233 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <assert.h>
+#include "utf8.h"
+#include <vespa/vespalib/util/vstringfmt.h>
+
+#include <vespa/log/log.h>
+LOG_SETUP(".vespalib.utf8");
+
+namespace vespalib {
+
+void Utf8::throwX(const char *msg, unsigned int number)
+{
+ vespalib::string what = make_vespa_string("%s: \\x%02X", msg, number);
+ throw IllegalArgumentException(what);
+}
+
+uint32_t Utf8Reader::getComplexChar(unsigned char firstbyte, uint32_t fallback)
+{
+ if (_pos == size()) {
+ // this shouldn't happen ...
+ LOG(warning, "last byte %02X of Utf8Reader block was incomplete UTF-8",
+ firstbyte);
+ return fallback;
+ }
+ assert(hasMore()); // should never fall out of range
+ if (! Utf8::validFirstByte(firstbyte)) {
+ LOG(debug, "invalid first byte %02X in Utf8Reader data block",
+ firstbyte);
+ return fallback;
+ }
+ int need = Utf8::numContBytes(firstbyte);
+ assert(need > 0);
+ assert(need < 4);
+
+ if (_pos + need > size()) {
+ LOG(debug, "incomplete data (first byte %02X, pos=%zu, need=%d, size=%zu) in Utf8Reader data block",
+ firstbyte, _pos, need, size());
+ return fallback;
+ }
+
+ if (need == 1) {
+ unsigned char contbyte = (*this)[_pos];
+ if (Utf8::validContByte(contbyte)) {
+ ++_pos;
+ uint32_t r = decode2(firstbyte, contbyte);
+ // check > 0x7F ?
+ return r;
+ } else {
+ LOG(debug, "invalid continuation byte %02X in Utf8Reader data block",
+ contbyte);
+ return fallback;
+ }
+ }
+
+ if (need == 2) {
+ unsigned char contbyte1 = (*this)[_pos];
+ unsigned char contbyte2 = (*this)[_pos+1];
+ if (Utf8::validContByte(contbyte1) &&
+ Utf8::validContByte(contbyte2))
+ {
+ _pos += 2;
+ uint32_t r = decode3(firstbyte, contbyte1, contbyte2);
+ if (r >= first_high_surrogate && r <= last_low_surrogate) {
+ // surrogates not valid in utf8
+ return fallback;
+ }
+ // check > 0x7FF ?
+ return r;
+ } else {
+ LOG(debug, "invalid continuation bytes %02X/%02X in Utf8Reader data block",
+ contbyte1, contbyte2);
+ return fallback;
+ }
+ }
+ assert(need == 3);
+
+ unsigned char contbyte1 = (*this)[_pos];
+ unsigned char contbyte2 = (*this)[_pos+1];
+ unsigned char contbyte3 = (*this)[_pos+2];
+ if (Utf8::validContByte(contbyte1) &&
+ Utf8::validContByte(contbyte2) &&
+ Utf8::validContByte(contbyte3))
+ {
+ _pos += 3;
+ // check > 0xFFFF?
+ return decode4(firstbyte, contbyte1, contbyte2, contbyte3);
+ } else {
+ LOG(debug, "invalid continuation bytes %02X/%02X/%02X in Utf8Reader data block",
+ contbyte1, contbyte2, contbyte3);
+ return fallback;
+ }
+}
+
+
+uint32_t
+Utf8ReaderForZTS::getComplexChar(unsigned char firstbyte, uint32_t fallback)
+{
+ if (! Utf8::validFirstByte(firstbyte)) {
+ LOG(debug, "invalid first byte %02X in Utf8Reader data block",
+ firstbyte);
+ return fallback;
+ }
+ int need = Utf8::numContBytes(firstbyte);
+ assert(need > 0);
+ assert(need < 4);
+
+ if (need == 1) {
+ if (_p[0] == 0) {
+ LOG(debug, "incomplete character (first byte %02X) in Utf8ReaderZTS",
+ firstbyte);
+ return fallback;
+ }
+ unsigned char contbyte = _p[0];
+ if (Utf8::validContByte(contbyte)) {
+ _p += 1;
+ uint32_t r = decode2(firstbyte, contbyte);
+ // check > 0x7F ?
+ return r;
+ } else {
+ LOG(debug, "invalid continuation byte %02X in Utf8Reader data block",
+ contbyte);
+ return fallback;
+ }
+ }
+
+ if (need == 2) {
+ if (_p[0] == 0 || _p[1] == 0) {
+ LOG(debug, "incomplete character (first byte %02X) in Utf8ReaderZTS",
+ firstbyte);
+ return fallback;
+ }
+ unsigned char contbyte1 = _p[0];
+ unsigned char contbyte2 = _p[1];
+ if (Utf8::validContByte(contbyte1) &&
+ Utf8::validContByte(contbyte2))
+ {
+ _p += 2;
+ uint32_t r = decode3(firstbyte, contbyte1, contbyte2);
+ if (r >= first_high_surrogate && r <= last_low_surrogate) {
+ // surrogates not valid in utf8
+ return fallback;
+ }
+ // check > 0x7FF ?
+ return r;
+ } else {
+ LOG(debug, "invalid continuation bytes %02X/%02X in Utf8Reader data block",
+ contbyte1, contbyte2);
+ return fallback;
+ }
+ }
+ assert(need == 3);
+
+ if (_p[0] == 0 || _p[1] == 0 || _p[2] == 0) {
+ LOG(debug, "incomplete character (first byte %02X) in Utf8ReaderZTS",
+ firstbyte);
+ return fallback;
+ }
+ unsigned char contbyte1 = _p[0];
+ unsigned char contbyte2 = _p[1];
+ unsigned char contbyte3 = _p[2];
+ if (Utf8::validContByte(contbyte1) &&
+ Utf8::validContByte(contbyte2) &&
+ Utf8::validContByte(contbyte3))
+ {
+ _p += 3;
+ // check > 0xFFFF?
+ return decode4(firstbyte, contbyte1, contbyte2, contbyte3);
+ } else {
+ LOG(debug, "invalid continuation bytes %02X/%02X/%02X in Utf8Reader data block",
+ contbyte1, contbyte2, contbyte3);
+ return fallback;
+ }
+}
+
+
+Utf8Writer&
+Utf8Writer::putChar(uint32_t codepoint)
+{
+ if (codepoint < 0x80) {
+ _target.push_back((char)codepoint);
+ } else if (codepoint < 0x800) {
+ char low6 = (codepoint & low_6bits_mask);
+ low6 |= 0x80;
+ codepoint >>= 6;
+ char first5 = codepoint;
+ first5 |= 0xC0;
+ _target.push_back(first5);
+ _target.push_back(low6);
+ } else if (codepoint < 0x10000) {
+ char low6 = (codepoint & low_6bits_mask);
+ low6 |= 0x80;
+
+ codepoint >>= 6;
+ char mid6 = (codepoint & low_6bits_mask);
+ mid6 |= 0x80;
+
+ codepoint >>= 6;
+ char first4 = codepoint;
+ first4 |= 0xE0;
+
+ _target.push_back(first4);
+ _target.push_back(mid6);
+ _target.push_back(low6);
+ } else if (codepoint < 0x110000) {
+ char low6 = (codepoint & low_6bits_mask);
+ low6 |= 0x80;
+
+ codepoint >>= 6;
+ char mid6 = (codepoint & low_6bits_mask);
+ mid6 |= 0x80;
+
+ codepoint >>= 6;
+ char hi6 = (codepoint & low_6bits_mask);
+ hi6 |= 0x80;
+
+ codepoint >>= 6;
+ char first3 = codepoint;
+ first3 |= 0xF0;
+
+ _target.push_back(first3);
+ _target.push_back(hi6);
+ _target.push_back(mid6);
+ _target.push_back(low6);
+ } else {
+ Utf8::throwX("invalid ucs4 codepoint", codepoint);
+ }
+ return *this;
+}
+
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/text/utf8.h b/vespalib/src/vespa/vespalib/text/utf8.h
new file mode 100644
index 00000000000..ea2468d0b86
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/text/utf8.h
@@ -0,0 +1,346 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// $Id$
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/exceptions.h>
+
+namespace vespalib {
+
+/**
+ * @brief Common utilities for reading and writing UTF-8 data
+ **/
+class Utf8
+{
+public:
+ enum {
+ /// random invalid codepoint
+ BAD = 0xBadBad,
+
+ /// unicode standard replacement
+ REPLACEMENT_CHAR = 0xFFFD,
+
+ /// old fastlib "bad utf8" replacement
+ FASTLIB_BadUTF8Char = 0xfffffffeU,
+
+ /// old fastlib "EOF" escape char
+ FASTLIB_EOF = 0xffffffffU
+ };
+
+ /**
+ * check if a byte is valid as the first byte of an UTF-8 character.
+ * @param c the byte to be checked
+ * @return true if a valid UTF-8 character can start with this byte
+ **/
+ static bool validFirstByte(unsigned char c) {
+ return (c < 0x80 ||
+ (c > 0xC1 && c < 0xF5));
+ }
+
+ /**
+ * return the number of continuation bytes needed to complete
+ * an UTF-8 character starting with the given first byte.
+ * @param c the first byte (must pass validFirstByte check)
+ * @return 0, 1, 2, or 3
+ **/
+ static int numContBytes(unsigned char c) {
+ if (c < 0x80) return 0;
+ if (c > 0xC1 && c < 0xE0) return 1;
+ if (c > 0xDF && c < 0xF0) return 2;
+ if (c > 0xEF && c < 0xF5) return 3;
+ throwX("invalid first byte of UTF8 sequence", c);
+ }
+
+ /**
+ * check if a byte is valid as a non-first byte of an UTF-8 character.
+ * @param c the byte to be checked
+ * @return true if a valid UTF-8 character can contain this byte
+ **/
+ static bool validContByte(unsigned char c) {
+ return (c > 0x7F && c < 0xC0);
+ }
+
+
+ /**
+ * decode a 2-byte UTF-8 character. NOTE: assumes that checks
+ * are already done, so the following should hold:
+ * validFirstByte(firstbyte) == true
+ * numContBytes(firstbyte) == 1
+ * validContByte(contbyte) == true
+ * Also, there is no check for non-normalized UTF-8 here.
+ *
+ * @param firstbyte first byte in this UTF-8 character
+ * @param contbyte second byte in this UTF-8 character
+ * @return decoded UCS-4 codepoint in range [0, 0x7FF]
+ **/
+ static uint32_t decode2(unsigned char firstbyte,
+ unsigned char contbyte)
+ {
+ uint32_t r = (firstbyte & low_5bits_mask);
+ r <<= 6;
+ r |= (contbyte & low_6bits_mask);
+ return r;
+ }
+
+
+ /**
+ * decode a 3-byte UTF-8 character. NOTE: assumes that checks
+ * are already done, so the following should hold:
+ * validFirstByte(firstbyte) == true
+ * numContBytes(firstbyte) == 2
+ * validContByte(contbyte1) == true
+ * validContByte(contbyte2) == true
+ * Also, there is no check for non-normalized UTF-8 here.
+ *
+ * @param firstbyte first byte in this UTF-8 character
+ * @param contbyte1 second byte in this UTF-8 character
+ * @param contbyte2 third byte in this UTF-8 character
+ * @return decoded UCS-4 codepoint in range [0, 0xFFFF]
+ **/
+ static uint32_t decode3(unsigned char firstbyte,
+ unsigned char contbyte1,
+ unsigned char contbyte2)
+ {
+ uint32_t r = (firstbyte & low_4bits_mask);
+ r <<= 6;
+ r |= (contbyte1 & low_6bits_mask);
+ r <<= 6;
+ r |= (contbyte2 & low_6bits_mask);
+ return r;
+ }
+
+
+ /**
+ * decode a 4-byte UTF-8 character. NOTE: assumes that checks
+ * are already done, so the following should hold:
+ * validFirstByte(firstbyte) == true
+ * numContBytes(firstbyte) == 3
+ * validContByte(contbyte1) == true
+ * validContByte(contbyte2) == true
+ * validContByte(contbyte3) == true
+ * Also, there is no check for non-normalized UTF-8 here.
+ *
+ * @param firstbyte first byte in this UTF-8 character
+ * @param contbyte1 second byte in this UTF-8 character
+ * @param contbyte2 third byte in this UTF-8 character
+ * @param contbyte3 fourth byte in this UTF-8 character
+ * @return decoded UCS-4 codepoint in range [0, 0x1FFFFF]
+ **/
+ static uint32_t decode4(unsigned char firstbyte,
+ unsigned char contbyte1,
+ unsigned char contbyte2,
+ unsigned char contbyte3)
+ {
+ uint32_t r = (firstbyte & low_3bits_mask);
+ r <<= 6;
+ r |= (contbyte1 & low_6bits_mask);
+ r <<= 6;
+ r |= (contbyte2 & low_6bits_mask);
+ r <<= 6;
+ r |= (contbyte3 & low_6bits_mask);
+ return r;
+ }
+
+protected:
+
+ static void throwX(const char *msg, unsigned int number)
+ __attribute__((__noreturn__));
+
+ enum {
+ low_7bits_mask = 0x7F,
+ low_6bits_mask = 0x3F,
+ low_5bits_mask = 0x1F,
+ low_4bits_mask = 0x0F,
+ low_3bits_mask = 0x07,
+ first_high_surrogate = 0xD800,
+ last_high_surrogate = 0xDBFF,
+ first_low_surrogate = 0xDC00,
+ last_low_surrogate = 0xDCFF
+ };
+};
+
+
+/**
+ * @brief Reader class that wraps a block of data to get UTF-8 characters from
+ **/
+class Utf8Reader
+ : public Utf8, private stringref
+{
+private:
+ size_type _pos;
+
+ uint32_t getComplexChar(unsigned char firstbyte, uint32_t fallback);
+public:
+
+ /**
+ * Construct a reader for the given block of data
+ * @param input data to read UTF-8 from (can be read-only)
+ **/
+ Utf8Reader(const stringref &input)
+ : stringref(input), _pos(0)
+ {}
+
+ /**
+ * Construct a reader for the given block of data
+ * @param start pointer to the start of the block
+ * @param sz size of the block in bytes
+ **/
+ Utf8Reader(const char *start, size_t sz)
+ : stringref(start, sz), _pos(0)
+ {}
+
+ /**
+ * check if the buffer has more data.
+ * @return true if there is more data
+ **/
+ bool hasMore() const { return _pos < size(); }
+
+ /**
+ * Decode the UTF-8 character at the current position.
+ * NOTE: for performance reasons this won't check
+ * that there is more data available, but just assumes
+ * that hasMore() would return true.
+ * @param fallback the value to return if invalid UTF-8 is found
+ * @return a valid UCS-4 codepoint (or the fallback value)
+ **/
+ uint32_t getChar(uint32_t fallback) {
+ unsigned char firstbyte = (*this)[_pos++]; // always steps at least 1 position
+ if (firstbyte < 0x80) {
+ return firstbyte;
+ } else {
+ return getComplexChar(firstbyte, fallback);
+ }
+ }
+
+ /**
+ * Decode the UTF-8 character at the current position.
+ *
+ * NOTE: for performance reasons this won't check
+ * that there is more data available, but just assumes
+ * that hasMore() would return true. If invalid UTF-8
+ * is found, returns the Unicode REPLACEMENT CHARACTER, see
+ * http://en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character
+ * for more details.
+ *
+ * @return a valid UCS-4 codepoint
+ **/
+ uint32_t getChar() { return getChar(Utf8::REPLACEMENT_CHAR); }
+
+ /**
+ * obtain the current byte offset position
+ * @return position in bytes
+ **/
+ size_type getPos() const { return _pos; }
+};
+
+
+/**
+ * @brief Reader class that wraps a zero-terminated string it gets UTF-8 characters from
+ *
+ * If at all possible, rewrite your code to use Utf8Reader instead.
+ **/
+class Utf8ReaderForZTS
+ : public Utf8
+{
+private:
+ const char * &_p;
+ uint32_t getComplexChar(unsigned char firstbyte, uint32_t fallback);
+public:
+
+ /**
+ * Construct a reader for the given block of data.
+ *
+ * NOTE: the pointer argument is taken by reference
+ * and will be modified in-place, stepping forward
+ * for each character you read until it reaches
+ * the zero termination.
+ *
+ * @param start pointer to the start of the block
+ **/
+ Utf8ReaderForZTS(const char * &start)
+ : _p(start)
+ {}
+
+ /**
+ * check if the buffer has more data.
+ * @return true if there is more data
+ **/
+ bool hasMore() const {
+ return (*_p) != '\0';
+ }
+
+ /**
+ * Decode the UTF-8 character at the current position.
+ * NOTE: for performance reasons this won't check
+ * that there is more data available, but just assumes
+ * that hasMore() would return true.
+ * @param fallback the value to return if invalid UTF-8 is found
+ * @return a valid UCS-4 codepoint (or the fallback value)
+ **/
+ uint32_t getChar(uint32_t fallback) {
+ unsigned char firstbyte = *_p++; // always steps at least 1 position
+ if (firstbyte < 0x80) {
+ return firstbyte;
+ } else {
+ return getComplexChar(firstbyte, fallback);
+ }
+ }
+
+ /**
+ * Decode the UTF-8 character at the current position.
+ *
+ * NOTE: for performance reasons this won't check
+ * that there is more data available, but just assumes
+ * that hasMore() would return true. If invalid UTF-8
+ * is found, returns the Unicode REPLACEMENT CHARACTER, see
+ * http://en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character
+ * for more details.
+ *
+ * @return a valid UCS-4 codepoint
+ **/
+ uint32_t getChar() { return getChar(Utf8::REPLACEMENT_CHAR); }
+
+ /**
+ * count the number of UCS-4 characters will be returned when
+ * reading UTF-8 from the given zero-terminated string; like
+ * "strlen" does not count the zero termination, but bytes
+ * that aren't valid UTF-8 will count as one character each.
+ **/
+ static size_t countChars(const char *p) {
+ Utf8ReaderForZTS reader(p);
+ size_t i;
+ for (i = 0; reader.hasMore(); ++i) {
+ reader.getChar();
+ }
+ return i;
+ }
+
+};
+
+
+/**
+ * @brief Writer class that appends UTF-8 characters to a string
+ **/
+class Utf8Writer : public Utf8
+{
+ string &_target;
+public:
+ /**
+ * construct a writer appending to the given string
+ * @param target a reference to a vespalib::string
+ * that the writer will append to. Must be writable
+ * and must be kept alive while the writer is active.
+ **/
+ Utf8Writer(string &target) : _target(target) {}
+
+ /**
+ * append the given character to the target string.
+ * @param codepoint valid UCS-4 codepoint
+ **/
+ Utf8Writer& putChar(uint32_t codepoint);
+};
+
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/trace/CMakeLists.txt b/vespalib/src/vespa/vespalib/trace/CMakeLists.txt
new file mode 100644
index 00000000000..d114ed4d953
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/trace/CMakeLists.txt
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_trace OBJECT
+ SOURCES
+ trace.cpp
+ tracenode.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/trace/trace.cpp b/vespalib/src/vespa/vespalib/trace/trace.cpp
new file mode 100644
index 00000000000..02f4402def2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/trace/trace.cpp
@@ -0,0 +1,68 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/trace/trace.h>
+
+#include <algorithm>
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+#include <vespa/vespalib/util/vstringfmt.h>
+
+LOG_SETUP(".trace");
+
+namespace vespalib {
+
+Trace::Trace() :
+ _level(0),
+ _root()
+{
+ // empty
+}
+
+Trace::Trace(uint32_t level) :
+ _level(level),
+ _root()
+{
+ // empty
+}
+
+Trace &
+Trace::clear()
+{
+ _level = 0;
+ _root.clear();
+ return *this;
+}
+
+Trace &
+Trace::swap(Trace &other)
+{
+ std::swap(_level, other._level);
+ _root.swap(other._root);
+ return *this;
+}
+
+Trace &
+Trace::setLevel(uint32_t level)
+{
+ _level = std::min(level, 9u);
+ return *this;
+}
+
+bool
+Trace::trace(uint32_t level, const string &note, bool addTime)
+{
+ if (!shouldTrace(level)) {
+ return false;
+ }
+ if (addTime) {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ _root.addChild(vespalib::make_vespa_string(
+ "[%ld.%06ld] %s", tv.tv_sec, tv.tv_usec, note.c_str()));
+ } else {
+ _root.addChild(note);
+ }
+ return true;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/trace/trace.h b/vespalib/src/vespa/vespalib/trace/trace.h
new file mode 100644
index 00000000000..493f2b931b7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/trace/trace.h
@@ -0,0 +1,125 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include "tracenode.h"
+
+namespace vespalib {
+
+/**
+ * A Trace object contains ad-hoc string notes organized in a strict-loose
+ * tree. A Trace object consists of a trace level indicating which trace notes
+ * should be included and a TraceTree object containing the tree structure and
+ * collecting the trace information. Tracing is used to collect debug
+ * information about a Routable traveling through the system. The trace level
+ * is in the range [0,9]. 0 means no tracing, and 9 means all tracing is
+ * enabled. A client that has the ability to trace information will have a
+ * predefined level attached to that information. If the level on the
+ * information is lower or equal to the level set in the Trace object, the
+ * information will be traced.
+ */
+class Trace {
+private:
+ uint32_t _level;
+ TraceNode _root;
+
+public:
+
+ /**
+ * Create an empty Trace with level set to 0 (no tracing)
+ */
+ Trace();
+
+ /**
+ * Create an empty trace with given level.
+ *
+ * @param level Level to set.
+ */
+ explicit Trace(uint32_t level);
+
+ /**
+ * Remove all trace information and set the trace level to 0.
+ *
+ * @return This, to allow chaining.
+ */
+ Trace &clear();
+
+ /**
+ * Swap the internals of this with another.
+ *
+ * @param other The trace to swap internals with.
+ * @return This, to allow chaining.
+ */
+ Trace &swap(Trace &other);
+
+ /**
+ * Set the trace level. 0 means no tracing, 9 means enable all tracing.
+ *
+ * @param level The level to set.
+ * @return This, to allow chaining.
+ */
+ Trace &setLevel(uint32_t level);
+
+ /**
+ * Returns the trace level.
+ *
+ * @return The trace level.
+ */
+ uint32_t getLevel() const { return _level; }
+
+ /**
+ * Check if information with the given level should be traced. This method
+ * is added to allow clients to check if something should be traced before
+ * spending time building up the trace information itself.
+ *
+ * @param level The trace level to test.
+ * @return True if tracing is enabled for the given level, false otherwise.
+ */
+ bool shouldTrace(uint32_t level) const { return level <= _level; }
+
+ /**
+ * Add the given note to the trace information if tracing is enabled for
+ * the given level. If the addTime parameter is true, then the note is
+ * prefixed with the current time. This is the default behaviour when
+ * ommiting this parameter.
+ *
+ * @param level The trace level of the note.
+ * @param note The note to add.
+ * @param addTime Whether or not to prefix note with a timestamp.
+ * @return True if the note was added to the trace information, false
+ * otherwise.
+ */
+ bool trace(uint32_t level, const string &note, bool addTime = true);
+
+ /**
+ * Returns the root of the trace tree.
+ *
+ * @return The root.
+ */
+ TraceNode &getRoot() { return _root; }
+
+ /**
+ * Returns a const reference to the root of the trace tree.
+ *
+ * @return The root.
+ */
+ const TraceNode &getRoot() const { return _root; }
+
+ /**
+ * Returns a string representation of the contained trace tree. This is a
+ * readable, non-parseable string.
+ *
+ * @return Readable trace string.
+ */
+ string toString() const { return _root.toString(31337); }
+};
+
+#define VESPALIB_TRACE2(ttrace, level, note, addTime) \
+ if (ttrace.shouldTrace(level)) { \
+ ttrace.trace(level, note, addTime); \
+ }
+
+#define VESPALIB_TRACE(trace, level, note) \
+ VESPALIB_TRACE2(trace, level, note, true)
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/trace/tracelevel.h b/vespalib/src/vespa/vespalib/trace/tracelevel.h
new file mode 100644
index 00000000000..aa3c6e51631
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/trace/tracelevel.h
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+namespace vespalib {
+
+/**
+ * This class defines the {@link Trace} levels used by the tracing code.
+ */
+class TraceLevel {
+private:
+ TraceLevel(); // hide
+
+public:
+ enum {
+ // The trace level used for tracing whenever an Error is added to a
+ // Reply.
+ ERROR = 1,
+
+ // The trace level used by messagebus when sending and receiving
+ // messages and replies on network level.
+ SEND_RECEIVE = 4,
+
+ // The trace level used by messagebus when splitting messages and
+ // merging replies.
+ SPLIT_MERGE = 5,
+
+ // The trace level used by messagebus to trace information about which
+ // internal components are processing a routable.
+ COMPONENT = 6
+ };
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/trace/tracenode.cpp b/vespalib/src/vespa/vespalib/trace/tracenode.cpp
new file mode 100644
index 00000000000..2a98a14882a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/trace/tracenode.cpp
@@ -0,0 +1,362 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/trace/tracenode.h>
+#include <vespa/vespalib/trace/tracevisitor.h>
+
+#include <algorithm>
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+
+LOG_SETUP(".tracenode");
+
+namespace vespalib {
+
+namespace {
+
+struct Cmp {
+ bool operator()(const vespalib::TraceNode &lhs,
+ const vespalib::TraceNode &rhs)
+ {
+ if (lhs.isLeaf() || rhs.isLeaf()) {
+ if (lhs.isLeaf() && rhs.isLeaf()) {
+ return (lhs.getNote() < rhs.getNote());
+ } else {
+ return lhs.isLeaf();
+ }
+ }
+ if (lhs.getNumChildren() != rhs.getNumChildren()) {
+ return lhs.getNumChildren() < rhs.getNumChildren();
+ }
+ for (uint32_t i = 0, len = lhs.getNumChildren(); i < len; ++i) {
+ bool aLess = operator()(lhs.getChild(i), rhs.getChild(i));
+ bool bLess = operator()(rhs.getChild(i), lhs.getChild(i));
+ if (aLess || bLess) {
+ return aLess;
+ }
+ }
+ return false;
+ }
+};
+
+} // namespace <unnamed>
+
+
+TraceNode::TraceNode() :
+ _parent(NULL),
+ _strict(true),
+ _hasNote(false),
+ _note(""),
+ _children(),
+ _timestamp(0)
+{
+ // empty
+}
+
+TraceNode::TraceNode(const TraceNode &rhs) :
+ _parent(NULL),
+ _strict(rhs._strict),
+ _hasNote(rhs._hasNote),
+ _note(rhs._note),
+ _children(),
+ _timestamp(rhs._timestamp)
+{
+ addChildren(rhs._children);
+}
+
+TraceNode::TraceNode(const string &note, int64_t timestamp) :
+ _parent(NULL),
+ _strict(true),
+ _hasNote(true),
+ _note(note),
+ _children(),
+ _timestamp(timestamp)
+{
+ // empty
+}
+
+TraceNode::TraceNode(int64_t timestamp) :
+ _parent(NULL),
+ _strict(true),
+ _hasNote(false),
+ _note(""),
+ _children(),
+ _timestamp(timestamp)
+{
+ // empty
+}
+
+TraceNode &
+TraceNode::swap(TraceNode &other)
+{
+ std::swap(_parent, other._parent);
+ std::swap(_strict, other._strict);
+ std::swap(_hasNote, other._hasNote);
+ _note.swap(other._note);
+ _children.swap(other._children);
+ for (std::vector<TraceNode>::iterator it = _children.begin();
+ it != _children.end(); ++it)
+ {
+ it->_parent = this;
+ }
+ for (std::vector<TraceNode>::iterator it = other._children.begin();
+ it != other._children.end(); ++it)
+ {
+ it->_parent = &other;
+ }
+ std::swap(_timestamp, other._timestamp);
+ return *this;
+}
+
+TraceNode &
+TraceNode::clear()
+{
+ _parent = NULL;
+ _strict = true;
+ _hasNote = false;
+ _note.clear();
+ _children.clear();
+ _timestamp = 0;
+ return *this;
+}
+
+TraceNode &
+TraceNode::sort()
+{
+ if (!isLeaf()) {
+ for (std::vector<TraceNode>::iterator it = _children.begin();
+ it != _children.end(); ++it)
+ {
+ it->sort();
+ }
+ if (!isStrict()) {
+ std::sort(_children.begin(), _children.end(), Cmp());
+ }
+ }
+ return *this;
+}
+
+TraceNode &
+TraceNode::compact()
+{
+ if (isLeaf()) {
+ return *this;
+ }
+ std::vector<TraceNode> tmp;
+ tmp.swap(_children);
+ for (std::vector<TraceNode>::iterator it = tmp.begin();
+ it != tmp.end(); ++it)
+ {
+ TraceNode &child = *it;
+ child.compact();
+ if (child.isEmpty()) {
+ // ignore
+ } else if (child.isLeaf()) {
+ addChild(*it);
+ } else if (_strict == child._strict) {
+ addChildren(child._children);
+ } else if (child.getNumChildren() == 1) {
+ const TraceNode &grandChild = child.getChild(0);
+ if (grandChild.isEmpty()) {
+ // ignore
+ } else if (grandChild.isLeaf() || _strict != grandChild._strict) {
+ addChild(grandChild);
+ } else {
+ addChildren(grandChild._children);
+ }
+ } else {
+ addChild(*it);
+ }
+ }
+ return *this;
+}
+
+TraceNode &
+TraceNode::normalize()
+{
+ compact();
+ sort();
+ if (_hasNote || !_strict) {
+ TraceNode child;
+ child.swap(*this);
+ addChild(child);
+ _strict = true;
+ }
+ return *this;
+}
+
+TraceNode &
+TraceNode::addChild(const string &note)
+{
+ return addChild(TraceNode(note, 0));
+}
+
+TraceNode &
+TraceNode::addChild(const string &note, int64_t timestamp)
+{
+ return addChild(TraceNode(note, timestamp));
+}
+
+TraceNode &
+TraceNode::addChild(const TraceNode &child)
+{
+ LOG_ASSERT(!_hasNote);
+ _children.push_back(child);
+ _children.back()._parent = this;
+ return *this;
+}
+
+TraceNode &
+TraceNode::addChildren(const std::vector<TraceNode> &children)
+{
+ for (std::vector<TraceNode>::const_iterator it = children.begin();
+ it != children.end(); ++it)
+ {
+ addChild(*it);
+ }
+ return *this;
+}
+
+string
+TraceNode::toString(size_t limit) const
+{
+ string str;
+ if (!writeString(str, 0, limit)) {
+ str.append("...\n");
+ }
+ return str;
+}
+
+bool
+TraceNode::writeString(string &dst, size_t indent, size_t limit) const
+{
+ if (dst.size() >= limit) {
+ return false;
+ }
+ string pre(indent, ' ');
+ if (_hasNote) {
+ dst.append(pre).append(_note).append("\n");
+ return true;
+ }
+ string name = isStrict() ? "trace" : "fork";
+ dst.append(pre).append("<").append(name).append(">\n");
+ for (std::vector<TraceNode>::const_iterator it = _children.begin();
+ it != _children.end(); ++it)
+ {
+ if (!it->writeString(dst, indent + 4, limit)) {
+ return false;
+ }
+ }
+ if (dst.size() >= limit) {
+ return false;
+ }
+ dst.append(pre).append("</").append(name).append(">\n");
+ return true;
+}
+
+string
+TraceNode::encode() const
+{
+ string ret = "";
+ if (_hasNote) {
+ ret.append("[");
+ for (uint32_t i = 0, len = _note.size(); i < len; ++i) {
+ char c = _note[i];
+ if (c == '\\' || c == ']') {
+ ret.append("\\");
+ }
+ ret += c;
+ }
+ ret.append("]");
+ } else {
+ ret.append(_strict ? "(" : "{");
+ for (std::vector<TraceNode>::const_iterator it = _children.begin();
+ it != _children.end(); ++it)
+ {
+ ret.append(it->encode());
+ }
+ ret.append(_strict ? ")" : "}");
+ }
+ return ret;
+}
+
+TraceNode
+TraceNode::decode(const string &str)
+{
+ if (str.empty()) {
+ return TraceNode();
+ }
+ TraceNode proxy;
+ TraceNode *node = &proxy;
+ string note = "";
+ bool inNote = false, inEscape = false;
+ for (uint32_t i = 0, len = str.size(); i < len; ++i) {
+ char c = str[i];
+ if (inNote) {
+ if (inEscape) {
+ note += c;
+ inEscape = false;
+ } else if (c == '\\') {
+ inEscape = true;
+ } else if (c == ']') {
+ node->addChild(note);
+ note.clear();
+ inNote = false;
+ } else {
+ note += c;
+ }
+ } else {
+ if (c == '[') {
+ inNote = true;
+ } else if (c == '(' || c == '{') {
+ node->addChild(TraceNode());
+ node = &node->_children.back();
+ node->setStrict(c == '(');
+ } else if (c == ')' || c == '}') {
+ if (node == NULL) {
+ LOG(warning, "Unexpected closing brace in trace '%s' at "
+ "position %d.", str.c_str(), i);
+ return TraceNode();
+ }
+ if (node->isStrict() != (c == ')')) {
+ LOG(warning, "Mismatched closing brace in trace '%s' at "
+ "position %d.", str.c_str(), i);
+ return TraceNode();
+ }
+ node = node->_parent;
+ }
+ }
+ }
+ if (inNote) {
+ LOG(warning, "Unterminated note in trace '%s'.", str.c_str());
+ return TraceNode();
+ }
+ if (node != &proxy) {
+ LOG(warning, "Missing closing brace in trace '%s'.", str.c_str());
+ return TraceNode();
+ }
+ if (proxy.getNumChildren() == 0) {
+ LOG(warning, "No nodes found in trace '%s'.", str.c_str());
+ return TraceNode();
+ }
+ if (proxy.getNumChildren() > 1) {
+ return proxy; // best-effort recovery from malformed input
+ }
+ return proxy.getChild(0);
+}
+
+TraceVisitor &
+TraceNode::accept(TraceVisitor & visitor) const
+{
+ visitor.visit(*this);
+ if (_children.empty()) {
+ return visitor;
+ }
+ visitor.entering(*this);
+ for (auto it(_children.begin()), mt(_children.end()); it != mt; it++) {
+ it->accept(visitor);
+ }
+ visitor.leaving(*this);
+ return visitor;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/trace/tracenode.h b/vespalib/src/vespa/vespalib/trace/tracenode.h
new file mode 100644
index 00000000000..d3b193b0c9f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/trace/tracenode.h
@@ -0,0 +1,253 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vector>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+struct TraceVisitor;
+
+/**
+ * This class contains the actual trace information of a {@link Trace} object.
+ * A trace node can be encoded to, and decoded from a string representation to
+ * allow transport across the network. Each node contains a list of children, a
+ * strictness flag and an optional note. The child list is what forms the trace
+ * tree, the strictness flag dictates whether or not the ordering of the
+ * children is important, and the note is the actual traced data.
+ *
+ * The most important feature to notice is the {@link #normalize()} method that
+ * will compact, sort and 'rootify' the trace tree so that trees become
+ * well-formed (and can be compared for equality).
+ */
+class TraceNode {
+private:
+ TraceNode *_parent;
+ bool _strict;
+ bool _hasNote;
+ string _note;
+ std::vector<TraceNode> _children;
+ int64_t _timestamp;
+
+public:
+ /**
+ * Create an empty trace tree.
+ */
+ TraceNode();
+
+ /**
+ * Create a leaf node with the given note and timestamp.
+ * @param note The note for this node.
+ * @param timestamp The timestamp to give to node.
+ */
+ explicit TraceNode(const string &note, int64_t timestamp);
+
+ /**
+ * Create a leaf node with no note and a time stamp.
+ * @param timestamp The timestamp to give to node.
+ */
+ explicit TraceNode(int64_t timestamp);
+
+ /**
+ * Create a trace tree which is a copy of another.
+ *
+ * @param rhs The tree to copy.
+ */
+ TraceNode(const TraceNode &rhs);
+
+ /**
+ * Swap the internals of this tree with another.
+ *
+ * @param other The tree to swap internals with.
+ * @return This, to allow chaining.
+ */
+ TraceNode &swap(TraceNode &t);
+
+ /**
+ * Remove all trace information from this tree.
+ *
+ * @return This, to allow chaining.
+ */
+ TraceNode &clear();
+
+ /**
+ * Sort non-strict children recursively down the tree.
+ *
+ * @return This, to allow chaining.
+ */
+ TraceNode &sort();
+
+ /**
+ * Compact this tree. This will reduce the height of this tree as much as
+ * possible without removing information stored in it.
+ *
+ * @return This, to allow chaining.
+ */
+ TraceNode &compact();
+
+ /**
+ * Normalize this tree. This will transform all equivalent trees into the
+ * same form. Note that this will also perform an implicit compaction of
+ * the tree.
+ *
+ * @return This, to allow chaining.
+ */
+ TraceNode &normalize();
+
+ /**
+ * Check whether or not this is a root node.
+ *
+ * @return True if this has no parent.
+ */
+ bool isRoot() const { return _parent == NULL; }
+
+ /**
+ * Check whether or not this is a leaf node.
+ *
+ * @return True if this has no children.
+ */
+ bool isLeaf() const { return _children.empty(); }
+
+ /**
+ * Check whether or not this node is empty, i.e. it has no note and no
+ * children.
+ *
+ * @return True if this node is empty.
+ */
+ bool isEmpty() const { return !_hasNote && _children.empty(); }
+
+ /**
+ * Check whether or not the children of this node are strictly ordered.
+ *
+ * @return True if this node is strict.
+ */
+ bool isStrict() const { return _strict; }
+
+ /**
+ * Sets whether or not the children of this node are strictly ordered.
+ *
+ * @param strict True to order children strictly.
+ * @return This, to allow chaining.
+ */
+ TraceNode &setStrict(bool strict) { _strict = strict; return *this; }
+
+ /**
+ * Returns whether or not a note is assigned to this node.
+ *
+ * @return True if a note is assigned.
+ */
+ bool hasNote() const { return _hasNote; }
+
+ /**
+ * Returns the note assigned to this node.
+ *
+ * @return The note.
+ */
+ const string & getNote() const { return _note; }
+
+ /**
+ * Returns the timestamp assigned to this node.
+ *
+ * @return The timestamp.
+ */
+ int64_t getTimestamp() const { return _timestamp; }
+
+
+ /**
+ * Returns the number of child nodes of this.
+ *
+ * @return The number of children.
+ */
+ uint32_t getNumChildren() const { return _children.size(); }
+
+ /**
+ * Returns the child trace node at the given index.
+ *
+ * @param i The index of the child to return.
+ * @return The child at the given index.
+ */
+ const TraceNode &getChild(uint32_t i) const { return _children[i]; }
+
+ /**
+ * Convenience method to add a child node containing a note to this.
+ * A timestamp of 0 will be assigned to the new node.
+ *
+ * @param note The note to assign to the child.
+ * @return This, to allow chaining.
+ */
+ TraceNode &addChild(const string &note);
+
+ /**
+ * Convenience method to add a child node containing a note to this and a timestamp.
+ *
+ * @param note The note to assign to the child.
+ * @param timestamp The timestamp to give this child.
+ * @return This, to allow chaining.
+ */
+ TraceNode &addChild(const string &note, int64_t timestamp);
+
+ /**
+ * Adds a child node to this.
+ *
+ * @param child The child to add.
+ * @return This, to allow chaining.
+ */
+ TraceNode &addChild(const TraceNode &child);
+
+ /**
+ * Adds a list of child nodes to this.
+ *
+ * @param children The children to add.
+ * @return This, to allow chaining.
+ */
+ TraceNode &addChildren(const std::vector<TraceNode> &children);
+
+ /**
+ * Generate a non-parseable, human-readable string representation of
+ * this trace node.
+ *
+ * @return generated string
+ * @param limit soft cap for maximum size of generated string
+ **/
+ string toString(size_t limit = -1) const;
+
+ /**
+ * Writes a non-parseable, human-readable string representation of
+ * this trace node to the given string.
+ *
+ * @return false if string was capped, true otherwise
+ * @param dst output string
+ * @param indent number of spaces to be used for indent
+ * @param limit soft cap for maximum size of generated string
+ **/
+ bool writeString(string &dst, size_t indent, size_t limit) const;
+
+ /**
+ * Returns a parseable (using {@link #decode(String)}) string
+ * representation of this trace node.
+ *
+ * @return A string representation of this tree.
+ */
+ string encode() const;
+
+ /**
+ * Build a trace tree from the given string representation (possibly
+ * encoded using {@link #encode()}).
+ *
+ * @param str The string to parse.
+ * @return The corresponding trace tree, or an empty node if parsing failed.
+ */
+ static TraceNode decode(const string &str);
+
+ /**
+ * Visits this TraceNode and all of its descendants in depth-first, prefix order.
+ *
+ * @param visitor The visitor to accept.
+ * @return The visitor parameter.
+ */
+ TraceVisitor & accept(TraceVisitor & visitor) const;
+
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/trace/tracevisitor.h b/vespalib/src/vespa/vespalib/trace/tracevisitor.h
new file mode 100644
index 00000000000..ceed30a7fd0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/trace/tracevisitor.h
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vector>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+class TraceNode;
+
+/**
+ * This class is an abstract visitor of {@link TraceNode}. See {@link TraceNode#accept(TraceVisitor)}.
+ */
+struct TraceVisitor {
+ virtual ~TraceVisitor() { }
+ /**
+ * Visits a {@link TraceNode}. Called by {@link TraceNode#accept(TraceVisitor)}, before visiting its children.
+ *
+ * @param node the TraceNode being visited
+ * @see TraceNode#accept(TraceVisitor)
+ */
+ virtual void visit(const TraceNode & node) = 0;
+
+ /**
+ * Enters a {@link TraceNode}. This method is called after {@link #visit(TraceNode)}, but before visiting its children.
+ * Note that this method is NOT called if TraceNode has zero children. The default implementation of this method does nothing.
+ *
+ * @param node The TraceNode being entered
+ * @see #leaving(TraceNode)
+ */
+ virtual void entering(const TraceNode & node) { (void) node; }
+
+ /**
+ * Leaves a {@link TraceNode}. This method is called after {@link #entering(TraceNode)}, and after visiting its
+ * children. Note that this method is NOT called if TraceNode has zero children.
+ * The default implementation of this method does nothing.
+ *
+ * @param node the TraceNode being left
+ */
+ virtual void leaving(const TraceNode & node) { (void) node; }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/.gitignore b/vespalib/src/vespa/vespalib/util/.gitignore
new file mode 100644
index 00000000000..ee8938b6bf4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/.gitignore
@@ -0,0 +1,6 @@
+*.So
+*.exe
+*.ilk
+*.pdb
+.depend*
+Makefile
diff --git a/vespalib/src/vespa/vespalib/util/CMakeLists.txt b/vespalib/src/vespa/vespalib/util/CMakeLists.txt
new file mode 100644
index 00000000000..fe739b066d4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/CMakeLists.txt
@@ -0,0 +1,48 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_util OBJECT
+ SOURCES
+ active.cpp
+ alignedmemory.cpp
+ alloc.cpp
+ approx.cpp
+ atomic.cpp
+ backtrace.cpp
+ barrier.cpp
+ benchmark_timer.cpp
+ blockingthreadstackexecutor.cpp
+ box.cpp
+ compress.cpp
+ dual_merge_director.cpp
+ error.cpp
+ exception.cpp
+ exceptions.cpp
+ gencnt.cpp
+ generationhandler.cpp
+ generationholder.cpp
+ hashmap.cpp
+ host_name.cpp
+ joinable.cpp
+ left_right_heap.cpp
+ printable.cpp
+ priority_queue.cpp
+ random.cpp
+ regexp.cpp
+ runnable.cpp
+ runnable_pair.cpp
+ rwlock.cpp
+ sequence.cpp
+ sha1.cpp
+ signalhandler.cpp
+ simple_thread_bundle.cpp
+ slaveproc.cpp
+ stash.cpp
+ string_hash.cpp
+ stringfmt.cpp
+ thread.cpp
+ thread_bundle.cpp
+ threadstackexecutor.cpp
+ threadstackexecutorbase.cpp
+ time_tracker.cpp
+ valgrind.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/util/active.cpp b/vespalib/src/vespa/vespalib/util/active.cpp
new file mode 100644
index 00000000000..54fc0cdd94f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/active.cpp
@@ -0,0 +1,8 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "active.h"
+
+namespace vespalib {
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/active.h b/vespalib/src/vespa/vespalib/util/active.h
new file mode 100644
index 00000000000..e1a77040862
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/active.h
@@ -0,0 +1,37 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "joinable.h"
+
+namespace vespalib {
+
+/**
+ * Interface used to abstract entities that are the source of
+ * activity.
+ **/
+struct Active : Joinable {
+ /**
+ * Start activity.
+ **/
+ virtual void start() = 0;
+
+ /**
+ * Request that activity stops. The returned object can be used to
+ * wait for the actual conclusion of the activity.
+ *
+ * @return object that can be used to wait for activity completion
+ **/
+ virtual Joinable &stop() = 0;
+
+ // inherits documentation from Joinable
+ virtual void join() = 0;
+
+ /**
+ * Empty virtual destructor to enable subclassing.
+ **/
+ virtual ~Active() {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/alignedmemory.cpp b/vespalib/src/vespa/vespalib/util/alignedmemory.cpp
new file mode 100644
index 00000000000..bdb18b18a93
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/alignedmemory.cpp
@@ -0,0 +1,30 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "alignedmemory.h"
+#include <stdint.h>
+
+namespace vespalib {
+
+AlignedMemory::AlignedMemory(size_t size, size_t align)
+ : _alloc(size == 0 ? 0 : new char[size + ((align > 1) ? (align - 1) : 0)]),
+ _align(_alloc)
+{
+ if (align > 1) {
+ _align += (align - (((uintptr_t)_alloc) % align)) % align;
+ }
+}
+
+void
+AlignedMemory::swap(AlignedMemory &rhs)
+{
+ std::swap(_alloc, rhs._alloc);
+ std::swap(_align, rhs._align);
+}
+
+AlignedMemory::~AlignedMemory()
+{
+ delete[] _alloc;
+}
+
+} // namespace search
diff --git a/vespalib/src/vespa/vespalib/util/alignedmemory.h b/vespalib/src/vespa/vespalib/util/alignedmemory.h
new file mode 100644
index 00000000000..106f98b8389
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/alignedmemory.h
@@ -0,0 +1,71 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2009 Yahoo
+
+#pragma once
+
+#include <algorithm>
+
+namespace vespalib {
+
+/**
+ * Simple utility class used to allocate and own an aligned chunk of
+ * memory. The owned memory will be allocated with 'malloc' and will
+ * be freed using 'free' on the same pointer as was returned from
+ * 'malloc'.
+ **/
+class AlignedMemory
+{
+private:
+ char *_alloc;
+ char *_align;
+
+ AlignedMemory(const AlignedMemory &rhs);
+ AlignedMemory &operator=(const AlignedMemory &rhs);
+public:
+ /**
+ * Allocate a chunk of memory with the specified size and
+ * alignment. Specifying a zero size will make the object
+ * contain a null pointer.
+ *
+ * @param size amount of memory to allocate
+ * @param align wanted memory alignment
+ **/
+ AlignedMemory(size_t size, size_t align);
+
+ /**
+ * Get pointer to the aligned memory chunk owned by this object.
+ * @return aligned memory chunk
+ **/
+ char *get() { return _align; }
+
+ /**
+ * Get pointer to the aligned memory chunk owned by this object.
+ * @return aligned memory chunk
+ **/
+ const char *get() const { return _align; }
+
+ /**
+ * Swap the memory owned by this object with the memory owned by
+ * another object.
+ *
+ * @param rhs the other object to swap with
+ **/
+ void swap(AlignedMemory &rhs);
+
+ /**
+ * Free the memory owned by this object.
+ **/
+ ~AlignedMemory();
+};
+
+} // namespace vespalib
+
+namespace std {
+
+template <>
+inline void swap<vespalib::AlignedMemory>(vespalib::AlignedMemory &a, vespalib::AlignedMemory &b) {
+ a.swap(b);
+}
+
+} // namespace std
+
diff --git a/vespalib/src/vespa/vespalib/util/alloc.cpp b/vespalib/src/vespa/vespalib/util/alloc.cpp
new file mode 100644
index 00000000000..625f02725cc
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/alloc.cpp
@@ -0,0 +1,159 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include "alloc.h"
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include <linux/mman.h>
+#include <stdexcept>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/util/backtrace.h>
+#include <vespa/vespalib/util/sync.h>
+#include <vespa/log/log.h>
+#include <map>
+#include <atomic>
+
+LOG_SETUP(".vespalib.alloc");
+
+namespace vespalib {
+
+void * AlignedHeapAlloc::alloc(size_t sz, size_t alignment)
+{
+ if (!sz) {
+ return 0;
+ }
+ void* ptr;
+ int result = posix_memalign(&ptr, alignment, sz);
+ if (result != 0) {
+ throw IllegalArgumentException(
+ make_string("posix_memalign(%zu, %zu) failed with code %d",
+ sz, alignment, result));
+ }
+ return ptr;
+}
+
+namespace {
+
+volatile bool _G_hasHugePageFailureJustHappened(false);
+volatile int _G_HugeFlags = -1;
+volatile size_t _G_MMapLogLimit = std::numeric_limits<size_t>::max();
+volatile size_t _G_MMapNoCoreLimit = std::numeric_limits<size_t>::max();
+Lock _G_lock;
+std::atomic<size_t> _G_mmapCount(0);
+
+struct MMapInfo {
+ MMapInfo() :
+ _id(0ul),
+ _sz(0ul),
+ _stackTrace()
+ {}
+ MMapInfo(size_t id, size_t sz, const string & stackTrace) :
+ _id(id),
+ _sz(sz),
+ _stackTrace(stackTrace)
+ {}
+ size_t _id;
+ size_t _sz;
+ string _stackTrace;
+};
+typedef std::map<const void *, MMapInfo> MMapStore;
+MMapStore _G_HugeMappings;
+
+void initializeEnvironment()
+{
+ _G_HugeFlags = (getenv("VESPA_USE_HUGEPAGES") != NULL) ? MAP_HUGETLB : 0;
+ const char * mmapLogLimitStr = getenv("VESPA_MMAP_LOG_LIMIT");
+ if (mmapLogLimitStr != NULL) {
+ char * e(NULL);
+ size_t mmapLogLimit = strtoul(mmapLogLimitStr, &e, 0);
+ if ((e == 0) || (e[0] == '\0')) {
+ _G_MMapLogLimit = mmapLogLimit;
+ } else {
+ LOG(warning, "Not able to to decode VESPA_MMAP_LOG_LIMIT='%s' as number. Failed at '%s'", mmapLogLimitStr, e);
+ }
+ }
+ const char * mmapNoCoreLimitStr = getenv("VESPA_MMAP_NOCORE_LIMIT");
+ if (mmapNoCoreLimitStr != NULL) {
+ char * e(NULL);
+ size_t mmapNoCoreLimit = strtoul(mmapNoCoreLimitStr, &e, 0);
+ if ((e == 0) || (e[0] == '\0')) {
+ _G_MMapNoCoreLimit = mmapNoCoreLimit;
+ } else {
+ LOG(warning, "Not able to to decode VESPA_MMAP_NOCORE_LIMIT='%s' as number. Failed at %s", mmapNoCoreLimitStr, e);
+ }
+ }
+}
+
+size_t sum(const MMapStore & s)
+{
+ size_t sum(0);
+ for (auto & p : s) {
+ sum += p.second._sz;
+ }
+ return sum;
+}
+
+}
+void * MMapAlloc::alloc(size_t sz)
+{
+ void * buf(NULL);
+ if (sz > 0) {
+ const int flags(MAP_ANON | MAP_PRIVATE);
+ const int prot(PROT_READ | PROT_WRITE);
+ if (_G_HugeFlags == -1) {
+ initializeEnvironment();
+ }
+ size_t mmapId = std::atomic_fetch_add(&_G_mmapCount, 1ul);
+ string stackTrace;
+ if (sz >= _G_MMapLogLimit) {
+ stackTrace = getStackTrace(1);
+ LOG(info, "mmap %ld of size %ld from %s", mmapId, sz, stackTrace.c_str());
+ }
+ buf = mmap(NULL, sz, prot, flags | _G_HugeFlags, -1, 0);
+ if (buf == MAP_FAILED) {
+ if ( ! _G_hasHugePageFailureJustHappened ) {
+ _G_hasHugePageFailureJustHappened = true;
+ LOG(debug, "Failed allocating %ld bytes with hugepages due too '%s'."
+ " Will resort to ordinary mmap until it works again.",
+ sz, FastOS_FileInterface::getLastErrorString().c_str());
+ }
+ buf = mmap(NULL, sz, prot, flags, -1, 0);
+ if (buf == MAP_FAILED) {
+ throw std::runtime_error(make_string("Failed mmaping anonymous of size %ld errno(%d)", sz, errno));
+ }
+ } else {
+ if (_G_hasHugePageFailureJustHappened) {
+ _G_hasHugePageFailureJustHappened = false;
+ }
+ }
+ if (sz >= _G_MMapNoCoreLimit) {
+ if (madvise(buf, sz, MADV_DONTDUMP) != 0) {
+ LOG(warning, "Failed madvise(%p, %ld, MADV_DONTDUMP) = '%s'", buf, sz, FastOS_FileInterface::getLastErrorString().c_str());
+ }
+ }
+ if (sz >= _G_MMapLogLimit) {
+ LockGuard guard(_G_lock);
+ _G_HugeMappings[buf] = MMapInfo(mmapId, sz, stackTrace);
+ LOG(info, "%ld mappings of accumulated size %ld", _G_HugeMappings.size(), sum(_G_HugeMappings));
+ }
+ }
+ return buf;
+}
+
+void MMapAlloc::free(void * buf, size_t sz)
+{
+ if (buf != NULL) {
+ madvise(buf, sz, MADV_DONTNEED);
+ munmap(buf, sz);
+ if (sz >= _G_MMapLogLimit) {
+ LockGuard guard(_G_lock);
+ MMapInfo info = _G_HugeMappings[buf];
+ _G_HugeMappings.erase(buf);
+ LOG(info, "munmap %ld of size %ld", info._id, info._sz);
+ LOG(info, "%ld mappings of accumulated size %ld", _G_HugeMappings.size(), sum(_G_HugeMappings));
+ }
+ }
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/util/alloc.h b/vespalib/src/vespa/vespalib/util/alloc.h
new file mode 100644
index 00000000000..559076c7acd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/alloc.h
@@ -0,0 +1,183 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <sys/types.h>
+#include <algorithm>
+#include <vespa/vespalib/util/linkedptr.h>
+#include <vespa/vespalib/util/noncopyable.hpp>
+#include <vespa/vespalib/util/optimized.h>
+
+namespace vespalib {
+
+inline size_t roundUp2inN(size_t minimum) {
+ return 2ul << Optimized::msbIdx(minimum - 1);
+}
+/**
+ * This is an allocated buffer interface that does not accept virtual inheritance.
+**/
+class Alloc : public noncopyable
+{
+public:
+ size_t size() const { return _sz; }
+ void * get() { return _buf; }
+ const void * get() const { return _buf; }
+ void * operator -> () { return _buf; }
+ const void * operator -> () const { return _buf; }
+protected:
+ Alloc(Alloc && rhs) :
+ _buf(rhs._buf),
+ _sz(rhs._sz)
+ {
+ rhs._buf = nullptr;
+ rhs._sz = 0;
+ }
+ Alloc & operator=(Alloc && rhs) {
+ if (this != & rhs) {
+ internalSwap(rhs);
+ }
+ return *this;
+ }
+ Alloc(void * buf, size_t sz) : _buf(buf), _sz(sz) { }
+ ~Alloc() { _buf = 0; }
+ void internalSwap(Alloc & rhs) {
+ std::swap(_buf, rhs._buf);
+ std::swap(_sz, rhs._sz);
+ }
+private:
+ void * _buf;
+ size_t _sz;
+};
+
+class HeapAlloc : public Alloc
+{
+public:
+ typedef std::unique_ptr<HeapAlloc> UP;
+ HeapAlloc() : Alloc(NULL, 0) { }
+ HeapAlloc(size_t sz) : Alloc(HeapAlloc::alloc(sz), sz) { }
+ ~HeapAlloc() { HeapAlloc::free(get(), size()); }
+ HeapAlloc(HeapAlloc && rhs) : Alloc(std::move(rhs)) { }
+
+ HeapAlloc & operator=(HeapAlloc && rhs) {
+ Alloc::operator=(std::move(rhs));
+ return *this;
+ }
+ void swap(HeapAlloc & rhs) { internalSwap(rhs); }
+public:
+ static void * alloc(size_t sz) { return (sz > 0) ? malloc(sz) : 0; }
+ static void free(void * buf, size_t sz) { (void) sz; if (buf) { ::free(buf); } }
+};
+
+class AlignedHeapAlloc : public Alloc
+{
+public:
+ typedef std::unique_ptr<AlignedHeapAlloc> UP;
+ AlignedHeapAlloc() : Alloc(NULL, 0) { }
+ AlignedHeapAlloc(size_t sz, size_t alignment)
+ : Alloc(AlignedHeapAlloc::alloc(sz, alignment), sz) { }
+ AlignedHeapAlloc(AlignedHeapAlloc && rhs) : Alloc(std::move(rhs)) { }
+
+ AlignedHeapAlloc & operator=(AlignedHeapAlloc && rhs) {
+ Alloc::operator=(std::move(rhs));
+ return *this;
+ }
+ ~AlignedHeapAlloc() { AlignedHeapAlloc::free(get(), size()); }
+ void swap(AlignedHeapAlloc & rhs) { internalSwap(rhs); }
+public:
+ static void * alloc(size_t sz, size_t alignment);
+ static void free(void * buf, size_t sz) { (void) sz; if (buf) { ::free(buf); } }
+};
+
+
+class MMapAlloc : public Alloc
+{
+public:
+ enum {HUGEPAGE_SIZE=0x200000};
+ typedef std::unique_ptr<MMapAlloc> UP;
+ MMapAlloc() : Alloc(NULL, 0) { }
+ MMapAlloc(size_t sz) : Alloc(MMapAlloc::alloc(sz), sz) { }
+ MMapAlloc(MMapAlloc && rhs) : Alloc(std::move(rhs)) { }
+
+ MMapAlloc & operator=(MMapAlloc && rhs) {
+ Alloc::operator=(std::move(rhs));
+ return *this;
+ }
+ ~MMapAlloc() { MMapAlloc::free(get(), size()); }
+ void swap(MMapAlloc & rhs) { internalSwap(rhs); }
+public:
+ static void * alloc(size_t sz);
+ static void free(void * buf, size_t sz);
+};
+
+// Alignment requirement is != 0, use posix_memalign
+template <size_t Alignment>
+struct ChooseHeapAlloc
+{
+ static inline void* alloc(size_t sz) {
+ return AlignedHeapAlloc::alloc(sz, Alignment);
+ }
+};
+
+// No alignment required, use regular malloc
+template <>
+struct ChooseHeapAlloc<0>
+{
+ static inline void* alloc(size_t sz) {
+ return HeapAlloc::alloc(sz);
+ }
+};
+
+/**
+ * Optional alignment is assumed to be <= system page size, since mmap
+ * is always used when size is above limit.
+ */
+
+template <size_t Lim=MMapAlloc::HUGEPAGE_SIZE, size_t Alignment=0>
+class AutoAlloc : public Alloc
+{
+public:
+ typedef std::unique_ptr<AutoAlloc> UP;
+ typedef vespalib::LinkedPtr<AutoAlloc> LP;
+ AutoAlloc() : Alloc(NULL, 0) { }
+ AutoAlloc(size_t sz)
+ : Alloc(useMMap(sz)
+ ? MMapAlloc::alloc(roundUpToHugePages(sz))
+ : ChooseHeapAlloc<Alignment>::alloc(sz),
+ useMMap(sz)
+ ? roundUpToHugePages(sz)
+ : sz)
+ { }
+ AutoAlloc(AutoAlloc && rhs) : Alloc(std::move(rhs)) { }
+
+ AutoAlloc & operator=(AutoAlloc && rhs) {
+ Alloc::operator=(std::move(rhs));
+ return *this;
+ }
+
+ ~AutoAlloc() {
+ if (useMMap(size())) {
+ MMapAlloc::free(get(), size());
+ } else {
+ HeapAlloc::free(get(), size());
+ }
+ }
+ void swap(AutoAlloc & rhs) { internalSwap(rhs); }
+private:
+ static size_t roundUpToHugePages(size_t sz) {
+ return (Lim >= MMapAlloc::HUGEPAGE_SIZE)
+ ? (sz+(MMapAlloc::HUGEPAGE_SIZE-1)) & ~(MMapAlloc::HUGEPAGE_SIZE-1)
+ : sz;
+ }
+ static bool useMMap(size_t sz) { return (sz >= Lim); }
+};
+
+template <size_t Lim>
+inline void swap(AutoAlloc<Lim> & a, AutoAlloc<Lim> & b) { a.swap(b); }
+
+inline void swap(HeapAlloc & a, HeapAlloc & b) { a.swap(b); }
+inline void swap(AlignedHeapAlloc & a, AlignedHeapAlloc & b) { a.swap(b); }
+inline void swap(MMapAlloc & a, MMapAlloc & b) { a.swap(b); }
+
+typedef AutoAlloc<> DefaultAlloc;
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/approx.cpp b/vespalib/src/vespa/vespalib/util/approx.cpp
new file mode 100644
index 00000000000..d42525016b1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/approx.cpp
@@ -0,0 +1,2 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include "approx.h"
diff --git a/vespalib/src/vespa/vespalib/util/approx.h b/vespalib/src/vespa/vespalib/util/approx.h
new file mode 100644
index 00000000000..37fb4012d4c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/approx.h
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <math.h>
+
+namespace vespalib {
+
+/**
+ * Compare two double-precision floating-point numbers to see if they
+ * are approximately equal. We convert to floating-point and then
+ * step 1 unit in the last place towards the other number. This means the
+ * two numbers must be equal to 23 bits precision.
+ **/
+inline bool approx_equal(double a, double b)
+{
+ if (a == b) return true;
+ if (a > 1.0 || a < -1.0) {
+ // This is in a way the simple case, but it's needed
+ // anyway to handle numbers that are outside "float" range.
+ double frac = b / a;
+ float rounded = nextafterf(frac, 1.0);
+ return (rounded == 1.0);
+ }
+ // in reality this may allow up to 2 bits difference
+ // since we round to float and also call nextafterf
+ float aa = (float) a;
+ return (aa == nextafterf((float) b, aa));
+}
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/array.h b/vespalib/src/vespa/vespalib/util/array.h
new file mode 100644
index 00000000000..d2741dba29b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/array.h
@@ -0,0 +1,354 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <algorithm>
+#include <vespa/vespalib/util/alloc.h>
+#include <vespa/vespalib/util/optimized.h>
+#include <tr1/type_traits>
+
+namespace vespalib {
+
+/**
+ * This is a simple wrapper class for a typed array with no memory ownership.
+ * It is similar to vespalib::stringref
+ **/
+template <typename T>
+class ArrayRef {
+public:
+ ArrayRef(T * v, size_t sz) : _v(v), _sz(sz) { }
+ ArrayRef(std::vector<T> & v) : _v(&v[0]), _sz(v.size()) { }
+ T & operator [] (size_t i) { return _v[i]; }
+ const T & operator [] (size_t i) const { return _v[i]; }
+ size_t size() const { return _sz; }
+private:
+ T * _v;
+ size_t _sz;
+};
+
+/**
+* This is a small and compact implementation of a resizeable array.
+* It has a smaller footprint than std::vector and most important,
+* it generates more efficient code.
+* It only supports simple objects without constructors/destructors.
+**/
+template <typename T, typename B=HeapAlloc>
+class Array {
+public:
+ class reverse_iterator {
+ public:
+ reverse_iterator() : _p(NULL) { }
+ reverse_iterator(T * p) : _p(p) { }
+ T & operator *() { return _p[0]; }
+ T * operator -> () { return _p; }
+ reverse_iterator operator -(size_t n) { return _p + n; }
+ reverse_iterator operator +(size_t n) { return _p - n; }
+ reverse_iterator & operator ++ () {
+ _p--;
+ return *this;
+ }
+ reverse_iterator operator ++ (int) {
+ reverse_iterator prev = *this;
+ _p--;
+ return prev;
+ }
+ reverse_iterator & operator -- () {
+ _p++;
+ return *this;
+ }
+ reverse_iterator operator -- (int) {
+ reverse_iterator prev = *this;
+ _p++;
+ return prev;
+ }
+ T * get() { return _p; }
+ private:
+ friend size_t operator -(reverse_iterator a, reverse_iterator b) { return b._p - a._p; }
+ T * _p;
+ };
+ class const_reverse_iterator {
+ public:
+ const_reverse_iterator() : _p(NULL) { }
+ const_reverse_iterator(const T * p) : _p(p) { }
+ const_reverse_iterator(reverse_iterator i) : _p(i.get()) { }
+ const T & operator *() const { return _p[0]; }
+ const T * operator -> () const { return _p; }
+ const_reverse_iterator operator -(size_t n) { return _p + n; }
+ const_reverse_iterator operator +(size_t n) { return _p - n; }
+ const_reverse_iterator & operator ++ () {
+ _p--;
+ return *this;
+ }
+ const_reverse_iterator operator ++ (int) {
+ const_reverse_iterator prev = *this;
+ _p--;
+ return prev;
+ }
+ const_reverse_iterator & operator -- () {
+ _p++;
+ return *this;
+ }
+ const_reverse_iterator operator -- (int) {
+ const_reverse_iterator prev = *this;
+ _p++;
+ return prev;
+ }
+
+ private:
+ friend size_t operator -(const_reverse_iterator a, const_reverse_iterator b) { return b._p - a._p; }
+ const T * _p;
+ };
+ typedef const T * const_iterator;
+ typedef T * iterator;
+ typedef const T & const_reference;
+ typedef T value_type;
+ typedef size_t size_type;
+
+ Array() : _array(), _sz(0) { }
+ Array(size_t sz);
+ Array(B && buf, size_t sz);
+ Array(Array &&rhs);
+ Array(size_t sz, T value);
+ Array(const_iterator begin, const_iterator end);
+ Array(const Array & rhs);
+ Array & operator =(const Array & rhs) {
+ if (&rhs != this) {
+ Array t(rhs);
+ swap(t);
+ }
+ return *this;
+ }
+ Array & operator =(Array && rhs) {
+ if (&rhs != this) {
+ Array t(std::move(rhs));
+ swap(t);
+ }
+ return *this;
+ }
+ ~Array();
+ void swap(Array & rhs) {
+ _array.swap(rhs._array);
+ std::swap(_sz, rhs._sz);
+ }
+ void resize(size_t n);
+ void assign(const_iterator begin_, const_iterator end_) {
+ Array tmp(begin_, end_);
+ swap(tmp);
+ }
+ void reserve(size_t n) {
+ if (capacity() < n) {
+ increase(n);
+ }
+ }
+ void push_back(const T & v) { std::_Construct(push_back(), v); }
+ iterator push_back() { extend(size()+1); return array(_sz++); }
+ iterator push_back_fast() { return array(_sz++); }
+ void push_back_fast(const T & v) { *array(_sz++) = v; }
+
+ void pop_back() {
+ _sz--;
+ std::_Destroy(array(_sz));
+ }
+
+ T & back() { return *array(_sz-1); }
+ const T & back() const { return *array(_sz-1); }
+ const_iterator begin() const { return array(0); }
+ const_iterator end() const { return array(_sz); }
+ iterator begin() { return array(0); }
+ iterator end() { return array(_sz); }
+ const_reverse_iterator rbegin() const { return array(_sz) - 1; }
+ const_reverse_iterator rend() const { return array(0) - 1; }
+ reverse_iterator rbegin() { return array(_sz) - 1; }
+ reverse_iterator rend() { return array(0) - 1; }
+ size_t size() const { return _sz; }
+ size_t byteSize() const { return _array.size(); }
+ size_t capacity() const { return _array.size()/sizeof(T); }
+ void clear() {
+ std::_Destroy(array(0), array(_sz));
+ _sz = 0;
+ }
+ bool empty() const { return _sz == 0; }
+ T & operator [] (size_t i) { return *array(i); }
+ const T & operator [] (size_t i) const { return *array(i); }
+ bool operator == (const Array & rhs) const;
+ bool operator != (const Array & rhs) const { return !(*this == rhs); }
+private:
+ T * array(uint32_t i) { return static_cast<T *>(_array.get()) + i; }
+ const T * array(uint32_t i) const { return static_cast<const T *>(_array.get()) + i; }
+ void cleanup();
+ void increase(size_t n);
+ void extend(size_t n) {
+ if (capacity() < n) {
+ reserve(roundUp2inN(n));
+ }
+ }
+ B _array;
+ uint32_t _sz;
+};
+
+template <typename T>
+void construct(T * dest, const T * source, size_t sz, std::tr1::false_type)
+{
+ for (size_t i(0); i < sz; i++) {
+ std::_Construct(dest + i, *(source + i));
+ }
+}
+
+template <typename T>
+void construct(T * dest, const T * source, size_t sz, std::tr1::true_type)
+{
+ memcpy(dest, source, sz*sizeof(T));
+}
+
+template <typename T>
+void construct(T * dest, size_t sz, std::tr1::false_type)
+{
+ for (size_t i(0); i < sz; i++) {
+ void *ptr = &dest[i];
+ new(ptr) T();
+ }
+}
+
+template <typename T>
+void construct(T * dest, size_t sz, std::tr1::true_type)
+{
+ (void) dest;
+ (void) sz;
+}
+
+template <typename T>
+void construct(T * dest, size_t sz, T val, std::tr1::false_type)
+{
+ for (size_t i(0); i < sz; i++) {
+ void *ptr = &dest[i];
+ new(ptr) T(val);
+ }
+}
+
+template <typename T>
+void construct(T * dest, size_t sz, T val, std::tr1::true_type)
+{
+ for (size_t i(0); i < sz; i++) {
+ dest[i] = val;
+ }
+}
+
+template <typename T, typename B>
+Array<T, B>::Array(const Array & rhs)
+ : _array(rhs.size() * sizeof(T)),
+ _sz(rhs.size())
+{
+ construct(array(0), rhs.array(0), _sz, std::tr1::has_trivial_destructor<T>());
+}
+
+template <typename T, typename B>
+bool Array<T, B>::operator ==(const Array & rhs) const
+{
+ bool retval(size() == rhs.size());
+ for (size_t i(0); retval && (i < _sz); i++) {
+ if (*array(i) != rhs[i]) {
+ retval = false;
+ }
+ }
+ return retval;
+}
+
+template <typename T, typename B>
+void Array<T, B>::resize(size_t n)
+{
+ if (n > capacity()) {
+ reserve(n);
+ }
+ if (n > _sz) {
+ construct(array(_sz), n-_sz, std::tr1::has_trivial_destructor<T>());
+ } else if (n < _sz) {
+ std::_Destroy(array(n), array(_sz));
+ }
+ _sz = n;
+}
+
+template <typename T>
+void move(T * dest, T * source, size_t sz, std::tr1::false_type)
+{
+ for (size_t i(0); i < sz; i++) {
+ std::_Construct(dest + i, std::move(*(source + i)));
+ std::_Destroy(source + i);
+ }
+}
+
+template <typename T>
+void move(T * dest, const T * source, size_t sz, std::tr1::true_type)
+{
+ memcpy(dest, source, sz*sizeof(T));
+}
+
+template <typename T, typename B>
+void Array<T, B>::increase(size_t n)
+{
+ B newArray(sizeof(T)*n);
+ if (capacity() > 0) {
+ move(static_cast<T *>(newArray.get()), array(0), _sz, std::tr1::has_trivial_destructor<T>());
+ }
+ _array.swap(newArray);
+}
+
+template <typename T, typename B>
+Array<T, B>::Array(B && buf, size_t sz) :
+ _array(std::move(buf)),
+ _sz(sz)
+{
+}
+
+
+template <typename T, typename B>
+Array<T, B>::Array(Array &&rhs)
+ : _array(std::move(rhs._array)),
+ _sz(rhs._sz)
+{
+ rhs._sz = 0;
+}
+
+template <typename T, typename B>
+Array<T, B>::Array(size_t sz) :
+ _array(sz * sizeof(T)),
+ _sz(sz)
+{
+ construct(array(0), _sz, std::tr1::has_trivial_destructor<T>());
+}
+
+template <typename T, typename B>
+Array<T, B>::Array(size_t sz, T value) :
+ _array(sz * sizeof(T)),
+ _sz(sz)
+{
+ construct(array(0), _sz, value, std::tr1::has_trivial_destructor<T>());
+}
+
+template <typename T, typename B>
+Array<T, B>::Array(const_iterator begin_, const_iterator end_) :
+ _array(begin_ != end_ ? sizeof(T) * (end_-begin_) : 0),
+ _sz(end_-begin_)
+{
+ construct(array(0), begin_, _sz, std::tr1::has_trivial_destructor<T>());
+}
+
+template <typename T, typename B>
+Array<T, B>::~Array()
+{
+ cleanup();
+}
+
+template <typename T, typename B>
+void Array<T, B>::cleanup()
+{
+ std::_Destroy(array(0), array(_sz));
+ _sz = 0;
+ B tmp;
+ tmp.swap(_array);
+}
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/arrayqueue.hpp b/vespalib/src/vespa/vespalib/util/arrayqueue.hpp
new file mode 100644
index 00000000000..3e45dec7be3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/arrayqueue.hpp
@@ -0,0 +1,373 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2009 Yahoo
+
+#pragma once
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <algorithm>
+#include "traits.h"
+
+namespace vespalib {
+
+/**
+ * A queue implemented as a circular array. Elements may be inserted
+ * and extracted at both ends of the queue. Access to the i'th element
+ * inside the queue can be done in constant time. The internal array
+ * will be grown in size when needed. All inserting and moving of
+ * objects within the queue will use the copy constructor and
+ * destructor of T.
+ **/
+template <typename T>
+class ArrayQueue
+{
+private:
+ T *_data; // space allocated for actual objects
+ uint32_t _capacity; // current maximum queue size
+ uint32_t _used; // the number of items in the queue
+ uint32_t _skew; // the circular skew of this queue
+
+ /**
+ * Copy all items on this queue into the given queue while
+ * retaining item order. The items will be inserted at the back of
+ * the target queue.
+ *
+ * @param q the target queue
+ **/
+ void copyInto(ArrayQueue<T> &q) const {
+ for (uint32_t i = 0; i < _used; ++i) {
+ q.emplace(peek(i));
+ }
+ }
+
+ /**
+ * Move all items on this queue into the given queue while
+ * retaining item order. The items will be inserted at the back of
+ * the target queue.
+ *
+ * @param q the target queue
+ **/
+ void moveInto(ArrayQueue<T> &q) {
+ while (_used > 0) {
+ q.emplace(std::move(access(0)));
+ pop();
+ }
+ }
+
+ /**
+ * Suggest a new capacity that will be able to contain 'n' more
+ * elements than are currently on the queue.
+ *
+ * @return new capacity
+ * @param n the additional elements we want room for
+ **/
+ uint32_t suggestCapacity(uint32_t n) const {
+ uint32_t newCapacity = _capacity;
+ uint32_t minCapacity = _used + n;
+ if (newCapacity < 16) {
+ newCapacity = 16;
+ }
+ while (newCapacity < minCapacity) {
+ newCapacity *= 2;
+ }
+ return newCapacity;
+ }
+
+ /**
+ * Calculate the offset into the backing object array for the
+ * given index. The front of the queue will have index 0 and the
+ * tail of the queue will have index size() - 1.
+ *
+ * @return array offset for the given index
+ * @param idx the index of the item for which we want the array offset
+ **/
+ uint32_t offset(uint32_t idx) const {
+ return ((_skew + idx) % _capacity);
+ }
+
+ /**
+ * Calculate the raw address of the object located at the given
+ * index. The front of the queue will have index 0 and the tail of
+ * the queue will have index size() - 1.
+ *
+ * @return raw object address for the given index
+ * @param idx the index of the object for which we want the raw address
+ **/
+ void *address(uint32_t idx) const {
+ return ((void *)(&_data[offset(idx)]));
+ }
+
+public:
+ /**
+ * Create an empty queue with an initial capacity of 0.
+ **/
+ ArrayQueue() : _data(0), _capacity(0), _used(0), _skew(0) {}
+
+ /**
+ * Create an empty queue with the given initial capacity.
+ *
+ * @param cap initial capacity
+ **/
+ explicit ArrayQueue(uint32_t cap) : _data((T*)malloc(sizeof(T) * cap)),
+ _capacity(cap), _used(0), _skew(0) {}
+
+ /**
+ * Create a queue that is a copy of another queue. Now with funky
+ * shit to make the queue itself non-copyable if the elements in
+ * the queue are non-copyable.
+ *
+ * @param q the queue that should be copied
+ **/
+ ArrayQueue(typename std::conditional<is_copyable<T>::value, void_tag, const ArrayQueue &>::type q) = delete;
+ ArrayQueue(typename std::conditional<is_copyable<T>::value, const ArrayQueue &, void_tag>::type q) : _data((T*)malloc(sizeof(T) * q._capacity)),
+ _capacity(q._capacity), _used(0), _skew(0)
+ {
+ try {
+ q.copyInto(*this);
+ } catch (...) {
+ clear();
+ free(_data);
+ throw;
+ }
+ }
+
+ /**
+ * Move constructor
+ *
+ * @param q the queue that should be moved
+ **/
+ ArrayQueue(ArrayQueue &&q) : _data(0), _capacity(0), _used(0), _skew(0)
+ {
+ swap(q);
+ }
+
+ /**
+ * Assignment operator with copy semantics for queues.
+ *
+ * @return this object
+ * @param rhs the right hand side of the assignment
+ **/
+ ArrayQueue &operator=(const ArrayQueue &rhs) {
+ ArrayQueue tmp(rhs);
+ swap(tmp);
+ return *this;
+ }
+
+ /**
+ * Assignment operator with move semantics for queues.
+ *
+ * @return this object
+ * @param rhs the right hand side of the assignment
+ **/
+ ArrayQueue &operator=(ArrayQueue &&rhs) {
+ swap(rhs);
+ return *this;
+ }
+
+ /**
+ * Make sure that this queue has enough space for 'n' additional
+ * elements.
+ *
+ * @param n the number of additional elements to reserve space for
+ **/
+ void reserve(uint32_t n) {
+ if ((_used + n) > _capacity) {
+ ArrayQueue q(suggestCapacity(n));
+ moveInto(q);
+ swap(q);
+ }
+ }
+
+ /**
+ * Obtain the current capacity of this queue.
+ *
+ * @return current queue capacity
+ **/
+ uint32_t capacity() const {
+ return _capacity;
+ }
+
+ /**
+ * Obtain the number of elements in this queue.
+ *
+ * @return number of elements in this queue
+ **/
+ uint32_t size() const {
+ return _used;
+ }
+
+ /**
+ * Check whether this queue is empty.
+ *
+ * @return true if (and only if) the queue is empty
+ **/
+ bool empty() const {
+ return (_used == 0);
+ }
+
+ /**
+ * Insert an item at the back of this queue.
+ *
+ * @param item the item to insert
+ **/
+ void push(const T &item) {
+ emplace(item);
+ }
+
+ /**
+ * Insert an item at the back of this queue.
+ *
+ * @param item the item to insert
+ **/
+ void push(T &&item) {
+ emplace(std::move(item));
+ }
+
+ /**
+ * Insert an item at the front of this queue.
+ *
+ * @param item the item to insert
+ **/
+ void pushFront(const T &item) {
+ emplaceFront(item);
+ }
+
+ /**
+ * Insert an item at the front of this queue.
+ *
+ * @param item the item to insert
+ **/
+ void pushFront(T &&item) {
+ emplaceFront(std::move(item));
+ }
+
+ /**
+ * Insert an item at the back of this queue.
+ *
+ * @param args constructor args
+ **/
+ template <typename... Args>
+ void emplace(Args &&...args) {
+ reserve(1);
+ new (address(_used)) T(std::forward<Args>(args)...);
+ ++_used;
+ }
+
+ /**
+ * Insert an item at the front of this queue.
+ *
+ * @param args constructor args
+ **/
+ template <typename... Args>
+ void emplaceFront(Args &&...args) {
+ reserve(1);
+ new (address(_capacity - 1)) T(std::forward<Args>(args)...);
+ _skew = offset(_capacity - 1);
+ ++_used;
+ }
+
+ /**
+ * Remove the item at the front of this queue. This method may not
+ * be invoked on an empty queue.
+ **/
+ void pop() {
+ assert(!empty());
+ _data[offset(0)].~T();
+ _skew = offset(1);
+ --_used;
+ }
+
+ /**
+ * Remove the item at the back of this queue. This method may not
+ * be invoked on an empty queue.
+ **/
+ void popBack() {
+ assert(!empty());
+ _data[offset(_used - 1)].~T();
+ --_used;
+ }
+
+ /**
+ * Remove all elements from this queue.
+ **/
+ void clear() {
+ for (uint32_t i = 0; i < _used; ++i) {
+ _data[offset(i)].~T();
+ }
+ _used = 0;
+ }
+
+ /**
+ * Look at an item within this queue. The given index enumerates
+ * the items in the queue relative to the front of the queue (the
+ * front has index 0 and the back has index size-1). This method
+ * may not be invoked with an index that is not in the range [0,
+ * size - 1].
+ *
+ * @return the item value
+ * @param idx index of the item we want to look at
+ **/
+ const T &peek(uint32_t idx) const {
+ assert(idx < _used);
+ return _data[offset(idx)];
+ }
+
+ /**
+ * Access an item within this queue. The given index enumerates
+ * the items in the queue relative to the front of the queue (the
+ * front has index 0 and the back has index size-1). This method
+ * may not be invoked with an index that is not in the range [0,
+ * size - 1].
+ *
+ * @return the item
+ * @param idx index of the item we want to access
+ **/
+ T &access(uint32_t idx) {
+ assert(idx < _used);
+ return _data[offset(idx)];
+ }
+
+ /**
+ * Look at the item at the front of this queue. This method may
+ * not be invoked on an empty queue.
+ *
+ * @return the item value
+ **/
+ const T &front() const {
+ return peek(0);
+ }
+
+ /**
+ * Look at the item at the back of this queue. This method may
+ * not be invoked on an empty queue.
+ *
+ * @return the item value
+ **/
+ const T &back() const {
+ return peek(_used - 1);
+ }
+
+ /**
+ * Swap the internal state of this queue with the given queue.
+ *
+ * @param q the queue we want to swap state with
+ **/
+ void swap(ArrayQueue<T> &q) {
+ std::swap(_data, q._data);
+ std::swap(_capacity, q._capacity);
+ std::swap(_used, q._used);
+ std::swap(_skew, q._skew);
+ }
+
+ /**
+ * Destructs all items on the queue and cleans up memory usage.
+ **/
+ ~ArrayQueue() {
+ clear();
+ free(_data);
+ }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/arraysize.h b/vespalib/src/vespa/vespalib/util/arraysize.h
new file mode 100644
index 00000000000..b34b76a981e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/arraysize.h
@@ -0,0 +1,10 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+template <typename T, int N> int arraysize(const T (&)[N]) { return N; }
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/atomic.cpp b/vespalib/src/vespa/vespalib/util/atomic.cpp
new file mode 100644
index 00000000000..ec21d18c672
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/atomic.cpp
@@ -0,0 +1,222 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "atomic.h"
+
+namespace vespalib {
+
+// here are 5 operation, on unsigned 32-bit integers:
+/**
+ * @fn void Atomic::add(volatile uint32_t *data, uint32_t xdelta)
+ * @brief perform atomic add instruction
+ *
+ * Atomically perform { *data += xdelta }
+ * @param data pointer to the integer the add should be performed on
+ * @param xdelta the delta to add
+ **/
+/**
+ * @fn void Atomic::sub(volatile uint32_t *data, uint32_t xdelta)
+ * @brief perform atomic substract instruction
+ *
+ * Atomically perform { *data -= xdelta }
+ * @param data pointer to the integer the subtract should be performed on
+ * @param xdelta the delta to subtract
+ **/
+/**
+ * @fn uint32_t Atomic::postDec(volatile uint32_t *data)
+ * @brief perform atomic post-decrement
+ *
+ * Atomically perform { (*data)-- }
+ * @param data pointer to the integer the decrement should be performed on
+ **/
+/**
+ * @fn uint32_t Atomic::postInc(volatile uint32_t *data)
+ * @brief perform atomic post-increment
+ *
+ * Atomically perform { (*data)++ }
+ * @param data pointer to the integer the increment should be performed on
+ **/
+/**
+ * @fn bool Atomic::cmpSwap(volatile uint32_t * dest, uint32_t newVal, uint32_t oldVal)
+ * @brief atomic compare and set
+ *
+ * Compares the current contents of the destination with oldVal; if they are
+ * equal, change destination to newVal.
+ * See http://en.wikipedia.org/wiki/Compare-and-swap for more details.
+ * @param dest pointer to memory that shall be compared and set
+ * @param newVal new value to store in dest
+ * @param oldVal expected old value in dest
+ * @return true if the swap was performed, false if the destination data had changed
+ **/
+
+
+// the rest is variants with slightly different argument types
+
+// signed 32-bit:
+
+/**
+ * @fn void Atomic::add(volatile int32_t *data, int32_t xdelta)
+ * @brief perform atomic add instruction
+ *
+ * Atomically perform { *data += xdelta }
+ * @param data pointer to the integer the add should be performed on
+ * @param xdelta the delta to add
+ **/
+/**
+ * @fn void Atomic::sub(volatile int32_t *data, int32_t xdelta)
+ * @brief perform atomic substract instruction
+ *
+ * Atomically perform { *data -= xdelta }
+ * @param data pointer to the integer the subtract should be performed on
+ * @param xdelta the delta to subtract
+ **/
+/**
+ * @fn int32_t Atomic::postDec(volatile int32_t *data)
+ * @brief perform atomic post-decrement
+ *
+ * Atomically perform { (*data)-- }
+ * @param data pointer to the integer the decrement should be performed on
+ **/
+/**
+ * @fn int32_t Atomic::postInc(volatile int32_t *data)
+ * @brief perform atomic post-increment
+ *
+ * Atomically perform { (*data)++ }
+ * @param data pointer to the integer the increment should be performed on
+ **/
+/**
+ * @fn bool Atomic::cmpSwap(volatile int32_t * dest, int32_t newVal, int32_t oldVal)
+ * @brief atomic compare and set
+ * @param dest pointer to memory that shall be compared and set
+ * @param newVal new value to store in dest
+ * @param oldVal expected old value in dest
+ * @return true if the swap was performed, false if the destination data had changed
+ **/
+
+// unsigned 64-bit:
+
+/**
+ * @fn void Atomic::add(volatile uint64_t *data, uint64_t xdelta)
+ * @brief perform atomic add instruction
+ *
+ * Atomically perform { *data += xdelta }
+ * @param data pointer to the integer the add should be performed on
+ * @param xdelta the delta to add
+ **/
+/**
+ * @fn void Atomic::sub(volatile uint64_t *data, uint64_t xdelta)
+ * @brief perform atomic substract instruction
+ *
+ * Atomically perform { *data -= xdelta }
+ * @param data pointer to the integer the subtract should be performed on
+ * @param xdelta the delta to subtract
+ **/
+/**
+ * @fn uint64_t Atomic::postInc(volatile uint64_t *data)
+ * @brief perform atomic post-increment
+ *
+ * Atomically perform { (*data)++ }
+ * @param data pointer to the integer the increment should be performed on
+ * @return old value of memory location
+ **/
+/**
+ * @fn uint64_t Atomic::postDec(volatile uint64_t *data)
+ * @brief perform atomic post-decrement
+ *
+ * Atomically perform { (*data)-- }
+ * @param data pointer to the integer the decrement should be performed on
+ * @return old value of memory location
+ **/
+/**
+ * @fn bool Atomic::cmpSwap(volatile uint64_t * dest, uint64_t newVal, uint64_t oldVal)
+ * @brief atomic compare and set
+ * @param dest pointer to memory that shall be compared and set
+ * @param newVal new value to store in dest
+ * @param oldVal expected old value in dest
+ * @return true if the swap was performed, false if the destination data had changed
+ **/
+
+// signed 64-bit:
+
+/**
+ * @fn void Atomic::add(volatile int64_t *data, int64_t xdelta)
+ * @brief perform atomic add instruction
+ *
+ * Atomically perform { *data += xdelta }
+ * @param data pointer to the integer the add should be performed on
+ * @param xdelta the delta to add
+ **/
+/**
+ * @fn void Atomic::sub(volatile int64_t *data, int64_t xdelta)
+ * @brief perform atomic substract instruction
+ *
+ * Atomically perform { *data -= xdelta }
+ * @param data pointer to the integer the subtract should be performed on
+ * @param xdelta the delta to subtract
+ **/
+/**
+ * @fn int64_t Atomic::postInc(volatile int64_t *data)
+ * @brief perform atomic post-increment
+ *
+ * Atomically perform { (*data)++ }
+ * @param data pointer to the integer the increment should be performed on
+ * @return old value of memory location
+ **/
+/**
+ * @fn int64_t Atomic::postDec(volatile int64_t *data)
+ * @brief perform atomic post-decrement
+ *
+ * Atomically perform { (*data)-- }
+ * @param data pointer to the integer the decrement should be performed on
+ * @return old value of memory location
+ **/
+/**
+ * @fn bool Atomic::cmpSwap(volatile int64_t * dest, int64_t newVal, int64_t oldVal)
+ * @brief atomic compare and set
+ * @param dest pointer to memory that shall be compared and set
+ * @param newVal new value to store in dest
+ * @param oldVal expected old value in dest
+ * @return true if the swap was performed, false if the destination data had changed
+ **/
+
+
+
+
+
+// signed 128-bit:
+
+/**
+ * @fn bool Atomic::cmpSwap(volatile long long * dest, long long newVal, long long oldVal)
+ * @brief atomic compare and set
+ * @param dest pointer to memory that shall be compared and set
+ * @param newVal new value to store in dest
+ * @param oldVal expected old value in dest
+ * @return true if the swap was performed, false if the destination data had changed
+ **/
+
+// pointer plus tag:
+/**
+ * @fn bool Atomic::cmpSwap(volatile TaggedPtr * dest, TaggedPtr newVal, TaggedPtr oldVal)
+ * @brief atomic compare and set
+ *
+ * Compares the current contents of the destination with oldVal; if they are
+ * equal, change destination to newVal. Note that the entire TaggedPtr struct
+ * (pointer plus tag) is compared and set in one atomic opertion.
+ * See http://en.wikipedia.org/wiki/Compare-and-swap for more details.
+ *
+ * @param dest pointer to memory that shall be compared and set
+ * @param newVal new value to store in dest
+ * @param oldVal expected old value in dest
+ * @return true if the swap was performed, false if the destination data had changed
+ **/
+/**
+ * @fn bool Atomic::cmpSwap(volatile unsigned long long * dest, unsigned long long newVal, unsigned long long oldVal)
+ * @brief atomic compare and set
+ * @param dest pointer to memory that shall be compared and set
+ * @param newVal new value to store in dest
+ * @param oldVal expected old value in dest
+ * @return true if the swap was performed, false if the destination data had changed
+ **/
+
+
+} // end namespace
diff --git a/vespalib/src/vespa/vespalib/util/atomic.h b/vespalib/src/vespa/vespalib/util/atomic.h
new file mode 100644
index 00000000000..77f1f7554ae
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/atomic.h
@@ -0,0 +1,469 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2003 Fast Search & Transfer ASA
+// Copyright (C) 2003 Overture Services Norway AS
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+
+namespace vespalib {
+
+/**
+ * @brief Atomic instructions class
+ *
+ * To avoid mutexes around simple counters, use these functions.
+ * Currently only implemented for GCC on i386 and x86_64 platforms.
+ * To check if instructions are available, test the feature macro
+ * HAVE_VESPALIB_ATOMIC with \#ifdef.
+ **/
+class Atomic
+{
+public:
+ /**
+ * @brief Pointer and tag - use instead of bare pointer for cmpSwap()
+ *
+ * When making a lock-free data structure by using cmpSwap
+ * on pointers, you'll often run into the "ABA problem", see
+ * http://en.wikipedia.org/wiki/ABA_problem for details.
+ * The TaggedPtr makes it easy to do the woraround with tag bits,
+ * but requires the double-word compare-and-swap instruction.
+ * Very early Amd K7/8 CPUs are lacking this and will fail (Illegal Instruction).
+ **/
+ struct TaggedPtr
+ {
+ TaggedPtr() : _ptr(NULL), _tag(0) { }
+ TaggedPtr(void * h, size_t t) : _ptr(h), _tag(t) { }
+ TaggedPtr(const TaggedPtr & h) : _ptr(h._ptr), _tag(h._tag) { }
+ TaggedPtr & operator = (const TaggedPtr & h) { if (this != &h) {_ptr = h._ptr; _tag = h._tag; }; return *this; }
+
+ void * _ptr;
+ size_t _tag;
+ };
+ static inline bool cmpSwap(volatile TaggedPtr * dest, TaggedPtr newVal, TaggedPtr oldVal);
+
+ static inline void add(volatile uint32_t *data, uint32_t xdelta);
+ static inline void sub(volatile uint32_t *data, uint32_t xdelta);
+ static inline uint32_t postInc(volatile uint32_t *data);
+ static inline uint32_t postDec(volatile uint32_t *data);
+ static inline bool cmpSwap(volatile uint32_t * dest, uint32_t newVal, uint32_t oldVal);
+
+ static inline int32_t postAdd(volatile int32_t *data, int32_t xdelta);
+ static inline void add(volatile int32_t *data, int32_t xdelta);
+ static inline void sub(volatile int32_t *data, int32_t xdelta);
+ static inline int32_t postInc(volatile int32_t *data);
+ static inline int32_t postDec(volatile int32_t *data);
+ static inline bool cmpSwap(volatile int32_t * dest, int32_t newVal, int32_t oldVal);
+
+ static inline void add(volatile uint64_t *data, uint64_t xdelta);
+ static inline void sub(volatile uint64_t *data, uint64_t xdelta);
+ static inline uint64_t postInc(volatile uint64_t *data);
+ static inline uint64_t postDec(volatile uint64_t *data);
+ static inline bool cmpSwap(volatile uint64_t * dest, uint64_t newVal, uint64_t oldVal);
+
+ static inline int64_t postAdd(volatile int64_t *data, int64_t xdelta);
+ static inline void add(volatile int64_t *data, int64_t xdelta);
+ static inline void sub(volatile int64_t *data, int64_t xdelta);
+ static inline int64_t postInc(volatile int64_t *data);
+ static inline int64_t postDec(volatile int64_t *data);
+ static inline bool cmpSwap(volatile int64_t * dest, int64_t newVal, int64_t oldVal);
+
+#if defined(FASTOS_64BIT_LONG)
+ static inline bool cmpSwap(volatile long long * dest, long long newVal, long long oldVal);
+ static inline bool cmpSwap(volatile unsigned long long * dest, unsigned long long newVal, unsigned long long oldVal);
+#endif
+};
+
+#if defined(__x86_64__)
+ #define VESPALIB_ATOMIC_TAGGEDPTR_ALIGNMENT __attribute__ ((aligned (16)))
+#elif defined(__i386__)
+ #define VESPALIB_ATOMIC_TAGGEDPTR_ALIGNMENT
+#else
+ #error "VESPALIB_ATOMIC_TAGGEDPTR_ALIGNMENT can not be defined."
+#endif
+
+/**
+ * @fn void Atomic::add(volatile int32_t *data, int32_t xdelta)
+ * @brief perform atomic add instruction
+ *
+ * Atomically perform { *data += xdelta }
+ * @param data pointer to the integer the add should be performed on
+ * @param xdelta the delta to add
+ **/
+
+/**
+ * @fn void Atomic::sub(volatile int32_t *data, int32_t xdelta)
+ * @brief perform atomic substract instruction
+ *
+ * Atomically perform { *data -= xdelta }
+ * @param data pointer to the integer the subtract should be performed on
+ * @param xdelta the delta to subtract
+ **/
+
+/**
+ * @fn void Atomic::add(volatile uint32_t *data, uint32_t xdelta)
+ * @brief perform atomic add instruction
+ *
+ * Atomically perform { *data += xdelta }
+ * @param data pointer to the integer the add should be performed on
+ * @param xdelta the delta to add
+ **/
+
+/**
+ * @fn void Atomic::sub(volatile uint32_t *data, uint32_t xdelta)
+ * @brief perform atomic substract instruction
+ *
+ * Atomically perform { *data -= xdelta }
+ * @param data pointer to the integer the subtract should be performed on
+ * @param xdelta the delta to subtract
+ **/
+
+
+/**
+ * @fn uint32_t Atomic::postDec(volatile uint32_t *data)
+ * @brief perform atomic post-decrement
+ *
+ * Atomically perform { (*data)-- }
+ * @param data pointer to the integer the decrement should be performed on
+ **/
+
+/**
+ * @fn uint32_t Atomic::postInc(volatile uint32_t *data)
+ * @brief perform atomic post-increment
+ *
+ * Atomically perform { (*data)++ }
+ * @param data pointer to the integer the increment should be performed on
+ **/
+
+#if defined(__x86_64__)
+
+#define HAVE_VESPALIB_ATOMIC
+
+inline int32_t
+Atomic::postAdd(volatile int32_t *data, int32_t xdelta)
+{
+ __asm__("lock ; xaddl %0,%1"
+ : "+r" (xdelta),
+ "+m" (*data)
+ : : "memory");
+ return xdelta;
+}
+
+inline void
+Atomic::add(volatile int32_t *data, int32_t xdelta)
+{
+ __asm__("lock ; addl %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+inline void
+Atomic::add(volatile uint32_t *data, uint32_t xdelta)
+{
+ __asm__("lock ; addl %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+inline void
+Atomic::sub(volatile int32_t *data, int32_t xdelta)
+{
+ __asm__("lock ; subl %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+inline void
+Atomic::sub(volatile uint32_t *data, uint32_t xdelta)
+{
+ __asm__("lock ; subl %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+
+inline int
+Atomic::postDec(volatile int32_t *data)
+{
+ int32_t result;
+
+ __asm__("lock ; xaddl %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (-1), "m" (*data));
+ return result;
+}
+
+inline uint32_t
+Atomic::postDec(volatile uint32_t *data)
+{
+ int32_t result;
+
+ __asm__("lock ; xaddl %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (-1), "m" (*data));
+ return result;
+}
+
+inline int
+Atomic::postInc(volatile int32_t *data)
+{
+ int32_t result;
+
+ __asm__("lock ; xaddl %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (1), "m" (*data));
+ return result;
+}
+
+inline uint32_t
+Atomic::postInc(volatile uint32_t *data)
+{
+ int32_t result;
+
+ __asm__("lock ; xaddl %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (1), "m" (*data));
+ return result;
+}
+
+inline bool
+Atomic::cmpSwap(volatile int32_t * dest, int32_t newVal, int32_t oldVal)
+{
+ char result;
+ __asm__ __volatile__("lock; cmpxchgl %2, %0;"
+ "setz %1"
+ : "+m"(*dest), "=q"(result)
+ : "r" (newVal), "a"(oldVal) : "memory");
+ return result;
+}
+
+inline bool
+Atomic::cmpSwap(volatile uint32_t * dest, uint32_t newVal, uint32_t oldVal)
+{
+ char result;
+ __asm__ __volatile__("lock; cmpxchgl %2, %0;"
+ "setz %1"
+ : "+m"(*dest), "=q"(result)
+ : "r" (newVal), "a"(oldVal) : "memory");
+ return result;
+}
+
+inline int64_t
+Atomic::postAdd(volatile int64_t *data, int64_t xdelta)
+{
+ __asm__("lock ; xaddq %0,%1"
+ : "+r" (xdelta),
+ "+m" (*data)
+ : : "memory");
+ return xdelta;
+}
+
+inline void
+Atomic::add(volatile int64_t *data, int64_t xdelta)
+{
+ __asm__("lock ; addq %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+inline void
+Atomic::add(volatile uint64_t *data, uint64_t xdelta)
+{
+ __asm__("lock ; addq %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+inline void
+Atomic::sub(volatile int64_t *data, int64_t xdelta)
+{
+ __asm__("lock ; subq %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+inline void
+Atomic::sub(volatile uint64_t *data, uint64_t xdelta)
+{
+ __asm__("lock ; subq %1,%0"
+ : "=m" (*data)
+ : "ir" (xdelta), "m" (*data));
+}
+
+
+inline int64_t
+Atomic::postDec(volatile int64_t *data)
+{
+ int64_t result;
+
+ __asm__("lock ; xaddq %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (int64_t(-1)), "m" (*data));
+ return result;
+}
+
+inline uint64_t
+Atomic::postDec(volatile uint64_t *data)
+{
+ uint64_t result;
+
+#if defined(__i386__)
+ do {
+ result = *data;
+ } while(!cmpSwap(data, result-1, result));
+#else
+ __asm__("lock ; xaddq %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (uint64_t(-1)), "m" (*data));
+#endif
+ return result;
+}
+
+inline int64_t
+Atomic::postInc(volatile int64_t *data)
+{
+ int64_t result;
+
+#if defined(__i386__)
+ do {
+ result = *data;
+ } while(!cmpSwap(data, result+1, result));
+#else
+ __asm__("lock ; xaddq %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (1), "m" (*data));
+#endif
+ return result;
+}
+
+inline uint64_t
+Atomic::postInc(volatile uint64_t *data)
+{
+ uint64_t result;
+
+#if defined(__i386__)
+ do {
+ result = *data;
+ } while(!cmpSwap(data, result+1, result));
+#else
+ __asm__("lock ; xaddq %0, %1"
+ : "=r" (result), "=m" (*data) : "0" (1), "m" (*data));
+#endif
+ return result;
+}
+
+inline bool
+Atomic::cmpSwap(volatile uint64_t * dest, uint64_t newVal, uint64_t oldVal) {
+ bool result;
+ __asm__ __volatile__("lock; cmpxchgq %3, %0;"
+ "setz %1"
+ : "+m"(*dest), "=q"(result), "+a"(oldVal)
+ : "r" (newVal)
+ : "memory", "cc");
+ return result;
+}
+
+inline bool
+Atomic::cmpSwap(volatile int64_t * dest, int64_t newVal, int64_t oldVal)
+{
+ return cmpSwap((volatile uint64_t *) dest, newVal, oldVal);
+}
+
+#if defined(__x86_64__)
+inline bool
+Atomic::cmpSwap(volatile unsigned long long * dest, unsigned long long newVal, unsigned long long oldVal)
+{
+ char result;
+ unsigned long long res;
+ union pair {
+ uint64_t v64[2];
+ unsigned long long v128;
+ };
+ pair nv;
+ nv.v128 = newVal;
+ __asm__ volatile (
+ "lock ;"
+ "cmpxchg16b %6;"
+ "setz %2;"
+ : "=A" (res),
+ "=m" (*dest),
+ "=q" (result)
+ : "0" (oldVal),
+ "b" (nv.v64[0]),
+ "c" (nv.v64[1]),
+ "m" (*dest)
+ : "memory"
+ );
+ return result;
+}
+
+inline bool
+Atomic::cmpSwap(volatile long long * dest, long long newVal, long long oldVal)
+{
+ return cmpSwap((volatile unsigned long long *) dest, newVal, oldVal);
+}
+
+#endif
+
+inline bool
+Atomic::cmpSwap(volatile TaggedPtr * dest, TaggedPtr newVal, TaggedPtr oldVal)
+{
+ char result;
+ void * ptr;
+ size_t tag;
+#if defined(__x86_64__)
+ __asm__ volatile (
+ "lock ;"
+ "cmpxchg16b %8;"
+ "setz %1;"
+ : "=m" (*dest),
+ "=q" (result),
+ "=a" (ptr),
+ "=d" (tag)
+ : "a" (oldVal._ptr),
+ "d" (oldVal._tag),
+ "b" (newVal._ptr),
+ "c" (newVal._tag),
+ "m" (*dest)
+ : "memory"
+ );
+#else
+#ifdef __pic__
+ __asm__ volatile (
+ "pushl %%ebx;"
+ "movl %6, %%ebx;"
+ "lock ;"
+ "cmpxchg8b %8;"
+ "setz %1;"
+ "popl %%ebx;"
+ : "=m" (*dest),
+ "=q" (result),
+ "=a" (ptr),
+ "=d" (tag)
+ : "2" (oldVal._ptr),
+ "3" (oldVal._tag),
+ "m" (newVal._ptr),
+ "c" (newVal._tag),
+ "m" (*dest)
+ : "memory"
+ );
+#else
+ __asm__ volatile (
+ "lock ;"
+ "cmpxchg8b %8;"
+ "setz %1;"
+ : "=m" (*dest),
+ "=q" (result),
+ "=a" (ptr),
+ "=d" (tag)
+ : "a" (oldVal._ptr),
+ "d" (oldVal._tag),
+ "b" (newVal._ptr),
+ "c" (newVal._tag),
+ "m" (*dest)
+ : "memory"
+ );
+#endif
+
+#endif
+
+ return result;
+}
+#else
+ #error "Atomic methods has not been defined for this platform."
+#endif // #ifdef __x86_64__
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/autoclosurecaller.h b/vespalib/src/vespa/vespalib/util/autoclosurecaller.h
new file mode 100644
index 00000000000..d7b6f77de89
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/autoclosurecaller.h
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "closure.h"
+
+namespace vespalib {
+
+/**
+ * @brief RAII class that calls a closure in its destructor.
+ *
+ * To make sure a closure is called when a scope is exited, an
+ * instance of this class can be kept on the stack.
+ */
+class AutoClosureCaller {
+ std::unique_ptr<Closure> _closure;
+
+public:
+ /**
+ * Creates a guard object that will call a closure on destruction.
+ * @param closure closure to call
+ */
+ AutoClosureCaller(std::unique_ptr<Closure> closure) : _closure(std::move(closure)) {}
+
+ /**
+ * Calls the registered closure.
+ */
+ ~AutoClosureCaller() { _closure->call(); }
+};
+
+} // namespace proton
+
diff --git a/vespalib/src/vespa/vespalib/util/backtrace.cpp b/vespalib/src/vespa/vespalib/util/backtrace.cpp
new file mode 100644
index 00000000000..f6d07718a51
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/backtrace.cpp
@@ -0,0 +1,84 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/backtrace.h>
+#include <vespa/vespalib/util/memory.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <vespa/fastos/backtrace.h>
+#include <cxxabi.h>
+#include <execinfo.h>
+#include <signal.h>
+
+namespace {
+
+/**
+ * Convert input line of form eg.
+ * ./exception_test(_ZN27FastOS_ApplicationInterface5EntryEiPPc+0x0) [0x1234]
+ * to its demangled form
+ * ./exception_test(FastOS_ApplicationInterface::Entry(int, char**)+0x0) [0x1234]
+ *
+ * Assumes everything between '(' and '+' is a mangled function signature.
+ *
+ * @param line A single line from backtrace_symbols
+ * @return The demangled line or the original line if demangling fails
+ */
+vespalib::string
+demangleBacktraceLine(const vespalib::string& line)
+{
+ size_t symBegin = line.find_first_of('(');
+ if (symBegin != vespalib::string::npos) {
+ size_t symEnd = line.find_first_of('+', symBegin);
+ if (symEnd != vespalib::string::npos) {
+ vespalib::string mangled = line.substr(symBegin + 1, symEnd - symBegin - 1);
+ int status;
+ char* demangled = abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status);
+ vespalib::MallocAutoPtr demangleScoped(demangled);
+
+ if (status == 0 && demangled != NULL) {
+ // Create string matching original backtrace line format,
+ // except with demangled function signature
+ vespalib::string ret(line.c_str(), symBegin + 1);
+ ret.append(demangled);
+ ret.append(line.c_str() + symEnd);
+ return ret;
+ }
+ }
+ }
+ // Return unchanged since we couldn't make sense of it
+ return line;
+}
+
+}
+
+int
+vespalib::getStackTraceFrames(void** framesOut, int maxFrames) {
+ return FastOS_backtrace(framesOut, maxFrames);
+}
+
+vespalib::string
+vespalib::getStackTrace(int ignoreTop, void* const* stack, int size)
+{
+ asciistream ost;
+ char** symbols = backtrace_symbols(stack, size);
+ if (symbols) {
+ ost << "Backtrace:";
+ for (int i = ignoreTop; i < size; ++i) {
+ ost << "\n " << demangleBacktraceLine(symbols[i]);
+ }
+ free(symbols);
+ }
+ return ost.str();
+}
+
+vespalib::string
+vespalib::getStackTrace(int ignoreTop) {
+#ifdef __i386__
+ ignoreTop += 2;
+#else
+ ignoreTop += 1;
+#endif
+ void* stack[25];
+ int size = FastOS_backtrace(stack, 25);
+ return getStackTrace(ignoreTop, stack, size);
+}
diff --git a/vespalib/src/vespa/vespalib/util/backtrace.h b/vespalib/src/vespa/vespalib/util/backtrace.h
new file mode 100644
index 00000000000..c277a075e43
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/backtrace.h
@@ -0,0 +1,41 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+/**
+ * Gets a textual stack trace from the current frame of execution.
+ * Potentially very expensive call, so only use in exceptional circumstances.
+ *
+ * @param ignoreTop number of frames to skip from the top of the stack
+ * @return Stacktrace complete with resolved (although still mangled) symbols
+ */
+string getStackTrace(int ignoreTop);
+
+/**
+ * Gets a textual stack trace from an existing buffer of stack frames.
+ * Potentially very expensive call, so only use in exceptional circumstances.
+ *
+ * @param ignoreTop number of frames to skip from the top of the stack
+ * @param stack buffer of stack frame addresses
+ * @param size number of valid frame addresses in the buffer
+ * @return Stacktrace complete with resolved (although still mangled) symbols
+ */
+string getStackTrace(int ignoreTop, void* const* stack, int size);
+
+/**
+ * Get the stack frame addresses from the current frame of execution.
+ * Lightweight call, as it does not involve any symbol resolving.
+ *
+ * @param framesOut buffer receiving up to maxFrames stack frame addresses
+ * @param maxFrames maximum number of addresses to return (must be <=
+ * size of buffer)
+ * @return number of frame addresses actually stored in framesOut
+ */
+int getStackTraceFrames(void** framesOut, int maxFrames);
+
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/barrier.cpp b/vespalib/src/vespa/vespalib/util/barrier.cpp
new file mode 100644
index 00000000000..6a9732fe9f9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/barrier.cpp
@@ -0,0 +1,40 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "barrier.h"
+
+namespace vespalib {
+
+bool
+Barrier::await()
+{
+ MonitorGuard guard(_monitor);
+ if (_n == 0) {
+ return false;
+ }
+ if (_count == _next) {
+ _next += _n;
+ }
+ if (++_count == _next) {
+ guard.broadcast();
+ } else {
+ size_t limit = _next;
+ while ((_count - limit) > _n) {
+ if (_n == 0) {
+ return false;
+ }
+ guard.wait();
+ }
+ }
+ return true;
+}
+
+void
+Barrier::destroy()
+{
+ MonitorGuard guard(_monitor);
+ _n = 0;
+ guard.broadcast();
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/barrier.h b/vespalib/src/vespa/vespalib/util/barrier.h
new file mode 100644
index 00000000000..7d3f79e2bb8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/barrier.h
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+#include "sync.h"
+
+namespace vespalib {
+
+/**
+ * Reusable barrier with a predefined number of participants.
+ **/
+class Barrier
+{
+private:
+ size_t _n;
+ Monitor _monitor;
+ size_t _count;
+ size_t _next;
+
+public:
+ /**
+ * Create a new barrier with the given number of participants
+ *
+ * @param n number of participants
+ **/
+ Barrier(size_t n) : _n(n), _monitor(), _count(0), _next(0) {}
+
+ /**
+ * Wait for the (n - 1) other participants to call this
+ * function. This function can be called multiple times.
+ *
+ * @return false if this barrier has been destroyed
+ **/
+ bool await();
+
+ /**
+ * Destroy this barrier, making all current and future calls to
+ * await return false without waiting. A barrier is tagged as
+ * destroyed by setting the number of participants to 0.
+ **/
+ void destroy();
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/benchmark_timer.cpp b/vespalib/src/vespa/vespalib/util/benchmark_timer.cpp
new file mode 100644
index 00000000000..00f12dea02f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/benchmark_timer.cpp
@@ -0,0 +1,3 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include "benchmark_timer.h"
diff --git a/vespalib/src/vespa/vespalib/util/benchmark_timer.h b/vespalib/src/vespa/vespalib/util/benchmark_timer.h
new file mode 100644
index 00000000000..d2e72c8cef5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/benchmark_timer.h
@@ -0,0 +1,134 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <chrono>
+
+namespace vespalib {
+
+/**
+ * Simple utility used to estimate how long something takes by doing
+ * it repeatedly over a predefined time interval and remembering the
+ * minimal time it took to do it.
+ *
+ * <pre>
+ * Example:
+ *
+ * BenchmarkTimer timer(5.0);
+ * while (timer.has_budget()) {
+ * timer.before();
+ * ... do stuff
+ * timer.after();
+ * }
+ * double min_time_s = timer.min_time()
+ * </pre>
+ *
+ * As an even simpler alternative, the static benchmark functions can
+ * be used to measure the time something takes as long as it can be
+ * expressed as something that can be called repeatedly without input
+ * or output. These functions use the BenchmarkTimer functionality
+ * internally as described above, but also uses a baseline function to
+ * compensate for overhead that should not be measured and also
+ * internal loop iteration calibration to be able to measure things
+ * that run really fast.
+ *
+ * <pre>
+ * Example:
+ *
+ * double min_time_s = BenchmarkTimer::benchmark([](){... do stuff ...}, 1.0);
+ * </pre>
+ **/
+class BenchmarkTimer
+{
+private:
+ using clock = std::conditional<std::chrono::high_resolution_clock::is_steady,
+ std::chrono::high_resolution_clock,
+ std::chrono::steady_clock>::type;
+
+ using seconds = std::chrono::duration<double, std::ratio<1,1>>;
+
+ double _budget;
+ double _min_time;
+ clock::time_point _budget_start;
+ clock::time_point _sample_start;
+
+ static double elapsed(clock::time_point start) {
+ clock::duration elapsed = (clock::now() - start);
+ return std::chrono::duration_cast<seconds>(elapsed).count();
+ }
+
+ static void do_nothing() {}
+
+ struct Loop {
+ virtual void perform(size_t cnt) const = 0;
+ virtual ~Loop() {}
+ };
+
+ struct Caller : Loop {
+ std::function<void()> function;
+ template <typename Callable> explicit Caller(Callable &&call_me) : function(call_me) {}
+ void perform(size_t cnt) const override {
+ for (size_t j = 0; j < cnt; ++j) {
+ function();
+ }
+ }
+ };
+
+ static size_t calibrate(const Loop &loop) {
+ for (size_t loop_cnt = 1; true; loop_cnt *= 2) {
+ vespalib::BenchmarkTimer timer(0.0);
+ for (size_t i = 0; i < 3; ++i) {
+ timer.before();
+ loop.perform(loop_cnt);
+ timer.after();
+ }
+ if (timer.min_time() > 0.010) {
+ return loop_cnt;
+ }
+ }
+ }
+
+ static double do_benchmark(const Loop &loop, size_t loop_cnt, double budget) {
+ vespalib::BenchmarkTimer timer(budget);
+ while (timer.has_budget()) {
+ timer.before();
+ loop.perform(loop_cnt);
+ timer.after();
+ }
+ return (timer.min_time() / double(loop_cnt));
+ }
+
+public:
+ explicit BenchmarkTimer(double budget)
+ : _budget(budget), _min_time(-1.0),
+ _budget_start(clock::now()), _sample_start(clock::now()) {}
+ bool has_budget() {
+ return (_min_time < 0.0 || elapsed(_budget_start) < _budget);
+ }
+ void before() {
+ _sample_start = clock::now();
+ }
+ void after() {
+ double new_time = elapsed(_sample_start);
+ _min_time = (_min_time < 0.0 || new_time < _min_time) ? new_time : _min_time;
+ }
+ double min_time() const { return _min_time; }
+
+ template <typename Callable1, typename Callable2>
+ static double benchmark(Callable1 &&function, Callable2 &&baseline, size_t loop_cnt, double budget) {
+ double overhead = do_benchmark(Caller(baseline), loop_cnt, budget * 0.2);
+ double actual_time = do_benchmark(Caller(function), loop_cnt, budget * 0.8);
+ return std::max(0.0, (actual_time - overhead));
+ }
+
+ template <typename Callable1, typename Callable2>
+ static double benchmark(Callable1 &&function, Callable2 &&baseline, double budget) {
+ return benchmark(function, baseline, calibrate(Caller(function)), budget);
+ }
+
+ template <typename Callable>
+ static double benchmark(Callable &&function, double budget) {
+ return benchmark(function, do_nothing, calibrate(Caller(function)), budget);
+ }
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.cpp b/vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.cpp
new file mode 100644
index 00000000000..4df04d15ce4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.cpp
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "blockingthreadstackexecutor.h"
+
+namespace vespalib {
+
+BlockingThreadStackExecutor::BlockingThreadStackExecutor(uint32_t threads, uint32_t stackSize, uint32_t taskLimit) :
+ ThreadStackExecutorBase(stackSize, taskLimit)
+{
+ start(threads);
+}
+
+BlockingThreadStackExecutor::~BlockingThreadStackExecutor()
+{
+ cleanup();
+}
+
+bool
+BlockingThreadStackExecutor::acceptNewTask(MonitorGuard & guard)
+{
+ while (!closed() && !isRoomForNewTask()) {
+ guard.wait();
+ }
+ return (!closed());
+}
+
+void
+BlockingThreadStackExecutor::wakeup(MonitorGuard & monitor)
+{
+ monitor.broadcast();
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.h b/vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.h
new file mode 100644
index 00000000000..5fba2c7dbe6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/blockingthreadstackexecutor.h
@@ -0,0 +1,33 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+#include "threadstackexecutorbase.h"
+
+namespace vespalib {
+
+/**
+ * An executor service that executes tasks in multiple threads.
+ **/
+class BlockingThreadStackExecutor : public ThreadStackExecutorBase
+{
+private:
+ virtual bool acceptNewTask(MonitorGuard & monitor);
+ virtual void wakeup(MonitorGuard & monitor);
+public:
+ /**
+ * Create a new blocking thread stack executor. The task limit specifies
+ * the maximum number of tasks that are currently handled by this
+ * executor. Trying to execute more tasks will block.
+ *
+ * @param threads number of worker threads (concurrent tasks)
+ * @param stackSize stack size per worker thread
+ * @param taskLimit upper limit on accepted tasks
+ **/
+ BlockingThreadStackExecutor(uint32_t threads, uint32_t stackSize, uint32_t taskLimit);
+ ~BlockingThreadStackExecutor();
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/bobhash.h b/vespalib/src/vespa/vespalib/util/bobhash.h
new file mode 100644
index 00000000000..439c582cccf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/bobhash.h
@@ -0,0 +1,159 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+
+namespace vespalib {
+
+/**
+ * @class BobHash
+ *
+ * @brief Hash function based on
+ * http://burtleburtle.net/bob/hash/index.html
+ * by Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+ * code any way you wish, private, educational, or commercial. It's free.
+ *
+ * @author Michael Susag
+ * @date Creation date: 2003-04-16
+ * @version $Id$
+ *
+ * Copyright (c) 2003 Fast Search & Transfer ASA
+ * ALL RIGHTS RESERVED
+ **/
+
+
+
+/*
+ --------------------------------------------------------------------
+ mix(a,b,c) -- mix 3 32-bit values reversibly.
+
+ For every delta with one or two bits set, and the deltas of all three
+ high bits or all three low bits, whether the original value of a,b,c
+ is almost all zero or is uniformly distributed,
+ * If mix() is run forward or backward, at least 32 bits in a,b,c
+ have at least 1/4 probability of changing.
+ * If mix() is run forward, every bit of c will change between 1/3 and
+ 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
+ mix() was built out of 36 single-cycle latency instructions in a
+ structure that could supported 2x parallelism, like so:
+ a -= b;
+ a -= c; x = (c>>13);
+ b -= c; a ^= x;
+ b -= a; x = (a<<8);
+ c -= a; b ^= x;
+ c -= b; x = (b>>13);
+ ...
+ Unfortunately, superscalar Pentiums and Sparcs can't take advantage
+ of that parallelism. They've also turned some of those single-cycle
+ latency instructions into multi-cycle latency instructions. Still,
+ this is the fastest good hash I could find. There were about 2^^68
+ to choose from. I only looked at a billion or so.
+ --------------------------------------------------------------------
+*/
+#define bobhash_mix(a,b,c) \
+{ \
+ a -= b; a -= c; a ^= (c>>13); \
+ b -= c; b -= a; b ^= (a<<8); \
+ c -= a; c -= b; c ^= (b>>13); \
+ a -= b; a -= c; a ^= (c>>12); \
+ b -= c; b -= a; b ^= (a<<16); \
+ c -= a; c -= b; c ^= (b>>5); \
+ a -= b; a -= c; a ^= (c>>3); \
+ b -= c; b -= a; b ^= (a<<10); \
+ c -= a; c -= b; c ^= (b>>15); \
+}
+
+
+class BobHash {
+public:
+
+ /**
+ * @brief The hash function - hash a variable-length key into a 32-bit value
+ *
+ * hash() -- hash a variable-length key into a 32-bit value
+ * k : the key (unaligned variable-length array of bytes)
+ * length : the length of the key, counting by bytes
+ * initval : can be any 4-byte value
+ * Returns a 32-bit value. Every bit of the key affects every bit of
+ * the return value. Every 1-bit and 2-bit delta achieves avalanche.
+ * About 6*len+35 instructions.
+ *
+ * The best hash table sizes are powers of 2. There is no need to do
+ * mod a prime (mod is sooo slow!). If you need less than 32 bits,
+ * use a bitmask. For example, if you need only 10 bits, do
+ * h = (h & hashmask(10));
+ * In which case, the hash table should have hashsize(10) elements.
+ *
+ * If you are hashing n strings (ub1 **)k, do it like this:
+ * for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
+ *
+ * By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+ * code any way you wish, private, educational, or commercial. It's free.
+ *
+ * See http://burtleburtle.net/bob/hash/evahash.html
+ * Use for hash table lookup, or anything where one collision in 2^^32 is
+ * acceptable. Do NOT use for cryptographic purposes.
+ *
+ * @param orig_k the key
+ * @param length the length of the key
+ * @param initval the previous hash, or an arbitrary value
+ * @return A 32 bit hash value
+ */
+
+ static uint32_t hash(const char *orig_k,
+ register uint32_t length,
+ register uint32_t initval) {
+ register uint32_t a,b,c,len;
+ register const unsigned char *k;
+ k = reinterpret_cast<const unsigned char *>(orig_k);
+
+ /* Set up the internal state */
+ len = length;
+ a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
+ c = initval; /* the previous hash value */
+
+ /*---------------------------------------- handle most of the key */
+ while (len >= 12)
+ {
+ a += (k[0] +
+ (static_cast<uint32_t>(k[1]) << 8) +
+ (static_cast<uint32_t>(k[2]) << 16) +
+ (static_cast<uint32_t>(k[3]) << 24));
+ b += (k[4] +
+ (static_cast<uint32_t>(k[5]) << 8) +
+ (static_cast<uint32_t>(k[6]) << 16) +
+ (static_cast<uint32_t>(k[7]) << 24));
+ c += (k[8] +
+ (static_cast<uint32_t>(k[9]) << 8) +
+ (static_cast<uint32_t>(k[10]) << 16) +
+ (static_cast<uint32_t>(k[11]) << 24));
+ bobhash_mix(a,b,c);
+ k += 12; len -= 12;
+ }
+
+ /*------------------------------------- handle the last 11 bytes */
+ c += length;
+ switch(len) /* all the case statements fall through */
+ {
+ case 11: c += (static_cast<uint32_t>(k[10]) << 24);
+ case 10: c += (static_cast<uint32_t>(k[9]) << 16);
+ case 9 : c += (static_cast<uint32_t>(k[8]) << 8);
+ /* the first byte of c is reserved for the length */
+ case 8 : b += (static_cast<uint32_t>(k[7]) << 24);
+ case 7 : b += (static_cast<uint32_t>(k[6]) << 16);
+ case 6 : b += (static_cast<uint32_t>(k[5]) << 8);
+ case 5 : b += k[4];
+ case 4 : a += (static_cast<uint32_t>(k[3]) << 24);
+ case 3 : a += (static_cast<uint32_t>(k[2]) << 16);
+ case 2 : a += (static_cast<uint32_t>(k[1]) << 8);
+ case 1 : a += k[0];
+ /* case 0: nothing left to add */
+ }
+ bobhash_mix(a,b,c);
+ /*-------------------------------------------- report the result */
+ return c;
+ }
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/box.cpp b/vespalib/src/vespa/vespalib/util/box.cpp
new file mode 100644
index 00000000000..13a0224f802
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/box.cpp
@@ -0,0 +1,10 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "box.h"
+
+namespace vespalib {
+
+template class Box<int>;
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/box.h b/vespalib/src/vespa/vespalib/util/box.h
new file mode 100644
index 00000000000..e16988fec46
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/box.h
@@ -0,0 +1,52 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+/**
+ * Simple utility used to bundle together parameters of the same type
+ * that are to be passed to some function as a vector.
+ **/
+template <typename T>
+class Box
+{
+private:
+ std::vector<T> _values;
+public:
+ Box &add(const T &t) {
+ _values.push_back(t);
+ return *this;
+ }
+ operator const std::vector<T> &() const { return _values; }
+};
+
+template <typename T>
+Box<T> make_box(const T &t1) {
+ return Box<T>().add(t1);
+}
+
+template <typename T>
+Box<T> make_box(const T &t1, const T &t2) {
+ return Box<T>().add(t1).add(t2);
+}
+
+template <typename T>
+Box<T> make_box(const T &t1, const T &t2, const T &t3) {
+ return Box<T>().add(t1).add(t2).add(t3);
+}
+
+template <typename T>
+Box<T> make_box(const T &t1, const T &t2, const T &t3, const T &t4) {
+ return Box<T>().add(t1).add(t2).add(t3).add(t4);
+}
+
+template <typename T>
+Box<T> make_box(const T &t1, const T &t2, const T &t3, const T &t4,
+ const T &t5)
+{
+ return Box<T>().add(t1).add(t2).add(t3).add(t4).add(t5);
+}
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/buffer.h b/vespalib/src/vespa/vespalib/util/buffer.h
new file mode 100644
index 00000000000..d4ac549de95
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/buffer.h
@@ -0,0 +1,48 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+
+namespace vespalib {
+
+/**
+ * Reference to a memory buffer with external ownership.
+ */
+class BufferRef
+{
+public:
+ BufferRef() : _buf(NULL), _sz(0) { }
+ BufferRef(void * buf, size_t sz) : _buf(buf), _sz(sz) { }
+ const char * c_str() const { return static_cast<const char *>(_buf); }
+ char * str() { return static_cast<char *>(_buf); }
+ const void * data() const { return _buf; }
+ void * data() { return _buf; }
+ size_t size() const { return _sz; }
+ void setSize(size_t sz) { _sz = sz; }
+ char & operator [] (size_t i) { return str()[i]; }
+ const char & operator [] (size_t i) const { return c_str()[i]; }
+private:
+ void * _buf;
+ size_t _sz;
+};
+
+/**
+ * Reference to a constant memory buffer with external ownership.
+ */
+class ConstBufferRef
+{
+public:
+ ConstBufferRef() : _buf(NULL), _sz(0) { }
+ ConstBufferRef(const void * buf, size_t sz) : _buf(buf), _sz(sz) { }
+ ConstBufferRef(const BufferRef & rhs) : _buf(rhs.data()), _sz(rhs.size()) { }
+ const char * c_str() const { return static_cast<const char *>(_buf); }
+ const void * data() const { return _buf; }
+ size_t size() const { return _sz; }
+ const char & operator [] (size_t i) const { return c_str()[i]; }
+private:
+ const void * _buf;
+ size_t _sz;
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/closure.h b/vespalib/src/vespa/vespalib/util/closure.h
new file mode 100644
index 00000000000..798ab4ea698
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/closure.h
@@ -0,0 +1,1405 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// This file was generated by the gen_closure.py script.
+
+#pragma once
+
+#include <memory>
+
+namespace vespalib {
+
+// Interfaces -----------------------------------------------------------------
+
+/** Interface of closures that take no arguments. */
+template <typename R = void>
+struct Closure0 {
+ typedef std::unique_ptr<Closure0<R> > UP;
+
+ virtual ~Closure0() {}
+
+ virtual R call() = 0;
+};
+typedef Closure0<void> Closure;
+
+/** Interface of closures that take one argument. */
+template <typename P1, typename R = void>
+struct Closure1 {
+ typedef std::unique_ptr<Closure1<P1, R> > UP;
+
+ virtual ~Closure1() {}
+
+ virtual R call(P1 param1) = 0;
+};
+
+/** Interface of closures that take two arguments. */
+template <typename P1, typename P2, typename R = void>
+struct Closure2 {
+ typedef std::unique_ptr<Closure2<P1, P2, R> > UP;
+
+ virtual ~Closure2() {}
+
+ virtual R call(P1 param1, P2 param2) = 0;
+};
+
+/** Interface of closures that take three arguments. */
+template <typename P1, typename P2, typename P3, typename R = void>
+struct Closure3 {
+ typedef std::unique_ptr<Closure3<P1, P2, P3, R> > UP;
+
+ virtual ~Closure3() {}
+
+ virtual R call(P1 param1, P2 param2, P3 param3) = 0;
+};
+
+/** Interface of closures that take four arguments. */
+template <typename P1, typename P2, typename P3, typename P4, typename R = void>
+struct Closure4 {
+ typedef std::unique_ptr<Closure4<P1, P2, P3, P4, R> > UP;
+
+ virtual ~Closure4() {}
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4) = 0;
+};
+
+// Closure0 -------------------------------------------------------------------
+
+/** Implementation of Closure0 binding no arguments to a free function. */
+template <typename R>
+class Closure0_0 : public Closure0<R> {
+ typedef R (*Func)();
+
+ Func _func;
+
+ virtual R call()
+ { return _func(); }
+
+public:
+ Closure0_0(Func func)
+ : _func(func) {}
+};
+
+/** Implementation of Closure0 binding one argument to a free function. */
+template <typename T1, typename R>
+class Closure0_1 : public Closure0<R> {
+ typedef R (*Func)(T1);
+
+ Func _func;
+ T1 _arg1;
+
+ virtual R call()
+ { return _func(std::move(_arg1)); }
+
+public:
+ Closure0_1(Func func, T1 &&arg1)
+ : _func(func), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure0 binding two arguments to a free function. */
+template <typename T1, typename T2, typename R>
+class Closure0_2 : public Closure0<R> {
+ typedef R (*Func)(T1, T2);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call()
+ { return _func(std::move(_arg1), std::move(_arg2)); }
+
+public:
+ Closure0_2(Func func, T1 &&arg1, T2 &&arg2)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure0 binding three arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename R>
+class Closure0_3 : public Closure0<R> {
+ typedef R (*Func)(T1, T2, T3);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call()
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3)); }
+
+public:
+ Closure0_3(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure0 binding four arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename T4, typename R>
+class Closure0_4 : public Closure0<R> {
+ typedef R (*Func)(T1, T2, T3, T4);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call()
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4)); }
+
+public:
+ Closure0_4(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3, T4 &&arg4)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// MemberClosure0 -------------------------------------------------------------
+
+/** Implementation of Closure0 binding no arguments to a member function. */
+template <class Ptr, class Obj, typename R>
+class MemberClosure0_0 : public Closure0<R> {
+ typedef R (Obj::*MemFun)();
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+
+ virtual R call()
+ { return ((*_ptr).*_mem_fun)(); }
+
+public:
+ MemberClosure0_0(Ptr ptr, MemFun mem_fun)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun) {}
+};
+
+/** Implementation of Closure0 binding one argument to a member function. */
+template <class Ptr, class Obj, typename T1, typename R>
+class MemberClosure0_1 : public Closure0<R> {
+ typedef R (Obj::*MemFun)(T1);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+
+ virtual R call()
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1)); }
+
+public:
+ MemberClosure0_1(Ptr ptr, MemFun mem_fun, T1 arg1)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure0 binding two arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename R>
+class MemberClosure0_2 : public Closure0<R> {
+ typedef R (Obj::*MemFun)(T1, T2);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call()
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2)); }
+
+public:
+ MemberClosure0_2(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure0 binding three arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename R>
+class MemberClosure0_3 : public Closure0<R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call()
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3)); }
+
+public:
+ MemberClosure0_3(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure0 binding four arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename R>
+class MemberClosure0_4 : public Closure0<R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, T4);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call()
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4)); }
+
+public:
+ MemberClosure0_4(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// Closure1 -------------------------------------------------------------------
+
+/** Implementation of Closure1 binding no arguments to a free function. */
+template <typename P1, typename R>
+class Closure1_0 : public Closure1<P1, R> {
+ typedef R (*Func)(P1);
+
+ Func _func;
+
+ virtual R call(P1 param1)
+ { return _func(std::move(param1)); }
+
+public:
+ Closure1_0(Func func)
+ : _func(func) {}
+};
+
+/** Implementation of Closure1 binding one argument to a free function. */
+template <typename T1, typename P1, typename R>
+class Closure1_1 : public Closure1<P1, R> {
+ typedef R (*Func)(T1, P1);
+
+ Func _func;
+ T1 _arg1;
+
+ virtual R call(P1 param1)
+ { return _func(std::move(_arg1), std::move(param1)); }
+
+public:
+ Closure1_1(Func func, T1 &&arg1)
+ : _func(func), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure1 binding two arguments to a free function. */
+template <typename T1, typename T2, typename P1, typename R>
+class Closure1_2 : public Closure1<P1, R> {
+ typedef R (*Func)(T1, T2, P1);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(param1)); }
+
+public:
+ Closure1_2(Func func, T1 &&arg1, T2 &&arg2)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure1 binding three arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename P1, typename R>
+class Closure1_3 : public Closure1<P1, R> {
+ typedef R (*Func)(T1, T2, T3, P1);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1)); }
+
+public:
+ Closure1_3(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure1 binding four arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename R>
+class Closure1_4 : public Closure1<P1, R> {
+ typedef R (*Func)(T1, T2, T3, T4, P1);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1)); }
+
+public:
+ Closure1_4(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3, T4 &&arg4)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// MemberClosure1 -------------------------------------------------------------
+
+/** Implementation of Closure1 binding no arguments to a member function. */
+template <class Ptr, class Obj, typename P1, typename R>
+class MemberClosure1_0 : public Closure1<P1, R> {
+ typedef R (Obj::*MemFun)(P1);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+
+ virtual R call(P1 param1)
+ { return ((*_ptr).*_mem_fun)(std::move(param1)); }
+
+public:
+ MemberClosure1_0(Ptr ptr, MemFun mem_fun)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun) {}
+};
+
+/** Implementation of Closure1 binding one argument to a member function. */
+template <class Ptr, class Obj, typename T1, typename P1, typename R>
+class MemberClosure1_1 : public Closure1<P1, R> {
+ typedef R (Obj::*MemFun)(T1, P1);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+
+ virtual R call(P1 param1)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(param1)); }
+
+public:
+ MemberClosure1_1(Ptr ptr, MemFun mem_fun, T1 arg1)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure1 binding two arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename R>
+class MemberClosure1_2 : public Closure1<P1, R> {
+ typedef R (Obj::*MemFun)(T1, T2, P1);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(param1)); }
+
+public:
+ MemberClosure1_2(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure1 binding three arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename R>
+class MemberClosure1_3 : public Closure1<P1, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, P1);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1)); }
+
+public:
+ MemberClosure1_3(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure1 binding four arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename R>
+class MemberClosure1_4 : public Closure1<P1, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, T4, P1);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1)); }
+
+public:
+ MemberClosure1_4(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// Closure2 -------------------------------------------------------------------
+
+/** Implementation of Closure2 binding no arguments to a free function. */
+template <typename P1, typename P2, typename R>
+class Closure2_0 : public Closure2<P1, P2, R> {
+ typedef R (*Func)(P1, P2);
+
+ Func _func;
+
+ virtual R call(P1 param1, P2 param2)
+ { return _func(std::move(param1), std::move(param2)); }
+
+public:
+ Closure2_0(Func func)
+ : _func(func) {}
+};
+
+/** Implementation of Closure2 binding one argument to a free function. */
+template <typename T1, typename P1, typename P2, typename R>
+class Closure2_1 : public Closure2<P1, P2, R> {
+ typedef R (*Func)(T1, P1, P2);
+
+ Func _func;
+ T1 _arg1;
+
+ virtual R call(P1 param1, P2 param2)
+ { return _func(std::move(_arg1), std::move(param1), std::move(param2)); }
+
+public:
+ Closure2_1(Func func, T1 &&arg1)
+ : _func(func), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure2 binding two arguments to a free function. */
+template <typename T1, typename T2, typename P1, typename P2, typename R>
+class Closure2_2 : public Closure2<P1, P2, R> {
+ typedef R (*Func)(T1, T2, P1, P2);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1, P2 param2)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(param1), std::move(param2)); }
+
+public:
+ Closure2_2(Func func, T1 &&arg1, T2 &&arg2)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure2 binding three arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename P1, typename P2, typename R>
+class Closure2_3 : public Closure2<P1, P2, R> {
+ typedef R (*Func)(T1, T2, T3, P1, P2);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1, P2 param2)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1), std::move(param2)); }
+
+public:
+ Closure2_3(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure2 binding four arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename R>
+class Closure2_4 : public Closure2<P1, P2, R> {
+ typedef R (*Func)(T1, T2, T3, T4, P1, P2);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1, P2 param2)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1), std::move(param2)); }
+
+public:
+ Closure2_4(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3, T4 &&arg4)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// MemberClosure2 -------------------------------------------------------------
+
+/** Implementation of Closure2 binding no arguments to a member function. */
+template <class Ptr, class Obj, typename P1, typename P2, typename R>
+class MemberClosure2_0 : public Closure2<P1, P2, R> {
+ typedef R (Obj::*MemFun)(P1, P2);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+
+ virtual R call(P1 param1, P2 param2)
+ { return ((*_ptr).*_mem_fun)(std::move(param1), std::move(param2)); }
+
+public:
+ MemberClosure2_0(Ptr ptr, MemFun mem_fun)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun) {}
+};
+
+/** Implementation of Closure2 binding one argument to a member function. */
+template <class Ptr, class Obj, typename T1, typename P1, typename P2, typename R>
+class MemberClosure2_1 : public Closure2<P1, P2, R> {
+ typedef R (Obj::*MemFun)(T1, P1, P2);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+
+ virtual R call(P1 param1, P2 param2)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(param1), std::move(param2)); }
+
+public:
+ MemberClosure2_1(Ptr ptr, MemFun mem_fun, T1 arg1)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure2 binding two arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename P2, typename R>
+class MemberClosure2_2 : public Closure2<P1, P2, R> {
+ typedef R (Obj::*MemFun)(T1, T2, P1, P2);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1, P2 param2)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(param1), std::move(param2)); }
+
+public:
+ MemberClosure2_2(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure2 binding three arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename P2, typename R>
+class MemberClosure2_3 : public Closure2<P1, P2, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, P1, P2);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1, P2 param2)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1), std::move(param2)); }
+
+public:
+ MemberClosure2_3(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure2 binding four arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename R>
+class MemberClosure2_4 : public Closure2<P1, P2, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, T4, P1, P2);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1, P2 param2)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1), std::move(param2)); }
+
+public:
+ MemberClosure2_4(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// Closure3 -------------------------------------------------------------------
+
+/** Implementation of Closure3 binding no arguments to a free function. */
+template <typename P1, typename P2, typename P3, typename R>
+class Closure3_0 : public Closure3<P1, P2, P3, R> {
+ typedef R (*Func)(P1, P2, P3);
+
+ Func _func;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return _func(std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ Closure3_0(Func func)
+ : _func(func) {}
+};
+
+/** Implementation of Closure3 binding one argument to a free function. */
+template <typename T1, typename P1, typename P2, typename P3, typename R>
+class Closure3_1 : public Closure3<P1, P2, P3, R> {
+ typedef R (*Func)(T1, P1, P2, P3);
+
+ Func _func;
+ T1 _arg1;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return _func(std::move(_arg1), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ Closure3_1(Func func, T1 &&arg1)
+ : _func(func), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure3 binding two arguments to a free function. */
+template <typename T1, typename T2, typename P1, typename P2, typename P3, typename R>
+class Closure3_2 : public Closure3<P1, P2, P3, R> {
+ typedef R (*Func)(T1, T2, P1, P2, P3);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ Closure3_2(Func func, T1 &&arg1, T2 &&arg2)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure3 binding three arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename R>
+class Closure3_3 : public Closure3<P1, P2, P3, R> {
+ typedef R (*Func)(T1, T2, T3, P1, P2, P3);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ Closure3_3(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure3 binding four arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename R>
+class Closure3_4 : public Closure3<P1, P2, P3, R> {
+ typedef R (*Func)(T1, T2, T3, T4, P1, P2, P3);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ Closure3_4(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3, T4 &&arg4)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// MemberClosure3 -------------------------------------------------------------
+
+/** Implementation of Closure3 binding no arguments to a member function. */
+template <class Ptr, class Obj, typename P1, typename P2, typename P3, typename R>
+class MemberClosure3_0 : public Closure3<P1, P2, P3, R> {
+ typedef R (Obj::*MemFun)(P1, P2, P3);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return ((*_ptr).*_mem_fun)(std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ MemberClosure3_0(Ptr ptr, MemFun mem_fun)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun) {}
+};
+
+/** Implementation of Closure3 binding one argument to a member function. */
+template <class Ptr, class Obj, typename T1, typename P1, typename P2, typename P3, typename R>
+class MemberClosure3_1 : public Closure3<P1, P2, P3, R> {
+ typedef R (Obj::*MemFun)(T1, P1, P2, P3);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ MemberClosure3_1(Ptr ptr, MemFun mem_fun, T1 arg1)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure3 binding two arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename P2, typename P3, typename R>
+class MemberClosure3_2 : public Closure3<P1, P2, P3, R> {
+ typedef R (Obj::*MemFun)(T1, T2, P1, P2, P3);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ MemberClosure3_2(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure3 binding three arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename R>
+class MemberClosure3_3 : public Closure3<P1, P2, P3, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, P1, P2, P3);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ MemberClosure3_3(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure3 binding four arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename R>
+class MemberClosure3_4 : public Closure3<P1, P2, P3, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, T4, P1, P2, P3);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1, P2 param2, P3 param3)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1), std::move(param2), std::move(param3)); }
+
+public:
+ MemberClosure3_4(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// Closure4 -------------------------------------------------------------------
+
+/** Implementation of Closure4 binding no arguments to a free function. */
+template <typename P1, typename P2, typename P3, typename P4, typename R>
+class Closure4_0 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (*Func)(P1, P2, P3, P4);
+
+ Func _func;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return _func(std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ Closure4_0(Func func)
+ : _func(func) {}
+};
+
+/** Implementation of Closure4 binding one argument to a free function. */
+template <typename T1, typename P1, typename P2, typename P3, typename P4, typename R>
+class Closure4_1 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (*Func)(T1, P1, P2, P3, P4);
+
+ Func _func;
+ T1 _arg1;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return _func(std::move(_arg1), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ Closure4_1(Func func, T1 &&arg1)
+ : _func(func), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure4 binding two arguments to a free function. */
+template <typename T1, typename T2, typename P1, typename P2, typename P3, typename P4, typename R>
+class Closure4_2 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (*Func)(T1, T2, P1, P2, P3, P4);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ Closure4_2(Func func, T1 &&arg1, T2 &&arg2)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure4 binding three arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename P4, typename R>
+class Closure4_3 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (*Func)(T1, T2, T3, P1, P2, P3, P4);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ Closure4_3(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure4 binding four arguments to a free function. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename P4, typename R>
+class Closure4_4 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (*Func)(T1, T2, T3, T4, P1, P2, P3, P4);
+
+ Func _func;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return _func(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ Closure4_4(Func func, T1 &&arg1, T2 &&arg2, T3 &&arg3, T4 &&arg4)
+ : _func(func), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// MemberClosure4 -------------------------------------------------------------
+
+/** Implementation of Closure4 binding no arguments to a member function. */
+template <class Ptr, class Obj, typename P1, typename P2, typename P3, typename P4, typename R>
+class MemberClosure4_0 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (Obj::*MemFun)(P1, P2, P3, P4);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return ((*_ptr).*_mem_fun)(std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ MemberClosure4_0(Ptr ptr, MemFun mem_fun)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun) {}
+};
+
+/** Implementation of Closure4 binding one argument to a member function. */
+template <class Ptr, class Obj, typename T1, typename P1, typename P2, typename P3, typename P4, typename R>
+class MemberClosure4_1 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (Obj::*MemFun)(T1, P1, P2, P3, P4);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ MemberClosure4_1(Ptr ptr, MemFun mem_fun, T1 arg1)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)) {}
+};
+
+/** Implementation of Closure4 binding two arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename P2, typename P3, typename P4, typename R>
+class MemberClosure4_2 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (Obj::*MemFun)(T1, T2, P1, P2, P3, P4);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ MemberClosure4_2(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)) {}
+};
+
+/** Implementation of Closure4 binding three arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename P4, typename R>
+class MemberClosure4_3 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, P1, P2, P3, P4);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ MemberClosure4_3(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)) {}
+};
+
+/** Implementation of Closure4 binding four arguments to a member function. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename P4, typename R>
+class MemberClosure4_4 : public Closure4<P1, P2, P3, P4, R> {
+ typedef R (Obj::*MemFun)(T1, T2, T3, T4, P1, P2, P3, P4);
+
+ Ptr _ptr;
+ MemFun _mem_fun;
+ T1 _arg1;
+ T2 _arg2;
+ T3 _arg3;
+ T4 _arg4;
+
+ virtual R call(P1 param1, P2 param2, P3 param3, P4 param4)
+ { return ((*_ptr).*_mem_fun)(std::move(_arg1), std::move(_arg2), std::move(_arg3), std::move(_arg4), std::move(param1), std::move(param2), std::move(param3), std::move(param4)); }
+
+public:
+ MemberClosure4_4(Ptr ptr, MemFun mem_fun, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun), _arg1(std::move(arg1)), _arg2(std::move(arg2)), _arg3(std::move(arg3)), _arg4(std::move(arg4)) {}
+};
+
+// Function closures (0) ------------------------------------------------------
+
+/** Creates a Closure0 from a free function, binding no arguments. */
+template <typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(R (*func)()) {
+ return std::unique_ptr<Closure0<R> >(
+ new Closure0_0<R>(func));
+}
+
+/** Creates a Closure0 from a free function, binding one argument. */
+template <typename T1, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(R (*func)(T1), T1 arg1) {
+ return std::unique_ptr<Closure0<R> >(
+ new Closure0_1<T1, R>(func, std::move(arg1)));
+}
+
+/** Creates a Closure0 from a free function, binding two arguments. */
+template <typename T1, typename T2, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(R (*func)(T1, T2), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure0<R> >(
+ new Closure0_2<T1, T2, R>(func, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure0 from a free function, binding three arguments. */
+template <typename T1, typename T2, typename T3, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(R (*func)(T1, T2, T3), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure0<R> >(
+ new Closure0_3<T1, T2, T3, R>(func, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure0 from a free function, binding four arguments. */
+template <typename T1, typename T2, typename T3, typename T4, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(R (*func)(T1, T2, T3, T4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure0<R> >(
+ new Closure0_4<T1, T2, T3, T4, R>(func, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Member closures (0) --------------------------------------------------------
+
+/** Creates a Closure0 from a member function, binding no arguments. */
+template <class Ptr, class Obj, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)()) {
+ return std::unique_ptr<Closure0<R> >(
+ new MemberClosure0_0<Ptr, Obj, R>(
+ std::move(ptr), mem_fun));
+}
+
+/** Creates a Closure0 from a member function, binding one argument. */
+template <class Ptr, class Obj, typename T1, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1), T1 arg1) {
+ return std::unique_ptr<Closure0<R> >(
+ new MemberClosure0_1<Ptr, Obj, T1, R>(
+ std::move(ptr), mem_fun, std::move(arg1)));
+}
+
+/** Creates a Closure0 from a member function, binding two arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure0<R> >(
+ new MemberClosure0_2<Ptr, Obj, T1, T2, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure0 from a member function, binding three arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure0<R> >(
+ new MemberClosure0_3<Ptr, Obj, T1, T2, T3, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure0 from a member function, binding four arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename R>
+std::unique_ptr<Closure0<R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, T4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure0<R> >(
+ new MemberClosure0_4<Ptr, Obj, T1, T2, T3, T4, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Function closures (1) ------------------------------------------------------
+
+/** Creates a Closure1 from a free function, binding no arguments. */
+template <typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(R (*func)(P1)) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new Closure1_0<P1, R>(func));
+}
+
+/** Creates a Closure1 from a free function, binding one argument. */
+template <typename T1, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(R (*func)(T1, P1), T1 arg1) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new Closure1_1<T1, P1, R>(func, std::move(arg1)));
+}
+
+/** Creates a Closure1 from a free function, binding two arguments. */
+template <typename T1, typename T2, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(R (*func)(T1, T2, P1), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new Closure1_2<T1, T2, P1, R>(func, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure1 from a free function, binding three arguments. */
+template <typename T1, typename T2, typename T3, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(R (*func)(T1, T2, T3, P1), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new Closure1_3<T1, T2, T3, P1, R>(func, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure1 from a free function, binding four arguments. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(R (*func)(T1, T2, T3, T4, P1), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new Closure1_4<T1, T2, T3, T4, P1, R>(func, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Member closures (1) --------------------------------------------------------
+
+/** Creates a Closure1 from a member function, binding no arguments. */
+template <class Ptr, class Obj, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(P1)) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new MemberClosure1_0<Ptr, Obj, P1, R>(
+ std::move(ptr), mem_fun));
+}
+
+/** Creates a Closure1 from a member function, binding one argument. */
+template <class Ptr, class Obj, typename T1, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, P1), T1 arg1) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new MemberClosure1_1<Ptr, Obj, T1, P1, R>(
+ std::move(ptr), mem_fun, std::move(arg1)));
+}
+
+/** Creates a Closure1 from a member function, binding two arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, P1), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new MemberClosure1_2<Ptr, Obj, T1, T2, P1, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure1 from a member function, binding three arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, P1), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new MemberClosure1_3<Ptr, Obj, T1, T2, T3, P1, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure1 from a member function, binding four arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename R>
+std::unique_ptr<Closure1<P1, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, T4, P1), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure1<P1, R> >(
+ new MemberClosure1_4<Ptr, Obj, T1, T2, T3, T4, P1, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Function closures (2) ------------------------------------------------------
+
+/** Creates a Closure2 from a free function, binding no arguments. */
+template <typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(R (*func)(P1, P2)) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new Closure2_0<P1, P2, R>(func));
+}
+
+/** Creates a Closure2 from a free function, binding one argument. */
+template <typename T1, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(R (*func)(T1, P1, P2), T1 arg1) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new Closure2_1<T1, P1, P2, R>(func, std::move(arg1)));
+}
+
+/** Creates a Closure2 from a free function, binding two arguments. */
+template <typename T1, typename T2, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(R (*func)(T1, T2, P1, P2), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new Closure2_2<T1, T2, P1, P2, R>(func, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure2 from a free function, binding three arguments. */
+template <typename T1, typename T2, typename T3, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(R (*func)(T1, T2, T3, P1, P2), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new Closure2_3<T1, T2, T3, P1, P2, R>(func, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure2 from a free function, binding four arguments. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(R (*func)(T1, T2, T3, T4, P1, P2), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new Closure2_4<T1, T2, T3, T4, P1, P2, R>(func, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Member closures (2) --------------------------------------------------------
+
+/** Creates a Closure2 from a member function, binding no arguments. */
+template <class Ptr, class Obj, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(P1, P2)) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new MemberClosure2_0<Ptr, Obj, P1, P2, R>(
+ std::move(ptr), mem_fun));
+}
+
+/** Creates a Closure2 from a member function, binding one argument. */
+template <class Ptr, class Obj, typename T1, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, P1, P2), T1 arg1) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new MemberClosure2_1<Ptr, Obj, T1, P1, P2, R>(
+ std::move(ptr), mem_fun, std::move(arg1)));
+}
+
+/** Creates a Closure2 from a member function, binding two arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, P1, P2), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new MemberClosure2_2<Ptr, Obj, T1, T2, P1, P2, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure2 from a member function, binding three arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, P1, P2), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new MemberClosure2_3<Ptr, Obj, T1, T2, T3, P1, P2, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure2 from a member function, binding four arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename R>
+std::unique_ptr<Closure2<P1, P2, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, T4, P1, P2), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure2<P1, P2, R> >(
+ new MemberClosure2_4<Ptr, Obj, T1, T2, T3, T4, P1, P2, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Function closures (3) ------------------------------------------------------
+
+/** Creates a Closure3 from a free function, binding no arguments. */
+template <typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(R (*func)(P1, P2, P3)) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new Closure3_0<P1, P2, P3, R>(func));
+}
+
+/** Creates a Closure3 from a free function, binding one argument. */
+template <typename T1, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(R (*func)(T1, P1, P2, P3), T1 arg1) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new Closure3_1<T1, P1, P2, P3, R>(func, std::move(arg1)));
+}
+
+/** Creates a Closure3 from a free function, binding two arguments. */
+template <typename T1, typename T2, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(R (*func)(T1, T2, P1, P2, P3), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new Closure3_2<T1, T2, P1, P2, P3, R>(func, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure3 from a free function, binding three arguments. */
+template <typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(R (*func)(T1, T2, T3, P1, P2, P3), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new Closure3_3<T1, T2, T3, P1, P2, P3, R>(func, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure3 from a free function, binding four arguments. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(R (*func)(T1, T2, T3, T4, P1, P2, P3), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new Closure3_4<T1, T2, T3, T4, P1, P2, P3, R>(func, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Member closures (3) --------------------------------------------------------
+
+/** Creates a Closure3 from a member function, binding no arguments. */
+template <class Ptr, class Obj, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(P1, P2, P3)) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new MemberClosure3_0<Ptr, Obj, P1, P2, P3, R>(
+ std::move(ptr), mem_fun));
+}
+
+/** Creates a Closure3 from a member function, binding one argument. */
+template <class Ptr, class Obj, typename T1, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, P1, P2, P3), T1 arg1) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new MemberClosure3_1<Ptr, Obj, T1, P1, P2, P3, R>(
+ std::move(ptr), mem_fun, std::move(arg1)));
+}
+
+/** Creates a Closure3 from a member function, binding two arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, P1, P2, P3), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new MemberClosure3_2<Ptr, Obj, T1, T2, P1, P2, P3, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure3 from a member function, binding three arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, P1, P2, P3), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new MemberClosure3_3<Ptr, Obj, T1, T2, T3, P1, P2, P3, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure3 from a member function, binding four arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename R>
+std::unique_ptr<Closure3<P1, P2, P3, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, T4, P1, P2, P3), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure3<P1, P2, P3, R> >(
+ new MemberClosure3_4<Ptr, Obj, T1, T2, T3, T4, P1, P2, P3, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Function closures (4) ------------------------------------------------------
+
+/** Creates a Closure4 from a free function, binding no arguments. */
+template <typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(R (*func)(P1, P2, P3, P4)) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new Closure4_0<P1, P2, P3, P4, R>(func));
+}
+
+/** Creates a Closure4 from a free function, binding one argument. */
+template <typename T1, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(R (*func)(T1, P1, P2, P3, P4), T1 arg1) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new Closure4_1<T1, P1, P2, P3, P4, R>(func, std::move(arg1)));
+}
+
+/** Creates a Closure4 from a free function, binding two arguments. */
+template <typename T1, typename T2, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(R (*func)(T1, T2, P1, P2, P3, P4), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new Closure4_2<T1, T2, P1, P2, P3, P4, R>(func, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure4 from a free function, binding three arguments. */
+template <typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(R (*func)(T1, T2, T3, P1, P2, P3, P4), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new Closure4_3<T1, T2, T3, P1, P2, P3, P4, R>(func, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure4 from a free function, binding four arguments. */
+template <typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(R (*func)(T1, T2, T3, T4, P1, P2, P3, P4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new Closure4_4<T1, T2, T3, T4, P1, P2, P3, P4, R>(func, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+// Member closures (4) --------------------------------------------------------
+
+/** Creates a Closure4 from a member function, binding no arguments. */
+template <class Ptr, class Obj, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(P1, P2, P3, P4)) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new MemberClosure4_0<Ptr, Obj, P1, P2, P3, P4, R>(
+ std::move(ptr), mem_fun));
+}
+
+/** Creates a Closure4 from a member function, binding one argument. */
+template <class Ptr, class Obj, typename T1, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, P1, P2, P3, P4), T1 arg1) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new MemberClosure4_1<Ptr, Obj, T1, P1, P2, P3, P4, R>(
+ std::move(ptr), mem_fun, std::move(arg1)));
+}
+
+/** Creates a Closure4 from a member function, binding two arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, P1, P2, P3, P4), T1 arg1, T2 arg2) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new MemberClosure4_2<Ptr, Obj, T1, T2, P1, P2, P3, P4, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2)));
+}
+
+/** Creates a Closure4 from a member function, binding three arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, P1, P2, P3, P4), T1 arg1, T2 arg2, T3 arg3) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new MemberClosure4_3<Ptr, Obj, T1, T2, T3, P1, P2, P3, P4, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3)));
+}
+
+/** Creates a Closure4 from a member function, binding four arguments. */
+template <class Ptr, class Obj, typename T1, typename T2, typename T3, typename T4, typename P1, typename P2, typename P3, typename P4, typename R>
+std::unique_ptr<Closure4<P1, P2, P3, P4, R> >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(T1, T2, T3, T4, P1, P2, P3, P4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+ return std::unique_ptr<Closure4<P1, P2, P3, P4, R> >(
+ new MemberClosure4_4<Ptr, Obj, T1, T2, T3, T4, P1, P2, P3, P4, R>(
+ std::move(ptr), mem_fun, std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4)));
+}
+
+} // namespace vespalib
+
+
diff --git a/vespalib/src/vespa/vespalib/util/closuretask.h b/vespalib/src/vespa/vespalib/util/closuretask.h
new file mode 100644
index 00000000000..0bba289817e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/closuretask.h
@@ -0,0 +1,29 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "closure.h"
+#include "executor.h"
+
+namespace vespalib {
+
+/**
+ * Wrapper class for using closures as tasks to an executor.
+ **/
+class ClosureTask : public Executor::Task {
+ std::unique_ptr<Closure> _closure;
+
+public:
+ ClosureTask(std::unique_ptr<Closure> closure) : _closure(std::move(closure)) {}
+ virtual void run() { _closure->call(); }
+};
+
+/**
+ * Wraps a Closure as an Executor::Task.
+ **/
+static inline Executor::Task::UP makeTask(std::unique_ptr<Closure> closure) {
+ return Executor::Task::UP(new ClosureTask(std::move(closure)));
+}
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/compress.cpp b/vespalib/src/vespa/vespalib/util/compress.cpp
new file mode 100644
index 00000000000..e105c05f947
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/compress.cpp
@@ -0,0 +1,87 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "compress.h"
+#include "stringfmt.h"
+#include "exceptions.h"
+
+namespace vespalib {
+namespace compress {
+
+size_t Integer::compressedPositiveLength(uint64_t n)
+{
+ if (n < (0x1 << 6)) {
+ return 1;
+ } else if (n < (0x1 << 14)) {
+ return 2;
+ } else if ( n < (0x1 << 30)) {
+ return 4;
+ } else {
+ throw IllegalArgumentException(make_string("Number '%lu' too big, must extend encoding", n));
+ }
+}
+
+size_t Integer::compressPositive(uint64_t n, void *destination)
+{
+ uint8_t * d = static_cast<uint8_t *>(destination);
+ if (n < (0x1 << 6)) {
+ d[0] = n;
+ return 1;
+ } else if (n < (0x1 << 14)) {
+ d[0] = (n >> 8) | 0x80;
+ d[1] = n & 0xff;
+ return 2;
+ } else if ( n < (0x1 << 30)) {
+ n = n | 0xc0000000;
+ d[0] = (n >> 24) & 0xff;
+ d[1] = (n >> 16) & 0xff;
+ d[2] = (n >> 8) & 0xff;
+ d[3] = n & 0xff;
+ return 4;
+ } else {
+ throw IllegalArgumentException(make_string("Number '%lu' too big, must extend encoding", n));
+ }
+}
+
+size_t Integer::compressedLength(int64_t n)
+{
+ if (n < 0) {
+ n = -n;
+ }
+ if (n < (0x1 << 5)) {
+ return 1;
+ } else if (n < (0x1 << 13)) {
+ return 2;
+ } else if ( n < (0x1 << 29)) {
+ return 4;
+ } else {
+ throw IllegalArgumentException(make_string("Number '%ld' too big, must extend encoding", n));
+ }
+}
+
+size_t Integer::compress(int64_t n, void *destination)
+{
+ uint8_t * d = static_cast<uint8_t *>(destination);
+ int negative = n < 0 ? 0x80 : 0x0;
+ if (negative != 0) {
+ n = -n;
+ }
+ if (n < (0x1 << 5)) {
+ d[0] = n | negative;
+ return 1;
+ } else if (n < (0x1 << 13)) {
+ d[0] = (n >> 8) | 0x40 | negative;
+ d[1] = n & 0xff;
+ return 2;
+ } else if ( n < (0x1 << 29)) {
+ d[0] = ((n >> 24) | 0x60 | negative) & 0xff;
+ d[1] = (n >> 16) & 0xff;
+ d[2] = (n >> 8) & 0xff;
+ d[3] = n & 0xff;
+ return 4;
+ } else {
+ throw IllegalArgumentException(make_string("Number '%ld' too big, must extend encoding", negative ? -n : n));
+ }
+}
+
+}
+}
diff --git a/vespalib/src/vespa/vespalib/util/compress.h b/vespalib/src/vespa/vespalib/util/compress.h
new file mode 100644
index 00000000000..5605e5cccd0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/compress.h
@@ -0,0 +1,92 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <stdint.h>
+#include <sys/types.h>
+
+namespace vespalib {
+
+namespace compress {
+
+class Integer {
+public:
+ /**
+ * Will compress a positive integer to either 1,2 or 4 bytes
+ * @param n Number to compress
+ * @param destination Where to put the compressed number
+ * @return number of bytes used.
+ */
+ static size_t compressPositive(uint64_t n, void *destination);
+ /**
+ * Will compress an integer to either 1,2 or 4 bytes
+ * @param n Number to compress
+ * @param destination Where to put the compressed number
+ * @return number of bytes used.
+ */
+ static size_t compress(int64_t n, void *destination);
+ /**
+ * @param unsigned number to compute compressed size of in bytes.
+ * @return Will return the number of bytes this positive number will require
+ **/
+ static size_t compressedPositiveLength(uint64_t n);
+ /**
+ * @param number to compute compressed size of in bytes.
+ * @return Will return the number of bytes this number will require
+ **/
+ static size_t compressedLength(int64_t n);
+ /**
+ * Will decompress an integer.
+ * @param pointer to buffer. pointer is automatically advanced.
+ * @return decompressed number
+ */
+ static size_t decompress(int64_t & n, const void * srcv) {
+ const uint8_t * src = static_cast<const uint8_t *>(srcv);
+ const uint8_t c = src[0];
+ size_t numbytes;
+ if (c & 0x40) {
+ if (c & 0x20) {
+ n = ((c & 0x1f) << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
+ numbytes = 4;
+ } else {
+ n = ((c & 0x1f) << 8) + src[1];
+ numbytes = 2;
+ }
+ } else {
+ n = c & 0x1f;
+ numbytes = 1;
+ }
+ if (c & 0x80) {
+ n = -n;
+ }
+ return numbytes;
+ }
+ /**
+ * Will decompress a positive integer.
+ * @param pointer to buffer. pointer is automatically advanced.
+ * @return decompressed number
+ */
+ static size_t decompressPositive(uint64_t & n, const void * srcv) {
+ const uint8_t * src = static_cast<const uint8_t *>(srcv);
+ const uint8_t c = src[0];
+ size_t numbytes;
+ if (c & 0x80) {
+ if (c & 0x40) {
+ n = ((c & 0x3f) << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
+ numbytes = 4;
+ } else {
+ n = ((c & 0x3f) << 8) + src[1];
+ numbytes = 2;
+ }
+ } else {
+ n = c & 0x3f;
+ numbytes = 1;
+ }
+ return numbytes;
+ }
+};
+
+}
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/delegatelist.hpp b/vespalib/src/vespa/vespalib/util/delegatelist.hpp
new file mode 100644
index 00000000000..f953451de76
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/delegatelist.hpp
@@ -0,0 +1,310 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2009 Yahoo
+
+#pragma once
+
+#include "eventbarrier.hpp"
+#include "sync.h"
+
+namespace vespalib {
+
+/**
+ * Data structure for robust event multi-casting in a multi-threaded
+ * environment. The state tracked by this class can be modeled as a
+ * set of bald object pointers; the delegates. All interaction with
+ * the delegates is done through a snapshot of the delegate list. The
+ * list may be modified at any time. Modifications will not be visible
+ * to already existing snapshots. A separate method may be used to
+ * wait for the destruction of all currently active snapshots. This
+ * synchronization will ensure visibility of any previous
+ * modifications to the delegate list. State snapshotting is
+ * implemented with reference counted immutable lists. Snapshot
+ * waiting is implemented using event barriers.
+ **/
+template <typename T>
+class DelegateList
+{
+private:
+ /**
+ * Simple class used to synchronize with the completion of an
+ * event barrier by coupling barrier completion to a gate.
+ **/
+ struct Sync
+ {
+ Gate gate;
+ Sync() : gate() {}
+ void completeBarrier() { gate.countDown(); }
+ };
+
+ /**
+ * Inner structure used when keeping track of a set of delegates.
+ **/
+ struct Node {
+ uint32_t refcnt; // the number of incoming pointers to this node.
+ T *delegate; // the delegate tracked by this node.
+ Node *next; // the next node in this list.
+ };
+
+ Lock _lock; // lock protecting access to this object
+ Node *_head; // head of current list of delegates
+ EventBarrier<Sync> _barrier; // object used to resolve event barriers
+ Node *_freeNodes; // a list of recyclable internal nodes
+ int _activeNodes; // number of internal nodes currently in use
+ ArrayQueue<T*> _stack; // explicit stack for cheap 'recursion'
+
+ /**
+ * Allocate a new node and initialize it with the given data
+ * members. Nodes are recycled internally by this object to reduce
+ * overhead.
+ *
+ * @return the new node
+ * @param delegate the delegate for the new node
+ * @param next the next pointer for the new node
+ **/
+ Node *allocNode(T *delegate, Node *next) {
+ Node *node = _freeNodes;
+ if (node != 0) {
+ _freeNodes = node->next;
+ } else {
+ node = new Node();
+ }
+ node->refcnt = 1;
+ node->delegate = delegate;
+ node->next = next;
+ ++_activeNodes;
+ return node;
+ }
+
+ /**
+ * Copy a list of nodes. This will increase the reference count of
+ * the list.
+ *
+ * @return the copy of the list
+ * @param list the list to copy
+ **/
+ Node *copyList(Node *list) {
+ if (list != 0) {
+ ++list->refcnt;
+ }
+ return list;
+ }
+
+ /**
+ * Free a list of nodes. This will decrease the reference count of
+ * the list. Any nodes no longer in use will be put back on the
+ * internal free list.
+ *
+ * @return 0
+ * @param list the list to free
+ **/
+ Node *freeList(Node *list) {
+ while (list != 0 && --list->refcnt == 0) {
+ Node *node = list;
+ list = node->next;
+ node->next = _freeNodes;
+ _freeNodes = node;
+ --_activeNodes;
+ }
+ return 0;
+ }
+
+ DelegateList(const DelegateList &);
+ DelegateList &operator=(const DelegateList &);
+
+public:
+ /**
+ * A snapshot of a delegate list. The only way to access the
+ * delegates kept by a delegate list is to create a snapshot of
+ * it. The snapshot lets the user traverse the list of delegates,
+ * accessing each of them in turn. The existence of a snapshot is
+ * used by the delegate list to identify that someone is observing
+ * the delegate list in a specific state. Snapshots should be
+ * created on the stack in a scope as close as possible to the
+ * code actually accessing the delegates. The delegate list itself
+ * may not be destructed until all snapshots of that list have
+ * been destructed.
+ **/
+ class Snapshot
+ {
+ private:
+ DelegateList &_list; // the parent object
+ Node *_head; // head of the snapshotted list
+ Node *_node; // current position within snapshot
+ uint32_t _token; // token used for barrier resolving
+
+ Snapshot(const Snapshot &);
+ Snapshot &operator=(const Snapshot &);
+ public:
+ /**
+ * Create a snapshot of the given delegate list. The snapshots
+ * current position will be set to the first delegate part of
+ * the snapshot.
+ *
+ * @param list the delegate list we are snapshotting
+ **/
+ explicit Snapshot(DelegateList &list) : _list(list) {
+ LockGuard guard(list._lock);
+ _head = list.copyList(list._head);
+ _node = _head;
+ _token = list._barrier.startEvent();
+ }
+
+ /**
+ * Destructing a snapshot will tell the delegate list that we
+ * are no longer accessing the list in the state observed by
+ * the snapshot.
+ **/
+ ~Snapshot() {
+ LockGuard guard(_list._lock);
+ _list.freeList(_head);
+ _list._barrier.completeEvent(_token);
+ }
+
+ /**
+ * Check whether the current delegate is valid. A snapshot
+ * becomes invalid after the user has stepped through all
+ * delegates part of the snapshot using the 'next' method.
+ *
+ * @return true if the current delegate is valid
+ **/
+ bool valid() const {
+ return (_node != 0);
+ }
+
+ /**
+ * Step to the next delegate. This method may only be called
+ * if the 'valid' method returns true.
+ **/
+ void next() {
+ _node = _node->next;
+ }
+
+ /**
+ * Get the current delegate. This method may only be called if
+ * the 'valid' method returns true.
+ *
+ * @return current delegate
+ **/
+ T *get() const {
+ return _node->delegate;
+ }
+ };
+
+ /**
+ * Create an initially empty delegate list.
+ **/
+ DelegateList()
+ : _lock(),
+ _head(0),
+ _barrier(),
+ _freeNodes(0),
+ _activeNodes(0),
+ _stack()
+ {
+ }
+
+ /**
+ * The destructor will clean up internal memory usage. The
+ * delegate list itself does not need to be empty when it is
+ * deleted. However, there may be no active snapshots of it and
+ * no-one may be waiting for snapshot destruction.
+ **/
+ ~DelegateList() {
+ freeList(_head);
+ assert(_barrier.countBarriers() == 0);
+ assert(_barrier.countEvents() == 0);
+ assert(_activeNodes == 0);
+ while (_freeNodes != 0) {
+ Node *node = _freeNodes;
+ _freeNodes = node->next;
+ delete node;
+ }
+ }
+
+ /**
+ * Add a delegate to this list. Adding a delegate that is already
+ * in the list will have no effect.
+ *
+ * @return this object, for chaining
+ * @param delegate the delegate to add
+ **/
+ DelegateList &add(T *delegate) {
+ LockGuard guard(_lock);
+ Node *node = _head;
+ while (node != 0 && node->delegate != delegate) {
+ node = node->next;
+ }
+ if (node == 0) {
+ _head = allocNode(delegate, _head);
+ }
+ return *this;
+ }
+
+ /**
+ * Remove a delegate from this list.
+ *
+ * @return this object, for chaining
+ * @param delegate the delegate to remove
+ **/
+ DelegateList &remove(T *delegate) {
+ LockGuard guard(_lock);
+ _stack.clear();
+ Node *node = _head;
+ while (node != 0 && node->delegate != delegate) {
+ _stack.push(node->delegate);
+ node = node->next;
+ }
+ if (node != 0) { // delegate found in list
+ node = copyList(node->next);
+ while (!_stack.empty()) {
+ try {
+ node = allocNode(_stack.back(), node);
+ } catch (...) {
+ freeList(node);
+ throw;
+ }
+ _stack.popBack();
+ }
+ freeList(_head);
+ _head = node;
+ }
+ return *this;
+ }
+
+ /**
+ * Remove all delegates currently in this list.
+ *
+ * @return this object, for chaining
+ **/
+ DelegateList &clear() {
+ LockGuard guard(_lock);
+ _head = freeList(_head);
+ return *this;
+ }
+
+ /**
+ * Wait for the destruction of all currently active snapshots of
+ * this list. This method will block until all relevant snapshots
+ * are destructed. The creation of new snapshots will not
+ * interfere with the completion of this method. This method is
+ * used to enforce visibility between threads; after this method
+ * returns, any modifications performed on the list before this
+ * method was invoked will be visible to all threads.
+ *
+ * @return this object, for chaining
+ **/
+ DelegateList &waitSnapshots() {
+ Sync sync;
+ {
+ LockGuard guard(_lock);
+ if (!_barrier.startBarrier(sync)) {
+ return *this;
+ }
+ }
+ sync.gate.await();
+ return *this;
+ }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/dual_merge_director.cpp b/vespalib/src/vespa/vespalib/util/dual_merge_director.cpp
new file mode 100644
index 00000000000..5b894f7bd17
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/dual_merge_director.cpp
@@ -0,0 +1,72 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "dual_merge_director.h"
+#include <algorithm>
+
+namespace vespalib {
+
+bool
+DualMergeDirector::MergeState::merge()
+{
+ if (second.thread_id < first.thread_id) {
+ std::swap(first, second);
+ }
+ first.source->merge(*second.source);
+ second = TaggedSource();
+ return (state != LAST);
+}
+
+void
+DualMergeDirector::MixedMergeStateExchanger::mingle()
+{
+ out(0) = MergeState(last ? MergeState::LAST : MergeState::TYPEA,
+ in(0).first, in(1).first);
+ out(1) = MergeState(last ? MergeState::LAST : MergeState::TYPEB,
+ in(0).second, in(1).second);
+}
+
+void
+DualMergeDirector::MergeStateExchanger::mingle()
+{
+ bool last = (--remaining == 0);
+ size_t dst = (in(0).first.thread_id < in(1).first.thread_id) ? 0 : 1;
+ out(dst) = MergeState(last ? MergeState::LAST : in(0).state,
+ in(dst).first, in(1 - dst).first);
+}
+
+DualMergeDirector::DualMergeDirector(size_t num_threads)
+ : _num_threads(num_threads),
+ _mixedExchanger(num_threads == 2),
+ _typeAExchanger((num_threads - 1) / 2),
+ _typeBExchanger((num_threads - 1) / 2)
+{
+}
+
+void
+DualMergeDirector::dualMerge(size_t thread_id, Source &typeA, Source &typeB)
+{
+ if (_num_threads == 1) {
+ return;
+ }
+ if (((_num_threads % 2) == 1) && ((thread_id + 1) == _num_threads)) {
+ _typeAExchanger.rendezvous(MergeState(MergeState::TYPEA,
+ TaggedSource(thread_id, typeA)));
+ _typeBExchanger.rendezvous(MergeState(MergeState::TYPEB,
+ TaggedSource(thread_id, typeB)));
+ return;
+ }
+ MergeState state(MergeState::MIXED, TaggedSource(thread_id, typeA),
+ TaggedSource(thread_id, typeB));
+ state = _mixedExchanger.rendezvous(state);
+ MergeStateExchanger &exchanger = (state.state == MergeState::TYPEA) ?
+ _typeAExchanger : _typeBExchanger;
+ while (state.merge()) {
+ state = exchanger.rendezvous(state);
+ if (state.state == MergeState::EMPTY) {
+ return;
+ }
+ }
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/dual_merge_director.h b/vespalib/src/vespa/vespalib/util/dual_merge_director.h
new file mode 100644
index 00000000000..0ef42f367b5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/dual_merge_director.h
@@ -0,0 +1,74 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "rendezvous.h"
+
+namespace vespalib {
+
+/**
+ * Utility used to direct multi-threaded merging of 2 separate sources
+ * of information. Each thread calls the dualMerge function with its
+ * own thread id and sources. The first source of each thread is
+ * ultimately merged into the first source of thread 0. The second
+ * sources are handled the same way and the result ends up in the
+ * second source of thread 0. The sources may be of different
+ * types. Note that the dualMerge function will return when the
+ * director no longer needs the calling thread. In order to wait for
+ * the completion of the overall merge operation, external
+ * synchronization is needed.
+ **/
+class DualMergeDirector
+{
+public:
+ struct Source {
+ virtual void merge(Source &rhs) = 0;
+ virtual ~Source() {}
+ };
+
+private:
+ struct TaggedSource {
+ size_t thread_id;
+ Source *source;
+ TaggedSource(size_t t, Source &s) : thread_id(t), source(&s) {}
+ TaggedSource() : thread_id(-1), source(0) {}
+ };
+
+ struct MergeState {
+ enum State { MIXED, TYPEA, TYPEB, LAST, EMPTY } state;
+ TaggedSource first;
+ TaggedSource second;
+ MergeState() : state(EMPTY), first(), second() {}
+ MergeState(State s, const TaggedSource &a)
+ : state(s), first(a), second() {}
+ MergeState(State s, const TaggedSource &a, const TaggedSource &b)
+ : state(s), first(a), second(b) {}
+ bool merge();
+ };
+
+ struct MixedMergeStateExchanger : Rendezvous<MergeState, MergeState> {
+ bool last;
+ MixedMergeStateExchanger(bool v) :
+ Rendezvous<MergeState, MergeState>(2), last(v) {}
+ virtual void mingle();
+ };
+
+ struct MergeStateExchanger : Rendezvous<MergeState, MergeState> {
+ size_t remaining;
+ MergeStateExchanger(size_t r) :
+ Rendezvous<MergeState, MergeState>(2), remaining(r) {}
+ virtual void mingle();
+ };
+
+ size_t _num_threads;
+ MixedMergeStateExchanger _mixedExchanger;
+ MergeStateExchanger _typeAExchanger;
+ MergeStateExchanger _typeBExchanger;
+
+public:
+ DualMergeDirector(size_t num_threads);
+ void dualMerge(size_t thread_id, Source &typeA, Source &typeB);
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/error.cpp b/vespalib/src/vespa/vespalib/util/error.cpp
new file mode 100644
index 00000000000..323ae578626
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/error.cpp
@@ -0,0 +1,20 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/util/error.h>
+
+namespace vespalib {
+
+vespalib::string
+getErrorString(const int osError)
+{
+ char errorBuf[128];
+ return strerror_r(osError, errorBuf, sizeof(errorBuf));
+}
+
+vespalib::string
+getLastErrorString()
+{
+ return getErrorString(errno);
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/util/error.h b/vespalib/src/vespa/vespalib/util/error.h
new file mode 100644
index 00000000000..aec3ccf7b01
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/error.h
@@ -0,0 +1,13 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+vespalib::string getErrorString(const int osError);
+
+vespalib::string getLastErrorString();
+
+}
diff --git a/vespalib/src/vespa/vespalib/util/eventbarrier.hpp b/vespalib/src/vespa/vespalib/util/eventbarrier.hpp
new file mode 100644
index 00000000000..6261761cfe0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/eventbarrier.hpp
@@ -0,0 +1,122 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2009 Yahoo
+
+#pragma once
+
+#include "arrayqueue.hpp"
+
+namespace vespalib {
+
+/**
+ * Reference implementation of the 'Incremental Minimal Event Barrier'
+ * algorithm. An event in this context is defined to be something that
+ * happens during a time interval. An event barrier is a time interval
+ * for which events may start before or end after, but not both. The
+ * problem solved by the algorithm is to determine the minimal event
+ * barrier starting at a given time. In other words; wait for the
+ * currently active events to complete. The most natural use of this
+ * algorithm would be to make a thread wait for events happening in
+ * other threads to complete. The template parameter T defines how the
+ * detection of a minimal event barrier should be handled. T must
+ * implement the method 'void completeBarrier()' which does not throw.
+ **/
+template <typename T>
+class EventBarrier
+{
+private:
+ uint32_t _token;
+ uint32_t _count;
+ ArrayQueue<std::pair<uint32_t, T*> > _queue;
+
+ EventBarrier(const EventBarrier &);
+ EventBarrier &operator=(const EventBarrier &);
+
+public:
+ /**
+ * At creation there are no active events and no pending barriers.
+ **/
+ EventBarrier() : _token(0), _count(0), _queue() {}
+
+ /**
+ * Obtain the current number of active events. This method is
+ * intended for testing and debugging.
+ *
+ * @return number of active events
+ **/
+ uint32_t countEvents() const {
+ uint32_t cnt = _count;
+ for (uint32_t i = 0; i < _queue.size(); ++i) {
+ cnt += _queue.peek(i).first;
+ }
+ return cnt;
+ }
+
+ /**
+ * Obtain the current number of pending barriers. This method is
+ * intended for testing and debugging.
+ *
+ * @return number of pending barriers
+ **/
+ uint32_t countBarriers() const {
+ return _queue.size();
+ }
+
+ /**
+ * Signal the start of an event. The value returned from this
+ * method must later be passed to the completeEvent method when
+ * signaling the completion of the event.
+ *
+ * @return opaque token identifying the started event
+ **/
+ uint32_t startEvent() {
+ ++_count;
+ return _token;
+ }
+
+ /**
+ * Signal the completion of an event. The value passed to this
+ * method must be the same as the return value previously obtained
+ * from the startEvent method. This method will signal the
+ * completion of all pending barriers that were completed by the
+ * completion of this event.
+ *
+ * @param token opaque token identifying the completed event
+ **/
+ void completeEvent(uint32_t token) {
+ if (token == _token) {
+ --_count;
+ return;
+ }
+ --_queue.access(_queue.size() - (_token - token)).first;
+ while (!_queue.empty() && _queue.front().first == 0) {
+ _queue.front().second->completeBarrier();
+ _queue.pop();
+ }
+ }
+
+ /**
+ * Initiate the detection of the minimal event barrier starting
+ * now. If this method returns false it means that no events were
+ * currently active and the minimal event barrier was infinitely
+ * small. If this method returns false the handler will not be
+ * notified of the completion of the barrier. If this method
+ * returns true it means that the started barrier is pending and
+ * that the handler passed to this method will be notified of its
+ * completion at a later time.
+ *
+ * @return true if a barrier was started, false if no events were active
+ * @param handler handler notified of the completion of the barrier
+ **/
+ bool startBarrier(T &handler) {
+ if (_count == 0 && _queue.empty()) {
+ return false;
+ }
+ _queue.push(std::make_pair(_count, &handler));
+ ++_token;
+ _count = 0;
+ return true;
+ }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/exception.cpp b/vespalib/src/vespa/vespalib/util/exception.cpp
new file mode 100644
index 00000000000..bba391ded0f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/exception.cpp
@@ -0,0 +1,153 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/exception.h>
+#include <algorithm>
+#include <vespa/fastos/backtrace.h>
+
+#ifdef VESPALIB_EXCEPTION_USEBACKTRACES
+#include <vespa/vespalib/util/backtrace.h>
+#endif
+
+namespace vespalib {
+
+ExceptionPtr::ExceptionPtr()
+ : _ref(NULL)
+{
+}
+
+
+ExceptionPtr::ExceptionPtr(const Exception &e)
+ : _ref(e.clone())
+{
+}
+
+
+ExceptionPtr::ExceptionPtr(const ExceptionPtr &rhs)
+ : _ref(rhs._ref != NULL ? rhs._ref->clone() : NULL)
+{
+}
+
+
+ExceptionPtr &
+ExceptionPtr::operator=(const Exception &rhs)
+{
+ ExceptionPtr tmp(rhs);
+ swap(tmp);
+ return *this;
+}
+
+
+ExceptionPtr &
+ExceptionPtr::operator=(const ExceptionPtr &rhs)
+{
+ ExceptionPtr tmp(rhs);
+ swap(tmp);
+ return *this;
+}
+
+
+void
+ExceptionPtr::swap(ExceptionPtr &other)
+{
+ std::swap(_ref, other._ref);
+}
+
+
+ExceptionPtr::~ExceptionPtr()
+{
+ delete _ref;
+}
+
+
+void
+swap(ExceptionPtr &a, ExceptionPtr &b)
+{
+ a.swap(b);
+}
+
+//-----------------------------------------------------------------------------
+
+Exception::Exception(const stringref &msg, const stringref &location,
+ int skipStack)
+ : _what(),
+ _msg(msg),
+ _location(location),
+ _stackframes(getStackTraceFrames(_stack, STACK_FRAME_BUFFER_SIZE)),
+ _skipStack(skipStack),
+ _cause()
+{
+}
+
+Exception::Exception(const stringref &msg, const Exception &cause,
+ const stringref &location, int skipStack)
+ : _what(),
+ _msg(msg),
+ _location(location),
+ _stackframes(getStackTraceFrames(_stack, STACK_FRAME_BUFFER_SIZE)),
+ _skipStack(skipStack),
+ _cause(cause)
+{
+}
+
+const char *
+Exception::what() const throw()
+{
+ if (_what.empty()) {
+ _what.append(toString());
+ for (const Exception *next = getCause();
+ next != NULL; next = next->getCause())
+ {
+ _what.append("\n--> Caused by: ");
+ _what.append(next->toString());
+ }
+ }
+ return _what.c_str();
+}
+
+
+const char *
+Exception::getName() const
+{
+ return "Exception";
+}
+
+
+Exception *
+Exception::clone() const
+{
+ return new Exception(*this);
+}
+
+
+void
+Exception::throwSelf() const
+{
+ throw Exception(*this);
+}
+
+
+Exception::~Exception() throw()
+{
+}
+
+
+string
+Exception::toString() const
+{
+ string str;
+ str.append(getName());
+ str.append(": ");
+ str.append(_msg);
+ if (!_location.empty()) {
+ str.append(" at ");
+ str.append(_location);
+ }
+ if (_stackframes > 0) {
+ str.append("\n");
+ str.append(getStackTrace(_skipStack, _stack, _stackframes));
+ }
+ return str;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/exception.h b/vespalib/src/vespa/vespalib/util/exception.h
new file mode 100644
index 00000000000..b3c38f72b1d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/exception.h
@@ -0,0 +1,239 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2006 Yahoo
+
+#pragma once
+
+#include <vespa/vespalib/util/macro.h>
+#include <vespa/vespalib/util/error.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <string>
+#include <exception>
+
+#define VESPALIB_EXCEPTION_USEBACKTRACES
+
+/**
+ * @def VESPA_DEFINE_EXCEPTION_SPINE(MyClass)
+ * @brief Define common methods needed for exception classes
+ *
+ * If you make an exception class inheriting (directly or indirectly)
+ * from vespalib::Exception you should use this macro inside the body
+ * of your class to define the methods getName(), clone()
+ * and throwSelf() that always need to be defined in the same way.
+ * This must be matched by
+ * \ref VESPA_IMPLEMENT_EXCEPTION_SPINE for implementhing the methods.
+ * If you're just making an exception type without any special
+ * content you can use
+ * \ref VESPA_DEFINE_EXCEPTION
+ * instead.
+ *
+ * @param MyClass the name of your class
+ **/
+#define VESPA_DEFINE_EXCEPTION_SPINE(MyClass) \
+ const char *getName() const override; \
+ Exception *clone() const override; \
+ void throwSelf() const override; \
+ MyClass& setCause(const vespalib::Exception& cause);
+
+/**
+ * @def VESPA_IMPLEMENT_EXCEPTION_SPINE(MyClass)
+ * @brief Implement common methods needed for exception classes
+ *
+ * This will implement the methods defined by
+ * \ref VESPA_DEFINE_EXCEPTION_SPINE
+ * @param MyClass the name of your class
+ **/
+#define VESPA_IMPLEMENT_EXCEPTION_SPINE(MyClass) \
+ const char *MyClass::getName() const { return VESPA_STRINGIZE(MyClass); } \
+ vespalib::Exception *MyClass::clone() const { return new MyClass(*this); } \
+ void MyClass::throwSelf() const { throw MyClass(*this); } \
+ MyClass& MyClass::setCause(const vespalib::Exception& cause) \
+ { _cause = vespalib::ExceptionPtr(cause); return *this; }
+
+/**
+ * @def VESPA_DEFINE_EXCEPTION(MyClass, Parent)
+ * @brief Define simple exception class
+ *
+ * Use this macro to define a new exception class
+ * with no extra special content inheriting (directly or
+ * indirectly) from vespalib::Exception. This must be matched by
+ * \ref VESPA_IMPLEMENT_EXCEPTION
+ * for implementing the methods.
+ * @param MyClass the name of your class
+ * @param Parent the name of the parent class (often just Exception)
+ **/
+#define VESPA_DEFINE_EXCEPTION(MyClass, Parent) \
+class MyClass : public Parent { \
+public: \
+ MyClass(const vespalib::stringref &msg, \
+ const vespalib::stringref &location = "", int skipStack = 0); \
+ MyClass(const vespalib::stringref &msg, const Exception &cause, \
+ const vespalib::stringref &location = "", int skipStack = 0); \
+ VESPA_DEFINE_EXCEPTION_SPINE(MyClass) \
+};
+
+/**
+ * @def VESPA_IMPLEMENT_EXCEPTION(MyClass)
+ * @brief Implement common methods needed for exception classes
+ *
+ * This will implement the methods defined by
+ * \ref VESPA_DEFINE_EXCEPTION
+ * @param MyClass the name of your class
+ **/
+#define VESPA_IMPLEMENT_EXCEPTION(MyClass, Parent) \
+ MyClass::MyClass(const vespalib::stringref &msg, \
+ const vespalib::stringref &location, int skipStack) \
+ : Parent(msg, location, skipStack + 1) {} \
+ MyClass::MyClass(const vespalib::stringref &msg, const Exception &cause, \
+ const vespalib::stringref &location, int skipStack) \
+ : Parent(msg, cause, location, skipStack + 1) {} \
+ VESPA_IMPLEMENT_EXCEPTION_SPINE(MyClass)
+
+namespace vespalib {
+
+class Exception;
+class ExceptionPtr;
+
+/**
+ * @class ExceptionPtr
+ * @brief Object holding an Exception.
+ *
+ * If you need to store an \ref Exception, use an instance of this class to
+ * manage ownership and copying. It will use clone() when needed so
+ * you always get a deep copy, so you can even pass it around to
+ * a different thread if needed.
+ **/
+class ExceptionPtr
+{
+private:
+ Exception *_ref;
+public:
+ /** @brief default constructor (object will contain a null pointer until assigned). */
+ ExceptionPtr();
+
+ /** @brief constructor making a copy of an existing exception. */
+ explicit ExceptionPtr(const Exception &e);
+
+ /** @brief copy constructor (deep copy) */
+ ExceptionPtr(const ExceptionPtr &rhs);
+
+ /** @brief assignment making a copy of an existing exception */
+ ExceptionPtr &operator=(const Exception &rhs);
+
+ /** @brief assignment making a deep copy of another ExceptionPtr */
+ ExceptionPtr &operator=(const ExceptionPtr &rhs);
+
+ /** @brief swaps contents with another ExceptionPtr */
+ void swap(ExceptionPtr &other);
+
+ /** @brief destructor doing cleanup if needed */
+ ~ExceptionPtr();
+
+ /** @brief test if this object actually contains an exception */
+ bool isSet() const { return (_ref != 0); }
+
+ /** @brief get pointer to currently held exception, returns NULL if not set */
+ const Exception *get() const { return _ref; }
+
+ /** @brief use pointer to currently held exception, will crash if not set */
+ const Exception *operator->() const { return _ref; }
+};
+
+/** swaps contents of two ExceptionPtr objects */
+void swap(ExceptionPtr &a, ExceptionPtr &b);
+
+//-----------------------------------------------------------------------------
+
+/**
+ * @class Exception
+ * @brief Common exception class used by VESPA.
+ *
+ * This class should be used as parent for all exceptions thrown by VESPA.
+ * It adds functionality for rethrowing and adding other exceptions as cause
+ * of the rethrow. It adds facility to get what codepiece threw the exception,
+ * and even stacktrace functionality. To avoid the significant performance hit
+ * associated with resolving stack frame symbols, resolving is done lazily
+ * and only when what() or toString() is invoked.
+ *
+ * Give the \ref VESPA_STRLOC
+ * macro as input to location to get the exception to report where it came from.
+ *
+ * When inheriting from this class you should always use one of the
+ * \ref VESPA_DEFINE_EXCEPTION
+ * or \ref VESPA_DEFINE_EXCEPTION_SPINE
+ * macros.
+ *
+ **/
+class Exception : public std::exception
+{
+private:
+ static const int STACK_FRAME_BUFFER_SIZE = 25;
+
+ mutable string _what;
+ string _msg;
+ string _location;
+ void* _stack[STACK_FRAME_BUFFER_SIZE];
+ int _stackframes;
+ int _skipStack;
+
+protected:
+ ExceptionPtr _cause;
+
+public:
+ /**
+ * @brief Construct an exception with a message and a source code location.
+ * @param msg A user-readable message describing the problem
+ * @param location The location in the source code where the problem cause is.
+ * use the VESPA_STRLOC to get a standard-format string describing
+ * the current source code location.
+ * @param skipStack Normally use the default-provided 0 value; subclasses
+ * should send (skipStack + 1) to the parent constructor (see
+ * \ref VESPA_DEFINE_EXCEPTION for subclass implementation).
+ **/
+ Exception(const stringref &msg, const stringref& location = "",
+ int skipStack = 0);
+ /**
+ * @brief Construct an exception with a message, a causing exception, and a source code location.
+ * @param msg A user-readable message describing the problem
+ * @param cause Another exception that was the underlying cause of the problem
+ * @param location The location in the source code where the problem cause is.
+ * use the VESPA_STRLOC to get a standard-format string describing
+ * the current source code location.
+ * @param skipStack Normally use the default-provided 0 value; subclasses
+ * should send (skipStack + 1) to the parent constructor (see
+ * \ref VESPA_DEFINE_EXCEPTION for subclass implementation).
+ **/
+ Exception(const stringref &msg, const Exception &cause,
+ const stringref &location = "", int skipStack = 0);
+
+ /** @brief Returns a string describing the current exception, including cause if any */
+ const char *what() const throw(); // should not be overridden
+
+ /** @brief Returns a pointer to underlying cause (or NULL if no cause) */
+ const Exception *getCause() const { return _cause.get(); }
+
+ /** @brief Returns the msg parameter that this Exception was constructed with */
+ const string &getMessage() const { return _msg; }
+
+ /** @brief Returns the location parameter that this Exception was constructed with */
+ const string &getLocation() const { return _location; }
+
+ /** @brief Returns the actual class name of the exception */
+ virtual const char *getName() const;
+
+ /** @brief Clones the actual object */
+ virtual Exception *clone() const;
+
+ /** @brief Throw a copy of this object */
+ virtual void throwSelf() const;
+
+ /** @brief destructor doing cleanup if needed */
+ virtual ~Exception() throw();
+
+ /** @brief make a string describing the current object, not including cause */
+ virtual string toString() const;
+};
+
+} // namespace vespalib
+
+#include <vespa/vespalib/util/exceptions.h>
+
diff --git a/vespalib/src/vespa/vespalib/util/exceptions.cpp b/vespalib/src/vespa/vespalib/util/exceptions.cpp
new file mode 100644
index 00000000000..c4e47888e18
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/exceptions.cpp
@@ -0,0 +1,138 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <vespa/vespalib/util/stringfmt.h>
+
+#include <errno.h>
+
+namespace vespalib {
+
+VESPA_IMPLEMENT_EXCEPTION(UnsupportedOperationException, Exception);
+VESPA_IMPLEMENT_EXCEPTION(IllegalArgumentException, Exception);
+VESPA_IMPLEMENT_EXCEPTION(IllegalStateException, Exception);
+VESPA_IMPLEMENT_EXCEPTION(OverflowException, Exception);
+VESPA_IMPLEMENT_EXCEPTION(UnderflowException, Exception);
+VESPA_IMPLEMENT_EXCEPTION(TimeoutException, Exception);
+VESPA_IMPLEMENT_EXCEPTION(FatalException, Exception);
+VESPA_IMPLEMENT_EXCEPTION(NetworkSetupFailureException, IllegalStateException);
+VESPA_IMPLEMENT_EXCEPTION_SPINE(PortListenException);
+VESPA_IMPLEMENT_EXCEPTION_SPINE(IoException);
+
+//-----------------------------------------------------------------------------
+
+vespalib::string
+PortListenException::make_message(int port, const vespalib::stringref &protocol,
+ const vespalib::stringref &msg)
+{
+ return make_string("failed to listen on port %d with protocol %s%s%s",
+ port, protocol.c_str(), msg.empty() ? "" : ": ", msg.c_str());
+}
+
+PortListenException::PortListenException(int port, const vespalib::stringref &protocol,
+ const vespalib::stringref &msg,
+ const vespalib::stringref &location, int skipStack)
+ : Exception(make_message(port, protocol, msg), location, skipStack + 1),
+ _port(port),
+ _protocol(protocol)
+{
+}
+
+PortListenException::PortListenException(int port, const vespalib::stringref &protocol,
+ const Exception &cause,
+ const vespalib::stringref &msg,
+ const vespalib::stringref &location, int skipStack)
+ : Exception(make_message(port, protocol, msg), cause, location, skipStack + 1),
+ _port(port),
+ _protocol(protocol)
+{
+}
+
+//-----------------------------------------------------------------------------
+
+IoException::IoException(const stringref & msg, Type type,
+ const stringref & location, int skipStack)
+ : Exception(createMessage(msg, type), location, skipStack+1),
+ _type(type)
+{
+}
+
+IoException::IoException(const stringref & msg, Type type,
+ const Exception& cause, const stringref & location,
+ int skipStack)
+ : Exception(createMessage(msg, type), cause, location, skipStack+1),
+ _type(type)
+{
+}
+
+string
+IoException::createMessage(const stringref & msg, Type type)
+{
+ vespalib::asciistream ost;
+ switch (type) {
+ case UNSPECIFIED: break;
+ case ILLEGAL_PATH: ost << "ILLEGAL PATH: "; break;
+ case NO_PERMISSION: ost << "NO PERMISSION: "; break;
+ case DISK_PROBLEM: ost << "DISK PROBLEM: "; break;
+ case INTERNAL_FAILURE: ost << "INTERNAL FAILURE: "; break;
+ case NO_SPACE: ost << "NO SPACE: "; break;
+ case NOT_FOUND: ost << "NOT FOUND: "; break;
+ case CORRUPT_DATA: ost << "CORRUPT DATA: "; break;
+ case TOO_MANY_OPEN_FILES: ost << "TOO MANY OPEN FILES: "; break;
+ case DIRECTORY_HAVE_CONTENT: ost << "DIRECTORY HAVE CONTENT: "; break;
+ case FILE_FULL: ost << "FILE_FULL: "; break;
+ case ALREADY_EXISTS: ost << "ALREADY EXISTS: "; break;
+ default:
+ ost << "Unknown type(" << type << "): ";
+ }
+ ost << msg;
+ return ost.str();
+}
+
+IoException::Type
+IoException::getErrorType(int error) {
+ switch (error) {
+ case ENOENT:
+ return IoException::NOT_FOUND;
+ // These should be handled elsewhere and not get here..
+ case EAGAIN: // Non-block operation with no data
+ case EINTR: // Interrupted operation with no data
+ return IoException::INTERNAL_FAILURE;
+ case ENOTDIR:
+ case ENAMETOOLONG:
+ case ELOOP:
+ case EISDIR:
+ case EMLINK:
+ case ENXIO:
+ return IoException::ILLEGAL_PATH;
+ case EACCES:
+ case EPERM:
+ case EROFS:
+ return IoException::NO_PERMISSION;
+ case EIO: // An IO error occured
+ return IoException::DISK_PROBLEM;
+ case ENOSPC: // No free space
+ case EDQUOT: // Quota filled
+ return IoException::NO_SPACE;
+ case EMFILE:
+ return IoException::TOO_MANY_OPEN_FILES;
+ case ENOTEMPTY:
+ return IoException::DIRECTORY_HAVE_CONTENT;
+ case EEXIST: // File or directory already exists
+ return IoException::ALREADY_EXISTS;
+ case EBADF: // File descriptor invalid
+ case EOVERFLOW: // Can't fit info in structure
+ case EFBIG: // Attempt to write beyond maximum size or
+ // file position is beyond end of file.
+ case EPIPE: // Write to pipe which doesn't lead anywhere.
+ case ERANGE: // Transfer request size out of stream range
+ case EFAULT:
+ case EINVAL:
+ case ENOBUFS: // Too few system resources
+ default:
+ return IoException::INTERNAL_FAILURE;
+ }
+}
+
+} // vespalib
diff --git a/vespalib/src/vespa/vespalib/util/exceptions.h b/vespalib/src/vespa/vespalib/util/exceptions.h
new file mode 100644
index 00000000000..5fde49dcc7a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/exceptions.h
@@ -0,0 +1,118 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @file exceptions.h
+ * @ingroup util
+ *
+ * @brief Various common exception classes.
+ *
+ * @author H�kon Humberset
+ * @date 2004-03-31
+ * @version $Id$
+ */
+
+#pragma once
+
+#include <vespa/vespalib/util/exception.h>
+
+namespace vespalib {
+
+#ifdef IAM_DOXYGEN
+/**
+ * @class vespalib::UnsupportedOperationException
+ * @brief Exception telling that the requested operation is not supported.
+ **/
+/**
+ * @class vespalib::IllegalArgumentException
+ * @brief Exception telling that illegal arguments was passed to a function.
+ **/
+/**
+ * @class vespalib::IllegalStateException
+ * @brief Exception telling that the object has an illegal state.
+ **/
+/**
+ * @class vespalib::OverflowException
+ * @brief XXX - Exception telling that some sort of overflow happened? unused
+ **/
+/**
+ * @class vespalib::UnderflowException
+ * @brief XXX - Exception telling that some sort of underflow happened? unused
+ **/
+/**
+ * @class vespalib::FatalException
+ * @brief Something went seriously wrong and the application should terminate
+ **/
+
+#else
+
+VESPA_DEFINE_EXCEPTION(UnsupportedOperationException, Exception);
+VESPA_DEFINE_EXCEPTION(IllegalArgumentException, Exception);
+VESPA_DEFINE_EXCEPTION(IllegalStateException, Exception);
+VESPA_DEFINE_EXCEPTION(OverflowException, Exception);
+VESPA_DEFINE_EXCEPTION(UnderflowException, Exception);
+VESPA_DEFINE_EXCEPTION(TimeoutException, Exception);
+VESPA_DEFINE_EXCEPTION(FatalException, Exception);
+VESPA_DEFINE_EXCEPTION(NetworkSetupFailureException, IllegalStateException);
+
+#endif
+
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief Exception indicating the failure to listen for connections
+ * on a socket.
+ **/
+class PortListenException : public Exception
+{
+private:
+ int _port;
+ vespalib::string _protocol;
+
+ vespalib::string make_message(int port, const vespalib::stringref &protocol,
+ const vespalib::stringref &msg);
+
+public:
+ PortListenException(int port, const vespalib::stringref &protocol,
+ const vespalib::stringref &msg = "",
+ const vespalib::stringref &location = "", int skipStack = 0);
+ PortListenException(int port, const vespalib::stringref &protocol,
+ const Exception &cause,
+ const vespalib::stringref &msg = "",
+ const vespalib::stringref &location = "", int skipStack = 0);
+ VESPA_DEFINE_EXCEPTION_SPINE(PortListenException);
+ int get_port() const { return _port; }
+ const vespalib::string &get_protocol() const { return _protocol; }
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief Exception signaling that some sort of I/O error happened.
+ **/
+class IoException : public Exception {
+public:
+ enum Type { UNSPECIFIED,
+ ILLEGAL_PATH, NO_PERMISSION, DISK_PROBLEM,
+ INTERNAL_FAILURE, NO_SPACE, NOT_FOUND, CORRUPT_DATA,
+ TOO_MANY_OPEN_FILES, DIRECTORY_HAVE_CONTENT, FILE_FULL,
+ ALREADY_EXISTS };
+
+ IoException(const stringref & msg, Type type, const stringref & location,
+ int skipStack = 0);
+ IoException(const stringref & msg, Type type, const Exception& cause,
+ const stringref & location, int skipStack = 0);
+
+ VESPA_DEFINE_EXCEPTION_SPINE(IoException);
+
+ static string createMessage(const stringref & msg, Type type);
+
+ Type getType() const { return _type; }
+
+ /** Use this function as a way to map error from errno to a Type. */
+ static Type getErrorType(int error);
+
+private:
+ Type _type;
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/executor.h b/vespalib/src/vespa/vespalib/util/executor.h
new file mode 100644
index 00000000000..6ab8158096d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/executor.h
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+#include <memory>
+
+namespace vespalib {
+
+/**
+ * An executor decouples the execution of a task from the request of
+ * executing that task. Also, tasks are typically executed
+ * concurrently in multiple threads.
+ **/
+class Executor
+{
+public:
+ /**
+ * A task that can be executed by an executor.
+ **/
+ struct Task {
+ typedef std::unique_ptr<Task> UP;
+ virtual void run() = 0;
+ virtual ~Task() {}
+ };
+
+ /**
+ * Execute the given task using one of the internal threads some
+ * time in the future. The task may also be rejected in which case
+ * it will be returned from this function. A task will be rejected
+ * if the executor has been shut down or if the task limit for
+ * this executor has been reached.
+ *
+ * @return the task if rejected, UP(0) if accepted
+ * @param task the task to execute
+ **/
+ virtual Task::UP execute(Task::UP task) = 0;
+
+ /**
+ * Empty.
+ **/
+ virtual ~Executor() {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/fiddle.h b/vespalib/src/vespa/vespalib/util/fiddle.h
new file mode 100644
index 00000000000..06de6ed69aa
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/fiddle.h
@@ -0,0 +1,84 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <cassert>
+
+namespace vespalib {
+namespace bits {
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Mix the prefix of one number with the suffix of another.
+ *
+ * @return mixed value
+ * @param prefix the most significant bits are taken from this value
+ * @param suffix the least significant bits are taken from this value
+ * @param prefix_bits how many bits to take from the prefix
+ **/
+uint32_t mix(uint32_t prefix, uint32_t suffix, uint32_t prefix_bits) {
+ if (prefix_bits == 0) {
+ return suffix;
+ }
+ if (prefix_bits >= 32) {
+ return prefix;
+ }
+ uint32_t suffix_mask = (1 << (32 - prefix_bits)) - 1;
+ uint32_t prefix_mask = (0 - 1) - suffix_mask;
+ return (prefix & prefix_mask) | (suffix & suffix_mask);
+}
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Find the number of leading zero bits in the given number.
+ *
+ * @return the number of leading zeros (0-32)
+ * @param value the value to inspect.
+ **/
+uint32_t leading_zeros(uint32_t value) {
+ if (value == 0) {
+ return 32;
+ }
+ uint32_t n = 0;
+ if (value <= 0x0000ffff) { n += 16; value <<= 16; }
+ if (value <= 0x00FFffff) { n += 8; value <<= 8; }
+ if (value <= 0x0FFFffff) { n += 4; value <<= 4; }
+ if (value <= 0x3FFFffff) { n += 2; value <<= 2; }
+ if (value <= 0x7FFFffff) { n += 1; }
+ return n;
+}
+
+//-----------------------------------------------------------------------------
+
+/**
+ * Split the inclusive range [min, max] into two separate adjacent
+ * ranges such that the highest differing bit between min and max will
+ * be 0 for both endpoints in the first range and 1 in the second.
+ * The split ranges will be [min, first_max] and [last_min, max] after
+ * calling this function. A higher return value indicate a coarser
+ * split. Note that when this function returns 0, you end up with 2
+ * copies of the same identity range.
+ *
+ * @param min original minimum endpoint
+ * @param max original maximum endpoint
+ * @param first_max maximum endpoint of first subrange
+ * @param last_min miniumum endpoint of last subrange
+ * @return the number of bits in min and max not part of a common prefix
+ **/
+uint32_t split_range(uint32_t min, uint32_t max,
+ uint32_t &first_max, uint32_t &last_min)
+{
+ assert(max >= min);
+ uint32_t prefix = leading_zeros(min ^ max);
+ first_max = mix(min, 0xFFFFffff, prefix + 1);
+ last_min = mix(max, 0x00000000, prefix + 1);
+ return (32 - prefix);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace bits
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/gen_closure.py b/vespalib/src/vespa/vespalib/util/gen_closure.py
new file mode 100644
index 00000000000..a2de019f118
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/gen_closure.py
@@ -0,0 +1,171 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+import sys
+
+if len(sys.argv) < 3:
+ print "Too few arguments"
+ sys.exit()
+
+bound_args = int(sys.argv[1])
+unbound_args = int(sys.argv[2])
+
+def printCommentLine(comment):
+ print "// %s %s" % (comment, '-' * (79 - len(comment) - 4))
+
+arg_comment = [ 'no arguments', 'one argument', 'two arguments',
+ 'three arguments', 'four arguments', 'five arguments' ]
+
+def param_list(prefix, name, count):
+ return "".join(["%s%s%d, " % (prefix, name, i)
+ for i in range(1, count + 1)])
+def typename(args):
+ return "Closure%d" % (args,)
+
+def full_typename(args):
+ return "%s<%sR>" % (typename(args), param_list("", "P", args))
+
+
+print """// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// This file was generated by the gen_closure.py script.
+
+#pragma once
+
+#include <memory>
+
+namespace vespalib {
+"""
+printCommentLine("Interfaces")
+
+for i in range(unbound_args + 1):
+ print """
+/** Interface of closures that take %s. */
+template <%stypename R = void>
+struct %s {
+ typedef std::unique_ptr<%s > UP;
+
+ virtual ~%s() {}
+
+ virtual R call(%s) = 0;
+};""" % (arg_comment[i], param_list('typename ', 'P', i),
+ typename(i), full_typename(i), typename(i),
+ ", ".join(["P%d param%d" % (j, j) for j in range(1, i + 1)]))
+ if (i == 0):
+ print 'typedef Closure0<void> Closure;'
+print
+
+for unbound in range(unbound_args + 1):
+ printCommentLine("Closure%d" % unbound)
+ for bound in range(bound_args + 1):
+ print """
+/** Implementation of %s binding %s to a free function. */
+template <%s%stypename R>
+class %s_%d : public %s {
+ typedef R (*Func)(%s);
+
+ Func _func;%s
+
+ virtual R call(%s)
+ { return _func(%s); }
+
+public:
+ %s_%d(Func func%s)
+ : _func(func)%s {}
+};""" % (typename(unbound), arg_comment[bound],
+ param_list('typename ', 'T', bound),
+ param_list('typename ', 'P', unbound),
+ typename(unbound), bound, full_typename(unbound),
+ ", ".join(['T%d' % i for i in range(1, bound + 1)] +
+ ['P%d' % i for i in range(1, unbound + 1)]),
+ "".join(['\n T%d _arg%d;' % (i, i) for i in range(1, bound + 1)]),
+ ", ".join(["P%d param%d" % (i, i) for i in range(1, unbound + 1)]),
+ ", ".join(["std::move(_arg%d)" % i for i in range(1, bound + 1)] +
+ ["std::move(param%d)" % (i) for i in range(1, unbound + 1)]),
+ typename(unbound), bound,
+ "".join([", T%d &&arg%d" % (i, i) for i in range(1, bound + 1)]),
+ "".join([", _arg%d(std::move(arg%d))" % (i, i) for i in range(1, bound + 1)]))
+ print
+
+ printCommentLine("MemberClosure%d" % unbound)
+ for bound in range(bound_args + 1):
+ print """
+/** Implementation of %s binding %s to a member function. */
+template <class Ptr, class Obj, %s%stypename R>
+class Member%s_%d : public %s {
+ typedef R (Obj::*MemFun)(%s);
+
+ Ptr _ptr;
+ MemFun _mem_fun;%s
+
+ virtual R call(%s)
+ { return ((*_ptr).*_mem_fun)(%s); }
+
+public:
+ Member%s_%s(Ptr ptr, MemFun mem_fun%s)
+ : _ptr(std::move(ptr)), _mem_fun(mem_fun)%s {}
+};""" % (typename(unbound), arg_comment[bound],
+ param_list('typename ', 'T', bound),
+ param_list('typename ', 'P', unbound),
+ typename(unbound), bound, full_typename(unbound),
+ ", ".join(['T%d' % i for i in range(1, bound + 1)] +
+ ['P%d' % i for i in range(1, unbound + 1)]),
+ "".join(['\n T%d _arg%d;' % (i, i) for i in range(1, bound + 1)]),
+ ", ".join(["P%d param%d" % (i, i) for i in range(1, unbound + 1)]),
+ ", ".join(["std::move(_arg%d)" % i for i in range(1, bound + 1)] +
+ ["std::move(param%d)" % (i) for i in range(1, unbound + 1)]),
+ typename(unbound), bound,
+ "".join([", T%d arg%d" % (i, i) for i in range(1, bound + 1)]),
+ "".join([", _arg%d(std::move(arg%d))" % (i, i) for i in range(1, bound + 1)]))
+ print
+
+for unbound in range(unbound_args + 1):
+ printCommentLine("Function closures (%d)" % unbound)
+ for bound in range(bound_args + 1):
+ print """
+/** Creates a %s from a free function, binding %s. */
+template <%s%stypename R>
+std::unique_ptr<%s >
+makeClosure(R (*func)(%s)%s) {
+ return std::unique_ptr<%s >(
+ new %s_%d<%s%sR>(func%s));
+}""" % (typename(unbound), arg_comment[bound],
+ param_list('typename ', 'T', bound),
+ param_list('typename ', 'P', unbound),
+ full_typename(unbound),
+ ", ".join(['T%d' % i for i in range(1, bound + 1)] +
+ ['P%d' % i for i in range(1, unbound + 1)]),
+ "".join([", T%d arg%d" % (i, i) for i in range(1, bound + 1)]),
+ full_typename(unbound),
+ typename(unbound), bound,
+ "".join(['T%d, ' % i for i in range(1, bound + 1)]),
+ "".join(['P%d, ' % i for i in range(1, unbound + 1)]),
+ "".join([", std::move(arg%d)" % (i) for i in range(1, bound + 1)])
+ )
+ print
+
+ printCommentLine("Member closures (%d)" % unbound)
+ for bound in range(bound_args + 1):
+ print """
+/** Creates a %s from a member function, binding %s. */
+template <class Ptr, class Obj, %s%stypename R>
+std::unique_ptr<%s >
+makeClosure(Ptr ptr, R (Obj::*mem_fun)(%s)%s) {
+ return std::unique_ptr<%s >(
+ new Member%s_%d<Ptr, Obj, %s%sR>(
+ std::move(ptr), mem_fun%s));
+}""" % (typename(unbound), arg_comment[bound],
+ param_list('typename ', 'T', bound),
+ param_list('typename ', 'P', unbound),
+ full_typename(unbound),
+ ", ".join(['T%d' % i for i in range(1, bound + 1)] +
+ ['P%d' % i for i in range(1, unbound + 1)]),
+ "".join([", T%d arg%d" % (i, i) for i in range(1, bound + 1)]),
+ full_typename(unbound),
+ typename(unbound), bound,
+ "".join(['T%d, ' % i for i in range(1, bound + 1)]),
+ "".join(['P%d, ' % i for i in range(1, unbound + 1)]),
+ "".join([", std::move(arg%d)" % (i) for i in range(1, bound + 1)])
+ )
+ print
+
+print """} // namespace vespalib
+
+"""
diff --git a/vespalib/src/vespa/vespalib/util/gencnt.cpp b/vespalib/src/vespa/vespalib/util/gencnt.cpp
new file mode 100644
index 00000000000..5b51b8d2ebd
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/gencnt.cpp
@@ -0,0 +1,67 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP(".gencnt");
+#include "gencnt.h"
+
+namespace vespalib {
+
+GenCnt &
+GenCnt::add(uint32_t n)
+{
+ uint32_t newVal = _val + n;
+ if (newVal < _val) {
+ // avoid wrap-around to 0
+ newVal++;
+ }
+ _val = newVal;
+ return *this;
+}
+
+
+bool
+GenCnt::inRangeInclusive(GenCnt a, GenCnt b) const
+{
+ if (_val == 0) {
+ return (a._val == 0);
+ }
+ if (b._val >= a._val) {
+ // a--------------|
+ // |-------------b
+ // |------|
+ return ((_val >= a._val) && (_val <= b._val));
+ } else {
+ // a-------|
+ // |------b
+ // |------| |-------|
+ return ((_val >= a._val) || (_val <= b._val));
+ }
+}
+
+
+uint32_t
+GenCnt::distance(const GenCnt &other) const
+{
+ if (other._val == 0) {
+ // special case
+ LOG_ASSERT(_val == 0);
+ return 0;
+ }
+ if (_val <= other._val) {
+ // normal case
+ return (other._val - _val);
+ }
+ // wrapped case
+ return (other._val - _val - 1);
+}
+
+
+GenCnt &
+GenCnt::operator=(const GenCnt &src)
+{
+ _val = src._val;
+ return *this;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/gencnt.h b/vespalib/src/vespa/vespalib/util/gencnt.h
new file mode 100644
index 00000000000..a2279fbf426
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/gencnt.h
@@ -0,0 +1,110 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+namespace vespalib {
+
+/**
+ * @brief A GenCnt object wraps an integer generation counter.
+ *
+ * The value 0 is special, as when the internal counter wraps around
+ * it will skip this value. This gives 0 a special meaning as the
+ * first generation, and it will be different from all later
+ * generations, even when the counter wraps around.
+ **/
+class GenCnt
+{
+private:
+ uint32_t _val;
+public:
+
+ /**
+ * @brief Create a generation counter with value 0
+ **/
+ GenCnt() : _val(0) {}
+
+ /**
+ * @brief Create a generation counter with the given value
+ *
+ * @param val initial value
+ **/
+ GenCnt(uint32_t val) : _val(val) {}
+
+ /**
+ * @brief empty destructor
+ **/
+ ~GenCnt() {}
+
+ /**
+ * @brief Increase the generation count held by this object
+ *
+ * @return this object, for chaining
+ * @param n how much to increment the generation counter
+ **/
+ GenCnt &add(uint32_t n = 1);
+
+ /**
+ * @brief Check if this generation counter is inside the given
+ * range
+ *
+ * @return true if this generation is inside the range
+ * @param a the first generation in the range (inclusive)
+ * @param b the last generation in the range (inclusive)
+ **/
+ bool inRangeInclusive(GenCnt a, GenCnt b) const;
+
+ /**
+ * @brief Get the distance in generations between this object and
+ * the one given as 'other'.
+ *
+ * Note that this object is assumed to occur before 'other'.
+ * @return distance between this and other
+ * @param other other object occurring after this one
+ **/
+ uint32_t distance(const GenCnt &other) const;
+
+ /**
+ * @brief Check if this GenCnt is equal to another GenCnt
+ *
+ * @return true if <i>this</i> is equal to <i>rhs</i>
+ * @param rhs the right hand side in the comparison
+ **/
+ bool operator==(const GenCnt &rhs) const { return rhs._val == _val; }
+
+ /**
+ * @brief Check if this GenCnt is not equal to another GenCnt
+ *
+ * @return true if <i>this</i> is not equal to <i>rhs</i>
+ * @param rhs the right hand side in the comparison
+ **/
+ bool operator!=(const GenCnt &rhs) const { return rhs._val != _val; }
+
+ /**
+ * @brief Assignment operator
+ *
+ * @return this object
+ * @param src the object we want to copy
+ **/
+ GenCnt &operator=(const GenCnt &src);
+
+ /**
+ * @brief Get the generation counter as an integer
+ *
+ * @return generation counter
+ **/
+ uint32_t getAsInt() const { return _val; }
+
+ /**
+ * @brief Set the generation counter from an integer
+ *
+ * @param val generation counter
+ **/
+ void setFromInt(uint32_t val) { _val = val; }
+
+ /**
+ * @brief Reset the value of this reference counter to 0
+ **/
+ void reset() { _val = 0; }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/generationhandler.cpp b/vespalib/src/vespa/vespalib/util/generationhandler.cpp
new file mode 100644
index 00000000000..64692d975db
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/generationhandler.cpp
@@ -0,0 +1,201 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "generationhandler.h"
+
+namespace vespalib {
+
+GenerationHandler::Guard::Guard()
+ : _hold(NULL)
+{
+}
+
+GenerationHandler::Guard::Guard(GenerationHold *hold)
+ : _hold(hold->acquire())
+{
+}
+
+GenerationHandler::Guard::~Guard()
+{
+ cleanup();
+}
+
+GenerationHandler::Guard::Guard(const Guard & rhs)
+ : _hold(GenerationHold::copy(rhs._hold))
+{
+}
+
+GenerationHandler::Guard::Guard(Guard &&rhs)
+ : _hold(rhs._hold)
+{
+ rhs._hold = nullptr;
+}
+
+GenerationHandler::Guard &
+GenerationHandler::Guard::operator=(const Guard & rhs)
+{
+ if (&rhs != this) {
+ cleanup();
+ _hold = GenerationHold::copy(rhs._hold);
+ }
+ return *this;
+}
+
+GenerationHandler::Guard &
+GenerationHandler::Guard::operator=(Guard &&rhs)
+{
+ if (&rhs != this) {
+ cleanup();
+ _hold = rhs._hold;
+ rhs._hold = nullptr;
+ }
+ return *this;
+}
+
+
+void
+GenerationHandler::updateFirstUsedGeneration()
+{
+ for (;;) {
+ if (_first == _last)
+ break; // No elements can be freed
+ if (!_first->setInvalid()) {
+ break; // First element still in use
+ }
+ GenerationHold *toFree = _first;
+ assert(toFree->_next != NULL);
+ _first = toFree->_next;
+ // Must ensure _first is updated before changing next pointer to
+ // avoid temporarily inconsistent state (breaks hasReaders())
+ std::atomic_thread_fence(std::memory_order_release);
+ toFree->_next = _free;
+ _free = toFree;
+ }
+ _firstUsedGeneration = _first->_generation;
+}
+
+
+GenerationHandler::GenerationHandler()
+ : _generation(0),
+ _firstUsedGeneration(0),
+ _last(NULL),
+ _first(NULL),
+ _free(NULL),
+ _numHolds(0u)
+{
+ _last = _first = new GenerationHold;
+ ++_numHolds;
+ _last->_generation = _generation;
+ _last->setValid();
+}
+
+
+GenerationHandler::~GenerationHandler(void)
+{
+
+ updateFirstUsedGeneration();
+ assert(_first == _last);
+ while (_free != NULL) {
+ GenerationHold *toFree = _free;
+ _free = toFree->_next;
+ --_numHolds;
+ delete toFree;
+ }
+ assert(_numHolds == 1);
+ delete _first;
+}
+
+GenerationHandler::Guard
+GenerationHandler::takeGuard() const
+{
+ Guard guard(_last);
+ for (;;) {
+ // Must check valid() after increasing refcount
+ std::atomic_thread_fence(std::memory_order_acquire);
+ if (guard.valid())
+ break; // Might still be marked invalid, that's OK
+ /*
+ * Clashed with writer freeing entry. Must abandon current
+ * guard and try again.
+ */
+ guard = Guard(_last);
+ }
+ // Guard has been valid after bumping refCount
+ return guard;
+}
+
+void
+GenerationHandler::incGeneration()
+{
+ generation_t ngen = getNextGeneration();
+
+ std::atomic_thread_fence(std::memory_order_seq_cst);
+ if (_last->getRefCount() == 0) {
+ // Last generation is unused, morph it to new generation. This is
+ // the typical case when no readers are present.
+ _generation = ngen;
+ _last->_generation = ngen;
+ std::atomic_thread_fence(std::memory_order_release);
+ updateFirstUsedGeneration();
+ return;
+ }
+ GenerationHold *nhold = NULL;
+ if (_free == NULL) {
+ nhold = new GenerationHold;
+ ++_numHolds;
+ } else {
+ nhold = _free;
+ _free = nhold->_next;
+ }
+ nhold->_generation = ngen;
+ nhold->_next = NULL;
+ nhold->setValid();
+
+ // new hold must be updated before next pointer is updated
+ std::atomic_thread_fence(std::memory_order_release);
+ _last->_next = nhold;
+
+ // next pointer must be updated before _last is updated
+ std::atomic_thread_fence(std::memory_order_release);
+ _generation = ngen;
+ _last = nhold;
+
+ // _last must be updated before _first is changed
+ std::atomic_thread_fence(std::memory_order_release);
+ updateFirstUsedGeneration();
+}
+
+
+uint32_t
+GenerationHandler::getGenerationRefCount(generation_t gen) const
+{
+ if (static_cast<sgeneration_t>(gen - _generation) > 0)
+ return 0u;
+ if (static_cast<sgeneration_t>(_firstUsedGeneration - gen) > 0)
+ return 0u;
+ for (GenerationHold *hold = _first; hold != NULL; hold = hold->_next) {
+ if (hold->_generation == gen)
+ return hold->getRefCount();
+ }
+ return 0u;
+}
+
+
+uint64_t
+GenerationHandler::getGenerationRefCount(void) const
+{
+ uint64_t ret = 0;
+ for (GenerationHold *hold = _first; hold != NULL; hold = hold->_next) {
+ ret += hold->getRefCount();
+ }
+ return ret;
+}
+
+
+bool
+GenerationHandler::hasReaders(void) const
+{
+ return (_first != _last) ? true : (_first->getRefCount() > 0);
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/util/generationhandler.h b/vespalib/src/vespa/vespalib/util/generationhandler.h
new file mode 100644
index 00000000000..9a807e79738
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/generationhandler.h
@@ -0,0 +1,183 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <stdint.h>
+#include <atomic>
+
+namespace vespalib {
+
+/**
+ * Class used to keep track of the current generation of a component
+ * (changed by a single writer), and previous generations still
+ * occupied by multiple readers. Readers will take a generation guard
+ * by calling takeGuard().
+ **/
+class GenerationHandler {
+public:
+ typedef uint64_t generation_t;
+ typedef int64_t sgeneration_t;
+
+ /*
+ * This must be type stable memory, and cannot be freed before the
+ * GenerationHandler is freed (i.e. when external methods ensure that
+ * no readers are still active).
+ */
+ class GenerationHold
+ {
+ // least significant bit is invalid flag
+ std::atomic<uint32_t> _refCount;
+
+ static bool valid(uint32_t refCount) { return (refCount & 1) == 0u; }
+ public:
+ generation_t _generation;
+ GenerationHold *_next; // next free element or next newer element.
+
+ GenerationHold(void)
+ : _refCount(1),
+ _generation(0),
+ _next(0)
+ {
+ }
+
+ ~GenerationHold()
+ {
+ assert(getRefCount() == 0);
+ }
+
+ void setValid() {
+ assert(!valid(_refCount));
+ _refCount.fetch_sub(1);
+ }
+ bool setInvalid() {
+ uint32_t refs = _refCount;
+ assert(valid(refs));
+ if (refs != 0) {
+ return false;
+ }
+ return _refCount.compare_exchange_strong(refs, 1,
+ std::memory_order_seq_cst);
+ }
+ void release() { _refCount.fetch_sub(2); }
+ GenerationHold *acquire() {
+ if (valid(_refCount.fetch_add(2))) {
+ return this;
+ } else {
+ release();
+ return nullptr;
+ }
+ }
+ static GenerationHold *copy(GenerationHold *self) {
+ if (self == nullptr) {
+ return nullptr;
+ } else {
+ uint32_t oldRefCount = self->_refCount.fetch_add(2);
+ assert(valid(oldRefCount));
+ return self;
+ }
+ }
+ uint32_t getRefCount() const { return _refCount / 2; }
+ };
+
+ /**
+ * Class that keeps a reference to a generation until destroyed.
+ **/
+ class Guard {
+ private:
+ GenerationHold *_hold;
+ void cleanup() {
+ if (_hold != nullptr) {
+ _hold->release();
+ _hold = nullptr;
+ }
+ }
+ public:
+ Guard();
+ Guard(GenerationHold *hold); // hold is never nullptr
+ ~Guard();
+ Guard(const Guard & rhs);
+ Guard(Guard &&rhs);
+ Guard & operator=(const Guard & rhs);
+ Guard & operator=(Guard &&rhs);
+
+ bool valid(void) const {
+ return _hold != nullptr;
+ }
+ generation_t getGeneration() const { return _hold->_generation; }
+ };
+
+private:
+ generation_t _generation;
+ generation_t _firstUsedGeneration;
+ GenerationHold *_last; // Points to "current generation" entry
+ GenerationHold *_first; // Points to "firstUsedGeneration" entry
+ GenerationHold *_free; // List of free entries
+ uint32_t _numHolds; // Number of allocated generation hold entries
+
+public:
+ /**
+ * Creates a new generation handler.
+ **/
+ GenerationHandler();
+
+ ~GenerationHandler();
+
+ /**
+ * Take a generation guard on the current generation.
+ * Should be called by reader threads.
+ **/
+ Guard takeGuard() const;
+
+ /**
+ * Increases the current generation by 1.
+ * Should be called by the writer thread.
+ **/
+ void incGeneration();
+
+ /**
+ * Update first used generation.
+ * Should be called by the writer thread.
+ */
+ void updateFirstUsedGeneration();
+
+ /**
+ * Returns the first generation guarded by a reader. It might be too low
+ * if writer hasn't updated first used generation after last reader left.
+ */
+ generation_t getFirstUsedGeneration() const {
+ return _firstUsedGeneration;
+ }
+
+ /**
+ * Returns the current generation.
+ **/
+ generation_t getCurrentGeneration() const {
+ return _generation;
+ }
+
+ generation_t getNextGeneration(void) const {
+ return _generation + 1;
+ }
+
+ /**
+ * Returns the number of readers holding a generation guard on the
+ * given generation. Should be called by the writer thread.
+ */
+ uint32_t getGenerationRefCount(generation_t gen) const;
+
+ /**
+ * Returns the number of readers holding a generation guard.
+ * Should be called by the writer thread.
+ */
+ uint64_t getGenerationRefCount(void) const;
+
+ /**
+ * Returns true if we still have readers. False positives and
+ * negatives are possible if readers come and go while writer
+ * updates generations.
+ */
+ bool hasReaders(void) const;
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/generationholder.cpp b/vespalib/src/vespa/vespalib/util/generationholder.cpp
new file mode 100644
index 00000000000..7d8d53b88f5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/generationholder.cpp
@@ -0,0 +1,93 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "generationholder.h"
+
+namespace vespalib {
+
+GenerationHeldBase::~GenerationHeldBase(void)
+{
+}
+
+GenerationHeldMalloc::GenerationHeldMalloc(size_t size, void *data)
+ : GenerationHeldBase(size),
+ _data(data)
+{
+}
+
+GenerationHeldMalloc::~GenerationHeldMalloc(void)
+{
+ free(_data);
+};
+
+GenerationHolder::GenerationHolder(void)
+ : _hold1List(),
+ _hold2List()
+{
+}
+
+GenerationHolder::~GenerationHolder(void)
+{
+ assert(_hold1List.empty());
+ assert(_hold2List.empty());
+}
+
+void
+GenerationHolder::hold(GenerationHeldBase::UP data)
+{
+ _hold1List.push_back(GenerationHeldBase::SP(data.release()));
+}
+
+void
+GenerationHolder::transferHoldListsSlow(generation_t generation)
+{
+ HoldList::iterator it(_hold1List.begin());
+ HoldList::iterator ite(_hold1List.end());
+ HoldList &hold2List = _hold2List;
+ for (; it != ite; ++it) {
+ assert((*it)->_generation == 0u);
+ (*it)->_generation = generation;
+ hold2List.push_back(*it);
+ }
+ _hold1List.clear();
+}
+
+void
+GenerationHolder::trimHoldListsSlow(generation_t usedGen)
+{
+ for (;;) {
+ if (_hold2List.empty())
+ break;
+ GenerationHeldBase &first = *_hold2List.front();
+ if (static_cast<sgeneration_t>(first._generation - usedGen) >= 0)
+ break;
+ _hold2List.erase(_hold2List.begin());
+ }
+}
+
+void
+GenerationHolder::clearHoldLists(void)
+{
+ _hold1List.clear();
+ _hold2List.clear();
+}
+
+size_t
+GenerationHolder::getHeldBytes(void) const
+{
+ size_t ret = 0;
+ HoldList::const_iterator it(_hold1List.begin());
+ HoldList::const_iterator ite(_hold1List.end());
+ for (; it != ite; ++it) {
+ assert((*it)->_generation == 0u);
+ ret += (*it)->getSize();
+ }
+ it =_hold2List.begin();
+ ite = _hold2List.end();
+ for (; it != ite; ++it) {
+ ret += (*it)->getSize();
+ }
+ return ret;
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/util/generationholder.h b/vespalib/src/vespa/vespalib/util/generationholder.h
new file mode 100644
index 00000000000..4c15df95ff2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/generationholder.h
@@ -0,0 +1,109 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vector>
+#include "generationhandler.h"
+
+namespace vespalib {
+
+class GenerationHeldBase
+{
+public:
+ typedef GenerationHandler::generation_t generation_t;
+ typedef std::unique_ptr<GenerationHeldBase> UP;
+ typedef std::shared_ptr<GenerationHeldBase> SP;
+
+ generation_t _generation;
+private:
+ size_t _size;
+
+public:
+ GenerationHeldBase(size_t size)
+ : _generation(0u),
+ _size(size)
+ {
+ }
+
+ virtual ~GenerationHeldBase(void);
+ size_t getSize(void) const { return _size; }
+};
+
+class GenerationHeldMalloc : public GenerationHeldBase
+{
+ void *_data;
+
+public:
+ GenerationHeldMalloc(size_t size, void *data);
+
+ virtual ~GenerationHeldMalloc(void);
+};
+
+template<typename A>
+class GenerationHeldAlloc : public GenerationHeldBase
+{
+public:
+ GenerationHeldAlloc(A & alloc) : GenerationHeldBase(alloc.size()), _alloc() { _alloc.swap(alloc); }
+ virtual ~GenerationHeldAlloc() { }
+private:
+ A _alloc;
+};
+
+/*
+ * GenerationHolder is meant to hold large elements until readers can
+ * no longer access them.
+ */
+class GenerationHolder
+{
+private:
+ typedef GenerationHandler::generation_t generation_t;
+ typedef GenerationHandler::sgeneration_t sgeneration_t;
+
+ typedef std::vector<GenerationHeldBase::SP> HoldList;
+
+ HoldList _hold1List;
+ HoldList _hold2List;
+
+ /**
+ * Transfer holds from hold1 to hold2 lists, assigning generation.
+ */
+ void transferHoldListsSlow(generation_t generation);
+
+ /**
+ * Remove all data elements from this holder where generation < usedGen.
+ **/
+ void trimHoldListsSlow(generation_t usedGen);
+
+public:
+ GenerationHolder(void);
+ ~GenerationHolder(void);
+
+ /**
+ * Add the given data pointer to this holder.
+ **/
+ void hold(GenerationHeldBase::UP data);
+
+ /**
+ * Transfer holds from hold1 to hold2 lists, assigning generation.
+ */
+ void transferHoldLists(generation_t generation) {
+ if (!_hold1List.empty()) {
+ transferHoldListsSlow(generation);
+ }
+ }
+
+ /**
+ * Remove all data elements from this holder where generation < usedGen.
+ **/
+ void trimHoldLists(generation_t usedGen) {
+ if (!_hold2List.empty() && static_cast<sgeneration_t>(_hold2List.front()->_generation - usedGen) < 0) {
+ trimHoldListsSlow(usedGen);
+ }
+ }
+
+ void clearHoldLists(void);
+ size_t getHeldBytes(void) const;
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/guard.h b/vespalib/src/vespa/vespalib/util/guard.h
new file mode 100644
index 00000000000..ffc0908fd87
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/guard.h
@@ -0,0 +1,375 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2006 Yahoo
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+
+namespace vespalib {
+
+/**
+ * @brief A FilePointer wraps a bald FILE pointer inside a guarding
+ * object.
+ *
+ * The underlying file is closed when the FilePointer object is
+ * destructed.
+ **/
+class FilePointer
+{
+private:
+ FILE *_fp;
+ FilePointer(const FilePointer &);
+ FilePointer &operator=(const FilePointer &);
+public:
+ /**
+ * @brief Create a FilePointer from a FILE pointer.
+ *
+ * @param file the underlying FILE pointer
+ **/
+ explicit FilePointer(FILE *file = NULL) : _fp(file) {}
+ /**
+ * @brief Close the file if it is still open.
+ **/
+ ~FilePointer() { reset(); }
+ /**
+ * @brief Check whether we have a FILE pointer (not NULL)
+ *
+ * @return true if we have an underlying FILE pointer
+ **/
+ bool valid() const { return (_fp != NULL); }
+ /**
+ * @brief Obtain the internal FILE pointer
+ *
+ * @return internal FILE pointer
+ **/
+ FILE *fp() const { return _fp; }
+ /**
+ * @brief Implicit cast to obtain internal FILE pointer
+ *
+ * @return internal FILE pointer
+ **/
+ operator FILE*() { return _fp; }
+ /**
+ * @brief Take ownership of a new FILE pointer.
+ *
+ * The previously owned FILE pointer is closed, if present.
+ **/
+ void reset(FILE *file = NULL) {
+ if (valid()) {
+ fclose(_fp);
+ }
+ _fp = file;
+ }
+ /**
+ * @brief Release ownership of the current FILE pointer.
+ *
+ * The file will no longer be closed by the destructor.
+ *
+ * @return the released FILE pointer
+ **/
+ FILE *release() {
+ FILE *tmp = _fp;
+ _fp = NULL;
+ return tmp;
+ }
+};
+
+
+/**
+ * @brief A DirPointer wraps a bald DIR pointer inside a guarding object.
+ *
+ * The underlying directory is closed when the DirPointer object is
+ * destructed.
+ **/
+class DirPointer
+{
+private:
+ DIR *_dp;
+ DirPointer(const DirPointer &);
+ DirPointer &operator=(const DirPointer &);
+public:
+ /**
+ * @brief Create a DirPointer from a DIR pointer.
+ *
+ * @param dir the underlying DIR pointer
+ **/
+ explicit DirPointer(DIR *dir = NULL) : _dp(dir) {}
+ /**
+ * Close the directory if it is still open.
+ **/
+ ~DirPointer() { reset(); }
+ /**
+ * @brief Check whether we have a DIR pointer (not NULL)
+ *
+ * @return true if we have an underlying DIR pointer
+ **/
+ bool valid() const { return (_dp != NULL); }
+ /**
+ * @brief Obtain the internal DIR pointer
+ *
+ * @return internal DIR pointer
+ **/
+ DIR *dp() const { return _dp; }
+ /**
+ * @brief Implicit cast to obtain internal DIR pointer
+ *
+ * @return internal DIR pointer
+ **/
+ operator DIR*() { return _dp; }
+ /**
+ * @brief Take ownership of a new DIR pointer.
+ *
+ * The previously owned DIR pointer is closed, if present.
+ **/
+ void reset(DIR *dir = NULL) {
+ if (valid()) {
+ closedir(_dp);
+ }
+ _dp = dir;
+ }
+ /**
+ * @brief Release ownership of the current DIR pointer.
+ *
+ * The directory will no longer be closed by the destructor.
+ *
+ * @return the released DIR pointer
+ **/
+ DIR *release() {
+ DIR *tmp = _dp;
+ _dp = NULL;
+ return tmp;
+ }
+};
+
+
+/**
+ * @brief A FileDescriptor wraps a file descriptor inside a guarding object.
+ *
+ * The underlying file is closed when the FileDescriptor object is
+ * destructed.
+ **/
+class FileDescriptor
+{
+private:
+ int _fd;
+ FileDescriptor(const FileDescriptor &);
+ FileDescriptor &operator=(const FileDescriptor &);
+public:
+ /**
+ * @brief Create a FileDescriptor from a file descriptor.
+ *
+ * @param file the underlying file descriptor
+ **/
+ explicit FileDescriptor(int file = -1) : _fd(file) {}
+ /**
+ * @brief Close the file if it is still open.
+ **/
+ ~FileDescriptor() { reset(); }
+ /**
+ * @brief Check whether we have a file descriptor (not -1)
+ *
+ * @return true if we have an underlying file descriptor
+ **/
+ bool valid() const { return (_fd >= 0); }
+ /**
+ * @brief Obtain the internal file descriptor
+ *
+ * @return internal file descriptor
+ **/
+ int fd() const { return _fd; }
+ /**
+ * @brief Take ownership of a new file descriptor.
+ *
+ * The previously owned file descriptor is closed, if present.
+ **/
+ void reset(int file = -1) {
+ if (valid()) {
+ close(_fd);
+ }
+ _fd = file;
+ }
+ /**
+ * @brief Release ownership of the current file descriptor.
+ *
+ * The file will no longer be closed by the destructor.
+ *
+ * @return the released file descriptor
+ **/
+ int release() {
+ int tmp = _fd;
+ _fd = -1;
+ return tmp;
+ }
+};
+
+
+/**
+ * @brief A CounterGuard increases an int in the constructor and decreases
+ * it in the destructor.
+ *
+ * This is typically used to keep track of how many threads are inside
+ * a given scope at a given time (for example, how many threads that
+ * are currently waiting for a specific signal on a monitor).
+ **/
+class CounterGuard
+{
+private:
+ int &_cnt;
+ CounterGuard(const CounterGuard &);
+ CounterGuard &operator=(const CounterGuard &);
+public:
+ /**
+ * @brief Increase the value
+ *
+ * @param cnt a reference to the value that will be modified
+ **/
+ explicit CounterGuard(int &cnt) : _cnt(cnt) { ++cnt; }
+ /**
+ * @brief Decrease the value
+ **/
+ ~CounterGuard() { --_cnt; }
+};
+
+
+/**
+ * @brief A ValueGuard is used to set a variable to a specific value
+ * when the ValueGuard is destructed.
+ *
+ * This can be used to revert a variable if an exception is thrown.
+ * However, you must remember to dismiss the guard if you don't want
+ * it to set the value when it goes out of scope.
+ **/
+template<typename T>
+class ValueGuard
+{
+private:
+ bool _active;
+ T &_ref;
+ T _value;
+
+ ValueGuard(const ValueGuard &);
+ ValueGuard &operator=(const ValueGuard &);
+public:
+ /**
+ * @brief Create a ValueGuard for the given variable.
+ *
+ * The variable will be reverted to its original value in the destructor.
+ *
+ * @param ref the variable that will be modified
+ **/
+ explicit ValueGuard(T &ref) : _active(true), _ref(ref), _value(ref) {}
+ /**
+ * @brief Create a ValueGuard for the given variable.
+ *
+ * The variable will be set to the given value in the destructor.
+ *
+ * @param ref the variable that will be modified
+ * @param val the value it will be set to
+ **/
+ ValueGuard(T &ref, const T &val) : _active(true), _ref(ref), _value(val) {}
+ /**
+ * @brief Reset the variable.
+ *
+ * Set the variable to the value defined in the constructor or the
+ * update method. If dismiss has been invoked, the variable is not
+ * modified.
+ **/
+ ~ValueGuard() {
+ if (_active) {
+ _ref = _value;
+ }
+ }
+ /**
+ * @brief Dismiss this guard.
+ *
+ * When a guard has been dismissed, the destructor will not modify
+ * the variable. The dismiss method is typically used to indicate
+ * that everything went ok, and that we no longer need to protect
+ * the variable from exceptions.
+ **/
+ void dismiss() { _active = false; }
+ /// @brief See dismiss
+ void deactivate() { dismiss(); }
+ /**
+ * @brief Update the value the variable will be set to in the
+ * destructor.
+ *
+ * This can be used to set revert points during execution.
+ **/
+ void update(const T &val) { _value = val; }
+ void operator=(const T& val) { update(val); }
+};
+
+
+/**
+ * @brief A MaxValueGuard is used to enfore an upper bound on the
+ * value of a variable when the MaxValueGuard is destructed.
+ *
+ * This can be used to revert a variable if an exception is thrown.
+ * However, you must remember to dismiss the guard if you don't want
+ * it to set the value when it goes out of scope.
+ **/
+template<typename T>
+class MaxValueGuard {
+ bool _active;
+ T &_ref;
+ T _value;
+
+ MaxValueGuard(const MaxValueGuard &);
+ MaxValueGuard &operator=(const MaxValueGuard &);
+public:
+ /**
+ * @brief Create a MaxValueGuard for the given variable.
+ *
+ * The variable will be reverted back to its original value in the
+ * destructor if it has increased.
+ *
+ * @param ref the variable that will be modified
+ **/
+ explicit MaxValueGuard(T &ref) : _active(true), _ref(ref), _value(ref) {}
+ /**
+ * @brief Create a ValueGuard for the given variable.
+ *
+ * The given upper bound will be enforced in the destructor.
+ *
+ * @param ref the variable that will be modified
+ * @param val upper bound for the variable
+ **/
+ MaxValueGuard(T& ref, const T& val) : _active(true), _ref(ref), _value(val) {}
+ /**
+ * @brief Enforce the upper bound.
+ *
+ * If the current value of the variable is greater than the upper
+ * bound, it is set to the upper bound as defined in the
+ * constructor or the update method. If dismiss has been invoked,
+ * the variable is not modified.
+ **/
+ ~MaxValueGuard() {
+ if (_active && _ref > _value) {
+ _ref = _value;
+ }
+ }
+ /**
+ * @brief Dismiss this guard.
+ *
+ * When a guard is dismissed, the destructor will not modify the
+ * variable. The dismiss method is typically used to indicate that
+ * everything went ok, and that we no longer need to protect the
+ * variable from exceptions.
+ **/
+ void dismiss() { _active = false; }
+ /// @brief See dismiss
+ void deactivate() { dismiss(); }
+ /**
+ * @brief Update the upper bound that will be enforced in the
+ * destructor.
+ *
+ * This can be used to set revert points during execution.
+ **/
+ void update(const T &val) { _value = val; }
+ /// @brief See update.
+ void operator=(const T& val) { update(val); }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/hashmap.cpp b/vespalib/src/vespa/vespalib/util/hashmap.cpp
new file mode 100644
index 00000000000..687f443c3ff
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/hashmap.cpp
@@ -0,0 +1,230 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+/**
+ * @file hashmap.cpp
+ * @brief simple hashmap implementation
+ * @author H�vard Pettersen
+ * @version $Id$
+ * @date 2006/03/16
+ **/
+
+#include <vespa/fastos/fastos.h>
+#include "hashmap.h"
+
+namespace vespalib {
+#ifndef IAM_DOXYGEN
+
+const uint32_t HashMapData::sizeStepsSize = 30;
+uint32_t HashMapData::sizeSteps[sizeStepsSize] =
+{
+ 3,
+ 7,
+ 13,
+ 31,
+ 61,
+ 127,
+ 251,
+ 509,
+ 1021,
+ 2039,
+ 4093,
+ 8191,
+ 16381,
+ 32749,
+ 65521,
+ 131071,
+ 262139,
+ 524287,
+ 1048573,
+ 2097143,
+ 4194301,
+ 8388593,
+ 16777213,
+ 33554393,
+ 67108859,
+ 134217689,
+ 268435399,
+ 536870909,
+ 1073741789,
+ 2147483647
+};
+
+#endif //#ifndef IAM_DOXYGEN
+
+
+/**
+ * @fn explicit HashMap<T>::HashMap(const T &empty, uint32_t minBuckets = 50)
+ * @brief Constructor.
+ * @param empty value used for non-existing entries
+ * @param minBuckets minimum number of hash buckets
+ **/
+
+/**
+ * @fn HashMap<T>::~HashMap()
+ * @brief Destructor.
+ **/
+
+/**
+ * @fn void HashMap<T>::clear()
+ * @brief Remove all entries.
+ **/
+
+/**
+ * @fn T HashMap<T>::set(const char *key, const T &value)
+ * @brief Set a value.
+ *
+ * The key 'key' will map to 'value'.
+ * If the number of entries in the hashmap exceeds 3/5 the number of buckets,
+ * the map will resize to the next bigger bucket size.
+ *
+ * @return old value for key if set, otherwise 'empty' from constructor
+ * @param key hash key
+ * @param value new value for key
+ **/
+
+/**
+ * @fn bool HashMap<T>::isSet(const char *key) const
+ * @brief Check if a key is set.
+ * @return true if the given key was set
+ * @param key hash key
+ **/
+
+/**
+ * @fn const T &HashMap<T>::get(const char *key) const
+ * @brief Get a value
+ * @return the value that 'key' maps to if set,
+ * otherwise 'empty' from constructor
+ * @param key hash key
+ **/
+
+/**
+ * @fn T HashMap<T>::remove(const char *key)
+ * @brief Remove a value.
+ * @return old value for the given key
+ * @param key hash key
+ **/
+
+/**
+ * @fn const T& HashMap<T>::operator[](const char *key) const
+ * @brief Get a value
+ * @return the value that 'key' maps to, or a copy of empty if no mapping
+ * @param key hash key
+ **/
+
+/**
+ * @fn HashMap<T>::Iterator HashMap<T>::iterator() const
+ * @brief Obtain an unsafe iterator for this hash map.
+ * @return hash map iterator
+ **/
+
+/**
+ * @fn uint32_t HashMap<T>::size() const
+ * @brief Obtain the number of entries in this map.
+ * @return number of entries
+ **/
+
+/**
+ * @fn bool HashMap<T>::isEmpty() const
+ * @brief Check for emptiness.
+ * @return Whether this map is empty
+ **/
+
+/**
+ * @fn uint32_t HashMap<T>::buckets() const
+ * @brief Obtain the number of hash buckets.
+ * @return the number of hash buckets
+ **/
+
+//-----------------------------------------------------------------------------
+
+/**
+ * @fn HashMap<T>::Iterator::Iterator(const Iterator &src)
+ * @brief Copy constructor.
+ * @param src copy this
+ **/
+
+/**
+ * @fn HashMap<T>::Iterator& HashMap<T>::Iterator::operator=(const Iterator &src)
+ * @brief Assignment.
+ * @param src copy this
+ **/
+
+/**
+ * @fn bool HashMap<T>::Iterator::valid() const
+ * @brief Check if current entry is valid.
+ *
+ * This method returns true until the iterator has been stepped after
+ * the last entry in the hash map.
+ *
+ * @return true if the current entry is valid
+ **/
+
+/**
+ * @fn const char *HashMap<T>::Iterator::key() const
+ * @brief Get current key.
+ *
+ * This method should only be called when the valid method returns
+ * true.
+ *
+ * @return current key
+ **/
+
+/**
+ * @fn const T &HashMap<T>::Iterator::value() const
+ * @brief Get current value.
+ *
+ * This method should only be called when the valid method returns
+ * true.
+ *
+ * @return current value
+ **/
+
+/**
+ * @fn void HashMap<T>::Iterator::next()
+ * @brief Step this iterator.
+ *
+ * This method should only be called when the valid method returns
+ * true.
+ **/
+
+/**
+ * @brief Calculate hash value.
+ *
+ * This is the hash function used by the HashMap class.
+ * The hash function is inherited from Fastserver4 / FastLib / pandora.
+ * @param str input string, zero terminated
+ * @return hash value of input
+ **/
+size_t
+hashValue(const char *str)
+{
+ size_t res = 0;
+ unsigned const char *pt = (unsigned const char *) str;
+ while (*pt != 0) {
+ res = (res << 7) + (res >> 25) + *pt++;
+ }
+ return res;
+}
+
+/**
+ * @brief Calculate hash value.
+ *
+ * This is the hash function used by the HashMap class.
+ * The hash function is inherited from Fastserver4 / FastLib / pandora.
+ * @param buf input buffer
+ * @param sz input buffer size
+ * @return hash value of input
+ **/
+size_t
+hashValue(const void * buf, size_t sz)
+{
+ size_t res = 0;
+ unsigned const char *pt = (unsigned const char *) buf;
+ for (size_t i(0); i < sz; i++) {
+ res = (res << 7) + (res >> 25) + pt[i];
+ }
+ return res;
+}
+
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/hashmap.h b/vespalib/src/vespa/vespalib/util/hashmap.h
new file mode 100644
index 00000000000..e97a77ea606
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/hashmap.h
@@ -0,0 +1,374 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <inttypes.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "hashmapdata.h"
+
+/**
+ * @brief namespace for generic Vespa library
+ **/
+namespace vespalib {
+
+size_t hashValue(const char *str);
+size_t hashValue(const void * buf, size_t sz);
+
+/**
+ * @brief Simple hash map implementation
+ *
+ * The type T must have normal copy semantics, and a special empty
+ * value must be provided that lookup can return when no mapping exists.
+ * The key is always a zero-terminated C string and key matching is done
+ * via strcmp(). The hash function used on the key is vespalib::hashValue()
+ * and the map will auto-resize to become bigger when enough entries have
+ * been added.
+ **/
+template <typename T>
+class HashMap
+{
+private:
+ class HashMapKey
+ {
+ private:
+ HashMapKey(const HashMapKey &);
+ HashMapKey& operator=(const HashMapKey &);
+ public:
+ HashMapKey(const char *data) : _data(strdup(data)) {}
+ ~HashMapKey() { free(_data); }
+ bool operator== (const char *other) {
+ return (strcmp(_data, other) == 0);
+ }
+ const char *key() { return _data; }
+ private:
+ char *_data;
+ };
+
+ struct Entry
+ {
+ Entry *_next;
+ HashMapKey _key;
+ T _value;
+
+ Entry(Entry *next, const char *key, const T &value)
+ : _next(next), _key(key), _value(value) {}
+
+ private:
+ Entry(const Entry &);
+ Entry& operator=(const Entry &);
+ };
+
+ Entry **_table;
+ uint32_t _tableSize;
+ uint32_t _rehashSize;
+ uint32_t _entryCnt;
+ T _empty;
+
+ // not defined [2]
+ HashMap(const HashMap<T> &);
+ HashMap<T>& operator=(const HashMap<T> &);
+
+ inline uint32_t getSize(uint32_t minBuckets) const;
+ inline Entry *lookup(const char *key) const;
+
+public:
+ /**
+ * @brief Iterator for HashMap class
+ *
+ * Note that iterators are unsafe; if the hashmap is changed
+ * the iterator may refer to freed data.
+ **/
+ class Iterator
+ {
+ friend class HashMap<T>;
+ private:
+ typename HashMap<T>::Entry **_table;
+ uint32_t _tableSize;
+ uint32_t _idx;
+ typename HashMap<T>::Entry *_entry;
+
+ explicit Iterator(const HashMap<T> *map);
+ public:
+ inline Iterator(const Iterator &src);
+ inline Iterator &operator=(const Iterator &src);
+ inline bool valid() const { return _entry != NULL; }
+ inline const char *key() const { return _entry->_key.key(); };
+ inline const T &value() const { return _entry->_value; };
+ inline void next();
+ };
+
+ friend class Iterator;
+
+ inline explicit HashMap(const T &empty, uint32_t minBuckets = 50);
+ inline ~HashMap();
+
+ inline void clear();
+ inline T set(const char *key, const T &value);
+ inline bool isSet(const char *key) const;
+ inline const T &get(const char *key) const;
+ inline T remove(const char *key);
+ inline const T& operator[](const char *key) const; // R-value
+ inline Iterator iterator() const;
+
+ uint32_t size() const { return _entryCnt; }
+ bool isEmpty() const { return _entryCnt == 0; }
+ uint32_t buckets() const { return _tableSize; }
+ uint32_t maxDepth() const;
+ uint32_t emptyBuckets() const;
+};
+
+//-----------------------------------------------------------------------------
+
+
+template <typename T>
+HashMap<T>::Iterator::Iterator(const HashMap<T> *map)
+ : _table(map->_table),
+ _tableSize(map->_tableSize),
+ _idx(0),
+ _entry(NULL)
+{
+ while (_entry == NULL && _idx < _tableSize)
+ _entry = _table[_idx++];
+}
+
+
+template <typename T>
+HashMap<T>::Iterator::Iterator(const Iterator &src)
+ : _table(src._table),
+ _tableSize(src._tableSize),
+ _idx(src._idx),
+ _entry(src._entry)
+{
+}
+
+
+template <typename T>
+typename HashMap<T>::Iterator &
+HashMap<T>::Iterator::operator=(const Iterator &src)
+{
+ _table = src._table;
+ _tableSize = src._tableSize;
+ _idx = src._idx;
+ _entry = src._entry;
+ return *this;
+}
+
+
+template <typename T>
+void
+HashMap<T>::Iterator::next()
+{
+ _entry = _entry->_next;
+ while (_entry == NULL && _idx < _tableSize)
+ _entry = _table[_idx++];
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+uint32_t
+HashMap<T>::getSize(uint32_t minBuckets) const
+{
+ for (uint32_t my_i = 0; my_i < HashMapData::sizeStepsSize; my_i++)
+ if (HashMapData::sizeSteps[my_i] >= minBuckets)
+ return HashMapData::sizeSteps[my_i];
+ return minBuckets;
+}
+
+
+template <typename T>
+typename HashMap<T>::Entry *
+HashMap<T>::lookup(const char *key) const
+{
+ uint32_t bucket = hashValue(key) % _tableSize;
+ Entry *pt = _table[bucket];
+ for (; pt != NULL; pt = pt->_next)
+ if (pt->_key == key)
+ break;
+ return pt;
+}
+
+
+template <typename T>
+HashMap<T>::HashMap(const T &empty, uint32_t minBuckets)
+ : _table(NULL),
+ _tableSize(0),
+ _rehashSize(0),
+ _entryCnt(0),
+ _empty(empty)
+{
+ _tableSize = getSize(minBuckets);
+ _rehashSize = (_tableSize * 3) / 5;
+ _table = new Entry*[_tableSize];
+ memset(_table, 0, _tableSize * sizeof(Entry *));
+}
+
+
+template <typename T>
+HashMap<T>::~HashMap()
+{
+ clear();
+ delete [] _table;
+}
+
+
+template <typename T>
+void
+HashMap<T>::clear()
+{
+ for (uint32_t my_i = 0; my_i < _tableSize; my_i++) {
+ while (_table[my_i] != NULL) {
+ Entry *entry = _table[my_i];
+ _table[my_i] = entry->_next;
+ delete entry;
+ }
+ }
+ _entryCnt = 0;
+}
+
+
+template <typename T>
+T
+HashMap<T>::set(const char *key, const T &value)
+{
+ uint32_t bucket = hashValue(key) % _tableSize;
+ Entry *pt = _table[bucket];
+ for (; pt != NULL; pt = pt->_next)
+ if (pt->_key == key)
+ break;
+ if (pt == NULL) {
+ _table[bucket] = new Entry(_table[bucket], key, value);
+ _entryCnt++;
+ return _empty;
+ }
+ T ret = pt->_value;
+ pt->_value = value;
+
+ if (_entryCnt > _rehashSize &&
+ _tableSize < HashMapData::sizeSteps[HashMapData::sizeStepsSize - 1])
+ {
+ uint32_t newsize = getSize(_tableSize+1);
+ Entry ** newtable = new Entry*[newsize];
+ memset(newtable, 0, newsize * sizeof(Entry *));
+ for (uint32_t i = 0; i < _tableSize; i++) {
+ Entry *p = _table[i];
+ while (p != NULL) {
+ Entry *np = p->_next;
+ uint32_t newhash = hashValue(p->_key.key()) % newsize;
+ // prepend entry to new hash slot
+ p->_next = newtable[newhash];
+ newtable[newhash] = p;
+ p = np;
+ }
+ // chain moved to newTable
+ _table[i] = NULL;
+ }
+ delete[] _table;
+ _table = newtable;
+ _tableSize = newsize;
+ _rehashSize = (_tableSize * 3) / 5;
+ }
+
+ return ret;
+}
+
+
+template <typename T>
+bool
+HashMap<T>::isSet(const char *key) const
+{
+ return (lookup(key) != NULL);
+}
+
+
+template <typename T>
+const T &
+HashMap<T>::get(const char *key) const
+{
+ Entry *entry = lookup(key);
+ if (entry != NULL) {
+ return entry->_value;
+ } else {
+ return _empty;
+ }
+}
+
+
+template <typename T>
+T
+HashMap<T>::remove(const char *key)
+{
+ uint32_t bucket = hashValue(key) % _tableSize;
+ Entry **ptpt = &(_table[bucket]);
+ for (; (*ptpt) != NULL; ptpt = &((*ptpt)->_next))
+ if ((*ptpt)->_key == key)
+ break;
+ if ((*ptpt) == NULL) {
+ return _empty;
+ } else {
+ Entry *entry = (*ptpt);
+ T ret = entry->_value;
+ (*ptpt) = (*ptpt)->_next; // link out entry
+ delete entry;
+ _entryCnt--;
+ return ret;
+ }
+}
+
+
+template <typename T>
+const T &
+HashMap<T>::operator[](const char *key) const
+{
+ Entry *entry = lookup(key);
+ if (entry != NULL) {
+ return entry->_value;
+ } else {
+ return _empty;
+ }
+}
+
+
+template <typename T>
+typename HashMap<T>::Iterator
+HashMap<T>::iterator() const
+{
+ return Iterator(this);
+}
+
+
+template <typename T>
+uint32_t
+HashMap<T>::maxDepth() const
+{
+ uint32_t ret = 0;
+ uint32_t cnt = 0;
+ for (uint32_t i = 0; i < _tableSize; i++) {
+ uint32_t d = 0;
+ for (Entry *p = _table[i]; p != NULL; p = p->_next) {
+ ++d;
+ ++cnt;
+ }
+ if (d > ret) ret = d;
+ }
+ if (cnt != _entryCnt) abort();
+ return ret;
+}
+
+
+template <typename T>
+uint32_t
+HashMap<T>::emptyBuckets() const
+{
+ uint32_t ret = 0;
+ for (uint32_t i = 0; i < _tableSize; i++) {
+ if (_table[i] == NULL)
+ ++ret;
+ }
+ return ret;
+}
+
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/hashmapdata.h b/vespalib/src/vespa/vespalib/util/hashmapdata.h
new file mode 100644
index 00000000000..42110246be2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/hashmapdata.h
@@ -0,0 +1,17 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <inttypes.h>
+
+namespace vespalib {
+
+#ifndef IAM_DOXYGEN
+struct HashMapData
+{
+ static const uint32_t sizeStepsSize;
+ static uint32_t sizeSteps[];
+};
+#endif // #ifndef IAM_DOXYGEN
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/host_name.cpp b/vespalib/src/vespa/vespalib/util/host_name.cpp
new file mode 100644
index 00000000000..9db6d33364b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/host_name.cpp
@@ -0,0 +1,25 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "host_name.h"
+#include <vespa/vespalib/util/exceptions.h>
+#include <unistd.h>
+
+namespace vespalib {
+
+namespace {
+
+vespalib::string make_host_name() {
+ constexpr size_t max_size = 1024;
+ char hostname[max_size + 1];
+ memset(hostname, 0, sizeof(hostname));
+ if (gethostname(hostname, max_size) != 0) {
+ throw FatalException("gethostname failed");
+ }
+ return hostname;
+}
+
+} // namespace vespalib::<unnamed>
+
+const vespalib::string HostName::_host_name = make_host_name();
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/host_name.h b/vespalib/src/vespa/vespalib/util/host_name.h
new file mode 100644
index 00000000000..79eb0fc9641
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/host_name.h
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+/**
+ * Simple utility used to determine which host we are running on. The
+ * get function should return the fully qualified host name.
+ **/
+class HostName
+{
+private:
+ static const vespalib::string _host_name;
+public:
+ static const vespalib::string &get() { return _host_name; }
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/inline.h b/vespalib/src/vespa/vespalib/util/inline.h
new file mode 100644
index 00000000000..896487eea8c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/inline.h
@@ -0,0 +1,25 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#ifndef noinline__
+#ifdef __GNUC__
+#define noinline__ __attribute__((noinline))
+#endif
+#ifndef noinline__
+#define noinline__
+#endif
+#endif
+
+#ifndef always_inline__
+#ifdef __GNUC__
+/* if user specifies -O -fno-inline the compiler may get confused */
+#if !defined(__NO_INLINE__) && defined(__OPTIMIZE__)
+#define always_inline__ __attribute__((always_inline))
+#endif
+#endif
+#ifndef always_inline__
+#define always_inline__
+#endif
+#endif
+
diff --git a/vespalib/src/vespa/vespalib/util/joinable.cpp b/vespalib/src/vespa/vespalib/util/joinable.cpp
new file mode 100644
index 00000000000..118e4928800
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/joinable.cpp
@@ -0,0 +1,8 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "joinable.h"
+
+namespace vespalib {
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/joinable.h b/vespalib/src/vespa/vespalib/util/joinable.h
new file mode 100644
index 00000000000..a88424cb9f2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/joinable.h
@@ -0,0 +1,23 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+/**
+ * Concurrent activity that we can wait for a conclusion of.
+ **/
+struct Joinable {
+ /**
+ * Wait for the conclusion of this concurrent activity
+ **/
+ virtual void join() = 0;
+
+ /**
+ * Empty virtual destructor to enable subclassing.
+ **/
+ virtual ~Joinable() {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/left_right_heap.cpp b/vespalib/src/vespa/vespalib/util/left_right_heap.cpp
new file mode 100644
index 00000000000..d988f824e33
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/left_right_heap.cpp
@@ -0,0 +1,4 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "left_right_heap.h"
diff --git a/vespalib/src/vespa/vespalib/util/left_right_heap.h b/vespalib/src/vespa/vespalib/util/left_right_heap.h
new file mode 100644
index 00000000000..d2f11c4686b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/left_right_heap.h
@@ -0,0 +1,95 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+/**
+ * The LeftHeap is used to maintain a heap stored in the start (LEFT
+ * side) of an array. The input to push and the output from pop is the
+ * last element in the range defined by the parameters. This means
+ * that a LeftHeap grows and shrinks at its right side. To access the
+ * best (first) item in the heap before popping it, you need to use
+ * the front function, since the placement of the best item prior to
+ * popping it can vary with different implementations.
+ *
+ * A LeftHeap works the same way as the heap in the standard library
+ * with the exception of having the comparator inverted. This means
+ * that when you pop the heap, you will get the first element on the
+ * heap, not the last. This marks the death of heapsort and the
+ * resurrection of heap as a useful data structure.
+ **/
+struct LeftHeap {
+ static void require_left_heap() {} // for compile-time checks
+ template <typename T> static T &front(T *begin, T *) { return *begin; }
+ template <typename T, typename C> inline static void push(T *begin, T *end, C cmp);
+ template <typename T, typename C> inline static void pop(T *begin, T *end, C cmp);
+ template <typename T, typename C> inline static void adjust(T *begin, T *end, C cmp);
+};
+
+/**
+ * The RightHeap is used to maintain a heap stored in the end (RIGHT
+ * side) of an array. The input to push and the output from pop is the
+ * first element in the range defined by the parameters. This means
+ * that a RightHeap grows and shrinks at its left side. The RightHeap
+ * is generally harder to work with compared to the LeftHeap and is
+ * only useful when you want to put heaps in both sides of an
+ * array. This can be useful when there is a fixed number of elements
+ * that has different priority order based on some partitioning
+ * criteria that change over time.
+ **/
+struct RightHeap {
+ static void require_right_heap() {} // for compile-time checks
+ template <typename T> static T &front(T *, T *end) { return *(end - 1); }
+ template <typename T, typename C> inline static void push(T *begin, T *end, C cmp);
+ template <typename T, typename C> inline static void pop(T *begin, T *end, C cmp);
+ template <typename T, typename C> inline static void adjust(T *begin, T *end, C cmp);
+};
+
+/**
+ * A LeftArrayHeap is a sorted array that has the same interface as
+ * the LeftHeap. This alternative could give better performance with
+ * few elements.
+ **/
+struct LeftArrayHeap {
+ static void require_left_heap() {} // for compile-time checks
+ template <typename T> static T &front(T *, T *end) { return *(end - 1); }
+ template <typename T, typename C> inline static void push(T *begin, T *end, C cmp);
+ template <typename T, typename C> static void pop(T *, T *, C) {}
+ template <typename T, typename C> inline static void adjust(T *begin, T *end, C cmp) {
+ push(begin, end, cmp);
+ }
+};
+
+/**
+ * A RightArrayHeap is a sorted array that has the same interface as
+ * the RightHeap. This alternative could give better performance with
+ * few elements.
+ **/
+struct RightArrayHeap {
+ static void require_right_heap() {} // for compile-time checks
+ template <typename T> static T &front(T *begin, T *) { return *begin; }
+ template <typename T, typename C> inline static void push(T *begin, T *end, C cmp);
+ template <typename T, typename C> static void pop(T *, T *, C) {}
+ template <typename T, typename C> inline static void adjust(T *begin, T *end, C cmp) {
+ push(begin, end, cmp);
+ }
+};
+
+/**
+ * A LeftStdHeap adapts the heap implementation in the standard
+ * library to the LeftHeap interface by inverting the comparator and
+ * restricting the iterator types.
+ **/
+struct LeftStdHeap {
+ static void require_left_heap() {} // for compile-time checks
+ template <typename T> static T &front(T *begin, T *) { return *begin; }
+ template <typename T, typename C> inline static void push(T *begin, T *end, C cmp);
+ template <typename T, typename C> static void pop(T *begin, T *end, C cmp);
+ template <typename T, typename C> inline static void adjust(T *begin, T *end, C cmp);
+};
+
+} // namespace vespalib
+
+#include "left_right_heap.hpp"
+
diff --git a/vespalib/src/vespa/vespalib/util/left_right_heap.hpp b/vespalib/src/vespa/vespalib/util/left_right_heap.hpp
new file mode 100644
index 00000000000..d927815ca55
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/left_right_heap.hpp
@@ -0,0 +1,175 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <algorithm>
+
+namespace vespalib {
+
+namespace { // left/right heap operations (code duplicated since we use old gcc)
+
+template <typename T, typename C>
+void left_heap_insert(T *heap, size_t pos, T value, C cmp) {
+ size_t parent = (pos - 1) >> 1;
+ while (pos != 0 && cmp(value, *(heap + parent))) {
+ *(heap + pos) = std::move(*(heap + parent));
+ pos = parent;
+ parent = (parent - 1) >> 1;
+ }
+ *(heap + pos) = std::move(value);
+}
+
+template <typename T, typename C>
+void right_heap_insert(T *heap, size_t pos, T value, C cmp) {
+ size_t parent = (pos - 1) >> 1;
+ while (pos != 0 && cmp(value, *(heap - parent))) {
+ *(heap - pos) = std::move(*(heap - parent));
+ pos = parent;
+ parent = (parent - 1) >> 1;
+ }
+ *(heap - pos) = std::move(value);
+}
+
+template <typename T, typename C>
+void left_heap_adjust(T *heap, size_t len, T value, C cmp) {
+ size_t pos = 0;
+ size_t child2 = 2;
+ while (child2 < len) {
+ if (cmp(*(heap + child2 - 1), *(heap + child2))) {
+ --child2;
+ }
+ *(heap + pos) = std::move(*(heap + child2));
+ pos = child2;
+ child2 = (pos << 1) + 2;
+ }
+ if (child2 == len) {
+ *(heap + pos) = std::move(*(heap + child2 - 1));
+ pos = child2 - 1;
+ }
+ left_heap_insert<T,C>(heap, pos, std::move(value), cmp);
+}
+
+template <typename T, typename C>
+void right_heap_adjust(T *heap, size_t len, T value, C cmp) {
+ size_t pos = 0;
+ size_t child2 = 2;
+ while (child2 < len) {
+ if (cmp(*(heap - child2 + 1), *(heap - child2))) {
+ --child2;
+ }
+ *(heap - pos) = std::move(*(heap - child2));
+ pos = child2;
+ child2 = (pos << 1) + 2;
+ }
+ if (child2 == len) {
+ *(heap - pos) = std::move(*(heap - child2 + 1));
+ pos = child2 - 1;
+ }
+ right_heap_insert<T,C>(heap, pos, std::move(value), cmp);
+}
+
+template <typename T, typename C>
+void left_heap_remove(T *heap, size_t len, T value, C cmp) {
+ *(heap + len) = std::move(*heap);
+ left_heap_adjust<T,C>(heap, len, std::move(value), cmp);
+}
+
+template <typename T, typename C>
+void right_heap_remove(T *heap, size_t len, T value, C cmp) {
+ *(heap - len) = std::move(*heap);
+ right_heap_adjust<T,C>(heap, len, std::move(value), cmp);
+}
+
+} // namespace vespalib::<unnamed>
+
+//-----------------------------------------------------------------------------
+
+template <typename T, typename C>
+void LeftHeap::push(T *begin, T *end, C cmp) {
+ left_heap_insert<T,C>(begin, (end - begin - 1), std::move(*(end - 1)), cmp);
+}
+
+template <typename T, typename C>
+void LeftHeap::pop(T *begin, T *end, C cmp) {
+ left_heap_remove<T,C>(begin, (end - begin - 1), std::move(*(end - 1)), cmp);
+}
+
+template <typename T, typename C>
+void LeftHeap::adjust(T *begin, T *end, C cmp) {
+ left_heap_adjust<T,C>(begin, (end - begin), std::move(*begin), cmp);
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T, typename C>
+void RightHeap::push(T *begin, T *end, C cmp) {
+ right_heap_insert<T,C>((end - 1), (end - begin - 1), std::move(*begin), cmp);
+}
+
+template <typename T, typename C>
+void RightHeap::pop(T *begin, T *end, C cmp) {
+ right_heap_remove<T,C>((end - 1), (end - begin - 1), std::move(*begin), cmp);
+}
+
+template <typename T, typename C>
+void RightHeap::adjust(T *begin, T *end, C cmp) {
+ right_heap_adjust<T,C>((end - 1), (end - begin), std::move(*(end - 1)), cmp);
+}
+
+//-----------------------------------------------------------------------------
+
+namespace { // inverted comparator helper class
+
+template <typename T, typename C> struct InvCmp {
+ C cmp;
+ InvCmp(C c) : cmp(c) {}
+ bool operator()(const T &a, const T &b) const {
+ return cmp(b, a);
+ }
+};
+
+} // namespace vespalib::<unnamed>
+
+//-----------------------------------------------------------------------------
+
+template <typename T, typename C>
+void LeftArrayHeap::push(T *begin, T *end, C cmp) {
+ T value = std::move(*--end);
+ while ((begin != end) && cmp(*(end - 1), value)) {
+ *end = std::move(*(end - 1));
+ --end;
+ }
+ *end = std::move(value);
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T, typename C>
+void RightArrayHeap::push(T *begin, T *end, C cmp) {
+ T value = std::move(*begin++);
+ while ((begin != end) && cmp(*begin, value)) {
+ *(begin - 1) = std::move(*begin);
+ ++begin;
+ }
+ *(begin - 1) = std::move(value);
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T, typename C>
+void LeftStdHeap::push(T *begin, T *end, C cmp) {
+ std::push_heap(begin, end, InvCmp<T,C>(cmp));
+}
+
+template <typename T, typename C>
+void LeftStdHeap::pop(T *begin, T *end, C cmp) {
+ std::pop_heap(begin, end, InvCmp<T,C>(cmp));
+}
+
+template <typename T, typename C>
+void LeftStdHeap::adjust(T *begin, T *end, C cmp) {
+ std::pop_heap(begin, end, InvCmp<T,C>(cmp));
+ std::push_heap(begin, end, InvCmp<T,C>(cmp));
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/linkedptr.h b/vespalib/src/vespa/vespalib/util/linkedptr.h
new file mode 100644
index 00000000000..b78da9c2c92
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/linkedptr.h
@@ -0,0 +1,181 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2004 Overture Services Norway AS
+
+#pragma once
+
+#include <algorithm>
+#include <memory>
+#include <assert.h>
+
+namespace vespalib {
+
+/**
+ * @brief A LinkedPtr is a smart pointer implementing reference
+ * linking.
+ *
+ * Multiple instances share the ownership of an object by being linked
+ * together. This has the advantage of not needing external
+ * book-keeping. However, note that LinkedPtr may only be used to
+ * share objects within a thread, as there is no internal
+ * synchronization.
+ *
+ * If you need to share an object between threads, take a look at
+ * std::shared_ptr.
+ **/
+template <typename T>
+class LinkedPtr
+{
+private:
+
+ mutable const LinkedPtr *_prev;
+ mutable const LinkedPtr *_next;
+ T *_obj;
+
+ /**
+ * Unlink this pointer
+ **/
+ void unlink() {
+ if (_prev == this) {
+ delete _obj;
+ } else {
+ _prev->_next = _next;
+ _next->_prev = _prev;
+ }
+ }
+
+ /**
+ * Link this pointer
+ **/
+ void link(const LinkedPtr &rhs) {
+ if (rhs._obj != 0) {
+ _obj = rhs._obj;
+ _prev = &rhs;
+ _next = rhs._next;
+ rhs._next = this;
+ _next->_prev = this;
+ } else {
+ _obj = 0;
+ _next = this;
+ _prev = this;
+ }
+ }
+
+public:
+ /**
+ * @brief Create a LinkedPtr owning the given object
+ *
+ * @param obj the object, may be 0
+ **/
+ explicit LinkedPtr(T *obj = 0)
+ : _prev(this), _next(this), _obj(obj) {}
+
+ /**
+ * @brief Copy constructor
+ *
+ * Copying a LinkedPtr will result in a new LinkedPtr sharing the
+ * ownership of the object held by the original LinkedPtr.
+ *
+ * @param rhs copy this
+ **/
+ LinkedPtr(const LinkedPtr &rhs)
+ : _prev(this), _next(this), _obj(0)
+ {
+ link(rhs);
+ }
+
+ /**
+ * @brief Delete the pointed to object if we are the last
+ * LinkedPtr sharing ownership of it
+ **/
+ ~LinkedPtr() {
+ unlink();
+ }
+
+ /**
+ * @brief Assignment operator
+ *
+ * @return reference to this
+ * @param rhs copy this
+ **/
+ LinkedPtr &operator= (const LinkedPtr &rhs) {
+ if (_obj == rhs._obj) {
+ return *this;
+ }
+ unlink();
+ link(rhs);
+ return *this;
+ }
+
+ /**
+ * @brief Check if this LinkedPtr points to anything
+ *
+ * @return true if we point to something
+ **/
+ bool isSet() const { return (_obj != 0); }
+
+ /**
+ * @brief Obtain the object being pointed to
+ *
+ * @return the object (by pointer)
+ **/
+ T *get() const { return _obj; }
+
+ bool operator == (const LinkedPtr & rhs) const { return (_obj == rhs._obj) ||
+ ( (_obj != NULL) &&
+ (rhs._obj != NULL) &&
+ (*_obj == *rhs._obj)); }
+
+ /**
+ * @brief Access the object being pointed to
+ *
+ * This is the preferred way to access the object being pointed to
+ * as it makes the LinkedPtr look like a naked pointer.
+ *
+ * @return the object (by pointer)
+ **/
+ T *operator->() const { return get(); }
+
+ /**
+ * @brief Obtain the object being pointed to
+ *
+ * @return the object (by reference)
+ **/
+ T &operator*() const { return *get(); }
+
+ /**
+ * @brief Change this pointer
+ *
+ * This method makes this LinkedPtr drop its current pointer and
+ * point to something new. If we are the last owner of the old
+ * object, it is deleted. The new object will be owned by this
+ * LinkedPtr (just like when using the constructor).
+ *
+ * @param obj the object, may be 0
+ **/
+ void reset(T *obj = 0) {
+ unlink();
+ _obj = obj;
+ _next = this;
+ _prev = this;
+ }
+
+ /**
+ * @brief release the object pointed to
+ *
+ * This is an operation that can only be done when this is the only item
+ * in the list.
+ *
+ * @return the pointer to the owned object or NULL if it is not the only
+ * owner.
+ **/
+ T * release() {
+ T * obj(NULL);
+ if ((_next == _prev) && (_prev == this)) {
+ obj = _obj;
+ _obj = NULL;
+ }
+ return obj;
+ }
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/macro.h b/vespalib/src/vespa/vespalib/util/macro.h
new file mode 100644
index 00000000000..8afad90884b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/macro.h
@@ -0,0 +1,26 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2006 Yahoo
+
+#pragma once
+
+// indirectly tested by exception test.
+
+/**
+ * @def VESPA_STRINGIZE(str)
+ * @brief convert code to string
+ * @param str text that will be converted to a string
+ * @return the replacement text from expansion of this macro will be a "" quoted C string literal.
+ **/
+#define VESPA_STRINGIZE(str) #str
+
+/**
+ * @def VESPA_STRLOC
+ * @brief generate a string pointing to line in source code
+ *
+ * this macro can be used in detailed error messages that need
+ * information about where in the source code they were generated,
+ * typically in exceptions.
+ * @return a std::string containing the function, source file, and line number
+ **/
+#define VESPA_STRLOC vespalib::make_string("%s in %s:%d",__func__,__FILE__,__LINE__)
+
diff --git a/vespalib/src/vespa/vespalib/util/memory.h b/vespalib/src/vespa/vespalib/util/memory.h
new file mode 100644
index 00000000000..4fa83a6a5b6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/memory.h
@@ -0,0 +1,375 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2006 Yahoo
+
+#pragma once
+
+#include <memory>
+#include <string.h>
+#include <stdlib.h>
+
+/// Macro to give you number of elements in a defined array.
+#define VESPA_NELEMS(a) (sizeof(a)/sizeof(a[0]))
+
+namespace vespalib {
+
+/**
+ * @brief Helper class
+ *
+ * Helper to enable auto_arr instances as parameters and return values.
+ * You should not use this class directly.
+ **/
+template<class OtherArray> struct auto_arr_ref {
+ OtherArray* _array;
+ auto_arr_ref(OtherArray* a) : _array(a) {}
+};
+
+/**
+ * @brief std::unique_ptr for arrays
+ *
+ * This class behaves just like unique_ptr, but wraps a pointer allocated
+ * with new[]; so it will call delete[] when doing cleanup.
+ */
+template <class Array> class auto_arr {
+private:
+ Array* _array; // actual owned array (if any)
+
+public:
+ /**
+ * @brief constructor from pointer
+ *
+ * Note: the pointer must have been allocated with new[]
+ **/
+ explicit auto_arr(Array* a = 0) throw() : _array(a) {}
+
+ /**
+ * @brief "copy" contructor
+ *
+ * Note: non-const parameter; transfers ownership
+ * instead of copying.
+ **/
+ auto_arr(auto_arr& a) throw() : _array(a.release()) {}
+
+ /**
+ * @brief assignment operator
+ *
+ * Note: non-const parameter; transfers ownership
+ * instead of copying.
+ **/
+ auto_arr& operator=(auto_arr& a) throw() {
+ reset(a.release());
+ return *this;
+ }
+
+ /** @brief destructor, calls delete[] on owned pointer */
+ ~auto_arr() throw() { delete[] _array; }
+
+ /** @brief value access */
+ Array& operator [] (size_t i) const throw() { return _array[i]; }
+
+ /** @brief access underlying array */
+ Array* get() const throw() { return _array; }
+
+ /**
+ * @brief release ownership
+ *
+ * The caller of release() must take responsibility for eventually calling delete[].
+ * @return previously owned pointer
+ **/
+ Array* release() throw() {
+ Array* tmp = _array;
+ _array = 0;
+ return tmp;
+ }
+
+ /**
+ * @brief reset value
+ *
+ * Behaves like destruct then construct.
+ **/
+ void reset(Array* a = 0) throw() {
+ delete[] _array;
+ _array = a;
+ }
+
+ /**
+ * @brief special implicit conversion from auxiliary type
+ * to enable parameter / return value passing
+ **/
+ auto_arr(auto_arr_ref<Array> ref) throw()
+ : _array(ref._array) {}
+
+ /**
+ * @brief special assignment from auxiliary type
+ * to enable parameter / return value passing
+ **/
+ auto_arr& operator=(auto_arr_ref<Array> ref) throw() {
+ reset(ref._array);
+ return *this;
+ }
+
+ /**
+ * @brief special implicit conversion to auxiliary type
+ * to enable parameter / return value passing
+ **/
+ operator auto_arr_ref<Array>() throw() {
+ return auto_arr_ref<Array>(this->release());
+ }
+};
+
+/**
+ * @brief Keep ownership of memory allocated via malloc()
+ *
+ * A MallocAutoPtr does for c type alloced objects as std::unique_ptr does
+ * for newed objects. Allocate it, use it and forget about it. It is cleaned up.
+ * Follows std::unique_ptr semantics in most cases, but is less general.
+ */
+class MallocAutoPtr
+{
+public:
+ /**
+ * @brief constructor from pointer
+ *
+ * Note: the pointer must have been allocated with malloc()
+ **/
+ MallocAutoPtr(void *p=nullptr) : _p(p) { }
+
+ /** @brief destructor, calls free() on owned pointer */
+ ~MallocAutoPtr() { cleanup(); }
+
+ /**
+ * @brief "copy" contructor
+ *
+ * Note: non-const parameter; transfers ownership
+ * instead of copying.
+ **/
+ MallocAutoPtr(const MallocAutoPtr & rhs)
+ : _p(rhs._p) { const_cast<MallocAutoPtr &>(rhs)._p = nullptr; }
+
+ /**
+ * @brief assignment operator
+ *
+ * Note: non-const parameter; transfers ownership
+ * instead of copying.
+ **/
+ MallocAutoPtr & operator = (const MallocAutoPtr & rhs) {
+ if (this != &rhs) {
+ MallocAutoPtr tmp(rhs);
+ swap(tmp);
+ }
+ return *this;
+ }
+
+ /** @brief swap contents */
+ void swap(MallocAutoPtr & rhs) { std::swap(_p, rhs._p); }
+
+ /** @brief value access */
+ const void * get() const { return _p; }
+
+ /** @brief value access */
+ void * get() { return _p; }
+private:
+ void cleanup() {
+ if (_p) {
+ free(_p);
+ _p = nullptr;
+ }
+ }
+ void *_p;
+};
+
+/**
+ * @brief Container for data allocated with malloc().
+ *
+ * A MallocPtr is a container for data allocated by malloc,
+ * (the old fashioned way). You create any buffer of appropriate size.
+ * It does copy and assignement as you expect, copying data.
+ * And of course it cleans up after you.
+ */
+class MallocPtr
+{
+public:
+ /**
+ * @brief construct a containing for some bytes of data
+ *
+ * with default sz=0 you get an empty container
+ * @param sz the number of bytes to allocate
+ **/
+ MallocPtr(const size_t sz=0) : _sz(sz), _p(_sz ? malloc(sz) : nullptr) {
+ if (_p == nullptr) {
+ _sz = 0;
+ }
+ }
+ /** @brief destructor doing free() if needed */
+ ~MallocPtr() { cleanup(); }
+
+ MallocPtr(MallocPtr && rhs) :
+ _sz(rhs.size()), _p(rhs._p)
+ {
+ rhs._sz = 0;
+ rhs._p = nullptr;
+ }
+
+ /**
+ * @brief copy constructor
+ *
+ * Does deep copy of contents (using memcpy).
+ * @param rhs container to copy
+ **/
+ MallocPtr(const MallocPtr & rhs)
+ : _sz(rhs.size()), _p(_sz ? malloc(_sz) : nullptr)
+ {
+ if (_p == nullptr) {
+ _sz = 0;
+ }
+ if (_sz != 0) {
+ memcpy(_p, rhs.get(), _sz);
+ }
+ }
+
+ /**
+ * @brief copying assignment operator
+ *
+ * works like destruct + copy construct.
+ * @param rhs container to copy
+ **/
+ MallocPtr & operator = (const MallocPtr & rhs) {
+ if (this != &rhs) {
+ MallocPtr tmp(rhs);
+ swap(tmp);
+ }
+ return *this;
+ }
+ /**
+ * @brief swap contents with another container
+ *
+ * does not copy anything, just swaps pointers.
+ **/
+ void swap(MallocPtr & rhs) {
+ std::swap(_sz, rhs._sz); std::swap(_p, rhs._p);
+ }
+
+ /** @brief number of bytes contained */
+ size_t size() const { return _sz; }
+ /** @brief standard way of saying empty */
+ bool empty() const { return _sz==0; }
+
+ /** @brief value access, returns nullptr if empty */
+ const void * get() const { return _p; }
+ /** @brief value access, returns nullptr if empty */
+ void * get() { return _p; }
+
+ /** @brief access memory as a C string, returns nullptr if container empty */
+ const char * c_str() const { return static_cast<const char *>(_p); }
+ /** @brief access memory as a C string, returns nullptr if container empty */
+ char * str() { return static_cast<char *>(_p); }
+
+ /** @brief value access, returns nullptr if container empty */
+ operator const void * () const { return _p; }
+ /** @brief value access, returns nullptr if container empty */
+ operator void * () { return _p; }
+ const char & operator [] (size_t i) const { return c_str()[i]; }
+ char & operator [] (size_t i) { return str()[i]; }
+ void resize(size_t sz) { realloc(sz); }
+ void reset() { cleanup(); }
+ void * release() { void *p(_p); _p = 0; _sz = 0; return p; }
+
+ /** @brief resize */
+ void
+ realloc(size_t sz)
+ {
+ if (sz == 0) {
+ cleanup();
+ } else {
+ void *p = ::realloc(_p, sz);
+ if (p != nullptr) {
+ _p = p;
+ _sz = sz;
+ } else {
+ cleanup();
+ }
+ }
+ }
+private:
+ void cleanup() {
+ if (_p) {
+ free(_p);
+ _p = nullptr;
+ _sz = 0;
+ }
+ }
+ size_t _sz;
+ void *_p;
+};
+
+/**
+ * @brief Holder for polymorphic objects with copy and assignment.
+ *
+ * This is used when you want to store polymorphic objects where you only know
+ * that they are of a certain base class. The base class must have a virtual
+ * clone() that can do the copying on assignment and copy constructor.
+ */
+template <typename T>
+class CloneablePtr
+{
+public:
+ /** @brief construct (from pointer) */
+ CloneablePtr(T * p=nullptr) : _p(p) { }
+
+ /** @brief destructor doing delete on owned pointer */
+ ~CloneablePtr() { cleanup(); }
+
+ /** @brief copy constructor, does deep copy using clone() */
+ CloneablePtr(const CloneablePtr & rhs) : _p(nullptr) {
+ if (rhs._p) {
+ _p = static_cast<T *> (rhs._p->clone());
+ }
+ }
+
+ /** @brief assignment operator, does deep copy using clone() */
+ CloneablePtr & operator = (const CloneablePtr & rhs) {
+ if (this != &rhs) {
+ CloneablePtr tmp(rhs);
+ swap(tmp);
+ }
+ return *this;
+ }
+
+ /** @brief swap contents */
+ void swap(CloneablePtr & rhs) { std::swap(_p, rhs._p); }
+
+ /** @brief value access */
+ const T * get() const { return _p; }
+ /** @brief value access */
+ T * get() { return _p; }
+ /** @brief value access */
+ T * operator -> () { return _p; }
+ /** @brief value access */
+ const T * operator -> () const { return _p; }
+ /** @brief value access */
+ T & operator * () { return *_p; }
+ /** @brief value access */
+ const T & operator * () const { return *_p; }
+ explicit operator bool () const { return _p != nullptr; }
+ bool operator ! () const { return _p == nullptr; }
+ bool operator == (const CloneablePtr & b) const {
+ return ((_p == nullptr) && (b._p == nullptr)) ||
+ ((_p && b._p) && (*_p == *b._p) );
+ }
+
+ /** @brief reset with new contents; behaves like destruct + construct */
+ void reset(T * p=nullptr) { cleanup(); _p = p; }
+
+ /** @brief release owned pointer */
+ T * release() { T * p(_p); _p = nullptr; return p; }
+private:
+ void cleanup() {
+ if (_p) {
+ delete _p;
+ _p = nullptr;
+ }
+ }
+ T *_p;
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/noncopyable.hpp b/vespalib/src/vespa/vespalib/util/noncopyable.hpp
new file mode 100644
index 00000000000..2682d2eee12
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/noncopyable.hpp
@@ -0,0 +1,26 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+namespace vespalib {
+
+/**
+ * A convenience class that ensures classes inheriting this cannot be
+ * copied.
+ */
+namespace noncopyable_
+{
+ class noncopyable
+ {
+ protected:
+ noncopyable() {}
+ ~noncopyable() {}
+ private:
+ noncopyable(const noncopyable &);
+ const noncopyable & operator=(const noncopyable &);
+ };
+}
+
+typedef noncopyable_::noncopyable noncopyable;
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/optimized.h b/vespalib/src/vespa/vespalib/util/optimized.h
new file mode 100644
index 00000000000..60612fa96f1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/optimized.h
@@ -0,0 +1,94 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2003 Fast Search & Transfer ASA
+// Copyright (C) 2003 Overture Services Norway AS
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+
+namespace vespalib {
+
+/**
+ * @brief Optimized instructions class
+ *
+ * Here are fast handcoded assembly functions for doing some special
+ * low level functions that can be carried out very fast by special instructions.
+ * Currently only implemented for GCC on i386 and x86_64 platforms.
+ **/
+class Optimized
+{
+public:
+ static int msbIdx(uint32_t v);
+ static int msbIdx(uint64_t v);
+ static int lsbIdx(uint32_t v);
+ static int lsbIdx(uint64_t v);
+ static int popCount(uint32_t v) { return __builtin_popcount(v); }
+ static int popCount(uint64_t v) { return __builtin_popcountl(v); }
+};
+
+/**
+ * @fn int Optimized::msbIdx(uint32_t v)
+ * @brief Quickly find most significant bit.
+ *
+ * Finds the postion of the most significant '1'.
+ * @param v is the value to search
+ * @return index [0-31] of msb, 0 if none.
+ **/
+
+/**
+ * @fn int Optimized::msbIdx(uint64_t v)
+ * @brief Quickly find most significant bit.
+ *
+ * Finds the postion of the most significant '1'.
+ * @param v is the value to search
+ * @return index [0-63] of msb, 0 if none.
+ **/
+
+/**
+ * @fn int Optimized::lsbIdx(uint32_t v)
+ * @brief Quickly find least significant bit.
+ *
+ * Finds the postion of the least significant '1'.
+ * @param v is the value to search
+ * @return index [0-31] of lsb, 0 if none.
+ **/
+
+/**
+ * @fn int Optimized::lsbIdx(uint64_t v)
+ * @brief Quickly find least significant bit.
+ *
+ * Finds the postion of the least significant '1'.
+ * @param v is the value to search
+ * @return index [0-63] of lsb, 0 if none.
+ **/
+
+#ifdef __x86_64__
+inline int Optimized::msbIdx(uint32_t v) {
+ int32_t result;
+ __asm __volatile("bsrl %0,%0" : "=r" (result) : "0" (v));
+ return result;
+}
+inline int Optimized::lsbIdx(uint32_t v) {
+ int32_t result;
+ __asm __volatile("bsfl %0,%0" : "=r" (result) : "0" (v));
+ return result;
+}
+inline int Optimized::msbIdx(uint64_t v) {
+ int64_t result;
+ __asm __volatile("bsrq %0,%0" : "=r" (result) : "0" (v));
+ return result;
+}
+inline int Optimized::lsbIdx(uint64_t v) {
+ int64_t result;
+ __asm __volatile("bsfq %0,%0" : "=r" (result) : "0" (v));
+ return result;
+}
+#else
+inline int Optimized::msbIdx(uint32_t v) { return v ? 31 - __builtin_clz(v) : 0; }
+inline int Optimized::msbIdx(uint64_t v) { return v ? 63 - __builtin_clzl(v) : 0; }
+inline int Optimized::lsbIdx(uint32_t v) { return v ? 31 - __builtin_ctz(v) : 0; }
+inline int Optimized::lsbIdx(uint64_t v) { return v ? 63 - __builtin_ctzl(v) : 0; }
+#endif
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/overview.h b/vespalib/src/vespa/vespalib/util/overview.h
new file mode 100644
index 00000000000..89ca7edb931
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/overview.h
@@ -0,0 +1,84 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/*! \mainpage Vespalib - C++ utility library for Vespa components
+ *
+ * \section intro_sec Introduction
+ *
+ * vespalib is a collection of simple utility classes shared
+ * between most Vespa components that are written in C++.
+ * Most of these aren't Vespa specific in any way, except that
+ * they reflect the Vespa code standard and conventions.
+ *
+ * \section install_sec Installation
+ *
+ * install vespa_vespalib_dev
+ *
+ * \section overview_sec Overview
+ *
+ * Most of the classes in vespalib can be used by themselves,
+ * for a full list see the alphabetical class list.
+ * Here are the major groups of classes:
+ *
+ * Generation counter
+ *
+ * vespalib::GenCnt
+ *
+ * Synchronization classes
+ *
+ * vespalib::Lock
+ * <BR> vespalib::LockGuard
+ * <BR> vespalib::Monitor
+ * <BR> vespalib::TryLock
+ * <BR> vespalib::MonitorGuard
+ * <BR> vespalib::RWLock
+ * <BR> vespalib::RWLockReader
+ * <BR> vespalib::RWLockWriter
+ *
+ * Reference counting and atomic operations
+ *
+ * vespalib::Atomic
+ * <BR> vespalib::ReferenceCounter
+ *
+ * Simple smart pointers
+ *
+ * \ref vespalib::SharedPtr&lt;T&gt;
+ * <BR> \ref vespalib::LinkedPtr&lt;T&gt;
+ *
+ * Advanced pointer utilities
+ *
+ * \ref vespalib::PtrHolder&lt;T&gt;
+ * <BR> \ref vespalib::WeakRef&lt;T&gt;
+ *
+ * Simple hashmap
+ *
+ * \ref vespalib::HashMap&lt;T&gt;
+ *
+ * Scope guards for easier exception-safety
+ *
+ * vespalib::CounterGuard
+ * <BR> vespalib::DirPointer
+ * <BR> vespalib::FileDescriptor
+ * <BR> vespalib::FilePointer
+ * <BR> \ref vespalib::MaxValueGuard&lt;T&gt;
+ * <BR> \ref vespalib::ValueGuard&lt;T&gt;
+ *
+ * General utility macros
+ * <BR> \ref VESPA_STRLOC
+ * <BR> \ref VESPA_STRINGIZE(str)
+ *
+ * Standalone testing framework
+ *
+ * vespalib::TestApp
+ *
+ * Text handling
+ *
+ * vespalib::Utf8Reader
+ * <BR> vespalib::Utf8Writer
+ * <BR> vespalib::LowerCase
+ *
+ * Closures and closure handling
+ *
+ * vespalib::Closure0
+ * <BR> vespalib::MemberClosure0_0
+ * <BR> vespalib::ClosureTask
+ * <BR> vespalib::AutoClosureCaller
+ */
diff --git a/vespalib/src/vespa/vespalib/util/printable.cpp b/vespalib/src/vespa/vespalib/util/printable.cpp
new file mode 100644
index 00000000000..7a012c35468
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/printable.cpp
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/printable.h>
+#include <sstream>
+
+namespace vespalib {
+
+std::string Printable::toString(bool verbose, const std::string& indent) const
+{
+ std::ostringstream o;
+ print(o, verbose, indent);
+ return o.str();
+}
+
+vespalib::string
+AsciiPrintable::PrintProperties::indent(uint32_t extraLevels) const
+{
+ vespalib::asciistream as;
+ as << _indent;
+ for (uint32_t i=0; i<extraLevels; ++i) {
+ as << " ";
+ }
+ return as.str();
+}
+
+void
+AsciiPrintable::print(std::ostream& out, bool verbose,
+ const std::string& indent) const
+{
+ vespalib::asciistream as;
+ print(as, PrintProperties(verbose ? VERBOSE : NORMAL, indent));
+ out << as.str();
+}
+
+vespalib::string
+AsciiPrintable::toString(const PrintProperties& p) const
+{
+ vespalib::asciistream as;
+ print(as, p);
+ return as.str();
+}
+
+} // vespalib
diff --git a/vespalib/src/vespa/vespalib/util/printable.h b/vespalib/src/vespa/vespalib/util/printable.h
new file mode 100644
index 00000000000..cb1e299994c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/printable.h
@@ -0,0 +1,137 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * \class vespalib::Printable
+ * \ingroup util
+ *
+ * \brief Utility class for printing of class instances.
+ *
+ * By implementing this class, you can implement only the print function to get:
+ * - A toString() implementation.
+ * - An operator<< implementation.
+ * - Indentation support to simplify printing objects recursively.
+ *
+ * A verbose flag is also given. Non-verbose mode is used by default, but for
+ * debugging use it may be helpful to look at more detailed state of objects.
+ *
+ * \class vespalib::AsciiPrintable
+ * \ingroup util
+ *
+ * \brief Similar utility as Printable, but for vespalib string/stream.
+ *
+ * Sadly, std::string may have performance issues in some contexts, as it does
+ * some synchronization to allow sharing content, and requires heap allocation.
+ * std::iostream also have issues causing it to require some synchronization.
+ *
+ * The AsciiPrintable class implements similar functionality as Printable,
+ * using the vespalib classes on top of the STL functionality. Using this class
+ * instead, toString() and operator<< can be more efficient, while it is still
+ * backward compatible with STL variants.
+ */
+
+#pragma once
+
+#include <string>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <iostream>
+
+namespace vespalib
+{
+
+class Printable {
+public:
+ virtual ~Printable() {}
+
+ /**
+ * Print instance textual to the given stream.
+ *
+ * This function is expected to NOT add a newline after the last line
+ * printed.
+ *
+ * You should be properly indented before calling this function. The indent
+ * variable tells you what you need to add after each newline to get
+ * indented as far as your first line was. Thus, single line output don't
+ * need to worry about indentation.
+ *
+ * A typical multiline print would thus be something like this:
+ * <pre>
+ * out << "MyClass() {\n"
+ * << "\n" << indent << " some info"
+ * << "\n" << indent << "}";
+ * </pre>
+ *
+ * By not adding whitespace in either end of the output, we give maximum
+ * freedom for nesting output. For instance, if I wanted to create output of
+ * class OtherClass that inherited MyClass and I wanted it to contain all
+ * the information I could write OtherClass output like this:
+ * <pre>
+ * out << "OtherClass() : ";
+ * MyClass::print(out, verbose, indent + " ");
+ * out << "\n" << indent << {\n"
+ * << "\n" << indent << " some more info"
+ * << "\n" << indent << "}";
+ * </pre>
+ *
+ * @param out The stream to print itself to.
+ * @param verbose Whether to print detailed information or not. For instance
+ * a list might print it's size and properties if not verbose
+ * and print each singel element too if verbose. Default for
+ * toString() and output operators is false.
+ * @param indent This indentation should be printed AFTER each newline
+ * printed. (Not before output in first line)
+ */
+ virtual void print(std::ostream& out,
+ bool verbose = false,
+ const std::string& indent = "") const = 0;
+
+ /** Utility functions to get print() output as a string. */
+ std::string toString(bool verbose = false,
+ const std::string& indent = "") const;
+
+};
+
+class AsciiPrintable : public Printable {
+public:
+ virtual ~AsciiPrintable() {}
+
+ enum PrintMode {
+ NORMAL,
+ VERBOSE
+ };
+
+ class PrintProperties {
+ PrintMode _mode;
+ vespalib::string _indent;
+
+ public:
+ PrintProperties(PrintMode mode = NORMAL, stringref indent_ = "")
+ : _mode(mode), _indent(indent_) {}
+
+ PrintProperties indentedCopy() const
+ { return PrintProperties(_mode, _indent + " "); }
+ bool verbose() const { return (_mode == VERBOSE); }
+ const vespalib::string& indent() const { return _indent; }
+ vespalib::string indent(uint32_t extraLevels) const;
+ };
+
+ virtual void print(std::ostream& out, bool verbose,
+ const std::string& indent) const;
+
+ virtual void print(vespalib::asciistream&,
+ const PrintProperties& = PrintProperties()) const = 0;
+
+ vespalib::string toString(const PrintProperties& = PrintProperties()) const;
+};
+
+inline std::ostream& operator<<(std::ostream& out, const Printable& p) {
+ p.print(out);
+ return out;
+}
+
+inline vespalib::asciistream& operator<<(vespalib::asciistream& out,
+ const AsciiPrintable& p)
+{
+ p.print(out);
+ return out;
+}
+
+} // vespalib
diff --git a/vespalib/src/vespa/vespalib/util/priority_queue.cpp b/vespalib/src/vespa/vespalib/util/priority_queue.cpp
new file mode 100644
index 00000000000..14d502b6fc1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/priority_queue.cpp
@@ -0,0 +1,11 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "priority_queue.h"
+
+namespace vespalib {
+
+template class PriorityQueue<int>;
+template class PriorityQueue<int, std::greater<int> >;
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/priority_queue.h b/vespalib/src/vespa/vespalib/util/priority_queue.h
new file mode 100644
index 00000000000..32f80cfa4c4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/priority_queue.h
@@ -0,0 +1,60 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vector>
+#include <algorithm>
+#include "left_right_heap.h"
+
+namespace vespalib {
+
+/**
+ * A priority queue that orders its elements according to the less
+ * operator by default. The front element may be modified in place. If
+ * the front element is modified, the adjust function must be called
+ * afterward to restore priority order. The priority ordering can be
+ * specified with a second template parameter. The any and pop_any
+ * functions can be used to access and remove the element that is
+ * cheapest to remove. Note that if you change the any element, you
+ * must pop it afterward. Alternative heap implementations can be
+ * specified with a third template parameter. Only left heaps are
+ * supported. Please refer to the left-right heap benchmarks to figure
+ * out what implementation fits your case best.
+ **/
+template <typename T, typename C = std::less<T>, typename H = LeftHeap>
+class PriorityQueue
+{
+private:
+ C _cmp;
+ std::vector<T> _data;
+
+public:
+ PriorityQueue() : _cmp(), _data() { H::require_left_heap(); }
+ PriorityQueue(C cmp) : _cmp(cmp), _data() { H::require_left_heap(); }
+ bool empty() const { return _data.empty(); }
+ size_t size() const { return _data.size(); }
+ void push(const T &item) {
+ _data.push_back(item);
+ H::template push<T, C>(&_data[0], &_data[size()], _cmp);
+ }
+ void push(T &&item) {
+ _data.push_back(std::move(item));
+ H::template push<T, C>(&_data[0], &_data[size()], _cmp);
+ }
+ T &front() {
+ return H::template front<T>(&_data[0], &_data[size()]);
+ }
+ void adjust() {
+ H::template adjust<T,C>(&_data[0], &_data[size()], _cmp);
+ }
+ void pop_front() {
+ H::template pop<T, C>(&_data[0], &_data[size()], _cmp);
+ _data.pop_back();
+ }
+ T &any() { return _data.back(); }
+ void pop_any() { _data.pop_back(); }
+ void reserve(size_t sz) { _data.reserve(sz); }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/ptrholder.h b/vespalib/src/vespa/vespalib/util/ptrholder.h
new file mode 100644
index 00000000000..4b5848ce163
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/ptrholder.h
@@ -0,0 +1,129 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2004 Overture Services Norway AS
+
+#pragma once
+
+#include <algorithm>
+#include <memory>
+#include <vespa/vespalib/util/sync.h>
+#include <vespa/vespalib/util/atomic.h>
+
+namespace vespalib {
+
+/**
+ * @brief A PtrHolder tracks a shared resource that can change
+ *
+ * A PtrHolder is typically a semi-global object where different
+ * threads can obtain a std::shared_ptr to the current object representing a
+ * shared resource that can change over time. The PtrHolder class is
+ * especially useful when updates to the shared resource comes at
+ * unexpected times. The reason for this is that a PtrHolder contains
+ * two pointers; the current one and the new one. Updating the pointer
+ * to the new version of the shared resource and actually making that
+ * version the current version are two separate operations. This
+ * enables you to latch in new versions when it fits best or even
+ * ignore new versions all together. This class was originally
+ * designed to keep track of config objects.
+ **/
+template <typename T>
+class PtrHolder
+{
+private:
+ std::shared_ptr<T> _current;
+ std::shared_ptr<T> _next;
+ mutable Lock _lock;
+
+ PtrHolder(const PtrHolder &);
+ PtrHolder &operator=(const PtrHolder &);
+public:
+ /**
+ * @brief Create an empty PtrHolder with both current and new
+ * pointers set to 0
+ **/
+ PtrHolder() : _current(), _next(), _lock("PtrHolder", false) {}
+
+ /**
+ * @brief Empty destructor
+ *
+ * std::shared_ptr instances are used internally to track shared
+ * resources
+ **/
+ virtual ~PtrHolder() {}
+
+ /**
+ * @brief Check if the current value is set (not 0)
+ *
+ * @return true if the current value is set (not 0)
+ **/
+ bool hasValue() const { return (_current.get() != nullptr); }
+
+ /**
+ * @brief Check if the new value is set (not 0)
+ *
+ * @return true if the new value is set (not 0)
+ **/
+ bool hasNewValue() const { return (_next.get() != nullptr); }
+
+ /**
+ * @brief Set a new value
+ *
+ * Note that if no current value is set, this method will set the
+ * current value instead of the new one.
+ *
+ * @param obj the new value
+ **/
+ void set(T *obj) {
+ std::shared_ptr<T> tmp;
+ {
+ LockGuard guard(_lock);
+ swap(tmp, _next);
+ _next.reset(obj);
+ if (!hasValue()) {
+ swap(_current, _next);
+ }
+ }
+ }
+
+ /**
+ * @brief Obtain the current value
+ *
+ * @return the current value
+ **/
+ std::shared_ptr<T> get() const {
+ LockGuard guard(_lock);
+ return std::shared_ptr<T>(_current);
+ }
+
+ /**
+ * @brief Make the new value the current one
+ *
+ * @return false if there was no new value
+ **/
+ bool latch() {
+ std::shared_ptr<T> tmp;
+ {
+ LockGuard guard(_lock);
+ if (!hasNewValue()) {
+ return false;
+ }
+ swap(tmp, _current);
+ swap(_current, _next);
+ }
+ return true;
+ }
+
+ /**
+ * @brief Discard both the current and the new value
+ **/
+ void clear() {
+ std::shared_ptr<T> tmp1;
+ std::shared_ptr<T> tmp2;
+ {
+ LockGuard guard(_lock);
+ swap(tmp1, _current);
+ swap(tmp2, _next);
+ }
+ }
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/random.cpp b/vespalib/src/vespa/vespalib/util/random.cpp
new file mode 100644
index 00000000000..64f55c98371
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/random.cpp
@@ -0,0 +1,113 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "random.h"
+
+namespace vespalib {
+
+namespace {
+
+ enum { ZIGNOR_C = 128 };
+
+ const double ZIGNOR_R = 3.442619855899; /* start of the right tail */
+
+ /* (R * phi(R) + Pr(X>=R)) * sqrt(2\pi) */
+ const double ZIGNOR_V = 9.91256303526217e-3;
+
+ /* s_adZigX holds coordinates, such that each rectangle has*/
+ /* same area; s_adZigR holds s_adZigX[i + 1] / s_adZigX[i] */
+
+ double s_adZigX[ZIGNOR_C + 1];
+ double s_adZigR[ZIGNOR_C];
+
+ bool _G_needInit = true;
+}
+
+RandomGen::RandomGen() :
+ _state(0)
+{
+ unsigned long seed = getpid();
+ seed ^= time(0);
+ char hn[32];
+ memset(hn, 0, sizeof(hn));
+ gethostname(hn, 32);
+ unsigned long hnl;
+ memcpy(&hnl, hn, sizeof(hnl));
+ seed ^= hnl;
+ memcpy(&hnl, hn+4, sizeof(hnl));
+ seed ^= hnl;
+ memcpy(&hnl, hn+8, sizeof(hnl));
+ seed ^= hnl;
+
+ setSeed(seed);
+}
+
+
+/*
+Below code taken from
+http://www.doornik.com/research/ziggurat.pdf
+*/
+
+double
+RandomGen::DRanNormalTail(double dMin, int iNegative)
+{
+ double x, y;
+ do {
+ x = log(nextDouble()) / dMin;
+ y = log(nextDouble());
+ } while (-2 * y < x * x);
+
+ return iNegative ? x - dMin : dMin - x;
+}
+
+void
+RandomGen::zigNorInit(int iC, double dR, double dV)
+{
+ double f(exp(-0.5 * dR * dR));
+ s_adZigX[0] = dV / f; /* [0] is bottom block: V / f(R) */
+ s_adZigX[1] = dR;
+ for (int i = 2; i < iC; ++i) {
+ s_adZigX[i] = sqrt(-2 * log(dV / s_adZigX[i - 1] + f));
+ f = exp(-0.5 * s_adZigX[i] * s_adZigX[i]);
+ }
+ s_adZigX[iC] = 0.0;
+ for (int i = 0; i < iC; ++i) {
+ s_adZigR[i] = s_adZigX[i + 1] / s_adZigX[i];
+ }
+}
+
+double
+RandomGen::DRanNormalZig()
+{
+ for (;;) {
+ double u = 2 * nextDouble() - 1;
+ unsigned int i = nextInt32() & 0x7F;
+ /* first try the rectangular boxes */
+ if (fabs(u) < s_adZigR[i])
+ return u * s_adZigX[i];
+ /* bottom box: sample from the tail */
+ if (i == 0)
+ return DRanNormalTail(ZIGNOR_R, u < 0);
+ /* is this a sample from the wedges? */
+ double x = u * s_adZigX[i];
+ double f0 = exp(-0.5 * (s_adZigX[i] * s_adZigX[i] - x * x) );
+ double f1 = exp(-0.5 * (s_adZigX[i+1] * s_adZigX[i+1] - x * x) );
+
+ if (f1 + nextDouble() * (f0 - f1) < 1.0) {
+ return x;
+ }
+ }
+}
+
+double
+RandomGen::nextNormal()
+{
+ if (_G_needInit) {
+ zigNorInit(ZIGNOR_C, ZIGNOR_R, ZIGNOR_V);
+ _G_needInit = false;
+ }
+ return DRanNormalZig();
+}
+
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/random.h b/vespalib/src/vespa/vespalib/util/random.h
new file mode 100644
index 00000000000..411d0033c7c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/random.h
@@ -0,0 +1,139 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <vespa/fastos/types.h>
+#include <vector>
+#include <sys/types.h>
+#include <unistd.h>
+#include <time.h>
+#include <math.h>
+
+namespace vespalib {
+
+/**
+ * @brief Random number generator. Compatible with java.util.Random
+ **/
+class RandomGen {
+private:
+ uint64_t _state;
+
+ /**
+ * step the random generator once
+ **/
+ void iterate(void) {
+ _state = (UINT64_C(0x5DEECE66D) * _state + 0xb) &
+ UINT64_C(0xFFFFFFFFFFFF);
+ }
+
+ /**
+ * @brief return an integer with 1 to 32 random bits
+ *
+ * The general contract of next is that it returns an int value
+ * and if the argument bits is between 1 and 32 (inclusive), then
+ * that many low-order bits of the returned value will be
+ * (approximately) independently chosen bit values, each of which
+ * is (approximately) equally likely to be 0 or 1.
+ *
+ * This is a linear congruential pseudorandom number generator, as
+ * defined by D. H. Lehmer and described by Donald E. Knuth in The
+ * Art of Computer Programming, Volume 2: Seminumerical
+ * Algorithms, section 3.2.1.
+ *
+ * @param bits - random bits
+ *
+ * @return the next pseudorandom value from this random number
+ * generator's sequence.
+ **/
+
+ int next(int bits) {
+ iterate();
+ return _state >> (48 - bits);
+ }
+
+ void zigNorInit(int iC, double dR, double dV);
+
+ double DRanNormalTail(double dMin, int iNegative);
+ double DRanNormalZig();
+
+public:
+
+ /**
+ * @brief construct a random number generator with a given seed
+ **/
+ RandomGen(int64_t seed) : _state(0) { setSeed(seed); }
+
+ /**
+ * @brief construct a random number generator with an auto-generated seed
+ **/
+ RandomGen();
+
+ /**
+ * @brief reset the seed
+ **/
+ void setSeed(int64_t seed) {
+ _state = (seed ^ UINT64_C(0x5DEECE66D)) & ((1L << 48) -1);
+ };
+
+ /**
+ * @brief Return next random 32-bit signed integer
+ **/
+ int32_t nextInt32(void) {
+ iterate();
+ return (_state >> 16);
+ }
+
+ /**
+ * @brief Returns the next pseudorandom, uniformly distributed
+ * double value between 0.0 and 1.0 from this random number
+ * generator's sequence.
+ *
+ * The general contract of nextDouble is that one double value,
+ * chosen (approximately) uniformly from the range 0.0
+ * (inclusive) to 1.0 (exclusive), is pseudorandomly generated
+ * and returned. All 2^53 possible float values of the form
+ * m * 2^-53 , where m is a positive integer less than 2^53, are
+ * produced with (approximately) equal probability.
+ *
+ * @return a double number in range [0.0, 1.0>
+ **/
+ double nextDouble() {
+ uint64_t l = next(26);
+ l <<= 27;
+ l += next(27);
+ double d = l;
+ d /= (1LL << 53);
+ return d;
+ }
+
+ /**
+ * @brief Return next random 32-bit unsigned integer
+ **/
+ uint32_t nextUint32() {
+ return (uint32_t)nextInt32();
+ }
+
+ /**
+ * @brief Returns the next random number in the range [from..to]
+ **/
+ uint32_t nextUint32(uint32_t from, uint32_t to) {
+ return from + nextUint32() % (to - from + 1);
+ }
+
+ /**
+ * @brief Return next random 64-bit unsigned integer
+ **/
+ uint64_t nextUint64() {
+ return ((uint64_t)next(32) << 32) + next(32);
+ }
+
+ double nextNormal();
+ double nextNormal(double mean, double stddev) {
+ return mean + stddev * nextNormal();
+ }
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/referencecounter.h b/vespalib/src/vespa/vespalib/util/referencecounter.h
new file mode 100644
index 00000000000..6d9f4ed0d56
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/referencecounter.h
@@ -0,0 +1,63 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @file referencecounter.h
+ * @author Thomas F. Gundersen
+ * @version $Id$
+ * @date 2004-03-19
+ **/
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/atomic.h>
+
+namespace vespalib
+{
+
+/**
+ * @brief Inherit this class to create a self-destroying class.
+ *
+ * Allows for objects to be shared without worrying about who "owns"
+ * the object. When a new owner is given the object, addRef() should
+ * be called. When finished with the object, subRef() should be
+ * called. When the last owner calls subRef(), the object is deleted.
+*/
+class ReferenceCounter
+{
+public:
+ /**
+ * @brief Constructor. The object will initially have 1 reference.
+ **/
+ ReferenceCounter() : _refs(1) {};
+
+ /**
+ * @brief Add an owner of this object.
+ *
+ * When the owner is finished with the
+ * object, call subRef().
+ **/
+ void addRef() { vespalib::Atomic::postInc(&_refs); };
+
+ /**
+ * @brief Remove an owner of this object.
+ *
+ * If that was the last owner, delete the object.
+ **/
+ void subRef() {
+ unsigned oldVal = vespalib::Atomic::postDec(&_refs);
+ if (oldVal == 1) {
+ delete this;
+ }
+ }
+ unsigned refCount() const { return _refs; }
+protected:
+ /**
+ * @brief Destructor. Does sanity check only.
+ **/
+ virtual ~ReferenceCounter() { assert (_refs == 0); };
+private:
+ volatile unsigned _refs;
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/regexp.cpp b/vespalib/src/vespa/vespalib/util/regexp.cpp
new file mode 100644
index 00000000000..894ca496b25
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/regexp.cpp
@@ -0,0 +1,152 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <sys/types.h>
+#include <regex.h>
+#include <vespa/vespalib/util/regexp.h>
+#include <vespa/vespalib/util/stringfmt.h>
+
+#include <vespa/vespalib/util/exceptions.h>
+
+namespace vespalib {
+
+Regexp::Flags::Flags() :
+ _flags(RE_SYNTAX_POSIX_EXTENDED)
+{ }
+
+Regexp::Flags &
+Regexp::Flags::enableICASE()
+{
+ _flags |= RE_ICASE;
+ return *this;
+}
+
+void
+Regexp::compile(const vespalib::stringref & re, Flags flags)
+{
+ re_set_syntax(flags.flags());
+ regex_t *preg = (regex_t *)_data;
+ preg->translate = NULL;
+ preg->fastmap = static_cast<char *>(malloc(256));
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ const char * error = re_compile_pattern(re.c_str(), re.size(), preg);
+ if (error != 0) {
+ vespalib::string msg = make_string("invalid regexp '%s': %s", re.c_str(), error);
+ free(preg->fastmap);
+ delete preg;
+ throw IllegalArgumentException(msg);
+ }
+ if (re_compile_fastmap(preg) != 0) {
+ throw IllegalArgumentException("re_compile_fastmap failed");
+ }
+}
+
+
+Regexp::Regexp(const vespalib::stringref & re, Flags flags)
+ : _data(new regex_t)
+{
+ compile(re, flags);
+}
+
+bool
+Regexp::match(const vespalib::stringref & s) const
+{
+ regex_t *preg = const_cast<regex_t *>(static_cast<const regex_t *>(_data));
+ int pos(re_search(preg, s.c_str(), s.size(), 0, s.size(), NULL));
+ if (pos < -1) {
+ throw IllegalArgumentException(make_string("re_search failed with code(%d)", pos));
+ }
+ return pos >= 0;
+}
+
+vespalib::string Regexp::replace(const vespalib::stringref & s, const vespalib::stringref & replacement) const
+{
+ regex_t *preg = const_cast<regex_t *>(static_cast<const regex_t *>(_data));
+ vespalib::string modified;
+ int prev(0);
+ for(int pos(re_search(preg, s.c_str(), s.size(), 0, s.size(), NULL));
+ pos >=0;
+ pos = re_search(preg, s.c_str()+prev, s.size()-prev, 0, s.size()-prev, NULL))
+ {
+ modified += s.substr(prev, pos);
+ modified += replacement;
+ int count = re_match(preg, s.c_str()+prev, s.size()-prev, pos, NULL);
+ prev += pos + count;
+ }
+ modified += s.substr(prev);
+ return modified;
+}
+
+Regexp::~Regexp()
+{
+ regex_t *preg = static_cast<regex_t *>(_data);
+ regfree(preg);
+ //free(preg->buffer);
+ delete preg;
+}
+
+namespace {
+
+bool has_option(const vespalib::stringref & re) {
+ return (re.find('|') != re.npos);
+}
+
+bool maybe_none(char c) {
+ return ((c == '{') ||
+ (c == '*') ||
+ (c == '?'));
+}
+
+const vespalib::string special("^|()[]{}.*?+\\$");
+bool is_special(char c) { return special.find(c) != special.npos; }
+
+vespalib::string escape(const vespalib::stringref &str) {
+ vespalib::string result;
+ for (char c: str) {
+ if (is_special(c)) {
+ result.push_back('\\');
+ }
+ result.push_back(c);
+ }
+ return result;
+}
+
+} // namespace vespalib::<unnamed>
+
+vespalib::string
+Regexp::get_prefix(const vespalib::stringref & re)
+{
+ vespalib::string prefix;
+ if ((re.size() > 0) && (re.data()[0] == '^') && !has_option(re)) {
+ const char *end = re.data() + re.size();
+ const char *pos = re.data() + 1;
+ for (; (pos < end) && !is_special(*pos); ++pos) {
+ prefix.push_back(*pos);
+ }
+ if ((pos < end) && maybe_none(*pos) && !prefix.empty()) {
+ prefix.resize(prefix.size() - 1); // pop_back
+ }
+ }
+ return prefix;
+}
+
+vespalib::string
+Regexp::make_from_prefix(const vespalib::stringref &prefix)
+{
+ return "^" + escape(prefix);
+}
+
+vespalib::string
+Regexp::make_from_suffix(const vespalib::stringref &suffix)
+{
+ return escape(suffix) + "$";
+}
+
+vespalib::string
+Regexp::make_from_substring(const vespalib::stringref &substring)
+{
+ return escape(substring);
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/regexp.h b/vespalib/src/vespa/vespalib/util/regexp.h
new file mode 100644
index 00000000000..66c389895da
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/regexp.h
@@ -0,0 +1,101 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/noncopyable.hpp>
+
+namespace vespalib {
+
+/**
+ * Utility class for simple regular expression matching.
+ * This class wraps the C library implementation of
+ * the posix regex API, for simple and easy usage.
+ * Note: also minimizes namespace pollution, you don't
+ * need to include <regex.h> when using class.
+ **/
+class Regexp : public noncopyable
+{
+public:
+ class Flags {
+ public:
+ /**
+ * By default enable posix extended regex.
+ **/
+ Flags();
+ /**
+ * Enable case insentive search.
+ **/
+ Flags & enableICASE();
+ /**
+ * Return the decoded set of flags for the implementation.
+ **/
+ unsigned long flags() const { return _flags; }
+ private:
+ unsigned long _flags;
+ };
+ /**
+ * Construct from a Posix Extended regular expression.
+ * @throw IllegalArgumentException if the RE is invalid.
+ * @param re Regular expression.
+ **/
+ Regexp(const vespalib::stringref & re, Flags=Flags());
+
+ ~Regexp();
+
+ /**
+ * Check if the given string is matched by this regexp.
+ * @param s text to search for a match.
+ * @return true if a match was found.
+ **/
+ bool match(const vespalib::stringref & s) const;
+
+ /**
+ * Will replace all occurrences of this pattern is string 's' with 'replacement'.
+ * @param s text to search for mathes.
+ * @param replacement text to replace the pattern.
+ * @return modified string.
+ **/
+ vespalib::string replace(const vespalib::stringref & s, const vespalib::stringref & replacement) const;
+
+ /**
+ * Look at the given regular expression and identify the prefix
+ * that must be present for a string to match it. Note that an
+ * un-anchored expression will have an empty prefix. Also note
+ * that this function is simple and might underestimate the actual
+ * size of the prefix.
+ *
+ * @param re Regular expression.
+ * @return prefix that must be present in matching strings
+ **/
+ static vespalib::string get_prefix(const vespalib::stringref & re);
+
+ /**
+ * Make a regexp matching strings with the given prefix.
+ *
+ * @param prefix the prefix
+ * @return the regexp
+ **/
+ static vespalib::string make_from_prefix(const vespalib::stringref &prefix);
+
+ /**
+ * Make a regexp matching strings with the given suffix.
+ *
+ * @param suffix the suffix
+ * @return the regexp
+ **/
+ static vespalib::string make_from_suffix(const vespalib::stringref &suffix);
+
+ /**
+ * Make a regexp matching strings with the given substring.
+ *
+ * @param substring the substring
+ * @return the regexp
+ **/
+ static vespalib::string make_from_substring(const vespalib::stringref &substring);
+
+private:
+ void *_data;
+ void compile(const vespalib::stringref & re, Flags flags);
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/rendezvous.h b/vespalib/src/vespa/vespalib/util/rendezvous.h
new file mode 100644
index 00000000000..981b6960e1a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/rendezvous.h
@@ -0,0 +1,89 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "sync.h"
+#include <vector>
+
+namespace vespalib {
+
+/**
+ * A place where threads meet up and exchange information. Each
+ * participating thread calls the rendezvous function with an input
+ * value. Execution will be blocked until enough threads are present,
+ * at which point mingle will be called with input and output values
+ * for all threads available at the same time. When mingle completes,
+ * each thread resumes and returns the output value assigned to
+ * it. This class implements all needed thread synchronization. The
+ * subclass needs to implement the mingle function to supply the
+ * application logic.
+ **/
+template <typename IN, typename OUT>
+class Rendezvous
+{
+private:
+ Monitor _monitor;
+ size_t _size;
+ size_t _next;
+ size_t _gen;
+ std::vector<const IN *> _in;
+ std::vector<OUT *> _out;
+
+ /**
+ * Function called to perform the actual inter-thread state
+ * processing.
+ **/
+ virtual void mingle() = 0;
+
+protected:
+ /**
+ * Obtain the number of input and output values to be handled by
+ * mingle. This function is called by mingle.
+ *
+ * @return number of input and output values
+ **/
+ size_t size() const { return _size; }
+
+ /**
+ * Obtain an input parameter. This function is called by mingle.
+ *
+ * @return const reference to the appropriate input
+ * @param i the index of the requested input [0 .. size-1]
+ **/
+ const IN &in(size_t i) const { return *_in[i]; }
+
+ /**
+ * Obtain the storage location of an output parameter. This
+ * function is called by mingle.
+ *
+ * @return reference to the appropriate output
+ * @param i the index of the requested output [0 .. size-1]
+ **/
+ OUT &out(size_t i) { return *_out[i]; }
+
+public:
+ /**
+ * Create a Rendezvous with the given size. The size defines the
+ * number of threads that need to call the rendezvous function to
+ * trigger a mingle operation. The size of a Rendezvous must be at
+ * least 1.
+ *
+ * @param n the size of this Rendezvous
+ **/
+ Rendezvous(size_t n);
+ virtual ~Rendezvous() {}
+
+ /**
+ * Called by individual threads to synchronize execution and share
+ * state with the mingle function.
+ *
+ * @return output parameter for a single thread
+ * @param input input parameter for a single thread
+ **/
+ OUT rendezvous(const IN &input);
+};
+
+} // namespace vespalib
+
+#include "rendezvous.hpp"
+
diff --git a/vespalib/src/vespa/vespalib/util/rendezvous.hpp b/vespalib/src/vespa/vespalib/util/rendezvous.hpp
new file mode 100644
index 00000000000..f4562b5c3b7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/rendezvous.hpp
@@ -0,0 +1,50 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "exceptions.h"
+
+namespace vespalib {
+
+template <typename IN, typename OUT>
+Rendezvous<IN, OUT>::Rendezvous(size_t n)
+ : _monitor(),
+ _size(n),
+ _next(0),
+ _gen(0),
+ _in(n, 0),
+ _out(n, 0)
+{
+ if (n == 0) {
+ throw IllegalArgumentException("size must be greater than 0");
+ }
+}
+
+template <typename IN, typename OUT>
+OUT
+Rendezvous<IN, OUT>::rendezvous(const IN &input)
+{
+ OUT ret = OUT();
+ if (_size == 1) {
+ _in[0] = &input;
+ _out[0] = &ret;
+ mingle();
+ } else {
+ MonitorGuard guard(_monitor);
+ size_t me = _next++;
+ _in[me] = &input;
+ _out[me] = &ret;
+ if (_next == _size) {
+ mingle();
+ _next = 0;
+ ++_gen;
+ guard.broadcast();
+ } else {
+ size_t oldgen = _gen;
+ while (oldgen == _gen) {
+ guard.wait();
+ }
+ }
+ }
+ return ret;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/runnable.cpp b/vespalib/src/vespa/vespalib/util/runnable.cpp
new file mode 100644
index 00000000000..d21e2a76d34
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/runnable.cpp
@@ -0,0 +1,8 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "runnable.h"
+
+namespace vespalib {
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/runnable.h b/vespalib/src/vespa/vespalib/util/runnable.h
new file mode 100644
index 00000000000..8941679f7b7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/runnable.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <memory>
+
+namespace vespalib {
+
+/**
+ * Interface implemented in order to be run by a Thread.
+ **/
+struct Runnable {
+ typedef std::unique_ptr<Runnable> UP;
+
+ /**
+ * Entry point called by the running thread
+ **/
+ virtual void run() = 0;
+
+ /**
+ * Empty virtual destructor to enable subclassing.
+ **/
+ virtual ~Runnable() {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/runnable_pair.cpp b/vespalib/src/vespa/vespalib/util/runnable_pair.cpp
new file mode 100644
index 00000000000..7449e54d29c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/runnable_pair.cpp
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "runnable_pair.h"
+
+namespace vespalib {
+
+RunnablePair::RunnablePair(Runnable &first, Runnable &second)
+ : _first(first),
+ _second(second)
+{
+}
+
+void
+RunnablePair::run()
+{
+ _first.run();
+ _second.run();
+}
+
+} // namespace vesaplib
diff --git a/vespalib/src/vespa/vespalib/util/runnable_pair.h b/vespalib/src/vespa/vespalib/util/runnable_pair.h
new file mode 100644
index 00000000000..620a4d92f34
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/runnable_pair.h
@@ -0,0 +1,24 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "runnable.h"
+
+namespace vespalib {
+
+/**
+ * Simple utility running two runnables in order.
+ **/
+class RunnablePair : public Runnable
+{
+private:
+ Runnable &_first;
+ Runnable &_second;
+
+public:
+ RunnablePair(Runnable &first, Runnable &second);
+ virtual void run();
+};
+
+} // namespace vesaplib
+
diff --git a/vespalib/src/vespa/vespalib/util/rwlock.cpp b/vespalib/src/vespa/vespalib/util/rwlock.cpp
new file mode 100644
index 00000000000..f678089dcb5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/rwlock.cpp
@@ -0,0 +1,43 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/rwlock.h>
+
+namespace vespalib {
+
+void RWLock::lockRead() {
+ MonitorGuard guard(_monitor);
+ CounterGuard waitCnt(_waitingReaders);
+ while (_givenLocks == -1 || _waitingWriters > 0) {
+ guard.wait();
+ }
+ ++_givenLocks;
+}
+
+void RWLock::unlockRead() {
+ MonitorGuard guard(_monitor);
+ assert(_givenLocks > 0);
+ if (--_givenLocks == 0 && _waitingWriters > 0) {
+ guard.broadcast();
+ }
+}
+
+void RWLock::lockWrite() {
+ MonitorGuard guard(_monitor);
+ CounterGuard waitCnt(_waitingWriters);
+ while (_givenLocks != 0) {
+ guard.wait();
+ }
+ _givenLocks = -1;
+}
+
+void RWLock::unlockWrite() {
+ MonitorGuard guard(_monitor);
+ assert(_givenLocks == -1);
+ _givenLocks = 0;
+ if (_waitingReaders > 0 || _waitingWriters > 0) {
+ guard.broadcast();
+ }
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/rwlock.h b/vespalib/src/vespa/vespalib/util/rwlock.h
new file mode 100644
index 00000000000..eb3189586e7
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/rwlock.h
@@ -0,0 +1,252 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2006 Yahoo
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/sync.h>
+#include <vespa/vespalib/util/guard.h>
+
+class RWLockTest;
+
+namespace vespalib {
+
+/**
+ * @brief An RWLock is a reader/writer lock. It can either be held by
+ * any number of readers or a single writer at any time.
+ *
+ * The RWLockReader and RWLockWriter classes are used to acquire and
+ * release reader and writer locks respectively.
+ *
+ * Writer locks have priority above reader locks to prevent
+ * starvation.
+ **/
+class RWLock
+{
+private:
+ friend class ::RWLockTest;
+ friend class RWLockReader;
+ friend class RWLockWriter;
+
+ int _givenLocks;
+ int _waitingReaders;
+ int _waitingWriters;
+ Monitor _monitor;
+
+ void lockRead();
+ void unlockRead();
+ void lockWrite();
+ void unlockWrite();
+public:
+ /**
+ * @brief Create a new RWLock
+ **/
+ RWLock()
+ : _givenLocks(0),
+ _waitingReaders(0),
+ _waitingWriters(0),
+ _monitor() {}
+ /**
+ * @brief Create a new RWLock, ignoring the right hand side.
+ *
+ * It makes no sense to copy the state of an RWLock, but we want
+ * to allow copying objects that contain RWLock objects.
+ *
+ * @param rhs ignore this
+ **/
+ RWLock(const RWLock &rhs)
+ : _givenLocks(0),
+ _waitingReaders(0),
+ _waitingWriters(0),
+ _monitor() { (void) rhs;}
+ /**
+ * @brief Assignment operator ignoring the right hand side.
+ *
+ * It makes no sense to assign the state of one RWLock to another,
+ * but we want to allow assigning objects that contain RWLock
+ * objects.
+ *
+ * @param rhs ignore this
+ **/
+ RWLock &operator=(const RWLock &rhs) {
+ (void) rhs;
+ return *this;
+ }
+
+ /**
+ * To get an instance of RWLockReader or RWLockWriter that isn't
+ * associated with a specific RWLock at initialization, you may
+ * construct them from this tag type.
+ **/
+ struct InitiallyUnlockedGuard {};
+};
+
+#ifndef IAM_DOXYGEN
+class RWLockReaderHandover
+{
+private:
+ friend class RWLockReader;
+ RWLock *_lock;
+ RWLockReaderHandover(const RWLockReaderHandover &);
+ RWLockReaderHandover &operator=(const RWLockReaderHandover &);
+ RWLockReaderHandover(RWLock *m) : _lock(m) {}
+public:
+};
+
+class RWLockWriterHandover
+{
+private:
+ friend class RWLockWriter;
+ RWLock *_lock;
+ RWLockWriterHandover(const RWLockWriterHandover &);
+ RWLockWriterHandover &operator=(const RWLockWriterHandover &);
+ RWLockWriterHandover(RWLock *m) : _lock(m) {}
+public:
+};
+#endif
+
+
+/**
+ * @brief An RWLockReader holds a reader lock on an RWLock.
+ *
+ * The lock is acquired in the constructor and released in the
+ * destructor.
+ *
+ * RWLockReader has destructive copy (like unique_ptr). Assigning from
+ * or copying a RWLockReader has the semantic of transferring the lock
+ * from one object to the other. Note that assigning from or copying
+ * a RWLockReader that does not have a lock will result in an assert.
+ **/
+class RWLockReader
+{
+private:
+ RWLock * _lock;
+ RWLock * stealLock() {
+ RWLock * ret(_lock);
+ assert(ret != NULL);
+ _lock = NULL;
+ return ret;
+ }
+ void cleanup() { if (_lock != NULL) { _lock->unlockRead(); } }
+public:
+
+ /**
+ * @brief Obtain reader lock.
+ *
+ * This will block until a reader lock can be acquired.
+ *
+ * @param lock the underlying RWLock object
+ **/
+ RWLockReader(RWLock &lock) : _lock(&lock) { _lock->lockRead(); }
+
+ /**
+ * @brief Construct initially unlocked guard.
+ * @param tag (unused) marker argument
+ **/
+ RWLockReader(const RWLock::InitiallyUnlockedGuard &tag) : _lock(NULL) { (void)tag; }
+
+ /**
+ * @brief Steal the lock from the given RWLockReader
+ *
+ * @param rhs steal the lock from this one
+ **/
+ RWLockReader(RWLockReader &rhs) : _lock(rhs.stealLock()) {}
+
+ /**
+ * @brief Steal the lock from the given RWLockReader
+ *
+ * @param rhs steal the lock from this one
+ **/
+ RWLockReader &operator=(RWLockReader & rhs) {
+ if (this != & rhs) {
+ cleanup();
+ _lock = rhs.stealLock();
+ }
+ return *this;
+ }
+
+ /**
+ * @brief Release the lock obtained in the constructor
+ **/
+ ~RWLockReader() { cleanup(); }
+
+#ifndef IAM_DOXYGEN
+ RWLockReader(const RWLockReaderHandover &rhs) : _lock(rhs._lock) {}
+ operator RWLockReaderHandover() { return RWLockReaderHandover(stealLock()); }
+#endif
+};
+
+
+/**
+ * @brief An RWLockWriter holds a writer lock on an RWLock.
+ *
+ * The lock is acquired in the constructor and released in the
+ * destructor.
+ *
+ * RWLockWriter has destructive copy (like unique_ptr). Assigning from
+ * or copying a RWLockWriter has the semantic of transferring the lock
+ * from one object to the other, and assignment is similar. Note that
+ * assigning from or copying a RWLockWriter that does not have a lock
+ * will result in an assert.
+ **/
+class RWLockWriter
+{
+private:
+ RWLock * _lock;
+ RWLock * stealLock() {
+ RWLock * ret(_lock);
+ assert(ret != NULL);
+ _lock = NULL;
+ return ret;
+ }
+ void cleanup() { if (_lock != NULL) { _lock->unlockWrite(); } }
+public:
+
+ /**
+ * @brief Obtain writer lock.
+ *
+ * This will block until a writer lock can be acquired.
+ *
+ * @param lock the underlying RWLock object
+ **/
+ RWLockWriter(RWLock &lock) : _lock(&lock) { _lock->lockWrite(); }
+
+ /**
+ * @brief Construct initially unlocked guard.
+ * @param tag (unused) marker argument
+ **/
+ RWLockWriter(const RWLock::InitiallyUnlockedGuard &tag) : _lock(NULL) { (void)tag; }
+
+ /**
+ * @brief Steal the lock from the given RWLockWriter
+ *
+ * @param rhs steal the lock from this one
+ **/
+ RWLockWriter(RWLockWriter &rhs) : _lock(rhs.stealLock()) {}
+
+ /**
+ * @brief Steal the lock from the given RWLockWriter
+ *
+ * @param rhs steal the lock from this one
+ **/
+ RWLockWriter &operator=(RWLockWriter & rhs) {
+ if (this != & rhs) {
+ cleanup();
+ _lock = rhs.stealLock();
+ }
+ return *this;
+ }
+
+ /**
+ * @brief Release the lock obtained in the constructor
+ **/
+ ~RWLockWriter() { cleanup(); }
+
+#ifndef IAM_DOXYGEN
+ RWLockWriter(const RWLockWriterHandover &rhs) : _lock(rhs._lock) {}
+ operator RWLockWriterHandover() { return RWLockWriterHandover(stealLock()); }
+#endif
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/sequence.cpp b/vespalib/src/vespa/vespalib/util/sequence.cpp
new file mode 100644
index 00000000000..c424f1a6a9b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/sequence.cpp
@@ -0,0 +1,4 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "sequence.h"
diff --git a/vespalib/src/vespa/vespalib/util/sequence.h b/vespalib/src/vespa/vespalib/util/sequence.h
new file mode 100644
index 00000000000..7429ec28b23
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/sequence.h
@@ -0,0 +1,25 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+#include <memory>
+
+namespace vespalib {
+
+/**
+ * abstract interface for an iterable sequence.
+ **/
+template <typename T>
+struct Sequence
+{
+ typedef std::unique_ptr<Sequence> UP;
+
+ virtual bool valid() const = 0;
+ virtual T get() const = 0;
+ virtual void next() = 0;
+ virtual ~Sequence() {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/sha1.cpp b/vespalib/src/vespa/vespalib/util/sha1.cpp
new file mode 100644
index 00000000000..710a2052a41
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/sha1.cpp
@@ -0,0 +1,153 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "sha1.h"
+
+/* #define LITEND * This should be #define'd if true. */
+#define LITEND
+
+#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
+
+/* blk0() and blk() perform the initial expand. */
+/* I got the idea of expanding during the round function from SSLeay */
+#ifdef LITEND
+#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
+ |(rol(block->l[i],8)&0x00FF00FF))
+#else
+#define blk0(i) block->l[i]
+#endif
+#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
+ ^block->l[(i+2)&15]^block->l[i&15],1))
+
+/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
+#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
+#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
+#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
+
+namespace vespalib {
+
+void
+Sha1::transform()
+{
+ uint32_t a, b, c, d, e;
+ typedef union {
+ uint8_t c[64];
+ uint32_t l[16];
+ } CHAR64LONG16;
+ CHAR64LONG16 *block = reinterpret_cast<CHAR64LONG16 *>(_buffer);
+ /* Copy context->state[] to working vars */
+ a = _state[0];
+ b = _state[1];
+ c = _state[2];
+ d = _state[3];
+ e = _state[4];
+ /* 4 rounds of 20 operations each. Loop unrolled. */
+ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
+ R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
+ R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
+ R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
+ R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
+ R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
+ R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
+ R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
+ R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
+ R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
+ R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
+ R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
+ R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
+ R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
+ R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
+ R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
+ R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
+ R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
+ R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
+ R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
+ /* Add the working vars back into context.state[] */
+ _state[0] += a;
+ _state[1] += b;
+ _state[2] += c;
+ _state[3] += d;
+ _state[4] += e;
+ /* Wipe variables */
+ a = b = c = d = e = 0;
+}
+
+Sha1::Sha1()
+{
+ reset();
+}
+
+void
+Sha1::reset()
+{
+ /* SHA1 initialization constants */
+ _state[0] = 0x67452301;
+ _state[1] = 0xEFCDAB89;
+ _state[2] = 0x98BADCFE;
+ _state[3] = 0x10325476;
+ _state[4] = 0xC3D2E1F0;
+ _count[0] = _count[1] = 0;
+}
+
+void
+Sha1::process(const char *data, size_t len)
+{
+ uint32_t i, j;
+ j = (_count[0] >> 3) & 63;
+ if ((_count[0] += len << 3) < (len << 3)) _count[1]++;
+ _count[1] += (len >> 29);
+ if ((j + len) > 63) {
+ memcpy(&_buffer[j], data, (i = 64-j));
+ transform();
+ for ( ; i + 63 < len; i += 64) {
+ memcpy(_buffer, &data[i], 64);
+ transform();
+ }
+ j = 0;
+ }
+ else i = 0;
+ memcpy(&_buffer[j], &data[i], len - i);
+}
+
+void
+Sha1::get_digest(char *digest, size_t digestLen)
+{
+ uint32_t i, j;
+ uint8_t finalcount[8];
+
+ for (i = 0; i < 8; i++) {
+ finalcount[i] =
+ static_cast<uint8_t>((_count[(i >= 4 ? 0 : 1)]
+ >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
+ }
+ process("\200", 1);
+ while ((_count[0] & 504) != 448) {
+ process("\0", 1);
+ }
+ process(reinterpret_cast<char *>(finalcount), 8); /* Should cause a Transform() */
+ if (digestLen > 20)
+ digestLen = 20;
+ for (i = 0; i < digestLen; i++) {
+ digest[i] = static_cast<char>
+ ((_state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
+ }
+ /* Wipe variables */
+ i = j = 0;
+ memset(_buffer, 0, 64);
+ memset(_state, 0, 20);
+ memset(_count, 0, 8);
+ memset(&finalcount, 0, 8);
+}
+
+void
+Sha1::hash(const char *input, size_t inputLen,
+ char *digest, size_t digestLen)
+{
+ Sha1 sha;
+ sha.process(input, inputLen);
+ sha.get_digest(digest, digestLen);
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/sha1.h b/vespalib/src/vespa/vespalib/util/sha1.h
new file mode 100644
index 00000000000..4a32f783b22
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/sha1.h
@@ -0,0 +1,71 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+/**
+ * SHA-1 in C
+ * By Steve Reid <steve@edmweb.com>
+ * 100% Public Domain
+ *
+ * To generate a digest for a message contained
+ * in memory, simply use the static hash function. For incremental
+ * digest generation, you need an instance of this class. If the
+ * object has been used before, invoke reset to begin generating a new
+ * digest. Then invoke process multiple times to process the
+ * input. After all input has been given to the process function, use
+ * the get_digest function to calculate the final digest.
+ **/
+class Sha1
+{
+private:
+ uint32_t _state[5];
+ uint32_t _count[2];
+ uint8_t _buffer[64];
+
+ /**
+ * Use the 64 bytes (512 bits) stored in _buffer to update
+ * _state. This operation will garble the contents of buffer.
+ **/
+ void transform();
+
+public:
+ Sha1();
+
+ /**
+ * Start generating a new digest.
+ **/
+ void reset();
+
+ /**
+ * Process input data.
+ *
+ * @param data input data
+ * @param len input data len
+ **/
+ void process(const char *data, size_t len);
+
+ /**
+ * Calculate final digest. By adjusting the digestLen parameter
+ * this function may be instructed to only return a prefix of the
+ * SHA-1 digest.
+ *
+ * @param digest where to put the digest
+ * @param digestLen how much digest we want (max 20)
+ **/
+ void get_digest(char *digest, size_t digestLen = 20);
+
+ /**
+ * Calculate the SHA-1 digest prefix based on the given input buffer.
+ *
+ * @param buf input buffer
+ * @param bufLen length of input buffer in bytes
+ * @param digest where to put the digest prefix
+ * @param digestLen the length of the wanted digest prefix (max 20)
+ **/
+ static void hash(const char *buf, size_t bufLen,
+ char *digest, size_t digestLen);
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/signalhandler.cpp b/vespalib/src/vespa/vespalib/util/signalhandler.cpp
new file mode 100644
index 00000000000..31732bcafda
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/signalhandler.cpp
@@ -0,0 +1,121 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "signalhandler.h"
+
+namespace vespalib {
+
+std::vector<SignalHandler*> SignalHandler::_handlers;
+
+namespace {
+
+class Shutdown
+{
+public:
+ ~Shutdown(void)
+ {
+ SignalHandler::shutdown();
+ }
+};
+
+}
+
+// Clear SignalHandler::_handlers in a slightly less unsafe manner.
+Shutdown shutdown;
+
+SignalHandler SignalHandler::HUP(SIGHUP);
+SignalHandler SignalHandler::INT(SIGINT);
+SignalHandler SignalHandler::TERM(SIGTERM);
+SignalHandler SignalHandler::PIPE(SIGPIPE);
+SignalHandler SignalHandler::SEGV(SIGSEGV);
+SignalHandler SignalHandler::ABRT(SIGABRT);
+SignalHandler SignalHandler::BUS(SIGBUS);
+SignalHandler SignalHandler::ILL(SIGILL);
+SignalHandler SignalHandler::TRAP(SIGTRAP);
+SignalHandler SignalHandler::FPE(SIGFPE);
+SignalHandler SignalHandler::QUIT(SIGQUIT);
+SignalHandler SignalHandler::USR1(SIGUSR1);
+
+void
+SignalHandler::handleSignal(int signal)
+{
+ if ((((size_t)signal) < _handlers.size()) && (_handlers[signal] != 0)) {
+ _handlers[signal]->gotSignal();
+ }
+}
+
+void
+SignalHandler::gotSignal()
+{
+ _gotSignal = 1;
+}
+
+SignalHandler::SignalHandler(int signal)
+ : _signal(signal),
+ _gotSignal(0)
+{
+ assert(signal >= 0);
+ while (_handlers.size() < ((size_t)(signal + 1))) {
+ _handlers.push_back(0);
+ }
+ assert(_handlers[signal] == 0);
+ _handlers[signal] = this;
+}
+
+void
+SignalHandler::hook()
+{
+ struct sigaction act;
+ act.sa_handler = handleSignal;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(_signal, &act, NULL);
+}
+
+void
+SignalHandler::ignore()
+{
+ struct sigaction act;
+ act.sa_handler = SIG_IGN;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(_signal, &act, NULL);
+}
+
+bool
+SignalHandler::check() const
+{
+ return (_gotSignal != 0);
+}
+
+void
+SignalHandler::clear()
+{
+ _gotSignal = 0;
+}
+
+void
+SignalHandler::unhook()
+{
+ struct sigaction act;
+ act.sa_handler = SIG_DFL;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(_signal, &act, NULL);
+}
+
+
+void
+SignalHandler::shutdown(void)
+{
+ for (std::vector<SignalHandler*>::iterator
+ it = _handlers.begin(), ite = _handlers.end();
+ it != ite;
+ ++it) {
+ if (*it != NULL)
+ (*it)->unhook();
+ }
+ std::vector<SignalHandler *>().swap(_handlers);
+}
+
+} // vespalib
diff --git a/vespalib/src/vespa/vespalib/util/signalhandler.h b/vespalib/src/vespa/vespalib/util/signalhandler.h
new file mode 100644
index 00000000000..493da65f464
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/signalhandler.h
@@ -0,0 +1,111 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include <vector>
+
+namespace vespalib {
+
+/**
+ * @brief This class helps you perform simple signal handling.
+ *
+ * A normal application will typically want to ignore SIGPIPE and
+ * perform a (clean) exit on SIGINT/SIGTERM. Caught signals are
+ * handled by setting a flag indicating that the signal has been
+ * caught. The application itself is responsible for checking which
+ * signals have been caught. Different signals are handled by
+ * combining a single signal dispatch function with a pattern similar
+ * to type-safe enums. All available signal handlers are created
+ * during static initialization at program startup.
+ **/
+class SignalHandler
+{
+private:
+ /**
+ * Data structure keeping track of all registered signal handlers.
+ **/
+ static std::vector<SignalHandler*> _handlers;
+
+ /**
+ * The signal handled by this signal handler.
+ **/
+ int _signal;
+
+ /**
+ * State indicating if the signal handled by this signal handler
+ * has been caught.
+ **/
+ volatile sig_atomic_t _gotSignal;
+
+ /**
+ * Common signal handler for all caught signals. This method will
+ * dispatch the signal to the appropriate static signal handler
+ * instance.
+ *
+ * @param signal the caught signal
+ **/
+ static void handleSignal(int signal);
+
+ /**
+ * This method is invoked by the common signal handling method to
+ * dispatch the signal to the right static signal handler
+ * instance.
+ **/
+ void gotSignal();
+
+ /**
+ * Create a signal handler for the given signal. This method is
+ * private as all signal handlers should be created during
+ * initialization.
+ **/
+ SignalHandler(int signal);
+ SignalHandler(const SignalHandler &); // not defined
+ SignalHandler &operator=(const SignalHandler &); // not defined
+
+public:
+ static SignalHandler HUP;
+ static SignalHandler INT;
+ static SignalHandler TERM;
+ static SignalHandler PIPE;
+ static SignalHandler SEGV;
+ static SignalHandler ABRT;
+ static SignalHandler BUS;
+ static SignalHandler ILL;
+ static SignalHandler TRAP;
+ static SignalHandler FPE;
+ static SignalHandler QUIT;
+ static SignalHandler USR1;
+
+ /**
+ * Start catching this signal
+ **/
+ void hook();
+
+ /**
+ * Ignore this signal
+ **/
+ void ignore();
+
+ /**
+ * Check if this signal has been caught
+ *
+ * @return true if this signal has been caught
+ **/
+ bool check() const;
+
+ /**
+ * Clear the state indicating if this signal has been caught
+ **/
+ void clear();
+
+ /**
+ * Stop catching this signal
+ **/
+ void unhook();
+
+ static void
+ shutdown(void);
+};
+
+} // vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp
new file mode 100644
index 00000000000..7ff84217b7e
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp
@@ -0,0 +1,168 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "simple_thread_bundle.h"
+#include "exceptions.h"
+
+using namespace vespalib::fixed_thread_bundle;
+
+namespace vespalib {
+
+namespace {
+
+struct SignalHook : Runnable {
+ Signal &signal;
+ SignalHook(Signal &s) : signal(s) {}
+ virtual void run() { signal.send(); }
+};
+
+struct BroadcastHook : Runnable {
+ Signal &signal;
+ BroadcastHook(Signal &s) : signal(s) {}
+ virtual void run() { signal.broadcast(); }
+};
+
+struct PartHook : Runnable {
+ Part part;
+ PartHook(const Part &p) : part(p) {}
+ virtual void run() { part.perform(); }
+};
+
+struct HookPair : Runnable {
+ Runnable::UP first;
+ Runnable::UP second;
+ HookPair(Runnable::UP f, Runnable::UP s) : first(std::move(f)), second(std::move(s)) {}
+ virtual void run() {
+ first->run();
+ second->run();
+ }
+};
+
+Runnable::UP wrap(Runnable *runnable) {
+ return Runnable::UP(runnable);
+}
+
+Runnable::UP chain(Runnable::UP first, Runnable::UP second) {
+ return Runnable::UP(new HookPair(std::move(first), std::move(second)));
+}
+
+} // namespace vespalib::<unnamed>
+
+//-----------------------------------------------------------------------------
+
+SimpleThreadBundle::Pool::Pool(size_t bundleSize)
+ : _lock(),
+ _bundleSize(bundleSize),
+ _bundles()
+{
+}
+
+SimpleThreadBundle::Pool::~Pool()
+{
+ while (!_bundles.empty()) {
+ delete _bundles.back();
+ _bundles.pop_back();
+ }
+}
+
+SimpleThreadBundle::UP
+SimpleThreadBundle::Pool::obtain()
+{
+ {
+ LockGuard guard(_lock);
+ if (!_bundles.empty()) {
+ SimpleThreadBundle::UP ret(_bundles.back());
+ _bundles.pop_back();
+ return ret;
+ }
+ }
+ return SimpleThreadBundle::UP(new SimpleThreadBundle(_bundleSize));
+}
+
+void
+SimpleThreadBundle::Pool::release(SimpleThreadBundle::UP bundle)
+{
+ LockGuard guard(_lock);
+ _bundles.push_back(bundle.get());
+ bundle.release();
+}
+
+//-----------------------------------------------------------------------------
+
+SimpleThreadBundle::SimpleThreadBundle(size_t size_in, Strategy strategy)
+ : _work(),
+ _signals(),
+ _workers(),
+ _hook()
+{
+ if (size_in == 0) {
+ throw IllegalArgumentException("size must be greater than 0");
+ }
+ if (strategy == USE_BROADCAST) {
+ _signals.resize(1); // share single signal
+ } else {
+ _signals.resize(size_in - 1); // separate signal per worker
+ }
+ size_t next_unwired = 1;
+ for (size_t i = 0; i < size_in; ++i) {
+ Runnable::UP hook(new PartHook(Part(_work, i)));
+ if (strategy == USE_SIGNAL_TREE) {
+ for (size_t child = 0; child < 2 && next_unwired < size_in; ++child, ++next_unwired) {
+ hook = chain(wrap(new SignalHook(_signals[next_unwired - 1])), std::move(hook));
+ }
+ } else if (i == 0) { // first thread should wake others
+ if (strategy == USE_BROADCAST) {
+ hook = chain(wrap(new BroadcastHook(_signals[0])), std::move(hook));
+ } else {
+ assert(strategy == USE_SIGNAL_LIST);
+ for (; next_unwired < size_in; ++next_unwired) {
+ hook = chain(wrap(new SignalHook(_signals[next_unwired - 1])), std::move(hook));
+ }
+ }
+ }
+ if (i == 0) {
+ _hook = std::move(hook);
+ } else {
+ size_t signal_idx = (strategy == USE_BROADCAST) ? 0 : (i - 1);
+ _workers.push_back(Worker::LP(new Worker(_signals[signal_idx], std::move(hook))));
+ }
+ }
+}
+
+SimpleThreadBundle::~SimpleThreadBundle()
+{
+ for (size_t i = 0; i < _signals.size(); ++i) {
+ _signals[i].cancel();
+ }
+ for (size_t i = 0; i < _workers.size(); ++i) {
+ _workers[i]->thread.join();
+ }
+}
+
+size_t
+SimpleThreadBundle::size() const
+{
+ return (_workers.size() + 1);
+}
+
+void
+SimpleThreadBundle::run(const std::vector<Runnable*> &targets)
+{
+ if (targets.size() > size()) {
+ throw IllegalArgumentException("too many targets");
+ }
+ if (targets.empty()) {
+ return;
+ }
+ if (targets.size() == 1) {
+ targets[0]->run();
+ return;
+ }
+ CountDownLatch latch(size());
+ _work.targets = &targets;
+ _work.latch = &latch;
+ _hook->run();
+ latch.await();
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/simple_thread_bundle.h b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.h
new file mode 100644
index 00000000000..0852329d039
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.h
@@ -0,0 +1,137 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "sync.h"
+#include "thread.h"
+#include "runnable.h"
+#include "thread_bundle.h"
+#include "noncopyable.hpp"
+#include "linkedptr.h"
+
+namespace vespalib {
+
+namespace fixed_thread_bundle {
+
+/**
+ * collection of work to be done by a single call to the thread bundle
+ * run function, and latch to count down when each part is done. The
+ * same data structure will be reused for all calls to run in order to
+ * support static wiring of signal paths and execution hooks.
+ **/
+struct Work {
+ const std::vector<Runnable *> *targets;
+ CountDownLatch *latch;
+ Work() : targets(0), latch(0) {}
+};
+
+/**
+ * the subset of work to be done by a single thread.
+ **/
+struct Part {
+ const Work &work;
+ size_t offset;
+ Part(const Work &w, size_t o) : work(w), offset(o) {}
+ bool valid() { return (offset < work.targets->size()); }
+ void perform() {
+ if (valid()) {
+ (*(work.targets))[offset]->run();
+ }
+ work.latch->countDown();
+ }
+};
+
+/**
+ * countable signal path between threads.
+ **/
+struct Signal {
+ bool valid;
+ size_t generation;
+ Monitor monitor;
+ Signal() : valid(true), generation(0), monitor() {}
+ size_t wait(size_t &localGen) {
+ MonitorGuard guard(monitor);
+ while (localGen == generation) {
+ guard.wait();
+ }
+ size_t diff = (generation - localGen);
+ localGen = generation;
+ return (valid ? diff : 0);
+ }
+ void send() {
+ MonitorGuard guard(monitor);
+ ++generation;
+ guard.signal();
+ }
+ void broadcast() {
+ MonitorGuard guard(monitor);
+ ++generation;
+ guard.broadcast();
+ }
+ void cancel() {
+ MonitorGuard guard(monitor);
+ ++generation;
+ valid = false;
+ guard.broadcast();
+ }
+};
+
+} // namespace vespalib::fixed_thread_bundle
+
+/**
+ * A ThreadBundle implementation employing a fixed set of internal
+ * threads. The internal Pool class can be used to recycle bundles.
+ **/
+class SimpleThreadBundle : public ThreadBundle
+{
+public:
+ typedef fixed_thread_bundle::Work Work;
+ typedef fixed_thread_bundle::Signal Signal;
+
+ typedef std::unique_ptr<SimpleThreadBundle> UP;
+ enum Strategy { USE_SIGNAL_LIST, USE_SIGNAL_TREE, USE_BROADCAST };
+
+ class Pool
+ {
+ private:
+ Lock _lock;
+ size_t _bundleSize;
+ std::vector<SimpleThreadBundle*> _bundles;
+
+ public:
+ Pool(size_t bundleSize);
+ ~Pool();
+ SimpleThreadBundle::UP obtain();
+ void release(SimpleThreadBundle::UP bundle);
+ };
+
+private:
+ struct Worker : Runnable, noncopyable {
+ typedef LinkedPtr<Worker> LP;
+ Thread thread;
+ Signal &signal;
+ Runnable::UP hook;
+ Worker(Signal &s, Runnable::UP h) : thread(*this), signal(s), hook(std::move(h)) {
+ thread.start();
+ }
+ virtual void run() {
+ for (size_t gen = 0; signal.wait(gen) > 0; ) {
+ hook->run();
+ }
+ }
+ };
+
+ Work _work;
+ std::vector<Signal> _signals;
+ std::vector<Worker::LP> _workers;
+ Runnable::UP _hook;
+
+public:
+ SimpleThreadBundle(size_t size, Strategy strategy = USE_SIGNAL_LIST);
+ virtual ~SimpleThreadBundle();
+ virtual size_t size() const;
+ virtual void run(const std::vector<Runnable*> &targets);
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/slaveproc.cpp b/vespalib/src/vespa/vespalib/util/slaveproc.cpp
new file mode 100644
index 00000000000..c65f40c43cf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/slaveproc.cpp
@@ -0,0 +1,337 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "guard.h"
+#include "slaveproc.h"
+
+#ifndef FASTOS_NO_THREADS
+
+namespace vespalib {
+
+namespace slaveproc {
+
+/**
+ * @brief SlaveProc internal timeout management.
+ **/
+class Timer
+{
+private:
+ FastOS_Time _startTime;
+ int _maxTime;
+ int _elapsed;
+
+public:
+ Timer(int maxTime) : _startTime(), _maxTime(maxTime), _elapsed(0) {
+ _startTime.SetNow();
+ }
+ Timer &update() {
+ _elapsed = (int) _startTime.MilliSecsToNow();
+ return *this;
+ }
+ int elapsed() const {
+ return _elapsed;
+ }
+ int remaining() const {
+ if (_maxTime == -1) {
+ return -1;
+ }
+ if (_elapsed > _maxTime) {
+ return 0;
+ }
+ return (_maxTime - _elapsed);
+ }
+ int waitTime() const {
+ int res = remaining();
+ if (res >= 0 && res <= 10000) {
+ return res;
+ }
+ return 10000;
+ }
+ bool timeOut() const {
+ return (remaining() == 0);
+ }
+};
+
+} // namespace slaveproc
+
+using slaveproc::Timer;
+
+//-----------------------------------------------------------------------------
+
+void
+SlaveProc::Reader::OnReceiveData(const void *data, size_t length)
+{
+ const char *buf = (const char *) data;
+ MonitorGuard lock(_cond);
+ if (_gotEOF || (buf != NULL && length == 0)) { // ignore special cases
+ return;
+ }
+ if (buf == NULL) { // EOF
+ _gotEOF = true;
+ } else {
+ _queue.push(std::string(buf, length));
+ }
+ if (_waitCnt > 0) {
+ lock.signal();
+ }
+}
+
+
+bool
+SlaveProc::Reader::hasData()
+{
+ // NB: caller has lock on _cond
+ return (!_data.empty() || !_queue.empty());
+}
+
+
+bool
+SlaveProc::Reader::waitForData(Timer &timer, MonitorGuard &lock)
+{
+ // NB: caller has lock on _cond
+ CounterGuard count(_waitCnt);
+ while (!timer.update().timeOut() && !hasData() && !_gotEOF) {
+ lock.wait(timer.waitTime());
+ }
+ return hasData();
+}
+
+
+void
+SlaveProc::Reader::updateEOF()
+{
+ // NB: caller has lock on _cond
+ if (_data.empty() && _queue.empty() && _gotEOF) {
+ _readEOF = true;
+ }
+}
+
+
+SlaveProc::Reader::Reader()
+ : _cond(),
+ _queue(),
+ _data(),
+ _gotEOF(false),
+ _waitCnt(0),
+ _readEOF(false)
+{
+}
+
+
+SlaveProc::Reader::~Reader()
+{
+}
+
+
+uint32_t
+SlaveProc::Reader::read(char *buf, uint32_t len, int msTimeout)
+{
+ if (eof()) {
+ return 0;
+ }
+ Timer timer(msTimeout);
+ MonitorGuard lock(_cond);
+ waitForData(timer, lock);
+ uint32_t bytes = 0;
+ while (bytes < len && hasData()) {
+ if (_data.empty()) {
+ _data = _queue.front();
+ _queue.pop();
+ }
+ if (len - bytes < _data.length()) {
+ memcpy(buf + bytes, _data.data(), len - bytes);
+ _data.erase(0, len - bytes);
+ bytes = len;
+ } else {
+ memcpy(buf + bytes, _data.data(), _data.length());
+ bytes += _data.length();
+ _data.clear();
+ }
+ }
+ updateEOF();
+ return bytes;
+}
+
+
+bool
+SlaveProc::Reader::readLine(std::string &line, int msTimeout)
+{
+ line.clear();
+ if (eof()) {
+ return false;
+ }
+ Timer timer(msTimeout);
+ MonitorGuard lock(_cond);
+ while (waitForData(timer, lock)) {
+ while (hasData()) {
+ if (_data.empty()) {
+ _data = _queue.front();
+ _queue.pop();
+ }
+ std::string::size_type ofs = _data.find('\n');
+ if (ofs == std::string::npos) {
+ line.append(_data);
+ _data.clear();
+ } else {
+ line.append(_data, 0, ofs);
+ _data.erase(0, ofs + 1);
+ updateEOF();
+ return true;
+ }
+ }
+ }
+ updateEOF();
+ if (eof()) {
+ return !line.empty();
+ }
+ _data.swap(line);
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+
+void
+SlaveProc::checkProc()
+{
+ if (_running) {
+ bool stillRunning;
+ if (_proc.PollWait(&_exitCode, &stillRunning) && !stillRunning) {
+ _running = false;
+ _failed = (_exitCode != 0);
+ }
+ }
+}
+
+
+SlaveProc::SlaveProc(const char *cmd)
+ : _reader(),
+ _proc(cmd, true, &_reader),
+ _running(false),
+ _failed(false),
+ _exitCode(-918273645)
+{
+ _running = _proc.CreateWithShell();
+ _failed = !_running;
+}
+
+
+SlaveProc::~SlaveProc()
+{
+}
+
+
+bool
+SlaveProc::write(const char *buf, uint32_t len)
+{
+ if (len == 0) {
+ return true;
+ }
+ return _proc.WriteStdin(buf, len);
+}
+
+
+bool
+SlaveProc::close()
+{
+ return _proc.WriteStdin(NULL, 0);
+}
+
+
+uint32_t
+SlaveProc::read(char *buf, uint32_t len, int msTimeout)
+{
+ return _reader.read(buf, len, msTimeout);
+}
+
+
+bool
+SlaveProc::readLine(std::string &line, int msTimeout)
+{
+ return _reader.readLine(line, msTimeout);
+}
+
+
+bool
+SlaveProc::wait(int msTimeout)
+{
+ bool done = true;
+ checkProc();
+ if (_running) {
+ if (msTimeout != -1) {
+ msTimeout = (msTimeout + 999) / 1000;
+ }
+ if (_proc.Wait(&_exitCode, msTimeout)) {
+ _failed = (_exitCode != 0);
+ } else {
+ _failed = true;
+ done = false;
+ }
+ _running = false;
+ }
+ return done;
+}
+
+
+bool
+SlaveProc::running()
+{
+ checkProc();
+ return _running;
+}
+
+
+bool
+SlaveProc::failed()
+{
+ checkProc();
+ return _failed;
+}
+
+int
+SlaveProc::getExitCode()
+{
+ return _exitCode;
+}
+
+
+bool
+SlaveProc::run(const std::string &input, const char *cmd,
+ std::string &output, int msTimeout)
+{
+ SlaveProc proc(cmd);
+ Timer timer(msTimeout);
+ char buf[4096];
+ proc.write(input.data(), input.length());
+ proc.close(); // close stdin
+ while (!proc.eof() && !timer.timeOut()) {
+ uint32_t res = proc.read(buf, sizeof(buf), timer.remaining());
+ output.append(buf, res);
+ timer.update();
+ }
+ if (output.size() > 0 && output.find('\n') == output.size() - 1) {
+ output.erase(output.size() - 1, 1);
+ }
+ proc.wait(timer.update().remaining());
+ return (!proc.running() && !proc.failed());
+}
+
+
+bool
+SlaveProc::run(const char *cmd, std::string &output, int msTimeout)
+{
+ std::string input; // empty input
+ return run(input, cmd, output, msTimeout);
+}
+
+
+bool
+SlaveProc::run(const char *cmd, int msTimeout)
+{
+ std::string input; // empty input
+ std::string output; // ignore output
+ return run(input, cmd, output, msTimeout);
+}
+
+} // namespace vespalib
+
+#endif // FASTOS_NO_THREADS
diff --git a/vespalib/src/vespa/vespalib/util/slaveproc.h b/vespalib/src/vespa/vespalib/util/slaveproc.h
new file mode 100644
index 00000000000..aedc1369b4b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/slaveproc.h
@@ -0,0 +1,208 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2004 Overture Services Norway AS
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#ifndef FASTOS_NO_THREADS
+#include <string>
+#include <queue>
+#include "sync.h"
+
+namespace vespalib {
+
+namespace slaveproc {
+
+class Timer;
+
+} // namespace slaveproc
+
+/**
+ * @brief Slave Process utility class for running external programs
+ *
+ * Designed for use in unit tests and other places
+ * where you need to run, control and communicate with
+ * some external program.
+ **/
+class SlaveProc
+{
+private:
+ class Reader : public FastOS_ProcessRedirectListener
+ {
+ private:
+ Monitor _cond;
+ std::queue<std::string> _queue;
+ std::string _data;
+ bool _gotEOF;
+ int _waitCnt;
+ bool _readEOF;
+
+ virtual void OnReceiveData(const void *data, size_t length);
+ bool hasData();
+ bool waitForData(slaveproc::Timer &timer, MonitorGuard &lock);
+ void updateEOF();
+
+ public:
+ Reader();
+ ~Reader();
+
+ uint32_t read(char *buf, uint32_t len, int msTimeout);
+ bool readLine(std::string &line, int msTimeout);
+ bool eof() const { return _readEOF; };
+ };
+
+ Reader _reader;
+ FastOS_Process _proc;
+ bool _running;
+ bool _failed;
+ int _exitCode;
+
+ SlaveProc(const SlaveProc &); // no copy
+ SlaveProc &operator=(const SlaveProc &); // no assignment
+
+ void checkProc();
+
+public:
+ /**
+ * @brief Run a slave process
+ *
+ * Starts a process running the given command
+ * @param cmd A shell command line to run
+ **/
+ explicit SlaveProc(const char *cmd);
+
+ /** @brief destructor doing cleanup if needed */
+ ~SlaveProc();
+
+ /**
+ * @return process id
+ **/
+ pid_t getPid() { return _proc.GetProcessId(); }
+
+ /**
+ * @brief send data as input to the running process
+ *
+ * The given data will be sent so it becomes
+ * available on the running process's standard input.
+ *
+ * @param buf the data containing len bytes to be sent
+ * @param len the number of bytes to send
+ * @return true if successful
+ **/
+ bool write(const char *buf, uint32_t len);
+
+ /**
+ * @brief close the running process's standard input
+ *
+ * when running a program that consumes stdin,
+ * make sure to call this method to signal
+ * that it can finish.
+ * @return true if successful
+ **/
+ bool close();
+
+ /**
+ * @brief read program output
+ *
+ * If the running program writes data to its standard output, you
+ * can and should get the data with read() or readLine() calls.
+ *
+ * @param buf pointer where data is stored
+ * @param len number of bytes to try to read
+ * @param msTimeout number of milliseconds to wait for data
+ **/
+ uint32_t read(char *buf, uint32_t len,
+ int msTimeout = 10000);
+
+ /**
+ * @brief read a line of program output
+ *
+ * See read().
+ * @param line reference to a string where a line of program output will be stored
+ * @param msTimeout number of milliseconds to wait for data
+ * @return true if successful
+ **/
+ bool readLine(std::string &line,
+ int msTimeout = 10000);
+
+ /**
+ * @brief check if the program has finished writing output
+ * @return true if standard output from the process is closed
+ **/
+ bool eof() const { return _reader.eof(); }
+
+ /**
+ * @brief wait for the program to exit
+ * @param msTimeout milliseconds to wait; the default (-1) will wait forever
+ * @return true if the program exited, false on timeout
+ **/
+ bool wait(int msTimeout = -1);
+
+ /** @brief check if the program is still running */
+ bool running();
+
+ /**
+ * @brief get the exit code of the started program.
+ *
+ * Will return the stored exitcode.
+ * It assumes that the command is done.
+ * @return exit code.
+ **/
+ int getExitCode();
+
+ /**
+ * @brief check if program failed
+ *
+ * Check if we failed to run the program or the program finished with
+ * a non-zero exit status.
+ * @return true if something went wrong
+ **/
+ bool failed();
+
+ /**
+ * @brief run a command
+ *
+ * Utility function that runs the given command, sends input, and
+ * loops reading output until the program finishes or the timeout
+ * expires.
+ * Any final terminating newline will be erased from output,
+ * just like for shell backticks.
+ *
+ * @param input The input the program will receive
+ * @param cmd The command to run
+ * @param output Any output will be appended to this string
+ * @param msTimeout milliseconds timeout; -1 means wait forever for program to finish
+ **/
+ static bool run(const std::string &input, const char *cmd,
+ std::string &output, int msTimeout = -1);
+ /**
+ * @brief run a command
+ *
+ * Utility function that runs the given command with no input, and
+ * loops reading output until the program finishes or the timeout
+ * expires.
+ * Any final terminating newline will be erased from output,
+ * just like for shell backticks.
+ *
+ * @param cmd The command to run
+ * @param output Any output will be appended to this string
+ * @param msTimeout milliseconds timeout; -1 means wait forever for program to finish
+ **/
+ static bool run(const char *cmd, std::string &output, int msTimeout = -1);
+
+ /**
+ * @brief run a command
+ *
+ * Utility function that runs the given command with no input, and
+ * loops reading output until the program finishes or the timeout
+ * expires. Output (if any) is ignored.
+ *
+ * @param cmd The command to run
+ * @param msTimeout milliseconds timeout; -1 means wait forever for program to finish
+ **/
+ static bool run(const char *cmd, int msTimeout = -1);
+};
+
+} // namespace vespalib
+
+#endif // FASTOS_NO_THREADS
diff --git a/vespalib/src/vespa/vespalib/util/stash.cpp b/vespalib/src/vespa/vespalib/util/stash.cpp
new file mode 100644
index 00000000000..97d45a7695a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/stash.cpp
@@ -0,0 +1,113 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "stash.h"
+#include <algorithm>
+
+namespace vespalib {
+namespace stash {
+
+namespace {
+
+void free_chunks(Chunk *chunk) {
+ while (chunk != nullptr) {
+ void *mem = chunk;
+ chunk = chunk->next;
+ free(mem);
+ }
+}
+
+Chunk *keep_one(Chunk *chunk) {
+ if (chunk != nullptr) {
+ Chunk *next = chunk->next;
+ while (next != nullptr) {
+ void *mem = chunk;
+ chunk = next;
+ next = chunk->next;
+ free(mem);
+ }
+ chunk->clear();
+ return chunk;
+ }
+ return nullptr;
+}
+
+void run_cleanup(Cleanup *cleanup) {
+ while (cleanup != nullptr) {
+ Cleanup *tmp = cleanup;
+ cleanup = tmp->next;
+ tmp->cleanup();
+ }
+}
+
+} // namespace vespalib::stash::<unnamed>
+
+} // namespace vespalib::stash
+
+char *
+Stash::do_alloc(size_t size)
+{
+ if (is_small(size)) {
+ void *chunk_mem = malloc(_chunk_size);
+ _chunks = new (chunk_mem) stash::Chunk(_chunks);
+ return _chunks->alloc(size, _chunk_size);
+ } else {
+ char *mem = static_cast<char*>(malloc(sizeof(stash::DeleteMemory) + size));
+ _cleanup = new (mem) stash::DeleteMemory(_cleanup);
+ return (mem + sizeof(stash::DeleteMemory));
+ }
+}
+
+Stash::Stash(size_t chunk_size)
+ : _chunks(nullptr),
+ _cleanup(nullptr),
+ _chunk_size(std::max(size_t(4096), chunk_size))
+{
+}
+
+Stash::Stash(Stash &&rhs)
+ : _chunks(rhs._chunks),
+ _cleanup(rhs._cleanup),
+ _chunk_size(rhs._chunk_size)
+{
+ rhs._chunks = nullptr;
+ rhs._cleanup = nullptr;
+}
+
+Stash &
+Stash::operator=(Stash &&rhs)
+{
+ stash::run_cleanup(_cleanup);
+ stash::free_chunks(_chunks);
+ _chunks = rhs._chunks;
+ _cleanup = rhs._cleanup;
+ _chunk_size = rhs._chunk_size;
+ rhs._chunks = nullptr;
+ rhs._cleanup = nullptr;
+ return *this;
+}
+
+Stash::~Stash()
+{
+ stash::run_cleanup(_cleanup);
+ stash::free_chunks(_chunks);
+}
+
+void
+Stash::clear()
+{
+ stash::run_cleanup(_cleanup);
+ _cleanup = nullptr;
+ _chunks = stash::keep_one(_chunks);
+}
+
+size_t
+Stash::count_used() const
+{
+ size_t used = 0;
+ for (stash::Chunk *chunk = _chunks; chunk != nullptr; chunk = chunk->next) {
+ used += chunk->used;
+ }
+ return used;
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/stash.h b/vespalib/src/vespa/vespalib/util/stash.h
new file mode 100644
index 00000000000..479021cfdcf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/stash.h
@@ -0,0 +1,113 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include "traits.h"
+
+namespace vespalib {
+namespace stash {
+
+struct Cleanup {
+ Cleanup * const next;
+ explicit Cleanup(Cleanup *next_in) noexcept : next(next_in) {}
+ virtual void cleanup() = 0;
+protected:
+ virtual ~Cleanup() {}
+};
+
+// used as header for memory allocated outside the stash
+struct DeleteMemory : public Cleanup {
+ explicit DeleteMemory(Cleanup *next_in) noexcept : Cleanup(next_in) {}
+ virtual void cleanup() override { free((void*)this); }
+};
+
+// used as prefix for objects to be destructed
+template<typename T> struct DestructObject : public Cleanup {
+ explicit DestructObject(Cleanup *next_in) noexcept : Cleanup(next_in) {}
+ virtual void cleanup() override { reinterpret_cast<T*>(this + 1)->~T(); }
+};
+
+struct Chunk {
+ Chunk *next;
+ size_t used;
+ Chunk(const Chunk &) = delete;
+ Chunk(Chunk *next_in) : next(next_in), used(sizeof(Chunk)) {}
+ void clear() { used = sizeof(Chunk); }
+ char *alloc(size_t size, size_t chunk_size) {
+ size_t aligned_size = ((size + (sizeof(char *) - 1))
+ & ~(sizeof(char *) - 1));
+ if (used + aligned_size > chunk_size) {
+ return nullptr;
+ }
+ char *ret = reinterpret_cast<char*>(this) + used;
+ used += aligned_size;
+ return ret;
+ }
+};
+
+} // namespace vespalib::stash
+
+/**
+ * @brief A Stash stores mixed typed objects next to each other in
+ * memory.
+ *
+ * When a stash is destructed, destruction of internal objects will be
+ * performed in reverse creation order. Objects for which the
+ * vespalib::can_skip_destruction trait is true are not
+ * destructed. This will save both time and space.
+ *
+ * The minimal chunk size of a stash is 4k. Any object larger than 1/4
+ * of the chunk size will be allocated separately.
+ **/
+class Stash
+{
+private:
+ stash::Chunk *_chunks;
+ stash::Cleanup *_cleanup;
+ size_t _chunk_size;
+
+ char *do_alloc(size_t size);
+ bool is_small(size_t size) const { return (size < (_chunk_size / 4)); }
+
+ template <typename T, typename ... Args>
+ T &create_nodelete(Args && ... args) {
+ return *(new (alloc(sizeof(T))) T(std::forward<Args>(args)...));
+ }
+
+public:
+ typedef std::unique_ptr<Stash> UP;
+ explicit Stash(size_t chunk_size);
+ Stash() : Stash(4096) {}
+ Stash(Stash &&rhs);
+ Stash(const Stash &) = delete;
+ Stash & operator = (const Stash &) = delete;
+ ~Stash();
+
+ Stash &operator=(Stash &&rhs);
+
+ void clear();
+
+ size_t count_used() const;
+ size_t get_chunk_size() const { return _chunk_size; }
+
+ char *alloc(size_t size) {
+ char *ret = __builtin_expect(is_small(size) && _chunks != nullptr, true)
+ ? _chunks->alloc(size, _chunk_size) : nullptr;
+ return __builtin_expect(ret != nullptr, true) ? ret : do_alloc(size);
+ }
+
+ template <typename T, typename ... Args>
+ T &create(Args && ... args) {
+ if (can_skip_destruction<T>::value) {
+ return create_nodelete<T, Args...>(std::forward<Args>(args)...);
+ }
+ typedef stash::DestructObject<T> DeleteHook;
+ char *mem = alloc(sizeof(DeleteHook) + sizeof(T));
+ T *ret = new (mem + sizeof(DeleteHook)) T(std::forward<Args>(args)...);
+ _cleanup = new (mem) stash::DestructObject<T>(_cleanup);
+ return *ret;
+ }
+};
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/string_hash.cpp b/vespalib/src/vespa/vespalib/util/string_hash.cpp
new file mode 100644
index 00000000000..995782ef255
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/string_hash.cpp
@@ -0,0 +1,20 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "string_hash.h"
+
+namespace vespalib {
+
+uint32_t hash_code(const char *str, size_t len) {
+ uint32_t hash = 0;
+ for (size_t i = 0; i < len; ++i) {
+ hash = (hash << 5) - hash + str[i];
+ }
+ return hash;
+}
+
+uint32_t hash_code(vespalib::stringref str) {
+ return hash_code(str.data(), str.size());
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/string_hash.h b/vespalib/src/vespa/vespalib/util/string_hash.h
new file mode 100644
index 00000000000..ecb76e766e5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/string_hash.h
@@ -0,0 +1,16 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+/**
+ * simple string hashing function similar to the one used by Java.
+ **/
+uint32_t hash_code(const char *str, size_t len);
+uint32_t hash_code(vespalib::stringref str);
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/stringfmt.cpp b/vespalib/src/vespa/vespalib/util/stringfmt.cpp
new file mode 100644
index 00000000000..2782e1f0da6
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/stringfmt.cpp
@@ -0,0 +1,68 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "stringfmt.h"
+#include "vstringfmt.h"
+
+namespace vespalib {
+
+//-----------------------------------------------------------------------------
+
+vespalib::string make_vespa_string_va(const char *fmt, va_list ap)
+{
+ va_list ap2;
+ vespalib::string ret;
+ int size = -1;
+
+ va_copy(ap2, ap);
+ size = vsnprintf(ret.begin(), ret.capacity(), fmt, ap2);
+ va_end(ap2);
+
+ assert(size >= 0);
+ if (ret.capacity() > static_cast<size_t>(size)) {
+ // all OK
+ } else {
+ int newLen = size;
+ ret.reserve(size+1);
+ va_copy(ap2, ap);
+ size = vsnprintf(ret.begin(), ret.capacity(), fmt, ap2);
+ va_end(ap2);
+ assert(newLen == size);
+ (void)newLen;
+ }
+ ret.append_from_reserved(size);
+ return ret;
+}
+
+/**
+ * @brief construct string value printf style.
+ *
+ * You must \#include <vespa/vespalib/util/stringfmt.h>
+ * to use this utility function.
+ * @param fmt format string
+ * @return formatted vespalib::string
+ **/
+vespalib::string make_vespa_string(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vespalib::string ret = make_vespa_string_va(fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+vespalib::string make_string(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vespalib::string ret = make_vespa_string_va(fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+vespalib::string make_string_va(const char *fmt, va_list ap)
+{
+ return make_vespa_string_va(fmt, ap);
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/stringfmt.h b/vespalib/src/vespa/vespalib/util/stringfmt.h
new file mode 100644
index 00000000000..a8db9c93877
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/stringfmt.h
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <stdarg.h>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+extern vespalib::string make_string_va(const char *fmt, va_list ap);
+
+extern vespalib::string make_string(const char *fmt, ...)
+#ifdef __GNUC__
+ // Add printf format checks with gcc
+ __attribute__ ((format (printf,1,2)))
+#endif
+ ;
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/sync.h b/vespalib/src/vespa/vespalib/util/sync.h
new file mode 100644
index 00000000000..ee563f1414b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/sync.h
@@ -0,0 +1,729 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2006 Yahoo
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+
+namespace vespalib {
+
+#ifndef IAM_DOXYGEN
+class LockGuardHandover
+{
+private:
+ friend class LockGuard;
+ FastOS_MutexInterface *_mutex;
+ LockGuardHandover(const LockGuardHandover &);
+ LockGuardHandover &operator=(const LockGuardHandover &);
+ LockGuardHandover(FastOS_MutexInterface *m) : _mutex(m) {}
+public:
+};
+
+
+class MonitorGuardHandover
+{
+private:
+ friend class MonitorGuard;
+ FastOS_CondInterface *_cond;
+ MonitorGuardHandover(const MonitorGuardHandover &);
+ MonitorGuardHandover &operator=(const MonitorGuardHandover &);
+ MonitorGuardHandover(FastOS_CondInterface *c) : _cond(c) {}
+public:
+};
+#endif
+
+
+/**
+ * @brief A Lock is a synchronization primitive used to ensure mutual
+ * exclusion.
+ *
+ * Use a LockGuard to hold a lock inside a scope.
+ *
+ * It is possible to obtain a lock on a const Lock object.
+ *
+ * @see TryLock
+ **/
+class Lock
+{
+private:
+ friend class LockGuard;
+ friend class TryLock;
+
+ mutable FastOS_Mutex _mutex;
+public:
+ /**
+ * @brief Create a new Lock.
+ *
+ * Creates a Lock that has mutex instrumentation disabled.
+ **/
+ Lock() : _mutex() {}
+ /**
+ * @brief Create a new Lock.
+ *
+ * Creates a Lock with support for mutex instrumentation.
+ *
+ * @param name mutex category (for instrumentation)
+ * @param leaf false if you will lock other locks while holding this one,
+ * true if you only lock this as the last (leaf) lock
+ * (for instrumentation).
+ **/
+ Lock(const char *name, bool leaf) : _mutex() {(void) name; (void) leaf; }
+ /**
+ * @brief Copy a Lock.
+ *
+ * Create a new Lock with mutex instrumentation settings obtained
+ * from the given lock. No other information is copied. Normally
+ * only used when copy-constructing a bigger object containing a
+ * Lock.
+ *
+ * @param rhs other Lock
+ **/
+ Lock(const Lock &rhs) : _mutex() { (void) rhs; }
+ /**
+ * @brief No-op assignment operator.
+ *
+ * Assignment operator ignoring the right hand side. It makes no
+ * sense to assign the state of one Lock to another, but we want
+ * to allow assignment of bigger objects that contain Lock
+ * objects.
+ *
+ * @param rhs other Lock (right hand side)
+ **/
+ Lock &operator=(const Lock &rhs) {
+ (void) rhs;
+ return *this;
+ }
+};
+
+
+/**
+ * @brief A Monitor is a synchronization primitive used to protect
+ * data access and also facilitate signaling and waiting between
+ * threads.
+ *
+ * A LockGuard can be used to obtain a lock on a Monitor. If you also
+ * want to send or wait for signals, you need to use a MonitorGuard.
+ *
+ * It is possible to obtain a lock on a const Monitor object.
+ *
+ * @see TryLock
+ **/
+class Monitor
+{
+private:
+ friend class LockGuard;
+ friend class MonitorGuard;
+ friend class TryLock;
+
+ mutable FastOS_Cond _cond;
+public:
+ /**
+ * @brief Create a new Monitor.
+ *
+ * Creates a Monitor that has mutex instrumentation disabled.
+ **/
+ Monitor() : _cond() {}
+ /**
+ * @brief Create a new Monitor.
+ *
+ * Creates a Monitor with support for mutex instrumentation.
+ *
+ * @param name mutex category (for instrumentation)
+ * @param leaf false if you will lock other locks while holding this one,
+ * true if you only lock this as the last (leaf) lock
+ * (for instrumentation).
+ **/
+ Monitor(const char *name, bool leaf) : _cond() { (void) name; (void) leaf; }
+ /**
+ * @brief Copy a Monitor.
+ *
+ * Creates a new Monitor with mutex instrumentation settings
+ * obtained from the given monitor. No other information is
+ * copied. Normally only used when copy-constructing a bigger
+ * object containing a Lock.
+ *
+ * @param rhs other Monitor
+ **/
+ Monitor(const Monitor &rhs) : _cond() { (void) rhs; }
+ /**
+ * @brief No-op assignment operator.
+ *
+ * Assignment operator ignoring the right hand side. It makes no
+ * sense to assign the state of one Monitor to another, but we want
+ * to allow assigning objects that contain Monitor objects.
+ *
+ * @param rhs other Monitor (right hand side)
+ **/
+ Monitor &operator=(const Monitor &rhs) {
+ (void) rhs;
+ return *this;
+ }
+};
+
+
+/**
+ * @brief A TryLock object is used to try to obtain the lock on a Lock
+ * or a Monitor without blocking.
+ *
+ * A TryLock will typically fail to obatin the lock if someone else
+ * already has it. In that case, the TryLock object has no further
+ * use.
+ *
+ * If the TryLock managed to acquire the lock, it can be passed over
+ * to a LockGuard or MonitorGuard object. If the lock is not passed
+ * on, the TryLock object will release it when it goes out of scope.
+ *
+ * Note that passing the lock obtained from a Lock to a MonitorGuard
+ * is illegal. Also note that if the TryLock fails to aquire the lock,
+ * it cannot be passed on. Trying to do so will result in an assert.
+ *
+ * copy/assignment of a TryLock is illegal.
+ *
+ * <pre>
+ * Example:
+ *
+ * Lock lock;
+ * TryLock tl(lock);
+ * if (tl.hasLock()) {
+ * LockGuard guard(tl)
+ * ... do stuff
+ * } // the lock is released as 'guard' goes out of scope
+ * </pre>
+ **/
+class TryLock
+{
+private:
+ friend class LockGuard;
+ friend class MonitorGuard;
+
+ FastOS_MutexInterface *_mutex;
+ FastOS_CondInterface *_cond;
+
+ TryLock(const TryLock &);
+ TryLock &operator=(const TryLock &);
+
+ FastOS_MutexInterface *stealMutex() {
+ FastOS_MutexInterface *ret = _mutex;
+ if (ret != NULL) {
+ _mutex = NULL;
+ return ret;
+ }
+ ret = _cond;
+ assert(ret != NULL);
+ _cond = NULL;
+ return ret;
+ }
+ FastOS_CondInterface *stealCond() {
+ FastOS_CondInterface *ret = _cond;
+ assert(ret != NULL);
+ _cond = NULL;
+ return ret;
+ }
+
+public:
+ /**
+ * @brief Try to obtain the lock represented by the given Lock object
+ *
+ * @param lock the lock to obtain
+ **/
+ TryLock(const Lock &lock) : _mutex(&lock._mutex), _cond(NULL) {
+ if (!_mutex->TryLock()) {
+ _mutex = NULL;
+ }
+ }
+ /**
+ * @brief Try to lock the given Monitor
+ *
+ * @param mon the monitor to lock
+ **/
+ TryLock(const Monitor &mon) : _mutex(NULL), _cond(&mon._cond) {
+ if (!_cond->TryLock()) {
+ _cond = NULL;
+ }
+ }
+ /**
+ * @brief Release the lock held by this object, if any
+ **/
+ ~TryLock() {
+ if (_mutex != NULL) {
+ _mutex->Unlock();
+ }
+ if (_cond != NULL) {
+ _cond->Unlock();
+ }
+ }
+ /**
+ * @brief Check whether this object holds a lock
+ *
+ * @return true if this object holds a lock
+ **/
+ bool hasLock() { return (_mutex != NULL || _cond != NULL); }
+ /**
+ * @brief Release the lock held by this object.
+ *
+ * No methods may be invoked after invoking unlock (except the
+ * destructor). Note that this method should only be used if you
+ * need to release the lock before the object is destructed, as
+ * the destructor will release the lock.
+ **/
+ void unlock() {
+ if (_mutex != NULL) {
+ _mutex->Unlock();
+ _mutex = NULL;
+ }
+ if (_cond != NULL) {
+ _cond->Unlock();
+ _cond = NULL;
+ }
+ }
+};
+
+
+/**
+ * @brief A LockGuard holds the lock on either a Lock or a Monitor.
+ *
+ * LockGuards are typically created on the stack to hold a lock within
+ * a scope. If needed, the unlock method may be used to release the
+ * lock before exiting scope.
+ *
+ * LockGuard has destructive copy. Copying a LockGuard has the
+ * semantic of transferring the lock from one object to the
+ * other. Note that assignment is not legal, and that copying a
+ * LockGuard that does not have a lock will result in an assert.
+ **/
+class LockGuard
+{
+private:
+ FastOS_MutexInterface *_mutex;
+ LockGuard &operator=(const LockGuard &);
+
+ FastOS_MutexInterface *stealMutex() {
+ FastOS_MutexInterface *ret = _mutex;
+ _mutex = NULL;
+ return ret;
+ }
+public:
+ /**
+ * @brief A noop guard without any mutex.
+ **/
+ LockGuard() : _mutex(NULL) {}
+ /**
+ * @brief Steal the lock from the given LockGuard
+ *
+ * @param rhs steal the lock from this one
+ **/
+ LockGuard(LockGuard &rhs) : _mutex(rhs.stealMutex()) {}
+ /**
+ * @brief Obtain the lock represented by the given Lock object.
+ *
+ * The method will block until the lock can be obtained.
+ *
+ * @param lock take it
+ **/
+ LockGuard(const Lock &lock) : _mutex(&lock._mutex) {
+ _mutex->Lock();
+ }
+ /**
+ * @brief Obtain the lock on the given Monitor object.
+ *
+ * The method will block until the lock can be obtained.
+ *
+ * @param monitor take the lock on it
+ **/
+ LockGuard(const Monitor &monitor) : _mutex(&monitor._cond) {
+ _mutex->Lock();
+ }
+ /**
+ * @brief Create a LockGuard from a TryLock.
+ *
+ * The TryLock may have been created from either a Lock or a
+ * Monitor, but it must have managed to acquire the lock. The lock
+ * will be handed over from the TryLock to the new object.
+ *
+ * @param tlock take the lock from this one
+ **/
+ LockGuard(TryLock &tlock) : _mutex(tlock.stealMutex()) {}
+#ifndef IAM_DOXYGEN
+ LockGuard(const LockGuardHandover &rhs) : _mutex(rhs._mutex) {}
+ operator LockGuardHandover() { return LockGuardHandover(stealMutex()); }
+#endif
+ /**
+ * @brief Release the lock held by this object.
+ *
+ * No methods may be invoked after invoking unlock (except the
+ * destructor). Note that this method should only be used if you
+ * need to release the lock before the object is destructed, as
+ * the destructor will release the lock.
+ **/
+ void unlock() {
+ if (_mutex != NULL) {
+ _mutex->Unlock();
+ _mutex = NULL;
+ }
+ }
+ /**
+ * @brief Release the lock held by this object if unlock has not
+ * been called.
+ **/
+ ~LockGuard() {
+ if (_mutex != NULL) {
+ _mutex->Unlock();
+ }
+ }
+
+ /**
+ * Allow code to match guard with lock. This allows functions to take a
+ * guard ref as input, ensuring that the caller have grabbed a lock.
+ */
+ bool locks(const Lock& lock) const {
+ return (_mutex != NULL && _mutex == &lock._mutex);
+ }
+};
+
+
+/**
+ * @brief A MonitorGuard holds the lock on a Monitor and supports
+ * sending and waiting for signals.
+ *
+ * MonitorGuards are typically created on the stack to hold a lock
+ * within a scope. If needed, the unlock method may be used to release
+ * the lock before exiting scope.
+ *
+ * MonitorGuard has destructive copy. Copying a MonitorGuard has the
+ * semantic of transferring the lock from one object to the
+ * other. Note that assignment is not legal, and that copying a
+ * MonitorGuard that does not have a lock will result in an assert.
+ **/
+class MonitorGuard
+{
+private:
+ FastOS_CondInterface *_cond;
+ MonitorGuard &operator=(const MonitorGuard &);
+
+ FastOS_CondInterface *stealCond() {
+ FastOS_CondInterface *ret = _cond;
+ _cond = NULL;
+ return ret;
+ }
+public:
+ /**
+ * @brief A noop guard without any condition.
+ **/
+ MonitorGuard() : _cond(NULL) {}
+ /**
+ * @brief Steal the lock from the given MonitorGuard
+ *
+ * @param rhs steal the lock from this one
+ **/
+ MonitorGuard(MonitorGuard &rhs) : _cond(rhs.stealCond()) {}
+ /**
+ * @brief Obtain the lock on the given Monitor object.
+ *
+ * The method will block until the lock can be obtained.
+ *
+ * @param monitor take the lock on it
+ **/
+ MonitorGuard(const Monitor &monitor) : _cond(&monitor._cond) {
+ _cond->Lock();
+ }
+ /**
+ * @brief Create a MonitorGuard from a TryLock.
+ *
+ * The TryLock must have been created from a Monitor, and it must
+ * have managed to acquire the lock. The lock will be handed over
+ * from the TryLock to the new object.
+ *
+ * @param tlock take the lock from this one
+ **/
+ MonitorGuard(TryLock &tlock) : _cond(tlock.stealCond()) {}
+#ifndef IAM_DOXYGEN
+ MonitorGuard(const MonitorGuardHandover &rhs) : _cond(rhs._cond) {}
+ operator MonitorGuardHandover() {
+ return MonitorGuardHandover(stealCond());
+ }
+#endif
+ /**
+ * @brief Release the lock held by this object.
+ *
+ * No methods may be invoked after invoking this one (except the
+ * destructor). Note that this method should only be used if you
+ * need to release the lock before this object is destructed, as
+ * the destructor will release the lock.
+ **/
+ void unlock() {
+ assert(_cond != NULL);
+ _cond->Unlock();
+ _cond = NULL;
+ }
+ /**
+ * @brief Wait for a signal on the underlying Monitor.
+ **/
+ void wait() {
+ assert(_cond != NULL);
+ _cond->Wait();
+ }
+ /**
+ * @brief Wait for a signal on the underlying Monitor with the
+ * given timeout.
+ *
+ * @param msTimeout timeout in milliseconds
+ * @return true if a signal was received, false if the wait timed out.
+ **/
+ bool wait(int msTimeout) {
+ assert(_cond != NULL);
+ return _cond->TimedWait(msTimeout);
+ }
+ /**
+ * @brief Send a signal to a single waiter on the underlying
+ * Monitor.
+ **/
+ void signal() {
+ assert(_cond != NULL);
+ _cond->Signal();
+ }
+ /**
+ * @brief Send a signal to all waiters on the underlying Monitor.
+ **/
+ void broadcast() {
+ assert(_cond != NULL);
+ _cond->Broadcast();
+ }
+ /**
+ * @brief Send a signal to a single waiter on the underlying
+ * Monitor, but unlock the monitor right before doing so.
+ *
+ * This is inherently unsafe and the caller needs external
+ * synchronization to ensure that the underlying Monitor object
+ * will live long enough to be signaled.
+ **/
+ void unsafeSignalUnlock() {
+ assert(_cond != NULL);
+ _cond->Unlock();
+ _cond->Signal();
+ _cond = NULL;
+ }
+ /**
+ * @brief Send a signal to all waiters on the underlying Monitor,
+ * but unlock the monitor right before doing so.
+ *
+ * This is inherently unsafe and the caller needs external
+ * synchronization to ensure that the underlying Monitor object
+ * will live long enough to be signaled.
+ **/
+ void unsafeBroadcastUnlock() {
+ assert(_cond != NULL);
+ _cond->Unlock();
+ _cond->Broadcast();
+ _cond = NULL;
+ }
+ /**
+ * @brief Release the lock held by this object if unlock has not
+ * been called.
+ **/
+ ~MonitorGuard() {
+ if (_cond != NULL) {
+ _cond->Unlock();
+ }
+ }
+
+ /**
+ * Allow code to match guard with lock. This allows functions to take a
+ * guard ref as input, ensuring that the caller have grabbed a lock.
+ */
+ bool monitors(const Monitor& m) const {
+ return (_cond != NULL && _cond == &m._cond);
+ }
+};
+
+
+/**
+ * Helper class that can be used to wait for a condition when having a
+ * constraint on how long you want to wait. The usage is best
+ * explained with an example:
+ *
+ * <pre>
+ * bool waitForWantedState(int maxwait) {
+ * MonitorGuard guard(_monitor);
+ * TimedWaiter waiter(guard, maxwait);
+ * while (!wantedState && waiter.hasTime()) {
+ * waiter.wait();
+ * }
+ * return wantedState;
+ * }
+ * </pre>
+ *
+ * The example code will limit the total wait time to maxwait
+ * milliseconds across all blocking wait operations on the underlying
+ * monitor guard.
+ **/
+class TimedWaiter
+{
+private:
+ MonitorGuard &_guard;
+ FastOS_Time _start;
+ int _maxwait;
+ int _remain;
+ bool _timeout;
+
+ TimedWaiter(const TimedWaiter&);
+ TimedWaiter &operator=(const TimedWaiter&);
+public:
+
+ /**
+ * Create a new instance using the given monitor guard and wait
+ * time limit. If the maximum time is less than or equal to 0, the
+ * wait will time out immediately and no low-level wait operations
+ * will be performed.
+ *
+ * @param guard the underlying monitor guard used to perform the actual wait operation.
+ * @param maxwait maximum time to wait in milliseconds.
+ **/
+ TimedWaiter(MonitorGuard &guard, int maxwait)
+ : _guard(guard), _start(), _maxwait(maxwait), _remain(0), _timeout(false)
+ {
+ if (_maxwait > 0) {
+ _start.SetNow();
+ } else {
+ _timeout = true;
+ }
+ }
+
+ /**
+ * Check if this object has any time left until the time limit is
+ * exceeded.
+ *
+ * @return true if there is time left.
+ **/
+ bool hasTime() const {
+ return !_timeout;
+ }
+
+ /**
+ * Perform low-level wait in such a way that we do not exceed the
+ * maximum total wait time. This method also performs the needed
+ * book-keeping to keep track of elapsed time between invocations.
+ *
+ * @return true if we woke up due to a signal, false if we timed out.
+ **/
+ bool wait() {
+ if (!_timeout) {
+ if (_remain > 0) {
+ _remain = (_maxwait - (int)_start.MilliSecsToNow());
+ } else {
+ _remain = _maxwait;
+ }
+ if (_remain > 0) {
+ _timeout = !_guard.wait(_remain);
+ } else {
+ _timeout = true;
+ }
+ }
+ return !_timeout;
+ }
+};
+
+
+/**
+ * A countdown latch helps one or more threads wait for the completion
+ * of a number of operations performed by other threads. Specifically,
+ * any thread invoking the await method will block until the countDown
+ * method has been invoked an appropriate number of times. The
+ * countdown latch is created with a count. Each invocation of
+ * countDown will reduce the current count. When the count reaches 0,
+ * the threads blocked in await will be unblocked. When the count is
+ * 0, additional invocations of await will not block and additional
+ * invocations of countDown will have no effect.
+ **/
+class CountDownLatch
+{
+private:
+ Monitor _monitor;
+ uint32_t _count;
+
+ CountDownLatch(const CountDownLatch &rhs);
+ CountDownLatch &operator=(const CountDownLatch &rhs);
+
+public:
+ /**
+ * Create a countdown latch with the given initial count.
+ *
+ * @param cnt initial count
+ **/
+ CountDownLatch(uint32_t cnt) : _monitor(), _count(cnt) {}
+
+ /**
+ * Count down this latch. When the count reaches 0, all threads
+ * blocked in the await method will be unblocked.
+ **/
+ void countDown() {
+ MonitorGuard guard(_monitor);
+ if (_count == 0) {
+ return;
+ }
+ --_count;
+ if (_count == 0) {
+ guard.broadcast();
+ }
+ }
+
+ /**
+ * Wait for this latch to count down to 0. This method will block
+ * until the countDown method has been invoked enough times to
+ * reduce the count to 0.
+ **/
+ void await() {
+ MonitorGuard guard(_monitor);
+ while (_count != 0) {
+ guard.wait();
+ }
+ }
+
+ /**
+ * Wait for this latch to count down to 0. This method will block
+ * until the countDown method has been invoked enough times to
+ * reduce the count to 0 or the given amount of time has elapsed.
+ *
+ * @param maxwait the maximum number of milliseconds to wait
+ * @return true if the counter reached 0, false if we timed out
+ **/
+ bool await(int maxwait) {
+ MonitorGuard guard(_monitor);
+ TimedWaiter waiter(guard, maxwait);
+ while (_count != 0 && waiter.hasTime()) {
+ waiter.wait();
+ }
+ return (_count == 0);
+ }
+
+ /**
+ * Obtain the current count for this latch. This method is mostly
+ * useful for debugging and testing.
+ *
+ * @return current count
+ **/
+ uint32_t getCount() const {
+ return _count;
+ }
+
+ /**
+ * Empty. Needs to be virtual to reduce compiler warnings.
+ **/
+ virtual ~CountDownLatch() {}
+};
+
+
+/**
+ * A gate is a countdown latch with an initial count of 1, indicating
+ * that we are only waiting for a single operation to complete.
+ **/
+class Gate : public CountDownLatch
+{
+public:
+ /**
+ * Sets the initial count to 1.
+ **/
+ Gate() : CountDownLatch(1) {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/syncable.h b/vespalib/src/vespa/vespalib/util/syncable.h
new file mode 100644
index 00000000000..3da214257ae
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/syncable.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+namespace vespalib {
+
+/**
+ * An syncable is an interface that waits for something to complete.
+ **/
+class Syncable
+{
+public:
+ /**
+ * Synchronize with this executor. This function will block until
+ * all previously accepted tasks have been executed. This function
+ * uses the event barrier algorithm (tm).
+ *
+ * @return this object; for chaining
+ **/
+ virtual Syncable &sync() = 0;
+
+ virtual ~Syncable() {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/thread.cpp b/vespalib/src/vespa/vespalib/util/thread.cpp
new file mode 100644
index 00000000000..5ae7008a2c5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/thread.cpp
@@ -0,0 +1,92 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "thread.h"
+
+namespace vespalib {
+
+__thread Thread *Thread::_currentThread = 0;
+
+void
+Thread::Proxy::Run(FastOS_ThreadInterface *, void *)
+{
+ assert(_currentThread == 0);
+ _currentThread = &thread;
+ start.await();
+ if (!cancel) {
+ started.countDown();
+ runnable.run();
+ }
+ assert(_currentThread == &thread);
+ _currentThread = 0;
+}
+
+Thread::Thread(Runnable &runnable)
+ : _proxy(*this, runnable),
+ _pool(STACK_SIZE, 1),
+ _monitor(),
+ _stopped(false),
+ _woken(false)
+{
+ FastOS_ThreadInterface *thread = _pool.NewThread(&_proxy);
+ assert(thread != 0);
+ (void)thread;
+}
+
+Thread::~Thread()
+{
+ _proxy.cancel = true;
+ _proxy.start.countDown();
+}
+
+void
+Thread::start()
+{
+ _proxy.start.countDown();
+ _proxy.started.await();
+}
+
+Thread &
+Thread::stop()
+{
+ vespalib::MonitorGuard guard(_monitor);
+ _stopped = true;
+ guard.broadcast();
+ return *this;
+}
+
+void
+Thread::join()
+{
+ _pool.Close();
+}
+
+bool
+Thread::slumber(double s)
+{
+ vespalib::MonitorGuard guard(_monitor);
+ if (!_stopped || _woken) {
+ if (guard.wait((int)(s * 1000.0))) {
+ _woken = _stopped;
+ }
+ } else {
+ _woken = true;
+ }
+ return !_stopped;
+}
+
+Thread &
+Thread::currentThread()
+{
+ Thread *thread = _currentThread;
+ assert(thread != 0);
+ return *thread;
+}
+
+void
+Thread::sleep(size_t ms)
+{
+ FastOS_Thread::Sleep(ms);
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/thread.h b/vespalib/src/vespa/vespalib/util/thread.h
new file mode 100644
index 00000000000..a0c53986daf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/thread.h
@@ -0,0 +1,52 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "sync.h"
+#include "runnable.h"
+#include "active.h"
+
+namespace vespalib {
+
+/**
+ * Abstraction of the concept of running a single thread.
+ **/
+class Thread : public Active
+{
+private:
+ enum { STACK_SIZE = 256*1024 };
+ static __thread Thread *_currentThread;
+
+ struct Proxy : FastOS_Runnable {
+ Thread &thread;
+ Runnable &runnable;
+ vespalib::Gate start;
+ vespalib::Gate started;
+ bool cancel;
+
+ Proxy(Thread &parent, Runnable &target)
+ : thread(parent), runnable(target),
+ start(), started(), cancel(false) {}
+ virtual void Run(FastOS_ThreadInterface *thisThread, void *arguments);
+ };
+
+ Proxy _proxy;
+ FastOS_ThreadPool _pool;
+ vespalib::Monitor _monitor;
+ bool _stopped;
+ bool _woken;
+
+public:
+ Thread(Runnable &runnable);
+ ~Thread();
+ virtual void start();
+ virtual Thread &stop();
+ virtual void join();
+ bool stopped() const { return _stopped; }
+ bool slumber(double s);
+ static Thread &currentThread();
+ static void sleep(size_t ms);
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/thread_bundle.cpp b/vespalib/src/vespa/vespalib/util/thread_bundle.cpp
new file mode 100644
index 00000000000..600da7c1e06
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/thread_bundle.cpp
@@ -0,0 +1,8 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "thread_bundle.h"
+
+namespace vespalib {
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/thread_bundle.h b/vespalib/src/vespa/vespalib/util/thread_bundle.h
new file mode 100644
index 00000000000..9524852c5f2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/thread_bundle.h
@@ -0,0 +1,39 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "runnable.h"
+#include <vector>
+
+namespace vespalib {
+
+/**
+ * Interface used to separate the ownership and deployment of a
+ * collection of threads cooperating to perform a partitioned
+ * operation in parallel.
+ **/
+struct ThreadBundle {
+ /**
+ * The size of the thread bundle is defined to be the maximum
+ * number of runnables that can be performed in parallel by the
+ * run function.
+ *
+ * @return size of this thread bundle
+ **/
+ virtual size_t size() const = 0;
+
+ /**
+ * Performs all the given runnables in parallel and waits for
+ * their completion. This function cannot be called with more
+ * targets than the size of this bundle.
+ **/
+ virtual void run(const std::vector<Runnable*> &targets) = 0;
+
+ /**
+ * Empty virtual destructor to enable subclassing.
+ **/
+ virtual ~ThreadBundle() {}
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/threadexecutor.h b/vespalib/src/vespa/vespalib/util/threadexecutor.h
new file mode 100644
index 00000000000..b0250f04a06
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/threadexecutor.h
@@ -0,0 +1,21 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+#include <vespa/vespalib/util/executor.h>
+#include <vespa/vespalib/util/syncable.h>
+
+namespace vespalib {
+
+/**
+ * Can both execute and sync
+ **/
+class ThreadExecutor : public Executor,
+ public Syncable
+{
+public:
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/threadstackexecutor.cpp b/vespalib/src/vespa/vespalib/util/threadstackexecutor.cpp
new file mode 100644
index 00000000000..206fdd08bfc
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/threadstackexecutor.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "threadstackexecutor.h"
+
+namespace vespalib {
+
+//-----------------------------------------------------------------------------
+
+ThreadStackExecutor::ThreadStackExecutor(uint32_t threads, uint32_t stackSize, uint32_t taskLimit) :
+ ThreadStackExecutorBase(stackSize, taskLimit)
+{
+ start(threads);
+}
+
+bool
+ThreadStackExecutor::acceptNewTask(MonitorGuard &)
+{
+ return isRoomForNewTask();
+}
+
+void
+ThreadStackExecutor::wakeup(MonitorGuard &)
+{
+}
+
+ThreadStackExecutor::~ThreadStackExecutor()
+{
+ cleanup();
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/threadstackexecutor.h b/vespalib/src/vespa/vespalib/util/threadstackexecutor.h
new file mode 100644
index 00000000000..1dac0b5f336
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/threadstackexecutor.h
@@ -0,0 +1,50 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+#include "threadstackexecutorbase.h"
+
+namespace vespalib {
+
+/**
+ * An executor service that executes tasks in multiple threads.
+ **/
+class ThreadStackExecutor : public ThreadStackExecutorBase
+{
+public:
+ /**
+ * This will tell if a task will be accepted or not.
+ * An implementation might decide to block.
+ */
+ virtual bool acceptNewTask(MonitorGuard & monitor);
+
+ /**
+ * If blocking implementation, this might wake up any waiters.
+ *
+ * @param monitor to use for signaling.
+ */
+ virtual void wakeup(MonitorGuard & monitor);
+
+public:
+ /**
+ * Create a new thread stack executor. The task limit specifies
+ * the maximum number of tasks that are currently handled by this
+ * executor. Both the number of threads and the task limit must be
+ * greater than 0.
+ *
+ * @param threads number of worker threads (concurrent tasks)
+ * @param stackSize stack size per worker thread
+ * @param taskLimit upper limit on accepted tasks
+ **/
+ ThreadStackExecutor(uint32_t threads, uint32_t stackSize,
+ uint32_t taskLimit = 0xffffffff);
+
+ /**
+ * Will invoke cleanup.
+ **/
+ ~ThreadStackExecutor();
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/threadstackexecutorbase.cpp b/vespalib/src/vespa/vespalib/util/threadstackexecutorbase.cpp
new file mode 100644
index 00000000000..bee1d9c17ec
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/threadstackexecutorbase.cpp
@@ -0,0 +1,184 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "threadstackexecutorbase.h"
+
+namespace vespalib {
+
+void
+ThreadStackExecutorBase::assignTask(const TaggedTask &task, Worker &worker)
+{
+ MonitorGuard monitor(worker.monitor);
+ assert(worker.idle);
+ assert(worker.task.task == 0);
+ worker.idle = false;
+ worker.task = task;
+ monitor.signal();
+}
+
+bool
+ThreadStackExecutorBase::obtainTask(Worker &worker)
+{
+ {
+ MonitorGuard monitor(_monitor);
+ if (worker.task.task != 0) {
+ --_taskCount;
+ _barrier.completeEvent(worker.task.token);
+ worker.task.task = 0;
+ }
+ if (!_tasks.empty()) {
+ worker.task = _tasks.front();
+ _tasks.pop();
+ wakeup(monitor);
+ return true;
+ }
+ if (_closed) {
+ return false;
+ }
+ worker.idle = true;
+ _workers.push(&worker);
+ }
+ {
+ MonitorGuard monitor(worker.monitor);
+ while (worker.idle) {
+ monitor.wait();
+ }
+ }
+ return (worker.task.task != 0);
+}
+
+void
+ThreadStackExecutorBase::Run(FastOS_ThreadInterface *, void *)
+{
+ Worker worker;
+ while (obtainTask(worker)) {
+ worker.task.task->run();
+ delete worker.task.task;
+ }
+ _executorCompletion.await(); // to allow unsafe signaling
+}
+
+//-----------------------------------------------------------------------------
+
+ThreadStackExecutorBase::ThreadStackExecutorBase(uint32_t stackSize,
+ uint32_t taskLimit)
+ : _pool(stackSize),
+ _monitor(),
+ _stats(),
+ _executorCompletion(),
+ _tasks(),
+ _workers(),
+ _barrier(),
+ _taskCount(0),
+ _taskLimit(taskLimit),
+ _closed(false)
+{
+ assert(taskLimit > 0);
+}
+
+void
+ThreadStackExecutorBase::start(uint32_t threads)
+{
+ assert(threads > 0);
+ for (uint32_t i = 0; i < threads; ++i) {
+ FastOS_ThreadInterface *thread = _pool.NewThread(this);
+ assert(thread != 0);
+ (void)thread;
+ }
+}
+
+ThreadStackExecutorBase::Stats
+ThreadStackExecutorBase::getStats()
+{
+ LockGuard lock(_monitor);
+ Stats stats = _stats;
+ _stats = Stats();
+ _stats.maxPendingTasks = _taskCount;
+ return stats;
+}
+
+bool
+ThreadStackExecutorBase::acceptNewTask(MonitorGuard & guard)
+{
+ (void) guard;
+ return (_taskCount < _taskLimit);
+}
+
+void
+ThreadStackExecutorBase::wakeup(MonitorGuard & monitor)
+{
+ (void) monitor;
+}
+
+ThreadStackExecutorBase::Task::UP
+ThreadStackExecutorBase::execute(Task::UP task)
+{
+ MonitorGuard monitor(_monitor);
+ if (acceptNewTask(monitor)) {
+ TaggedTask taggedTask(task.release(), _barrier.startEvent());
+ ++_taskCount;
+ ++_stats.acceptedTasks;
+ _stats.maxPendingTasks = (_taskCount > _stats.maxPendingTasks)
+ ?_taskCount : _stats.maxPendingTasks;
+ if (!_workers.empty()) {
+ Worker *worker = _workers.back();
+ _workers.popBack();
+ monitor.unlock(); // <- UNLOCK
+ assignTask(taggedTask, *worker);
+ } else {
+ _tasks.push(taggedTask);
+ }
+ } else {
+ ++_stats.rejectedTasks;
+ }
+ return std::move(task);
+}
+
+ThreadStackExecutorBase &
+ThreadStackExecutorBase::shutdown()
+{
+ ArrayQueue<Worker*> idle;
+ {
+ MonitorGuard monitor(_monitor);
+ _closed = true;
+ _taskLimit = 0;
+ idle.swap(_workers);
+ assert(idle.empty() || _tasks.empty()); // idle -> empty queue
+ wakeup(monitor);
+ }
+ while (!idle.empty()) {
+ assignTask(TaggedTask(), *idle.back());
+ idle.popBack();
+ }
+ return *this;
+}
+
+ThreadStackExecutorBase &
+ThreadStackExecutorBase::sync()
+{
+ BarrierCompletion barrierCompletion;
+ {
+ LockGuard lock(_monitor);
+ if (!_barrier.startBarrier(barrierCompletion)) {
+ return *this;
+ }
+ }
+ barrierCompletion.gate.await();
+ return *this;
+}
+
+void
+ThreadStackExecutorBase::cleanup()
+{
+ shutdown().sync();
+ _executorCompletion.countDown();
+ _pool.Close();
+}
+
+ThreadStackExecutorBase::~ThreadStackExecutorBase()
+{
+ assert(_pool.isClosed());
+ assert(_taskCount == 0);
+}
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/threadstackexecutorbase.h b/vespalib/src/vespa/vespalib/util/threadstackexecutorbase.h
new file mode 100644
index 00000000000..f66cd74dae1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/threadstackexecutorbase.h
@@ -0,0 +1,170 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2010 Yahoo
+
+#pragma once
+
+#include "threadexecutor.h"
+#include "eventbarrier.hpp"
+#include "arrayqueue.hpp"
+#include "sync.h"
+#include <memory>
+#include "noncopyable.hpp"
+
+namespace vespalib {
+
+/**
+ * An executor service that executes tasks in multiple threads.
+ **/
+class ThreadStackExecutorBase : public ThreadExecutor,
+ public FastOS_Runnable,
+ public noncopyable
+{
+public:
+ /**
+ * Internal stats that we want to observe externally. Note that
+ * all stats are reset each time they are observed.
+ **/
+ struct Stats {
+ size_t maxPendingTasks;
+ size_t acceptedTasks;
+ size_t rejectedTasks;
+ Stats() : maxPendingTasks(0), acceptedTasks(0), rejectedTasks(0) {}
+ };
+
+private:
+ struct TaggedTask {
+ Task *task;
+ uint32_t token;
+ TaggedTask() : task(0), token(0) {}
+ TaggedTask(Task *task_in, uint32_t token_in)
+ : task(task_in), token(token_in) {}
+ };
+
+ struct Worker {
+ Monitor monitor;
+ bool idle;
+ TaggedTask task;
+ Worker() : monitor(), idle(false), task() {}
+ };
+
+ struct BarrierCompletion {
+ Gate gate;
+ void completeBarrier() { gate.countDown(); }
+ };
+
+ FastOS_ThreadPool _pool;
+ Monitor _monitor;
+ Stats _stats;
+ Gate _executorCompletion;
+ ArrayQueue<TaggedTask> _tasks;
+ ArrayQueue<Worker*> _workers;
+ EventBarrier<BarrierCompletion> _barrier;
+ uint32_t _taskCount;
+ uint32_t _taskLimit;
+ bool _closed;
+
+ /**
+ * Assign the given task to the given idle worker. This will wake
+ * up a worker thread that is blocked in the obtainTask function.
+ *
+ * @param task the task to assign
+ * @param worker an idle worker
+ **/
+ void assignTask(const TaggedTask &task, Worker &worker);
+
+ /**
+ * Obtain a new task to be run by the given worker. This function
+ * will block until a task is obtained or the executor is shut
+ * down.
+ *
+ * @return true if a task was obtained, false if we are done
+ * @param worker the worker looking for work
+ **/
+ bool obtainTask(Worker &worker);
+
+ // from FastOS_Runnable (all workers live here)
+ virtual void Run(FastOS_ThreadInterface *, void *);
+
+protected:
+ /**
+ * This will tell if a task will be accepted or not.
+ * An implementation might decide to block.
+ */
+ virtual bool acceptNewTask(MonitorGuard & monitor) = 0;
+
+ /**
+ * If blocking implementation, this might wake up any waiters.
+ *
+ * @param monitor to use for signaling.
+ */
+ virtual void wakeup(MonitorGuard & monitor) = 0;
+
+ /**
+ * Will tell you if the executor has been closed for new tasks.
+ */
+ bool closed() const { return _closed; }
+
+ /**
+ * This will cleanup before destruction. All implementations must call this
+ * in destructor.
+ */
+ void cleanup();
+
+ /**
+ * Will tell if there is room for a new task in the Q.
+ */
+ bool isRoomForNewTask() const { return (_taskCount < _taskLimit); }
+
+ /**
+ * Create a new thread stack executor. The task limit specifies
+ * the maximum number of tasks that are currently handled by this
+ * executor. Both the number of threads and the task limit must be
+ * greater than 0.
+ *
+ * @param stackSize stack size per worker thread
+ * @param taskLimit upper limit on accepted tasks
+ **/
+ ThreadStackExecutorBase(uint32_t stackSize, uint32_t taskLimit);
+ /**
+ * This will start the theads. This is to avoid starting tasks in
+ * constructor of base class.
+ *
+ * @param threads number of worker threads (concurrent tasks)
+ */
+ void start(uint32_t threads);
+public:
+ /**
+ * Observe and reset stats for this object.
+ *
+ * @return stats
+ **/
+ Stats getStats();
+
+ // inherited from Executor
+ virtual Task::UP execute(Task::UP task);
+
+ /**
+ * Synchronize with this executor. This function will block until
+ * all previously accepted tasks have been executed. This function
+ * uses the event barrier algorithm (tm).
+ *
+ * @return this object; for chaining
+ **/
+ virtual ThreadStackExecutorBase &sync();
+
+ /**
+ * Shut down this executor. This will make this executor reject
+ * all new tasks.
+ *
+ * @return this object; for chaining
+ **/
+ ThreadStackExecutorBase &shutdown();
+
+ /**
+ * Will invoke shutdown then sync.
+ **/
+ ~ThreadStackExecutorBase();
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/time_tracker.cpp b/vespalib/src/vespa/vespalib/util/time_tracker.cpp
new file mode 100644
index 00000000000..9a6db840ca2
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/time_tracker.cpp
@@ -0,0 +1,83 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/log/log.h>
+LOG_SETUP(".time_tracer");
+#include <vespa/fastos/fastos.h>
+#include "time_tracker.h"
+#include "stringfmt.h"
+
+namespace vespalib {
+
+void
+TimeTracker::build_stats_string(const std::vector<Task> &tasks, uint32_t level,
+ vespalib::string level_name, vespalib::string &out)
+{
+ for (auto task: tasks) {
+ vespalib::string name = (level == 0)
+ ? task.name
+ : make_string("%s.%s", level_name.c_str(), task.name.c_str());
+ out.append(make_string("%*s%s: %g ms\n", (level * 4), "", name.c_str(), task.ms()));
+ build_stats_string(task.sub_tasks, (level + 1), name, out);
+ }
+}
+
+std::vector<TimeTracker::Task> &
+TimeTracker::find_tasks(std::vector<Task> &tasks, uint32_t level) {
+ if (level == 0) {
+ return tasks;
+ }
+ assert(!tasks.empty());
+ return find_tasks(tasks.back().sub_tasks, (level - 1));
+}
+
+void
+TimeTracker::open_task(const char *name)
+{
+ if (++_current_level <= _max_level) {
+ std::vector<TimeTracker::Task> &tasks = find_tasks(_tasks, (_current_level - 1));
+ tasks.emplace_back(name);
+ }
+}
+
+void
+TimeTracker::close_task()
+{
+ assert(_current_level > 0);
+ if (--_current_level < _max_level) {
+ std::vector<TimeTracker::Task> &tasks = find_tasks(_tasks, _current_level);
+ assert(!tasks.empty());
+ tasks.back().close_task();
+ }
+}
+
+vespalib::string
+TimeTracker::get_stats()
+{
+ vespalib::string out;
+ build_stats_string(_tasks, 0, "", out);
+ return out;
+}
+
+namespace time_tracker {
+
+__thread ThreadBinder *ThreadBinder::tl_current_binder = nullptr;
+
+ThreadBinder::ThreadBinder(TimeTracker &tracker_in)
+ : tracker(tracker_in),
+ parent_binder(tl_current_binder)
+{
+ tl_current_binder = (tracker.max_level() > 0)? this : nullptr;
+}
+
+ThreadBinder::~ThreadBinder() {
+ if (tracker.max_level() > 0) {
+ assert(tl_current_binder == this);
+ } else {
+ assert(tl_current_binder == nullptr);
+ }
+ tl_current_binder = parent_binder;
+}
+
+} // namespace vespalib::time_tracker
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/time_tracker.h b/vespalib/src/vespa/vespalib/util/time_tracker.h
new file mode 100644
index 00000000000..ab50a4f33ca
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/time_tracker.h
@@ -0,0 +1,89 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <vector>
+
+namespace vespalib {
+
+//-----------------------------------------------------------------------------
+
+class TimeTracker
+{
+private:
+ struct Task {
+ vespalib::string name;
+ fastos::StopWatch task_time;
+ std::vector<Task> sub_tasks;
+ Task(const char *name_in) : name(name_in), task_time() { task_time.start(); }
+ void close_task() { task_time.stop(); }
+ double ms() const { return (task_time.elapsed().sec() * 1000.0); }
+ };
+
+ std::vector<Task> _tasks;
+ uint32_t _current_level;
+ uint32_t _max_level;
+
+ static void build_stats_string(const std::vector<Task> &tasks, uint32_t level,
+ vespalib::string level_name, vespalib::string &out);
+ static std::vector<Task> &find_tasks(std::vector<Task> &tasks, uint32_t level);
+
+public:
+ explicit TimeTracker(uint32_t max_level_in)
+ : _tasks(), _current_level(0), _max_level(max_level_in) {}
+ ~TimeTracker() { assert(_current_level == 0); }
+ uint32_t level() const { return _current_level; }
+ uint32_t max_level() const { return _max_level; }
+ void open_task(const char *name);
+ void close_task();
+ vespalib::string get_stats();
+};
+
+//-----------------------------------------------------------------------------
+
+namespace time_tracker {
+
+struct ThreadBinder {
+ TimeTracker &tracker;
+ ThreadBinder *parent_binder;
+ static __thread ThreadBinder *tl_current_binder;
+ ThreadBinder(ThreadBinder &&) = delete;
+ ThreadBinder(const ThreadBinder &) = delete;
+ explicit ThreadBinder(TimeTracker &tracker_in);
+ ~ThreadBinder();
+};
+
+void open_task(const char *name) {
+ if (__builtin_expect(ThreadBinder::tl_current_binder != nullptr, false)) {
+ ThreadBinder::tl_current_binder->tracker.open_task(name);
+ }
+}
+
+void close_task() {
+ if (__builtin_expect(ThreadBinder::tl_current_binder != nullptr, false)) {
+ ThreadBinder::tl_current_binder->tracker.close_task();
+ }
+}
+
+struct Scope {
+ Scope(Scope &&) = delete;
+ Scope(const Scope &) = delete;
+ Scope(const char *name) { open_task(name); }
+ ~Scope() { close_task(); }
+};
+
+} // namespace vespalib::time_tracker
+
+//-----------------------------------------------------------------------------
+
+#define TIMED_CAT_IMPL(a, b) a ## b
+#define TIMED_CAT(a, b) TIMED_CAT_IMPL(a, b)
+#define TIMED_THREAD(tracer) ::vespalib::time_tracker::ThreadBinder TIMED_CAT(timed_thread_, __LINE__)(tracer)
+#define TIMED_SCOPE(name) ::vespalib::time_tracker::Scope TIMED_CAT(timed_scope_, __LINE__)(name)
+#define TIMED(name, code) do { ::vespalib::time_tracker::open_task(name); code; ::vespalib::time_tracker::close_task(); } while(false)
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/traits.h b/vespalib/src/vespa/vespalib/util/traits.h
new file mode 100644
index 00000000000..4d7abeb9c82
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/traits.h
@@ -0,0 +1,42 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <type_traits>
+
+namespace vespalib {
+
+//-----------------------------------------------------------------------------
+
+namespace is_copyable_magic {
+template <typename T> static const T& makeConstRef();
+template <typename T> static decltype(T(makeConstRef<T>()), 'y') check(int);
+template <typename ...> static int check(...);
+}
+
+template <typename T>
+struct is_copyable : std::integral_constant<bool, (sizeof(is_copyable_magic::check<T>(0)) == sizeof('y'))> {};
+
+//-----------------------------------------------------------------------------
+
+struct void_tag { void_tag() = delete; };
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+struct can_skip_destruction : std::is_trivially_destructible<T> {};
+
+// Macro used to indicate that it is safe to skip destruction of
+// objects of class T. This macro can only be used in the global
+// namespace. This macro will typically be used to tag classes that do
+// not classify as trivially destructible because they inherit an
+// empty virtual destructor.
+#define VESPA_CAN_SKIP_DESTRUCTION(T) \
+ namespace vespalib { \
+ template <> \
+ struct can_skip_destruction<T> : std::true_type {}; \
+ }
+
+//-----------------------------------------------------------------------------
+
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/trinary.h b/vespalib/src/vespa/vespalib/util/trinary.h
new file mode 100644
index 00000000000..833ed5c5186
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/trinary.h
@@ -0,0 +1,12 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib {
+
+enum class Trinary {
+ True, False, Undefined
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/valgrind.cpp b/vespalib/src/vespa/vespalib/util/valgrind.cpp
new file mode 100644
index 00000000000..a40776e261a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/valgrind.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/valgrind.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+namespace vespalib {
+
+size_t Valgrind::testSystemCall(const void * buf, size_t sz)
+{
+ int fh = open("/dev/null", O_RDWR, 0644);
+ assert (fh != -1);
+ size_t written = write(fh, buf, sz);
+ close(fh);
+ assert(written == sz);
+ return written;
+}
+
+size_t Valgrind::testUninitialized(const void * buf, size_t sz)
+{
+ size_t sum(0);
+ const char * b(static_cast<const char *>(buf));
+ for(size_t i(0); i < sz; i++) {
+ sum += b[i];
+ }
+ return sum;
+}
+
+
+}
diff --git a/vespalib/src/vespa/vespalib/util/valgrind.h b/vespalib/src/vespa/vespalib/util/valgrind.h
new file mode 100644
index 00000000000..a2e29a6435d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/valgrind.h
@@ -0,0 +1,33 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <sys/types.h>
+
+namespace vespalib {
+
+/**
+ * utilities to help valgrind perform better checking of your program
+ **/
+class Valgrind
+{
+public:
+ /**
+ * This method will write the buffer to '/dev/null' and thereby provoke the
+ * valgrind check of parameters to system calls.
+ * @param buf The buffer to write.
+ * @param sz The size of the buffer
+ * @return The number of bytes written.
+ */
+ static size_t testSystemCall(const void * buf, size_t sz);
+ /**
+ * This method will use the buffer given in a way that will trigger valgrind
+ * check for uninitialized data.
+ * @param buf The buffer to check.
+ * @param sz The size of the buffer
+ * @return Just a hash value of the buffer.
+ */
+ static size_t testUninitialized(const void * buf, size_t sz);
+};
+
+}
+
diff --git a/vespalib/src/vespa/vespalib/util/vstringfmt.h b/vespalib/src/vespa/vespalib/util/vstringfmt.h
new file mode 100644
index 00000000000..f9b4b0dbfcf
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/vstringfmt.h
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <stdarg.h>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+
+extern vespalib::string make_vespa_string_va(const char *fmt, va_list ap);
+
+extern vespalib::string make_vespa_string(const char *fmt, ...)
+#ifdef __GNUC__
+ // Add printf format checks with gcc
+ __attribute__ ((format (printf,1,2)))
+#endif
+ ;
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/util/weakref.h b/vespalib/src/vespa/vespalib/util/weakref.h
new file mode 100644
index 00000000000..d713ac2e1c8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/weakref.h
@@ -0,0 +1,259 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright (C) 2005 Overture Services Norway AS
+
+#pragma once
+
+#include <algorithm>
+#include <vespa/vespalib/util/sync.h>
+#include <vespa/vespalib/util/atomic.h>
+
+namespace vespalib {
+
+/**
+ * @brief A WeakRef is a pointer to an object that may disappear
+ *
+ * The object pointer is owned by a WeakRef::Owner. The owner can
+ * decide to remove the pointer at any time, but not while it is being
+ * used. To signal that a WeakRef is being used, you need to create a
+ * WeakRef::Usage. This will ensure that the pointer is not removed
+ * until you are done using it.
+ **/
+template <typename T>
+class WeakRef
+{
+public:
+ class Usage;
+ friend class WeakRef::Usage;
+private:
+ struct Core {
+ Monitor monitor;
+ uint32_t refcnt;
+ uint32_t usecnt;
+ bool dead;
+ T *pt;
+
+ Core(T *p) : monitor("WeakRef::Core", true),
+ refcnt(1), usecnt(0), dead(false), pt(p) {}
+ ~Core() {
+ assert(refcnt == 0);
+ assert(usecnt == 0);
+ assert(dead);
+ assert(pt == 0);
+ }
+
+ Core *getRef() {
+ Atomic::postInc(&refcnt);
+ return this;
+ }
+
+ void dropRef() {
+ if (Atomic::postDec(&refcnt) != 1) {
+ return;
+ }
+ delete this;
+ }
+
+ Core *getUse() {
+ MonitorGuard mon(monitor);
+ if (dead) {
+ return 0;
+ }
+ ++usecnt;
+ return getRef();
+ }
+
+ void dropUse() {
+ {
+ MonitorGuard mon(monitor);
+ --usecnt;
+ if (dead && usecnt == 0) {
+ mon.signal();
+ }
+ }
+ dropRef();
+ }
+
+ void kill() {
+ {
+ MonitorGuard mon(monitor);
+ dead = true;
+ while (usecnt != 0) {
+ mon.wait();
+ }
+ pt = 0;
+ }
+ dropRef();
+ }
+
+ private:
+ Core(const Core &);
+ Core &operator=(const Core &);
+ };
+
+public:
+ /**
+ * @brief A WeakRef::Owner owns the object pointer used by WeakRef
+ * instances.
+ **/
+ class Owner {
+ friend class WeakRef;
+
+ private:
+ Core *_core;
+ Owner(const Owner &);
+ Owner &operator=(const Owner &);
+
+ Core *getRef() const { return (_core != 0) ? _core->getRef() : 0; }
+
+ public:
+ /**
+ * @brief Create an owner with the given pointer
+ *
+ * @param pt object pointer
+ **/
+ Owner(T *pt) : _core(new Core(pt)) {}
+
+ /**
+ * @brief Remove the object pointer
+ *
+ * This method will block until all current usage of the
+ * object pointer is complete (All WeakRef::Usage instances
+ * created from WeakRef instances based on this WeakRef::Owner
+ * has been destructed). Any further usage of the object
+ * pointer will be denied.
+ **/
+ void clear() {
+ if (_core != 0) {
+ _core->kill();
+ _core = 0;
+ }
+ }
+
+ /**
+ * @brief Remove the object pointer if it is not yet removed
+ *
+ * Note that if you use an embedded owner to point to the
+ * embedding object, you should invoke the clear method at an
+ * earlier stage in the destruction process of the embedding
+ * object to avoid a weak reference to a half-destructed
+ * object.
+ **/
+ ~Owner() { clear(); }
+ };
+
+ /**
+ * @brief A WeakRef::Usage signals that a WeakRef is in use
+ **/
+ class Usage {
+ private:
+ Core *_core;
+ Usage(const Usage &);
+ Usage &operator=(const Usage &);
+
+ public:
+ /**
+ * @brief Start using the given WeakRef
+ *
+ * @param rhs the WeakRef you want to use
+ **/
+ Usage(const WeakRef &rhs) : _core(rhs.getUse()) {}
+
+ /**
+ * @brief Stop using the underlying WeakRef
+ *
+ * This will signal that the WeakRef given in the constructor
+ * is no longer in use.
+ **/
+ ~Usage() {
+ if (_core != 0) {
+ _core->dropUse();
+ }
+ }
+
+ /**
+ * @brief Check if the object pointer is valid
+ *
+ * This method will return false if we try to use a WeakRef
+ * after the WeakRef::Owner has cleared the object pointer. If
+ * this method returns true, the object pointer will not
+ * become invalid while this object is alive.
+ *
+ * @return true if the object pointer is still valid
+ **/
+ bool valid() const { return (_core != 0); }
+
+ /**
+ * @brief Access the weakly referenced object
+ *
+ * This is the preferred way to access the weakly referenced
+ * object as it makes the usage object act as a smart pointer.
+ *
+ * @return object pointer
+ **/
+ T *operator->() const { return _core->pt; }
+
+ /**
+ * @brief Obtain the weakly referenced object
+ *
+ * @return object pointer
+ **/
+ T *get() const { return _core->pt; }
+ };
+
+private:
+ Core *_core;
+
+ Core *getRef() const { return (_core != 0) ? _core->getRef() : 0; }
+ Core *getUse() const { return (_core != 0) ? _core->getUse() : 0; }
+
+public:
+ /**
+ * @brief Create a WeakRef not pointing to anything
+ **/
+ WeakRef() : _core(0) {}
+
+ /**
+ * @brief Copy constructor
+ *
+ * This will result in a WeakRef pointing to the same object as
+ * <i>rhs</i>
+ *
+ * @param rhs copy this
+ **/
+ WeakRef(const WeakRef &rhs) : _core(rhs.getRef()) {}
+
+ /**
+ * @brief Create a WeakRef based on the given WeakRef::Owner
+ *
+ * This WeakRef will point to the object dictated by rhs
+ *
+ * @param rhs pointer owner
+ **/
+ WeakRef(const WeakRef::Owner &rhs) : _core(rhs.getRef()) {}
+
+ /**
+ * @brief Assignment operator
+ *
+ * This is implemented as a copy-swap-delete operation.
+ *
+ * @return reference to this
+ * @param rhs copy this
+ **/
+ WeakRef &operator=(const WeakRef &rhs) {
+ WeakRef tmp(rhs);
+ std::swap(tmp._core, _core);
+ return *this;
+ }
+
+ /**
+ * @brief Perform internal cleanup.
+ **/
+ ~WeakRef() {
+ if (_core != 0) {
+ _core->dropRef();
+ }
+ }
+};
+
+} // namespace vespalib
+
diff --git a/vespalib/src/vespa/vespalib/websocket/CMakeLists.txt b/vespalib/src/vespa/vespalib/websocket/CMakeLists.txt
new file mode 100644
index 00000000000..172008d2a73
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_websocket OBJECT
+ SOURCES
+ acceptor.cpp
+ buffer.cpp
+ connection.cpp
+ frame.cpp
+ handler.cpp
+ key.cpp
+ request.cpp
+ server_socket.cpp
+ socket.cpp
+ websocket_server.cpp
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/websocket/README b/vespalib/src/vespa/vespalib/websocket/README
new file mode 100644
index 00000000000..5ecb11cbb12
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/README
@@ -0,0 +1,22 @@
+NOTE:
+
+(0) if you use this code and something breaks; it is your own fault.
+
+(1) this code is experimental and will probably undergo large changes
+before it is ready for production use.
+
+(2) please do not use this code in your applications just yet.
+
+(3) if you have any questions/suggestions about the code, please
+contact havardpe@yahoo-inc.com
+
+(4) the goal of this library:
+- accept websocket connections for application resources
+- serve simple HTTP GET requests (read only)
+- negotiate custom binary connections (fs4 packet protocol, fnet rpc)
+
+(5) what to build on top:
+- Remote Slime Message Passing over websockets (next-gen rpc)
+- back-end state API serving
+- json (text) binding to slime messaging (rpc from browser javascript)
+- HTTP tunneling of application data (cross-colo feeding)
diff --git a/vespalib/src/vespa/vespalib/websocket/acceptor.cpp b/vespalib/src/vespa/vespalib/websocket/acceptor.cpp
new file mode 100644
index 00000000000..53b6f64ceee
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/acceptor.cpp
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "acceptor.h"
+#include <functional>
+
+namespace vespalib {
+namespace ws {
+
+void
+Acceptor::accept_main(Handler<Socket> &socket_handler)
+{
+ while (!_server_socket.is_closed()) {
+ Socket::UP socket = _server_socket.accept();
+ if (socket) {
+ socket_handler.handle(std::move(socket));
+ }
+ }
+}
+
+Acceptor::Acceptor(int port_in, Handler<Socket> &socket_handler)
+ : _server_socket(port_in),
+ _accept_thread(&Acceptor::accept_main, this, std::ref(socket_handler))
+{
+}
+
+Acceptor::~Acceptor()
+{
+ _server_socket.close();
+ _accept_thread.join();
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/acceptor.h b/vespalib/src/vespa/vespalib/websocket/acceptor.h
new file mode 100644
index 00000000000..6d6965b4a80
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/acceptor.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include "handler.h"
+#include "server_socket.h"
+#include <thread>
+
+namespace vespalib {
+namespace ws {
+
+class Acceptor {
+private:
+ ServerSocket _server_socket;
+ std::thread _accept_thread;
+
+ void accept_main(Handler<Socket> &socket_handler);
+
+public:
+ Acceptor(int port_in, Handler<Socket> &socket_handler);
+ ~Acceptor();
+ int port() { return _server_socket.port(); }
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/buffer.cpp b/vespalib/src/vespa/vespalib/websocket/buffer.cpp
new file mode 100644
index 00000000000..de4c61bf9d9
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/buffer.cpp
@@ -0,0 +1,22 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "buffer.h"
+
+namespace vespalib {
+namespace ws {
+
+void
+Buffer::ensure_free(size_t bytes)
+{
+ memmove(&_data[0], &_data[_read_pos], used());
+ _write_pos -= _read_pos;
+ _read_pos = 0;
+ if (free() < bytes) {
+ _data.resize(_write_pos + bytes);
+ }
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/buffer.h b/vespalib/src/vespa/vespalib/websocket/buffer.h
new file mode 100644
index 00000000000..eee9085304a
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/buffer.h
@@ -0,0 +1,46 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include <memory>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+namespace ws {
+
+class Buffer
+{
+private:
+ std::vector<char> _data;
+ size_t _read_pos;
+ size_t _write_pos;
+ void ensure_free(size_t bytes);
+public:
+ Buffer() : _data(), _read_pos(0), _write_pos(0) {}
+ void clear() {
+ _read_pos = 0;
+ _write_pos = 0;
+ }
+ size_t dead() const { return _read_pos; }
+ size_t used() const { return (_write_pos - _read_pos); }
+ size_t free() const { return (_data.size() - _write_pos); }
+ bool has_next() const { return (used() > 0); }
+ char next() { return _data[_read_pos++]; }
+ void push(char value) {
+ *reserve(1) = value;
+ commit(1);
+ }
+ const char *obtain() const { return &_data[_read_pos]; }
+ void evict(size_t bytes) { _read_pos += bytes; }
+ char *reserve(size_t bytes) {
+ if (free() < bytes) {
+ ensure_free(bytes);
+ }
+ return &_data[_write_pos];
+ }
+ void commit(size_t bytes) { _write_pos += bytes; }
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/connection.cpp b/vespalib/src/vespa/vespalib/websocket/connection.cpp
new file mode 100644
index 00000000000..d0a0af8dd33
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/connection.cpp
@@ -0,0 +1,208 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "connection.h"
+
+namespace vespalib {
+namespace ws {
+
+namespace {
+
+void stripCR(vespalib::string &dst) {
+ if (!dst.empty() && dst[dst.size() - 1] == '\r') {
+ dst.resize(dst.size() - 1);
+ }
+}
+
+Frame::Type type_from_opcode(char opcode) {
+ switch (opcode) {
+ case 0x0: return Frame::Type::NONE;
+ case 0x1: return Frame::Type::TEXT;
+ case 0x2: return Frame::Type::DATA;
+ case 0x8: return Frame::Type::PING;
+ case 0x9: return Frame::Type::PONG;
+ case 0xa: return Frame::Type::CLOSE;
+ default: return Frame::Type::INVALID;
+ }
+}
+
+char opcode_from_type(Frame::Type type) {
+ switch (type) {
+ case Frame::Type::NONE: return 0x0;
+ case Frame::Type::TEXT: return 0x1;
+ case Frame::Type::DATA: return 0x2;
+ case Frame::Type::PING: return 0x8;
+ case Frame::Type::PONG: return 0x9;
+ case Frame::Type::CLOSE: return 0xa;
+ default: return 0xf;
+ }
+}
+
+} // namespace vespalib::ws::<unnamed>
+
+
+Connection::Connection(Socket::UP socket)
+ : _socket(std::move(socket)),
+ _input(),
+ _output()
+{
+}
+
+bool
+Connection::fill_input(size_t min_bytes)
+{
+ while (_input.used() < min_bytes) {
+ size_t max_read = (8 * 1024);
+ char *ptr = _input.reserve(max_read);
+ ssize_t read_res = _socket->read(ptr, max_read);
+ if (read_res > 0) {
+ _input.commit(read_res);
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+Connection::read_line(string &dst)
+{
+ dst.clear();
+ for (int c = read_byte(); c >= 0; c = read_byte()) {
+ if (c != '\n') {
+ dst.push_back(c);
+ } else {
+ stripCR(dst);
+ return true;
+ }
+ }
+ return !dst.empty();
+}
+
+bool
+Connection::read_frame(Frame &frame)
+{
+ if (!fill_input(2)) {
+ return false;
+ }
+ char h1 = _input.next();
+ char h2 = _input.next();
+ frame.type = type_from_opcode(h1 & 0x0f);
+ frame.last = ((h1 & 0x80) != 0);
+ frame.payload.clear();
+ size_t len = (h2 & 0x7f);
+ if (len > 125) {
+ size_t len_bytes = (len == 127) ? 8 : 2;
+ if (!fill_input(len_bytes)) {
+ return false;
+ }
+ len = 0;
+ for (size_t i = 0; i < len_bytes; ++i) {
+ len = (len << 8) + (_input.next() & 0xff);
+ }
+ }
+ char mask[4];
+ bool use_mask = ((h2 & 0x80) != 0);
+ if (use_mask) {
+ if (!fill_input(4)) {
+ return false;
+ }
+ for (size_t i = 0; i < 4; ++i) {
+ mask[i] = _input.next();
+ }
+ }
+ if (!fill_input(len)) {
+ return false;
+ }
+ const char *src = _input.obtain();
+ char *dst = frame.payload.reserve(len);
+ if (use_mask) {
+ for (size_t i = 0; i < len; ++i) {
+ dst[i] = (src[i] ^ mask[i & 0x3]);
+ }
+ } else {
+ memcpy(dst, src, len);
+ }
+ frame.payload.commit(len);
+ _input.evict(len);
+ return true;
+}
+
+void
+Connection::write_frame(const Frame &frame)
+{
+ size_t len = frame.payload.used();
+ bool large_len = (len > 125);
+ bool huge_len = (len > 0xffFF);
+ char h1 = opcode_from_type(frame.type);
+ if (frame.last) {
+ h1 |= 0x80;
+ }
+ char h2 = (large_len) ? 126 : len;
+ if (huge_len) {
+ ++h2;
+ }
+ _output.push(h1);
+ _output.push(h2);
+ if (large_len) {
+ size_t len_bytes = (huge_len) ? 8 : 2;
+ size_t len_src = len;
+ char *len_dst = _output.reserve(len_bytes);
+ for (size_t i = len_bytes; i > 0; --i) {
+ len_dst[i - 1] = (len_src & 0xff);
+ len_src >>= 8;
+ }
+ _output.commit(len_bytes);
+ }
+ char *dst = _output.reserve(len);
+ memcpy(dst, frame.payload.obtain(), len);
+ _output.commit(len);
+}
+
+void
+Connection::printf(const char *fmt, ...)
+{
+ char *dst = _output.reserve(256);
+ int space = _output.free();
+ int size;
+ va_list ap;
+ va_start(ap, fmt);
+ size = vsnprintf(dst, space, fmt, ap);
+ va_end(ap);
+ assert(size >= 0);
+ if (size >= space) {
+ space = size + 1;
+ dst = _output.reserve(space);
+ va_start(ap, fmt);
+ size = vsnprintf(dst, space, fmt, ap);
+ va_end(ap);
+ assert((size + 1) == space);
+ }
+ _output.commit(size);
+}
+
+void
+Connection::write(const char *data, size_t len)
+{
+ char *dst = _output.reserve(len);
+ memcpy(dst, data, len);
+ _output.commit(len);
+}
+
+bool
+Connection::flush()
+{
+ while (_output.used() > 0) {
+ ssize_t write_res = _socket->write(_output.obtain(), _output.used());
+ if (write_res > 0) {
+ _output.evict(write_res);
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/connection.h b/vespalib/src/vespa/vespalib/websocket/connection.h
new file mode 100644
index 00000000000..0cb3433ce4f
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/connection.h
@@ -0,0 +1,54 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include "socket.h"
+#include "buffer.h"
+#include "frame.h"
+
+namespace vespalib {
+namespace ws {
+
+class Connection
+{
+private:
+ Socket::UP _socket;
+ Buffer _input;
+ Buffer _output;
+
+ bool fill_input(size_t min_bytes);
+
+public:
+ typedef std::unique_ptr<Connection> UP;
+ explicit Connection(Socket::UP socket);
+
+ int read_byte() {
+ if (!_input.has_next()) {
+ if (!fill_input(1)) {
+ return -1;
+ }
+ }
+ return (_input.next() & 0xff);
+ }
+
+ bool read_line(vespalib::string &dst);
+
+ bool read_frame(Frame &frame);
+
+ void write_frame(const Frame &frame);
+
+ void printf(const char *fmt, ...)
+#ifdef __GNUC__
+ // Add printf format checks with gcc
+ __attribute__ ((format (printf,2,3)))
+#endif
+ ;
+
+ void write(const char *data, size_t len);
+
+ bool flush();
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/frame.cpp b/vespalib/src/vespa/vespalib/websocket/frame.cpp
new file mode 100644
index 00000000000..43aff81f599
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/frame.cpp
@@ -0,0 +1,11 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "frame.h"
+
+namespace vespalib {
+namespace ws {
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/frame.h b/vespalib/src/vespa/vespalib/websocket/frame.h
new file mode 100644
index 00000000000..db95e204976
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/frame.h
@@ -0,0 +1,22 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include <memory>
+#include <vespa/vespalib/stllike/string.h>
+#include "buffer.h"
+
+namespace vespalib {
+namespace ws {
+
+struct Frame {
+ enum class Type { NONE, TEXT, DATA, PING, PONG, CLOSE, INVALID };
+ Type type;
+ bool last;
+ Buffer payload;
+ Frame() : type(Type::INVALID), last(true), payload() {}
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/handler.cpp b/vespalib/src/vespa/vespalib/websocket/handler.cpp
new file mode 100644
index 00000000000..28229e2816b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/handler.cpp
@@ -0,0 +1,19 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "handler.h"
+
+namespace vespalib {
+namespace ws {
+
+namespace {
+
+struct DummyItem {};
+
+} // namespace vespalib::ws::<unnamed>
+
+template class Handler<DummyItem>;
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/handler.h b/vespalib/src/vespa/vespalib/websocket/handler.h
new file mode 100644
index 00000000000..8d0d6c8860d
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/handler.h
@@ -0,0 +1,22 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include <memory>
+
+namespace vespalib {
+namespace ws {
+
+/**
+ * A Handler is a component to whom you can pass an object.
+ **/
+template <typename T>
+struct Handler
+{
+ virtual void handle(std::unique_ptr<T> obj) = 0;
+ virtual ~Handler() {}
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/key.cpp b/vespalib/src/vespa/vespalib/websocket/key.cpp
new file mode 100644
index 00000000000..3091e924a48
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/key.cpp
@@ -0,0 +1,52 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "key.h"
+#include <vespa/vespalib/util/sha1.h>
+
+namespace vespalib {
+namespace ws {
+
+namespace {
+
+const char *base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/";
+
+char id(int value) { return base64_chars[value & 0x3f]; }
+vespalib::string encode64(const char *data, size_t len) {
+ uint8_t tmp[3];
+ vespalib::string result;
+ for (size_t i = 0; i < len; i += 3) {
+ tmp[0] = data[i];
+ tmp[1] = (i + 1 < len) ? data[i + 1] : 0;
+ tmp[2] = (i + 2 < len) ? data[i + 2] : 0;
+ result.append(id(tmp[0] >> 2));
+ result.append(id((tmp[0] << 4) | (tmp[1] >> 4)));
+ result.append((i + 1 < len) ? id((tmp[1] << 2) | (tmp[2] >> 6)) : '=');
+ result.append((i + 2 < len) ? id(tmp[2]) : '=');
+ }
+ return result;
+}
+
+} // namespace vespalib::ws::<unnamed>
+
+vespalib::string
+Key::create()
+{
+ return "dGhlIHNhbXBsZSBub25jZQ==";
+}
+
+vespalib::string
+Key::accept(const vespalib::string &key)
+{
+ char hash[20];
+ vespalib::string hash_input(key);
+ hash_input.append("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
+ Sha1::hash(hash_input.data(), hash_input.size(), hash, 20);
+ return encode64(hash, 20);
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/key.h b/vespalib/src/vespa/vespalib/websocket/key.h
new file mode 100644
index 00000000000..afcccdbf0a4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/key.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+namespace ws {
+
+struct Key
+{
+ /**
+ * Create a new random key that can be used by a client to request
+ * a version 13 websocket connection upgrade.
+ **/
+ static vespalib::string create();
+
+ /**
+ * Generate a version 13 websocket handshake accept token for a
+ * client key.
+ **/
+ static vespalib::string accept(const vespalib::string &key);
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/request.cpp b/vespalib/src/vespa/vespalib/websocket/request.cpp
new file mode 100644
index 00000000000..d894fdbbb3c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/request.cpp
@@ -0,0 +1,142 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "request.h"
+#include <algorithm>
+
+namespace vespalib {
+namespace ws {
+
+namespace {
+
+void split(vespalib::stringref str, vespalib::stringref sep,
+ std::vector<vespalib::string> &dst)
+{
+ dst.clear();
+ vespalib::string tmp;
+ for (size_t i = 0; i < str.size(); ++i) {
+ if (sep.find(str[i]) != vespalib::string::npos) {
+ if (!tmp.empty()) {
+ dst.push_back(tmp);
+ tmp.clear();
+ }
+ } else {
+ tmp.push_back(str[i]);
+ }
+ }
+ if (!tmp.empty()) {
+ dst.push_back(tmp);
+ }
+}
+
+} // namespace vespalib::ws::<unnamed>
+
+bool
+Request::handle_header(vespalib::string &header_name,
+ const vespalib::string &header_line)
+{
+ assert(!header_line.empty());
+ size_t pos = 0;
+ size_t end = header_line.size();
+ bool continuation = (header_line[0] == ' ') || (header_line[0] == '\t');
+ if (!continuation) {
+ pos = header_line.find(":");
+ if (pos == vespalib::string::npos) {
+ return false;
+ } else {
+ header_name.assign(header_line, 0, pos++);
+ std::transform(header_name.begin(), header_name.end(),
+ header_name.begin(), ::tolower);
+ }
+ }
+ while ((pos < end) && (isspace(header_line[pos]))) {
+ ++pos; // strip leading whitespace
+ }
+ while ((pos < end) && (isspace(header_line[end - 1]))) {
+ --end; // strip trailing whitespace
+ }
+ if (header_name.empty()) {
+ return false;
+ }
+ auto header_insert_result = _headers.insert(std::make_pair(header_name, vespalib::string()));
+ bool header_found = !header_insert_result.second;
+ vespalib::string &header_value = header_insert_result.first->second;
+ if (!header_found) {
+ header_value.assign(header_line, pos, end - pos);
+ } else {
+ if (continuation) {
+ header_value.push_back(' ');
+ } else { // duplicate header
+ header_value.push_back(',');
+ }
+ header_value.append(header_line.data() + pos, end - pos);
+ }
+ return true;
+}
+
+bool
+Request::read_header(Connection &conn)
+{
+ vespalib::string line;
+ vespalib::string header_name_space;
+ std::vector<vespalib::string> parts;
+ if (!conn.read_line(line)) {
+ return false;
+ }
+ split(line, "\t ", parts);
+ if (parts.size() != 3) {
+ return false;
+ }
+ _method = parts[0];
+ _uri = parts[1];
+ _version = parts[2];
+ while (conn.read_line(line)) {
+ if (line.empty()) {
+ fprintf(stderr, "request: %s %s %s\n",
+ _method.c_str(), _uri.c_str(), _version.c_str());
+ for (const auto &h: _headers) {
+ fprintf(stderr, "request: '%s' -> '%s'\n",
+ h.first.c_str(), h.second.c_str());
+ }
+ return true; // done
+ }
+ if (!handle_header(header_name_space, line)) {
+ return false; // malformed header
+ }
+ }
+ return false; // incomplete headers
+}
+
+const vespalib::string &
+Request::get_header(const vespalib::string &name) const
+{
+ auto pos = _headers.find(name);
+ if (pos == _headers.end()) {
+ return _empty;
+ }
+ return pos->second;
+}
+
+bool
+Request::has_connection_token(const vespalib::string &token) const
+{
+ std::vector<vespalib::string> tokens;
+ split(get_header("connection"), ",\t ", tokens);
+ for (const auto &t: tokens) {
+ if (strcasecmp(t.c_str(), token.c_str()) == 0) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool
+Request::is_ws_upgrade() const
+{
+ return ((strcasecmp(get_header("upgrade").c_str(), "websocket") == 0) &&
+ has_connection_token("upgrade"));
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/request.h b/vespalib/src/vespa/vespalib/websocket/request.h
new file mode 100644
index 00000000000..2c08fb2abe0
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/request.h
@@ -0,0 +1,36 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include "connection.h"
+#include <vespa/vespalib/stllike/string.h>
+#include <map>
+#include <vector>
+
+namespace vespalib {
+namespace ws {
+
+class Request
+{
+private:
+ vespalib::string _method;
+ vespalib::string _uri;
+ vespalib::string _version;
+ std::map<vespalib::string, vespalib::string> _headers;
+ vespalib::string _empty;
+
+ bool handle_header(vespalib::string &header_name,
+ const vespalib::string &header_line);
+
+public:
+ bool read_header(Connection &conn);
+ bool is_get() const { return _method == "GET"; }
+ const vespalib::string &get_header(const vespalib::string &name) const;
+ bool has_connection_token(const vespalib::string &token) const;
+ bool is_ws_upgrade() const;
+ const vespalib::string &uri() const { return _uri; }
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/server_socket.cpp b/vespalib/src/vespa/vespalib/websocket/server_socket.cpp
new file mode 100644
index 00000000000..18f95cf4220
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/server_socket.cpp
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/util/exceptions.h>
+#include <sys/socket.h>
+#include "server_socket.h"
+
+namespace vespalib {
+namespace ws {
+
+ServerSocket::ServerSocket(int port_in)
+ : _server_socket(port_in),
+ _closed(false)
+{
+ _server_socket.SetSoBlocking(true);
+ if (!_server_socket.Listen()) {
+ throw PortListenException(port_in, "tcp");
+ }
+}
+
+Socket::UP
+ServerSocket::accept()
+{
+ std::unique_ptr<FastOS_Socket> socket(_server_socket.AcceptPlain());
+ if (!socket) {
+ return Socket::UP();
+ }
+ socket->SetSoBlocking(true);
+ return Socket::UP(new Socket(std::move(socket)));
+}
+
+void
+ServerSocket::close()
+{
+ _closed = true;
+ int fd = _server_socket.get_fd();
+ if (fd >= 0) {
+ shutdown(fd, SHUT_RDWR);
+ }
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/server_socket.h b/vespalib/src/vespa/vespalib/websocket/server_socket.h
new file mode 100644
index 00000000000..20e98c1f76c
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/server_socket.h
@@ -0,0 +1,30 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include "socket.h"
+
+namespace vespalib {
+namespace ws {
+
+class ServerSocket
+{
+private:
+ struct ServerSocketWrapper : public FastOS_ServerSocket {
+ ServerSocketWrapper(int port) : FastOS_ServerSocket(port, 50) {}
+ int get_fd() const { return _socketHandle; }
+ };
+ ServerSocketWrapper _server_socket;
+ volatile bool _closed;
+
+public:
+ ServerSocket(int port_in);
+ Socket::UP accept();
+ void close();
+ int port() { return _server_socket.GetLocalPort(); }
+ bool is_closed() const { return _closed; }
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/socket.cpp b/vespalib/src/vespa/vespalib/websocket/socket.cpp
new file mode 100644
index 00000000000..c8bf1ec31f8
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/socket.cpp
@@ -0,0 +1,44 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#include <vespa/fastos/fastos.h>
+#include "socket.h"
+
+namespace vespalib {
+namespace ws {
+
+Socket::Socket(std::unique_ptr<FastOS_Socket> socket)
+ : _socket(std::move(socket))
+{
+}
+
+Socket::Socket(const vespalib::string &host, int port)
+ : _socket(new FastOS_Socket())
+{
+ if (!_socket->SetAddressByHostName(port, host.c_str()) ||
+ !_socket->SetSoBlocking(true) ||
+ !_socket->Connect())
+ {
+ _socket->Close();
+ }
+}
+
+Socket::~Socket()
+{
+ _socket->Close();
+}
+
+ssize_t
+Socket::read(char *buf, size_t len)
+{
+ return _socket->Read(buf, len);
+}
+
+ssize_t
+Socket::write(const char *buf, size_t len)
+{
+ return _socket->Write(buf, len);
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/socket.h b/vespalib/src/vespa/vespalib/websocket/socket.h
new file mode 100644
index 00000000000..22391386467
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/socket.h
@@ -0,0 +1,27 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+
+#pragma once
+
+#include <memory>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+namespace ws {
+
+class Socket
+{
+private:
+ std::unique_ptr<FastOS_Socket> _socket;
+
+public:
+ typedef std::unique_ptr<Socket> UP;
+ Socket(std::unique_ptr<FastOS_Socket> socket);
+ Socket(const vespalib::string &host, int port);
+ virtual ~Socket();
+ ssize_t read(char *buf, size_t len);
+ ssize_t write(const char *buf, size_t len);
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/websocket_server.cpp b/vespalib/src/vespa/vespalib/websocket/websocket_server.cpp
new file mode 100644
index 00000000000..101a3a56884
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/websocket_server.cpp
@@ -0,0 +1,158 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include "websocket_server.h"
+#include "connection.h"
+#include "request.h"
+#include "key.h"
+#include "frame.h"
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/host_name.h>
+
+namespace vespalib {
+namespace ws {
+
+namespace {
+
+vespalib::string magic = "[SELF]";
+
+void respond_static(Connection &conn, const WebsocketServer::StaticPage &page, const vespalib::string &self) {
+ conn.printf("HTTP/1.1 200 OK\r\n");
+ conn.printf("Connection: close\r\n");
+ conn.printf("Content-Type: %s\r\n", page.content_type.c_str());
+ conn.printf("\r\n");
+ size_t pos = 0;
+ while (pos < page.content.size()) {
+ size_t next = page.content.find(magic, pos);
+ if (next == vespalib::string::npos) {
+ conn.write(page.content.data() + pos, page.content.size() - pos);
+ pos = page.content.size();
+ } else {
+ conn.write(page.content.data() + pos, next - pos);
+ conn.write(self.data(), self.size());
+ pos = next + magic.size();
+ }
+ }
+ conn.flush();
+}
+
+void respond_error(Connection &conn, int code, const vespalib::string &message) {
+ conn.printf("HTTP/1.1 %d %s\r\n", code, message.c_str());
+ conn.printf("Connection: close\r\n");
+ conn.printf("Content-Type: text/html\r\n");
+ conn.printf("\r\n");
+ conn.printf("<html><body><h2>%d %s</h2></body></html>",
+ code, message.c_str());
+ conn.flush();
+}
+
+void respond_upgrade(Connection &conn, const vespalib::string &accept_token) {
+ conn.printf("HTTP/1.1 101 Switching Protocols\r\n");
+ conn.printf("Upgrade: websocket\r\n");
+ conn.printf("Connection: Upgrade\r\n");
+ conn.printf("Sec-WebSocket-Accept: %s\r\n", accept_token.c_str());
+ conn.printf("\r\n");
+ conn.flush();
+}
+
+void respond_upgrade_failed(Connection &conn) {
+ conn.printf("HTTP/1.1 400 Upgrade Failed\r\n");
+ conn.printf("Connection: close\r\n");
+ conn.printf("Sec-WebSocket-Version: 13\r\n");
+ conn.printf("\r\n");
+ conn.flush();
+}
+
+const char *name_from_type(Frame::Type type) {
+ switch (type) {
+ case Frame::Type::NONE: return "NONE";
+ case Frame::Type::TEXT: return "TEXT";
+ case Frame::Type::DATA: return "DATA";
+ case Frame::Type::PING: return "PING";
+ case Frame::Type::PONG: return "PONG";
+ case Frame::Type::CLOSE: return "CLOSE";
+ default: return "INVALID";
+ }
+}
+
+void handle_echo(Connection &conn) {
+ fprintf(stderr, "server: got ws connection\n");
+ Frame frame;
+ bool done = false;
+ while (!done && conn.read_frame(frame)) {
+ fprintf(stderr, "server: got frame of type %s with size %zu\n",
+ name_from_type(frame.type), frame.payload.used());
+ if (frame.type == Frame::Type::TEXT) {
+ fprintf(stderr, "server: got text: %s\n",
+ vespalib::string(frame.payload.obtain(),
+ frame.payload.used()).c_str());
+ }
+ if (frame.type == Frame::Type::INVALID) {
+ break;
+ }
+ if (frame.type == Frame::Type::PONG) {
+ continue;
+ }
+ if (frame.type == Frame::Type::PING) {
+ frame.type = Frame::Type::PONG;
+ }
+ if (frame.type == Frame::Type::CLOSE) {
+ done = true;
+ }
+ conn.write_frame(frame);
+ conn.flush();
+ }
+ fprintf(stderr, "server: closing ws connection\n");
+}
+
+void handle_upgrade(Connection &conn, Request &req) {
+ const vespalib::string version = req.get_header("sec-websocket-version");
+ vespalib::string accept_token = Key::accept(req.get_header("sec-websocket-key"));
+ if (version == "13") {
+ respond_upgrade(conn, accept_token);
+ handle_echo(conn);
+ } else {
+ respond_upgrade_failed(conn);
+ }
+}
+
+} // namespace vespalib::ws::<unnamed>
+
+WebsocketServer::WebsocketServer(int port_in, StaticRepo &&repo)
+ : _acceptor(port_in, *this),
+ _static_repo(std::move(repo)),
+ _self(make_string("%s:%d", HostName::get().c_str(), _acceptor.port()))
+{
+}
+
+void
+WebsocketServer::handle(std::unique_ptr<Socket> socket)
+{
+ Connection conn(std::move(socket));
+ Request req;
+ if (!req.read_header(conn)) {
+ respond_error(conn, 400, "Bad Request");
+ return;
+ }
+ if (!req.is_get()) {
+ respond_error(conn, 501, "Not Implemented");
+ return;
+ }
+ if (req.is_ws_upgrade()) {
+ if (req.uri() == "/echo") {
+ handle_upgrade(conn, req);
+ } else {
+ respond_error(conn, 404, "Not Found");
+ }
+ } else {
+ auto page = _static_repo.find(req.uri());
+ if (page != _static_repo.end()) {
+ respond_static(conn, page->second, _self);
+ } else {
+ respond_error(conn, 404, "Not Found");
+ }
+ }
+}
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/websocket/websocket_server.h b/vespalib/src/vespa/vespalib/websocket/websocket_server.h
new file mode 100644
index 00000000000..cc0ebed8384
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/websocket/websocket_server.h
@@ -0,0 +1,34 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/fastos/fastos.h>
+#include "handler.h"
+#include "acceptor.h"
+#include <map>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace vespalib {
+namespace ws {
+
+class WebsocketServer : public Handler<Socket> {
+public:
+ struct StaticPage {
+ vespalib::string content_type;
+ vespalib::string content;
+ };
+ typedef std::map<vespalib::string, StaticPage> StaticRepo;
+
+private:
+ Acceptor _acceptor;
+ StaticRepo _static_repo;
+ vespalib::string _self;
+
+public:
+ WebsocketServer(int port_in, StaticRepo &&repo = StaticRepo());
+ virtual void handle(std::unique_ptr<Socket> socket) override;
+ int port() { return _acceptor.port(); }
+};
+
+} // namespace vespalib::ws
+} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/xxhash/CMakeLists.txt b/vespalib/src/vespa/vespalib/xxhash/CMakeLists.txt
new file mode 100644
index 00000000000..b6b9de322e1
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/xxhash/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(vespalib_vespalib_xxhash OBJECT
+ SOURCES
+ xxhash.c
+ DEPENDS
+)
diff --git a/vespalib/src/vespa/vespalib/xxhash/xxhash.c b/vespalib/src/vespa/vespalib/xxhash/xxhash.c
new file mode 100644
index 00000000000..685b0c3b1a4
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/xxhash/xxhash.c
@@ -0,0 +1,935 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/*
+xxHash - Fast Hash algorithm
+Copyright (C) 2012-2014, Yann Collet.
+BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+
+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.
+
+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.
+
+You can contact the author at :
+- xxHash source repository : http://code.google.com/p/xxhash/
+- public discussion board : https://groups.google.com/forum/#!forum/lz4c
+*/
+
+
+//**************************************
+// Tuning parameters
+//**************************************
+// Unaligned memory access is automatically enabled for "common" CPU, such as x86.
+// For others CPU, the compiler will be more cautious, and insert extra code to ensure aligned access is respected.
+// If you know your target CPU supports unaligned memory access, you want to force this option manually to improve performance.
+// You can also enable this parameter if you know your input data will always be aligned (boundaries of 4, for U32).
+#if defined(__ARM_FEATURE_UNALIGNED) || defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
+# define XXH_USE_UNALIGNED_ACCESS 1
+#endif
+
+// XXH_ACCEPT_NULL_INPUT_POINTER :
+// If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer.
+// When this option is enabled, xxHash output for null input pointers will be the same as a null-length input.
+// This option has a very small performance cost (only measurable on small inputs).
+// By default, this option is disabled. To enable it, uncomment below define :
+// #define XXH_ACCEPT_NULL_INPUT_POINTER 1
+
+// XXH_FORCE_NATIVE_FORMAT :
+// By default, xxHash library provides endian-independant Hash values, based on little-endian convention.
+// Results are therefore identical for little-endian and big-endian CPU.
+// This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.
+// Should endian-independance be of no importance for your application, you may set the #define below to 1.
+// It will improve speed for Big-endian CPU.
+// This option has no impact on Little_Endian CPU.
+#define XXH_FORCE_NATIVE_FORMAT 0
+
+//**************************************
+// Compiler Specific Options
+//**************************************
+// Disable some Visual warning messages
+#ifdef _MSC_VER // Visual Studio
+# pragma warning(disable : 4127) // disable: C4127: conditional expression is constant
+#endif
+
+#ifdef _MSC_VER // Visual Studio
+# define FORCE_INLINE static __forceinline
+#else
+# ifdef __GNUC__
+# define FORCE_INLINE static inline __attribute__((always_inline))
+# else
+# define FORCE_INLINE static inline
+# endif
+#endif
+
+//**************************************
+// Includes & Memory related functions
+//**************************************
+#include "xxhash.h"
+// Modify the local functions below should you wish to use some other memory routines
+// for malloc(), free()
+#include <stdlib.h>
+FORCE_INLINE void* XXH_malloc(size_t s)
+{
+ return malloc(s);
+}
+FORCE_INLINE void XXH_free (void* p)
+{
+ free(p);
+}
+// for memcpy()
+#include <string.h>
+FORCE_INLINE void* XXH_memcpy(void* dest, const void* src, size_t size)
+{
+ return memcpy(dest,src,size);
+}
+
+
+//**************************************
+// Basic Types
+//**************************************
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99
+# include <stdint.h>
+typedef uint8_t BYTE;
+typedef uint16_t U16;
+typedef uint32_t U32;
+typedef int32_t S32;
+typedef uint64_t U64;
+#else
+typedef unsigned char BYTE;
+typedef unsigned short U16;
+typedef unsigned int U32;
+typedef signed int S32;
+typedef unsigned long long U64;
+#endif
+
+#if defined(__GNUC__) && !defined(XXH_USE_UNALIGNED_ACCESS)
+# define _PACKED __attribute__ ((packed))
+#else
+# define _PACKED
+#endif
+
+#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
+# ifdef __IBMC__
+# pragma pack(1)
+# else
+# pragma pack(push, 1)
+# endif
+#endif
+
+typedef struct _U32_S
+{
+ U32 v;
+} _PACKED U32_S;
+typedef struct _U64_S
+{
+ U64 v;
+} _PACKED U64_S;
+
+#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
+# pragma pack(pop)
+#endif
+
+#define A32(x) (((const U32_S *)(x))->v)
+#define A64(x) (((const U64_S *)(x))->v)
+
+
+//***************************************
+// Compiler-specific Functions and Macros
+//***************************************
+#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
+
+// Note : although _rotl exists for minGW (GCC under windows), performance seems poor
+#if defined(_MSC_VER)
+# define XXH_rotl32(x,r) _rotl(x,r)
+# define XXH_rotl64(x,r) _rotl64(x,r)
+#else
+# define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r)))
+# define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r)))
+#endif
+
+#if defined(_MSC_VER) // Visual Studio
+# define XXH_swap32 _byteswap_ulong
+# define XXH_swap64 _byteswap_uint64
+#elif GCC_VERSION >= 403
+# define XXH_swap32 __builtin_bswap32
+# define XXH_swap64 __builtin_bswap64
+#else
+static inline U32 XXH_swap32 (U32 x)
+{
+ return ((x << 24) & 0xff000000 ) |
+ ((x << 8) & 0x00ff0000 ) |
+ ((x >> 8) & 0x0000ff00 ) |
+ ((x >> 24) & 0x000000ff );
+}
+static inline U64 XXH_swap64 (U64 x)
+{
+ return ((x << 56) & 0xff00000000000000ULL) |
+ ((x << 40) & 0x00ff000000000000ULL) |
+ ((x << 24) & 0x0000ff0000000000ULL) |
+ ((x << 8) & 0x000000ff00000000ULL) |
+ ((x >> 8) & 0x00000000ff000000ULL) |
+ ((x >> 24) & 0x0000000000ff0000ULL) |
+ ((x >> 40) & 0x000000000000ff00ULL) |
+ ((x >> 56) & 0x00000000000000ffULL);
+}
+#endif
+
+
+//**************************************
+// Constants
+//**************************************
+#define PRIME32_1 2654435761U
+#define PRIME32_2 2246822519U
+#define PRIME32_3 3266489917U
+#define PRIME32_4 668265263U
+#define PRIME32_5 374761393U
+
+#define PRIME64_1 11400714785074694791ULL
+#define PRIME64_2 14029467366897019727ULL
+#define PRIME64_3 1609587929392839161ULL
+#define PRIME64_4 9650029242287828579ULL
+#define PRIME64_5 2870177450012600261ULL
+
+//**************************************
+// Architecture Macros
+//**************************************
+typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
+#ifndef XXH_CPU_LITTLE_ENDIAN // It is possible to define XXH_CPU_LITTLE_ENDIAN externally, for example using a compiler switch
+static const int one = 1;
+# define XXH_CPU_LITTLE_ENDIAN (*(const char*)(&one))
+#endif
+
+
+//**************************************
+// Macros
+//**************************************
+#define XXH_STATIC_ASSERT(c) { enum { XXH_static_assert = 1/(!!(c)) }; } // use only *after* variable declarations
+
+
+//****************************
+// Memory reads
+//****************************
+typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;
+
+FORCE_INLINE U32 XXH_readLE32_align(const U32* ptr, XXH_endianess endian, XXH_alignment align)
+{
+ if (align==XXH_unaligned)
+ return endian==XXH_littleEndian ? A32(ptr) : XXH_swap32(A32(ptr));
+ else
+ return endian==XXH_littleEndian ? *ptr : XXH_swap32(*ptr);
+}
+
+FORCE_INLINE U32 XXH_readLE32(const U32* ptr, XXH_endianess endian)
+{
+ return XXH_readLE32_align(ptr, endian, XXH_unaligned);
+}
+
+FORCE_INLINE U64 XXH_readLE64_align(const U64* ptr, XXH_endianess endian, XXH_alignment align)
+{
+ if (align==XXH_unaligned)
+ return endian==XXH_littleEndian ? A64(ptr) : XXH_swap64(A64(ptr));
+ else
+ return endian==XXH_littleEndian ? *ptr : XXH_swap64(*ptr);
+}
+
+FORCE_INLINE U64 XXH_readLE64(const U64* ptr, XXH_endianess endian)
+{
+ return XXH_readLE64_align(ptr, endian, XXH_unaligned);
+}
+
+
+//****************************
+// Simple Hash Functions
+//****************************
+FORCE_INLINE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align)
+{
+ const BYTE* p = (const BYTE*)input;
+ const BYTE* bEnd = p + len;
+ U32 h32;
+#define XXH_get32bits(p) XXH_readLE32_align((const U32*)p, endian, align)
+
+#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
+ if (p==NULL)
+ {
+ len=0;
+ bEnd=p=(const BYTE*)(size_t)16;
+ }
+#endif
+
+ if (len>=16)
+ {
+ const BYTE* const limit = bEnd - 16;
+ U32 v1 = seed + PRIME32_1 + PRIME32_2;
+ U32 v2 = seed + PRIME32_2;
+ U32 v3 = seed + 0;
+ U32 v4 = seed - PRIME32_1;
+
+ do
+ {
+ v1 += XXH_get32bits(p) * PRIME32_2;
+ v1 = XXH_rotl32(v1, 13);
+ v1 *= PRIME32_1;
+ p+=4;
+ v2 += XXH_get32bits(p) * PRIME32_2;
+ v2 = XXH_rotl32(v2, 13);
+ v2 *= PRIME32_1;
+ p+=4;
+ v3 += XXH_get32bits(p) * PRIME32_2;
+ v3 = XXH_rotl32(v3, 13);
+ v3 *= PRIME32_1;
+ p+=4;
+ v4 += XXH_get32bits(p) * PRIME32_2;
+ v4 = XXH_rotl32(v4, 13);
+ v4 *= PRIME32_1;
+ p+=4;
+ }
+ while (p<=limit);
+
+ h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
+ }
+ else
+ {
+ h32 = seed + PRIME32_5;
+ }
+
+ h32 += (U32) len;
+
+ while (p+4<=bEnd)
+ {
+ h32 += XXH_get32bits(p) * PRIME32_3;
+ h32 = XXH_rotl32(h32, 17) * PRIME32_4 ;
+ p+=4;
+ }
+
+ while (p<bEnd)
+ {
+ h32 += (*p) * PRIME32_5;
+ h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;
+ p++;
+ }
+
+ h32 ^= h32 >> 15;
+ h32 *= PRIME32_2;
+ h32 ^= h32 >> 13;
+ h32 *= PRIME32_3;
+ h32 ^= h32 >> 16;
+
+ return h32;
+}
+
+
+unsigned int XXH32 (const void* input, size_t len, unsigned seed)
+{
+#if 0
+ // Simple version, good for code maintenance, but unfortunately slow for small inputs
+ XXH32_state_t state;
+ XXH32_reset(&state, seed);
+ XXH32_update(&state, input, len);
+ return XXH32_digest(&state);
+#else
+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
+
+# if !defined(XXH_USE_UNALIGNED_ACCESS)
+ if ((((size_t)input) & 3) == 0) // Input is aligned, let's leverage the speed advantage
+ {
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
+ else
+ return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
+ }
+# endif
+
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
+ else
+ return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
+#endif
+}
+
+FORCE_INLINE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align)
+{
+ const BYTE* p = (const BYTE*)input;
+ const BYTE* bEnd = p + len;
+ U64 h64;
+#define XXH_get64bits(p) XXH_readLE64_align((const U64*)p, endian, align)
+
+#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
+ if (p==NULL)
+ {
+ len=0;
+ bEnd=p=(const BYTE*)(size_t)32;
+ }
+#endif
+
+ if (len>=32)
+ {
+ const BYTE* const limit = bEnd - 32;
+ U64 v1 = seed + PRIME64_1 + PRIME64_2;
+ U64 v2 = seed + PRIME64_2;
+ U64 v3 = seed + 0;
+ U64 v4 = seed - PRIME64_1;
+
+ do
+ {
+ v1 += XXH_get64bits(p) * PRIME64_2;
+ p+=8;
+ v1 = XXH_rotl64(v1, 31);
+ v1 *= PRIME64_1;
+ v2 += XXH_get64bits(p) * PRIME64_2;
+ p+=8;
+ v2 = XXH_rotl64(v2, 31);
+ v2 *= PRIME64_1;
+ v3 += XXH_get64bits(p) * PRIME64_2;
+ p+=8;
+ v3 = XXH_rotl64(v3, 31);
+ v3 *= PRIME64_1;
+ v4 += XXH_get64bits(p) * PRIME64_2;
+ p+=8;
+ v4 = XXH_rotl64(v4, 31);
+ v4 *= PRIME64_1;
+ }
+ while (p<=limit);
+
+ h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
+
+ v1 *= PRIME64_2;
+ v1 = XXH_rotl64(v1, 31);
+ v1 *= PRIME64_1;
+ h64 ^= v1;
+ h64 = h64 * PRIME64_1 + PRIME64_4;
+
+ v2 *= PRIME64_2;
+ v2 = XXH_rotl64(v2, 31);
+ v2 *= PRIME64_1;
+ h64 ^= v2;
+ h64 = h64 * PRIME64_1 + PRIME64_4;
+
+ v3 *= PRIME64_2;
+ v3 = XXH_rotl64(v3, 31);
+ v3 *= PRIME64_1;
+ h64 ^= v3;
+ h64 = h64 * PRIME64_1 + PRIME64_4;
+
+ v4 *= PRIME64_2;
+ v4 = XXH_rotl64(v4, 31);
+ v4 *= PRIME64_1;
+ h64 ^= v4;
+ h64 = h64 * PRIME64_1 + PRIME64_4;
+ }
+ else
+ {
+ h64 = seed + PRIME64_5;
+ }
+
+ h64 += (U64) len;
+
+ while (p+8<=bEnd)
+ {
+ U64 k1 = XXH_get64bits(p);
+ k1 *= PRIME64_2;
+ k1 = XXH_rotl64(k1,31);
+ k1 *= PRIME64_1;
+ h64 ^= k1;
+ h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;
+ p+=8;
+ }
+
+ if (p+4<=bEnd)
+ {
+ h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1;
+ h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
+ p+=4;
+ }
+
+ while (p<bEnd)
+ {
+ h64 ^= (*p) * PRIME64_5;
+ h64 = XXH_rotl64(h64, 11) * PRIME64_1;
+ p++;
+ }
+
+ h64 ^= h64 >> 33;
+ h64 *= PRIME64_2;
+ h64 ^= h64 >> 29;
+ h64 *= PRIME64_3;
+ h64 ^= h64 >> 32;
+
+ return h64;
+}
+
+
+unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed)
+{
+#if 0
+ // Simple version, good for code maintenance, but unfortunately slow for small inputs
+ XXH64_state_t state;
+ XXH64_reset(&state, seed);
+ XXH64_update(&state, input, len);
+ return XXH64_digest(&state);
+#else
+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
+
+# if !defined(XXH_USE_UNALIGNED_ACCESS)
+ if ((((size_t)input) & 7)==0) // Input is aligned, let's leverage the speed advantage
+ {
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
+ else
+ return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
+ }
+# endif
+
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
+ else
+ return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
+#endif
+}
+
+/****************************************************
+ * Advanced Hash Functions
+****************************************************/
+
+/*** Allocation ***/
+typedef struct
+{
+ U64 total_len;
+ U32 seed;
+ U32 v1;
+ U32 v2;
+ U32 v3;
+ U32 v4;
+ U32 memsize;
+ char memory[16];
+} XXH_istate32_t;
+
+typedef struct
+{
+ U64 total_len;
+ U64 seed;
+ U64 v1;
+ U64 v2;
+ U64 v3;
+ U64 v4;
+ U32 memsize;
+ char memory[32];
+} XXH_istate64_t;
+
+
+XXH32_state_t* XXH32_createState(void)
+{
+ XXH_STATIC_ASSERT(sizeof(XXH32_state_t) >= sizeof(XXH_istate32_t)); // A compilation error here means XXH32_state_t is not large enough
+ return (XXH32_state_t*)malloc(sizeof(XXH32_state_t));
+}
+XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)
+{
+ free(statePtr);
+ return XXH_OK;
+};
+
+XXH64_state_t* XXH64_createState(void)
+{
+ XXH_STATIC_ASSERT(sizeof(XXH64_state_t) >= sizeof(XXH_istate64_t)); // A compilation error here means XXH64_state_t is not large enough
+ return (XXH64_state_t*)malloc(sizeof(XXH64_state_t));
+}
+XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)
+{
+ free(statePtr);
+ return XXH_OK;
+};
+
+
+/*** Hash feed ***/
+
+XXH_errorcode XXH32_reset(XXH32_state_t* state_in, U32 seed)
+{
+ XXH_istate32_t* state = (XXH_istate32_t*) state_in;
+ state->seed = seed;
+ state->v1 = seed + PRIME32_1 + PRIME32_2;
+ state->v2 = seed + PRIME32_2;
+ state->v3 = seed + 0;
+ state->v4 = seed - PRIME32_1;
+ state->total_len = 0;
+ state->memsize = 0;
+ return XXH_OK;
+}
+
+XXH_errorcode XXH64_reset(XXH64_state_t* state_in, unsigned long long seed)
+{
+ XXH_istate64_t* state = (XXH_istate64_t*) state_in;
+ state->seed = seed;
+ state->v1 = seed + PRIME64_1 + PRIME64_2;
+ state->v2 = seed + PRIME64_2;
+ state->v3 = seed + 0;
+ state->v4 = seed - PRIME64_1;
+ state->total_len = 0;
+ state->memsize = 0;
+ return XXH_OK;
+}
+
+
+FORCE_INLINE XXH_errorcode XXH32_update_endian (XXH32_state_t* state_in, const void* input, size_t len, XXH_endianess endian)
+{
+ XXH_istate32_t* state = (XXH_istate32_t *) state_in;
+ const BYTE* p = (const BYTE*)input;
+ const BYTE* const bEnd = p + len;
+
+#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
+ if (input==NULL) return XXH_ERROR;
+#endif
+
+ state->total_len += len;
+
+ if (state->memsize + len < 16) // fill in tmp buffer
+ {
+ XXH_memcpy(state->memory + state->memsize, input, len);
+ state->memsize += (U32)len;
+ return XXH_OK;
+ }
+
+ if (state->memsize) // some data left from previous update
+ {
+ XXH_memcpy(state->memory + state->memsize, input, 16-state->memsize);
+ {
+ const U32* p32 = (const U32*)state->memory;
+ state->v1 += XXH_readLE32(p32, endian) * PRIME32_2;
+ state->v1 = XXH_rotl32(state->v1, 13);
+ state->v1 *= PRIME32_1;
+ p32++;
+ state->v2 += XXH_readLE32(p32, endian) * PRIME32_2;
+ state->v2 = XXH_rotl32(state->v2, 13);
+ state->v2 *= PRIME32_1;
+ p32++;
+ state->v3 += XXH_readLE32(p32, endian) * PRIME32_2;
+ state->v3 = XXH_rotl32(state->v3, 13);
+ state->v3 *= PRIME32_1;
+ p32++;
+ state->v4 += XXH_readLE32(p32, endian) * PRIME32_2;
+ state->v4 = XXH_rotl32(state->v4, 13);
+ state->v4 *= PRIME32_1;
+ p32++;
+ }
+ p += 16-state->memsize;
+ state->memsize = 0;
+ }
+
+ if (p <= bEnd-16)
+ {
+ const BYTE* const limit = bEnd - 16;
+ U32 v1 = state->v1;
+ U32 v2 = state->v2;
+ U32 v3 = state->v3;
+ U32 v4 = state->v4;
+
+ do
+ {
+ v1 += XXH_readLE32((const U32*)p, endian) * PRIME32_2;
+ v1 = XXH_rotl32(v1, 13);
+ v1 *= PRIME32_1;
+ p+=4;
+ v2 += XXH_readLE32((const U32*)p, endian) * PRIME32_2;
+ v2 = XXH_rotl32(v2, 13);
+ v2 *= PRIME32_1;
+ p+=4;
+ v3 += XXH_readLE32((const U32*)p, endian) * PRIME32_2;
+ v3 = XXH_rotl32(v3, 13);
+ v3 *= PRIME32_1;
+ p+=4;
+ v4 += XXH_readLE32((const U32*)p, endian) * PRIME32_2;
+ v4 = XXH_rotl32(v4, 13);
+ v4 *= PRIME32_1;
+ p+=4;
+ }
+ while (p<=limit);
+
+ state->v1 = v1;
+ state->v2 = v2;
+ state->v3 = v3;
+ state->v4 = v4;
+ }
+
+ if (p < bEnd)
+ {
+ XXH_memcpy(state->memory, p, bEnd-p);
+ state->memsize = (int)(bEnd-p);
+ }
+
+ return XXH_OK;
+}
+
+XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len)
+{
+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
+
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH32_update_endian(state_in, input, len, XXH_littleEndian);
+ else
+ return XXH32_update_endian(state_in, input, len, XXH_bigEndian);
+}
+
+
+
+FORCE_INLINE U32 XXH32_digest_endian (const XXH32_state_t* state_in, XXH_endianess endian)
+{
+ const XXH_istate32_t* state = (const XXH_istate32_t*) state_in;
+ const BYTE * p = (const BYTE*)state->memory;
+ const BYTE* bEnd = (const BYTE*)state->memory + state->memsize;
+ U32 h32;
+
+ if (state->total_len >= 16)
+ {
+ h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18);
+ }
+ else
+ {
+ h32 = state->seed + PRIME32_5;
+ }
+
+ h32 += (U32) state->total_len;
+
+ while (p+4<=bEnd)
+ {
+ h32 += XXH_readLE32((const U32*)p, endian) * PRIME32_3;
+ h32 = XXH_rotl32(h32, 17) * PRIME32_4;
+ p+=4;
+ }
+
+ while (p<bEnd)
+ {
+ h32 += (*p) * PRIME32_5;
+ h32 = XXH_rotl32(h32, 11) * PRIME32_1;
+ p++;
+ }
+
+ h32 ^= h32 >> 15;
+ h32 *= PRIME32_2;
+ h32 ^= h32 >> 13;
+ h32 *= PRIME32_3;
+ h32 ^= h32 >> 16;
+
+ return h32;
+}
+
+
+U32 XXH32_digest (const XXH32_state_t* state_in)
+{
+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
+
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH32_digest_endian(state_in, XXH_littleEndian);
+ else
+ return XXH32_digest_endian(state_in, XXH_bigEndian);
+}
+
+
+FORCE_INLINE XXH_errorcode XXH64_update_endian (XXH64_state_t* state_in, const void* input, size_t len, XXH_endianess endian)
+{
+ XXH_istate64_t * state = (XXH_istate64_t *) state_in;
+ const BYTE* p = (const BYTE*)input;
+ const BYTE* const bEnd = p + len;
+
+#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
+ if (input==NULL) return XXH_ERROR;
+#endif
+
+ state->total_len += len;
+
+ if (state->memsize + len < 32) // fill in tmp buffer
+ {
+ XXH_memcpy(state->memory + state->memsize, input, len);
+ state->memsize += (U32)len;
+ return XXH_OK;
+ }
+
+ if (state->memsize) // some data left from previous update
+ {
+ XXH_memcpy(state->memory + state->memsize, input, 32-state->memsize);
+ {
+ const U64* p64 = (const U64*)state->memory;
+ state->v1 += XXH_readLE64(p64, endian) * PRIME64_2;
+ state->v1 = XXH_rotl64(state->v1, 31);
+ state->v1 *= PRIME64_1;
+ p64++;
+ state->v2 += XXH_readLE64(p64, endian) * PRIME64_2;
+ state->v2 = XXH_rotl64(state->v2, 31);
+ state->v2 *= PRIME64_1;
+ p64++;
+ state->v3 += XXH_readLE64(p64, endian) * PRIME64_2;
+ state->v3 = XXH_rotl64(state->v3, 31);
+ state->v3 *= PRIME64_1;
+ p64++;
+ state->v4 += XXH_readLE64(p64, endian) * PRIME64_2;
+ state->v4 = XXH_rotl64(state->v4, 31);
+ state->v4 *= PRIME64_1;
+ p64++;
+ }
+ p += 32-state->memsize;
+ state->memsize = 0;
+ }
+
+ if (p+32 <= bEnd)
+ {
+ const BYTE* const limit = bEnd - 32;
+ U64 v1 = state->v1;
+ U64 v2 = state->v2;
+ U64 v3 = state->v3;
+ U64 v4 = state->v4;
+
+ do
+ {
+ v1 += XXH_readLE64((const U64*)p, endian) * PRIME64_2;
+ v1 = XXH_rotl64(v1, 31);
+ v1 *= PRIME64_1;
+ p+=8;
+ v2 += XXH_readLE64((const U64*)p, endian) * PRIME64_2;
+ v2 = XXH_rotl64(v2, 31);
+ v2 *= PRIME64_1;
+ p+=8;
+ v3 += XXH_readLE64((const U64*)p, endian) * PRIME64_2;
+ v3 = XXH_rotl64(v3, 31);
+ v3 *= PRIME64_1;
+ p+=8;
+ v4 += XXH_readLE64((const U64*)p, endian) * PRIME64_2;
+ v4 = XXH_rotl64(v4, 31);
+ v4 *= PRIME64_1;
+ p+=8;
+ }
+ while (p<=limit);
+
+ state->v1 = v1;
+ state->v2 = v2;
+ state->v3 = v3;
+ state->v4 = v4;
+ }
+
+ if (p < bEnd)
+ {
+ XXH_memcpy(state->memory, p, bEnd-p);
+ state->memsize = (int)(bEnd-p);
+ }
+
+ return XXH_OK;
+}
+
+XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len)
+{
+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
+
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH64_update_endian(state_in, input, len, XXH_littleEndian);
+ else
+ return XXH64_update_endian(state_in, input, len, XXH_bigEndian);
+}
+
+
+
+FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state_in, XXH_endianess endian)
+{
+ const XXH_istate64_t * state = (const XXH_istate64_t *) state_in;
+ const BYTE * p = (const BYTE*)state->memory;
+ const BYTE* bEnd = (const BYTE*)state->memory + state->memsize;
+ U64 h64;
+
+ if (state->total_len >= 32)
+ {
+ U64 v1 = state->v1;
+ U64 v2 = state->v2;
+ U64 v3 = state->v3;
+ U64 v4 = state->v4;
+
+ h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
+
+ v1 *= PRIME64_2;
+ v1 = XXH_rotl64(v1, 31);
+ v1 *= PRIME64_1;
+ h64 ^= v1;
+ h64 = h64*PRIME64_1 + PRIME64_4;
+
+ v2 *= PRIME64_2;
+ v2 = XXH_rotl64(v2, 31);
+ v2 *= PRIME64_1;
+ h64 ^= v2;
+ h64 = h64*PRIME64_1 + PRIME64_4;
+
+ v3 *= PRIME64_2;
+ v3 = XXH_rotl64(v3, 31);
+ v3 *= PRIME64_1;
+ h64 ^= v3;
+ h64 = h64*PRIME64_1 + PRIME64_4;
+
+ v4 *= PRIME64_2;
+ v4 = XXH_rotl64(v4, 31);
+ v4 *= PRIME64_1;
+ h64 ^= v4;
+ h64 = h64*PRIME64_1 + PRIME64_4;
+ }
+ else
+ {
+ h64 = state->seed + PRIME64_5;
+ }
+
+ h64 += (U64) state->total_len;
+
+ while (p+8<=bEnd)
+ {
+ U64 k1 = XXH_readLE64((const U64*)p, endian);
+ k1 *= PRIME64_2;
+ k1 = XXH_rotl64(k1,31);
+ k1 *= PRIME64_1;
+ h64 ^= k1;
+ h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;
+ p+=8;
+ }
+
+ if (p+4<=bEnd)
+ {
+ h64 ^= (U64)(XXH_readLE32((const U32*)p, endian)) * PRIME64_1;
+ h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
+ p+=4;
+ }
+
+ while (p<bEnd)
+ {
+ h64 ^= (*p) * PRIME64_5;
+ h64 = XXH_rotl64(h64, 11) * PRIME64_1;
+ p++;
+ }
+
+ h64 ^= h64 >> 33;
+ h64 *= PRIME64_2;
+ h64 ^= h64 >> 29;
+ h64 *= PRIME64_3;
+ h64 ^= h64 >> 32;
+
+ return h64;
+}
+
+
+unsigned long long XXH64_digest (const XXH64_state_t* state_in)
+{
+ XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
+
+ if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
+ return XXH64_digest_endian(state_in, XXH_littleEndian);
+ else
+ return XXH64_digest_endian(state_in, XXH_bigEndian);
+}
+
+
diff --git a/vespalib/src/vespa/vespalib/xxhash/xxhash.h b/vespalib/src/vespa/vespalib/xxhash/xxhash.h
new file mode 100644
index 00000000000..8604da148f5
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/xxhash/xxhash.h
@@ -0,0 +1,157 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/*
+ xxHash - Extremely Fast Hash algorithm
+ Header File
+ Copyright (C) 2012-2014, Yann Collet.
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+
+ 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.
+
+ 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.
+
+ You can contact the author at :
+ - xxHash source repository : http://code.google.com/p/xxhash/
+*/
+
+/* Notice extracted from xxHash homepage :
+
+xxHash is an extremely fast Hash algorithm, running at RAM speed limits.
+It also successfully passes all tests from the SMHasher suite.
+
+Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)
+
+Name Speed Q.Score Author
+xxHash 5.4 GB/s 10
+CrapWow 3.2 GB/s 2 Andrew
+MumurHash 3a 2.7 GB/s 10 Austin Appleby
+SpookyHash 2.0 GB/s 10 Bob Jenkins
+SBox 1.4 GB/s 9 Bret Mulvey
+Lookup3 1.2 GB/s 9 Bob Jenkins
+SuperFastHash 1.2 GB/s 1 Paul Hsieh
+CityHash64 1.05 GB/s 10 Pike & Alakuijala
+FNV 0.55 GB/s 5 Fowler, Noll, Vo
+CRC32 0.43 GB/s 9
+MD5-32 0.33 GB/s 10 Ronald L. Rivest
+SHA1-32 0.28 GB/s 10
+
+Q.Score is a measure of quality of the hash function.
+It depends on successfully passing SMHasher test set.
+10 is a perfect score.
+*/
+
+#pragma once
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/*****************************
+ Includes
+*****************************/
+#include <stddef.h> /* size_t */
+
+
+/*****************************
+ Type
+*****************************/
+typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
+
+
+
+/*****************************
+ Simple Hash Functions
+*****************************/
+
+unsigned int XXH32 (const void* input, size_t length, unsigned seed);
+unsigned long long XXH64 (const void* input, size_t length, unsigned long long seed);
+
+/*
+XXH32() :
+ Calculate the 32-bits hash of sequence "length" bytes stored at memory address "input".
+ The memory between input & input+length must be valid (allocated and read-accessible).
+ "seed" can be used to alter the result predictably.
+ This function successfully passes all SMHasher tests.
+ Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s
+XXH64() :
+ Calculate the 64-bits hash of sequence of length "len" stored at memory address "input".
+*/
+
+
+
+/*****************************
+ Advanced Hash Functions
+*****************************/
+typedef struct { long long ll[ 6]; } XXH32_state_t;
+typedef struct { long long ll[11]; } XXH64_state_t;
+
+/*
+These structures allow static allocation of XXH states.
+States must then be initialized using XXHnn_reset() before first use.
+
+If you prefer dynamic allocation, please refer to functions below.
+*/
+
+XXH32_state_t* XXH32_createState(void);
+XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr);
+
+XXH64_state_t* XXH64_createState(void);
+XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr);
+
+/*
+These functions create and release memory for XXH state.
+States must then be initialized using XXHnn_reset() before first use.
+*/
+
+
+XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, unsigned seed);
+XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);
+unsigned int XXH32_digest (const XXH32_state_t* statePtr);
+
+XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned long long seed);
+XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);
+unsigned long long XXH64_digest (const XXH64_state_t* statePtr);
+
+/*
+These functions calculate the xxHash of an input provided in multiple smaller packets,
+as opposed to an input provided as a single block.
+
+XXH state space must first be allocated, using either static or dynamic method provided above.
+
+Start a new hash by initializing state with a seed, using XXHnn_reset().
+
+Then, feed the hash state by calling XXHnn_update() as many times as necessary.
+Obviously, input must be valid, meaning allocated and read accessible.
+The function returns an error code, with 0 meaning OK, and any other value meaning there is an error.
+
+Finally, you can produce a hash anytime, by using XXHnn_digest().
+This function returns the final nn-bits hash.
+You can nonetheless continue feeding the hash state with more input,
+and therefore get some new hashes, by calling again XXHnn_digest().
+
+When you are done, don't forget to free XXH state space, using typically XXHnn_freeState().
+*/
+
+
+#if defined (__cplusplus)
+}
+#endif