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