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