laag-libczmq 4.1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +57 -0
- data/LICENSE.txt +373 -0
- data/README.org +34 -0
- data/ext/laag/libczmq/extconf.rb +24 -0
- data/laag-libczmq.gemspec +21 -0
- data/lib/laag/libczmq.rb +30 -0
- data/vendor/github.com/zeromq/czmq/.editorconfig +19 -0
- data/vendor/github.com/zeromq/czmq/.gitattributes +5 -0
- data/vendor/github.com/zeromq/czmq/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- data/vendor/github.com/zeromq/czmq/.gitignore +137 -0
- data/vendor/github.com/zeromq/czmq/.travis.yml +126 -0
- data/vendor/github.com/zeromq/czmq/AUTHORS +69 -0
- data/vendor/github.com/zeromq/czmq/CMakeLists.txt +653 -0
- data/vendor/github.com/zeromq/czmq/CONTRIBUTING.md +19 -0
- data/vendor/github.com/zeromq/czmq/Dockerfile +29 -0
- data/vendor/github.com/zeromq/czmq/Findlibsodium.cmake +47 -0
- data/vendor/github.com/zeromq/czmq/Findlibzmq.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/Findlz4.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/Findsystemd.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/Finduuid.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/INSTALL.cygwin +13 -0
- data/vendor/github.com/zeromq/czmq/ISSUES.cygwin +6 -0
- data/vendor/github.com/zeromq/czmq/Jenkinsfile +439 -0
- data/vendor/github.com/zeromq/czmq/LICENSE +373 -0
- data/vendor/github.com/zeromq/czmq/Makefile.am +70 -0
- data/vendor/github.com/zeromq/czmq/NEWS +823 -0
- data/vendor/github.com/zeromq/czmq/README.cygwin +23 -0
- data/vendor/github.com/zeromq/czmq/README.md +9345 -0
- data/vendor/github.com/zeromq/czmq/README.txt +512 -0
- data/vendor/github.com/zeromq/czmq/Vagrantfile +49 -0
- data/vendor/github.com/zeromq/czmq/acinclude.m4 +7 -0
- data/vendor/github.com/zeromq/czmq/api/zactor.api +77 -0
- data/vendor/github.com/zeromq/czmq/api/zargs.api +110 -0
- data/vendor/github.com/zeromq/czmq/api/zarmour.api +103 -0
- data/vendor/github.com/zeromq/czmq/api/zcert.api +128 -0
- data/vendor/github.com/zeromq/czmq/api/zcertstore.api +80 -0
- data/vendor/github.com/zeromq/czmq/api/zchunk.api +171 -0
- data/vendor/github.com/zeromq/czmq/api/zclock.api +43 -0
- data/vendor/github.com/zeromq/czmq/api/zconfig.api +205 -0
- data/vendor/github.com/zeromq/czmq/api/zdigest.api +45 -0
- data/vendor/github.com/zeromq/czmq/api/zdir.api +124 -0
- data/vendor/github.com/zeromq/czmq/api/zdir_patch.api +62 -0
- data/vendor/github.com/zeromq/czmq/api/zfile.api +157 -0
- data/vendor/github.com/zeromq/czmq/api/zframe.api +157 -0
- data/vendor/github.com/zeromq/czmq/api/zgossip_msg.api +104 -0
- data/vendor/github.com/zeromq/czmq/api/zhash.api +184 -0
- data/vendor/github.com/zeromq/czmq/api/zhashx.api +295 -0
- data/vendor/github.com/zeromq/czmq/api/ziflist.api +73 -0
- data/vendor/github.com/zeromq/czmq/api/zlist.api +158 -0
- data/vendor/github.com/zeromq/czmq/api/zlistx.api +220 -0
- data/vendor/github.com/zeromq/czmq/api/zloop.api +176 -0
- data/vendor/github.com/zeromq/czmq/api/zmsg.api +250 -0
- data/vendor/github.com/zeromq/czmq/api/zpoller.api +71 -0
- data/vendor/github.com/zeromq/czmq/api/zproc.api +247 -0
- data/vendor/github.com/zeromq/czmq/api/zsock.api +412 -0
- data/vendor/github.com/zeromq/czmq/api/zsock_option.api +847 -0
- data/vendor/github.com/zeromq/czmq/api/zstr.api +119 -0
- data/vendor/github.com/zeromq/czmq/api/zsys.api +490 -0
- data/vendor/github.com/zeromq/czmq/api/ztimerset.api +69 -0
- data/vendor/github.com/zeromq/czmq/api/ztrie.api +80 -0
- data/vendor/github.com/zeromq/czmq/api/zuuid.api +82 -0
- data/vendor/github.com/zeromq/czmq/appveyor.yml +73 -0
- data/vendor/github.com/zeromq/czmq/autogen.sh +52 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/CMakeLists.txt +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/Findczmq.cmake +47 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/README.md +130 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/android/CMakeLists.txt +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/android/android_toolchain.cmake +52 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/android/build.sh +68 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/build.gradle +151 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/ci_build.sh +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradlew +164 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradlew.bat +90 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/configure.bat +93 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/platform.h +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Common.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DLL.props +16 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Debug.props +29 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugDEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugDLL.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLIB.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLTCG.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugSEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/EXE.props +17 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/LIB.props +16 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/LTCG.props +13 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Link.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Messages.props +15 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Output.props +30 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Release.props +41 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseDEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseDLL.props +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLIB.props +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLTCG.props +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseSEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Win32.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/x64.props +23 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/resource.h +14 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/resource.rc +94 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/settings.gradle +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zarmour.c +132 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zcert.c +188 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zcertstore.c +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zchunk.c +191 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zclock.c +54 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zconfig.c +252 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zdigest.c +66 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zdir.c +116 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_ZdirPatch.c +88 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zfile.c +186 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zframe.c +199 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zhash.c +174 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zhashx.c +175 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ziflist.c +112 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zlist.c +135 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zlistx.c +189 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zloop.c +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zmsg.c +261 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zpoller.c +74 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zproc.c +278 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zsock.c +1310 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zstr.c +108 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zsys.c +445 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ztimerset.c +68 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ztrie.c +86 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zuuid.c +125 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zarmour.java +148 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zcert.java +178 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zcertstore.java +94 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zchunk.java +204 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zclock.java +67 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zconfig.java +253 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zdigest.java +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zdir.java +159 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/ZdirPatch.java +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zfile.java +217 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zframe.java +212 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zhash.java +223 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zhashx.java +248 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ziflist.java +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zlist.java +171 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zlistx.java +247 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zloop.java +134 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zmsg.java +308 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zpoller.java +105 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zproc.java +331 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zsock.java +1556 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zstr.java +117 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zsys.java +534 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ztimerset.java +87 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ztrie.java +102 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zuuid.java +127 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZarmourTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZcertTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZcertstoreTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZchunkTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZclockTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZconfigTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdigestTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdirPatchTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdirTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZfileTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZframeTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZhashTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZhashxTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZiflistTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZlistTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZlistxTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZloopTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZmsgTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZpollerTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZprocTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZsockTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZstrTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZsysTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZtimersetTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZtrieTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZuuidTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/lua_ffi/czmq_ffi.lua +4079 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/.gitignore +10 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/.prebuildrc +2 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/README.md +4373 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.cc +8324 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.gyp +49 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.h +952 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/build.sh +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/index.js +39 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/package.json +26 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/test_binding.js +32 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/ci_build.sh +59 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/czmq/__init__.py +3 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/czmq/_czmq_ctypes.py +8344 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/test.py +1078 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/README.md +28 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zactor.py +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zargs.py +133 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zarmour.py +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zcert.py +132 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zcertstore.py +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zchunk.py +192 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zclock.py +59 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zconfig.py +211 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zdigest.py +64 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zdir.py +144 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/ZdirPatch.py +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zfile.py +185 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zframe.py +160 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zhash.py +197 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zhashx.py +271 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ziflist.py +103 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zlist.py +176 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zlistx.py +235 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zloop.py +171 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zmsg.py +250 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zpoller.py +89 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zproc.py +287 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zsock.py +1283 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zstr.py +123 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zsys.py +532 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ztimerset.py +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ztrie.py +93 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zuuid.py +100 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/__init__.py +33 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/_cdefs.inc +4081 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/build.py +345 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/cdefs.py +4086 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/dlopen.py +33 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/utils.py +50 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/setup.py +23 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/README.md +157 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/Rakefile +34 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/qml_czmq_bindings.pro +136 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZactor.cpp +88 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZactor.h +86 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZargs.cpp +121 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZargs.h +105 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZarmour.cpp +135 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZarmour.h +108 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcert.cpp +166 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcert.h +122 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcertstore.cpp +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcertstore.h +93 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZchunk.cpp +214 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZchunk.h +149 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZclock.cpp +67 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZclock.h +77 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZconfig.cpp +255 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZconfig.h +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdigest.cpp +70 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdigest.h +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdir.cpp +158 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdir.h +134 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdirPatch.cpp +89 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdirPatch.h +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZfile.cpp +204 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZfile.h +152 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZframe.cpp +200 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZframe.h +143 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhash.cpp +219 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhash.h +174 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhashx.cpp +308 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhashx.h +225 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZiflist.cpp +111 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZiflist.h +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlist.cpp +184 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlist.h +148 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlistx.cpp +244 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlistx.h +184 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZloop.cpp +177 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZloop.h +149 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZmsg.cpp +313 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZmsg.h +209 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZpoller.cpp +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZpoller.h +97 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZproc.cpp +296 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZproc.h +211 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsock.cpp +1471 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsock.h +882 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZstr.cpp +137 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZstr.h +120 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsys.cpp +541 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsys.h +373 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtimerset.cpp +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtimerset.h +86 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtrie.cpp +101 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtrie.h +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZuuid.cpp +116 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZuuid.h +99 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/qml_czmq_plugin.h +174 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/qmldir +2 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/test/tst_QmlCZMQ.qml +16 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/README.md +87 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/buildlib/buildlib.pro +36 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/common.pri +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/config.pri +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/qczmq.pro +13 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/selftest/main.cpp +57 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/selftest/selftest.pro +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qczmq.h +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qczmq.pri +81 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzactor.cpp +98 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzactor.h +61 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzargs.cpp +130 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzargs.h +72 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzarmour.cpp +162 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzarmour.h +83 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcert.cpp +191 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcert.h +97 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcertstore.cpp +105 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcertstore.h +68 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzchunk.cpp +250 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzchunk.h +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzclock.cpp +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzclock.h +52 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzconfig.cpp +292 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzconfig.h +140 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdigest.cpp +80 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdigest.h +53 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdir.cpp +176 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdir.h +109 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdirpatch.cpp +101 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdirpatch.h +59 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzfile.cpp +243 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzfile.h +127 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzframe.cpp +231 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzframe.h +118 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhash.cpp +250 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhash.h +149 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhashx.cpp +350 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhashx.h +200 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qziflist.cpp +133 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qziflist.h +71 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlist.cpp +220 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlist.h +123 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlistx.cpp +296 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlistx.h +159 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzloop.cpp +211 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzloop.h +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzmsg.cpp +354 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzmsg.h +184 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzpoller.cpp +100 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzpoller.h +67 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzproc.cpp +365 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzproc.h +186 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsock.cpp +1719 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsock.h +815 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzstr.cpp +128 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzstr.h +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsys.cpp +600 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsys.h +321 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztimerset.cpp +98 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztimerset.h +61 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztrie.cpp +117 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztrie.h +70 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzuuid.cpp +135 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzuuid.h +74 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/Rakefile +8 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi.rb +875 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/version.rb +15 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zactor.rb +219 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zargs.rb +259 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zarmour.rb +286 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zcert.rb +304 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zcertstore.rb +224 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zchunk.rb +388 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zclock.rb +140 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zconfig.rb +462 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdigest.rb +156 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdir.rb +283 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdir_patch.rb +194 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zfile.rb +361 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zframe.rb +360 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zhash.rb +386 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zhashx.rb +617 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ziflist.rb +219 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zlist.rb +365 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zlistx.rb +478 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zloop.rb +396 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zmsg.rb +515 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zpoller.rb +194 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zproc.rb +497 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zsock.rb +4673 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zstr.rb +242 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zsys.rb +836 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ztimerset.rb +203 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ztrie.rb +221 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zuuid.rb +227 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/spec/ffi_spec.rb +15 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/spec/spec_helper.rb +8 -0
- data/vendor/github.com/zeromq/czmq/builds/android/android_build_helper.sh +298 -0
- data/vendor/github.com/zeromq/czmq/builds/android/build.sh +94 -0
- data/vendor/github.com/zeromq/czmq/builds/android/ci_build.sh +41 -0
- data/vendor/github.com/zeromq/czmq/builds/check_zproject/ci_build.sh +52 -0
- data/vendor/github.com/zeromq/czmq/builds/check_zproto/ci_build.sh +23 -0
- data/vendor/github.com/zeromq/czmq/builds/cmake/ci_build.sh +93 -0
- data/vendor/github.com/zeromq/czmq/builds/cygwin/Makefile.cygwin +32 -0
- data/vendor/github.com/zeromq/czmq/builds/docs/ci_build.sh +24 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/.gitignore +5 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/README.md +33 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/platform.h +46 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/project.gyp +195 -0
- data/vendor/github.com/zeromq/czmq/builds/mingw32/Makefile.mingw32 +33 -0
- data/vendor/github.com/zeromq/czmq/builds/mingw32/platform.h +0 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/configure.bat +93 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.bat +14 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.nuspec +92 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.targets +128 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/platform.h +1 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Common.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DLL.props +16 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Debug.props +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugDEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugDLL.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLIB.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLTCG.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugSEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/EXE.props +17 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/LIB.props +16 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/LTCG.props +13 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Link.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Messages.props +15 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Output.props +30 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Release.props +41 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseDEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseDLL.props +19 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLIB.props +19 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLTCG.props +19 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseSEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Win32.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/x64.props +23 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/resource.h +14 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/resource.rc +94 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2008/czmq/czmq.sln +65 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2008/czmq/czmq.vcproj +1411 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/nuget/czmq.autobuild +49 -0
- data/vendor/github.com/zeromq/czmq/builds/nuget/readme.nuget +18 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/README.md +62 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/build.sh +142 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/build_image.sh +32 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/prepare_img.sh +111 -0
- data/vendor/github.com/zeromq/czmq/builds/stable_zmq/ci_build.sh +62 -0
- data/vendor/github.com/zeromq/czmq/builds/valgrind/ci_build.sh +43 -0
- data/vendor/github.com/zeromq/czmq/ci_build.sh +317 -0
- data/vendor/github.com/zeromq/czmq/ci_deploy.sh +29 -0
- data/vendor/github.com/zeromq/czmq/ci_deploy_obs.sh +23 -0
- data/vendor/github.com/zeromq/czmq/configure.ac +856 -0
- data/vendor/github.com/zeromq/czmq/doc/.gitignore +91 -0
- data/vendor/github.com/zeromq/czmq/doc/Makefile.am +222 -0
- data/vendor/github.com/zeromq/czmq/doc/asciidoc.conf +64 -0
- data/vendor/github.com/zeromq/czmq/doc/czmq.adoc +51 -0
- data/vendor/github.com/zeromq/czmq/doc/czmq.txt +380 -0
- data/vendor/github.com/zeromq/czmq/doc/mkman +217 -0
- data/vendor/github.com/zeromq/czmq/doc/mkmans +15 -0
- data/vendor/github.com/zeromq/czmq/doc/wdput +43 -0
- data/vendor/github.com/zeromq/czmq/examples/security/LICENSE +18 -0
- data/vendor/github.com/zeromq/czmq/examples/security/README.txt +9 -0
- data/vendor/github.com/zeromq/czmq/examples/security/grasslands.c +32 -0
- data/vendor/github.com/zeromq/czmq/examples/security/hello.c +13 -0
- data/vendor/github.com/zeromq/czmq/examples/security/ironhouse.c +64 -0
- data/vendor/github.com/zeromq/czmq/examples/security/ironhouse2.c +123 -0
- data/vendor/github.com/zeromq/czmq/examples/security/ironhouse2_v2.c +107 -0
- data/vendor/github.com/zeromq/czmq/examples/security/passwords +2 -0
- data/vendor/github.com/zeromq/czmq/examples/security/stonehouse.c +59 -0
- data/vendor/github.com/zeromq/czmq/examples/security/strawhouse.c +49 -0
- data/vendor/github.com/zeromq/czmq/examples/security/woodhouse.c +47 -0
- data/vendor/github.com/zeromq/czmq/images/README_1.png +0 -0
- data/vendor/github.com/zeromq/czmq/include/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/include/czmq.h +39 -0
- data/vendor/github.com/zeromq/czmq/include/czmq_library.h +190 -0
- data/vendor/github.com/zeromq/czmq/include/czmq_prelude.h +735 -0
- data/vendor/github.com/zeromq/czmq/include/test_zgossip.h +44 -0
- data/vendor/github.com/zeromq/czmq/include/zactor.h +94 -0
- data/vendor/github.com/zeromq/czmq/include/zargs.h +134 -0
- data/vendor/github.com/zeromq/czmq/include/zarmour.h +114 -0
- data/vendor/github.com/zeromq/czmq/include/zauth.h +100 -0
- data/vendor/github.com/zeromq/czmq/include/zbeacon.h +86 -0
- data/vendor/github.com/zeromq/czmq/include/zcert.h +133 -0
- data/vendor/github.com/zeromq/czmq/include/zcertstore.h +101 -0
- data/vendor/github.com/zeromq/czmq/include/zchunk.h +163 -0
- data/vendor/github.com/zeromq/czmq/include/zclock.h +73 -0
- data/vendor/github.com/zeromq/czmq/include/zconfig.h +199 -0
- data/vendor/github.com/zeromq/czmq/include/zdigest.h +65 -0
- data/vendor/github.com/zeromq/czmq/include/zdir.h +149 -0
- data/vendor/github.com/zeromq/czmq/include/zdir_patch.h +82 -0
- data/vendor/github.com/zeromq/czmq/include/zfile.h +185 -0
- data/vendor/github.com/zeromq/czmq/include/zframe.h +177 -0
- data/vendor/github.com/zeromq/czmq/include/zgossip.h +95 -0
- data/vendor/github.com/zeromq/czmq/include/zhash.h +183 -0
- data/vendor/github.com/zeromq/czmq/include/zhashx.h +279 -0
- data/vendor/github.com/zeromq/czmq/include/ziflist.h +98 -0
- data/vendor/github.com/zeromq/czmq/include/zlist.h +158 -0
- data/vendor/github.com/zeromq/czmq/include/zlistx.h +205 -0
- data/vendor/github.com/zeromq/czmq/include/zloop.h +163 -0
- data/vendor/github.com/zeromq/czmq/include/zmonitor.h +73 -0
- data/vendor/github.com/zeromq/czmq/include/zmsg.h +280 -0
- data/vendor/github.com/zeromq/czmq/include/zpoller.h +87 -0
- data/vendor/github.com/zeromq/czmq/include/zproc.h +270 -0
- data/vendor/github.com/zeromq/czmq/include/zproxy.h +111 -0
- data/vendor/github.com/zeromq/czmq/include/zrex.h +82 -0
- data/vendor/github.com/zeromq/czmq/include/zsock.h +1209 -0
- data/vendor/github.com/zeromq/czmq/include/zstr.h +135 -0
- data/vendor/github.com/zeromq/czmq/include/zsys.h +439 -0
- data/vendor/github.com/zeromq/czmq/include/ztimerset.h +90 -0
- data/vendor/github.com/zeromq/czmq/include/ztrie.h +106 -0
- data/vendor/github.com/zeromq/czmq/include/zuuid.h +96 -0
- data/vendor/github.com/zeromq/czmq/issues/README.md +6 -0
- data/vendor/github.com/zeromq/czmq/issues/c +520 -0
- data/vendor/github.com/zeromq/czmq/issues/issue-407.c +146 -0
- data/vendor/github.com/zeromq/czmq/license.xml +9 -0
- data/vendor/github.com/zeromq/czmq/mkdoc +7 -0
- data/vendor/github.com/zeromq/czmq/model/chkopts.pl +47 -0
- data/vendor/github.com/zeromq/czmq/model/rename_class +42 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/changelog +5 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/compat +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/control +86 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/copyright +13 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.dsc.obs +20 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.install +2 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.manpages +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/format +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq-dev.install +4 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq-dev.manpages +2 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq4.install +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/rules +96 -0
- data/vendor/github.com/zeromq/czmq/packaging/dist/gitlog2changelog.py +125 -0
- data/vendor/github.com/zeromq/czmq/packaging/obs/_service +91 -0
- data/vendor/github.com/zeromq/czmq/packaging/redhat/czmq.spec +202 -0
- data/vendor/github.com/zeromq/czmq/project.gyp +121 -0
- data/vendor/github.com/zeromq/czmq/project.xml +99 -0
- data/vendor/github.com/zeromq/czmq/setup.py +9 -0
- data/vendor/github.com/zeromq/czmq/src/.gitignore +20 -0
- data/vendor/github.com/zeromq/czmq/src/.valgrind.supp +33 -0
- data/vendor/github.com/zeromq/czmq/src/CMakeLists-local.txt +22 -0
- data/vendor/github.com/zeromq/czmq/src/Makemodule-local.am +15 -0
- data/vendor/github.com/zeromq/czmq/src/Makemodule.am +353 -0
- data/vendor/github.com/zeromq/czmq/src/czmq_classes.h +388 -0
- data/vendor/github.com/zeromq/czmq/src/czmq_private_selftest.c +40 -0
- data/vendor/github.com/zeromq/czmq/src/czmq_selftest.c +220 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/sha1/sha1.h +76 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/sha1/sha1.inc_c +335 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/slre/readme.txt +83 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/slre/slre.h +92 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/slre/slre.inc_c +660 -0
- data/vendor/github.com/zeromq/czmq/src/libczmq.pc.in +24 -0
- data/vendor/github.com/zeromq/czmq/src/python_cffi.inc +17 -0
- data/vendor/github.com/zeromq/czmq/src/selftest-ro/.gitkeep +0 -0
- data/vendor/github.com/zeromq/czmq/src/selftest.cfg +5 -0
- data/vendor/github.com/zeromq/czmq/src/sockopts.gsl +36 -0
- data/vendor/github.com/zeromq/czmq/src/sockopts.xml +193 -0
- data/vendor/github.com/zeromq/czmq/src/test_randof.c +182 -0
- data/vendor/github.com/zeromq/czmq/src/test_zgossip.c +188 -0
- data/vendor/github.com/zeromq/czmq/src/valgrind.supp +14 -0
- data/vendor/github.com/zeromq/czmq/src/zactor.c +338 -0
- data/vendor/github.com/zeromq/czmq/src/zargs.c +289 -0
- data/vendor/github.com/zeromq/czmq/src/zarmour.c +941 -0
- data/vendor/github.com/zeromq/czmq/src/zauth.c +821 -0
- data/vendor/github.com/zeromq/czmq/src/zbeacon.c +651 -0
- data/vendor/github.com/zeromq/czmq/src/zcert.c +557 -0
- data/vendor/github.com/zeromq/czmq/src/zcertstore.c +407 -0
- data/vendor/github.com/zeromq/czmq/src/zchunk.c +609 -0
- data/vendor/github.com/zeromq/czmq/src/zclock.c +237 -0
- data/vendor/github.com/zeromq/czmq/src/zconfig.c +1369 -0
- data/vendor/github.com/zeromq/czmq/src/zdigest.c +163 -0
- data/vendor/github.com/zeromq/czmq/src/zdir.c +1138 -0
- data/vendor/github.com/zeromq/czmq/src/zdir_patch.c +227 -0
- data/vendor/github.com/zeromq/czmq/src/zfile.c +920 -0
- data/vendor/github.com/zeromq/czmq/src/zframe.c +756 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip.c +689 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip.xml +57 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_engine.inc +1008 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.bnf +43 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.c +688 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.h +127 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.xml +46 -0
- data/vendor/github.com/zeromq/czmq/src/zhash.c +956 -0
- data/vendor/github.com/zeromq/czmq/src/zhash_primes.inc +329 -0
- data/vendor/github.com/zeromq/czmq/src/zhashx.c +1369 -0
- data/vendor/github.com/zeromq/czmq/src/ziflist.c +517 -0
- data/vendor/github.com/zeromq/czmq/src/zlist.c +634 -0
- data/vendor/github.com/zeromq/czmq/src/zlistx.c +753 -0
- data/vendor/github.com/zeromq/czmq/src/zloop.c +1000 -0
- data/vendor/github.com/zeromq/czmq/src/zmakecert.c +64 -0
- data/vendor/github.com/zeromq/czmq/src/zmonitor.c +447 -0
- data/vendor/github.com/zeromq/czmq/src/zmsg.c +1258 -0
- data/vendor/github.com/zeromq/czmq/src/zpoller.c +397 -0
- data/vendor/github.com/zeromq/czmq/src/zproc.c +1160 -0
- data/vendor/github.com/zeromq/czmq/src/zproxy.c +791 -0
- data/vendor/github.com/zeromq/czmq/src/zrex.c +310 -0
- data/vendor/github.com/zeromq/czmq/src/zsock.c +2207 -0
- data/vendor/github.com/zeromq/czmq/src/zsock_option.gsl +404 -0
- data/vendor/github.com/zeromq/czmq/src/zsock_option.inc +3946 -0
- data/vendor/github.com/zeromq/czmq/src/zsp.c +118 -0
- data/vendor/github.com/zeromq/czmq/src/zstr.c +548 -0
- data/vendor/github.com/zeromq/czmq/src/zsys.c +2225 -0
- data/vendor/github.com/zeromq/czmq/src/ztimerset.c +227 -0
- data/vendor/github.com/zeromq/czmq/src/ztrie.c +809 -0
- data/vendor/github.com/zeromq/czmq/src/zuuid.c +344 -0
- metadata +780 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
zhash_primes.h - 5 largest primes less than 2^n for n = 4...63
|
|
3
|
+
|
|
4
|
+
Copyright (c) the Contributors as noted in the AUTHORS file.
|
|
5
|
+
This file is part of CZMQ, the high-level C binding for 0MQ:
|
|
6
|
+
http://czmq.zeromq.org.
|
|
7
|
+
|
|
8
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
9
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
10
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
11
|
+
=========================================================================
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
#ifndef __ZHASH_PRIMES_H_INCLUDED__
|
|
15
|
+
#define __ZHASH_PRIMES_H_INCLUDED__
|
|
16
|
+
|
|
17
|
+
#ifdef _MSC_VER
|
|
18
|
+
# define PORTABLE_LLU(number) number##ULL
|
|
19
|
+
#else
|
|
20
|
+
# define PORTABLE_LLU(number) number##LLU
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
static size_t primes [] = {
|
|
24
|
+
PORTABLE_LLU(3),
|
|
25
|
+
PORTABLE_LLU(5),
|
|
26
|
+
PORTABLE_LLU(7),
|
|
27
|
+
PORTABLE_LLU(11),
|
|
28
|
+
PORTABLE_LLU(13), // 2^4
|
|
29
|
+
PORTABLE_LLU(17),
|
|
30
|
+
PORTABLE_LLU(19),
|
|
31
|
+
PORTABLE_LLU(23),
|
|
32
|
+
PORTABLE_LLU(29),
|
|
33
|
+
PORTABLE_LLU(31), // 2^5
|
|
34
|
+
PORTABLE_LLU(43),
|
|
35
|
+
PORTABLE_LLU(47),
|
|
36
|
+
PORTABLE_LLU(53),
|
|
37
|
+
PORTABLE_LLU(59),
|
|
38
|
+
PORTABLE_LLU(61), // 2^6
|
|
39
|
+
PORTABLE_LLU(103),
|
|
40
|
+
PORTABLE_LLU(107),
|
|
41
|
+
PORTABLE_LLU(109),
|
|
42
|
+
PORTABLE_LLU(113),
|
|
43
|
+
PORTABLE_LLU(127), // 2^7
|
|
44
|
+
PORTABLE_LLU(229),
|
|
45
|
+
PORTABLE_LLU(233),
|
|
46
|
+
PORTABLE_LLU(239),
|
|
47
|
+
PORTABLE_LLU(241),
|
|
48
|
+
PORTABLE_LLU(251), // 2^8
|
|
49
|
+
PORTABLE_LLU(487),
|
|
50
|
+
PORTABLE_LLU(491),
|
|
51
|
+
PORTABLE_LLU(499),
|
|
52
|
+
PORTABLE_LLU(503),
|
|
53
|
+
PORTABLE_LLU(509), // 2^9
|
|
54
|
+
PORTABLE_LLU(997),
|
|
55
|
+
PORTABLE_LLU(1009),
|
|
56
|
+
PORTABLE_LLU(1013),
|
|
57
|
+
PORTABLE_LLU(1019),
|
|
58
|
+
PORTABLE_LLU(1021), // 2^10
|
|
59
|
+
PORTABLE_LLU(2011),
|
|
60
|
+
PORTABLE_LLU(2017),
|
|
61
|
+
PORTABLE_LLU(2027),
|
|
62
|
+
PORTABLE_LLU(2029),
|
|
63
|
+
PORTABLE_LLU(2039), // 2^11
|
|
64
|
+
PORTABLE_LLU(4057),
|
|
65
|
+
PORTABLE_LLU(4073),
|
|
66
|
+
PORTABLE_LLU(4079),
|
|
67
|
+
PORTABLE_LLU(4091),
|
|
68
|
+
PORTABLE_LLU(4093), // 2^12
|
|
69
|
+
PORTABLE_LLU(8161),
|
|
70
|
+
PORTABLE_LLU(8167),
|
|
71
|
+
PORTABLE_LLU(8171),
|
|
72
|
+
PORTABLE_LLU(8179),
|
|
73
|
+
PORTABLE_LLU(8191), // 2^13
|
|
74
|
+
PORTABLE_LLU(16349),
|
|
75
|
+
PORTABLE_LLU(16361),
|
|
76
|
+
PORTABLE_LLU(16363),
|
|
77
|
+
PORTABLE_LLU(16369),
|
|
78
|
+
PORTABLE_LLU(16381), // 2^14
|
|
79
|
+
PORTABLE_LLU(32707),
|
|
80
|
+
PORTABLE_LLU(32713),
|
|
81
|
+
PORTABLE_LLU(32717),
|
|
82
|
+
PORTABLE_LLU(32719),
|
|
83
|
+
PORTABLE_LLU(32749), // 2^15
|
|
84
|
+
PORTABLE_LLU(65449),
|
|
85
|
+
PORTABLE_LLU(65479),
|
|
86
|
+
PORTABLE_LLU(65497),
|
|
87
|
+
PORTABLE_LLU(65519),
|
|
88
|
+
PORTABLE_LLU(65521), // 2^16
|
|
89
|
+
PORTABLE_LLU(131023),
|
|
90
|
+
PORTABLE_LLU(131041),
|
|
91
|
+
PORTABLE_LLU(131059),
|
|
92
|
+
PORTABLE_LLU(131063),
|
|
93
|
+
PORTABLE_LLU(131071), // 2^17
|
|
94
|
+
PORTABLE_LLU(262111),
|
|
95
|
+
PORTABLE_LLU(262121),
|
|
96
|
+
PORTABLE_LLU(262127),
|
|
97
|
+
PORTABLE_LLU(262133),
|
|
98
|
+
PORTABLE_LLU(262139), // 2^18
|
|
99
|
+
PORTABLE_LLU(524243),
|
|
100
|
+
PORTABLE_LLU(524257),
|
|
101
|
+
PORTABLE_LLU(524261),
|
|
102
|
+
PORTABLE_LLU(524269),
|
|
103
|
+
PORTABLE_LLU(524287), // 2^19
|
|
104
|
+
PORTABLE_LLU(1048517),
|
|
105
|
+
PORTABLE_LLU(1048549),
|
|
106
|
+
PORTABLE_LLU(1048559),
|
|
107
|
+
PORTABLE_LLU(1048571),
|
|
108
|
+
PORTABLE_LLU(1048573), // 2^20
|
|
109
|
+
PORTABLE_LLU(2097091),
|
|
110
|
+
PORTABLE_LLU(2097097),
|
|
111
|
+
PORTABLE_LLU(2097131),
|
|
112
|
+
PORTABLE_LLU(2097133),
|
|
113
|
+
PORTABLE_LLU(2097143), // 2^21
|
|
114
|
+
PORTABLE_LLU(4194247),
|
|
115
|
+
PORTABLE_LLU(4194271),
|
|
116
|
+
PORTABLE_LLU(4194277),
|
|
117
|
+
PORTABLE_LLU(4194287),
|
|
118
|
+
PORTABLE_LLU(4194301), // 2^22
|
|
119
|
+
PORTABLE_LLU(8388547),
|
|
120
|
+
PORTABLE_LLU(8388571),
|
|
121
|
+
PORTABLE_LLU(8388581),
|
|
122
|
+
PORTABLE_LLU(8388587),
|
|
123
|
+
PORTABLE_LLU(8388593), // 2^23
|
|
124
|
+
PORTABLE_LLU(16777141),
|
|
125
|
+
PORTABLE_LLU(16777153),
|
|
126
|
+
PORTABLE_LLU(16777183),
|
|
127
|
+
PORTABLE_LLU(16777199),
|
|
128
|
+
PORTABLE_LLU(16777213), // 2^24
|
|
129
|
+
PORTABLE_LLU(33554341),
|
|
130
|
+
PORTABLE_LLU(33554347),
|
|
131
|
+
PORTABLE_LLU(33554371),
|
|
132
|
+
PORTABLE_LLU(33554383),
|
|
133
|
+
PORTABLE_LLU(33554393), // 2^25
|
|
134
|
+
PORTABLE_LLU(67108763),
|
|
135
|
+
PORTABLE_LLU(67108777),
|
|
136
|
+
PORTABLE_LLU(67108819),
|
|
137
|
+
PORTABLE_LLU(67108837),
|
|
138
|
+
PORTABLE_LLU(67108859), // 2^26
|
|
139
|
+
PORTABLE_LLU(134217593),
|
|
140
|
+
PORTABLE_LLU(134217613),
|
|
141
|
+
PORTABLE_LLU(134217617),
|
|
142
|
+
PORTABLE_LLU(134217649),
|
|
143
|
+
PORTABLE_LLU(134217689), // 2^27
|
|
144
|
+
PORTABLE_LLU(268435331),
|
|
145
|
+
PORTABLE_LLU(268435337),
|
|
146
|
+
PORTABLE_LLU(268435361),
|
|
147
|
+
PORTABLE_LLU(268435367),
|
|
148
|
+
PORTABLE_LLU(268435399), // 2^28
|
|
149
|
+
PORTABLE_LLU(536870839),
|
|
150
|
+
PORTABLE_LLU(536870849),
|
|
151
|
+
PORTABLE_LLU(536870869),
|
|
152
|
+
PORTABLE_LLU(536870879),
|
|
153
|
+
PORTABLE_LLU(536870909), // 2^29
|
|
154
|
+
PORTABLE_LLU(1073741719),
|
|
155
|
+
PORTABLE_LLU(1073741723),
|
|
156
|
+
PORTABLE_LLU(1073741741),
|
|
157
|
+
PORTABLE_LLU(1073741783),
|
|
158
|
+
PORTABLE_LLU(1073741789), // 2^30
|
|
159
|
+
PORTABLE_LLU(2147483563),
|
|
160
|
+
PORTABLE_LLU(2147483579),
|
|
161
|
+
PORTABLE_LLU(2147483587),
|
|
162
|
+
PORTABLE_LLU(2147483629),
|
|
163
|
+
PORTABLE_LLU(2147483647), // 2^31
|
|
164
|
+
PORTABLE_LLU(4294967197),
|
|
165
|
+
PORTABLE_LLU(4294967231),
|
|
166
|
+
PORTABLE_LLU(4294967279),
|
|
167
|
+
PORTABLE_LLU(4294967291),
|
|
168
|
+
PORTABLE_LLU(4294967295), // 2^32
|
|
169
|
+
#if __WORDSIZE == 64
|
|
170
|
+
PORTABLE_LLU(8589934581),
|
|
171
|
+
PORTABLE_LLU(8589934585),
|
|
172
|
+
PORTABLE_LLU(8589934587),
|
|
173
|
+
PORTABLE_LLU(8589934589),
|
|
174
|
+
PORTABLE_LLU(8589934591), // 2^33
|
|
175
|
+
PORTABLE_LLU(17179869175),
|
|
176
|
+
PORTABLE_LLU(17179869177),
|
|
177
|
+
PORTABLE_LLU(17179869179),
|
|
178
|
+
PORTABLE_LLU(17179869181),
|
|
179
|
+
PORTABLE_LLU(17179869183), // 2^34
|
|
180
|
+
PORTABLE_LLU(34359738359),
|
|
181
|
+
PORTABLE_LLU(34359738361),
|
|
182
|
+
PORTABLE_LLU(34359738363),
|
|
183
|
+
PORTABLE_LLU(34359738365),
|
|
184
|
+
PORTABLE_LLU(34359738367), // 2^35
|
|
185
|
+
PORTABLE_LLU(68719476725),
|
|
186
|
+
PORTABLE_LLU(68719476727),
|
|
187
|
+
PORTABLE_LLU(68719476729),
|
|
188
|
+
PORTABLE_LLU(68719476733),
|
|
189
|
+
PORTABLE_LLU(68719476735), // 2^36
|
|
190
|
+
PORTABLE_LLU(137438953463),
|
|
191
|
+
PORTABLE_LLU(137438953465),
|
|
192
|
+
PORTABLE_LLU(137438953467),
|
|
193
|
+
PORTABLE_LLU(137438953469),
|
|
194
|
+
PORTABLE_LLU(137438953471), // 2^37
|
|
195
|
+
PORTABLE_LLU(274877906935),
|
|
196
|
+
PORTABLE_LLU(274877906937),
|
|
197
|
+
PORTABLE_LLU(274877906939),
|
|
198
|
+
PORTABLE_LLU(274877906941),
|
|
199
|
+
PORTABLE_LLU(274877906943), // 2^38
|
|
200
|
+
PORTABLE_LLU(549755813877),
|
|
201
|
+
PORTABLE_LLU(549755813879),
|
|
202
|
+
PORTABLE_LLU(549755813883),
|
|
203
|
+
PORTABLE_LLU(549755813885),
|
|
204
|
+
PORTABLE_LLU(549755813887), // 2^39
|
|
205
|
+
PORTABLE_LLU(1099511627767),
|
|
206
|
+
PORTABLE_LLU(1099511627769),
|
|
207
|
+
PORTABLE_LLU(1099511627771),
|
|
208
|
+
PORTABLE_LLU(1099511627773),
|
|
209
|
+
PORTABLE_LLU(1099511627775), // 2^40
|
|
210
|
+
PORTABLE_LLU(2199023255543),
|
|
211
|
+
PORTABLE_LLU(2199023255545),
|
|
212
|
+
PORTABLE_LLU(2199023255547),
|
|
213
|
+
PORTABLE_LLU(2199023255549),
|
|
214
|
+
PORTABLE_LLU(2199023255551), // 2^41
|
|
215
|
+
PORTABLE_LLU(4398046511095),
|
|
216
|
+
PORTABLE_LLU(4398046511097),
|
|
217
|
+
PORTABLE_LLU(4398046511099),
|
|
218
|
+
PORTABLE_LLU(4398046511101),
|
|
219
|
+
PORTABLE_LLU(4398046511103), // 2^42
|
|
220
|
+
PORTABLE_LLU(8796093022199),
|
|
221
|
+
PORTABLE_LLU(8796093022201),
|
|
222
|
+
PORTABLE_LLU(8796093022203),
|
|
223
|
+
PORTABLE_LLU(8796093022205),
|
|
224
|
+
PORTABLE_LLU(8796093022207), // 2^43
|
|
225
|
+
PORTABLE_LLU(17592186044407),
|
|
226
|
+
PORTABLE_LLU(17592186044409),
|
|
227
|
+
PORTABLE_LLU(17592186044411),
|
|
228
|
+
PORTABLE_LLU(17592186044413),
|
|
229
|
+
PORTABLE_LLU(17592186044415), // 2^44
|
|
230
|
+
PORTABLE_LLU(35184372088823),
|
|
231
|
+
PORTABLE_LLU(35184372088825),
|
|
232
|
+
PORTABLE_LLU(35184372088827),
|
|
233
|
+
PORTABLE_LLU(35184372088829),
|
|
234
|
+
PORTABLE_LLU(35184372088831), // 2^45
|
|
235
|
+
PORTABLE_LLU(70368744177655),
|
|
236
|
+
PORTABLE_LLU(70368744177657),
|
|
237
|
+
PORTABLE_LLU(70368744177659),
|
|
238
|
+
PORTABLE_LLU(70368744177661),
|
|
239
|
+
PORTABLE_LLU(70368744177663), // 2^46
|
|
240
|
+
PORTABLE_LLU(140737488355319),
|
|
241
|
+
PORTABLE_LLU(140737488355321),
|
|
242
|
+
PORTABLE_LLU(140737488355323),
|
|
243
|
+
PORTABLE_LLU(140737488355325),
|
|
244
|
+
PORTABLE_LLU(140737488355327), // 2^47
|
|
245
|
+
PORTABLE_LLU(281474976710647),
|
|
246
|
+
PORTABLE_LLU(281474976710649),
|
|
247
|
+
PORTABLE_LLU(281474976710651),
|
|
248
|
+
PORTABLE_LLU(281474976710653),
|
|
249
|
+
PORTABLE_LLU(281474976710655), // 2^48
|
|
250
|
+
PORTABLE_LLU(562949953421303),
|
|
251
|
+
PORTABLE_LLU(562949953421305),
|
|
252
|
+
PORTABLE_LLU(562949953421307),
|
|
253
|
+
PORTABLE_LLU(562949953421309),
|
|
254
|
+
PORTABLE_LLU(562949953421311), // 2^49
|
|
255
|
+
PORTABLE_LLU(1125899906842615),
|
|
256
|
+
PORTABLE_LLU(1125899906842617),
|
|
257
|
+
PORTABLE_LLU(1125899906842619),
|
|
258
|
+
PORTABLE_LLU(1125899906842621),
|
|
259
|
+
PORTABLE_LLU(1125899906842623), // 2^50
|
|
260
|
+
PORTABLE_LLU(2251799813685239),
|
|
261
|
+
PORTABLE_LLU(2251799813685241),
|
|
262
|
+
PORTABLE_LLU(2251799813685243),
|
|
263
|
+
PORTABLE_LLU(2251799813685245),
|
|
264
|
+
PORTABLE_LLU(2251799813685247), // 2^51
|
|
265
|
+
PORTABLE_LLU(4503599627370487),
|
|
266
|
+
PORTABLE_LLU(4503599627370489),
|
|
267
|
+
PORTABLE_LLU(4503599627370491),
|
|
268
|
+
PORTABLE_LLU(4503599627370493),
|
|
269
|
+
PORTABLE_LLU(4503599627370495), // 2^52
|
|
270
|
+
PORTABLE_LLU(9007199254740983),
|
|
271
|
+
PORTABLE_LLU(9007199254740985),
|
|
272
|
+
PORTABLE_LLU(9007199254740987),
|
|
273
|
+
PORTABLE_LLU(9007199254740989),
|
|
274
|
+
PORTABLE_LLU(9007199254740991), // 2^53
|
|
275
|
+
PORTABLE_LLU(18014398509481975),
|
|
276
|
+
PORTABLE_LLU(18014398509481977),
|
|
277
|
+
PORTABLE_LLU(18014398509481979),
|
|
278
|
+
PORTABLE_LLU(18014398509481981),
|
|
279
|
+
PORTABLE_LLU(18014398509481983), // 2^54
|
|
280
|
+
PORTABLE_LLU(36028797018963959),
|
|
281
|
+
PORTABLE_LLU(36028797018963961),
|
|
282
|
+
PORTABLE_LLU(36028797018963963),
|
|
283
|
+
PORTABLE_LLU(36028797018963965),
|
|
284
|
+
PORTABLE_LLU(36028797018963967), // 2^55
|
|
285
|
+
PORTABLE_LLU(72057594037927925),
|
|
286
|
+
PORTABLE_LLU(72057594037927927),
|
|
287
|
+
PORTABLE_LLU(72057594037927929),
|
|
288
|
+
PORTABLE_LLU(72057594037927933),
|
|
289
|
+
PORTABLE_LLU(72057594037927935), // 2^56
|
|
290
|
+
PORTABLE_LLU(144115188075855863),
|
|
291
|
+
PORTABLE_LLU(144115188075855865),
|
|
292
|
+
PORTABLE_LLU(144115188075855867),
|
|
293
|
+
PORTABLE_LLU(144115188075855869),
|
|
294
|
+
PORTABLE_LLU(144115188075855871), // 2^57
|
|
295
|
+
PORTABLE_LLU(288230376151711735),
|
|
296
|
+
PORTABLE_LLU(288230376151711737),
|
|
297
|
+
PORTABLE_LLU(288230376151711739),
|
|
298
|
+
PORTABLE_LLU(288230376151711741),
|
|
299
|
+
PORTABLE_LLU(288230376151711743), // 2^58
|
|
300
|
+
PORTABLE_LLU(576460752303423479),
|
|
301
|
+
PORTABLE_LLU(576460752303423481),
|
|
302
|
+
PORTABLE_LLU(576460752303423483),
|
|
303
|
+
PORTABLE_LLU(576460752303423485),
|
|
304
|
+
PORTABLE_LLU(576460752303423487), // 2^59
|
|
305
|
+
PORTABLE_LLU(1152921504606846967),
|
|
306
|
+
PORTABLE_LLU(1152921504606846969),
|
|
307
|
+
PORTABLE_LLU(1152921504606846971),
|
|
308
|
+
PORTABLE_LLU(1152921504606846973),
|
|
309
|
+
PORTABLE_LLU(1152921504606846975), // 2^60
|
|
310
|
+
PORTABLE_LLU(2305843009213693941),
|
|
311
|
+
PORTABLE_LLU(2305843009213693943),
|
|
312
|
+
PORTABLE_LLU(2305843009213693945),
|
|
313
|
+
PORTABLE_LLU(2305843009213693947),
|
|
314
|
+
PORTABLE_LLU(2305843009213693949), // 2^61
|
|
315
|
+
PORTABLE_LLU(4611686018427387895),
|
|
316
|
+
PORTABLE_LLU(4611686018427387897),
|
|
317
|
+
PORTABLE_LLU(4611686018427387899),
|
|
318
|
+
PORTABLE_LLU(4611686018427387901),
|
|
319
|
+
PORTABLE_LLU(4611686018427387903), // 2^62
|
|
320
|
+
PORTABLE_LLU(9223372036854775799),
|
|
321
|
+
PORTABLE_LLU(9223372036854775801),
|
|
322
|
+
PORTABLE_LLU(9223372036854775803),
|
|
323
|
+
PORTABLE_LLU(9223372036854775805),
|
|
324
|
+
PORTABLE_LLU(9223372036854775807) // 2^63
|
|
325
|
+
#endif
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
#endif
|
|
329
|
+
|
|
@@ -0,0 +1,1369 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
zhashx - extended generic hash container
|
|
3
|
+
|
|
4
|
+
Copyright (c) the Contributors as noted in the AUTHORS file.
|
|
5
|
+
This file is part of CZMQ, the high-level C binding for 0MQ:
|
|
6
|
+
http://czmq.zeromq.org.
|
|
7
|
+
|
|
8
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
9
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
10
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
11
|
+
=========================================================================
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
@header
|
|
16
|
+
zhashx is an extended hash table container with more functionality than
|
|
17
|
+
zhash, its simpler cousin.
|
|
18
|
+
@discuss
|
|
19
|
+
The hash table always has a size that is prime and roughly doubles its
|
|
20
|
+
size when 75% full. In case of hash collisions items are chained in a
|
|
21
|
+
linked list. The hash table size is increased slightly (up to 5 times
|
|
22
|
+
before roughly doubling the size) when an overly long chain (between 1
|
|
23
|
+
and 63 items depending on table size) is detected.
|
|
24
|
+
@end
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
#include "czmq_classes.h"
|
|
28
|
+
|
|
29
|
+
// Hash table performance parameters
|
|
30
|
+
|
|
31
|
+
#define INITIAL_PRIME 0 // Initial size in items (index into primes)
|
|
32
|
+
#define GROWTH_FACTOR 5 // Increase after splitting (index into primes)
|
|
33
|
+
#define LOAD_FACTOR 75 // Percent loading before splitting
|
|
34
|
+
#define INITIAL_CHAIN 1 // Initial chaining limit
|
|
35
|
+
#define CHAIN_GROWS 1 // Increase after splitting (chaining limit)
|
|
36
|
+
|
|
37
|
+
#include "zhash_primes.inc"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
// Hash item, used internally only
|
|
41
|
+
|
|
42
|
+
typedef struct _item_t {
|
|
43
|
+
void *value; // Opaque item value
|
|
44
|
+
struct _item_t *next; // Next item in the hash slot
|
|
45
|
+
size_t index; // Index of item in table
|
|
46
|
+
const void *key; // Item's original key
|
|
47
|
+
zhashx_free_fn *free_fn; // Value free function if any
|
|
48
|
+
} item_t;
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
// ---------------------------------------------------------------------
|
|
52
|
+
// Structure of our class
|
|
53
|
+
|
|
54
|
+
struct _zhashx_t {
|
|
55
|
+
size_t size; // Current size of hash table
|
|
56
|
+
uint prime_index; // Current prime number used as limit
|
|
57
|
+
uint chain_limit; // Current limit on chain length
|
|
58
|
+
item_t **items; // Array of items
|
|
59
|
+
size_t cached_index; // Avoids duplicate hash calculations
|
|
60
|
+
size_t cursor_index; // For first/next iteration
|
|
61
|
+
item_t *cursor_item; // For first/next iteration
|
|
62
|
+
const void *cursor_key; // After first/next call, points to key
|
|
63
|
+
zlistx_t *comments; // File comments, if any
|
|
64
|
+
time_t modified; // Set during zhashx_load
|
|
65
|
+
char *filename; // Set during zhashx_load
|
|
66
|
+
// Function callbacks for duplicating and destroying items, if any
|
|
67
|
+
zhashx_duplicator_fn *duplicator;
|
|
68
|
+
zhashx_destructor_fn *destructor;
|
|
69
|
+
// Function callbacks for duplicating and destroying keys, if any
|
|
70
|
+
zhashx_duplicator_fn *key_duplicator;
|
|
71
|
+
zhashx_destructor_fn *key_destructor;
|
|
72
|
+
zhashx_comparator_fn *key_comparator;
|
|
73
|
+
// Custom hash function
|
|
74
|
+
zhashx_hash_fn *hasher;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Local helper functions
|
|
78
|
+
static item_t *s_item_lookup (zhashx_t *self, const void *key);
|
|
79
|
+
static item_t *s_item_insert (zhashx_t *self, const void *key, void *value);
|
|
80
|
+
static void s_item_destroy (zhashx_t *self, item_t *item, bool hard);
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
// --------------------------------------------------------------------------
|
|
84
|
+
// Modified Bernstein hashing function
|
|
85
|
+
|
|
86
|
+
static size_t
|
|
87
|
+
s_bernstein_hash (const void *key)
|
|
88
|
+
{
|
|
89
|
+
const char *pointer = (const char *) key;
|
|
90
|
+
size_t key_hash = 0;
|
|
91
|
+
while (*pointer)
|
|
92
|
+
key_hash = 33 * key_hash ^ *pointer++;
|
|
93
|
+
return key_hash;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
// --------------------------------------------------------------------------
|
|
98
|
+
// Hash table constructor
|
|
99
|
+
|
|
100
|
+
zhashx_t *
|
|
101
|
+
zhashx_new (void)
|
|
102
|
+
{
|
|
103
|
+
zhashx_t *self = (zhashx_t *) zmalloc (sizeof (zhashx_t));
|
|
104
|
+
assert (self);
|
|
105
|
+
self->prime_index = INITIAL_PRIME;
|
|
106
|
+
self->chain_limit = INITIAL_CHAIN;
|
|
107
|
+
size_t limit = primes [self->prime_index];
|
|
108
|
+
self->items = (item_t **) zmalloc (sizeof (item_t *) * limit);
|
|
109
|
+
assert (self->items);
|
|
110
|
+
self->hasher = s_bernstein_hash;
|
|
111
|
+
self->key_destructor = (zhashx_destructor_fn *) zstr_free;
|
|
112
|
+
self->key_duplicator = (zhashx_duplicator_fn *) strdup;
|
|
113
|
+
self->key_comparator = (zhashx_comparator_fn *) strcmp;
|
|
114
|
+
|
|
115
|
+
return self;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
// --------------------------------------------------------------------------
|
|
120
|
+
// Purge all items from a hash table
|
|
121
|
+
|
|
122
|
+
static void
|
|
123
|
+
s_purge (zhashx_t *self)
|
|
124
|
+
{
|
|
125
|
+
uint index;
|
|
126
|
+
size_t limit = primes [self->prime_index];
|
|
127
|
+
|
|
128
|
+
for (index = 0; index < limit; index++) {
|
|
129
|
+
// Destroy all items in this hash bucket
|
|
130
|
+
item_t *cur_item = self->items [index];
|
|
131
|
+
while (cur_item) {
|
|
132
|
+
item_t *next_item = cur_item->next;
|
|
133
|
+
s_item_destroy (self, cur_item, true);
|
|
134
|
+
cur_item = next_item;
|
|
135
|
+
}
|
|
136
|
+
self->items [index] = NULL;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// --------------------------------------------------------------------------
|
|
141
|
+
// Hash table destructor
|
|
142
|
+
|
|
143
|
+
void
|
|
144
|
+
zhashx_destroy (zhashx_t **self_p)
|
|
145
|
+
{
|
|
146
|
+
assert (self_p);
|
|
147
|
+
if (*self_p) {
|
|
148
|
+
zhashx_t *self = *self_p;
|
|
149
|
+
if (self->items) {
|
|
150
|
+
s_purge (self);
|
|
151
|
+
freen (self->items);
|
|
152
|
+
}
|
|
153
|
+
zlistx_destroy (&self->comments);
|
|
154
|
+
freen (self->filename);
|
|
155
|
+
freen (self);
|
|
156
|
+
*self_p = NULL;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
// --------------------------------------------------------------------------
|
|
162
|
+
// Local helper function
|
|
163
|
+
// Destroy item in hash table, item must exist in table
|
|
164
|
+
|
|
165
|
+
static void
|
|
166
|
+
s_item_destroy (zhashx_t *self, item_t *item, bool hard)
|
|
167
|
+
{
|
|
168
|
+
// Find previous item since it's a singly-linked list
|
|
169
|
+
item_t *cur_item = self->items [item->index];
|
|
170
|
+
item_t **prev_item = &(self->items [item->index]);
|
|
171
|
+
while (cur_item) {
|
|
172
|
+
if (cur_item == item)
|
|
173
|
+
break;
|
|
174
|
+
prev_item = &(cur_item->next);
|
|
175
|
+
cur_item = cur_item->next;
|
|
176
|
+
}
|
|
177
|
+
assert (cur_item);
|
|
178
|
+
*prev_item = item->next;
|
|
179
|
+
self->size--;
|
|
180
|
+
if (hard) {
|
|
181
|
+
if (self->destructor)
|
|
182
|
+
(self->destructor)(&item->value);
|
|
183
|
+
else
|
|
184
|
+
if (item->free_fn)
|
|
185
|
+
(item->free_fn)(item->value);
|
|
186
|
+
|
|
187
|
+
self->cursor_item = NULL;
|
|
188
|
+
self->cursor_key = NULL;
|
|
189
|
+
|
|
190
|
+
if (self->key_destructor)
|
|
191
|
+
(self->key_destructor)((void **) &item->key);
|
|
192
|
+
freen (item);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
// --------------------------------------------------------------------------
|
|
198
|
+
// Rehash hash table with specified new prime index
|
|
199
|
+
// Returns 0 on success, or fails the assertions (e.g. insufficient memory)
|
|
200
|
+
// Note: Older code used to return -1 in case of errors - this is no longer so
|
|
201
|
+
|
|
202
|
+
static int
|
|
203
|
+
s_zhashx_rehash (zhashx_t *self, uint new_prime_index)
|
|
204
|
+
{
|
|
205
|
+
assert (self);
|
|
206
|
+
assert (new_prime_index < sizeof (primes));
|
|
207
|
+
|
|
208
|
+
size_t limit = primes [self->prime_index];
|
|
209
|
+
size_t new_limit = primes [new_prime_index];
|
|
210
|
+
item_t **new_items = (item_t **) zmalloc (sizeof (item_t *) * new_limit);
|
|
211
|
+
assert (new_items);
|
|
212
|
+
|
|
213
|
+
// Move all items to the new hash table, rehashing to
|
|
214
|
+
// take into account new hash table limit
|
|
215
|
+
size_t index;
|
|
216
|
+
for (index = 0; index < limit; index++) {
|
|
217
|
+
item_t *cur_item = self->items [index];
|
|
218
|
+
while (cur_item) {
|
|
219
|
+
item_t *next_item = cur_item->next;
|
|
220
|
+
size_t new_index = self->hasher (cur_item->key);
|
|
221
|
+
new_index %= new_limit;
|
|
222
|
+
cur_item->index = new_index;
|
|
223
|
+
cur_item->next = new_items [new_index];
|
|
224
|
+
new_items [new_index] = cur_item;
|
|
225
|
+
cur_item = next_item;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Destroy old hash table
|
|
229
|
+
freen (self->items);
|
|
230
|
+
self->items = new_items;
|
|
231
|
+
self->prime_index = new_prime_index;
|
|
232
|
+
return 0;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
// --------------------------------------------------------------------------
|
|
237
|
+
// Insert item into hash table with specified key and item. Returns 0 on
|
|
238
|
+
// success. If the key is already present, returns -1 and leaves existing
|
|
239
|
+
// item unchanged. Sets the hash cursor to the item, if found. Dies with
|
|
240
|
+
// assertion if the process heap memory ran out. (Note: older code returned
|
|
241
|
+
// -1 in such cases; this is no longer so).
|
|
242
|
+
|
|
243
|
+
int
|
|
244
|
+
zhashx_insert (zhashx_t *self, const void *key, void *value)
|
|
245
|
+
{
|
|
246
|
+
assert (self);
|
|
247
|
+
assert (key);
|
|
248
|
+
|
|
249
|
+
// If we're exceeding the load factor of the hash table,
|
|
250
|
+
// resize it according to the growth factor
|
|
251
|
+
size_t limit = primes [self->prime_index];
|
|
252
|
+
if (self->size >= limit * LOAD_FACTOR / 100) {
|
|
253
|
+
// Create new hash table
|
|
254
|
+
uint new_prime_index = self->prime_index + GROWTH_FACTOR;
|
|
255
|
+
assert (s_zhashx_rehash (self, new_prime_index) == 0);
|
|
256
|
+
self->chain_limit += CHAIN_GROWS;
|
|
257
|
+
}
|
|
258
|
+
return s_item_insert (self, key, value)? 0: -1;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
// --------------------------------------------------------------------------
|
|
263
|
+
// Local helper function
|
|
264
|
+
// Insert new item into hash table, returns item
|
|
265
|
+
// If item already existed, returns NULL
|
|
266
|
+
// Sets the hash cursor to the item, if found.
|
|
267
|
+
|
|
268
|
+
static item_t *
|
|
269
|
+
s_item_insert (zhashx_t *self, const void *key, void *value)
|
|
270
|
+
{
|
|
271
|
+
// Check that item does not already exist in hash table
|
|
272
|
+
// Leaves self->cached_index with calculated hash item
|
|
273
|
+
item_t *item = s_item_lookup (self, key);
|
|
274
|
+
if (item == NULL) {
|
|
275
|
+
item = (item_t *) zmalloc (sizeof (item_t));
|
|
276
|
+
assert (item);
|
|
277
|
+
|
|
278
|
+
// If necessary, take duplicate of item key
|
|
279
|
+
if (self->key_duplicator)
|
|
280
|
+
item->key = (self->key_duplicator)((void *) key);
|
|
281
|
+
else
|
|
282
|
+
item->key = key;
|
|
283
|
+
|
|
284
|
+
// If necessary, take duplicate of item value
|
|
285
|
+
if (self->duplicator)
|
|
286
|
+
item->value = (self->duplicator)(value);
|
|
287
|
+
else
|
|
288
|
+
item->value = value;
|
|
289
|
+
|
|
290
|
+
item->index = self->cached_index;
|
|
291
|
+
|
|
292
|
+
// Insert into start of bucket list
|
|
293
|
+
item->next = self->items [self->cached_index];
|
|
294
|
+
self->items [self->cached_index] = item;
|
|
295
|
+
self->size++;
|
|
296
|
+
self->cursor_item = item;
|
|
297
|
+
self->cursor_key = item->key;
|
|
298
|
+
}
|
|
299
|
+
else
|
|
300
|
+
item = NULL; // Signal duplicate insertion
|
|
301
|
+
|
|
302
|
+
return item;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
// --------------------------------------------------------------------------
|
|
307
|
+
// Local helper function
|
|
308
|
+
// Lookup item in hash table, returns item or NULL
|
|
309
|
+
// Dies with assertion if the process heap memory ran out (Note: older code
|
|
310
|
+
// returned NULL in such cases; this is no longer so).
|
|
311
|
+
|
|
312
|
+
static item_t *
|
|
313
|
+
s_item_lookup (zhashx_t *self, const void *key)
|
|
314
|
+
{
|
|
315
|
+
// Look in bucket list for item by key
|
|
316
|
+
size_t limit = primes [self->prime_index];
|
|
317
|
+
self->cached_index = self->hasher (key) % limit;
|
|
318
|
+
item_t *item = self->items [self->cached_index];
|
|
319
|
+
uint len = 0;
|
|
320
|
+
while (item) {
|
|
321
|
+
if ((self->key_comparator)(item->key, key) == 0)
|
|
322
|
+
break;
|
|
323
|
+
item = item->next;
|
|
324
|
+
++len;
|
|
325
|
+
}
|
|
326
|
+
if (len > self->chain_limit) {
|
|
327
|
+
// Create new hash table
|
|
328
|
+
uint new_prime_index = self->prime_index + GROWTH_FACTOR;
|
|
329
|
+
assert (s_zhashx_rehash (self, new_prime_index) == 0);
|
|
330
|
+
limit = primes [self->prime_index];
|
|
331
|
+
self->cached_index = self->hasher (key) % limit;
|
|
332
|
+
}
|
|
333
|
+
return item;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
// --------------------------------------------------------------------------
|
|
338
|
+
// Update or insert item into hash table with specified key and item. If the
|
|
339
|
+
// key is already present, destroys old item and inserts new one. If you set
|
|
340
|
+
// a container item destructor, this is called on the old value. If the key
|
|
341
|
+
// was not already present, inserts a new item. Sets the hash cursor to the
|
|
342
|
+
// new item.
|
|
343
|
+
|
|
344
|
+
void
|
|
345
|
+
zhashx_update (zhashx_t *self, const void *key, void *value)
|
|
346
|
+
{
|
|
347
|
+
assert (self);
|
|
348
|
+
assert (key);
|
|
349
|
+
|
|
350
|
+
item_t *item = s_item_lookup (self, key);
|
|
351
|
+
if (item) {
|
|
352
|
+
if (self->destructor)
|
|
353
|
+
(self->destructor)(&item->value);
|
|
354
|
+
else
|
|
355
|
+
if (item->free_fn)
|
|
356
|
+
(item->free_fn)(item->value);
|
|
357
|
+
|
|
358
|
+
// If necessary, take duplicate of item value
|
|
359
|
+
if (self->duplicator)
|
|
360
|
+
item->value = (self->duplicator)(value);
|
|
361
|
+
else
|
|
362
|
+
item->value = value;
|
|
363
|
+
}
|
|
364
|
+
else
|
|
365
|
+
zhashx_insert (self, key, value);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
// --------------------------------------------------------------------------
|
|
370
|
+
// Remove an item specified by key from the hash table. If there was no such
|
|
371
|
+
// item, this function does nothing.
|
|
372
|
+
|
|
373
|
+
void
|
|
374
|
+
zhashx_delete (zhashx_t *self, const void *key)
|
|
375
|
+
{
|
|
376
|
+
assert (self);
|
|
377
|
+
assert (key);
|
|
378
|
+
|
|
379
|
+
item_t *item = s_item_lookup (self, key);
|
|
380
|
+
if (item)
|
|
381
|
+
s_item_destroy (self, item, true);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
// --------------------------------------------------------------------------
|
|
386
|
+
// Delete all items from the hash table. If the key destructor is
|
|
387
|
+
// set, calls it on every key. If the item destructor is set, calls
|
|
388
|
+
// it on every item.
|
|
389
|
+
void
|
|
390
|
+
zhashx_purge (zhashx_t *self)
|
|
391
|
+
{
|
|
392
|
+
assert (self);
|
|
393
|
+
s_purge (self);
|
|
394
|
+
|
|
395
|
+
if (self->prime_index > INITIAL_PRIME) {
|
|
396
|
+
// Try to shrink hash table
|
|
397
|
+
size_t limit = primes [INITIAL_PRIME];
|
|
398
|
+
item_t **items = (item_t **) zmalloc (sizeof (item_t *) * limit);
|
|
399
|
+
assert (items);
|
|
400
|
+
freen (self->items);
|
|
401
|
+
self->prime_index = INITIAL_PRIME;
|
|
402
|
+
self->chain_limit = INITIAL_CHAIN;
|
|
403
|
+
self->items = items;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
// --------------------------------------------------------------------------
|
|
409
|
+
// Look for item in hash table and return its item, or NULL. Sets the hash
|
|
410
|
+
// cursor to the item, if found.
|
|
411
|
+
|
|
412
|
+
void *
|
|
413
|
+
zhashx_lookup (zhashx_t *self, const void *key)
|
|
414
|
+
{
|
|
415
|
+
assert (self);
|
|
416
|
+
assert (key);
|
|
417
|
+
|
|
418
|
+
item_t *item = s_item_lookup (self, key);
|
|
419
|
+
if (item) {
|
|
420
|
+
self->cursor_item = item;
|
|
421
|
+
self->cursor_key = item->key;
|
|
422
|
+
return item->value;
|
|
423
|
+
}
|
|
424
|
+
else
|
|
425
|
+
return NULL;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
// --------------------------------------------------------------------------
|
|
430
|
+
// Reindexes an item from an old key to a new key. If there was no such
|
|
431
|
+
// item, does nothing. If the new key already exists, deletes old item.
|
|
432
|
+
// Sets the item cursor to the renamed item.
|
|
433
|
+
|
|
434
|
+
int
|
|
435
|
+
zhashx_rename (zhashx_t *self, const void *old_key, const void *new_key)
|
|
436
|
+
{
|
|
437
|
+
item_t *old_item = s_item_lookup (self, old_key);
|
|
438
|
+
item_t *new_item = s_item_lookup (self, new_key);
|
|
439
|
+
if (old_item && !new_item) {
|
|
440
|
+
s_item_destroy (self, old_item, false);
|
|
441
|
+
if (self->key_destructor)
|
|
442
|
+
(self->key_destructor)((void **) &old_item->key);
|
|
443
|
+
|
|
444
|
+
if (self->key_duplicator)
|
|
445
|
+
old_item->key = (self->key_duplicator)(new_key);
|
|
446
|
+
else
|
|
447
|
+
old_item->key = new_key;
|
|
448
|
+
|
|
449
|
+
old_item->index = self->cached_index;
|
|
450
|
+
old_item->next = self->items [self->cached_index];
|
|
451
|
+
self->items [self->cached_index] = old_item;
|
|
452
|
+
self->size++;
|
|
453
|
+
self->cursor_item = old_item;
|
|
454
|
+
self->cursor_key = old_item->key;
|
|
455
|
+
return 0;
|
|
456
|
+
}
|
|
457
|
+
else
|
|
458
|
+
return -1;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
// --------------------------------------------------------------------------
|
|
463
|
+
// Set a free function for the specified hash table item. When the item is
|
|
464
|
+
// destroyed, the free function, if any, is called on that item.
|
|
465
|
+
// Use this when hash items are dynamically allocated, to ensure that
|
|
466
|
+
// you don't have memory leaks. You can pass 'free' or NULL as a free_fn.
|
|
467
|
+
// Returns the item, or NULL if there is no such item.
|
|
468
|
+
|
|
469
|
+
void *
|
|
470
|
+
zhashx_freefn (zhashx_t *self, const void *key, zhashx_free_fn free_fn)
|
|
471
|
+
{
|
|
472
|
+
assert (self);
|
|
473
|
+
assert (key);
|
|
474
|
+
|
|
475
|
+
item_t *item = s_item_lookup (self, key);
|
|
476
|
+
if (item) {
|
|
477
|
+
item->free_fn = free_fn;
|
|
478
|
+
return item->value;
|
|
479
|
+
}
|
|
480
|
+
else
|
|
481
|
+
return NULL;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
// --------------------------------------------------------------------------
|
|
486
|
+
// Return size of hash table
|
|
487
|
+
|
|
488
|
+
size_t
|
|
489
|
+
zhashx_size (zhashx_t *self)
|
|
490
|
+
{
|
|
491
|
+
assert (self);
|
|
492
|
+
return self->size;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
// --------------------------------------------------------------------------
|
|
497
|
+
// Return a zlistx_t containing the keys for the items in the
|
|
498
|
+
// table. Uses the key_duplicator to duplicate all keys and sets the
|
|
499
|
+
// key_destructor as destructor for the list.
|
|
500
|
+
|
|
501
|
+
zlistx_t *
|
|
502
|
+
zhashx_keys (zhashx_t *self)
|
|
503
|
+
{
|
|
504
|
+
assert (self);
|
|
505
|
+
zlistx_t *keys = zlistx_new ();
|
|
506
|
+
if (!keys)
|
|
507
|
+
return NULL;
|
|
508
|
+
zlistx_set_destructor (keys, self->key_destructor);
|
|
509
|
+
zlistx_set_duplicator (keys, self->key_duplicator);
|
|
510
|
+
|
|
511
|
+
uint index;
|
|
512
|
+
size_t limit = primes [self->prime_index];
|
|
513
|
+
for (index = 0; index < limit; index++) {
|
|
514
|
+
item_t *item = self->items [index];
|
|
515
|
+
while (item) {
|
|
516
|
+
if (zlistx_add_end (keys, (void *) item->key) == NULL) {
|
|
517
|
+
zlistx_destroy (&keys);
|
|
518
|
+
return NULL;
|
|
519
|
+
}
|
|
520
|
+
item = item->next;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return keys;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Return a zlistx_t containing the items in the table. If there exists
|
|
527
|
+
// a duplicator, then it is used to duplicate all items, and if there
|
|
528
|
+
// is a destructor then it set as the destructor for the list.
|
|
529
|
+
|
|
530
|
+
zlistx_t *
|
|
531
|
+
zhashx_values (zhashx_t *self)
|
|
532
|
+
{
|
|
533
|
+
assert (self);
|
|
534
|
+
|
|
535
|
+
zlistx_t *values = zlistx_new ();
|
|
536
|
+
if (!values)
|
|
537
|
+
return NULL;
|
|
538
|
+
|
|
539
|
+
zlistx_set_destructor (values, self->destructor);
|
|
540
|
+
zlistx_set_duplicator (values, self->duplicator);
|
|
541
|
+
|
|
542
|
+
uint index;
|
|
543
|
+
size_t limit = primes [self->prime_index];
|
|
544
|
+
for (index = 0; index < limit; index++) {
|
|
545
|
+
item_t *item = self->items [index];
|
|
546
|
+
while (item) {
|
|
547
|
+
if (zlistx_add_end (values, (void *) item->value) == NULL) {
|
|
548
|
+
zlistx_destroy (&values);
|
|
549
|
+
return NULL;
|
|
550
|
+
}
|
|
551
|
+
item = item->next;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
return values;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
// --------------------------------------------------------------------------
|
|
559
|
+
// Simple iterator; returns first item in hash table, in no given order,
|
|
560
|
+
// or NULL if the table is empty. This method is simpler to use than the
|
|
561
|
+
// foreach() method, which is deprecated. NOTE: do NOT modify the table
|
|
562
|
+
// while iterating.
|
|
563
|
+
|
|
564
|
+
void *
|
|
565
|
+
zhashx_first (zhashx_t *self)
|
|
566
|
+
{
|
|
567
|
+
assert (self);
|
|
568
|
+
// Point to before or at first item
|
|
569
|
+
self->cursor_index = 0;
|
|
570
|
+
self->cursor_item = self->items [self->cursor_index];
|
|
571
|
+
// Now scan forwards to find it, leave cursor after item
|
|
572
|
+
return zhashx_next (self);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
// --------------------------------------------------------------------------
|
|
577
|
+
// Simple iterator; returns next item in hash table, in no given order,
|
|
578
|
+
// or NULL if the last item was already returned. Use this together with
|
|
579
|
+
// zhashx_first() to process all items in a hash table. If you need the
|
|
580
|
+
// items in sorted order, use zhashx_keys() and then zlistx_sort(). NOTE:
|
|
581
|
+
// do NOT modify the table while iterating.
|
|
582
|
+
|
|
583
|
+
void *
|
|
584
|
+
zhashx_next (zhashx_t *self)
|
|
585
|
+
{
|
|
586
|
+
assert (self);
|
|
587
|
+
// Scan forward from cursor until we find an item
|
|
588
|
+
size_t limit = primes [self->prime_index];
|
|
589
|
+
while (self->cursor_item == NULL) {
|
|
590
|
+
if (self->cursor_index < limit - 1)
|
|
591
|
+
self->cursor_index++;
|
|
592
|
+
else
|
|
593
|
+
return NULL; // At end of table
|
|
594
|
+
|
|
595
|
+
// Get first item in next bucket
|
|
596
|
+
self->cursor_item = self->items [self->cursor_index];
|
|
597
|
+
}
|
|
598
|
+
// We have an item, so return it, and bump past it
|
|
599
|
+
assert (self->cursor_item);
|
|
600
|
+
item_t *item = self->cursor_item;
|
|
601
|
+
self->cursor_key = item->key;
|
|
602
|
+
self->cursor_item = self->cursor_item->next;
|
|
603
|
+
return item->value;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
// --------------------------------------------------------------------------
|
|
608
|
+
// After a successful insert, update, or first/next method, returns the key
|
|
609
|
+
// for the item that was returned. You may not modify or deallocate
|
|
610
|
+
// the key, and it lasts as long as the item in the hash.
|
|
611
|
+
// After an unsuccessful first/next, returns NULL.
|
|
612
|
+
|
|
613
|
+
const void *
|
|
614
|
+
zhashx_cursor (zhashx_t *self)
|
|
615
|
+
{
|
|
616
|
+
assert (self);
|
|
617
|
+
return self->cursor_key;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
// --------------------------------------------------------------------------
|
|
622
|
+
// Add a comment to hash table before saving to disk. You can add as many
|
|
623
|
+
// comment lines as you like. These comment lines are discarded when loading
|
|
624
|
+
// the file. If you use a null format, all comments are deleted.
|
|
625
|
+
// FIXME: return 0 on success, -1 on error
|
|
626
|
+
|
|
627
|
+
void
|
|
628
|
+
zhashx_comment (zhashx_t *self, const char *format, ...)
|
|
629
|
+
{
|
|
630
|
+
if (format) {
|
|
631
|
+
if (!self->comments) {
|
|
632
|
+
self->comments = zlistx_new ();
|
|
633
|
+
if (!self->comments)
|
|
634
|
+
return;
|
|
635
|
+
zlistx_set_destructor (self->comments, (zhashx_destructor_fn *) zstr_free);
|
|
636
|
+
}
|
|
637
|
+
va_list argptr;
|
|
638
|
+
va_start (argptr, format);
|
|
639
|
+
char *string = zsys_vprintf (format, argptr);
|
|
640
|
+
va_end (argptr);
|
|
641
|
+
if (string)
|
|
642
|
+
zlistx_add_end (self->comments, string);
|
|
643
|
+
}
|
|
644
|
+
else
|
|
645
|
+
zlistx_destroy (&self->comments);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
// --------------------------------------------------------------------------
|
|
650
|
+
// Save hash table to a text file in name=value format
|
|
651
|
+
// Hash values must be printable strings.
|
|
652
|
+
// Returns 0 if OK, else -1 if a file error occurred
|
|
653
|
+
|
|
654
|
+
int
|
|
655
|
+
zhashx_save (zhashx_t *self, const char *filename)
|
|
656
|
+
{
|
|
657
|
+
assert (self);
|
|
658
|
+
|
|
659
|
+
FILE *handle = fopen (filename, "w");
|
|
660
|
+
if (!handle)
|
|
661
|
+
return -1; // Failed to create file
|
|
662
|
+
|
|
663
|
+
if (self->comments) {
|
|
664
|
+
char *comment = (char *) zlistx_first (self->comments);
|
|
665
|
+
while (comment) {
|
|
666
|
+
fprintf (handle, "# %s\n", comment);
|
|
667
|
+
comment = (char *) zlistx_next (self->comments);
|
|
668
|
+
}
|
|
669
|
+
fprintf (handle, "\n");
|
|
670
|
+
}
|
|
671
|
+
uint index;
|
|
672
|
+
size_t limit = primes [self->prime_index];
|
|
673
|
+
for (index = 0; index < limit; index++) {
|
|
674
|
+
item_t *item = self->items [index];
|
|
675
|
+
while (item) {
|
|
676
|
+
fprintf (handle, "%s=%s\n", (char *) item->key, (char *) item->value);
|
|
677
|
+
item = item->next;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
fclose (handle);
|
|
681
|
+
return 0;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
// --------------------------------------------------------------------------
|
|
686
|
+
// Load hash table from a text file in name=value format; hash table must
|
|
687
|
+
// already exist. Hash values must printable strings.
|
|
688
|
+
// Returns 0 if OK, else -1 if a file was not readable.
|
|
689
|
+
|
|
690
|
+
int
|
|
691
|
+
zhashx_load (zhashx_t *self, const char *filename)
|
|
692
|
+
{
|
|
693
|
+
assert (self);
|
|
694
|
+
zhashx_set_destructor (self, (zhashx_destructor_fn *) zstr_free);
|
|
695
|
+
zhashx_set_duplicator (self, (zhashx_duplicator_fn *) strdup);
|
|
696
|
+
|
|
697
|
+
// Whether or not file exists, we'll track the filename and last
|
|
698
|
+
// modification date (0 for unknown files), so that zhashx_refresh ()
|
|
699
|
+
// will always work after zhashx_load (), to load a newly-created
|
|
700
|
+
// file.
|
|
701
|
+
|
|
702
|
+
// Take copy of filename in case self->filename is same string.
|
|
703
|
+
char *filename_copy = strdup (filename);
|
|
704
|
+
assert (filename_copy);
|
|
705
|
+
freen (self->filename);
|
|
706
|
+
self->filename = filename_copy;
|
|
707
|
+
self->modified = zsys_file_modified (self->filename);
|
|
708
|
+
FILE *handle = fopen (self->filename, "r");
|
|
709
|
+
if (handle) {
|
|
710
|
+
char *buffer = (char *) zmalloc (1024);
|
|
711
|
+
assert (buffer);
|
|
712
|
+
while (fgets (buffer, 1024, handle)) {
|
|
713
|
+
// Skip lines starting with "#" or that do not look like
|
|
714
|
+
// name=value data.
|
|
715
|
+
char *equals = strchr (buffer, '=');
|
|
716
|
+
if (buffer [0] == '#' || equals == buffer || !equals)
|
|
717
|
+
continue;
|
|
718
|
+
|
|
719
|
+
// Buffer may end in newline, which we don't want
|
|
720
|
+
if (buffer [strlen (buffer) - 1] == '\n')
|
|
721
|
+
buffer [strlen (buffer) - 1] = 0;
|
|
722
|
+
*equals++ = 0;
|
|
723
|
+
zhashx_update (self, buffer, equals);
|
|
724
|
+
}
|
|
725
|
+
freen (buffer);
|
|
726
|
+
fclose (handle);
|
|
727
|
+
}
|
|
728
|
+
else
|
|
729
|
+
return -1; // Failed to open file for reading
|
|
730
|
+
|
|
731
|
+
return 0;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
// --------------------------------------------------------------------------
|
|
736
|
+
// When a hash table was loaded from a file by zhashx_load, this method will
|
|
737
|
+
// reload the file if it has been modified since, and is "stable", i.e. not
|
|
738
|
+
// still changing. Returns 0 if OK, -1 if there was an error reloading the
|
|
739
|
+
// file.
|
|
740
|
+
|
|
741
|
+
int
|
|
742
|
+
zhashx_refresh (zhashx_t *self)
|
|
743
|
+
{
|
|
744
|
+
assert (self);
|
|
745
|
+
|
|
746
|
+
if (self->filename) {
|
|
747
|
+
if (zsys_file_modified (self->filename) > self->modified
|
|
748
|
+
&& zsys_file_stable (self->filename)) {
|
|
749
|
+
// Empty the hash table; code is copied from zhashx_destroy
|
|
750
|
+
uint index;
|
|
751
|
+
size_t limit = primes [self->prime_index];
|
|
752
|
+
for (index = 0; index < limit; index++) {
|
|
753
|
+
// Destroy all items in this hash bucket
|
|
754
|
+
item_t *cur_item = self->items [index];
|
|
755
|
+
while (cur_item) {
|
|
756
|
+
item_t *next_item = cur_item->next;
|
|
757
|
+
s_item_destroy (self, cur_item, true);
|
|
758
|
+
cur_item = next_item;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
zhashx_load (self, self->filename);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
return 0;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
// --------------------------------------------------------------------------
|
|
769
|
+
// Same as pack but uses a user-defined serializer function to convert items
|
|
770
|
+
// into longstr.
|
|
771
|
+
// Caller owns return value and must destroy it when done.
|
|
772
|
+
|
|
773
|
+
zframe_t *
|
|
774
|
+
zhashx_pack_own (zhashx_t *self, zhashx_serializer_fn serializer)
|
|
775
|
+
{
|
|
776
|
+
assert (self);
|
|
777
|
+
|
|
778
|
+
// First, calculate packed data size
|
|
779
|
+
size_t frame_size = 4; // Dictionary size, number-4
|
|
780
|
+
uint index;
|
|
781
|
+
uint vindex = 0;
|
|
782
|
+
size_t limit = primes [self->prime_index];
|
|
783
|
+
char **values = (char **) zmalloc (self->size * sizeof (char*));
|
|
784
|
+
for (index = 0; index < limit; index++) {
|
|
785
|
+
item_t *item = self->items [index];
|
|
786
|
+
while (item) {
|
|
787
|
+
// We store key as short string
|
|
788
|
+
frame_size += 1 + strlen ((char *) item->key);
|
|
789
|
+
// We store value as long string
|
|
790
|
+
if (serializer != NULL)
|
|
791
|
+
values [vindex] = serializer (item->value);
|
|
792
|
+
else
|
|
793
|
+
values [vindex] = (char *) item->value;
|
|
794
|
+
|
|
795
|
+
frame_size += 4 + strlen ((char *) values [vindex]);
|
|
796
|
+
item = item->next;
|
|
797
|
+
vindex++;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
// Now serialize items into the frame
|
|
801
|
+
zframe_t *frame = zframe_new (NULL, frame_size);
|
|
802
|
+
if (!frame) {
|
|
803
|
+
freen (values);
|
|
804
|
+
return NULL;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
byte *needle = zframe_data (frame);
|
|
808
|
+
// Store size as number-4
|
|
809
|
+
*(uint32_t *) needle = htonl ((u_long) self->size);
|
|
810
|
+
needle += 4;
|
|
811
|
+
vindex = 0;
|
|
812
|
+
for (index = 0; index < limit; index++) {
|
|
813
|
+
item_t *item = self->items [index];
|
|
814
|
+
while (item) {
|
|
815
|
+
// Store key as string
|
|
816
|
+
*needle++ = (byte) strlen ((char *) item->key);
|
|
817
|
+
memcpy (needle, item->key, strlen ((char *) item->key));
|
|
818
|
+
needle += strlen ((char *) item->key);
|
|
819
|
+
|
|
820
|
+
// Store value as longstr
|
|
821
|
+
size_t lenth = strlen (values [vindex]);
|
|
822
|
+
*(uint32_t *) needle = htonl ((u_long) lenth);
|
|
823
|
+
needle += 4;
|
|
824
|
+
memcpy (needle, (char *) values [vindex], strlen ((char *) values [vindex]));
|
|
825
|
+
needle += strlen ((char *) values [vindex]);
|
|
826
|
+
item = item->next;
|
|
827
|
+
|
|
828
|
+
// Destroy serialized value
|
|
829
|
+
if (serializer != NULL)
|
|
830
|
+
zstr_free (&values [vindex]);
|
|
831
|
+
|
|
832
|
+
vindex++;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
freen (values);
|
|
836
|
+
return frame;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
// --------------------------------------------------------------------------
|
|
841
|
+
// Serialize hash table to a binary frame that can be sent in a message.
|
|
842
|
+
// The packed format is compatible with the 'dictionary' type defined in
|
|
843
|
+
// http://rfc.zeromq.org/spec:35/FILEMQ, and implemented by zproto:
|
|
844
|
+
//
|
|
845
|
+
// ; A list of name/value pairs
|
|
846
|
+
// dictionary = dict-count *( dict-name dict-value )
|
|
847
|
+
// dict-count = number-4
|
|
848
|
+
// dict-value = longstr
|
|
849
|
+
// dict-name = string
|
|
850
|
+
//
|
|
851
|
+
// ; Strings are always length + text contents
|
|
852
|
+
// longstr = number-4 *VCHAR
|
|
853
|
+
// string = number-1 *VCHAR
|
|
854
|
+
//
|
|
855
|
+
// ; Numbers are unsigned integers in network byte order
|
|
856
|
+
// number-1 = 1OCTET
|
|
857
|
+
// number-4 = 4OCTET
|
|
858
|
+
//
|
|
859
|
+
// Comments are not included in the packed data. Item values MUST be
|
|
860
|
+
// strings.
|
|
861
|
+
|
|
862
|
+
zframe_t *
|
|
863
|
+
zhashx_pack (zhashx_t *self)
|
|
864
|
+
{
|
|
865
|
+
return zhashx_pack_own (self, NULL);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
|
|
869
|
+
// --------------------------------------------------------------------------
|
|
870
|
+
// Same as unpack but uses a user-defined deserializer function to convert
|
|
871
|
+
// a longstr back into item format.
|
|
872
|
+
|
|
873
|
+
zhashx_t *
|
|
874
|
+
zhashx_unpack_own (zframe_t *frame, zhashx_deserializer_fn deserializer)
|
|
875
|
+
{
|
|
876
|
+
zhashx_t *self = zhashx_new ();
|
|
877
|
+
if (!self)
|
|
878
|
+
return NULL;
|
|
879
|
+
|
|
880
|
+
assert (frame);
|
|
881
|
+
if (zframe_size (frame) < 4)
|
|
882
|
+
return self; // Arguable...
|
|
883
|
+
|
|
884
|
+
byte *needle = zframe_data (frame);
|
|
885
|
+
byte *ceiling = needle + zframe_size (frame);
|
|
886
|
+
size_t nbr_items = ntohl (*(uint32_t *) needle);
|
|
887
|
+
needle += 4;
|
|
888
|
+
while (nbr_items && needle < ceiling) {
|
|
889
|
+
// Get key as string
|
|
890
|
+
size_t key_size = *needle++;
|
|
891
|
+
if (needle + key_size <= ceiling) {
|
|
892
|
+
char key [256];
|
|
893
|
+
memcpy (key, needle, key_size);
|
|
894
|
+
key [key_size] = 0;
|
|
895
|
+
needle += key_size;
|
|
896
|
+
|
|
897
|
+
// Get value as longstr
|
|
898
|
+
if (needle + 4 <= ceiling) {
|
|
899
|
+
size_t value_size = ntohl (*(uint32_t *) needle);
|
|
900
|
+
needle += 4;
|
|
901
|
+
// Be wary of malformed frames
|
|
902
|
+
if (needle + value_size <= ceiling) {
|
|
903
|
+
char *value = (char *) zmalloc (value_size + 1);
|
|
904
|
+
assert (value);
|
|
905
|
+
memcpy (value, needle, value_size);
|
|
906
|
+
value [value_size] = 0;
|
|
907
|
+
needle += value_size;
|
|
908
|
+
|
|
909
|
+
// Convert string to real value
|
|
910
|
+
void *real_value;
|
|
911
|
+
if (deserializer != NULL) {
|
|
912
|
+
real_value = deserializer (value);
|
|
913
|
+
zstr_free (&value);
|
|
914
|
+
}
|
|
915
|
+
else
|
|
916
|
+
real_value = value;
|
|
917
|
+
|
|
918
|
+
// Hash takes ownership of real_value
|
|
919
|
+
if (zhashx_insert (self, key, real_value)) {
|
|
920
|
+
zhashx_destroy (&self);
|
|
921
|
+
break;
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
// Hash will free values in destructor
|
|
928
|
+
if (self) {
|
|
929
|
+
zhashx_set_destructor (self, (zhashx_destructor_fn *) zstr_free);
|
|
930
|
+
zhashx_set_duplicator (self, (zhashx_duplicator_fn *) strdup);
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
return self;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
|
|
937
|
+
// --------------------------------------------------------------------------
|
|
938
|
+
// Unpack binary frame into a new hash table. Packed data must follow format
|
|
939
|
+
// defined by zhashx_pack. Hash table is set to autofree. An empty frame
|
|
940
|
+
// unpacks to an empty hash table.
|
|
941
|
+
|
|
942
|
+
zhashx_t *
|
|
943
|
+
zhashx_unpack (zframe_t *frame)
|
|
944
|
+
{
|
|
945
|
+
return zhashx_unpack_own (frame, NULL);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
// --------------------------------------------------------------------------
|
|
950
|
+
// Make a copy of the list; items are duplicated if you set a duplicator
|
|
951
|
+
// for the list, otherwise not. Copying a null reference returns a null
|
|
952
|
+
// reference. Note that this method's behavior changed slightly for CZMQ
|
|
953
|
+
// v3.x, as it does not set nor respect autofree. It does however let you
|
|
954
|
+
// duplicate any hash table safely. The old behavior is in zhashx_dup_v2.
|
|
955
|
+
|
|
956
|
+
zhashx_t *
|
|
957
|
+
zhashx_dup (zhashx_t *self)
|
|
958
|
+
{
|
|
959
|
+
if (!self)
|
|
960
|
+
return NULL;
|
|
961
|
+
|
|
962
|
+
zhashx_t *copy = zhashx_new ();
|
|
963
|
+
if (copy) {
|
|
964
|
+
copy->destructor = self->destructor;
|
|
965
|
+
copy->duplicator = self->duplicator;
|
|
966
|
+
uint index;
|
|
967
|
+
size_t limit = primes [self->prime_index];
|
|
968
|
+
for (index = 0; index < limit; index++) {
|
|
969
|
+
item_t *item = self->items [index];
|
|
970
|
+
while (item) {
|
|
971
|
+
if (zhashx_insert (copy, item->key, item->value)) {
|
|
972
|
+
zhashx_destroy (©);
|
|
973
|
+
break;
|
|
974
|
+
}
|
|
975
|
+
item = item->next;
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
return copy;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
|
|
983
|
+
// --------------------------------------------------------------------------
|
|
984
|
+
// Set a user-defined deallocator for hash items; by default items are not
|
|
985
|
+
// freed when the hash is destroyed.
|
|
986
|
+
|
|
987
|
+
void
|
|
988
|
+
zhashx_set_destructor (zhashx_t *self, zhashx_destructor_fn destructor)
|
|
989
|
+
{
|
|
990
|
+
assert (self);
|
|
991
|
+
self->destructor = destructor;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
// --------------------------------------------------------------------------
|
|
996
|
+
// Set a user-defined duplicator for hash items; by default items are not
|
|
997
|
+
// copied when the hash is duplicated.
|
|
998
|
+
|
|
999
|
+
void
|
|
1000
|
+
zhashx_set_duplicator (zhashx_t *self, zhashx_duplicator_fn duplicator)
|
|
1001
|
+
{
|
|
1002
|
+
assert (self);
|
|
1003
|
+
self->duplicator = duplicator;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
// --------------------------------------------------------------------------
|
|
1008
|
+
// Set a user-defined deallocator for keys; by default keys are
|
|
1009
|
+
// freed when the hash is destroyed by calling free().
|
|
1010
|
+
|
|
1011
|
+
void
|
|
1012
|
+
zhashx_set_key_destructor (zhashx_t *self, zhashx_destructor_fn destructor)
|
|
1013
|
+
{
|
|
1014
|
+
assert (self);
|
|
1015
|
+
self->key_destructor = destructor;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
|
|
1019
|
+
// --------------------------------------------------------------------------
|
|
1020
|
+
// Set a user-defined duplicator for keys; by default keys are
|
|
1021
|
+
// duplicated by calling strdup().
|
|
1022
|
+
|
|
1023
|
+
void
|
|
1024
|
+
zhashx_set_key_duplicator (zhashx_t *self, zhashx_duplicator_fn duplicator)
|
|
1025
|
+
{
|
|
1026
|
+
assert (self);
|
|
1027
|
+
self->key_duplicator = duplicator;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
// --------------------------------------------------------------------------
|
|
1032
|
+
// Set a user-defined comparator for keys; by default keys are
|
|
1033
|
+
// compared using streq.
|
|
1034
|
+
|
|
1035
|
+
void
|
|
1036
|
+
zhashx_set_key_comparator (zhashx_t *self, zhashx_comparator_fn comparator)
|
|
1037
|
+
{
|
|
1038
|
+
assert (self);
|
|
1039
|
+
assert (comparator != NULL);
|
|
1040
|
+
self->key_comparator = comparator;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
|
|
1044
|
+
// --------------------------------------------------------------------------
|
|
1045
|
+
// Set a user-defined hash function for keys; by default keys are
|
|
1046
|
+
// hashed by a modified Bernstein hashing function.
|
|
1047
|
+
|
|
1048
|
+
void
|
|
1049
|
+
zhashx_set_key_hasher (zhashx_t *self, zhashx_hash_fn hasher)
|
|
1050
|
+
{
|
|
1051
|
+
assert (self);
|
|
1052
|
+
self->hasher = hasher;
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
// --------------------------------------------------------------------------
|
|
1057
|
+
// DEPRECATED by zhashx_dup
|
|
1058
|
+
// Make copy of hash table; if supplied table is null, returns null.
|
|
1059
|
+
// Does not copy items themselves. Rebuilds new table so may be slow on
|
|
1060
|
+
// very large tables. NOTE: only works with item values that are strings
|
|
1061
|
+
// since there's no other way to know how to duplicate the item value.
|
|
1062
|
+
|
|
1063
|
+
zhashx_t *
|
|
1064
|
+
zhashx_dup_v2 (zhashx_t *self)
|
|
1065
|
+
{
|
|
1066
|
+
if (!self)
|
|
1067
|
+
return NULL;
|
|
1068
|
+
|
|
1069
|
+
zhashx_t *copy = zhashx_new ();
|
|
1070
|
+
if (copy) {
|
|
1071
|
+
zhashx_set_destructor (copy, (zhashx_destructor_fn *) zstr_free);
|
|
1072
|
+
zhashx_set_duplicator (copy, (zhashx_duplicator_fn *) strdup);
|
|
1073
|
+
uint index;
|
|
1074
|
+
size_t limit = primes [self->prime_index];
|
|
1075
|
+
for (index = 0; index < limit; index++) {
|
|
1076
|
+
item_t *item = self->items [index];
|
|
1077
|
+
while (item) {
|
|
1078
|
+
if (zhashx_insert (copy, item->key, item->value)) {
|
|
1079
|
+
zhashx_destroy (©);
|
|
1080
|
+
break;
|
|
1081
|
+
}
|
|
1082
|
+
item = item->next;
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
return copy;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
// --------------------------------------------------------------------------
|
|
1091
|
+
// Runs selftest of class
|
|
1092
|
+
//
|
|
1093
|
+
|
|
1094
|
+
#ifdef CZMQ_BUILD_DRAFT_API
|
|
1095
|
+
static char *
|
|
1096
|
+
s_test_serialize_int (const void *item)
|
|
1097
|
+
{
|
|
1098
|
+
int *int_item = (int *) item;
|
|
1099
|
+
char *str_item = (char *) zmalloc (sizeof (char) * 10);
|
|
1100
|
+
sprintf (str_item, "%d", *int_item);
|
|
1101
|
+
return str_item;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
static void *
|
|
1105
|
+
s_test_deserialze_int (const char *str_item)
|
|
1106
|
+
{
|
|
1107
|
+
int *int_item = (int *) zmalloc (sizeof (int));
|
|
1108
|
+
sscanf (str_item, "%d", int_item);
|
|
1109
|
+
return int_item;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
static void
|
|
1113
|
+
s_test_destroy_int (void **item)
|
|
1114
|
+
{
|
|
1115
|
+
int *int_item = (int *) *item;
|
|
1116
|
+
freen (int_item);
|
|
1117
|
+
}
|
|
1118
|
+
#endif // CZMQ_BUILD_DRAFT_API
|
|
1119
|
+
|
|
1120
|
+
void
|
|
1121
|
+
zhashx_test (bool verbose)
|
|
1122
|
+
{
|
|
1123
|
+
printf (" * zhashx: ");
|
|
1124
|
+
|
|
1125
|
+
// @selftest
|
|
1126
|
+
zhashx_t *hash = zhashx_new ();
|
|
1127
|
+
assert (hash);
|
|
1128
|
+
assert (zhashx_size (hash) == 0);
|
|
1129
|
+
assert (zhashx_first (hash) == NULL);
|
|
1130
|
+
assert (zhashx_cursor (hash) == NULL);
|
|
1131
|
+
|
|
1132
|
+
// Insert some items
|
|
1133
|
+
int rc;
|
|
1134
|
+
rc = zhashx_insert (hash, "DEADBEEF", "dead beef");
|
|
1135
|
+
char *item = (char *) zhashx_first (hash);
|
|
1136
|
+
assert (streq ((char *) zhashx_cursor (hash), "DEADBEEF"));
|
|
1137
|
+
assert (streq (item, "dead beef"));
|
|
1138
|
+
assert (rc == 0);
|
|
1139
|
+
rc = zhashx_insert (hash, "ABADCAFE", "a bad cafe");
|
|
1140
|
+
assert (rc == 0);
|
|
1141
|
+
rc = zhashx_insert (hash, "C0DEDBAD", "coded bad");
|
|
1142
|
+
assert (rc == 0);
|
|
1143
|
+
rc = zhashx_insert (hash, "DEADF00D", "dead food");
|
|
1144
|
+
assert (rc == 0);
|
|
1145
|
+
assert (zhashx_size (hash) == 4);
|
|
1146
|
+
|
|
1147
|
+
// Look for existing items
|
|
1148
|
+
item = (char *) zhashx_lookup (hash, "DEADBEEF");
|
|
1149
|
+
assert (streq (item, "dead beef"));
|
|
1150
|
+
item = (char *) zhashx_lookup (hash, "ABADCAFE");
|
|
1151
|
+
assert (streq (item, "a bad cafe"));
|
|
1152
|
+
item = (char *) zhashx_lookup (hash, "C0DEDBAD");
|
|
1153
|
+
assert (streq (item, "coded bad"));
|
|
1154
|
+
item = (char *) zhashx_lookup (hash, "DEADF00D");
|
|
1155
|
+
assert (streq (item, "dead food"));
|
|
1156
|
+
|
|
1157
|
+
// Look for non-existent items
|
|
1158
|
+
item = (char *) zhashx_lookup (hash, "foo");
|
|
1159
|
+
assert (item == NULL);
|
|
1160
|
+
|
|
1161
|
+
// Try to insert duplicate items
|
|
1162
|
+
rc = zhashx_insert (hash, "DEADBEEF", "foo");
|
|
1163
|
+
assert (rc == -1);
|
|
1164
|
+
item = (char *) zhashx_lookup (hash, "DEADBEEF");
|
|
1165
|
+
assert (streq (item, "dead beef"));
|
|
1166
|
+
|
|
1167
|
+
// Some rename tests
|
|
1168
|
+
|
|
1169
|
+
// Valid rename, key is now LIVEBEEF
|
|
1170
|
+
rc = zhashx_rename (hash, "DEADBEEF", "LIVEBEEF");
|
|
1171
|
+
assert (rc == 0);
|
|
1172
|
+
item = (char *) zhashx_lookup (hash, "LIVEBEEF");
|
|
1173
|
+
assert (streq (item, "dead beef"));
|
|
1174
|
+
|
|
1175
|
+
// Trying to rename an unknown item to a non-existent key
|
|
1176
|
+
rc = zhashx_rename (hash, "WHATBEEF", "NONESUCH");
|
|
1177
|
+
assert (rc == -1);
|
|
1178
|
+
|
|
1179
|
+
// Trying to rename an unknown item to an existing key
|
|
1180
|
+
rc = zhashx_rename (hash, "WHATBEEF", "LIVEBEEF");
|
|
1181
|
+
assert (rc == -1);
|
|
1182
|
+
item = (char *) zhashx_lookup (hash, "LIVEBEEF");
|
|
1183
|
+
assert (streq (item, "dead beef"));
|
|
1184
|
+
|
|
1185
|
+
// Trying to rename an existing item to another existing item
|
|
1186
|
+
rc = zhashx_rename (hash, "LIVEBEEF", "ABADCAFE");
|
|
1187
|
+
assert (rc == -1);
|
|
1188
|
+
item = (char *) zhashx_lookup (hash, "LIVEBEEF");
|
|
1189
|
+
assert (streq (item, "dead beef"));
|
|
1190
|
+
item = (char *) zhashx_lookup (hash, "ABADCAFE");
|
|
1191
|
+
assert (streq (item, "a bad cafe"));
|
|
1192
|
+
|
|
1193
|
+
// Test keys method
|
|
1194
|
+
zlistx_t *keys = zhashx_keys (hash);
|
|
1195
|
+
assert (zlistx_size (keys) == 4);
|
|
1196
|
+
zlistx_destroy (&keys);
|
|
1197
|
+
|
|
1198
|
+
zlistx_t *values = zhashx_values(hash);
|
|
1199
|
+
assert (zlistx_size (values) == 4);
|
|
1200
|
+
zlistx_destroy (&values);
|
|
1201
|
+
|
|
1202
|
+
// Test dup method
|
|
1203
|
+
zhashx_t *copy = zhashx_dup (hash);
|
|
1204
|
+
assert (zhashx_size (copy) == 4);
|
|
1205
|
+
item = (char *) zhashx_lookup (copy, "LIVEBEEF");
|
|
1206
|
+
assert (item);
|
|
1207
|
+
assert (streq (item, "dead beef"));
|
|
1208
|
+
zhashx_destroy (©);
|
|
1209
|
+
|
|
1210
|
+
// Test pack/unpack methods
|
|
1211
|
+
zframe_t *frame = zhashx_pack (hash);
|
|
1212
|
+
copy = zhashx_unpack (frame);
|
|
1213
|
+
zframe_destroy (&frame);
|
|
1214
|
+
assert (zhashx_size (copy) == 4);
|
|
1215
|
+
item = (char *) zhashx_lookup (copy, "LIVEBEEF");
|
|
1216
|
+
assert (item);
|
|
1217
|
+
assert (streq (item, "dead beef"));
|
|
1218
|
+
zhashx_destroy (©);
|
|
1219
|
+
|
|
1220
|
+
#ifdef CZMQ_BUILD_DRAFT_API
|
|
1221
|
+
// Test own pack/unpack methods
|
|
1222
|
+
zhashx_t *own_hash = zhashx_new ();
|
|
1223
|
+
zhashx_set_destructor (own_hash, s_test_destroy_int);
|
|
1224
|
+
assert (own_hash);
|
|
1225
|
+
int *val1 = (int *) zmalloc (sizeof (int));
|
|
1226
|
+
int *val2 = (int *) zmalloc (sizeof (int));
|
|
1227
|
+
*val1 = 25;
|
|
1228
|
+
*val2 = 100;
|
|
1229
|
+
zhashx_insert (own_hash, "val1", val1);
|
|
1230
|
+
zhashx_insert (own_hash, "val2", val2);
|
|
1231
|
+
frame = zhashx_pack_own (own_hash, s_test_serialize_int);
|
|
1232
|
+
copy = zhashx_unpack_own (frame, s_test_deserialze_int);
|
|
1233
|
+
zhashx_set_destructor (copy, s_test_destroy_int);
|
|
1234
|
+
zframe_destroy (&frame);
|
|
1235
|
+
assert (zhashx_size (copy) == 2);
|
|
1236
|
+
assert (*((int *) zhashx_lookup (copy, "val1")) == 25);
|
|
1237
|
+
assert (*((int *) zhashx_lookup (copy, "val2")) == 100);
|
|
1238
|
+
zhashx_destroy (©);
|
|
1239
|
+
zhashx_destroy (&own_hash);
|
|
1240
|
+
#endif // CZMQ_BUILD_DRAFT_API
|
|
1241
|
+
|
|
1242
|
+
// Test save and load
|
|
1243
|
+
zhashx_comment (hash, "This is a test file");
|
|
1244
|
+
zhashx_comment (hash, "Created by %s", "czmq_selftest");
|
|
1245
|
+
zhashx_save (hash, ".cache");
|
|
1246
|
+
copy = zhashx_new ();
|
|
1247
|
+
assert (copy);
|
|
1248
|
+
zhashx_load (copy, ".cache");
|
|
1249
|
+
item = (char *) zhashx_lookup (copy, "LIVEBEEF");
|
|
1250
|
+
assert (item);
|
|
1251
|
+
assert (streq (item, "dead beef"));
|
|
1252
|
+
zhashx_destroy (©);
|
|
1253
|
+
zsys_file_delete (".cache");
|
|
1254
|
+
|
|
1255
|
+
// Delete a item
|
|
1256
|
+
zhashx_delete (hash, "LIVEBEEF");
|
|
1257
|
+
item = (char *) zhashx_lookup (hash, "LIVEBEEF");
|
|
1258
|
+
assert (item == NULL);
|
|
1259
|
+
assert (zhashx_size (hash) == 3);
|
|
1260
|
+
|
|
1261
|
+
// Check that the queue is robust against random usage
|
|
1262
|
+
struct {
|
|
1263
|
+
char name [100];
|
|
1264
|
+
bool exists;
|
|
1265
|
+
} testset [200];
|
|
1266
|
+
memset (testset, 0, sizeof (testset));
|
|
1267
|
+
int testmax = 200, testnbr, iteration;
|
|
1268
|
+
|
|
1269
|
+
srandom ((unsigned) time (NULL));
|
|
1270
|
+
for (iteration = 0; iteration < 25000; iteration++) {
|
|
1271
|
+
testnbr = randof (testmax);
|
|
1272
|
+
assert (testnbr != testmax);
|
|
1273
|
+
assert (testnbr < testmax);
|
|
1274
|
+
if (testset [testnbr].exists) {
|
|
1275
|
+
item = (char *) zhashx_lookup (hash, testset [testnbr].name);
|
|
1276
|
+
assert (item);
|
|
1277
|
+
zhashx_delete (hash, testset [testnbr].name);
|
|
1278
|
+
testset [testnbr].exists = false;
|
|
1279
|
+
}
|
|
1280
|
+
else {
|
|
1281
|
+
sprintf (testset [testnbr].name, "%x-%x", rand (), rand ());
|
|
1282
|
+
if (zhashx_insert (hash, testset [testnbr].name, "") == 0)
|
|
1283
|
+
testset [testnbr].exists = true;
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
// Test 10K lookups
|
|
1287
|
+
for (iteration = 0; iteration < 10000; iteration++)
|
|
1288
|
+
item = (char *) zhashx_lookup (hash, "DEADBEEFABADCAFE");
|
|
1289
|
+
|
|
1290
|
+
// Destructor should be safe to call twice
|
|
1291
|
+
zhashx_destroy (&hash);
|
|
1292
|
+
zhashx_destroy (&hash);
|
|
1293
|
+
assert (hash == NULL);
|
|
1294
|
+
|
|
1295
|
+
// Test randof() limits - should be within (0..testmax)
|
|
1296
|
+
// and randomness distribution - should not have (many) zero-counts
|
|
1297
|
+
// If there are - maybe the ZSYS_RANDOF_MAX is too big for this platform
|
|
1298
|
+
// Note: This test can take a while on systems with weak floating point HW
|
|
1299
|
+
testmax = 999;
|
|
1300
|
+
size_t rndcnt[999];
|
|
1301
|
+
assert ((sizeof (rndcnt)/sizeof(rndcnt[0])) == testmax);
|
|
1302
|
+
memset (rndcnt, 0, sizeof (rndcnt));
|
|
1303
|
+
for (iteration = 0; iteration < 10000000; iteration++) {
|
|
1304
|
+
testnbr = randof (testmax);
|
|
1305
|
+
assert (testnbr != testmax);
|
|
1306
|
+
assert (testnbr < testmax);
|
|
1307
|
+
assert (testnbr >= 0);
|
|
1308
|
+
rndcnt[testnbr]++;
|
|
1309
|
+
}
|
|
1310
|
+
int rndmisses = 0;
|
|
1311
|
+
for (iteration = 0; iteration < testmax; iteration++) {
|
|
1312
|
+
if (rndcnt[iteration] == 0) {
|
|
1313
|
+
zsys_warning("zhashx_test() : random distribution fault : got 0 hits for %d/%d",
|
|
1314
|
+
iteration, testmax);
|
|
1315
|
+
rndmisses++;
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
// Too many misses are suspicious... we can lose half the entries
|
|
1319
|
+
// for each bit not used in the assumed ZSYS_RANDOF_MAX...
|
|
1320
|
+
assert ( (rndmisses < (testmax / 3 )) );
|
|
1321
|
+
|
|
1322
|
+
// Test destructor; automatically copies and frees string values
|
|
1323
|
+
hash = zhashx_new ();
|
|
1324
|
+
assert (hash);
|
|
1325
|
+
zhashx_set_destructor (hash, (zhashx_destructor_fn *) zstr_free);
|
|
1326
|
+
zhashx_set_duplicator (hash, (zhashx_duplicator_fn *) strdup);
|
|
1327
|
+
char value [255];
|
|
1328
|
+
strcpy (value, "This is a string");
|
|
1329
|
+
rc = zhashx_insert (hash, "key1", value);
|
|
1330
|
+
assert (rc == 0);
|
|
1331
|
+
strcpy (value, "Ring a ding ding");
|
|
1332
|
+
rc = zhashx_insert (hash, "key2", value);
|
|
1333
|
+
assert (rc == 0);
|
|
1334
|
+
assert (streq ((char *) zhashx_lookup (hash, "key1"), "This is a string"));
|
|
1335
|
+
assert (streq ((char *) zhashx_lookup (hash, "key2"), "Ring a ding ding"));
|
|
1336
|
+
zhashx_destroy (&hash);
|
|
1337
|
+
|
|
1338
|
+
// Test purger and shrinker: no data should end up unreferenced in valgrind
|
|
1339
|
+
hash = zhashx_new ();
|
|
1340
|
+
assert (hash);
|
|
1341
|
+
zhashx_set_destructor (hash, (zhashx_destructor_fn *) zstr_free);
|
|
1342
|
+
zhashx_set_duplicator (hash, (zhashx_duplicator_fn *) strdup);
|
|
1343
|
+
char valuep [255];
|
|
1344
|
+
strcpy (valuep, "This is a string");
|
|
1345
|
+
rc = zhashx_insert (hash, "key1", valuep);
|
|
1346
|
+
assert (rc == 0);
|
|
1347
|
+
strcpy (valuep, "Ring a ding ding");
|
|
1348
|
+
rc = zhashx_insert (hash, "key2", valuep);
|
|
1349
|
+
assert (rc == 0);
|
|
1350
|
+
strcpy (valuep, "Cartahena delenda est");
|
|
1351
|
+
rc = zhashx_insert (hash, "key3", valuep);
|
|
1352
|
+
assert (rc == 0);
|
|
1353
|
+
strcpy (valuep, "So say we all!");
|
|
1354
|
+
rc = zhashx_insert (hash, "key4", valuep);
|
|
1355
|
+
assert (rc == 0);
|
|
1356
|
+
assert (streq ((char *) zhashx_lookup (hash, "key1"), "This is a string"));
|
|
1357
|
+
assert (streq ((char *) zhashx_lookup (hash, "key2"), "Ring a ding ding"));
|
|
1358
|
+
assert (streq ((char *) zhashx_lookup (hash, "key3"), "Cartahena delenda est"));
|
|
1359
|
+
assert (streq ((char *) zhashx_lookup (hash, "key4"), "So say we all!"));
|
|
1360
|
+
zhashx_purge (hash);
|
|
1361
|
+
zhashx_destroy (&hash);
|
|
1362
|
+
|
|
1363
|
+
#if defined (__WINDOWS__)
|
|
1364
|
+
zsys_shutdown();
|
|
1365
|
+
#endif
|
|
1366
|
+
// @end
|
|
1367
|
+
|
|
1368
|
+
printf ("OK\n");
|
|
1369
|
+
}
|