14df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni/* 24df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Copyright 2017, The Android Open Source Project 34df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * 44df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Licensed under the Apache License, Version 2.0 (the "License"); 54df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * you may not use this file except in compliance with the License. 64df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * You may obtain a copy of the License at 74df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * 84df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * http://www.apache.org/licenses/LICENSE-2.0 94df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * 104df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Unless required by applicable law or agreed to in writing, software 114df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * distributed under the License is distributed on an "AS IS" BASIS, 124df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * See the License for the specific language governing permissions and 144df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * limitations under the License. 154df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni */ 164df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 174df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#ifndef FILE_UTILS_H 184df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#define FILE_UTILS_H 194df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 204df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include <fstream> 214df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include <iostream> 224df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include <memory> 234df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include <vector> 244df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 254df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace android { 264df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace spirit { 274df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 284df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nitemplate <typename T> std::vector<T> readFile(const char *filename) { 294df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni std::ifstream ifs; 304df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni std::filebuf *fb = ifs.rdbuf(); 314df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni fb->open(filename, std::ios::in); 324df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 334df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni if (!fb->is_open()) { 344df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni std::cerr << "failed opening " << filename << std::endl; 354df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni return std::vector<T>(); 364df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni } 374df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 384df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni ifs.seekg(0, ifs.end); 394df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni int length = ifs.tellg(); 404df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni ifs.seekg(0, ifs.beg); 414df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 424df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni std::vector<T> ret(length / sizeof(T)); 434df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 444df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni ifs.read((char *)ret.data(), length); 454df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 464df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni fb->close(); 474df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 484df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni return ret; 494df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} 504df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 514df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nitemplate <typename T> std::vector<T> readFile(const std::string &filename) { 524df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni return readFile<T>(filename.c_str()); 534df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} 544df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 554df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nitemplate <typename T> 564df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nivoid writeFile(const char *filename, const std::vector<T> &data) { 574df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni std::ofstream ofs(filename, std::ios::out); 584df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 594df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni ofs.write(reinterpret_cast<const char *>(data.data()), 604df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni sizeof(T) * data.size()); 614df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} 624df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 634df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace spirit 644df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace android 654df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 664df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#endif // FILE_UTILS_H 67