compact_enc_det 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/ext/compact_enc_det/compact_enc_det/CMakeLists.txt +103 -0
- data/ext/compact_enc_det/compact_enc_det/LICENSE +202 -0
- data/ext/compact_enc_det/compact_enc_det/README.md +46 -0
- data/ext/compact_enc_det/compact_enc_det/autogen.sh +74 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det.cc +5719 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det.h +83 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det_fuzz_test.cc +54 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det_generated_tables.h +6326 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det_generated_tables2.h +856 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det_hint_code.cc +169 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det_hint_code.h +45 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/compact_enc_det_unittest.cc +5260 -0
- data/ext/compact_enc_det/compact_enc_det/compact_enc_det/detail_head_string.inc +152 -0
- data/ext/compact_enc_det/compact_enc_det/util/basictypes.h +331 -0
- data/ext/compact_enc_det/compact_enc_det/util/case_insensitive_hash.h +88 -0
- data/ext/compact_enc_det/compact_enc_det/util/commandlineflags.h +39 -0
- data/ext/compact_enc_det/compact_enc_det/util/encodings/encodings.cc +891 -0
- data/ext/compact_enc_det/compact_enc_det/util/encodings/encodings.h +299 -0
- data/ext/compact_enc_det/compact_enc_det/util/encodings/encodings.pb.h +181 -0
- data/ext/compact_enc_det/compact_enc_det/util/encodings/encodings_unittest.cc +34 -0
- data/ext/compact_enc_det/compact_enc_det/util/languages/languages.cc +349 -0
- data/ext/compact_enc_det/compact_enc_det/util/languages/languages.h +381 -0
- data/ext/compact_enc_det/compact_enc_det/util/languages/languages.pb.h +191 -0
- data/ext/compact_enc_det/compact_enc_det/util/logging.h +25 -0
- data/ext/compact_enc_det/compact_enc_det/util/port.h +53 -0
- data/ext/compact_enc_det/compact_enc_det/util/string_util.h +61 -0
- data/ext/compact_enc_det/compact_enc_det/util/varsetter.h +66 -0
- data/ext/compact_enc_det/compact_enc_det.cc +100 -0
- data/ext/compact_enc_det/extconf.rb +20 -0
- data/lib/compact_enc_det/version.rb +3 -0
- data/lib/compact_enc_det.rb +2 -0
- metadata +106 -0
@@ -0,0 +1,152 @@
|
|
1
|
+
// Copyright 2016 Google Inc.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
//
|
15
|
+
////////////////////////////////////////////////////////////////////////////////
|
16
|
+
// Produced by stringify.cc on 2007-09-28 09:13 from file i18n/encodings/compact_enc_det/tools/detail_head.ps
|
17
|
+
"%!PS-Adobe-2.0\n\n/inch {72 mul} def\n/cshow {dup stringwidth pop -2 div"
|
18
|
+
" 0 rmoveto show} def\n\n/lmargin 0.5 inch def\n/rmargin 8.5 inch def\n/t"
|
19
|
+
"margin 10.5 inch def\n/bmargin 0.5 inch def\n\n\n% set to N>=0 to track "
|
20
|
+
"ranked encoding N\n/track-me -1 def\n/track-me2 -1 def\n\n/columns 2 def"
|
21
|
+
"\n\n/lpi 18 def % lines per inch\n/lpc lpi 10 mul def "
|
22
|
+
" % lines per column\n/lpp lpc columns mul def % lines per page\n"
|
23
|
+
"/probw 3.0 inch def % probability width\n/probr 50 def "
|
24
|
+
" % probability range\n/widowlines lpi 2 idiv def % 1/2 inch widow a"
|
25
|
+
"t bottom\n/widowlines lpi def % 1 inch widow at bottom\n\n/lpg l"
|
26
|
+
"pi 2 idiv def % 1/2 inch spacing between groups\n\n/delc 4 inch "
|
27
|
+
"def\n/dell -1 inch lpi div def\n\n/next-line 0 def % 24 lines per i"
|
28
|
+
"nch, 240 per column\n\n/Cfont /Courier findfont 6 scalefont def\n/Hfont "
|
29
|
+
"/Helvetica findfont 6 scalefont def\nHfont setfont\n\n\n% simple string "
|
30
|
+
"hash -- sum the characters\n/strhash {\n /hstr exch def\n /h 0 def\n "
|
31
|
+
"0 1 hstr length 1 sub {/i exch def /h h hstr i get add def} for\n h\n}"
|
32
|
+
" def\n\n% convert pro at 30 per 2x to 0-2.5 inches spanning -50 to 0\n/p"
|
33
|
+
"rob2x {\n 30 idiv probr div probw mul neg probw add\n}def\n\n\n/cliptoc"
|
34
|
+
"olumn {\n % ====== MUST MATCH ME ======\n gsave\n lmargin tmargin mov"
|
35
|
+
"eto\n next-line lpc idiv delc mul 0 rmoveto\n -1 18 rmoveto 0 -10.5 in"
|
36
|
+
"ch rlineto delc 2 add 0 rlineto 0 10.5 inch rlineto closepath\n clip\n"
|
37
|
+
" newpath\n} def\n\n/endcliptocolumn {\n grestore\n % ====== MUST MATC"
|
38
|
+
"H ME ======\n} def\n\n\n\n/column-box {\n lmargin tmargin moveto\n nex"
|
39
|
+
"t-line 1 sub lpc idiv delc mul next-line 1 sub lpc mod 1 add dell mul r"
|
40
|
+
"moveto\n % box\n gsave -1.5 0 rmoveto 0 detail-count dell mul neg rmov"
|
41
|
+
"eto probw 3 add 0 rlineto 0.25 setlinewidth stroke grestore\n gsave -1"
|
42
|
+
".5 0 rmoveto 0 detail-count dell mul neg rlineto 0.25 setlinewidth strok"
|
43
|
+
"e grestore\n gsave probw .8 mul 0 rmoveto 0 detail-count dell mul neg r"
|
44
|
+
"lineto 0.25 setlinewidth 0.8 setgray stroke grestore\n gsave probw .6 m"
|
45
|
+
"ul 0 rmoveto 0 detail-count dell mul neg rlineto 0.25 setlinewidth 0.8 s"
|
46
|
+
"etgray stroke grestore\n gsave probw .4 mul 0 rmoveto 0 detail-count de"
|
47
|
+
"ll mul neg rlineto 0.25 setlinewidth 0.8 setgray stroke grestore\n gsav"
|
48
|
+
"e probw .2 mul 0 rmoveto 0 detail-count dell mul neg rlineto 0.25 setlin"
|
49
|
+
"ewidth 0.8 setgray stroke grestore\n gsave probw 1.5 add 0 rmoveto 0 de"
|
50
|
+
"tail-count dell mul neg rlineto 0.25 setlinewidth stroke grestore\n} def"
|
51
|
+
"\n\n\n/IncrementLine {\n /incr exch def\n /next-line next-line incr ad"
|
52
|
+
"d def\n next-line lpc ge next-line incr sub lpc lt and {\n % We "
|
53
|
+
"just went to the top of column 2; redo clip\n endcliptocolumn % M"
|
54
|
+
"UST match\n column-box\n /next-line lpc def\n cliptocolumn "
|
55
|
+
" % MUST match\n } if\n next-line lpp ge {\n % We just went to the"
|
56
|
+
" top of column 3; start new page column 1\n endcliptocolumn % MUS"
|
57
|
+
"T match\n column-box\n showpage\n Hfont setfont\n /next-line"
|
58
|
+
" 0 def\n show-pageno\n cliptocolumn % MUST match\n } if\n}"
|
59
|
+
" def\n\n/IncrementLineOutside {\n /incr exch def\n /next-line next-lin"
|
60
|
+
"e incr add def\n next-line lpc ge next-line incr sub lpc lt and {\n"
|
61
|
+
" % We just went to the top of column 2\n /next-line lpc def\n } i"
|
62
|
+
"f\n next-line lpp ge {\n % We just went to the top of column 3; star"
|
63
|
+
"t new page column 1\n showpage\n Hfont setfont\n /next-line 0 d"
|
64
|
+
"ef\n show-pageno\n } if\n} def\n\n/NextColumn {\n lpc 1 sub Increme"
|
65
|
+
"ntLine\n} def\n\n/NextPage {\n lpp 1 sub IncrementLine\n} def\n\n% Up"
|
66
|
+
"on entry, we are OUTSIDE the clip\n/start-detail {\n /d-title exch def\n"
|
67
|
+
"\n % align >= 1 inch at bottom of column, and/or start new column\n lp"
|
68
|
+
"c next-line lpc mod sub widowlines lt {\n % Start at top of a column\n"
|
69
|
+
" next-line lpc ge {\n % Start new page\n showpage\n Hf"
|
70
|
+
"ont setfont\n /next-line 0 def\n show-pageno\n } {\n %"
|
71
|
+
" Start new column\n /next-line lpc def\n } ifelse\n } if\n\n l"
|
72
|
+
"margin tmargin moveto\n next-line lpc idiv delc mul next-line lpc mod "
|
73
|
+
"dell mul rmoveto\n gsave d-title show grestore\n 0 dell rmoveto\n 1 1"
|
74
|
+
" 4 {/j exch def gsave probw j mul 5 div -2 rmoveto 50 j 10 mul sub 20 st"
|
75
|
+
"ring cvs cshow grestore} for\n 2 IncrementLineOutside\n /detail-count "
|
76
|
+
"1 def\n cliptocolumn % MUST match\n /d-array [] def\n} def\n"
|
77
|
+
"\n/size-detail {\n /d-names exch def\n /d-size exch def\n % zero sums"
|
78
|
+
"\n /sums d-size array def\n 0 1 d-size 1 sub {/i exch def sums i 0 pu"
|
79
|
+
"t} for\n /old-d-max 0 def\n /colors d-size array def\n 0 1 d-size 1 s"
|
80
|
+
"ub {/i exch def colors i i 3 mul 17 mod 17 div put} for\n %0 1 d-size "
|
81
|
+
"1 sub {/i exch def colors i d-names i get strhash 3 mul 17 mod 17 div p"
|
82
|
+
"ut} for\n %0 1 d-size 1 sub {/i exch def ( ) show colors i get 20 stri"
|
83
|
+
"ng cvs show} for\n} def\n\n/count-detail {\n /detail-total-count exch d"
|
84
|
+
"ef\n % if total-count >= one column, start at top of a column\n detail"
|
85
|
+
"-total-count lpp ge {\n % Start new page\n NextPage\n } {\n de"
|
86
|
+
"tail-total-count lpc ge {\n % Start new column\n NextColumn\n "
|
87
|
+
" } if\n } ifelse\n} def\n\n% highlight next entry with underbar\n/do-"
|
88
|
+
"flag {\ngsave\n setrgbcolor\n lmargin tmargin moveto\n next-line lpc "
|
89
|
+
"idiv delc mul next-line lpc mod dell mul rmoveto\n 0 -2 rmoveto\n pro"
|
90
|
+
"bw 0 rlineto\n 0 dell neg rlineto\n probw neg 0 rlineto\n closepath\n"
|
91
|
+
" fill\ngrestore\n} def\n\n/do-detail-e {\n /d-array exch def\n /d-enc"
|
92
|
+
" exch def\n /d-label exch def\n /d-max -999999 def\n\n lmargin tmargi"
|
93
|
+
"n moveto\n next-line lpc idiv delc mul next-line lpc mod dell mul rmov"
|
94
|
+
"eto\n 0.25 setlinewidth\n\n % show label, using encoding color\n gsav"
|
95
|
+
"e\n probw 2 add -2 rmoveto\n detail-count 1 sub 2 mod 0.25 inch mu"
|
96
|
+
"l 0 rmoveto\n % ([) show detail-count 20 string cvs show (] ) show\n "
|
97
|
+
" d-enc 0 lt {\n 0 setgray\n }{\n colors d-enc get 1 .8 se"
|
98
|
+
"thsbcolor\n } ifelse\n d-label show\n grestore\n % For -prune- d"
|
99
|
+
"raw horizontal line\n d-label length 8 gt {d-label 4 get (p) 0 get eq d"
|
100
|
+
"-label 5 get (r) 0 get eq and {\n /prune-val d-label cvi def\n /ne"
|
101
|
+
"wx prune-val 30 mul prob2x def\n gsave newx 6 rmoveto 0 -12 rlineto 1"
|
102
|
+
".5 setlinewidth 0.8 setgray stroke grestore\n gsave probw 0 add 0 rli"
|
103
|
+
"neto 0.25 setlinewidth 0.8 setgray stroke grestore\n } if } if\n\n % t"
|
104
|
+
"rack max per new row\n 0 1 d-array length 1 sub {\n /i exch def\n "
|
105
|
+
" /sum sums i get d-array i get add def\n d-max sum lt {/d-max sum def"
|
106
|
+
"} if\n } for\n\n % draw line increments\n 0 1 d-array length 1 sub {\n"
|
107
|
+
" /i exch def\n detail-count 1 gt {\n /oldx old-d-max sums i g"
|
108
|
+
"et sub prob2x def\n } {\n /oldx 600 prob2x def\n } ifelse\n "
|
109
|
+
" /oldy dell neg def\n /newx d-max sums i get d-array i get add sub"
|
110
|
+
" prob2x def\n /newy 0 def\n gsave\n oldx oldy rmoveto\n newx"
|
111
|
+
" oldx sub newy oldy sub rlineto\n % if encoding is being tracked, ma"
|
112
|
+
"ke bold line\n i track-me eq\n {2 setlinewidth}\n {i track-"
|
113
|
+
"me2 eq {1.25 setlinewidth} {0.25 setlinewidth} ifelse}\n ifelse\n "
|
114
|
+
" colors i get 1 .8 sethsbcolor stroke\n grestore\n } for\n /detail"
|
115
|
+
"-count detail-count 1 add def\n\n % increment running total in sums, tr"
|
116
|
+
"ack max per row\n 0 1 d-array length 1 sub {\n /i exch def\n sums"
|
117
|
+
" i sums i get d-array i get add put\n } for\n /old-d-max d-max def\n"
|
118
|
+
"\n 1 IncrementLine\n} def\n\n\n/do-detail {\n /d-array exch def\n /d-"
|
119
|
+
"label exch def\n d-label -1 d-array do-detail-e\n} def\n\n% Upon exit, "
|
120
|
+
"we are outside the clip\n/end-detail {\n pop\n endcliptocolumn "
|
121
|
+
" % MUST match\n column-box\n\n % text labels\n 0 1 d-array length 1 s"
|
122
|
+
"ub {\n /i exch def\n gsave\n /newx old-d-max sums i get sub pro"
|
123
|
+
"b2x def\n newx 0 ge {\n newx 0 rmoveto\n currentpoint trans"
|
124
|
+
"late\n colors i get 1 .8 sethsbcolor\n gsave 0 dell neg rline"
|
125
|
+
"to 0.25 setlinewidth stroke grestore\n -60 rotate\n 0 -2 movet"
|
126
|
+
"o d-names i get show\n } if\n grestore\n } for\n d-array length "
|
127
|
+
"0 gt {\n lpg IncrementLineOutside\n } {\n lpg 4 idiv IncrementLin"
|
128
|
+
"eOutside\n } ifelse\n} def\n\n/do-src {\n/src exch def\n lmargin tmarg"
|
129
|
+
"in moveto\n next-line lpc idiv delc mul next-line lpc mod dell mul rmo"
|
130
|
+
"veto\n Cfont setfont\n src show\n Hfont setfont\n 1 IncrementLine\n}"
|
131
|
+
" def\n\n% Underline trigram in source text\n/do-highlight1 {\n /hl-colo"
|
132
|
+
"r exch def\n /hl-offset exch def\n /hl-line exch 1 sub 2 mul def\n gs"
|
133
|
+
"ave\n lmargin tmargin moveto\n next-line hl-line sub lpc idiv delc mul"
|
134
|
+
"\n next-line hl-line sub lpc mod dell mul rmoveto\n % Assume text is 6"
|
135
|
+
" chars in and 3.6 pts per char, but 2 chars per offset\n hl-offset 2 mu"
|
136
|
+
"l 6 add 3.6 mul 4 rmoveto\n\n 0 setgray 0.5 setlinewidth\n hl-color 1"
|
137
|
+
" eq {0 0 1 setrgbcolor} if % Latin1 blue\n hl-color 2 eq {1 0 1 setrgb"
|
138
|
+
"color} if % Latin2 magenta\n hl-color 3 eq {1 0.67 0 setrgbcolor} if "
|
139
|
+
"% Latin7 orange\n 18 -2 rlineto stroke\n grestore\n} def\n\n% Box trig"
|
140
|
+
"ram in source text\n/do-highlight2 {\n /hl-color exch def\n /hl-offset"
|
141
|
+
" exch def\n /hl-line exch 1 sub 2 mul def\n gsave\n lmargin tmargin m"
|
142
|
+
"oveto\n next-line hl-line sub lpc idiv delc mul\n next-line hl-line su"
|
143
|
+
"b lpc mod dell mul rmoveto\n % Assume text is 6 chars in and 3.6 pts pe"
|
144
|
+
"r char, but 2 chars per offset\n hl-offset 2 mul 6 add 3.6 mul 4 rmove"
|
145
|
+
"to\n\n 0 setgray 0.25 setlinewidth\n hl-color 1 eq {0 0 1 setrgbcolor}"
|
146
|
+
" if % Latin1 blue\n hl-color 2 eq {1 0 1 setrgbcolor} if % Latin2 mag"
|
147
|
+
"enta\n hl-color 3 eq {1 0.67 0 setrgbcolor} if % Latin7 orange\n -0.5"
|
148
|
+
" -0.5 rmoveto\n 22 0 rlineto\n 0 4 rlineto\n -11 2 rlineto\n -11 -2 "
|
149
|
+
"rlineto\n closepath\n stroke\n grestore\n} def\n\n/show-pageno {\ngsa"
|
150
|
+
"ve\nlmargin bmargin moveto 0 -12 rmoveto\n(Page ) show pageno 20 string "
|
151
|
+
"cvs show\ngrestore\n/pageno pageno 1 add def\n} def\n\n/pageno 1 def\nsh"
|
152
|
+
"ow-pageno\n%=============================\n\n\n"
|
@@ -0,0 +1,331 @@
|
|
1
|
+
// Copyright 2016 Google Inc.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
//
|
15
|
+
////////////////////////////////////////////////////////////////////////////////
|
16
|
+
|
17
|
+
#ifndef UTIL_BASICTYPES_H_
|
18
|
+
#define UTIL_BASICTYPES_H_
|
19
|
+
|
20
|
+
#include <limits.h> // So we can set the bounds of our types
|
21
|
+
#include <stddef.h> // For size_t
|
22
|
+
#include <string.h> // for memcpy
|
23
|
+
|
24
|
+
#include "util/port.h" // Types that only need exist on certain systems
|
25
|
+
|
26
|
+
#ifndef COMPILER_MSVC
|
27
|
+
// stdint.h is part of C99 but MSVC doesn't have it.
|
28
|
+
#include <stdint.h> // For intptr_t.
|
29
|
+
#endif
|
30
|
+
|
31
|
+
typedef signed char schar;
|
32
|
+
typedef signed char int8;
|
33
|
+
typedef short int16;
|
34
|
+
// TODO(mbelshe) Remove these type guards. These are
|
35
|
+
// temporary to avoid conflicts with npapi.h.
|
36
|
+
#ifndef _INT32
|
37
|
+
#define _INT32
|
38
|
+
typedef int int32;
|
39
|
+
#endif
|
40
|
+
|
41
|
+
// The NSPR system headers define 64-bit as |long| when possible. In order to
|
42
|
+
// not have typedef mismatches, we do the same on LP64.
|
43
|
+
#if __LP64__
|
44
|
+
typedef long int64;
|
45
|
+
#else
|
46
|
+
typedef long long int64;
|
47
|
+
#endif
|
48
|
+
|
49
|
+
// NOTE: unsigned types are DANGEROUS in loops and other arithmetical
|
50
|
+
// places. Use the signed types unless your variable represents a bit
|
51
|
+
// pattern (eg a hash value) or you really need the extra bit. Do NOT
|
52
|
+
// use 'unsigned' to express "this value should always be positive";
|
53
|
+
// use assertions for this.
|
54
|
+
|
55
|
+
typedef unsigned char uint8;
|
56
|
+
typedef unsigned short uint16;
|
57
|
+
// TODO(mbelshe) Remove these type guards. These are
|
58
|
+
// temporary to avoid conflicts with npapi.h.
|
59
|
+
#ifndef _UINT32
|
60
|
+
#define _UINT32
|
61
|
+
typedef unsigned int uint32;
|
62
|
+
#endif
|
63
|
+
|
64
|
+
// See the comment above about NSPR and 64-bit.
|
65
|
+
#if __LP64__
|
66
|
+
typedef unsigned long uint64;
|
67
|
+
#else
|
68
|
+
typedef unsigned long long uint64;
|
69
|
+
#endif
|
70
|
+
|
71
|
+
// A type to represent a Unicode code-point value. As of Unicode 4.0,
|
72
|
+
// such values require up to 21 bits.
|
73
|
+
// (For type-checking on pointers, make this explicitly signed,
|
74
|
+
// and it should always be the signed version of whatever int32 is.)
|
75
|
+
typedef signed int char32;
|
76
|
+
|
77
|
+
const uint8 kuint8max = (( uint8) 0xFF);
|
78
|
+
const uint16 kuint16max = ((uint16) 0xFFFF);
|
79
|
+
const uint32 kuint32max = ((uint32) 0xFFFFFFFF);
|
80
|
+
const uint64 kuint64max = ((uint64) GG_LONGLONG(0xFFFFFFFFFFFFFFFF));
|
81
|
+
const int8 kint8min = (( int8) 0x80);
|
82
|
+
const int8 kint8max = (( int8) 0x7F);
|
83
|
+
const int16 kint16min = (( int16) 0x8000);
|
84
|
+
const int16 kint16max = (( int16) 0x7FFF);
|
85
|
+
const int32 kint32min = (( int32) 0x80000000);
|
86
|
+
const int32 kint32max = (( int32) 0x7FFFFFFF);
|
87
|
+
const int64 kint64min = (( int64) GG_LONGLONG(0x8000000000000000));
|
88
|
+
const int64 kint64max = (( int64) GG_LONGLONG(0x7FFFFFFFFFFFFFFF));
|
89
|
+
|
90
|
+
// A macro to disallow the copy constructor and operator= functions
|
91
|
+
// This should be used in the private: declarations for a class
|
92
|
+
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
93
|
+
TypeName(const TypeName&); \
|
94
|
+
void operator=(const TypeName&)
|
95
|
+
|
96
|
+
// An older, deprecated, politically incorrect name for the above.
|
97
|
+
#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) DISALLOW_COPY_AND_ASSIGN(TypeName)
|
98
|
+
|
99
|
+
// A macro to disallow all the implicit constructors, namely the
|
100
|
+
// default constructor, copy constructor and operator= functions.
|
101
|
+
//
|
102
|
+
// This should be used in the private: declarations for a class
|
103
|
+
// that wants to prevent anyone from instantiating it. This is
|
104
|
+
// especially useful for classes containing only static methods.
|
105
|
+
#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
|
106
|
+
TypeName(); \
|
107
|
+
DISALLOW_COPY_AND_ASSIGN(TypeName)
|
108
|
+
|
109
|
+
// The arraysize(arr) macro returns the # of elements in an array arr.
|
110
|
+
// The expression is a compile-time constant, and therefore can be
|
111
|
+
// used in defining new arrays, for example. If you use arraysize on
|
112
|
+
// a pointer by mistake, you will get a compile-time error.
|
113
|
+
|
114
|
+
// This template function declaration is used in defining arraysize.
|
115
|
+
// Note that the function doesn't need an implementation, as we only
|
116
|
+
// use its type.
|
117
|
+
template <typename T, size_t N>
|
118
|
+
char (&ArraySizeHelper(T (&array)[N]))[N];
|
119
|
+
|
120
|
+
// That gcc wants both of these prototypes seems mysterious. VC, for
|
121
|
+
// its part, can't decide which to use (another mystery). Matching of
|
122
|
+
// template overloads: the final frontier.
|
123
|
+
#ifndef _MSC_VER
|
124
|
+
template <typename T, size_t N>
|
125
|
+
char (&ArraySizeHelper(const T (&array)[N]))[N];
|
126
|
+
#endif
|
127
|
+
|
128
|
+
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
|
129
|
+
|
130
|
+
|
131
|
+
// Use implicit_cast as a safe version of static_cast or const_cast
|
132
|
+
// for upcasting in the type hierarchy (i.e. casting a pointer to Foo
|
133
|
+
// to a pointer to SuperclassOfFoo or casting a pointer to Foo to
|
134
|
+
// a const pointer to Foo).
|
135
|
+
// When you use implicit_cast, the compiler checks that the cast is safe.
|
136
|
+
// Such explicit implicit_casts are necessary in surprisingly many
|
137
|
+
// situations where C++ demands an exact type match instead of an
|
138
|
+
// argument type convertable to a target type.
|
139
|
+
//
|
140
|
+
// The From type can be inferred, so the preferred syntax for using
|
141
|
+
// implicit_cast is the same as for static_cast etc.:
|
142
|
+
//
|
143
|
+
// implicit_cast<ToType>(expr)
|
144
|
+
//
|
145
|
+
// implicit_cast would have been part of the C++ standard library,
|
146
|
+
// but the proposal was submitted too late. It will probably make
|
147
|
+
// its way into the language in the future.
|
148
|
+
template<typename To, typename From>
|
149
|
+
inline To implicit_cast(From const &f) {
|
150
|
+
return f;
|
151
|
+
}
|
152
|
+
|
153
|
+
// The COMPILE_ASSERT macro can be used to verify that a compile time
|
154
|
+
// expression is true. For example, you could use it to verify the
|
155
|
+
// size of a static array:
|
156
|
+
//
|
157
|
+
// COMPILE_ASSERT(arraysize(content_type_names) == CONTENT_NUM_TYPES,
|
158
|
+
// content_type_names_incorrect_size);
|
159
|
+
//
|
160
|
+
// or to make sure a struct is smaller than a certain size:
|
161
|
+
//
|
162
|
+
// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
|
163
|
+
//
|
164
|
+
// The second argument to the macro is the name of the variable. If
|
165
|
+
// the expression is false, most compilers will issue a warning/error
|
166
|
+
// containing the name of the variable.
|
167
|
+
|
168
|
+
template <bool>
|
169
|
+
struct CompileAssert {
|
170
|
+
};
|
171
|
+
|
172
|
+
#undef COMPILE_ASSERT
|
173
|
+
#define COMPILE_ASSERT(expr, msg) \
|
174
|
+
typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
|
175
|
+
|
176
|
+
// Implementation details of COMPILE_ASSERT:
|
177
|
+
//
|
178
|
+
// - COMPILE_ASSERT works by defining an array type that has -1
|
179
|
+
// elements (and thus is invalid) when the expression is false.
|
180
|
+
//
|
181
|
+
// - The simpler definition
|
182
|
+
//
|
183
|
+
// #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]
|
184
|
+
//
|
185
|
+
// does not work, as gcc supports variable-length arrays whose sizes
|
186
|
+
// are determined at run-time (this is gcc's extension and not part
|
187
|
+
// of the C++ standard). As a result, gcc fails to reject the
|
188
|
+
// following code with the simple definition:
|
189
|
+
//
|
190
|
+
// int foo;
|
191
|
+
// COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is
|
192
|
+
// // not a compile-time constant.
|
193
|
+
//
|
194
|
+
// - By using the type CompileAssert<(bool(expr))>, we ensures that
|
195
|
+
// expr is a compile-time constant. (Template arguments must be
|
196
|
+
// determined at compile-time.)
|
197
|
+
//
|
198
|
+
// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
|
199
|
+
// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
|
200
|
+
//
|
201
|
+
// CompileAssert<bool(expr)>
|
202
|
+
//
|
203
|
+
// instead, these compilers will refuse to compile
|
204
|
+
//
|
205
|
+
// COMPILE_ASSERT(5 > 0, some_message);
|
206
|
+
//
|
207
|
+
// (They seem to think the ">" in "5 > 0" marks the end of the
|
208
|
+
// template argument list.)
|
209
|
+
//
|
210
|
+
// - The array size is (bool(expr) ? 1 : -1), instead of simply
|
211
|
+
//
|
212
|
+
// ((expr) ? 1 : -1).
|
213
|
+
//
|
214
|
+
// This is to avoid running into a bug in MS VC 7.1, which
|
215
|
+
// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
|
216
|
+
|
217
|
+
|
218
|
+
// MetatagId refers to metatag-id that we assign to
|
219
|
+
// each metatag <name, value> pair..
|
220
|
+
typedef uint32 MetatagId;
|
221
|
+
|
222
|
+
// Argument type used in interfaces that can optionally take ownership
|
223
|
+
// of a passed in argument. If TAKE_OWNERSHIP is passed, the called
|
224
|
+
// object takes ownership of the argument. Otherwise it does not.
|
225
|
+
enum Ownership {
|
226
|
+
DO_NOT_TAKE_OWNERSHIP,
|
227
|
+
TAKE_OWNERSHIP
|
228
|
+
};
|
229
|
+
|
230
|
+
// bit_cast<Dest,Source> is a template function that implements the
|
231
|
+
// equivalent of "*reinterpret_cast<Dest*>(&source)". We need this in
|
232
|
+
// very low-level functions like the protobuf library and fast math
|
233
|
+
// support.
|
234
|
+
//
|
235
|
+
// float f = 3.14159265358979;
|
236
|
+
// int i = bit_cast<int32>(f);
|
237
|
+
// // i = 0x40490fdb
|
238
|
+
//
|
239
|
+
// The classical address-casting method is:
|
240
|
+
//
|
241
|
+
// // WRONG
|
242
|
+
// float f = 3.14159265358979; // WRONG
|
243
|
+
// int i = * reinterpret_cast<int*>(&f); // WRONG
|
244
|
+
//
|
245
|
+
// The address-casting method actually produces undefined behavior
|
246
|
+
// according to ISO C++ specification section 3.10 -15 -. Roughly, this
|
247
|
+
// section says: if an object in memory has one type, and a program
|
248
|
+
// accesses it with a different type, then the result is undefined
|
249
|
+
// behavior for most values of "different type".
|
250
|
+
//
|
251
|
+
// This is true for any cast syntax, either *(int*)&f or
|
252
|
+
// *reinterpret_cast<int*>(&f). And it is particularly true for
|
253
|
+
// conversions betweeen integral lvalues and floating-point lvalues.
|
254
|
+
//
|
255
|
+
// The purpose of 3.10 -15- is to allow optimizing compilers to assume
|
256
|
+
// that expressions with different types refer to different memory. gcc
|
257
|
+
// 4.0.1 has an optimizer that takes advantage of this. So a
|
258
|
+
// non-conforming program quietly produces wildly incorrect output.
|
259
|
+
//
|
260
|
+
// The problem is not the use of reinterpret_cast. The problem is type
|
261
|
+
// punning: holding an object in memory of one type and reading its bits
|
262
|
+
// back using a different type.
|
263
|
+
//
|
264
|
+
// The C++ standard is more subtle and complex than this, but that
|
265
|
+
// is the basic idea.
|
266
|
+
//
|
267
|
+
// Anyways ...
|
268
|
+
//
|
269
|
+
// bit_cast<> calls memcpy() which is blessed by the standard,
|
270
|
+
// especially by the example in section 3.9 . Also, of course,
|
271
|
+
// bit_cast<> wraps up the nasty logic in one place.
|
272
|
+
//
|
273
|
+
// Fortunately memcpy() is very fast. In optimized mode, with a
|
274
|
+
// constant size, gcc 2.95.3, gcc 4.0.1, and msvc 7.1 produce inline
|
275
|
+
// code with the minimal amount of data movement. On a 32-bit system,
|
276
|
+
// memcpy(d,s,4) compiles to one load and one store, and memcpy(d,s,8)
|
277
|
+
// compiles to two loads and two stores.
|
278
|
+
//
|
279
|
+
// I tested this code with gcc 2.95.3, gcc 4.0.1, icc 8.1, and msvc 7.1.
|
280
|
+
//
|
281
|
+
// WARNING: if Dest or Source is a non-POD type, the result of the memcpy
|
282
|
+
// is likely to surprise you.
|
283
|
+
|
284
|
+
template <class Dest, class Source>
|
285
|
+
inline Dest bit_cast(const Source& source) {
|
286
|
+
// Compile time assertion: sizeof(Dest) == sizeof(Source)
|
287
|
+
// A compile error here means your Dest and Source have different sizes.
|
288
|
+
// typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 : -1];
|
289
|
+
|
290
|
+
Dest dest;
|
291
|
+
memcpy(&dest, &source, sizeof(dest));
|
292
|
+
return dest;
|
293
|
+
}
|
294
|
+
|
295
|
+
// The following enum should be used only as a constructor argument to indicate
|
296
|
+
// that the variable has static storage class, and that the constructor should
|
297
|
+
// do nothing to its state. It indicates to the reader that it is legal to
|
298
|
+
// declare a static instance of the class, provided the constructor is given
|
299
|
+
// the base::LINKER_INITIALIZED argument. Normally, it is unsafe to declare a
|
300
|
+
// static variable that has a constructor or a destructor because invocation
|
301
|
+
// order is undefined. However, IF the type can be initialized by filling with
|
302
|
+
// zeroes (which the loader does for static variables), AND the destructor also
|
303
|
+
// does nothing to the storage, AND there are no virtual methods, then a
|
304
|
+
// constructor declared as
|
305
|
+
// explicit MyClass(base::LinkerInitialized x) {}
|
306
|
+
// and invoked as
|
307
|
+
// static MyClass my_variable_name(base::LINKER_INITIALIZED);
|
308
|
+
namespace base {
|
309
|
+
enum LinkerInitialized { LINKER_INITIALIZED };
|
310
|
+
} // base
|
311
|
+
|
312
|
+
// UnaligndLoad32 is put here instead of util/port.h to
|
313
|
+
// avoid the circular dependency between port.h and basictypes.h
|
314
|
+
// ARM does not support unaligned memory access.
|
315
|
+
#if defined(ARCH_CPU_X86_FAMILY)
|
316
|
+
// x86 and x86-64 can perform unaligned loads/stores directly;
|
317
|
+
inline uint32 UnalignedLoad32(const void* p) {
|
318
|
+
return *reinterpret_cast<const uint32*>(p);
|
319
|
+
}
|
320
|
+
#else
|
321
|
+
#define NEED_ALIGNED_LOADS
|
322
|
+
// If target architecture does not support unaligned loads and stores,
|
323
|
+
// use memcpy version of UNALIGNED_LOAD32.
|
324
|
+
inline uint32 UnalignedLoad32(const void* p) {
|
325
|
+
uint32 t;
|
326
|
+
memcpy(&t, reinterpret_cast<const uint8*>(p), sizeof(t));
|
327
|
+
return t;
|
328
|
+
}
|
329
|
+
|
330
|
+
#endif
|
331
|
+
#endif // UTIL_BASICTYPES_H_
|
@@ -0,0 +1,88 @@
|
|
1
|
+
// Copyright 2016 Google Inc.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
//
|
15
|
+
////////////////////////////////////////////////////////////////////////////////
|
16
|
+
|
17
|
+
#ifndef UTIL_CASE_INSENSITIVE_HASH_H_
|
18
|
+
#define UTIL_CASE_INSENSITIVE_HASH_H_
|
19
|
+
|
20
|
+
#include <ctype.h>
|
21
|
+
#include <stddef.h>
|
22
|
+
#ifndef _MSC_VER
|
23
|
+
#include <strings.h>
|
24
|
+
#endif
|
25
|
+
|
26
|
+
#include <string>
|
27
|
+
|
28
|
+
#include "util/basictypes.h"
|
29
|
+
#include "util/string_util.h"
|
30
|
+
|
31
|
+
// Functors for hashing c-strings with case-insensitive semantics.
|
32
|
+
struct CStringCaseHash {
|
33
|
+
size_t operator()(const char *str) const {
|
34
|
+
unsigned long hash_val = 0;
|
35
|
+
while (*str) {
|
36
|
+
hash_val = 5*hash_val + tolower(*str);
|
37
|
+
str++;
|
38
|
+
}
|
39
|
+
return (size_t)hash_val;
|
40
|
+
}
|
41
|
+
};
|
42
|
+
|
43
|
+
struct CStringCaseEqual {
|
44
|
+
bool operator()(const char *str1, const char *str2) const {
|
45
|
+
return !base::strcasecmp(str1, str2);
|
46
|
+
}
|
47
|
+
};
|
48
|
+
|
49
|
+
// These functors, in addition to being case-insensitive, ignore all
|
50
|
+
// non-alphanumeric characters. This is useful when we want all variants of
|
51
|
+
// a string -- where variants can differ in puncutation and whitespace -- to
|
52
|
+
// map to the same value.
|
53
|
+
struct CStringAlnumCaseHash {
|
54
|
+
size_t operator()(const char *str) const {
|
55
|
+
unsigned long hash_val = 0;
|
56
|
+
while (*str) {
|
57
|
+
if (isalnum(*str)) {
|
58
|
+
hash_val = 5*hash_val + tolower(*str);
|
59
|
+
}
|
60
|
+
str++;
|
61
|
+
}
|
62
|
+
return (size_t)hash_val;
|
63
|
+
}
|
64
|
+
};
|
65
|
+
|
66
|
+
struct CStringAlnumCaseEqual {
|
67
|
+
bool operator()(const char *str1, const char *str2) const {
|
68
|
+
while (true) {
|
69
|
+
// Skip until each pointer is pointing to an alphanumeric char or '\0'
|
70
|
+
while (!isalnum(*str1) && (*str1 != '\0')) {
|
71
|
+
str1++;
|
72
|
+
}
|
73
|
+
while (!isalnum(*str2) && (*str2 != '\0')) {
|
74
|
+
str2++;
|
75
|
+
}
|
76
|
+
if (tolower(*str1) != tolower(*str2)) {
|
77
|
+
return false; // mismatch on alphanumeric char or '\0'
|
78
|
+
}
|
79
|
+
if (*str1 == '\0') { // in which case *str2 must be '\0' as well
|
80
|
+
return true; // reached '\0' in both strings without mismatch
|
81
|
+
}
|
82
|
+
str1++;
|
83
|
+
str2++;
|
84
|
+
}
|
85
|
+
}
|
86
|
+
};
|
87
|
+
|
88
|
+
#endif // UTIL_CASE_INSENSITIVE_HASH_H_
|
@@ -0,0 +1,39 @@
|
|
1
|
+
// Copyright 2016 Google Inc.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
//
|
15
|
+
////////////////////////////////////////////////////////////////////////////////
|
16
|
+
|
17
|
+
#ifndef UTIL_COMMANDLINEFLAGS_H_
|
18
|
+
#define UTIL_COMMANDLINEFLAGS_H_
|
19
|
+
|
20
|
+
|
21
|
+
#undef DEFINE_bool
|
22
|
+
#define DEFINE_bool(name, default_value, comment) \
|
23
|
+
bool FLAGS_##name = default_value
|
24
|
+
#undef DEFINE_int32
|
25
|
+
#define DEFINE_int32(name, default_value, comment) \
|
26
|
+
int32 FLAGS_##name = default_value
|
27
|
+
#undef DEFINE_string
|
28
|
+
#define DEFINE_string(name, default_value, comment) \
|
29
|
+
string FLAGS_##name = default_value
|
30
|
+
|
31
|
+
#undef DECLARE_bool
|
32
|
+
#define DECLARE_bool(name) extern bool FLAGS_##name
|
33
|
+
#undef DECLARE_int32
|
34
|
+
#define DECLARE_int32(name) extern int32 FLAGS_##name
|
35
|
+
#undef DECLARE_string
|
36
|
+
#define DECLARE_string(name) extern string FLAGS_##name
|
37
|
+
|
38
|
+
|
39
|
+
#endif // UTIL_COMMANDLINEFLAGS_H_
|