cld-fixed 0.7.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.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/LICENSE +27 -0
- data/README.md +34 -0
- data/Rakefile +5 -0
- data/cld.gemspec +22 -0
- data/ext/cld/Makefile.am +28 -0
- data/ext/cld/Makefile.in +790 -0
- data/ext/cld/aclocal.m4 +8895 -0
- data/ext/cld/base/basictypes.h +348 -0
- data/ext/cld/base/build_config.h +115 -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/build_aux/config.guess +1500 -0
- data/ext/cld/build_aux/config.sub +1616 -0
- data/ext/cld/build_aux/depcomp +584 -0
- data/ext/cld/build_aux/install-sh +507 -0
- data/ext/cld/build_aux/ltmain.sh +8745 -0
- data/ext/cld/build_aux/missing +367 -0
- data/ext/cld/cld_encodings.h +95 -0
- data/ext/cld/configure +17362 -0
- data/ext/cld/configure.ac +14 -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/#compact_lang_det_impl.h# +171 -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/#getonescriptspan.cc# +570 -0
- data/ext/cld/encodings/compact_lang_det/#getonescriptspan.h# +131 -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/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_unilib_windows.cc# +29 -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 +7 -0
- data/ext/cld/languages/internal/#languages.cc# +337 -0
- data/ext/cld/languages/internal/languages.cc +336 -0
- data/ext/cld/languages/proto/languages.pb.h +179 -0
- data/ext/cld/languages/public/languages.h +379 -0
- data/ext/cld/thunk.cc +55 -0
- data/lib/cld.rb +21 -0
- data/lib/cld/version.rb +3 -0
- data/spec/cld_spec.rb +67 -0
- data/spec/spec_helper.rb +6 -0
- metadata +193 -0
|
File without changes
|
|
@@ -0,0 +1,107 @@
|
|
|
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
|
+
// In most .h files, we would rather include a declaration of an stl
|
|
6
|
+
// rather than including the appropriate stl h file (which brings in
|
|
7
|
+
// lots of noise). For many STL classes this is ok (eg pair), but for
|
|
8
|
+
// some it's really annoying. We define those here, so you can
|
|
9
|
+
// just include this file instead of having to deal with the annoyance.
|
|
10
|
+
//
|
|
11
|
+
// Most of the annoyance, btw, has to do with the default allocator.
|
|
12
|
+
|
|
13
|
+
#ifndef _STL_DECL_MSVC_H
|
|
14
|
+
#define _STL_DECL_MSVC_H
|
|
15
|
+
|
|
16
|
+
// VC++ namespace / STL issues; make them explicit
|
|
17
|
+
#include <wchar.h>
|
|
18
|
+
#include <string>
|
|
19
|
+
#include <vector>
|
|
20
|
+
#include <functional>
|
|
21
|
+
#include <utility>
|
|
22
|
+
#include <set>
|
|
23
|
+
#include <list>
|
|
24
|
+
#define slist list
|
|
25
|
+
#include <algorithm>
|
|
26
|
+
#include <deque>
|
|
27
|
+
#include <iostream>
|
|
28
|
+
#include <map>
|
|
29
|
+
#include <queue>
|
|
30
|
+
#include <stack>
|
|
31
|
+
|
|
32
|
+
// copy_n isn't to be found anywhere in MSVC's STL
|
|
33
|
+
template <typename InputIterator, typename Size, typename OutputIterator>
|
|
34
|
+
std::pair<InputIterator, OutputIterator>
|
|
35
|
+
copy_n(InputIterator in, Size count, OutputIterator out) {
|
|
36
|
+
for ( ; count > 0; --count) {
|
|
37
|
+
*out = *in;
|
|
38
|
+
++out;
|
|
39
|
+
++in;
|
|
40
|
+
}
|
|
41
|
+
return std::make_pair(in, out);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Nor are the following selectors
|
|
45
|
+
template <typename T>
|
|
46
|
+
struct identity {
|
|
47
|
+
inline const T& operator()(const T& t) const { return t; }
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Copied from STLport
|
|
51
|
+
template <class _Pair>
|
|
52
|
+
struct select1st : public std::unary_function<_Pair, typename _Pair::first_type> {
|
|
53
|
+
const typename _Pair::first_type& operator()(const _Pair& __x) const {
|
|
54
|
+
return __x.first;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
template <class _Pair>
|
|
59
|
+
struct select2nd : public std::unary_function<_Pair, typename _Pair::second_type>
|
|
60
|
+
{
|
|
61
|
+
const typename _Pair::second_type& operator()(const _Pair& __x) const {
|
|
62
|
+
return __x.second;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
#if _MSC_VER >= 1300
|
|
68
|
+
|
|
69
|
+
// If you compile on Windows and get a compile-time error because
|
|
70
|
+
// some google3 code specifies a 3rd or 4th parameter to one of
|
|
71
|
+
// these template classes, then you have to put in some #ifdefs
|
|
72
|
+
// and use the NATIVE_HASH_NAMESPACE::hash_(set|map) implementation.
|
|
73
|
+
namespace msvchash {
|
|
74
|
+
template <typename Key>
|
|
75
|
+
struct hash;
|
|
76
|
+
|
|
77
|
+
template <class Key,
|
|
78
|
+
class HashFcn = hash<Key> >
|
|
79
|
+
class hash_set;
|
|
80
|
+
|
|
81
|
+
template <class Key, class Val,
|
|
82
|
+
class HashFcn = hash<Key> >
|
|
83
|
+
class hash_map;
|
|
84
|
+
|
|
85
|
+
template <class Key,
|
|
86
|
+
class HashFcn = hash<Key> >
|
|
87
|
+
class hash_multiset;
|
|
88
|
+
|
|
89
|
+
template <class Key, class Val,
|
|
90
|
+
class HashFcn = hash<Key> >
|
|
91
|
+
class hash_multimap;
|
|
92
|
+
} // end namespace msvchash
|
|
93
|
+
|
|
94
|
+
using msvchash::hash_set;
|
|
95
|
+
using msvchash::hash_map;
|
|
96
|
+
using msvchash::hash;
|
|
97
|
+
using msvchash::hash_multimap;
|
|
98
|
+
using msvchash::hash_multiset;
|
|
99
|
+
|
|
100
|
+
#else
|
|
101
|
+
#define hash_map map
|
|
102
|
+
#define hash_set set
|
|
103
|
+
#endif
|
|
104
|
+
|
|
105
|
+
using namespace std;
|
|
106
|
+
|
|
107
|
+
#endif /* #ifdef _STL_DECL_MSVC_H */
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright (c) 2010 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 file defines utility functions for working with strings.
|
|
6
|
+
|
|
7
|
+
#ifndef BASE_STRING_UTIL_H_
|
|
8
|
+
#define BASE_STRING_UTIL_H_
|
|
9
|
+
|
|
10
|
+
#include <string.h>
|
|
11
|
+
|
|
12
|
+
namespace base {
|
|
13
|
+
|
|
14
|
+
#ifdef WIN32
|
|
15
|
+
// Compare the two strings s1 and s2 without regard to case using
|
|
16
|
+
// the current locale; returns 0 if they are equal, 1 if s1 > s2, and -1 if
|
|
17
|
+
// s2 > s1 according to a lexicographic comparison.
|
|
18
|
+
inline int strcasecmp(const char* s1, const char* s2) {
|
|
19
|
+
return _stricmp(s1, s2);
|
|
20
|
+
}
|
|
21
|
+
#else
|
|
22
|
+
inline int strcasecmp(const char* s1, const char* s2) {
|
|
23
|
+
return ::strcasecmp(s1, s2);
|
|
24
|
+
}
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
#endif // BASE_STRING_UTIL_H_
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
// Architecture-neutral plug compatible replacements for strtol() friends.
|
|
6
|
+
//
|
|
7
|
+
// Long's have different lengths on ILP-32 and LP-64 platforms, and so overflow
|
|
8
|
+
// behavior across the two varies when strtol() and similar are used to parse
|
|
9
|
+
// 32-bit integers. Similar problems exist with atoi(), because although it
|
|
10
|
+
// has an all-integer interface, it uses strtol() internally, and so suffers
|
|
11
|
+
// from the same narrowing problems on assignments to int.
|
|
12
|
+
//
|
|
13
|
+
// Examples:
|
|
14
|
+
// errno = 0;
|
|
15
|
+
// i = strtol("3147483647", NULL, 10);
|
|
16
|
+
// printf("%d, errno %d\n", i, errno);
|
|
17
|
+
// // 32-bit platform: 2147483647, errno 34
|
|
18
|
+
// // 64-bit platform: -1147483649, errno 0
|
|
19
|
+
//
|
|
20
|
+
// printf("%d\n", atoi("3147483647"));
|
|
21
|
+
// // 32-bit platform: 2147483647
|
|
22
|
+
// // 64-bit platform: -1147483649
|
|
23
|
+
//
|
|
24
|
+
// A way round this is to define local replacements for these, and use them
|
|
25
|
+
// instead of the standard libc functions.
|
|
26
|
+
//
|
|
27
|
+
// In most 32-bit cases the replacements can be inlined away to a call to the
|
|
28
|
+
// libc function. In a couple of 64-bit cases, however, adapters are required,
|
|
29
|
+
// to provide the right overflow and errno behavior.
|
|
30
|
+
//
|
|
31
|
+
|
|
32
|
+
#ifndef BASE_STRTOINT_H_
|
|
33
|
+
#define BASE_STRTOINT_H_
|
|
34
|
+
|
|
35
|
+
#include <stdlib.h> // For strtol* functions.
|
|
36
|
+
#include <string>
|
|
37
|
+
#include "base/port.h"
|
|
38
|
+
#include "base/basictypes.h"
|
|
39
|
+
|
|
40
|
+
// Adapter functions for handling overflow and errno.
|
|
41
|
+
int32 strto32_adapter(const char *nptr, char **endptr, int base);
|
|
42
|
+
uint32 strtou32_adapter(const char *nptr, char **endptr, int base);
|
|
43
|
+
|
|
44
|
+
// Conversions to a 32-bit integer can pass the call to strto[u]l on 32-bit
|
|
45
|
+
// platforms, but need a little extra work on 64-bit platforms.
|
|
46
|
+
inline int32 strto32(const char *nptr, char **endptr, int base) {
|
|
47
|
+
if (sizeof(int32) == sizeof(long))
|
|
48
|
+
return strtol(nptr, endptr, base);
|
|
49
|
+
else
|
|
50
|
+
return strto32_adapter(nptr, endptr, base);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
inline uint32 strtou32(const char *nptr, char **endptr, int base) {
|
|
54
|
+
if (sizeof(uint32) == sizeof(unsigned long))
|
|
55
|
+
return strtoul(nptr, endptr, base);
|
|
56
|
+
else
|
|
57
|
+
return strtou32_adapter(nptr, endptr, base);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// For now, long long is 64-bit on all the platforms we care about, so these
|
|
61
|
+
// functions can simply pass the call to strto[u]ll.
|
|
62
|
+
inline int64 strto64(const char *nptr, char **endptr, int base) {
|
|
63
|
+
COMPILE_ASSERT(sizeof(int64) == sizeof(long long),
|
|
64
|
+
sizeof_int64_is_not_sizeof_long_long);
|
|
65
|
+
return strtoll(nptr, endptr, base);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
inline uint64 strtou64(const char *nptr, char **endptr, int base) {
|
|
69
|
+
COMPILE_ASSERT(sizeof(uint64) == sizeof(unsigned long long),
|
|
70
|
+
sizeof_uint64_is_not_sizeof_long_long);
|
|
71
|
+
return strtoull(nptr, endptr, base);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Although it returns an int, atoi() is implemented in terms of strtol, and
|
|
75
|
+
// so has differing overflow and underflow behavior. atol is the same.
|
|
76
|
+
inline int32 atoi32(const char *nptr) {
|
|
77
|
+
return strto32(nptr, NULL, 10);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
inline int64 atoi64(const char *nptr) {
|
|
81
|
+
return strto64(nptr, NULL, 10);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Convenience versions of the above that take a string argument.
|
|
85
|
+
inline int32 atoi32(const string &s) {
|
|
86
|
+
return atoi32(s.c_str());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
inline int64 atoi64(const string &s) {
|
|
90
|
+
return atoi64(s.c_str());
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#endif // BASE_STRTOINT_H_
|
|
@@ -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_
|