line_reader.cpp revision ef1409302aa97b1807e55c63588ac0a428f41a06
1ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley/* 2ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * Copyright (C) 2015, The Android Open Source Project 3ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * 4ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License"); 5ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * you may not use this file except in compliance with the License. 6ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * You may obtain a copy of the License at 7ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * 8ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * http://www.apache.org/licenses/LICENSE-2.0 9ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * 10ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * Unless required by applicable law or agreed to in writing, software 11ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS, 12ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * See the License for the specific language governing permissions and 14ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * limitations under the License. 15ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley */ 16ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 17ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley#include "line_reader.h" 18ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 19ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley#include <fstream> 20ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley#include <sstream> 21ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 22ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::istringstream; 23ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::ifstream; 24ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::string; 25ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::unique_ptr; 26ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 27ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileynamespace android { 28ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileynamespace aidl { 29ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 30ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyclass FileLineReader : public LineReader { 31ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley public: 32ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley FileLineReader() = default; 33ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley virtual ~FileLineReader() { 34ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley input_stream_.close(); 35ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley } 36ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 37ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley bool Init(const std::string& file_path) { 38ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley input_stream_.open(file_path, ifstream::in | ifstream::binary); 39ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley return input_stream_.is_open() && input_stream_.good(); 40ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley } 41ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 42ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley bool ReadLine(string* line) override { 43ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley if (!input_stream_.good()) { 44ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley return false; 45ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley } 46ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley line->clear(); 47ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley std::getline(input_stream_, *line); 48ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley return true; 49ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley } 50ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 51ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley private: 52ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley ifstream input_stream_; 53ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 54ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley DISALLOW_COPY_AND_ASSIGN(FileLineReader); 55ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}; // class FileLineReader 56ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 57ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyclass MemoryLineReader : public LineReader { 58ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley public: 59ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley MemoryLineReader(const string& contents) : input_stream_(contents) {} 60ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley virtual ~MemoryLineReader() = default; 61ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 62ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley bool ReadLine(string* line) override { 63ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley if (!input_stream_.good()) { 64ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley return false; 65ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley } 66ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley line->clear(); 67ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley std::getline(input_stream_, *line); 68ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley return true; 69ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley } 70ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 71ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley private: 72ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley istringstream input_stream_; 73ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 74ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley DISALLOW_COPY_AND_ASSIGN(MemoryLineReader); 75ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}; // class MemoryLineReader 76ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 77ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyunique_ptr<LineReader> LineReader::ReadFromFile(const string& file_path) { 78ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley unique_ptr<FileLineReader> file_reader(new FileLineReader()); 79ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley unique_ptr<LineReader> ret; 80ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley if (file_reader->Init(file_path)) { 81ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley ret.reset(file_reader.release()); 82ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley } 83ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley return ret; 84ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley} 85ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 86ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyunique_ptr<LineReader> LineReader::ReadFromMemory(const string& contents) { 87ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley return unique_ptr<LineReader>(new MemoryLineReader(contents)); 88ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley} 89ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley 90ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley} // namespace android 91ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley} // namespace aidl 92