michael@0: /* GRAPHITE2 LICENSING michael@0: michael@0: Copyright 2010, SIL International michael@0: All rights reserved. michael@0: michael@0: This library is free software; you can redistribute it and/or modify michael@0: it under the terms of the GNU Lesser General Public License as published michael@0: by the Free Software Foundation; either version 2.1 of License, or michael@0: (at your option) any later version. michael@0: michael@0: This program is distributed in the hope that it will be useful, michael@0: but WITHOUT ANY WARRANTY; without even the implied warranty of michael@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU michael@0: Lesser General Public License for more details. michael@0: michael@0: You should also have received a copy of the GNU Lesser General Public michael@0: License along with this library in the file named "LICENSE". michael@0: If not, write to the Free Software Foundation, 51 Franklin Street, michael@0: Suite 500, Boston, MA 02110-1335, USA or visit their web page on the michael@0: internet at http://www.fsf.org/licenses/lgpl.html. michael@0: michael@0: Alternatively, the contents of this file may be used under the terms of the michael@0: Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public michael@0: License, as published by the Free Software Foundation, either version 2 michael@0: of the License or (at your option) any later version. michael@0: */ michael@0: #pragma once michael@0: michael@0: #include michael@0: #include "graphite2/Types.h" michael@0: michael@0: #ifdef GRAPHITE2_CUSTOM_HEADER michael@0: #include GRAPHITE2_CUSTOM_HEADER michael@0: #endif michael@0: michael@0: namespace graphite2 { michael@0: michael@0: typedef gr_uint8 uint8; michael@0: typedef gr_uint8 byte; michael@0: typedef gr_uint16 uint16; michael@0: typedef gr_uint32 uint32; michael@0: typedef gr_int8 int8; michael@0: typedef gr_int16 int16; michael@0: typedef gr_int32 int32; michael@0: typedef size_t uintptr; michael@0: michael@0: #ifdef GRAPHITE2_TELEMETRY michael@0: struct telemetry michael@0: { michael@0: class category; michael@0: michael@0: static size_t * _category; michael@0: static void set_category(size_t & t) throw() { _category = &t; } michael@0: static void stop() throw() { _category = 0; } michael@0: static void count_bytes(size_t n) throw() { if (_category) *_category += n; } michael@0: michael@0: size_t misc, michael@0: silf, michael@0: glyph, michael@0: code, michael@0: states, michael@0: starts, michael@0: transitions; michael@0: michael@0: telemetry() : misc(0), silf(0), glyph(0), code(0), states(0), starts(0), transitions(0) {} michael@0: }; michael@0: michael@0: class telemetry::category michael@0: { michael@0: size_t * _prev; michael@0: public: michael@0: category(size_t & t) : _prev(_category) { _category = &t; } michael@0: ~category() { _category = _prev; } michael@0: }; michael@0: michael@0: #else michael@0: struct telemetry {}; michael@0: #endif michael@0: michael@0: // typesafe wrapper around malloc for simple types michael@0: // use free(pointer) to deallocate michael@0: michael@0: template T * gralloc(size_t n) michael@0: { michael@0: #ifdef GRAPHITE2_TELEMETRY michael@0: telemetry::count_bytes(sizeof(T) * n); michael@0: #endif michael@0: return reinterpret_cast(malloc(sizeof(T) * n)); michael@0: } michael@0: michael@0: template T * grzeroalloc(size_t n) michael@0: { michael@0: #ifdef GRAPHITE2_TELEMETRY michael@0: telemetry::count_bytes(sizeof(T) * n); michael@0: #endif michael@0: return reinterpret_cast(calloc(n, sizeof(T))); michael@0: } michael@0: michael@0: template michael@0: inline T min(const T a, const T b) michael@0: { michael@0: return a < b ? a : b; michael@0: } michael@0: michael@0: template michael@0: inline T max(const T a, const T b) michael@0: { michael@0: return a > b ? a : b; michael@0: } michael@0: michael@0: } // namespace graphite2 michael@0: michael@0: #define CLASS_NEW_DELETE \ michael@0: void * operator new (size_t size){ return gralloc(size);} \ michael@0: void * operator new (size_t, void * p) throw() { return p; } \ michael@0: void * operator new[] (size_t size) {return gralloc(size);} \ michael@0: void * operator new[] (size_t, void * p) throw() { return p; } \ michael@0: void operator delete (void * p) throw() { free(p);} \ michael@0: void operator delete (void *, void *) throw() {} \ michael@0: void operator delete[] (void * p)throw() { free(p); } \ michael@0: void operator delete[] (void *, void *) throw() {} michael@0: michael@0: #ifdef __GNUC__ michael@0: #define GR_MAYBE_UNUSED __attribute__((unused)) michael@0: #else michael@0: #define GR_MAYBE_UNUSED michael@0: #endif