1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// compat.h 2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Licensed under the Apache License, Version 2.0 (the "License"); 4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you may not use this file except in compliance with the License. 5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// You may obtain a copy of the License at 6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// http://www.apache.org/licenses/LICENSE-2.0 8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Unless required by applicable law or agreed to in writing, software 10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// distributed under the License is distributed on an "AS IS" BASIS, 11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See the License for the specific language governing permissions and 13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// limitations under the License. 14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Author: riley@google.com (Michael Riley) 16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// \file 18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Google compatibility declarations and inline definitions. 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_LIB_COMPAT_H__ 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_LIB_COMPAT_H__ 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <dlfcn.h> 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <climits> 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <cstdlib> 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <cstring> 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <iostream> 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <string> 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <vector> 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Makes copy constructor and operator= private 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define DISALLOW_COPY_AND_ASSIGN(type) \ 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson type(const type&); \ 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void operator=(const type&) 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/config.h> 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/types.h> 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/lock.h> 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/flags.h> 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/log.h> 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifdef HAVE_ICU 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/icu.h> 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::cin; 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::cout; 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::cerr; 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::endl; 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::string; 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid FailedNewHandler(); 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing namespace std; 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid SplitToVector(char *line, const char *delim, 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson std::vector<char *> *vec, bool omit_empty_strings); 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Downcasting 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<typename To, typename From> 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoninline To down_cast(From* f) { 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return static_cast<To>(f); 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Bitcasting 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class Dest, class Source> 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoninline Dest bit_cast(const Source& source) { 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Compile time assertion: sizeof(Dest) == sizeof(Source) 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // A compile error here means your Dest and Source have different sizes. 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 : 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -1]; 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Dest dest; 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson memcpy(&dest, &source, sizeof(dest)); 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return dest; 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Check sums 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass CheckSummer { 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson CheckSummer() : count_(0) { 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson check_sum_.resize(kCheckSumLength, '\0'); 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Reset() { 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson count_ = 0; 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (int i = 0; i < kCheckSumLength; ++i) 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson check_sum_[0] = '\0'; 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Update(void const *data, int size) { 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const char *p = reinterpret_cast<const char *>(data); 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (int i = 0; i < size; ++i) 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson check_sum_[(count_++) % kCheckSumLength] ^= p[i]; 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Update(string const &data) { 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (int i = 0; i < data.size(); ++i) 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson check_sum_[(count_++) % kCheckSumLength] ^= data[i]; 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string Digest() { 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return check_sum_; 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson static const int kCheckSumLength = 32; 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int count_; 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string check_sum_; 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(CheckSummer); 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Define the UTF8 string conversion function to throw an error 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// when the ICU Library is missing or disabled. 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef HAVE_ICU 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class Label> 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonbool UTF8StringToLabels(const string&, std::vector<Label>*) { 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(ERROR) << "UTF8StringToLabels: ICU Library required for UTF8 handling"; 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return false; 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class Label> 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonbool LabelsToUTF8String(const std::vector<Label>&, string*) { 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(ERROR) << "LabelsToUTF8String: ICU Library required for UTF8 handling"; 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return false; 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // HAVE_ICU 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Define missing hash functions if needed 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace std { 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace tr1 { 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class T> class hash; 143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<> struct hash<uint64> { 145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t operator()(uint64 x) const { return x; } 146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ 151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_LIB_COMPAT_H__ 153