14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// compat.h
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Licensed under the Apache License, Version 2.0 (the "License");
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// you may not use this file except in compliance with the License.
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// You may obtain a copy of the License at
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//      http://www.apache.org/licenses/LICENSE-2.0
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Unless required by applicable law or agreed to in writing, software
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// distributed under the License is distributed on an "AS IS" BASIS,
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// See the License for the specific language governing permissions and
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// limitations under the License.
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// \file
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Google compatibility declarations and inline definitions.
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef FST_COMPAT_H__
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FST_COMPAT_H__
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// for STL
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <cassert>
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <cstdio>
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <iostream>
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <map>
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string>
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <vector>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <ext/hash_map>
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <fcntl.h>
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <pthread.h>
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sys/stat.h>
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sys/types.h>
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <unistd.h>
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// exact size types
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef short int16;
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef int int32;
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef long long int64;
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef unsigned short uint16;
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef unsigned int uint32;
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef unsigned long long uint64;
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectusing namespace std;
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// make copy constructor and operator= private
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DISALLOW_EVIL_CONSTRUCTORS(type)    \
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  type(const type&);                        \
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void operator=(const type&)
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// thread control
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass Mutex {
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public:
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  Mutex();
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private:
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  DISALLOW_EVIL_CONSTRUCTORS(Mutex);
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass MutexLock {
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public:
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MutexLock(Mutex *);
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private:
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  DISALLOW_EVIL_CONSTRUCTORS(MutexLock);
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// flags
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DECLARE_bool(name) extern bool FLAGS_ ## name
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DECLARE_string(name) extern string FLAGS_ ## name
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DECLARE_int32(name) extern int32 FLAGS_ ## name
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DECLARE_int64(name) extern int64 FLAGS_ ## name
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DECLARE_double(name) extern double FLAGS_ ## name
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <typename T>
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstruct FlagDescription {
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FlagDescription(T *addr, const char *doc, const char *type, const T val)
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      : address(addr), doc_string(doc), type_name(type), default_value(val) {}
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  T *address;
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const char *doc_string;
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const char *type_name;
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const T default_value;
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <typename T>
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass FlagRegister {
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public:
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static FlagRegister<T> *GetRegister() {
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pthread_once(&register_init_, &FlagRegister<T>::Init);
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return register_;
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const FlagDescription<T> &GetFlagDescription(const string &name) const {
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    MutexLock l(register_lock_);
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    typename map< string, FlagDescription<T> >::const_iterator it =
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      flag_table_.find(name);
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return it != flag_table_.end() ? it->second : 0;
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void SetDescription(const string &name, const FlagDescription<T> &desc) {
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    MutexLock l(register_lock_);
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    flag_table_.insert(make_pair(name, desc));
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool SetFlag(const string &val, bool *address) const {
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (val == "true" || val == "1" || val.empty()) {
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *address = true;
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return true;
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } else if (val == "false" || val == "0") {
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *address = false;
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return true;
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else {
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return false;
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool SetFlag(const string &val, string *address) const {
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *address = val;
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool SetFlag(const string &val, int32 *address) const {
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    char *p = 0;
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *address = strtol(val.c_str(), &p, 0);
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return !val.empty() && *p == '\0';
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool SetFlag(const string &val, int64 *address) const {
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    char *p = 0;
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *address = strtoll(val.c_str(), &p, 0);
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return !val.empty() && *p == '\0';
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool SetFlag(const string &val, double *address) const {
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    char *p = 0;
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *address = strtod(val.c_str(), &p);
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return !val.empty() && *p == '\0';
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool InitFlag(const string &arg, const string &val) const {
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (typename map< string, FlagDescription<T> >::const_iterator it =
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           flag_table_.begin();
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         it != flag_table_.end();
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         ++it) {
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      const string &name = it->first;
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      const FlagDescription<T> &desc = it->second;
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (arg == name)
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return SetFlag(val, desc.address);
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return false;
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void ShowDefault(bool default_value) const {
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << ", default = ";
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << (default_value ? "true" : "false");
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void ShowDefault(const string &default_value) const {
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << ", default = ";
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << "\"" << default_value << "\"";
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  template<typename V> void ShowDefault(const V& default_value) const {
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << ", default = ";
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << default_value;
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void ShowUsage() const {
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (typename map< string, FlagDescription<T> >::const_iterator it =
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           flag_table_.begin();
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         it != flag_table_.end();
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         ++it) {
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      const string &name = it->first;
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      const FlagDescription<T> &desc = it->second;
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      std::cout << "    --" << name
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           << ": type = " << desc.type_name;
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ShowDefault(desc.default_value);
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      std::cout << "\n      " << desc.doc_string  << "\n";
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private:
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static void Init() {
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    register_lock_ = new Mutex;
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    register_ = new FlagRegister<T>;
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static pthread_once_t register_init_;   // ensures only called once
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static Mutex* register_lock_;           // multithreading lock
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static FlagRegister<T> *register_;
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  map< string, FlagDescription<T> > flag_table_;
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class T>
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectpthread_once_t FlagRegister<T>::register_init_ = PTHREAD_ONCE_INIT;
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class T>
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectMutex *FlagRegister<T>::register_lock_ = 0;
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class T>
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectFlagRegister<T> *FlagRegister<T>::register_ = 0;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <typename T>
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass FlagRegisterer {
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public:
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FlagRegisterer(const string &name, const FlagDescription<T> &desc) {
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FlagRegister<T> *registr = FlagRegister<T>::GetRegister();
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    registr->SetDescription(name, desc);
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private:
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  DISALLOW_EVIL_CONSTRUCTORS(FlagRegisterer);
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEFINE_VAR(type, name, value, doc)                                \
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  type FLAGS_ ## name = value;                                            \
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static FlagRegisterer<type>                                             \
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  name ## _flags_registerer(#name, FlagDescription<type>(&FLAGS_ ## name, \
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                                         doc,             \
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                                         #type,           \
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                                         value))
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEFINE_bool(name, value, doc) DEFINE_VAR(bool, name, value, doc)
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEFINE_string(name, value, doc) DEFINE_VAR(string, name, value, doc)
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEFINE_int32(name, value, doc) DEFINE_VAR(int32, name, value, doc)
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEFINE_int64(name, value, doc) DEFINE_VAR(int64, name, value, doc)
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEFINE_double(name, value, doc) DEFINE_VAR(double, name, value, doc)
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid InitFst(const char *usage, int *argc, char ***argv, bool remove_flags);
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid ShowUsage();
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// checking
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CHECK(x) assert(x)
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CHECK_EQ(x, y) assert((x) == (y))
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// logging
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDECLARE_int32(v);
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// tmp directory
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDECLARE_string(tmpdir);
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass LogMessage {
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public:
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LogMessage(const string &type) : fatal_(type == "FATAL") {
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cerr << type << ": ";
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ~LogMessage() {
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cerr << endl;
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(fatal_)
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      exit(1);
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ostream &stream() { return std::cerr; }
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private:
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool fatal_;
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LOG(type) LogMessage(#type).stream()
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define VLOG(level) if ((level) <= FLAGS_v) LOG(INFO)
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// string utilities
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SplitToVector(char *line, const char *delim,
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                   vector<char *> *vec, bool omit_empty_strings);
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Downcasting
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate<typename To, typename From>
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectinline To down_cast(From* f) {
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return static_cast<To>(f);
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Bitcasting
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class Dest, class Source>
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectinline Dest bit_cast(const Source& source) {
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // Compile time assertion: sizeof(Dest) == sizeof(Source)
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // A compile error here means your Dest and Source have different sizes.
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 :
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    -1];
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  Dest dest;
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  memcpy(&dest, &source, sizeof(dest));
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return dest;
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// MD5 checksums
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass MD5 {
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public:
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MD5();
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void Reset();
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void Update(void const *data, int size);
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  string Digest();
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private:
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  DISALLOW_EVIL_CONSTRUCTORS(MD5);
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Hashing functions
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnamespace __gnu_cxx {
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate<> struct hash<int64> {
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t operator()(int64 x) const {
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return x;
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate<> struct hash<string> {
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t operator()(const string &s) const {
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return __stl_hash_string(s.c_str());
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}  // namespace __gnu_cxx
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif  // FST_COMPAT_H__
315