language_detection 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +85 -0
- data/Rakefile +11 -0
- data/ext/cld/Makefile +34 -0
- data/ext/cld/base/basictypes.h +348 -0
- data/ext/cld/base/build_config.h +124 -0
- data/ext/cld/base/casts.h +156 -0
- data/ext/cld/base/commandlineflags.h +443 -0
- data/ext/cld/base/crash.h +41 -0
- data/ext/cld/base/dynamic_annotations.h +358 -0
- data/ext/cld/base/global_strip_options.h +59 -0
- data/ext/cld/base/log_severity.h +46 -0
- data/ext/cld/base/logging.h +1403 -0
- data/ext/cld/base/macros.h +243 -0
- data/ext/cld/base/port.h +54 -0
- data/ext/cld/base/scoped_ptr.h +428 -0
- data/ext/cld/base/stl_decl.h +0 -0
- data/ext/cld/base/stl_decl_msvc.h +107 -0
- data/ext/cld/base/string_util.h +29 -0
- data/ext/cld/base/strtoint.h +93 -0
- data/ext/cld/base/template_util.h +96 -0
- data/ext/cld/base/type_traits.h +198 -0
- data/ext/cld/base/vlog_is_on.h +143 -0
- data/ext/cld/cld.so +0 -0
- data/ext/cld/encodings/compact_lang_det/cldutil.cc +905 -0
- data/ext/cld/encodings/compact_lang_det/cldutil.h +1205 -0
- data/ext/cld/encodings/compact_lang_det/cldutil_dbg.h +76 -0
- data/ext/cld/encodings/compact_lang_det/cldutil_dbg_empty.cc +76 -0
- data/ext/cld/encodings/compact_lang_det/compact_lang_det.cc +62 -0
- data/ext/cld/encodings/compact_lang_det/compact_lang_det.h +145 -0
- data/ext/cld/encodings/compact_lang_det/compact_lang_det_impl.cc +2574 -0
- data/ext/cld/encodings/compact_lang_det/compact_lang_det_impl.h +173 -0
- data/ext/cld/encodings/compact_lang_det/compact_lang_det_unittest_small.cc +406 -0
- data/ext/cld/encodings/compact_lang_det/compile.cmd +1 -0
- data/ext/cld/encodings/compact_lang_det/ext_lang_enc.cc +545 -0
- data/ext/cld/encodings/compact_lang_det/ext_lang_enc.h +119 -0
- data/ext/cld/encodings/compact_lang_det/generated/cld_generated_score_deltaoctachrome_0406.cc +380 -0
- data/ext/cld/encodings/compact_lang_det/generated/cld_generated_score_quadchrome_0406.cc +382 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_cjkbis_0.cc +49 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_ctjkvz.cc +7119 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_ctjkvz_0.cc +61 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_deltaoctachrome.cc +1263 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_longwords8_0.cc +53 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_meanscore.h +10 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_quads_0.cc +50 -0
- data/ext/cld/encodings/compact_lang_det/generated/compact_lang_det_generated_quadschrome.cc +70935 -0
- data/ext/cld/encodings/compact_lang_det/getonescriptspan.cc +570 -0
- data/ext/cld/encodings/compact_lang_det/getonescriptspan.h +131 -0
- data/ext/cld/encodings/compact_lang_det/letterscript_enum.cc +117 -0
- data/ext/cld/encodings/compact_lang_det/letterscript_enum.h +99 -0
- data/ext/cld/encodings/compact_lang_det/subsetsequence.cc +259 -0
- data/ext/cld/encodings/compact_lang_det/subsetsequence.h +44 -0
- data/ext/cld/encodings/compact_lang_det/subsetsequence_unittest.cc +99 -0
- data/ext/cld/encodings/compact_lang_det/tote.cc +299 -0
- data/ext/cld/encodings/compact_lang_det/tote.h +89 -0
- data/ext/cld/encodings/compact_lang_det/unittest_data.h +193 -0
- data/ext/cld/encodings/compact_lang_det/utf8propjustletter.h +1162 -0
- data/ext/cld/encodings/compact_lang_det/utf8propletterscriptnum.h +1222 -0
- data/ext/cld/encodings/compact_lang_det/utf8scannotjustletterspecial.h +1185 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_basictypes.h +10 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_commandlineflags.h +28 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_google.h +18 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_htmlutils.h +13 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_htmlutils_google3.cc +32 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_htmlutils_windows.cc +29 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_logging.h +21 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_macros.h +19 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_strtoint.h +26 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_unicodetext.cc +84 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_unicodetext.h +40 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_unilib.h +15 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_unilib_google3.cc +18 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_unilib_windows.cc +29 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_utf.h +24 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_utf8statetable.cc +224 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_utf8statetable.h +141 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_utf8utils.h +22 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_utf8utils_google3.cc +18 -0
- data/ext/cld/encodings/compact_lang_det/win/cld_utf8utils_windows.cc +17 -0
- data/ext/cld/encodings/compact_lang_det/win/normalizedunicodetext.cc +172 -0
- data/ext/cld/encodings/compact_lang_det/win/normalizedunicodetext.h +67 -0
- data/ext/cld/encodings/internal/encodings.cc +12 -0
- data/ext/cld/encodings/lang_enc.h +254 -0
- data/ext/cld/encodings/proto/encodings.pb.h +169 -0
- data/ext/cld/encodings/public/encodings.h +301 -0
- data/ext/cld/extconf.rb +1 -0
- data/ext/cld/language_detection.cc +88 -0
- data/ext/cld/languages/internal/languages.cc +337 -0
- data/ext/cld/languages/proto/languages.pb.h +179 -0
- data/ext/cld/languages/public/languages.h +379 -0
- data/language_detection.gemspec +28 -0
- data/lib/language_detection/string.rb +1 -0
- data/lib/language_detection/version.rb +3 -0
- data/lib/language_detection.rb +54 -0
- data/test/_helper.rb +15 -0
- data/test/fixtures/languages.csv +80 -0
- data/test/language_detection_test.rb +88 -0
- metadata +250 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
3
|
+
// found in the LICENSE file.
|
4
|
+
|
5
|
+
// Template metaprogramming utility functions.
|
6
|
+
//
|
7
|
+
// This code is compiled directly on many platforms, including client
|
8
|
+
// platforms like Windows, Mac, and embedded systems. Before making
|
9
|
+
// any changes here, make sure that you're not breaking any platforms.
|
10
|
+
//
|
11
|
+
// The names choosen here reflect those used in tr1 and the boost::mpl
|
12
|
+
// library, there are similar operations used in the Loki library as
|
13
|
+
// well. I prefer the boost names for 2 reasons:
|
14
|
+
// 1. I think that portions of the Boost libraries are more likely to
|
15
|
+
// be included in the c++ standard.
|
16
|
+
// 2. It is not impossible that some of the boost libraries will be
|
17
|
+
// included in our own build in the future.
|
18
|
+
// Both of these outcomes means that we may be able to directly replace
|
19
|
+
// some of these with boost equivalents.
|
20
|
+
//
|
21
|
+
#ifndef BASE_TEMPLATE_UTIL_H_
|
22
|
+
#define BASE_TEMPLATE_UTIL_H_
|
23
|
+
|
24
|
+
namespace base {
|
25
|
+
|
26
|
+
// Types small_ and big_ are guaranteed such that sizeof(small_) <
|
27
|
+
// sizeof(big_)
|
28
|
+
typedef char small_;
|
29
|
+
|
30
|
+
struct big_ {
|
31
|
+
char dummy[2];
|
32
|
+
};
|
33
|
+
|
34
|
+
// integral_constant, defined in tr1, is a wrapper for an integer
|
35
|
+
// value. We don't really need this generality; we could get away
|
36
|
+
// with hardcoding the integer type to bool. We use the fully
|
37
|
+
// general integer_constant for compatibility with tr1.
|
38
|
+
|
39
|
+
template<class T, T v>
|
40
|
+
struct integral_constant {
|
41
|
+
static const T value = v;
|
42
|
+
typedef T value_type;
|
43
|
+
typedef integral_constant<T, v> type;
|
44
|
+
};
|
45
|
+
|
46
|
+
template <class T, T v> const T integral_constant<T, v>::value;
|
47
|
+
|
48
|
+
|
49
|
+
// Abbreviations: true_type and false_type are structs that represent boolean
|
50
|
+
// true and false values. Also define the boost::mpl versions of those names,
|
51
|
+
// true_ and false_.
|
52
|
+
typedef integral_constant<bool, true> true_type;
|
53
|
+
typedef integral_constant<bool, false> false_type;
|
54
|
+
typedef true_type true_;
|
55
|
+
typedef false_type false_;
|
56
|
+
|
57
|
+
// if_ is a templatized conditional statement.
|
58
|
+
// if_<cond, A, B> is a compile time evaluation of cond.
|
59
|
+
// if_<>::type contains A if cond is true, B otherwise.
|
60
|
+
template<bool cond, typename A, typename B>
|
61
|
+
struct if_{
|
62
|
+
typedef A type;
|
63
|
+
};
|
64
|
+
|
65
|
+
template<typename A, typename B>
|
66
|
+
struct if_<false, A, B> {
|
67
|
+
typedef B type;
|
68
|
+
};
|
69
|
+
|
70
|
+
|
71
|
+
// type_equals_ is a template type comparator, similar to Loki IsSameType.
|
72
|
+
// type_equals_<A, B>::value is true iff "A" is the same type as "B".
|
73
|
+
template<typename A, typename B>
|
74
|
+
struct type_equals_ : public false_ {
|
75
|
+
};
|
76
|
+
|
77
|
+
template<typename A>
|
78
|
+
struct type_equals_<A, A> : public true_ {
|
79
|
+
};
|
80
|
+
|
81
|
+
// and_ is a template && operator.
|
82
|
+
// and_<A, B>::value evaluates "A::value && B::value".
|
83
|
+
template<typename A, typename B>
|
84
|
+
struct and_ : public integral_constant<bool, (A::value && B::value)> {
|
85
|
+
};
|
86
|
+
|
87
|
+
// or_ is a template || operator.
|
88
|
+
// or_<A, B>::value evaluates "A::value || B::value".
|
89
|
+
template<typename A, typename B>
|
90
|
+
struct or_ : public integral_constant<bool, (A::value || B::value)> {
|
91
|
+
};
|
92
|
+
|
93
|
+
|
94
|
+
} // Close namespace base
|
95
|
+
|
96
|
+
#endif // BASE_TEMPLATE_UTIL_H_
|
@@ -0,0 +1,198 @@
|
|
1
|
+
// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
3
|
+
// found in the LICENSE file.
|
4
|
+
|
5
|
+
// This code is compiled directly on many platforms, including client
|
6
|
+
// platforms like Windows, Mac, and embedded systems. Before making
|
7
|
+
// any changes here, make sure that you're not breaking any platforms.
|
8
|
+
//
|
9
|
+
//
|
10
|
+
// Define a small subset of tr1 type traits. The traits we define are:
|
11
|
+
// is_integral
|
12
|
+
// is_floating_point
|
13
|
+
// is_pointer
|
14
|
+
// is_reference
|
15
|
+
// is_pod
|
16
|
+
// has_trivial_constructor
|
17
|
+
// has_trivial_copy
|
18
|
+
// has_trivial_assign
|
19
|
+
// has_trivial_destructor
|
20
|
+
// remove_const
|
21
|
+
// remove_volatile
|
22
|
+
// remove_cv
|
23
|
+
// remove_reference
|
24
|
+
// remove_pointer
|
25
|
+
// is_convertible
|
26
|
+
// We can add more type traits as required.
|
27
|
+
|
28
|
+
#ifndef BASE_TYPE_TRAITS_H_
|
29
|
+
#define BASE_TYPE_TRAITS_H_
|
30
|
+
|
31
|
+
#include "base/template_util.h" // For true_type and false_type
|
32
|
+
#include <utility> // For pair
|
33
|
+
|
34
|
+
namespace base {
|
35
|
+
|
36
|
+
// is_integral is false except for the built-in integer types.
|
37
|
+
template <class T> struct is_integral : false_type { };
|
38
|
+
template<> struct is_integral<bool> : true_type { };
|
39
|
+
template<> struct is_integral<char> : true_type { };
|
40
|
+
template<> struct is_integral<unsigned char> : true_type { };
|
41
|
+
template<> struct is_integral<signed char> : true_type { };
|
42
|
+
#if defined(_MSC_VER)
|
43
|
+
// wchar_t is not by default a distinct type from unsigned short in
|
44
|
+
// Microsoft C.
|
45
|
+
// See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx
|
46
|
+
template<> struct is_integral<__wchar_t> : true_type { };
|
47
|
+
#else
|
48
|
+
template<> struct is_integral<wchar_t> : true_type { };
|
49
|
+
#endif
|
50
|
+
template<> struct is_integral<short> : true_type { };
|
51
|
+
template<> struct is_integral<unsigned short> : true_type { };
|
52
|
+
template<> struct is_integral<int> : true_type { };
|
53
|
+
template<> struct is_integral<unsigned int> : true_type { };
|
54
|
+
template<> struct is_integral<long> : true_type { };
|
55
|
+
template<> struct is_integral<unsigned long> : true_type { };
|
56
|
+
template<> struct is_integral<long long> : true_type { };
|
57
|
+
template<> struct is_integral<unsigned long long> : true_type { };
|
58
|
+
|
59
|
+
|
60
|
+
// is_floating_point is false except for the built-in floating-point types.
|
61
|
+
template <class T> struct is_floating_point : false_type { };
|
62
|
+
template<> struct is_floating_point<float> : true_type { };
|
63
|
+
template<> struct is_floating_point<double> : true_type { };
|
64
|
+
template<> struct is_floating_point<long double> : true_type { };
|
65
|
+
|
66
|
+
|
67
|
+
// is_pointer is false except for pointer types.
|
68
|
+
template <class T> struct is_pointer : false_type { };
|
69
|
+
template <class T> struct is_pointer<T*> : true_type { };
|
70
|
+
|
71
|
+
|
72
|
+
// is_reference is false except for reference types.
|
73
|
+
template<typename T> struct is_reference : false_type {};
|
74
|
+
template<typename T> struct is_reference<T&> : true_type {};
|
75
|
+
|
76
|
+
|
77
|
+
// We can't get is_pod right without compiler help, so fail conservatively.
|
78
|
+
// We will assume it's false except for arithmetic types and pointers,
|
79
|
+
// and const versions thereof. Note that std::pair is not a POD.
|
80
|
+
template <class T> struct is_pod
|
81
|
+
: integral_constant<bool, (is_integral<T>::value ||
|
82
|
+
is_floating_point<T>::value ||
|
83
|
+
is_pointer<T>::value)> { };
|
84
|
+
template <class T> struct is_pod<const T> : is_pod<T> { };
|
85
|
+
|
86
|
+
|
87
|
+
// We can't get has_trivial_constructor right without compiler help, so
|
88
|
+
// fail conservatively. We will assume it's false except for: (1) types
|
89
|
+
// for which is_pod is true. (2) std::pair of types with trivial
|
90
|
+
// constructors. (3) array of a type with a trivial constructor.
|
91
|
+
// (4) const versions thereof.
|
92
|
+
template <class T> struct has_trivial_constructor : is_pod<T> { };
|
93
|
+
template <class T, class U> struct has_trivial_constructor<std::pair<T, U> >
|
94
|
+
: integral_constant<bool,
|
95
|
+
(has_trivial_constructor<T>::value &&
|
96
|
+
has_trivial_constructor<U>::value)> { };
|
97
|
+
template <class A, int N> struct has_trivial_constructor<A[N]>
|
98
|
+
: has_trivial_constructor<A> { };
|
99
|
+
template <class T> struct has_trivial_constructor<const T>
|
100
|
+
: has_trivial_constructor<T> { };
|
101
|
+
|
102
|
+
// We can't get has_trivial_copy right without compiler help, so fail
|
103
|
+
// conservatively. We will assume it's false except for: (1) types
|
104
|
+
// for which is_pod is true. (2) std::pair of types with trivial copy
|
105
|
+
// constructors. (3) array of a type with a trivial copy constructor.
|
106
|
+
// (4) const versions thereof.
|
107
|
+
template <class T> struct has_trivial_copy : is_pod<T> { };
|
108
|
+
template <class T, class U> struct has_trivial_copy<std::pair<T, U> >
|
109
|
+
: integral_constant<bool,
|
110
|
+
(has_trivial_copy<T>::value &&
|
111
|
+
has_trivial_copy<U>::value)> { };
|
112
|
+
template <class A, int N> struct has_trivial_copy<A[N]>
|
113
|
+
: has_trivial_copy<A> { };
|
114
|
+
template <class T> struct has_trivial_copy<const T> : has_trivial_copy<T> { };
|
115
|
+
|
116
|
+
// We can't get has_trivial_assign right without compiler help, so fail
|
117
|
+
// conservatively. We will assume it's false except for: (1) types
|
118
|
+
// for which is_pod is true. (2) std::pair of types with trivial copy
|
119
|
+
// constructors. (3) array of a type with a trivial assign constructor.
|
120
|
+
template <class T> struct has_trivial_assign : is_pod<T> { };
|
121
|
+
template <class T, class U> struct has_trivial_assign<std::pair<T, U> >
|
122
|
+
: integral_constant<bool,
|
123
|
+
(has_trivial_assign<T>::value &&
|
124
|
+
has_trivial_assign<U>::value)> { };
|
125
|
+
template <class A, int N> struct has_trivial_assign<A[N]>
|
126
|
+
: has_trivial_assign<A> { };
|
127
|
+
|
128
|
+
// We can't get has_trivial_destructor right without compiler help, so
|
129
|
+
// fail conservatively. We will assume it's false except for: (1) types
|
130
|
+
// for which is_pod is true. (2) std::pair of types with trivial
|
131
|
+
// destructors. (3) array of a type with a trivial destructor.
|
132
|
+
// (4) const versions thereof.
|
133
|
+
template <class T> struct has_trivial_destructor : is_pod<T> { };
|
134
|
+
template <class T, class U> struct has_trivial_destructor<std::pair<T, U> >
|
135
|
+
: integral_constant<bool,
|
136
|
+
(has_trivial_destructor<T>::value &&
|
137
|
+
has_trivial_destructor<U>::value)> { };
|
138
|
+
template <class A, int N> struct has_trivial_destructor<A[N]>
|
139
|
+
: has_trivial_destructor<A> { };
|
140
|
+
template <class T> struct has_trivial_destructor<const T>
|
141
|
+
: has_trivial_destructor<T> { };
|
142
|
+
|
143
|
+
// Specified by TR1 [4.7.1]
|
144
|
+
template<typename T> struct remove_const { typedef T type; };
|
145
|
+
template<typename T> struct remove_const<T const> { typedef T type; };
|
146
|
+
template<typename T> struct remove_volatile { typedef T type; };
|
147
|
+
template<typename T> struct remove_volatile<T volatile> { typedef T type; };
|
148
|
+
template<typename T> struct remove_cv {
|
149
|
+
typedef typename remove_const<typename remove_volatile<T>::type>::type type;
|
150
|
+
};
|
151
|
+
|
152
|
+
|
153
|
+
// Specified by TR1 [4.7.2]
|
154
|
+
template<typename T> struct remove_reference { typedef T type; };
|
155
|
+
template<typename T> struct remove_reference<T&> { typedef T type; };
|
156
|
+
|
157
|
+
// Specified by TR1 [4.7.4] Pointer modifications.
|
158
|
+
template<typename T> struct remove_pointer { typedef T type; };
|
159
|
+
template<typename T> struct remove_pointer<T*> { typedef T type; };
|
160
|
+
template<typename T> struct remove_pointer<T* const> { typedef T type; };
|
161
|
+
template<typename T> struct remove_pointer<T* volatile> { typedef T type; };
|
162
|
+
template<typename T> struct remove_pointer<T* const volatile> {
|
163
|
+
typedef T type; };
|
164
|
+
|
165
|
+
// Specified by TR1 [4.6] Relationships between types
|
166
|
+
#ifndef _MSC_VER
|
167
|
+
namespace internal {
|
168
|
+
|
169
|
+
// This class is an implementation detail for is_convertible, and you
|
170
|
+
// don't need to know how it works to use is_convertible. For those
|
171
|
+
// who care: we declare two different functions, one whose argument is
|
172
|
+
// of type To and one with a variadic argument list. We give them
|
173
|
+
// return types of different size, so we can use sizeof to trick the
|
174
|
+
// compiler into telling us which function it would have chosen if we
|
175
|
+
// had called it with an argument of type From. See Alexandrescu's
|
176
|
+
// _Modern C++ Design_ for more details on this sort of trick.
|
177
|
+
|
178
|
+
template <typename From, typename To>
|
179
|
+
struct ConvertHelper {
|
180
|
+
static small_ Test(To);
|
181
|
+
static big_ Test(...);
|
182
|
+
static From Create();
|
183
|
+
};
|
184
|
+
} // namespace internal
|
185
|
+
|
186
|
+
// Inherits from true_type if From is convertible to To, false_type otherwise.
|
187
|
+
template <typename From, typename To>
|
188
|
+
struct is_convertible
|
189
|
+
: integral_constant<bool,
|
190
|
+
sizeof(internal::ConvertHelper<From, To>::Test(
|
191
|
+
internal::ConvertHelper<From, To>::Create()))
|
192
|
+
== sizeof(small_)> {
|
193
|
+
};
|
194
|
+
#endif
|
195
|
+
|
196
|
+
} // Close namespace base
|
197
|
+
|
198
|
+
#endif // BASE_TYPE_TRAITS_H_
|
@@ -0,0 +1,143 @@
|
|
1
|
+
// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
3
|
+
// found in the LICENSE file.
|
4
|
+
|
5
|
+
// Defines the VLOG_IS_ON macro that controls the variable-verbosity
|
6
|
+
// conditional logging.
|
7
|
+
//
|
8
|
+
// It's used by VLOG and VLOG_IF in logging.h
|
9
|
+
// and by RAW_VLOG in raw_logging.h to trigger the logging.
|
10
|
+
//
|
11
|
+
// It can also be used directly e.g. like this:
|
12
|
+
// if (VLOG_IS_ON(2)) {
|
13
|
+
// // do some logging preparation and logging
|
14
|
+
// // that can't be accomplished e.g. via just VLOG(2) << ...;
|
15
|
+
// }
|
16
|
+
//
|
17
|
+
// The truth value that VLOG_IS_ON(level) returns is determined by
|
18
|
+
// the three verbosity level flags:
|
19
|
+
// --v=<n> Gives the default maximal active V-logging level;
|
20
|
+
// 0 is the default.
|
21
|
+
// Normally positive values are used for V-logging levels.
|
22
|
+
// --vmodule=<str> Gives the per-module maximal V-logging levels to override
|
23
|
+
// the value given by --v.
|
24
|
+
// E.g. "my_module=2,foo*=3" would change the logging level
|
25
|
+
// for all code in source files "my_module.*" and "foo*.*"
|
26
|
+
// ("-inl" suffixes are also disregarded for this matching).
|
27
|
+
// --silent_init When true has the effect of increasing
|
28
|
+
// the argument of VLOG_IS_ON by 1,
|
29
|
+
// thus suppressing one more level of verbose logging.
|
30
|
+
//
|
31
|
+
// SetVLOGLevel helper function is provided to do limited dynamic control over
|
32
|
+
// V-logging by overriding the per-module settings given via --vmodule flag.
|
33
|
+
//
|
34
|
+
// CAVEAT: --vmodule functionality is not available in non gcc compilers.
|
35
|
+
//
|
36
|
+
|
37
|
+
#ifndef BASE_VLOG_IS_ON_H_
|
38
|
+
#define BASE_VLOG_IS_ON_H_
|
39
|
+
|
40
|
+
#include "base/atomicops.h"
|
41
|
+
#include "base/basictypes.h"
|
42
|
+
#include "base/port.h"
|
43
|
+
#include "base/commandlineflags.h"
|
44
|
+
#include "base/log_severity.h"
|
45
|
+
|
46
|
+
DECLARE_int32(v); // in vlog_is_on.cc
|
47
|
+
DECLARE_bool(silent_init); // in google.cc
|
48
|
+
|
49
|
+
#if defined(__GNUC__)
|
50
|
+
// We pack an int16 verbosity level and an int16 epoch into an
|
51
|
+
// Atomic32 at every VLOG_IS_ON() call site. The level determines
|
52
|
+
// whether the site should log, and the epoch determines whether the
|
53
|
+
// site is stale and should be reinitialized. A verbosity level of
|
54
|
+
// kUseFlag (-1) indicates that the value of FLAGS_v should be used as
|
55
|
+
// the verbosity level. When the site is (re)initialized, a verbosity
|
56
|
+
// level for the current source file is retrieved from an internal
|
57
|
+
// list. This list is mutated through calls to SetVLOGLevel() and
|
58
|
+
// mutations to the --vmodule flag. New log sites are initialized
|
59
|
+
// with a stale epoch and a verbosity level of kUseFlag.
|
60
|
+
//
|
61
|
+
// TODO(llansing): Investigate using GCC's __builtin_constant_p() to
|
62
|
+
// generate less code at call sites where verbositylevel is known to
|
63
|
+
// be a compile-time constant.
|
64
|
+
#define VLOG_IS_ON(verboselevel) \
|
65
|
+
({ static Atomic32 site__ = ::base::internal::kDefaultSite; \
|
66
|
+
::base::internal::VLogEnabled(&site__, (verboselevel), __FILE__); })
|
67
|
+
#else
|
68
|
+
// GNU extensions not available, so we do not support --vmodule.
|
69
|
+
// Dynamic value of FLAGS_v always controls the logging level.
|
70
|
+
//
|
71
|
+
// TODO(llansing): Investigate supporting --vmodule on other platforms.
|
72
|
+
#define VLOG_IS_ON(verboselevel) \
|
73
|
+
(FLAGS_v >= (verboselevel) + FLAGS_silent_init)
|
74
|
+
#endif
|
75
|
+
|
76
|
+
// Set VLOG(_IS_ON) level for module_pattern to log_level.
|
77
|
+
// This lets us dynamically control what is normally set by the --vmodule flag.
|
78
|
+
// Returns the level that previously applied to module_pattern.
|
79
|
+
// NOTE: To change the log level for VLOG(_IS_ON) sites
|
80
|
+
// that have already executed after/during InitGoogle,
|
81
|
+
// one needs to supply the exact --vmodule pattern that applied to them.
|
82
|
+
// (If no --vmodule pattern applied to them
|
83
|
+
// the value of FLAGS_v will continue to control them.)
|
84
|
+
int SetVLOGLevel(const char* module_pattern, int log_level);
|
85
|
+
|
86
|
+
// Private implementation details. No user-serviceable parts inside.
|
87
|
+
namespace base {
|
88
|
+
namespace internal {
|
89
|
+
|
90
|
+
// Each log site determines whether its log level is up to date by
|
91
|
+
// comparing its epoch to this global epoch. Whenever the program's
|
92
|
+
// vmodule configuration changes (ex: SetVLOGLevel is called), the
|
93
|
+
// global epoch is advanced, invalidating all site epochs.
|
94
|
+
extern Atomic32 vlog_epoch;
|
95
|
+
|
96
|
+
// A log level of kUseFlag means "read the logging level from FLAGS_v."
|
97
|
+
const int kUseFlag = -1;
|
98
|
+
|
99
|
+
// Log sites use FLAGS_v by default, and have an initial epoch of 0.
|
100
|
+
const Atomic32 kDefaultSite = kUseFlag << 16;
|
101
|
+
|
102
|
+
// The global epoch is the least significant half of an Atomic32, and
|
103
|
+
// may only be accessed through atomic operations.
|
104
|
+
inline Atomic32 GlobalEpoch() {
|
105
|
+
return Acquire_Load(&vlog_epoch) & 0x0000FFFF;
|
106
|
+
}
|
107
|
+
|
108
|
+
// The least significant half of a site is the epoch.
|
109
|
+
inline int SiteEpoch(Atomic32 site) { return site & 0x0000FFFF; }
|
110
|
+
|
111
|
+
// The most significant half of a site is the logging level.
|
112
|
+
inline int SiteLevel(Atomic32 site) { return site >> 16; }
|
113
|
+
|
114
|
+
// Construct a logging site from a logging level and epoch.
|
115
|
+
inline Atomic32 Site(int level, int epoch) {
|
116
|
+
return ((level & 0x0000FFFF) << 16) | (epoch & 0x0000FFFF);
|
117
|
+
}
|
118
|
+
|
119
|
+
// Attempt to initialize or reinitialize a VLOG site. Returns the
|
120
|
+
// level of the log site, regardless of whether the attempt succeeds
|
121
|
+
// or fails.
|
122
|
+
// site: The address of the log site's state.
|
123
|
+
// fname: The filename of the current source file.
|
124
|
+
int InitVLOG(Atomic32* site, const char* fname);
|
125
|
+
|
126
|
+
// Determine whether verbose logging should occur at a given log site.
|
127
|
+
//
|
128
|
+
// TODO(llansing): Find a way to eliminate FLAGS_silent_init from this
|
129
|
+
// function while preserving the silent initialization behavior. The
|
130
|
+
// common-case code path shouldn't pay for silent initialization.
|
131
|
+
inline bool VLogEnabled(Atomic32* site, int32 level, const char* const file) {
|
132
|
+
const Atomic32 site_copy = Acquire_Load(site);
|
133
|
+
const int32 site_level =
|
134
|
+
PREDICT_TRUE(SiteEpoch(site_copy) == GlobalEpoch()) ?
|
135
|
+
SiteLevel(site_copy) : InitVLOG(site, file);
|
136
|
+
return (site_level == kUseFlag ? FLAGS_v : site_level) >=
|
137
|
+
(level + FLAGS_silent_init);
|
138
|
+
}
|
139
|
+
|
140
|
+
} // namespace internal
|
141
|
+
} // namespace base
|
142
|
+
|
143
|
+
#endif // BASE_VLOG_IS_ON_H_
|
data/ext/cld/cld.so
ADDED
Binary file
|