language_detection 0.0.1
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.
- 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
|