1bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi/* 2bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Copyright (C) 2017 The Android Open Source Project 3bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * 4bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Licensed under the Apache License, Version 2.0 (the "License"); 5bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * you may not use this file except in compliance with the License. 6bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * You may obtain a copy of the License at 7bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * 8bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * http://www.apache.org/licenses/LICENSE-2.0 9bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * 10bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * Unless required by applicable law or agreed to in writing, software 11bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * distributed under the License is distributed on an "AS IS" BASIS, 12bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * See the License for the specific language governing permissions and 14bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi * limitations under the License. 15bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi */ 16bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 17bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#ifndef LIBTEXTCLASSIFIER_BASE_H_ 18bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define LIBTEXTCLASSIFIER_BASE_H_ 19bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 20bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <cassert> 21bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <map> 22bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <string> 23bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <vector> 24bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 25bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include "util/base/config.h" 26bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include "util/base/integral_types.h" 27bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 28bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifinamespace libtextclassifier { 29bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 30bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#ifdef INTERNAL_BUILD 31bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifitypedef basic_string<char> bstring; 32bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#else 33bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifitypedef std::basic_string<char> bstring; 34bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif // INTERNAL_BUILD 35bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 36bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#if defined OS_LINUX || defined OS_CYGWIN || defined OS_ANDROID || \ 37bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi defined(__ANDROID__) 38bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <endian.h> 39bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif 40bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 41bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// The following guarantees declaration of the byte swap functions, and 42bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// defines __BYTE_ORDER for MSVC 43bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#if defined(__GLIBC__) || defined(__CYGWIN__) 44bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#include <byteswap.h> // IWYU pragma: export 45bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 46bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#else 47bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define GG_LONGLONG(x) x##LL 48bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define GG_ULONGLONG(x) x##ULL 49bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifistatic inline uint16 bswap_16(uint16 x) { 50bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi return (uint16)(((x & 0xFF) << 8) | ((x & 0xFF00) >> 8)); // NOLINT 51bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi} 52bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define bswap_16(x) bswap_16(x) 53bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifistatic inline uint32 bswap_32(uint32 x) { 54bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi return (((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) | 55bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & 0xFF000000) >> 24)); 56bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi} 57bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define bswap_32(x) bswap_32(x) 58bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifistatic inline uint64 bswap_64(uint64 x) { 59bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi return (((x & GG_ULONGLONG(0xFF)) << 56) | 60bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & GG_ULONGLONG(0xFF00)) << 40) | 61bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & GG_ULONGLONG(0xFF0000)) << 24) | 62bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & GG_ULONGLONG(0xFF000000)) << 8) | 63bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & GG_ULONGLONG(0xFF00000000)) >> 8) | 64bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & GG_ULONGLONG(0xFF0000000000)) >> 24) | 65bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & GG_ULONGLONG(0xFF000000000000)) >> 40) | 66bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi ((x & GG_ULONGLONG(0xFF00000000000000)) >> 56)); 67bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi} 68bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define bswap_64(x) bswap_64(x) 69bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif 70bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 71bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// define the macros IS_LITTLE_ENDIAN or IS_BIG_ENDIAN 72bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// using the above endian definitions from endian.h if 73bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// endian.h was included 74bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#ifdef __BYTE_ORDER 75bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#if __BYTE_ORDER == __LITTLE_ENDIAN 76bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define IS_LITTLE_ENDIAN 77bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif 78bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 79bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#if __BYTE_ORDER == __BIG_ENDIAN 80bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define IS_BIG_ENDIAN 81bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif 82bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 83bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#else 84bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 85bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#if defined(__LITTLE_ENDIAN__) 86bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define IS_LITTLE_ENDIAN 87bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#elif defined(__BIG_ENDIAN__) 88bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#define IS_BIG_ENDIAN 89bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif 90bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 91bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// there is also PDP endian ... 92bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 93bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif // __BYTE_ORDER 94bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 95bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharificlass LittleEndian { 96bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi public: 97bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi// Conversion functions. 98bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#ifdef IS_LITTLE_ENDIAN 99bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 100bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint16 FromHost16(uint16 x) { return x; } 101bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint16 ToHost16(uint16 x) { return x; } 102bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 103bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint32 FromHost32(uint32 x) { return x; } 104bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint32 ToHost32(uint32 x) { return x; } 105bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 106bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint64 FromHost64(uint64 x) { return x; } 107bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint64 ToHost64(uint64 x) { return x; } 108bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 109bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static bool IsLittleEndian() { return true; } 110bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 111bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#elif defined IS_BIG_ENDIAN 112bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 113bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint16 FromHost16(uint16 x) { return gbswap_16(x); } 114bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint16 ToHost16(uint16 x) { return gbswap_16(x); } 115bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 116bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint32 FromHost32(uint32 x) { return gbswap_32(x); } 117bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint32 ToHost32(uint32 x) { return gbswap_32(x); } 118bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 119bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint64 FromHost64(uint64 x) { return gbswap_64(x); } 120bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static uint64 ToHost64(uint64 x) { return gbswap_64(x); } 121bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 122bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi static bool IsLittleEndian() { return false; } 123bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 124bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif /* ENDIAN */ 125bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi}; 126bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 127bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi} // namespace libtextclassifier 128bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi 129bda09f1da39ce38a5ece4757b82a64776e53214cMatt Sharifi#endif // LIBTEXTCLASSIFIER_BASE_H_ 130