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#include <fst/icu.h> 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::cin; 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::cout; 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::cerr; 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::endl; 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::string; 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid FailedNewHandler(); 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing namespace std; 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid SplitToVector(char *line, const char *delim, 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson std::vector<char *> *vec, bool omit_empty_strings); 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Downcasting 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<typename To, typename From> 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoninline To down_cast(From* f) { 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return static_cast<To>(f); 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Bitcasting 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class Dest, class Source> 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoninline Dest bit_cast(const Source& source) { 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Compile time assertion: sizeof(Dest) == sizeof(Source) 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // A compile error here means your Dest and Source have different sizes. 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 : 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -1]; 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Dest dest; 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson memcpy(&dest, &source, sizeof(dest)); 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return dest; 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Check sums 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass CheckSummer { 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson CheckSummer() : count_(0) { 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson check_sum_.resize(kCheckSumLength, '\0'); 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Reset() { 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson count_ = 0; 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (int i = 0; i < kCheckSumLength; ++i) 87dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin check_sum_[i] = '\0'; 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Update(void const *data, int size) { 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const char *p = reinterpret_cast<const char *>(data); 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (int i = 0; i < size; ++i) 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson check_sum_[(count_++) % kCheckSumLength] ^= p[i]; 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Update(string const &data) { 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (int i = 0; i < data.size(); ++i) 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson check_sum_[(count_++) % kCheckSumLength] ^= data[i]; 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string Digest() { 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return check_sum_; 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson static const int kCheckSumLength = 32; 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int count_; 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string check_sum_; 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(CheckSummer); 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Define missing hash functions if needed 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace std { 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace tr1 { 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class T> class hash; 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<> struct hash<uint64> { 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t operator()(uint64 x) const { return x; } 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_LIB_COMPAT_H__ 132