text_ux 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +25 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/Rakefile +18 -0
- data/ext/text_ux/extconf.rb +5 -0
- data/ext/text_ux/text_ux.cpp +252 -0
- data/lib/text_ux.rb +5 -0
- data/lib/text_ux/version.rb +3 -0
- data/spec/fixtures/test.ux +0 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/text_ux_spec.rb +137 -0
- data/text_ux.gemspec +26 -0
- data/vendor/ux-trie/ux-0.1.9/.lock-waf_darwin_build +8 -0
- data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest-all.cc +9118 -0
- data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest.h +19537 -0
- data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest_main.cc +39 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Build.py +733 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Build.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ConfigSet.py +147 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ConfigSet.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Configure.py +314 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Configure.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Context.py +298 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Context.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Errors.py +37 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Errors.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Logs.py +149 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Logs.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Node.py +500 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Node.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Options.py +130 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Options.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Runner.py +191 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Runner.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Scripting.py +358 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Scripting.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Task.py +669 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Task.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/TaskGen.py +341 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/TaskGen.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/__init__.py +4 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/__init__.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ar.py +12 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ar.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/asm.py +25 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/bison.py +29 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c.py +27 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_aliases.py +56 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_aliases.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_config.py +708 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_config.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_osx.py +121 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_osx.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_preproc.py +606 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_preproc.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_tests.py +110 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_tests.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ccroot.py +372 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ccroot.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_c.py +39 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_cxx.py +39 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_cxx.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_d.py +30 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_fc.py +45 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cs.py +98 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cxx.py +27 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cxx.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d.py +51 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d_config.py +47 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d_scan.py +133 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/dbus.py +30 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/dmd.py +43 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/errcheck.py +153 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc.py +123 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc_config.py +271 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc_scan.py +68 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/flex.py +27 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/g95.py +55 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gas.py +10 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gcc.py +98 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gdc.py +34 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gfortran.py +69 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/glib2.py +174 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gnu_dirs.py +65 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gxx.py +98 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gxx.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/icc.py +31 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/icpc.py +30 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ifort.py +42 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/intltool.py +78 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/irixcc.py +49 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/javaw.py +272 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/kde4.py +49 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/lua.py +19 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/msvc.py +650 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/nasm.py +13 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/perl.py +78 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/python.py +303 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/qt4.py +424 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ruby.py +104 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/suncc.py +54 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/suncxx.py +55 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/tex.py +222 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/vala.py +215 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/waf_unit_test.py +79 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/winres.py +34 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/xlc.py +46 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/xlcxx.py +46 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Utils.py +334 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Utils.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/__init__.py +4 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/__init__.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ansiterm.py +173 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ansiterm.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/__init__.py +4 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/__init__.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/compat15.py +223 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/compat15.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/fixpy2.py +50 -0
- data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/fixpy2.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/src/bitVec.cpp +119 -0
- data/vendor/ux-trie/ux-0.1.9/src/bitVec.hpp +64 -0
- data/vendor/ux-trie/ux-0.1.9/src/bitVecTest.cpp +143 -0
- data/vendor/ux-trie/ux-0.1.9/src/cmdline.h +809 -0
- data/vendor/ux-trie/ux-0.1.9/src/rsDic.cpp +121 -0
- data/vendor/ux-trie/ux-0.1.9/src/rsDic.hpp +57 -0
- data/vendor/ux-trie/ux-0.1.9/src/ux.hpp +26 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxMain.cpp +206 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxMap.cpp +0 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxMap.hpp +248 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxMapTest.cpp +139 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxTest.cpp +229 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxTrie.cpp +529 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxTrie.hpp +220 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxUtil.cpp +92 -0
- data/vendor/ux-trie/ux-0.1.9/src/uxUtil.hpp +35 -0
- data/vendor/ux-trie/ux-0.1.9/src/wscript +43 -0
- data/vendor/ux-trie/ux-0.1.9/unittest_gtest.py +0 -0
- data/vendor/ux-trie/ux-0.1.9/unittest_gtest.pyc +0 -0
- data/vendor/ux-trie/ux-0.1.9/unittestt.py +166 -0
- data/vendor/ux-trie/ux-0.1.9/ux.pc.in +10 -0
- data/vendor/ux-trie/ux-0.1.9/waf +0 -0
- data/vendor/ux-trie/ux-0.1.9/wscript +32 -0
- metadata +249 -0
@@ -0,0 +1,220 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2010 Daisuke Okanohara
|
3
|
+
*
|
4
|
+
* Redistribution and use in source and binary forms, with or without
|
5
|
+
* modification, are permitted provided that the following conditions
|
6
|
+
* are met:
|
7
|
+
*
|
8
|
+
* 1. Redistributions of source code must retain the above Copyright
|
9
|
+
* notice, this list of conditions and the following disclaimer.
|
10
|
+
*
|
11
|
+
* 2. Redistributions in binary form must reproduce the above Copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
*
|
15
|
+
* 3. Neither the name of the authors nor the names of its contributors
|
16
|
+
* may be used to endorse or promote products derived from this
|
17
|
+
* software without specific prior written permission.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#ifndef UX_TRIE_HPP__
|
21
|
+
#define UX_TRIE_HPP__
|
22
|
+
|
23
|
+
#include <string>
|
24
|
+
#include <vector>
|
25
|
+
#include <stdint.h>
|
26
|
+
#include "bitVec.hpp"
|
27
|
+
#include "rsDic.hpp"
|
28
|
+
|
29
|
+
namespace ux{
|
30
|
+
|
31
|
+
typedef uint64_t id_t;
|
32
|
+
|
33
|
+
enum {
|
34
|
+
NOTFOUND = 0xFFFFFFFFU,
|
35
|
+
LIMIT_DEFAULT = 0xFFFFFFFFU
|
36
|
+
};
|
37
|
+
|
38
|
+
|
39
|
+
/**
|
40
|
+
* Succinct Trie Data structure
|
41
|
+
*/
|
42
|
+
class Trie {
|
43
|
+
public:
|
44
|
+
/**
|
45
|
+
* Constructor
|
46
|
+
*/
|
47
|
+
Trie();
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Constructor
|
51
|
+
* @param keyList input key list
|
52
|
+
* @param isTailUX use tail compression.
|
53
|
+
*/
|
54
|
+
Trie(std::vector<std::string>& keyList, bool isTailUX = true);
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Destructor
|
58
|
+
*/
|
59
|
+
~Trie();
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Build a dictionary from keyList
|
63
|
+
* @param keyList input key list
|
64
|
+
* @param isTailUX use tail compression.
|
65
|
+
*/
|
66
|
+
void build(std::vector<std::string>& keyList, bool isTailUX = true);
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Save the dictionary in a file
|
70
|
+
* @param indexName The file name
|
71
|
+
* @return 0 on success, -1 on failure
|
72
|
+
*/
|
73
|
+
int save(const char* indexName) const;
|
74
|
+
|
75
|
+
/**
|
76
|
+
* Load the dicitonary from a file
|
77
|
+
* @param indexName The filename
|
78
|
+
* @return 0 on success, -1 on failure
|
79
|
+
*/
|
80
|
+
int load(const char* indexName);
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Save the dictionary in ostream
|
84
|
+
* @param os The ostream as an output
|
85
|
+
* @return 0 on success, -1 on failure
|
86
|
+
*/
|
87
|
+
int save(std::ostream& os) const;
|
88
|
+
|
89
|
+
/**
|
90
|
+
* Load the dictionary from istream
|
91
|
+
* @param is The istream as an input
|
92
|
+
* @return 0 on success, -1 on failure
|
93
|
+
*/
|
94
|
+
int load(std::istream& is);
|
95
|
+
|
96
|
+
/**
|
97
|
+
* Return the longest key that matches the prefix of the query in the dictionary
|
98
|
+
* @param str the query
|
99
|
+
* @param len the length of the query
|
100
|
+
* @param retLen The length of the matched key in the dictionary
|
101
|
+
* @return The ID of the matched key or NOTFOUND if no key is matched
|
102
|
+
*/
|
103
|
+
id_t prefixSearch(const char* str, size_t len, size_t& retLen) const;
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Return the all keys that match the prefix of the query in the dictionary
|
107
|
+
* @param str the query
|
108
|
+
* @param len the length of the query
|
109
|
+
* @param retIDs The IDs of the matched keys
|
110
|
+
* @param limit The maximum number of matched keys
|
111
|
+
* @return The number of matched keys
|
112
|
+
*/
|
113
|
+
size_t commonPrefixSearch(const char* str, size_t len, std::vector<id_t>& retIDs,
|
114
|
+
size_t limit = LIMIT_DEFAULT) const;
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Return the all keys whose their prefixes match the query
|
118
|
+
* @param str the query
|
119
|
+
* @param len the length of the query
|
120
|
+
* @param The IDs of the matched keys
|
121
|
+
* @param limit The maximum number of matched keys
|
122
|
+
* @return The number of matched keys
|
123
|
+
*/
|
124
|
+
size_t predictiveSearch(const char* str, size_t len, std::vector<id_t>& retIDs,
|
125
|
+
size_t limit = LIMIT_DEFAULT) const;
|
126
|
+
|
127
|
+
/**
|
128
|
+
* Return the key for the given ID
|
129
|
+
* @param id The ID of the key
|
130
|
+
* @param ret The key for the given ID or empty if such ID does not exist
|
131
|
+
*/
|
132
|
+
void decodeKey(id_t id, std::string& ret) const;
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Return the key for the given ID
|
136
|
+
* @param id The ID of the key
|
137
|
+
* @return The key for the given ID or empty if such ID does not exist
|
138
|
+
*/
|
139
|
+
std::string decodeKey(id_t id) const;
|
140
|
+
|
141
|
+
/**
|
142
|
+
* Return the number of keys in the dictionary
|
143
|
+
* @return the number of keys in the dictionary
|
144
|
+
*/
|
145
|
+
size_t size() const;
|
146
|
+
|
147
|
+
/**
|
148
|
+
* Clear the internal state
|
149
|
+
*/
|
150
|
+
void clear();
|
151
|
+
|
152
|
+
/*
|
153
|
+
* Get the allocated memory size
|
154
|
+
* @return The size of the allocated memory
|
155
|
+
*/
|
156
|
+
size_t getAllocSize() const;
|
157
|
+
|
158
|
+
/*
|
159
|
+
* Report the statistics of the memory allocation
|
160
|
+
* @param allocSize The initial overhead size
|
161
|
+
* @param os The output distination
|
162
|
+
*/
|
163
|
+
void allocStat(size_t allocSize, std::ostream& os) const;
|
164
|
+
|
165
|
+
/*
|
166
|
+
* Report the internal statistics
|
167
|
+
* @param os The output distination
|
168
|
+
*/
|
169
|
+
void stat(std::ostream& os) const;
|
170
|
+
|
171
|
+
/**
|
172
|
+
* Report the error message for the error ID
|
173
|
+
* @param error The error ID
|
174
|
+
* @return The error message
|
175
|
+
*/
|
176
|
+
static std::string what(int error);
|
177
|
+
|
178
|
+
private:
|
179
|
+
void buildTailUX();
|
180
|
+
bool isLeaf(uint64_t pos) const;
|
181
|
+
void getChild(uint8_t c, uint64_t& pos, uint64_t& zeros) const;
|
182
|
+
void getParent(uint8_t& c, uint64_t& pos, uint64_t& zeros) const;
|
183
|
+
void traverse(const char* str, size_t len, size_t& retLen, std::vector<id_t>& retIDs,
|
184
|
+
size_t limit) const;
|
185
|
+
|
186
|
+
void enumerateAll(uint64_t pos, uint64_t zeros, std::vector<id_t>& retIDs, size_t limit) const;
|
187
|
+
bool tailMatch(const char* str, size_t len, size_t depth,
|
188
|
+
uint64_t tailID, size_t& retLen) const;
|
189
|
+
std::string getTail(uint64_t i) const;
|
190
|
+
|
191
|
+
RSDic loud_;
|
192
|
+
RSDic terminal_;
|
193
|
+
RSDic tail_;
|
194
|
+
|
195
|
+
std::vector<std::string> vtails_;
|
196
|
+
Trie* vtailux_;
|
197
|
+
std::vector<uint8_t> edges_;
|
198
|
+
BitVec tailIDs_;
|
199
|
+
size_t tailIDLen_;
|
200
|
+
size_t keyNum_;
|
201
|
+
bool isReady_;
|
202
|
+
|
203
|
+
public:
|
204
|
+
/**
|
205
|
+
* Error code.
|
206
|
+
*/
|
207
|
+
enum {
|
208
|
+
SUCCESS = 0,
|
209
|
+
FILE_OPEN_ERROR = 1,
|
210
|
+
FILE_WRITE_ERROR = 2,
|
211
|
+
FILE_READ_ERROR = 3,
|
212
|
+
SAVE_ERROR = 4,
|
213
|
+
LOAD_ERROR = 5
|
214
|
+
};
|
215
|
+
};
|
216
|
+
|
217
|
+
|
218
|
+
}
|
219
|
+
|
220
|
+
#endif // UX_TRIE_HPP__
|
@@ -0,0 +1,92 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2010 Daisuke Okanohara
|
3
|
+
*
|
4
|
+
* Redistribution and use in source and binary forms, with or without
|
5
|
+
* modification, are permitted provided that the following conditions
|
6
|
+
* are met:
|
7
|
+
*
|
8
|
+
* 1. Redistributions of source code must retain the above Copyright
|
9
|
+
* notice, this list of conditions and the following disclaimer.
|
10
|
+
*
|
11
|
+
* 2. Redistributions in binary form must reproduce the above Copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
*
|
15
|
+
* 3. Neither the name of the authors nor the names of its contributors
|
16
|
+
* may be used to endorse or promote products derived from this
|
17
|
+
* software without specific prior written permission.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include "uxUtil.hpp"
|
21
|
+
|
22
|
+
namespace ux{
|
23
|
+
|
24
|
+
uint64_t lg2(const uint64_t x){
|
25
|
+
uint64_t ret = 0;
|
26
|
+
while (x >> ret){
|
27
|
+
++ret;
|
28
|
+
}
|
29
|
+
return ret;
|
30
|
+
}
|
31
|
+
|
32
|
+
uint64_t mask(uint64_t x, uint64_t pos){
|
33
|
+
return x & ((1LLU << pos) - 1);
|
34
|
+
}
|
35
|
+
|
36
|
+
uint64_t popCount(uint64_t r) {
|
37
|
+
r = (r & 0x5555555555555555ULL) +
|
38
|
+
((r >> 1) & 0x5555555555555555ULL);
|
39
|
+
r = (r & 0x3333333333333333ULL) +
|
40
|
+
((r >> 2) & 0x3333333333333333ULL);
|
41
|
+
r = (r + (r >> 4)) & 0x0f0f0f0f0f0f0f0fULL;
|
42
|
+
r = r + (r >> 8);
|
43
|
+
r = r + (r >> 16);
|
44
|
+
r = r + (r >> 32);
|
45
|
+
return (uint64_t)(r & 0x7f);
|
46
|
+
}
|
47
|
+
|
48
|
+
uint64_t popCountMasked(uint64_t x, uint64_t pos){
|
49
|
+
return popCount(mask(x, pos));
|
50
|
+
}
|
51
|
+
|
52
|
+
uint64_t selectBlock(uint64_t r, uint64_t x, uint8_t b) {
|
53
|
+
if (!b) x = ~x;
|
54
|
+
uint64_t x1 = x - ((x & 0xAAAAAAAAAAAAAAAALLU) >> 1);
|
55
|
+
uint64_t x2 = (x1 & 0x3333333333333333LLU) + ((x1 >> 2) & 0x3333333333333333LLU);
|
56
|
+
uint64_t x3 = (x2 + (x2 >> 4)) & 0x0F0F0F0F0F0F0F0FLLU;
|
57
|
+
|
58
|
+
uint64_t pos = 0;
|
59
|
+
for (;; pos += 8){
|
60
|
+
uint64_t b = (x3 >> pos) & 0xFFLLU;
|
61
|
+
if (r <= b) break;
|
62
|
+
r -= b;
|
63
|
+
}
|
64
|
+
|
65
|
+
uint64_t v2 = (x2 >> pos) & 0xFLLU;
|
66
|
+
if (r > v2) {
|
67
|
+
r -= v2;
|
68
|
+
pos += 4;
|
69
|
+
}
|
70
|
+
|
71
|
+
uint64_t v1 = (x1 >> pos) & 0x3LLU;
|
72
|
+
if (r > v1){
|
73
|
+
r -= v1;
|
74
|
+
pos += 2;
|
75
|
+
}
|
76
|
+
|
77
|
+
uint64_t v0 = (x >> pos) & 0x1LLU;
|
78
|
+
if (v0 < r){
|
79
|
+
r -= v0;
|
80
|
+
pos += 1;
|
81
|
+
}
|
82
|
+
|
83
|
+
return pos;
|
84
|
+
}
|
85
|
+
|
86
|
+
uint64_t getBitNum(uint64_t oneNum, uint64_t num, uint8_t bit){
|
87
|
+
if (bit) return oneNum;
|
88
|
+
else return num - oneNum;
|
89
|
+
}
|
90
|
+
|
91
|
+
}
|
92
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2010 Daisuke Okanohara
|
3
|
+
*
|
4
|
+
* Redistribution and use in source and binary forms, with or without
|
5
|
+
* modification, are permitted provided that the following conditions
|
6
|
+
* are met:
|
7
|
+
*
|
8
|
+
* 1. Redistributions of source code must retain the above Copyright
|
9
|
+
* notice, this list of conditions and the following disclaimer.
|
10
|
+
*
|
11
|
+
* 2. Redistributions in binary form must reproduce the above Copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
*
|
15
|
+
* 3. Neither the name of the authors nor the names of its contributors
|
16
|
+
* may be used to endorse or promote products derived from this
|
17
|
+
* software without specific prior written permission.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#ifndef UX_UTIL_HPP__
|
21
|
+
#define UX_UTIL_HPP__
|
22
|
+
|
23
|
+
#include <stdint.h>
|
24
|
+
|
25
|
+
namespace ux {
|
26
|
+
uint64_t lg2(uint64_t x);
|
27
|
+
uint64_t mask(uint64_t x, uint64_t pos);
|
28
|
+
uint64_t popCount(uint64_t r);
|
29
|
+
uint64_t popCountMasked(uint64_t x, uint64_t pos);
|
30
|
+
uint64_t selectBlock(uint64_t pos, uint64_t x, uint8_t b);
|
31
|
+
uint64_t getBitNum(uint64_t oneNum, uint64_t num, uint8_t bit);
|
32
|
+
}
|
33
|
+
|
34
|
+
#endif // UX_UTIL_HPP__
|
35
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
APPNAME= 'ux'
|
2
|
+
|
3
|
+
top = '.'
|
4
|
+
out = 'bin'
|
5
|
+
|
6
|
+
def options(ctx):
|
7
|
+
pass
|
8
|
+
|
9
|
+
def configure(ctx):
|
10
|
+
pass
|
11
|
+
|
12
|
+
def build(bld):
|
13
|
+
bld.shlib(
|
14
|
+
source = 'uxTrie.cpp bitVec.cpp rsDic.cpp uxUtil.cpp uxMap.cpp',
|
15
|
+
target = 'ux',
|
16
|
+
name = 'UX',
|
17
|
+
includes = '.')
|
18
|
+
bld.program(
|
19
|
+
source = 'uxMain.cpp',
|
20
|
+
target = 'ux',
|
21
|
+
includes = '.',
|
22
|
+
use = 'UX')
|
23
|
+
bld.program(
|
24
|
+
features = 'gtest',
|
25
|
+
source = 'uxTest.cpp',
|
26
|
+
target = 'ux_test',
|
27
|
+
use = 'UX' ,
|
28
|
+
includes = '.')
|
29
|
+
bld.program(
|
30
|
+
features = 'gtest',
|
31
|
+
source = 'bitVecTest.cpp',
|
32
|
+
target = 'bitvec_test',
|
33
|
+
use = 'UX',
|
34
|
+
includes = '.')
|
35
|
+
|
36
|
+
bld.program(
|
37
|
+
features = 'gtest',
|
38
|
+
source = 'uxMapTest.cpp',
|
39
|
+
target = 'uxmap_test',
|
40
|
+
use = 'UX',
|
41
|
+
includes = '.')
|
42
|
+
|
43
|
+
bld.install_files('${PREFIX}/include/ux', bld.path.ant_glob('*.hpp'))
|
Binary file
|
Binary file
|
@@ -0,0 +1,166 @@
|
|
1
|
+
#! /usr/bin/env python
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
import os, sys
|
5
|
+
import Options, Task, Utils, Logs
|
6
|
+
from TaskGen import before, after, feature
|
7
|
+
from Constants import *
|
8
|
+
|
9
|
+
def detect(conf):
|
10
|
+
if conf.check_cfg(path = 'gtest-config',
|
11
|
+
args = '--cppflags --cxxflags --ldflags --libs',
|
12
|
+
package = '',
|
13
|
+
uselib_store = 'GTEST'):
|
14
|
+
def f(str):
|
15
|
+
if str == 'gtest':
|
16
|
+
return 'gtest_main'
|
17
|
+
else:
|
18
|
+
return str
|
19
|
+
conf.env.LIB_GTEST = map(f, conf.env.LIB_GTEST)
|
20
|
+
|
21
|
+
def set_options(opt):
|
22
|
+
opt.add_option('--check', action = 'store_true', default = False,
|
23
|
+
help = 'Execute unit tests')
|
24
|
+
opt.add_option('--checkall', action = 'store_true', default = False,
|
25
|
+
help = 'Execute all unit tests')
|
26
|
+
opt.add_option('--checkone', action = 'store', default = False,
|
27
|
+
help = 'Execute specified unit test')
|
28
|
+
opt.add_option('--checkfilter', action = 'store', default = False,
|
29
|
+
help = 'Execute unit tests sprcified by pattern')
|
30
|
+
|
31
|
+
def match_filter(filt, targ):
|
32
|
+
if isinstance(filt, str):
|
33
|
+
(pat, _, _) = filt.partition('.')
|
34
|
+
if pat == '*':
|
35
|
+
return True
|
36
|
+
return pat == targ
|
37
|
+
return False
|
38
|
+
|
39
|
+
def test_remover(self):
|
40
|
+
if not Options.options.check and not Options.options.checkall and self.target != Options.options.checkone and not match_filter(Options.options.checkfilter, self.target):
|
41
|
+
self.meths[:] = []
|
42
|
+
|
43
|
+
feature('testt', 'gtest')(test_remover)
|
44
|
+
before('apply_core')(test_remover)
|
45
|
+
|
46
|
+
def make_test(self):
|
47
|
+
if not 'cprogram' in self.features:
|
48
|
+
Logs.error('test cannot be executed %s'%self)
|
49
|
+
return
|
50
|
+
self.default_install_path = None
|
51
|
+
self.create_task('utest', self.link_task.outputs)
|
52
|
+
|
53
|
+
feature('testt', 'gtest')(make_test)
|
54
|
+
after('apply_link', 'vars_target_cprogram')(make_test)
|
55
|
+
|
56
|
+
def gtest_attach(self):
|
57
|
+
if not self.env.HAVE_GTEST:
|
58
|
+
Logs.error('gtest is not found')
|
59
|
+
self.meths[:] = []
|
60
|
+
return
|
61
|
+
|
62
|
+
if isinstance(self.uselib, str):
|
63
|
+
self.uselib += " GTEST"
|
64
|
+
else:
|
65
|
+
self.uselib.append('GTEST')
|
66
|
+
|
67
|
+
feature('gtest')(gtest_attach)
|
68
|
+
before('apply_core')(gtest_attach)
|
69
|
+
|
70
|
+
import threading
|
71
|
+
testlock = threading.Lock()
|
72
|
+
|
73
|
+
def exec_test(self):
|
74
|
+
variant = self.env.variant()
|
75
|
+
filename = self.inputs[0].abspath(self.env)
|
76
|
+
|
77
|
+
try:
|
78
|
+
fu = getattr(self.generator.bld, 'all_test_paths')
|
79
|
+
except AttributeError:
|
80
|
+
fu = os.environ.copy()
|
81
|
+
self.generator.bld.all_test_paths = fu
|
82
|
+
|
83
|
+
lst = []
|
84
|
+
for obj in self.generator.bld.all_task_gen:
|
85
|
+
link_task=getattr(obj, 'link_task', None)
|
86
|
+
if link_task and link_task.env.variant()==variant:
|
87
|
+
lst.append(link_task.outputs[0].parent.abspath(obj.env))
|
88
|
+
|
89
|
+
def add_path(dct, path, var):
|
90
|
+
dct[var] = os.pathsep.join(Utils.to_list(path)+[os.environ.get(var, '')])
|
91
|
+
if sys.platform=='win32':
|
92
|
+
add_path(fu, lst, 'PATH')
|
93
|
+
elif sys.platform=='darwin':
|
94
|
+
add_path(fu, lst, 'DYLD_LIBRARY_PATH')
|
95
|
+
add_path(fu, lst, 'LD_LIBRARY_PATH')
|
96
|
+
else:
|
97
|
+
add_path(fu, lst, 'LD_LIBRARY_PATH')
|
98
|
+
|
99
|
+
cmdline = [filename]
|
100
|
+
cwd = self.inputs[0].parent.abspath(self.env)
|
101
|
+
|
102
|
+
if isinstance(Options.options.checkfilter, str):
|
103
|
+
(_, _, filt) = Options.options.checkfilter.partition('.')
|
104
|
+
if filt != "":
|
105
|
+
cmdline += ['--gtest_filter=' + filt]
|
106
|
+
|
107
|
+
proc = Utils.pproc.Popen(cmdline, cwd = cwd, env = fu,
|
108
|
+
stderr = Utils.pproc.PIPE,
|
109
|
+
stdout = Utils.pproc.PIPE)
|
110
|
+
(stdout, stderr) = proc.communicate()
|
111
|
+
tup = (filename, proc.returncode, stdout, stderr)
|
112
|
+
|
113
|
+
testlock.acquire()
|
114
|
+
try:
|
115
|
+
try:
|
116
|
+
self.generator.bld.utest_results.append(tup)
|
117
|
+
except:
|
118
|
+
self.generator.bld.utest_results = [tup]
|
119
|
+
|
120
|
+
a = getattr(self.generator.bld, 'added_post_fun', False)
|
121
|
+
if not a:
|
122
|
+
self.generator.bld.add_post_fun(summary)
|
123
|
+
self.generator.bld.added_post_fun = True
|
124
|
+
|
125
|
+
finally:
|
126
|
+
testlock.release()
|
127
|
+
|
128
|
+
cls = Task.task_type_from_func('utest', func = exec_test, color = 'PINK', ext_in = '.bin')
|
129
|
+
old = cls.runnable_status
|
130
|
+
|
131
|
+
def test_status(self):
|
132
|
+
if Options.options.checkall:
|
133
|
+
return RUN_ME
|
134
|
+
if Options.options.checkone == self.generator.name:
|
135
|
+
return RUN_ME
|
136
|
+
if isinstance(Options.options.checkfilter, str):
|
137
|
+
if match_filter(Options.options.checkfilter, self.generator.name):
|
138
|
+
return RUN_ME
|
139
|
+
return old(self)
|
140
|
+
|
141
|
+
cls.runnable_status = test_status
|
142
|
+
cls.quiet = 1
|
143
|
+
|
144
|
+
def summary(bld):
|
145
|
+
lst = getattr(bld, 'utest_results', [])
|
146
|
+
|
147
|
+
if not lst: return
|
148
|
+
|
149
|
+
total = len(lst)
|
150
|
+
fail = len([x for x in lst if x[1]])
|
151
|
+
|
152
|
+
Utils.pprint('CYAN', 'test summary')
|
153
|
+
Utils.pprint('CYAN', ' tests that pass %d/%d' % (total-fail, total))
|
154
|
+
|
155
|
+
for (f, code, out, err) in lst:
|
156
|
+
if not code:
|
157
|
+
Utils.pprint('GREEN', ' %s' % f)
|
158
|
+
if isinstance(Options.options.checkfilter, str):
|
159
|
+
print(out)
|
160
|
+
|
161
|
+
if fail>0:
|
162
|
+
Utils.pprint('RED', ' tests that fail %d/%d' % (fail, total))
|
163
|
+
for (f, code, out, err) in lst:
|
164
|
+
if code:
|
165
|
+
Utils.pprint('RED', ' %s' % f)
|
166
|
+
print(out)
|