ooxml_crypt 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +58 -0
- data/Rakefile +12 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/ext/ooxml_crypt/extconf.rb +18 -0
- data/ext/ooxml_crypt/ooxml_crypt.c +27 -0
- data/ext/ooxml_crypt/ooxml_crypt.h +7 -0
- data/lib/ooxml_crypt/version.rb +5 -0
- data/lib/ooxml_crypt.rb +75 -0
- data/vendor/cybozulib/.github/workflows/main.yml +12 -0
- data/vendor/cybozulib/.gitignore +5 -0
- data/vendor/cybozulib/CMakeLists.txt +6 -0
- data/vendor/cybozulib/COPYRIGHT +27 -0
- data/vendor/cybozulib/Makefile +26 -0
- data/vendor/cybozulib/bin/libeay32.dll +0 -0
- data/vendor/cybozulib/bin/libmecab.dll +0 -0
- data/vendor/cybozulib/bin/ssleay32.dll +0 -0
- data/vendor/cybozulib/common.mk +116 -0
- data/vendor/cybozulib/common.props +25 -0
- data/vendor/cybozulib/cybozulib.sln +286 -0
- data/vendor/cybozulib/debug.props +14 -0
- data/vendor/cybozulib/include/cybozu/array.hpp +197 -0
- data/vendor/cybozulib/include/cybozu/atoi.hpp +238 -0
- data/vendor/cybozulib/include/cybozu/atomic.hpp +146 -0
- data/vendor/cybozulib/include/cybozu/base64.hpp +210 -0
- data/vendor/cybozulib/include/cybozu/benchmark.hpp +212 -0
- data/vendor/cybozulib/include/cybozu/bfd.hpp +105 -0
- data/vendor/cybozulib/include/cybozu/bit_operation.hpp +139 -0
- data/vendor/cybozulib/include/cybozu/bitvector.hpp +358 -0
- data/vendor/cybozulib/include/cybozu/condition_variable.hpp +113 -0
- data/vendor/cybozulib/include/cybozu/condition_variable_cs.hpp +74 -0
- data/vendor/cybozulib/include/cybozu/config.hpp +392 -0
- data/vendor/cybozulib/include/cybozu/critical_section.hpp +60 -0
- data/vendor/cybozulib/include/cybozu/crypto.hpp +321 -0
- data/vendor/cybozulib/include/cybozu/csucvector.hpp +624 -0
- data/vendor/cybozulib/include/cybozu/csv.hpp +294 -0
- data/vendor/cybozulib/include/cybozu/data_type.hpp +27 -0
- data/vendor/cybozulib/include/cybozu/endian.hpp +224 -0
- data/vendor/cybozulib/include/cybozu/env.hpp +63 -0
- data/vendor/cybozulib/include/cybozu/event.hpp +122 -0
- data/vendor/cybozulib/include/cybozu/exception.hpp +253 -0
- data/vendor/cybozulib/include/cybozu/file.hpp +626 -0
- data/vendor/cybozulib/include/cybozu/fmindex.hpp +291 -0
- data/vendor/cybozulib/include/cybozu/format.hpp +93 -0
- data/vendor/cybozulib/include/cybozu/frequency.hpp +264 -0
- data/vendor/cybozulib/include/cybozu/hash.hpp +67 -0
- data/vendor/cybozulib/include/cybozu/inttype.hpp +174 -0
- data/vendor/cybozulib/include/cybozu/itoa.hpp +336 -0
- data/vendor/cybozulib/include/cybozu/json.hpp +120 -0
- data/vendor/cybozulib/include/cybozu/line_stream.hpp +149 -0
- data/vendor/cybozulib/include/cybozu/link_libeay32.hpp +21 -0
- data/vendor/cybozulib/include/cybozu/link_mpir.hpp +18 -0
- data/vendor/cybozulib/include/cybozu/link_ssleay32.hpp +19 -0
- data/vendor/cybozulib/include/cybozu/log.hpp +237 -0
- data/vendor/cybozulib/include/cybozu/minixml.hpp +452 -0
- data/vendor/cybozulib/include/cybozu/mmap.hpp +143 -0
- data/vendor/cybozulib/include/cybozu/mutex.hpp +144 -0
- data/vendor/cybozulib/include/cybozu/nlp/mecab.hpp +96 -0
- data/vendor/cybozulib/include/cybozu/nlp/plsi.hpp +315 -0
- data/vendor/cybozulib/include/cybozu/nlp/random.hpp +74 -0
- data/vendor/cybozulib/include/cybozu/nlp/sparse.hpp +529 -0
- data/vendor/cybozulib/include/cybozu/nlp/svd.hpp +486 -0
- data/vendor/cybozulib/include/cybozu/nlp/tfidf.hpp +226 -0
- data/vendor/cybozulib/include/cybozu/nlp/top_score.hpp +75 -0
- data/vendor/cybozulib/include/cybozu/option.hpp +743 -0
- data/vendor/cybozulib/include/cybozu/parallel.hpp +88 -0
- data/vendor/cybozulib/include/cybozu/pcg.hpp +72 -0
- data/vendor/cybozulib/include/cybozu/process.hpp +324 -0
- data/vendor/cybozulib/include/cybozu/quit_signal_handler.hpp +66 -0
- data/vendor/cybozulib/include/cybozu/random_generator.hpp +144 -0
- data/vendor/cybozulib/include/cybozu/regex.hpp +463 -0
- data/vendor/cybozulib/include/cybozu/select8.hpp +279 -0
- data/vendor/cybozulib/include/cybozu/serializer.hpp +363 -0
- data/vendor/cybozulib/include/cybozu/sha1.hpp +209 -0
- data/vendor/cybozulib/include/cybozu/sha2.hpp +506 -0
- data/vendor/cybozulib/include/cybozu/siphash.hpp +105 -0
- data/vendor/cybozulib/include/cybozu/socket.hpp +785 -0
- data/vendor/cybozulib/include/cybozu/ssl.hpp +203 -0
- data/vendor/cybozulib/include/cybozu/stacktrace.hpp +291 -0
- data/vendor/cybozulib/include/cybozu/stream.hpp +269 -0
- data/vendor/cybozulib/include/cybozu/string.hpp +1746 -0
- data/vendor/cybozulib/include/cybozu/string_operation.hpp +365 -0
- data/vendor/cybozulib/include/cybozu/sucvector.hpp +378 -0
- data/vendor/cybozulib/include/cybozu/test.hpp +373 -0
- data/vendor/cybozulib/include/cybozu/thread.hpp +229 -0
- data/vendor/cybozulib/include/cybozu/time.hpp +281 -0
- data/vendor/cybozulib/include/cybozu/tls.hpp +115 -0
- data/vendor/cybozulib/include/cybozu/unordered_map.hpp +13 -0
- data/vendor/cybozulib/include/cybozu/unordered_set.hpp +13 -0
- data/vendor/cybozulib/include/cybozu/v128.hpp +376 -0
- data/vendor/cybozulib/include/cybozu/wavelet_matrix.hpp +345 -0
- data/vendor/cybozulib/include/cybozu/xorshift.hpp +189 -0
- data/vendor/cybozulib/include/cybozu/zlib.hpp +325 -0
- data/vendor/cybozulib/include/sais.hxx +364 -0
- data/vendor/cybozulib/misc/make_select8tbl.cpp +26 -0
- data/vendor/cybozulib/mk.bat +37 -0
- data/vendor/cybozulib/readme.md +29 -0
- data/vendor/cybozulib/release.props +12 -0
- data/vendor/cybozulib/sample/Makefile +30 -0
- data/vendor/cybozulib/sample/csucvector_smpl.cpp +42 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.S +4 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.U +4 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.V +6 -0
- data/vendor/cybozulib/sample/data/svd/test1 +4 -0
- data/vendor/cybozulib/sample/data/svd/test2 +4 -0
- data/vendor/cybozulib/sample/desymbol.cpp +127 -0
- data/vendor/cybozulib/sample/exception_smpl.cpp +46 -0
- data/vendor/cybozulib/sample/fmindex_smpl.cpp +231 -0
- data/vendor/cybozulib/sample/log_smpl.cpp +19 -0
- data/vendor/cybozulib/sample/mecab_smpl.cpp +37 -0
- data/vendor/cybozulib/sample/option2_smpl.cpp +68 -0
- data/vendor/cybozulib/sample/option_smpl.cpp +42 -0
- data/vendor/cybozulib/sample/plsi_smpl.cpp +207 -0
- data/vendor/cybozulib/sample/proj/exception_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/proj/mecab_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/proj/ssl_smpl/ssl_smpl.vcxproj +85 -0
- data/vendor/cybozulib/sample/proj/ssl_smpl.vcproj +347 -0
- data/vendor/cybozulib/sample/proj/stacktrace_smpl/stacktrace_smpl.vcxproj +85 -0
- data/vendor/cybozulib/sample/proj/svd_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/quit_signal_handler.cpp +30 -0
- data/vendor/cybozulib/sample/serializer_smpl.cpp +196 -0
- data/vendor/cybozulib/sample/socket_smpl.cpp +82 -0
- data/vendor/cybozulib/sample/ssl_smpl.cpp +39 -0
- data/vendor/cybozulib/sample/stacktrace_smpl.cpp +52 -0
- data/vendor/cybozulib/sample/svd_bench_smpl.cpp +143 -0
- data/vendor/cybozulib/sample/svd_smpl.cpp +94 -0
- data/vendor/cybozulib/sample/wm_bench_smpl.cpp +182 -0
- data/vendor/cybozulib/sample/zlib_smpl.cpp +41 -0
- data/vendor/cybozulib/src/Makefile +8 -0
- data/vendor/cybozulib/src/base/Makefile +19 -0
- data/vendor/cybozulib/test/Makefile +12 -0
- data/vendor/cybozulib/test/base/Makefile +37 -0
- data/vendor/cybozulib/test/base/array_test.cpp +173 -0
- data/vendor/cybozulib/test/base/atoi_test.cpp +774 -0
- data/vendor/cybozulib/test/base/atomic_test.cpp +49 -0
- data/vendor/cybozulib/test/base/base64_test.cpp +113 -0
- data/vendor/cybozulib/test/base/bit_operation_test.cpp +134 -0
- data/vendor/cybozulib/test/base/bitvector_test.cpp +204 -0
- data/vendor/cybozulib/test/base/condition_variable_cs_test.cpp +92 -0
- data/vendor/cybozulib/test/base/condition_variable_test.cpp +88 -0
- data/vendor/cybozulib/test/base/config_test.cpp +236 -0
- data/vendor/cybozulib/test/base/crypto_test.cpp +122 -0
- data/vendor/cybozulib/test/base/csucvector_test.cpp +63 -0
- data/vendor/cybozulib/test/base/csv_test.cpp +182 -0
- data/vendor/cybozulib/test/base/data/a.xml +26 -0
- data/vendor/cybozulib/test/base/endian_test.cpp +56 -0
- data/vendor/cybozulib/test/base/env_test.cpp +22 -0
- data/vendor/cybozulib/test/base/event_test.cpp +41 -0
- data/vendor/cybozulib/test/base/file_test.cpp +233 -0
- data/vendor/cybozulib/test/base/fmindex_test.cpp +118 -0
- data/vendor/cybozulib/test/base/format_test.cpp +12 -0
- data/vendor/cybozulib/test/base/frequency_test.cpp +104 -0
- data/vendor/cybozulib/test/base/itoa_test.cpp +522 -0
- data/vendor/cybozulib/test/base/line_stream_test.cpp +208 -0
- data/vendor/cybozulib/test/base/mecab_test.cpp +41 -0
- data/vendor/cybozulib/test/base/minixml_test.cpp +103 -0
- data/vendor/cybozulib/test/base/mmap_test.cpp +15 -0
- data/vendor/cybozulib/test/base/option_test.cpp +487 -0
- data/vendor/cybozulib/test/base/parallel_test.cpp +48 -0
- data/vendor/cybozulib/test/base/proj/array_test/array_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/atoi_test/atoi_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/atomic_test/atomic_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/base64_test/base64_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/condition_variable_cs_test/condition_variable_cs_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/condition_variable_test/condition_variable_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/config_test/config_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/csv_test/csv_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/endian_test/endian_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/env_test/env_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/event_test/event_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/file_test/file_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/itoa_test/itoa_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/mecab_test/mecab_test.vcxproj +88 -0
- data/vendor/cybozulib/test/base/proj/minixml_test/minixml_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/mmap_test/mmap_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/serializer_test/serializer_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/sha1_test/sha1_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/stream_test/stream_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/string_operation_test/string_operation_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/string_test/string_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/thread_test/thread_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/time_test/time_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/tls_test/tls_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/zlib_test/zlib_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/random_generator_test.cpp +28 -0
- data/vendor/cybozulib/test/base/regex_test.cpp +74 -0
- data/vendor/cybozulib/test/base/serializer_test.cpp +483 -0
- data/vendor/cybozulib/test/base/sha1_test.cpp +61 -0
- data/vendor/cybozulib/test/base/sha2_test.cpp +191 -0
- data/vendor/cybozulib/test/base/siphash_test.cpp +33 -0
- data/vendor/cybozulib/test/base/socket_test.cpp +76 -0
- data/vendor/cybozulib/test/base/stream_test.cpp +101 -0
- data/vendor/cybozulib/test/base/string_operation_test.cpp +340 -0
- data/vendor/cybozulib/test/base/string_test.cpp +1705 -0
- data/vendor/cybozulib/test/base/sucvector_test.cpp +312 -0
- data/vendor/cybozulib/test/base/thread_test.cpp +62 -0
- data/vendor/cybozulib/test/base/time_test.cpp +164 -0
- data/vendor/cybozulib/test/base/tls_test.cpp +50 -0
- data/vendor/cybozulib/test/base/wavelet_matrix_test.cpp +145 -0
- data/vendor/cybozulib/test/base/zlib_test.cpp +371 -0
- data/vendor/cybozulib/test/nlp/Makefile +27 -0
- data/vendor/cybozulib/test/nlp/proj/random_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/proj/sparse_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/proj/svd_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/random_test.cpp +62 -0
- data/vendor/cybozulib/test/nlp/sparse_test.cpp +347 -0
- data/vendor/cybozulib/test/nlp/svd_test.cpp +234 -0
- data/vendor/cybozulib/test/nlp/top_score_test.cpp +40 -0
- data/vendor/cybozulib/tool/create_vcproj.py +186 -0
- data/vendor/cybozulib/tool/vcproj_tmpl.py +185 -0
- data/vendor/msoffice/COPYRIGHT +27 -0
- data/vendor/msoffice/Makefile +29 -0
- data/vendor/msoffice/bin/64/msoc.dll +0 -0
- data/vendor/msoffice/bin/64/msocsample.exe +0 -0
- data/vendor/msoffice/bin/64/msoffice-crypt.exe +0 -0
- data/vendor/msoffice/bin/msoc.dll +0 -0
- data/vendor/msoffice/bin/msocsample.exe +0 -0
- data/vendor/msoffice/bin/msoffice-crypt.exe +0 -0
- data/vendor/msoffice/common.mk +71 -0
- data/vendor/msoffice/common.props +26 -0
- data/vendor/msoffice/debug.props +14 -0
- data/vendor/msoffice/include/attack.hpp +211 -0
- data/vendor/msoffice/include/cfb.hpp +777 -0
- data/vendor/msoffice/include/crypto_util.hpp +450 -0
- data/vendor/msoffice/include/custom_sha1.hpp +342 -0
- data/vendor/msoffice/include/decode.hpp +240 -0
- data/vendor/msoffice/include/encode.hpp +221 -0
- data/vendor/msoffice/include/make_dataspace.hpp +316 -0
- data/vendor/msoffice/include/msoc.h +129 -0
- data/vendor/msoffice/include/resource.hpp +7 -0
- data/vendor/msoffice/include/standard_encryption.hpp +145 -0
- data/vendor/msoffice/include/uint32vec.hpp +179 -0
- data/vendor/msoffice/include/util.hpp +212 -0
- data/vendor/msoffice/lib/.emptydir +0 -0
- data/vendor/msoffice/misc/decrypt-xls.vbs +46 -0
- data/vendor/msoffice/mk.bat +1 -0
- data/vendor/msoffice/mkdll.bat +3 -0
- data/vendor/msoffice/msoc.def +13 -0
- data/vendor/msoffice/msocsample.py +178 -0
- data/vendor/msoffice/msoffice12.sln +31 -0
- data/vendor/msoffice/readme.md +110 -0
- data/vendor/msoffice/release.props +28 -0
- data/vendor/msoffice/src/Makefile +19 -0
- data/vendor/msoffice/src/attack.cpp +124 -0
- data/vendor/msoffice/src/cfb_test.cpp +77 -0
- data/vendor/msoffice/src/minisample.c +54 -0
- data/vendor/msoffice/src/msocdll.cpp +276 -0
- data/vendor/msoffice/src/msocsample.c +136 -0
- data/vendor/msoffice/src/msoffice-crypt.cpp +219 -0
- data/vendor/msoffice/src/proj/attack/attack.vcxproj +88 -0
- data/vendor/msoffice/src/proj/main/msoffice-crypt.vcxproj +88 -0
- data/vendor/msoffice/src/sha1.cpp +234 -0
- data/vendor/msoffice/test/Makefile +20 -0
- data/vendor/msoffice/test/cfb_test.cpp +74 -0
- data/vendor/msoffice/test/hash_test.cpp +59 -0
- data/vendor/msoffice/test/proj/cfb/cfb_test.vcxproj +90 -0
- data/vendor/msoffice/test/proj/hash/hash_test.vcxproj +90 -0
- data/vendor/msoffice/test/sampl.bat +8 -0
- data/vendor/msoffice/test_all.py +46 -0
- data/vendor/update +4 -0
- metadata +351 -0
@@ -0,0 +1,312 @@
|
|
1
|
+
#include <cybozu/test.hpp>
|
2
|
+
#include <cybozu/sucvector.hpp>
|
3
|
+
#include <cybozu/xorshift.hpp>
|
4
|
+
#include <cybozu/benchmark.hpp>
|
5
|
+
#include <sstream>
|
6
|
+
#include <time.h>
|
7
|
+
|
8
|
+
uint64_t select64n(uint64_t v, uint64_t n)
|
9
|
+
{
|
10
|
+
size_t count = 0;
|
11
|
+
for (int i = 0; i < 64; i++) {
|
12
|
+
if (v & (uint64_t(1) << i))
|
13
|
+
count++;
|
14
|
+
if (count == n)
|
15
|
+
return i;
|
16
|
+
}
|
17
|
+
return 64;
|
18
|
+
}
|
19
|
+
|
20
|
+
uint64_t rank(const cybozu::SucVector& v, bool b, size_t n)
|
21
|
+
{
|
22
|
+
uint64_t ret = 0;
|
23
|
+
for (size_t i = 0; i < n; i++) {
|
24
|
+
if (v.get(i) == b) {
|
25
|
+
ret++;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
return ret;
|
29
|
+
}
|
30
|
+
|
31
|
+
uint64_t select(const cybozu::SucVector& v, bool b, size_t n)
|
32
|
+
{
|
33
|
+
n++;
|
34
|
+
for (size_t i = 0; i < v.size(); i++) {
|
35
|
+
if (v.get(i) == b) n--;
|
36
|
+
if (n == 0) return i;
|
37
|
+
}
|
38
|
+
return cybozu::NotFound;
|
39
|
+
}
|
40
|
+
|
41
|
+
/*
|
42
|
+
compare speed
|
43
|
+
from https://code.google.com/p/shellinford/source/browse/trunk/src/shellinford_bit_vector.cc
|
44
|
+
*/
|
45
|
+
inline uint64_t select64C(uint64_t x, uint64_t i)
|
46
|
+
{
|
47
|
+
uint64_t x1 = ((x & 0xaaaaaaaaaaaaaaaaULL) >> 1) + (x & 0x5555555555555555ULL);
|
48
|
+
uint64_t x2 = ((x1 & 0xccccccccccccccccULL) >> 2) + (x1 & 0x3333333333333333ULL);
|
49
|
+
uint64_t x3 = ((x2 & 0xf0f0f0f0f0f0f0f0ULL) >> 4) + (x2 & 0x0f0f0f0f0f0f0f0fULL);
|
50
|
+
uint64_t x4 = ((x3 & 0xff00ff00ff00ff00ULL) >> 8) + (x3 & 0x00ff00ff00ff00ffULL);
|
51
|
+
uint64_t x5 = ((x4 & 0xffff0000ffff0000ULL) >> 16) + (x4 & 0x0000ffff0000ffffULL);
|
52
|
+
// i++;
|
53
|
+
uint64_t pos = 0;
|
54
|
+
uint64_t v5 = x5 & 0xffffffffULL;
|
55
|
+
if (i > v5) { i -= v5; pos += 32; }
|
56
|
+
uint64_t v4 = (x4 >> pos) & 0x0000ffffULL;
|
57
|
+
if (i > v4) { i -= v4; pos += 16; }
|
58
|
+
uint64_t v3 = (x3 >> pos) & 0x000000ffULL;
|
59
|
+
if (i > v3) { i -= v3; pos += 8; }
|
60
|
+
uint64_t v2 = (x2 >> pos) & 0x0000000fULL;
|
61
|
+
if (i > v2) { i -= v2; pos += 4; }
|
62
|
+
uint64_t v1 = (x1 >> pos) & 0x00000003ULL;
|
63
|
+
if (i > v1) { i -= v1; pos += 2; }
|
64
|
+
uint64_t v0 = (x >> pos) & 0x00000001ULL;
|
65
|
+
if (i > v0) { i -= v0; pos += 1; }
|
66
|
+
return pos;
|
67
|
+
}
|
68
|
+
|
69
|
+
CYBOZU_TEST_AUTO(testall)
|
70
|
+
{
|
71
|
+
cybozu::XorShift rg;
|
72
|
+
const size_t N = 30;
|
73
|
+
std::vector<uint64_t> v;
|
74
|
+
v.resize(N);
|
75
|
+
for (size_t i = 0; i < N; i++) {
|
76
|
+
v[i] = rg.get64();
|
77
|
+
}
|
78
|
+
cybozu::SucVector sv;
|
79
|
+
sv.init(&v[0], v.size() * 64);
|
80
|
+
for (size_t i = 0; i < sv.size(); i++) {
|
81
|
+
CYBOZU_TEST_EQUAL(sv.rank(true, i), rank(sv, true, i));
|
82
|
+
CYBOZU_TEST_EQUAL(sv.rank(false, i), rank(sv, false, i));
|
83
|
+
CYBOZU_TEST_EQUAL(sv.select(true, i), select(sv, true, i));
|
84
|
+
CYBOZU_TEST_EQUAL(sv.select(false, i), select(sv, false, i));
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
CYBOZU_TEST_AUTO(test0)
|
89
|
+
{
|
90
|
+
cybozu::SucVector sv;
|
91
|
+
uint64_t blk = 722;
|
92
|
+
sv.init(&blk, 64); // 0100101101
|
93
|
+
CYBOZU_TEST_EQUAL(sv.rank(1, 6), 2u);
|
94
|
+
CYBOZU_TEST_EQUAL(sv.select(0, 4), 8u);
|
95
|
+
}
|
96
|
+
|
97
|
+
CYBOZU_TEST_AUTO(select)
|
98
|
+
{
|
99
|
+
const uint64_t v[] = {
|
100
|
+
0xdca345ea1b5116e6ULL,
|
101
|
+
0x951049aad88d00b0ULL,
|
102
|
+
0x1ec7825e8db24146ULL,
|
103
|
+
0x9af814432ac00f2cULL,
|
104
|
+
0xffffffffffffffffULL,
|
105
|
+
0x242342afecbfe4aaULL,
|
106
|
+
0xffffffffffffffffULL,
|
107
|
+
0xf324987abcef3242ULL
|
108
|
+
};
|
109
|
+
const size_t bitLen = sizeof(v) * 8;
|
110
|
+
cybozu::SucVector sv;
|
111
|
+
sv.init(v, bitLen);
|
112
|
+
for (int s = 0; s < 2; s++) {
|
113
|
+
const bool b = s == 0;
|
114
|
+
const uint64_t max = sv.rank(b, bitLen);
|
115
|
+
for (size_t r = 0; r < max; r++) {
|
116
|
+
CYBOZU_TEST_EQUAL(sv.select(b, r), select(sv, b, r));
|
117
|
+
CYBOZU_TEST_EQUAL(sv.rank(b, sv.select(b, r) + 1), r + 1);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
|
122
|
+
CYBOZU_TEST_AUTO(relation)
|
123
|
+
{
|
124
|
+
const uint64_t v = 0x242342afecbfe4aaULL;
|
125
|
+
const size_t max = cybozu::popcnt<uint64_t>(v);
|
126
|
+
for (size_t r = 0; r < max; r++) {
|
127
|
+
CYBOZU_TEST_EQUAL(cybozu::sucvector_util::rank64(v, cybozu::sucvector_util::select64(v, r) + 1), r);
|
128
|
+
CYBOZU_TEST_EQUAL(cybozu::sucvector_util::rank64(v, cybozu::sucvector_util::select64(v, r + 1) + 1), r + 1);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
CYBOZU_TEST_AUTO(rank)
|
133
|
+
{
|
134
|
+
cybozu::SucVector sv;
|
135
|
+
uint64_t blk = 6;
|
136
|
+
sv.init(&blk, 64); // 0b0110
|
137
|
+
const struct {
|
138
|
+
bool val;
|
139
|
+
uint32_t rank0;
|
140
|
+
uint32_t rank1;
|
141
|
+
} tbl [] = {
|
142
|
+
{ 0, 1, 0 },
|
143
|
+
{ 1, 1, 1 },
|
144
|
+
{ 1, 1, 2 },
|
145
|
+
{ 0, 2, 2 },
|
146
|
+
};
|
147
|
+
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
|
148
|
+
CYBOZU_TEST_EQUAL(sv.rank0(i + 1), tbl[i].rank0);
|
149
|
+
CYBOZU_TEST_EQUAL(sv.rank1(i + 1), tbl[i].rank1);
|
150
|
+
CYBOZU_TEST_EQUAL(sv.get(i), tbl[i].val);
|
151
|
+
}
|
152
|
+
}
|
153
|
+
|
154
|
+
bool get(const uint64_t *blk, size_t pos)
|
155
|
+
{
|
156
|
+
size_t q = pos / 64;
|
157
|
+
size_t r = pos & 63;
|
158
|
+
return ((blk[q] >> r) & 1) != 0;
|
159
|
+
}
|
160
|
+
|
161
|
+
uint32_t count(const uint64_t *blk, size_t pos)
|
162
|
+
{
|
163
|
+
uint32_t ret = 0;
|
164
|
+
for (size_t i = 0; i < pos; i++) {
|
165
|
+
if (get(blk, i)) ret++;
|
166
|
+
}
|
167
|
+
return ret;
|
168
|
+
}
|
169
|
+
|
170
|
+
void testSub(const cybozu::SucVector& sv, const uint64_t *tbl, size_t tblNum)
|
171
|
+
{
|
172
|
+
for (size_t i = 0; i < tblNum * 64; i++) {
|
173
|
+
CYBOZU_TEST_EQUAL(sv.get(i), get(tbl, i));
|
174
|
+
CYBOZU_TEST_EQUAL(sv.rank1(i), count(tbl, i));
|
175
|
+
}
|
176
|
+
CYBOZU_TEST_EQUAL(sv.rank0(tblNum * 64), sv.size(0));
|
177
|
+
CYBOZU_TEST_EQUAL(sv.rank1(tblNum * 64), sv.size(1));
|
178
|
+
}
|
179
|
+
|
180
|
+
CYBOZU_TEST_AUTO(get_load_save)
|
181
|
+
{
|
182
|
+
uint64_t tbl[] = {
|
183
|
+
0x1234567812345678ULL, 0xffffffffffffffffULL, 0x1020304050607080ULL,
|
184
|
+
0x3172039874192874ULL, 0x0000000000000000ULL, 0xfeabcbfeacbefaaeULL,
|
185
|
+
0xfefefefefefefeefULL, 0x1864192836419823ULL, 0xaaaaaaaaaaaaaaaaULL,
|
186
|
+
};
|
187
|
+
const size_t tblNum = CYBOZU_NUM_OF_ARRAY(tbl);
|
188
|
+
cybozu::SucVector sv;
|
189
|
+
sv.init(tbl, tblNum * 64);
|
190
|
+
|
191
|
+
testSub(sv, tbl, tblNum);
|
192
|
+
std::string data;
|
193
|
+
{
|
194
|
+
std::ostringstream os;
|
195
|
+
sv.save(os);
|
196
|
+
data = os.str();
|
197
|
+
}
|
198
|
+
{
|
199
|
+
std::istringstream is(data);
|
200
|
+
cybozu::SucVector sv2;
|
201
|
+
sv2.load(is);
|
202
|
+
testSub(sv2, tbl, tblNum);
|
203
|
+
}
|
204
|
+
}
|
205
|
+
|
206
|
+
CYBOZU_TEST_AUTO(select8)
|
207
|
+
{
|
208
|
+
const uint32_t s = 13;
|
209
|
+
for (uint32_t v = 0; v < (1 << s); v++) {
|
210
|
+
for (uint32_t x = 0; x < s; x++) {
|
211
|
+
uint64_t a = cybozu::sucvector_util::select64(v, x);
|
212
|
+
// uint64_t a = select64n(v, x);
|
213
|
+
uint64_t b = select64C(v, x);
|
214
|
+
if (a < 64) {
|
215
|
+
CYBOZU_TEST_EQUAL(a, b);
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
}
|
220
|
+
|
221
|
+
CYBOZU_TEST_AUTO(select64)
|
222
|
+
{
|
223
|
+
uint64_t tbl[] = {
|
224
|
+
0xf0f0f0f0f0f030eeULL,
|
225
|
+
0x0000000000000006ULL,
|
226
|
+
0x0000000000000000ULL,
|
227
|
+
0x0000000000000001ULL,
|
228
|
+
0x9190751837459273ULL,
|
229
|
+
0xffffffffffffffffULL,
|
230
|
+
};
|
231
|
+
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
|
232
|
+
uint64_t v = tbl[i];
|
233
|
+
for (size_t x = 0; x < 64; x++) {
|
234
|
+
// uint64_t a = select64C(v, x);
|
235
|
+
uint64_t a = cybozu::sucvector_util::select64(v, x);
|
236
|
+
uint64_t b = select64n(v, x);
|
237
|
+
if (a < 64) {
|
238
|
+
CYBOZU_TEST_EQUAL(a, b);
|
239
|
+
}
|
240
|
+
}
|
241
|
+
}
|
242
|
+
}
|
243
|
+
|
244
|
+
#ifdef NDEBUG
|
245
|
+
|
246
|
+
template<class R, class P1, class P2>
|
247
|
+
struct BenchSelect {
|
248
|
+
cybozu::XorShift rg_;
|
249
|
+
uint64_t ret_;
|
250
|
+
R (*f_)(P1, P2);
|
251
|
+
BenchSelect(const char *msg, R (*f)(P1, P2))
|
252
|
+
: ret_(0)
|
253
|
+
, f_(f)
|
254
|
+
{
|
255
|
+
printf("%s", msg);
|
256
|
+
CYBOZU_BENCH("", run);
|
257
|
+
printf(" %x\n", (int)ret_);
|
258
|
+
}
|
259
|
+
void run()
|
260
|
+
{
|
261
|
+
uint64_t v = rg_.get64();
|
262
|
+
int x = rg_.get32() % 64;
|
263
|
+
ret_ += f_(v, x);
|
264
|
+
}
|
265
|
+
};
|
266
|
+
|
267
|
+
template<class T, class F>
|
268
|
+
void bench(const T& sv, const F& f, size_t N)
|
269
|
+
{
|
270
|
+
const uint64_t M = sv.size();
|
271
|
+
cybozu::XorShift rg;
|
272
|
+
uint64_t ret = 0;
|
273
|
+
clock_t begin = clock();
|
274
|
+
for (size_t i = 0; i < N; i++) {
|
275
|
+
uint64_t x = rg() & (M - 1);
|
276
|
+
ret += (sv.*f)((x & 1) != 0, x);
|
277
|
+
}
|
278
|
+
double t = (clock() - begin) / double(CLOCKS_PER_SEC) / N * 1e9;
|
279
|
+
printf("ret=%x, %.2fnsec\n", (int)ret, t);
|
280
|
+
}
|
281
|
+
|
282
|
+
template<class Suc>
|
283
|
+
void benchAll(size_t bitN)
|
284
|
+
{
|
285
|
+
cybozu::XorShift rg;
|
286
|
+
const size_t N = size_t(1) << bitN;
|
287
|
+
std::vector<uint64_t> v(N / 64);
|
288
|
+
for (size_t i = 0, n = v.size(); i < n; i++) {
|
289
|
+
v[i] = rg.get64();
|
290
|
+
}
|
291
|
+
Suc sv;
|
292
|
+
sv.init(&v[0], N);
|
293
|
+
puts("bench");
|
294
|
+
puts("rank");
|
295
|
+
bench(sv, &Suc::rank, 10000000);
|
296
|
+
puts("select");
|
297
|
+
bench(sv, &Suc::select, 1000000);
|
298
|
+
}
|
299
|
+
|
300
|
+
CYBOZU_TEST_AUTO(select64Bench)
|
301
|
+
{
|
302
|
+
BenchSelect<uint64_t, uint64_t, uint64_t>("select64C ", select64C);
|
303
|
+
BenchSelect<uint32_t, uint64_t, size_t> ("cy:select64", cybozu::sucvector_util::select64);
|
304
|
+
BenchSelect<uint64_t, uint64_t, uint64_t>("select64n ", select64n);
|
305
|
+
|
306
|
+
puts("SucVectorLt4G");
|
307
|
+
benchAll<cybozu::SucVectorLt4G>(31);
|
308
|
+
puts("SucVector");
|
309
|
+
benchAll<cybozu::SucVector>(31);
|
310
|
+
}
|
311
|
+
#endif
|
312
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <cybozu/thread.hpp>
|
3
|
+
#include <cybozu/mutex.hpp>
|
4
|
+
#include <cybozu/test.hpp>
|
5
|
+
#include <cybozu/atomic.hpp>
|
6
|
+
|
7
|
+
const int N = 1000000;
|
8
|
+
int s_count = 0;
|
9
|
+
|
10
|
+
class ThreadTest : public cybozu::ThreadBase {
|
11
|
+
cybozu::Mutex& mutex_;
|
12
|
+
int num_;
|
13
|
+
public:
|
14
|
+
ThreadTest(cybozu::Mutex& mutex, int num)
|
15
|
+
: mutex_(mutex)
|
16
|
+
, num_(num)
|
17
|
+
{
|
18
|
+
printf("make %d\n", num_);
|
19
|
+
}
|
20
|
+
|
21
|
+
void threadEntry()
|
22
|
+
{
|
23
|
+
printf("start %d\n", num_);
|
24
|
+
for (int i = 0; i < N; i++) {
|
25
|
+
cybozu::AutoLock al(mutex_);
|
26
|
+
s_count++;
|
27
|
+
}
|
28
|
+
printf("end %d\n", num_);
|
29
|
+
}
|
30
|
+
};
|
31
|
+
|
32
|
+
CYBOZU_TEST_AUTO(cpuNum)
|
33
|
+
{
|
34
|
+
int num = cybozu::GetProcessorNum();
|
35
|
+
CYBOZU_TEST_ASSERT(num > 0);
|
36
|
+
printf("cpu num=%d\n", num);
|
37
|
+
}
|
38
|
+
|
39
|
+
CYBOZU_TEST_AUTO(autoLock)
|
40
|
+
{
|
41
|
+
cybozu::Mutex mutex_;
|
42
|
+
ThreadTest t1(mutex_, 1);
|
43
|
+
ThreadTest t2(mutex_, 2);
|
44
|
+
if (!t1.beginThread()) puts("err thread 1");
|
45
|
+
if (!t2.beginThread()) puts("err thread 2");
|
46
|
+
cybozu::Sleep(1000);
|
47
|
+
/*
|
48
|
+
verity number of increment
|
49
|
+
*/
|
50
|
+
puts("start main");
|
51
|
+
for (int i = 0; i < N; i++) {
|
52
|
+
cybozu::AutoLock al(mutex_);
|
53
|
+
s_count++;
|
54
|
+
}
|
55
|
+
puts("end main");
|
56
|
+
|
57
|
+
if (!t1.joinThread()) puts("err join 1");
|
58
|
+
if (!t2.joinThread()) puts("err join 2");
|
59
|
+
cybozu::mfence();
|
60
|
+
CYBOZU_TEST_EQUAL(s_count, N * 3);
|
61
|
+
}
|
62
|
+
|
@@ -0,0 +1,164 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <memory.h>
|
3
|
+
#include <cybozu/time.hpp>
|
4
|
+
#include <cybozu/test.hpp>
|
5
|
+
|
6
|
+
#ifdef _WIN32
|
7
|
+
#define MK_GMT_TIME(x) _mkgmtime64(x)
|
8
|
+
#else
|
9
|
+
#define MK_GMT_TIME(x) timegm(x)
|
10
|
+
#endif
|
11
|
+
|
12
|
+
std::string timeToStr(std::time_t & time, int year, int month, int day, int hour, int minute, int second, int msec, int mode)
|
13
|
+
{
|
14
|
+
struct tm tm;
|
15
|
+
tm.tm_year = year - 1900;
|
16
|
+
tm.tm_mon = month - 1;
|
17
|
+
tm.tm_mday = day;
|
18
|
+
tm.tm_hour = hour;
|
19
|
+
tm.tm_min = minute;
|
20
|
+
tm.tm_sec = second;
|
21
|
+
tm.tm_isdst = 0;
|
22
|
+
time = MK_GMT_TIME(&tm);
|
23
|
+
|
24
|
+
char buf[64];
|
25
|
+
if (mode & 1) {
|
26
|
+
// "2009-01-23 02:53:44"
|
27
|
+
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm);
|
28
|
+
} else {
|
29
|
+
// "2009-Jan-23 02:53:44"
|
30
|
+
strftime(buf, sizeof(buf), "%Y-%b-%d %H:%M:%S", &tm);
|
31
|
+
}
|
32
|
+
std::string str = buf;
|
33
|
+
if (mode & 2) {
|
34
|
+
char buf2[64];
|
35
|
+
CYBOZU_SNPRINTF(buf2, 5, ".%03d", msec);
|
36
|
+
str += buf2;
|
37
|
+
}
|
38
|
+
return str;
|
39
|
+
}
|
40
|
+
|
41
|
+
CYBOZU_TEST_AUTO(fromString1)
|
42
|
+
{
|
43
|
+
std::string str;
|
44
|
+
std::time_t time;
|
45
|
+
for (int mode = 0; mode < 4; mode++) {
|
46
|
+
int year = 2009;
|
47
|
+
int day = 23;
|
48
|
+
int hour = 2;
|
49
|
+
int minute = 53;
|
50
|
+
int second = 41;
|
51
|
+
int msec = 72;
|
52
|
+
for (int month = 1; month <= 12; month++) {
|
53
|
+
str = timeToStr(time, year, month, day, hour, minute, second, msec, mode);
|
54
|
+
cybozu::Time tm(str);
|
55
|
+
CYBOZU_TEST_EQUAL(tm.getTime(), time);
|
56
|
+
if (mode & 2) {
|
57
|
+
CYBOZU_TEST_EQUAL(tm.getMsec(), msec);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
CYBOZU_TEST_AUTO(fromString2)
|
64
|
+
{
|
65
|
+
const struct Data {
|
66
|
+
const char *str;
|
67
|
+
int year;
|
68
|
+
int month;
|
69
|
+
int day;
|
70
|
+
int hour;
|
71
|
+
int minute;
|
72
|
+
int second;
|
73
|
+
int msec;
|
74
|
+
} tbl[] = {
|
75
|
+
{ "2009-Jan-23T02:53:44Z", 2009, 1, 23, 2, 53, 44, 0 },
|
76
|
+
{ "2009-Jan-23T02:53:44.078Z", 2009, 1, 23, 2, 53, 44, 78 },
|
77
|
+
{ "2009-Jan-23T02:53:44", 2009, 1, 23, 2, 53, 44, 0 },
|
78
|
+
{ "2009-Jan-23T02:53:44.078", 2009, 1, 23, 2, 53, 44, 78 },
|
79
|
+
{ "2009-Jan-23 02:53:44", 2009, 1, 23, 2, 53, 44, 0 },
|
80
|
+
{ "2009-Jan-23 02:53:44.078", 2009, 1, 23, 2, 53, 44, 78 },
|
81
|
+
{ "2009/Jan/23 02:53:44", 2009, 1, 23, 2, 53, 44, 0 },
|
82
|
+
{ "2009/Jan/23 02:53:44.078", 2009, 1, 23, 2, 53, 44, 78 },
|
83
|
+
{ "2009/01/23 02:53:44", 2009, 1, 23, 2, 53, 44, 0 },
|
84
|
+
{ "2009/01/23 02:53:44.078", 2009, 1, 23, 2, 53, 44, 78 },
|
85
|
+
};
|
86
|
+
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
|
87
|
+
const Data& d = tbl[i];
|
88
|
+
std::time_t time;
|
89
|
+
timeToStr(time, d.year, d.month, d.day, d.hour, d.minute, d.second, d.msec, 0);
|
90
|
+
{
|
91
|
+
cybozu::Time t;
|
92
|
+
t.fromString(std::string(d.str));
|
93
|
+
CYBOZU_TEST_EQUAL(t.getTime(), time);
|
94
|
+
}
|
95
|
+
cybozu::Time tm(d.str);
|
96
|
+
CYBOZU_TEST_EQUAL(tm.getTime(), time);
|
97
|
+
CYBOZU_TEST_EQUAL(tm.getMsec(), d.msec);
|
98
|
+
uint32_t high, low;
|
99
|
+
tm.getFILETIME(low, high);
|
100
|
+
cybozu::Time tm2;
|
101
|
+
tm2.setByFILETIME(low, high);
|
102
|
+
CYBOZU_TEST_EQUAL(tm, tm2);
|
103
|
+
}
|
104
|
+
bool b;
|
105
|
+
cybozu::Time t;
|
106
|
+
t.fromString(&b, "2009-01-23T02:53:44Z");
|
107
|
+
CYBOZU_TEST_ASSERT(b);
|
108
|
+
t.fromString(&b, "2009-01-23T02:53:44x");
|
109
|
+
CYBOZU_TEST_ASSERT(!b);
|
110
|
+
}
|
111
|
+
|
112
|
+
CYBOZU_TEST_AUTO(toString)
|
113
|
+
{
|
114
|
+
const struct Data {
|
115
|
+
const char *str;
|
116
|
+
const char *strMsec;
|
117
|
+
int year;
|
118
|
+
int month;
|
119
|
+
int day;
|
120
|
+
int hour;
|
121
|
+
int minute;
|
122
|
+
int second;
|
123
|
+
int msec;
|
124
|
+
} tbl[] = {
|
125
|
+
{ "2013-11-05 12:23:56", ".123", 2013, 11, 5, 12, 23, 56, 123 },
|
126
|
+
{ "1970-01-01 00:00:00", ".000", 1970, 1, 1, 0, 0, 0, 0 },
|
127
|
+
{ "2040-02-05 12:30:20", ".999", 2040, 2, 5, 12, 30, 20, 999 },
|
128
|
+
};
|
129
|
+
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
|
130
|
+
const Data& d = tbl[i];
|
131
|
+
std::time_t time;
|
132
|
+
timeToStr(time, d.year, d.month, d.day, d.hour, d.minute, d.second, d.msec, 0);
|
133
|
+
cybozu::Time tm(time, d.msec);
|
134
|
+
std::string s;
|
135
|
+
tm.toString(s);
|
136
|
+
CYBOZU_TEST_EQUAL(s, std::string(tbl[i].str) + tbl[i].strMsec);
|
137
|
+
tm.toString(s, false);
|
138
|
+
CYBOZU_TEST_EQUAL(s, tbl[i].str);
|
139
|
+
}
|
140
|
+
}
|
141
|
+
#ifdef _WIN32
|
142
|
+
#include <sstream>
|
143
|
+
|
144
|
+
CYBOZU_TEST_AUTO(filetime_win)
|
145
|
+
{
|
146
|
+
SYSTEMTIME st;
|
147
|
+
GetSystemTime(&st);
|
148
|
+
// 2009-01-23 02:53:44.078
|
149
|
+
char buf[256];
|
150
|
+
CYBOZU_SNPRINTF(buf, sizeof(buf) - 1, "%04d-%02d-%02d %02d:%02d:%02d.%03d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
|
151
|
+
std::string t1 = buf;
|
152
|
+
|
153
|
+
FILETIME ft;
|
154
|
+
SystemTimeToFileTime(&st, &ft);
|
155
|
+
cybozu::Time time;
|
156
|
+
time.setByFILETIME(ft.dwLowDateTime, ft.dwHighDateTime);
|
157
|
+
std::string t2 = time.toString();
|
158
|
+
CYBOZU_TEST_EQUAL(t1, t2);
|
159
|
+
FILETIME ft2;
|
160
|
+
time.getFILETIME(ft2.dwLowDateTime, ft2.dwHighDateTime);
|
161
|
+
CYBOZU_TEST_EQUAL(ft.dwLowDateTime, ft2.dwLowDateTime);
|
162
|
+
CYBOZU_TEST_EQUAL(ft.dwHighDateTime, ft2.dwHighDateTime);
|
163
|
+
}
|
164
|
+
#endif
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <cybozu/thread.hpp>
|
3
|
+
#include <cybozu/tls.hpp>
|
4
|
+
#include <cybozu/test.hpp>
|
5
|
+
|
6
|
+
static CYBOZU_TLS int s_x;
|
7
|
+
|
8
|
+
class Test : public cybozu::ThreadBase {
|
9
|
+
int a_;
|
10
|
+
cybozu::Tls *tls_;
|
11
|
+
public:
|
12
|
+
Test()
|
13
|
+
: a_(0)
|
14
|
+
, tls_(0)
|
15
|
+
{
|
16
|
+
}
|
17
|
+
void set(int a, cybozu::Tls& tls)
|
18
|
+
{
|
19
|
+
a_ = a;
|
20
|
+
tls_ = &tls;
|
21
|
+
}
|
22
|
+
void threadEntry()
|
23
|
+
{
|
24
|
+
printf("start %d\n", a_);
|
25
|
+
s_x = a_;
|
26
|
+
tls_->set(&a_);
|
27
|
+
cybozu::Sleep(500);
|
28
|
+
printf("tls=%d, s_x=%d, %p\n", *static_cast<const int*>(tls_->get()), s_x, &s_x);
|
29
|
+
CYBOZU_TEST_EQUAL(a_, s_x);
|
30
|
+
CYBOZU_TEST_EQUAL(a_, *static_cast<const int*>(tls_->get()));
|
31
|
+
}
|
32
|
+
};
|
33
|
+
|
34
|
+
CYBOZU_TEST_AUTO(tls)
|
35
|
+
{
|
36
|
+
cybozu::Tls tls;
|
37
|
+
{
|
38
|
+
const int n = 10;
|
39
|
+
Test t[n];
|
40
|
+
for (int i = 0; i < n; i++) {
|
41
|
+
t[i].set(i, tls);
|
42
|
+
}
|
43
|
+
for (int i = 0; i < n; i++) {
|
44
|
+
t[i].beginThread();
|
45
|
+
}
|
46
|
+
for (int i = 0; i < n; i++) {
|
47
|
+
t[i].joinThread();
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|