blob: dedca20c2fcebfabb71ed41387d10a9935570bd4 [file] [log] [blame]
Christopher Wileyef140932015-11-03 09:29:19 -08001/*
2 * Copyright (C) 2015, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "line_reader.h"
18
19#include <fstream>
20#include <sstream>
21
22using std::istringstream;
23using std::ifstream;
24using std::string;
25using std::unique_ptr;
26
27namespace android {
28namespace aidl {
29
30class FileLineReader : public LineReader {
31 public:
32 FileLineReader() = default;
Yi Kongde138912019-03-30 01:38:17 -070033 ~FileLineReader() override {
Christopher Wileyef140932015-11-03 09:29:19 -080034 input_stream_.close();
35 }
36
Jiyong Parkd800fef2020-07-22 18:09:43 +090037 // non-copyable, non-movable
38 FileLineReader(const FileLineReader&) = delete;
39 FileLineReader(FileLineReader&&) = delete;
40 FileLineReader& operator=(const FileLineReader&) = delete;
41 FileLineReader& operator=(FileLineReader&&) = delete;
42
Christopher Wileyef140932015-11-03 09:29:19 -080043 bool Init(const std::string& file_path) {
44 input_stream_.open(file_path, ifstream::in | ifstream::binary);
45 return input_stream_.is_open() && input_stream_.good();
46 }
47
48 bool ReadLine(string* line) override {
49 if (!input_stream_.good()) {
50 return false;
51 }
52 line->clear();
53 std::getline(input_stream_, *line);
54 return true;
55 }
56
57 private:
58 ifstream input_stream_;
Christopher Wileyef140932015-11-03 09:29:19 -080059}; // class FileLineReader
60
61class MemoryLineReader : public LineReader {
62 public:
Chih-Hung Hsiehe4fecc72016-04-25 12:04:59 -070063 explicit MemoryLineReader(const string& contents) : input_stream_(contents) {}
Yi Kongde138912019-03-30 01:38:17 -070064 ~MemoryLineReader() override = default;
Christopher Wileyef140932015-11-03 09:29:19 -080065
Jiyong Parkd800fef2020-07-22 18:09:43 +090066 // non-copyable, non-movable
67 MemoryLineReader(const MemoryLineReader&) = delete;
68 MemoryLineReader(MemoryLineReader&&) = delete;
69 MemoryLineReader& operator=(const MemoryLineReader&) = delete;
70 MemoryLineReader& operator=(MemoryLineReader&&) = delete;
71
Christopher Wileyef140932015-11-03 09:29:19 -080072 bool ReadLine(string* line) override {
73 if (!input_stream_.good()) {
74 return false;
75 }
76 line->clear();
77 std::getline(input_stream_, *line);
78 return true;
79 }
80
81 private:
82 istringstream input_stream_;
Christopher Wileyef140932015-11-03 09:29:19 -080083}; // class MemoryLineReader
84
85unique_ptr<LineReader> LineReader::ReadFromFile(const string& file_path) {
86 unique_ptr<FileLineReader> file_reader(new FileLineReader());
87 unique_ptr<LineReader> ret;
88 if (file_reader->Init(file_path)) {
89 ret.reset(file_reader.release());
90 }
91 return ret;
92}
93
94unique_ptr<LineReader> LineReader::ReadFromMemory(const string& contents) {
95 return unique_ptr<LineReader>(new MemoryLineReader(contents));
96}
97
Christopher Wileyef140932015-11-03 09:29:19 -080098} // namespace aidl
Steven Morelandf4c64df2019-07-29 19:54:04 -070099} // namespace android