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(®ister_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