130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved. 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License"); 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License. 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * http://www.apache.org/licenses/LICENSE-2.0 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS, 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License. 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_SFNTLY_PORT_TYPE_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_PORT_TYPE_H_ 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <assert.h> 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (_MSC_VER) && (_MSC_VER < 1600) 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef unsigned char uint8_t; 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef signed char int8_t; 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef unsigned __int16 uint16_t; 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef signed __int16 int16_t; 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef unsigned __int32 uint32_t; 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef signed __int32 int32_t; 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef unsigned __int64 uint64_t; 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef signed __int64 int64_t; 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Definitions to avoid ICU redefinition issue 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_INT8_T 1 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_UINT8_T 1 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_INT16_T 1 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_UINT16_T 1 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_INT32_T 1 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_UINT32_T 1 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_INT64_T 1 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define U_HAVE_UINT64_T 1 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #include <stdint.h> 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <cstddef> 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <vector> 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <set> 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef uint8_t byte_t; 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef uint16_t word_t; 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef uint32_t dword_t; 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef uint64_t qword_t; 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<byte_t> ByteVector; 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<int32_t> IntegerList; 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::set<int32_t> IntegerSet; 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// A macro to disallow the copy constructor and operator= functions. 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// This should be used in the private: declarations for a class. 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define NO_COPY_AND_ASSIGN(TypeName) \ 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TypeName(const TypeName&); \ 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void operator=(const TypeName&) 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Make google3 happy since it prohibits RTTI. 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntemplate<typename To, typename From> 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline To implicit_cast(From const &f) { 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return f; 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntemplate<typename To, typename From> // use like this: down_cast<T*>(foo); 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline To down_cast(From* f) { // so we only accept pointers 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Ensures that To is a sub-type of From *. This test is here only 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // for compile-time type checking, and has no overhead in an 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // optimized build at run-time, as it will be optimized away 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // completely. 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (_MSC_VER) 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #pragma warning(push) 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #pragma warning(disable:4127) // disable "conditional expression is constant" 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (false) { 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun implicit_cast<From*, To>(0); 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (_MSC_VER) 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #pragma warning(pop) 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// The following code is the only place for RTTI. It is done so to allow 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// additional type checking when SFNTLY_TYPE_VERIFICATION is defined. 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (SFNTLY_TYPE_VERIFICATION) 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun assert(f == NULL || dynamic_cast<To>(f) != NULL); 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return static_cast<To>(f); 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if !defined(WIN32) 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define UNREFERENCED_PARAMETER(p) do { (void)p; } while (0) 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // SFNTLY_CPP_SRC_SFNTLY_PORT_TYPE_H_ 103