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