Line data Source code
1 : /* GRAPHITE2 LICENSING
2 :
3 : Copyright 2010, SIL International
4 : All rights reserved.
5 :
6 : This library is free software; you can redistribute it and/or modify
7 : it under the terms of the GNU Lesser General Public License as published
8 : by the Free Software Foundation; either version 2.1 of License, or
9 : (at your option) any later version.
10 :
11 : This program is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : Lesser General Public License for more details.
15 :
16 : You should also have received a copy of the GNU Lesser General Public
17 : License along with this library in the file named "LICENSE".
18 : If not, write to the Free Software Foundation, 51 Franklin Street,
19 : Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
20 : internet at http://www.fsf.org/licenses/lgpl.html.
21 :
22 : Alternatively, the contents of this file may be used under the terms of the
23 : Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public
24 : License, as published by the Free Software Foundation, either version 2
25 : of the License or (at your option) any later version.
26 : */
27 : #pragma once
28 :
29 : #include <cstdlib>
30 : #include "graphite2/Types.h"
31 :
32 : #ifdef GRAPHITE2_CUSTOM_HEADER
33 : #include GRAPHITE2_CUSTOM_HEADER
34 : #endif
35 :
36 : namespace graphite2 {
37 :
38 : typedef gr_uint8 uint8;
39 : typedef gr_uint8 byte;
40 : typedef gr_uint16 uint16;
41 : typedef gr_uint32 uint32;
42 : typedef gr_int8 int8;
43 : typedef gr_int16 int16;
44 : typedef gr_int32 int32;
45 : typedef size_t uintptr;
46 :
47 : #ifdef GRAPHITE2_TELEMETRY
48 : struct telemetry
49 : {
50 : class category;
51 :
52 : static size_t * _category;
53 : static void set_category(size_t & t) throw() { _category = &t; }
54 : static void stop() throw() { _category = 0; }
55 : static void count_bytes(size_t n) throw() { if (_category) *_category += n; }
56 :
57 : size_t misc,
58 : silf,
59 : glyph,
60 : code,
61 : states,
62 : starts,
63 : transitions;
64 :
65 : telemetry() : misc(0), silf(0), glyph(0), code(0), states(0), starts(0), transitions(0) {}
66 : };
67 :
68 : class telemetry::category
69 : {
70 : size_t * _prev;
71 : public:
72 : category(size_t & t) : _prev(_category) { _category = &t; }
73 : ~category() { _category = _prev; }
74 : };
75 :
76 : #else
77 : struct telemetry {};
78 : #endif
79 :
80 : // typesafe wrapper around malloc for simple types
81 : // use free(pointer) to deallocate
82 :
83 0 : template <typename T> T * gralloc(size_t n)
84 : {
85 : #ifdef GRAPHITE2_TELEMETRY
86 : telemetry::count_bytes(sizeof(T) * n);
87 : #endif
88 0 : return static_cast<T*>(malloc(sizeof(T) * n));
89 : }
90 :
91 0 : template <typename T> T * grzeroalloc(size_t n)
92 : {
93 : #ifdef GRAPHITE2_TELEMETRY
94 : telemetry::count_bytes(sizeof(T) * n);
95 : #endif
96 0 : return static_cast<T*>(calloc(n, sizeof(T)));
97 : }
98 :
99 : template <typename T>
100 0 : inline T min(const T a, const T b)
101 : {
102 0 : return a < b ? a : b;
103 : }
104 :
105 : template <typename T>
106 0 : inline T max(const T a, const T b)
107 : {
108 0 : return a > b ? a : b;
109 : }
110 :
111 : } // namespace graphite2
112 :
113 : #define CLASS_NEW_DELETE \
114 : void * operator new (size_t size){ return gralloc<byte>(size);} \
115 : void * operator new (size_t, void * p) throw() { return p; } \
116 : void * operator new[] (size_t size) {return gralloc<byte>(size);} \
117 : void * operator new[] (size_t, void * p) throw() { return p; } \
118 : void operator delete (void * p) throw() { free(p);} \
119 : void operator delete (void *, void *) throw() {} \
120 : void operator delete[] (void * p)throw() { free(p); } \
121 : void operator delete[] (void *, void *) throw() {}
122 :
123 : #if defined(__GNUC__) || defined(__clang__)
124 : #define GR_MAYBE_UNUSED __attribute__((unused))
125 : #else
126 : #define GR_MAYBE_UNUSED
127 : #endif
128 :
129 : #if defined(__clang__) && __cplusplus >= 201103L
130 : /* clang's fallthrough annotations are only available starting in C++11. */
131 : #define GR_FALLTHROUGH [[clang::fallthrough]]
132 : #elif defined(_MSC_VER)
133 : /*
134 : * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
135 : * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
136 : */
137 : #include <sal.h>
138 : #define GR_FALLTHROUGH __fallthrough
139 : #else
140 : #define GR_FALLTHROUGH /* fallthrough */
141 : #endif
142 :
143 : #ifdef _MSC_VER
144 : #pragma warning(disable: 4800)
145 : #pragma warning(disable: 4355)
146 : #endif
|