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