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