ooxml_crypt 0.1.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/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,358 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief bit vector
|
|
5
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
6
|
+
@license modified new BSD license
|
|
7
|
+
http://opensource.org/licenses/BSD-3-Clause
|
|
8
|
+
*/
|
|
9
|
+
#include <cybozu/exception.hpp>
|
|
10
|
+
#include <algorithm>
|
|
11
|
+
#include <vector>
|
|
12
|
+
#include <assert.h>
|
|
13
|
+
|
|
14
|
+
namespace cybozu {
|
|
15
|
+
|
|
16
|
+
template<class T>
|
|
17
|
+
size_t RoundupBit(size_t bitLen)
|
|
18
|
+
{
|
|
19
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
20
|
+
return (bitLen + unitBitSize - 1) / unitBitSize;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
template<class T>
|
|
24
|
+
T GetMaskBit(size_t bitLen)
|
|
25
|
+
{
|
|
26
|
+
assert(bitLen < sizeof(T) * 8);
|
|
27
|
+
return (T(1) << bitLen) - 1;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
template<class T>
|
|
31
|
+
void SetBlockBit(T *buf, size_t bitLen)
|
|
32
|
+
{
|
|
33
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
34
|
+
const size_t q = bitLen / unitBitSize;
|
|
35
|
+
const size_t r = bitLen % unitBitSize;
|
|
36
|
+
buf[q] |= T(1) << r;
|
|
37
|
+
}
|
|
38
|
+
template<class T>
|
|
39
|
+
void ResetBlockBit(T *buf, size_t bitLen)
|
|
40
|
+
{
|
|
41
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
42
|
+
const size_t q = bitLen / unitBitSize;
|
|
43
|
+
const size_t r = bitLen % unitBitSize;
|
|
44
|
+
buf[q] &= ~(T(1) << r);
|
|
45
|
+
}
|
|
46
|
+
template<class T>
|
|
47
|
+
bool GetBlockBit(const T *buf, size_t bitLen)
|
|
48
|
+
{
|
|
49
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
50
|
+
const size_t q = bitLen / unitBitSize;
|
|
51
|
+
const size_t r = bitLen % unitBitSize;
|
|
52
|
+
return (buf[q] & (T(1) << r)) != 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
template<class T>
|
|
56
|
+
void CopyBit(T* dst, const T* src, size_t bitLen)
|
|
57
|
+
{
|
|
58
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
59
|
+
const size_t q = bitLen / unitBitSize;
|
|
60
|
+
const size_t r = bitLen % unitBitSize;
|
|
61
|
+
for (size_t i = 0; i < q; i++) dst[i] = src[i];
|
|
62
|
+
if (r == 0) return;
|
|
63
|
+
dst[q] = src[q] & GetMaskBit<T>(r);
|
|
64
|
+
}
|
|
65
|
+
/*
|
|
66
|
+
dst[] = (src[] << shift) | ext
|
|
67
|
+
@param dst [out] dst[0..bitLen)
|
|
68
|
+
@param src [in] src[0..bitLen)
|
|
69
|
+
@param bitLen [in] length of src, dst
|
|
70
|
+
@param shift [in] 0 <= shift < unitBitSize
|
|
71
|
+
@param ext [in] or bit
|
|
72
|
+
*/
|
|
73
|
+
template<class T>
|
|
74
|
+
T ShiftLeftBit(T* dst, const T* src, size_t bitLen, size_t shift, T ext = 0)
|
|
75
|
+
{
|
|
76
|
+
if (bitLen == 0) return 0;
|
|
77
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
78
|
+
if (shift >= unitBitSize) {
|
|
79
|
+
throw cybozu::Exception("ShiftLeftBit:large shift") << shift;
|
|
80
|
+
}
|
|
81
|
+
const size_t n = RoundupBit<T>(bitLen); // n >= 1 because bitLen > 0
|
|
82
|
+
const size_t r = bitLen % unitBitSize;
|
|
83
|
+
const T mask = r > 0 ? GetMaskBit<T>(r) : T(-1);
|
|
84
|
+
if (shift == 0) {
|
|
85
|
+
if (n == 1) {
|
|
86
|
+
dst[0] = (src[0] & mask) | ext;
|
|
87
|
+
} else {
|
|
88
|
+
dst[n - 1] = src[n - 1] & mask;
|
|
89
|
+
for (size_t i = n - 2; i > 0; i--) {
|
|
90
|
+
dst[i] = src[i];
|
|
91
|
+
}
|
|
92
|
+
dst[0] = src[0] | ext;
|
|
93
|
+
}
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
const size_t revShift = unitBitSize - shift;
|
|
97
|
+
T prev = src[n - 1] & mask;
|
|
98
|
+
const T ret = prev >> revShift;
|
|
99
|
+
for (size_t i = n - 1; i > 0; i--) {
|
|
100
|
+
T v = src[i - 1];
|
|
101
|
+
dst[i] = (prev << shift) | (v >> revShift);
|
|
102
|
+
prev = v;
|
|
103
|
+
}
|
|
104
|
+
dst[0] = (prev << shift) | ext;
|
|
105
|
+
return ret;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
namespace bitvector_local {
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
dst[] = src[] << shift
|
|
112
|
+
dst[0..shift) does not change
|
|
113
|
+
|
|
114
|
+
@param dst [out] dst[shift..bitLen + shift)
|
|
115
|
+
@param src [in] src[0..bitLen)
|
|
116
|
+
@param bitLen [in] read bit size
|
|
117
|
+
@param shift [in] 0 <= shift < unitBitSize
|
|
118
|
+
*/
|
|
119
|
+
template<class T>
|
|
120
|
+
void shiftLeftBit(T* dst, const T* src, size_t bitLen, size_t shift)
|
|
121
|
+
{
|
|
122
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
123
|
+
|
|
124
|
+
assert(bitLen);
|
|
125
|
+
assert(0 < shift && shift < unitBitSize);
|
|
126
|
+
|
|
127
|
+
const size_t dstN = RoundupBit<T>(bitLen + shift);
|
|
128
|
+
const size_t srcN = RoundupBit<T>(bitLen);
|
|
129
|
+
const size_t r = bitLen % unitBitSize;
|
|
130
|
+
const T mask = r ? GetMaskBit<T>(r) : T(-1);
|
|
131
|
+
const size_t revShift = unitBitSize - shift;
|
|
132
|
+
|
|
133
|
+
T prev = src[srcN - 1] & mask;
|
|
134
|
+
if (dstN > srcN) {
|
|
135
|
+
dst[dstN - 1] = prev >> revShift;
|
|
136
|
+
}
|
|
137
|
+
for (size_t i = srcN - 1; i > 0; i--) {
|
|
138
|
+
T v = src[i - 1];
|
|
139
|
+
dst[i] = (prev << shift) | (v >> revShift);
|
|
140
|
+
prev = v;
|
|
141
|
+
}
|
|
142
|
+
T ext = dst[0] & GetMaskBit<T>(shift);
|
|
143
|
+
dst[0] = (prev << shift) | ext;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/*
|
|
147
|
+
dst[] = src[] >> shift
|
|
148
|
+
|
|
149
|
+
@param dst [out] dst[0..bitLen)
|
|
150
|
+
@param src [in] src[shift..bitLen + shift)
|
|
151
|
+
@param bitLen [in] write bit size
|
|
152
|
+
@param shift [in] 0 <= shift < unitBitSize
|
|
153
|
+
@note src[bitLen + shift - 1] is accessable
|
|
154
|
+
*/
|
|
155
|
+
template<class T>
|
|
156
|
+
void shiftRightBit(T* dst, const T* src, size_t bitLen, size_t shift)
|
|
157
|
+
{
|
|
158
|
+
const size_t unitBitSize = sizeof(T) * 8;
|
|
159
|
+
|
|
160
|
+
assert(bitLen);
|
|
161
|
+
assert(0 < shift && shift < unitBitSize);
|
|
162
|
+
|
|
163
|
+
const size_t dstN = RoundupBit<T>(bitLen);
|
|
164
|
+
const size_t srcN = RoundupBit<T>(bitLen + shift);// srcN = dstN, dstN + 1
|
|
165
|
+
const size_t r = (bitLen + shift) % unitBitSize;
|
|
166
|
+
const T mask = r ? GetMaskBit<T>(r) : T(-1);
|
|
167
|
+
if (srcN == 1) {
|
|
168
|
+
dst[0] = (src[0] & mask) >> shift;
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const size_t revShift = unitBitSize - shift;
|
|
172
|
+
T prev = src[0];
|
|
173
|
+
for (size_t i = 0; i < srcN - 2; i++) {
|
|
174
|
+
T v = src[i + 1];
|
|
175
|
+
dst[i] = (prev >> shift) | (v << revShift);
|
|
176
|
+
prev = v;
|
|
177
|
+
}
|
|
178
|
+
// i = srcN - 1
|
|
179
|
+
T v = src[srcN - 1] & mask;
|
|
180
|
+
dst[srcN - 2] = (prev >> shift) | (v << revShift);
|
|
181
|
+
if (srcN == dstN) {
|
|
182
|
+
dst[srcN - 1] = v >> shift;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
} // cybozu::bitvector_local
|
|
187
|
+
|
|
188
|
+
template<class T>
|
|
189
|
+
class BitVectorT {
|
|
190
|
+
static const size_t unitBitSize = sizeof(T) * 8;
|
|
191
|
+
size_t bitLen_;
|
|
192
|
+
std::vector<T> v_;
|
|
193
|
+
public:
|
|
194
|
+
typedef T value_type;
|
|
195
|
+
BitVectorT() : bitLen_(0) {}
|
|
196
|
+
BitVectorT(const T *buf, size_t bitLen)
|
|
197
|
+
{
|
|
198
|
+
init(buf, bitLen);
|
|
199
|
+
}
|
|
200
|
+
void init(const T *buf, size_t bitLen)
|
|
201
|
+
{
|
|
202
|
+
resize(bitLen);
|
|
203
|
+
std::copy(buf, buf + v_.size(), &v_[0]);
|
|
204
|
+
}
|
|
205
|
+
void resize(size_t bitLen)
|
|
206
|
+
{
|
|
207
|
+
bitLen_ = bitLen;
|
|
208
|
+
const size_t n = RoundupBit<T>(bitLen);
|
|
209
|
+
const size_t r = bitLen % unitBitSize;
|
|
210
|
+
v_.resize(n);
|
|
211
|
+
if (r) {
|
|
212
|
+
v_[n - 1] &= GetMaskBit<T>(r);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
void reserve(size_t bitLen)
|
|
216
|
+
{
|
|
217
|
+
v_.reserve(RoundupBit<T>(bitLen));
|
|
218
|
+
}
|
|
219
|
+
bool get(size_t idx) const
|
|
220
|
+
{
|
|
221
|
+
if (idx >= bitLen_) throw cybozu::Exception("BitVectorT:get:bad idx") << idx;
|
|
222
|
+
return GetBlockBit(v_.data(), idx);
|
|
223
|
+
}
|
|
224
|
+
void clear()
|
|
225
|
+
{
|
|
226
|
+
bitLen_ = 0;
|
|
227
|
+
v_.clear();
|
|
228
|
+
}
|
|
229
|
+
void set(size_t idx, bool b)
|
|
230
|
+
{
|
|
231
|
+
if (b) {
|
|
232
|
+
set(idx);
|
|
233
|
+
} else {
|
|
234
|
+
reset(idx);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// set(idx, true);
|
|
238
|
+
void set(size_t idx)
|
|
239
|
+
{
|
|
240
|
+
if (idx >= bitLen_) throw cybozu::Exception("BitVectorT:set:bad idx") << idx;
|
|
241
|
+
SetBlockBit(v_.data(), idx);
|
|
242
|
+
}
|
|
243
|
+
// set(idx, false);
|
|
244
|
+
void reset(size_t idx)
|
|
245
|
+
{
|
|
246
|
+
if (idx >= bitLen_) throw cybozu::Exception("BitVectorT:reset:bad idx") << idx;
|
|
247
|
+
ResetBlockBit(v_.data(), idx);
|
|
248
|
+
}
|
|
249
|
+
size_t size() const { return bitLen_; }
|
|
250
|
+
const T *getBlock() const { return &v_[0]; }
|
|
251
|
+
T *getBlock() { return &v_[0]; }
|
|
252
|
+
size_t getBlockSize() const { return v_.size(); }
|
|
253
|
+
/*
|
|
254
|
+
append src[0, bitLen)
|
|
255
|
+
*/
|
|
256
|
+
void append(const T* src, size_t bitLen)
|
|
257
|
+
{
|
|
258
|
+
if (bitLen == 0) return;
|
|
259
|
+
const size_t q = bitLen_ / unitBitSize;
|
|
260
|
+
const size_t r = bitLen_ % unitBitSize;
|
|
261
|
+
resize(bitLen_ + bitLen);
|
|
262
|
+
if (r == 0) {
|
|
263
|
+
CopyBit<T>(&v_[q], src, bitLen);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
bitvector_local::shiftLeftBit<T>(&v_[q], src, bitLen, r);
|
|
267
|
+
}
|
|
268
|
+
/*
|
|
269
|
+
append src & mask(bitLen)
|
|
270
|
+
*/
|
|
271
|
+
void append(uint64_t src, size_t bitLen)
|
|
272
|
+
{
|
|
273
|
+
if (bitLen == 0) return;
|
|
274
|
+
if (bitLen > unitBitSize) {
|
|
275
|
+
throw cybozu::Exception("BitVectorT:append:bad bitLen") << bitLen;
|
|
276
|
+
}
|
|
277
|
+
if (bitLen < unitBitSize) {
|
|
278
|
+
src &= GetMaskBit<T>(bitLen);
|
|
279
|
+
}
|
|
280
|
+
const size_t q = bitLen_ / unitBitSize;
|
|
281
|
+
const size_t r = bitLen_ % unitBitSize;
|
|
282
|
+
resize(bitLen_ + bitLen);
|
|
283
|
+
if (r == 0) {
|
|
284
|
+
v_[q] = T(src);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
v_[q] |= T(src << r);
|
|
288
|
+
if (r + bitLen > unitBitSize) {
|
|
289
|
+
v_[q + 1] = T(src >> (unitBitSize - r));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/*
|
|
293
|
+
append bitVector
|
|
294
|
+
*/
|
|
295
|
+
void append(const BitVectorT<T>& v)
|
|
296
|
+
{
|
|
297
|
+
append(v.getBlock(), v.size());
|
|
298
|
+
}
|
|
299
|
+
/*
|
|
300
|
+
dst[0, bitLen) = vec[pos, pos + bitLen)
|
|
301
|
+
*/
|
|
302
|
+
void extract(T* dst, size_t pos, size_t bitLen) const
|
|
303
|
+
{
|
|
304
|
+
if (bitLen == 0) return;
|
|
305
|
+
if (pos + bitLen > bitLen_) {
|
|
306
|
+
throw cybozu::Exception("BitVectorT:extract:bad range") << bitLen << pos << bitLen_;
|
|
307
|
+
}
|
|
308
|
+
const size_t q = pos / unitBitSize;
|
|
309
|
+
const size_t r = pos % unitBitSize;
|
|
310
|
+
if (r == 0) {
|
|
311
|
+
CopyBit<T>(dst, &v_[q], bitLen);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
bitvector_local::shiftRightBit<T>(dst, &v_[q], bitLen, r);
|
|
315
|
+
}
|
|
316
|
+
/*
|
|
317
|
+
dst = vec[pos, pos + bitLen)
|
|
318
|
+
*/
|
|
319
|
+
void extract(BitVectorT<T>& dst, size_t pos, size_t bitLen) const
|
|
320
|
+
{
|
|
321
|
+
dst.resize(bitLen);
|
|
322
|
+
extract(dst.getBlock(), pos, bitLen);
|
|
323
|
+
}
|
|
324
|
+
/*
|
|
325
|
+
return vec[pos, pos + bitLen)
|
|
326
|
+
*/
|
|
327
|
+
T extract(size_t pos, size_t bitLen) const
|
|
328
|
+
{
|
|
329
|
+
if (bitLen == 0) return 0;
|
|
330
|
+
if (bitLen > unitBitSize || pos + bitLen > bitLen_) {
|
|
331
|
+
throw cybozu::Exception("BitVectorT:extract:bad range") << bitLen << pos << bitLen_;
|
|
332
|
+
}
|
|
333
|
+
const size_t q = pos / unitBitSize;
|
|
334
|
+
const size_t r = pos % unitBitSize;
|
|
335
|
+
T v;
|
|
336
|
+
if (r == 0) {
|
|
337
|
+
v = v_[q];
|
|
338
|
+
} else if (q == v_.size() - 1) {
|
|
339
|
+
v = v_[q] >> r;
|
|
340
|
+
} else {
|
|
341
|
+
v = (v_[q] >> r) | v_[q + 1] << (unitBitSize - r);
|
|
342
|
+
}
|
|
343
|
+
if (bitLen < unitBitSize) {
|
|
344
|
+
v &= GetMaskBit<T>(bitLen);
|
|
345
|
+
}
|
|
346
|
+
return v;
|
|
347
|
+
}
|
|
348
|
+
bool operator==(const BitVectorT<T>& rhs) const { return v_ == rhs.v_; }
|
|
349
|
+
bool operator!=(const BitVectorT<T>& rhs) const { return v_ != rhs.v_; }
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
#if (CYBOZU_OS_BIT == 32)
|
|
353
|
+
typedef BitVectorT<uint32_t> BitVector;
|
|
354
|
+
#else
|
|
355
|
+
typedef BitVectorT<uint64_t> BitVector;
|
|
356
|
+
#endif
|
|
357
|
+
|
|
358
|
+
} // cybozu
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief conditional variable
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
@note http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
|
|
8
|
+
*/
|
|
9
|
+
#include <cybozu/mutex.hpp>
|
|
10
|
+
|
|
11
|
+
namespace cybozu {
|
|
12
|
+
|
|
13
|
+
class ConditionVariable {
|
|
14
|
+
public:
|
|
15
|
+
ConditionVariable()
|
|
16
|
+
{
|
|
17
|
+
#ifdef _WIN32
|
|
18
|
+
waiterNum_ = 0;
|
|
19
|
+
wasBroadcast_ = false;
|
|
20
|
+
sema_ = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
|
|
21
|
+
InitializeCriticalSection(&waiterNumLock_);
|
|
22
|
+
waiterDone_ = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
23
|
+
#else
|
|
24
|
+
pthread_cond_init(&cv_, NULL);
|
|
25
|
+
#endif
|
|
26
|
+
}
|
|
27
|
+
~ConditionVariable()
|
|
28
|
+
{
|
|
29
|
+
#ifdef _WIN32
|
|
30
|
+
CloseHandle(waiterDone_);
|
|
31
|
+
DeleteCriticalSection(&waiterNumLock_);
|
|
32
|
+
CloseHandle(sema_);
|
|
33
|
+
#else
|
|
34
|
+
pthread_cond_destroy(&cv_);
|
|
35
|
+
#endif
|
|
36
|
+
}
|
|
37
|
+
void wait(cybozu::Mutex& mutex)
|
|
38
|
+
{
|
|
39
|
+
#ifdef _WIN32
|
|
40
|
+
EnterCriticalSection(&waiterNumLock_);
|
|
41
|
+
waiterNum_++;
|
|
42
|
+
LeaveCriticalSection(&waiterNumLock_);
|
|
43
|
+
|
|
44
|
+
SignalObjectAndWait(mutex.hdl_, sema_, INFINITE, FALSE);
|
|
45
|
+
EnterCriticalSection(&waiterNumLock_);
|
|
46
|
+
|
|
47
|
+
waiterNum_--;
|
|
48
|
+
int last_waiter = wasBroadcast_ && waiterNum_ == 0;
|
|
49
|
+
|
|
50
|
+
LeaveCriticalSection (&waiterNumLock_);
|
|
51
|
+
if (last_waiter) {
|
|
52
|
+
SignalObjectAndWait(waiterDone_, mutex.hdl_, INFINITE, FALSE);
|
|
53
|
+
} else {
|
|
54
|
+
WaitForSingleObject(mutex.hdl_, INFINITE);
|
|
55
|
+
}
|
|
56
|
+
#else
|
|
57
|
+
pthread_cond_wait(&cv_, &mutex.hdl_);
|
|
58
|
+
#endif
|
|
59
|
+
}
|
|
60
|
+
void notifyOne()
|
|
61
|
+
{
|
|
62
|
+
#ifdef _WIN32
|
|
63
|
+
EnterCriticalSection(&waiterNumLock_);
|
|
64
|
+
bool have_waiters = waiterNum_ > 0;
|
|
65
|
+
LeaveCriticalSection (&waiterNumLock_);
|
|
66
|
+
|
|
67
|
+
if (have_waiters) {
|
|
68
|
+
ReleaseSemaphore (sema_, 1, 0);
|
|
69
|
+
}
|
|
70
|
+
#else
|
|
71
|
+
pthread_cond_signal(&cv_);
|
|
72
|
+
#endif
|
|
73
|
+
}
|
|
74
|
+
void notifyAll()
|
|
75
|
+
{
|
|
76
|
+
#ifdef _WIN32
|
|
77
|
+
EnterCriticalSection(&waiterNumLock_);
|
|
78
|
+
bool have_waiters = false;
|
|
79
|
+
|
|
80
|
+
if (waiterNum_ > 0) {
|
|
81
|
+
wasBroadcast_ = true;
|
|
82
|
+
have_waiters = true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (have_waiters) {
|
|
86
|
+
ReleaseSemaphore (sema_, waiterNum_, 0);
|
|
87
|
+
|
|
88
|
+
LeaveCriticalSection(&waiterNumLock_);
|
|
89
|
+
|
|
90
|
+
WaitForSingleObject(waiterDone_, INFINITE);
|
|
91
|
+
wasBroadcast_ = false;
|
|
92
|
+
} else {
|
|
93
|
+
LeaveCriticalSection(&waiterNumLock_);
|
|
94
|
+
}
|
|
95
|
+
#else
|
|
96
|
+
pthread_cond_broadcast(&cv_);
|
|
97
|
+
#endif
|
|
98
|
+
}
|
|
99
|
+
private:
|
|
100
|
+
ConditionVariable(const ConditionVariable&);
|
|
101
|
+
ConditionVariable& operator=(const ConditionVariable&);
|
|
102
|
+
#ifdef _WIN32
|
|
103
|
+
int waiterNum_;
|
|
104
|
+
CRITICAL_SECTION waiterNumLock_;
|
|
105
|
+
HANDLE sema_;
|
|
106
|
+
HANDLE waiterDone_;
|
|
107
|
+
bool wasBroadcast_;
|
|
108
|
+
#else
|
|
109
|
+
pthread_cond_t cv_;
|
|
110
|
+
#endif
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
} // cybozu
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief condition variable cs(for Windows Vista or later)
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
@note wrapper for condition variable for Windows Vista or lator
|
|
8
|
+
cybozu::CriticalSection is same as cybozu::Mutex on Linux
|
|
9
|
+
*/
|
|
10
|
+
#include <cybozu/critical_section.hpp>
|
|
11
|
+
|
|
12
|
+
#if defined(_WIN32) && (_WIN32_WINNT < 0x0600)
|
|
13
|
+
#error "not support Windows Xp or before"
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
namespace cybozu {
|
|
17
|
+
|
|
18
|
+
namespace thread {
|
|
19
|
+
#ifdef _WIN32
|
|
20
|
+
typedef CONDITION_VARIABLE CvCsHandle;
|
|
21
|
+
#else
|
|
22
|
+
typedef pthread_cond_t CvCsHandle;
|
|
23
|
+
#endif
|
|
24
|
+
} // thread
|
|
25
|
+
|
|
26
|
+
class ConditionVariableCs {
|
|
27
|
+
public:
|
|
28
|
+
ConditionVariableCs()
|
|
29
|
+
{
|
|
30
|
+
#ifdef _WIN32
|
|
31
|
+
InitializeConditionVariable(&hdl_);
|
|
32
|
+
#else
|
|
33
|
+
pthread_cond_init(&hdl_, NULL);
|
|
34
|
+
#endif
|
|
35
|
+
}
|
|
36
|
+
~ConditionVariableCs()
|
|
37
|
+
{
|
|
38
|
+
#ifdef _WIN32
|
|
39
|
+
// none
|
|
40
|
+
#else
|
|
41
|
+
pthread_cond_destroy(&hdl_);
|
|
42
|
+
#endif
|
|
43
|
+
}
|
|
44
|
+
void wait(cybozu::CriticalSection& cs)
|
|
45
|
+
{
|
|
46
|
+
#ifdef _WIN32
|
|
47
|
+
SleepConditionVariableCS(&hdl_, &cs.hdl_, INFINITE);
|
|
48
|
+
#else
|
|
49
|
+
pthread_cond_wait(&hdl_, &cs.hdl_);
|
|
50
|
+
#endif
|
|
51
|
+
}
|
|
52
|
+
void notifyOne()
|
|
53
|
+
{
|
|
54
|
+
#ifdef _WIN32
|
|
55
|
+
WakeConditionVariable(&hdl_);
|
|
56
|
+
#else
|
|
57
|
+
pthread_cond_signal(&hdl_);
|
|
58
|
+
#endif
|
|
59
|
+
}
|
|
60
|
+
void notifyAll()
|
|
61
|
+
{
|
|
62
|
+
#ifdef _WIN32
|
|
63
|
+
WakeAllConditionVariable(&hdl_);
|
|
64
|
+
#else
|
|
65
|
+
pthread_cond_broadcast(&hdl_);
|
|
66
|
+
#endif
|
|
67
|
+
}
|
|
68
|
+
private:
|
|
69
|
+
ConditionVariableCs(const ConditionVariableCs&);
|
|
70
|
+
ConditionVariableCs& operator=(const ConditionVariableCs&);
|
|
71
|
+
thread::CvCsHandle hdl_;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
} // cybozu
|