|  | /* | 
|  | * Copyright (C) 2017 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | #ifndef FRAMEWORK_NATIVE_CMDS_LSHAL_TEXT_TABLE_H_ | 
|  | #define FRAMEWORK_NATIVE_CMDS_LSHAL_TEXT_TABLE_H_ | 
|  |  | 
|  | #include <iostream> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "TableEntry.h" | 
|  |  | 
|  | namespace android { | 
|  | namespace lshal { | 
|  |  | 
|  | // An element in TextTable. This is either an actual row (an array of cells | 
|  | // in this row), or a string of explanatory text. | 
|  | // To see if this is an actual row, test fields().empty(). | 
|  | class TextTableRow { | 
|  | public: | 
|  | // An empty line. | 
|  | TextTableRow() {} | 
|  |  | 
|  | // A row of cells. | 
|  | TextTableRow(std::vector<std::string>&& v) : mFields(std::move(v)) {} | 
|  |  | 
|  | // A single comment string. | 
|  | TextTableRow(std::string&& s) : mLine(std::move(s)) {} | 
|  | TextTableRow(const std::string& s) : mLine(s) {} | 
|  |  | 
|  | // Whether this row is an actual row of cells. | 
|  | bool isRow() const { return !fields().empty(); } | 
|  |  | 
|  | // Get all cells. | 
|  | const std::vector<std::string>& fields() const { return mFields; } | 
|  |  | 
|  | // Get the single comment string. | 
|  | const std::string& line() const { return mLine; } | 
|  |  | 
|  | private: | 
|  | std::vector<std::string> mFields; | 
|  | std::string mLine; | 
|  | }; | 
|  |  | 
|  | // A TextTable is a 2D array of strings. | 
|  | class TextTable { | 
|  | public: | 
|  |  | 
|  | // Add a TextTableRow. | 
|  | void add() { mTable.emplace_back(); } | 
|  | void add(std::vector<std::string>&& v) { | 
|  | computeWidth(v); | 
|  | mTable.emplace_back(std::move(v)); | 
|  | } | 
|  | void add(const std::string& s) { mTable.emplace_back(s); } | 
|  | void add(std::string&& s) { mTable.emplace_back(std::move(s)); } | 
|  |  | 
|  | // Prints the table to out, with column widths adjusted appropriately according | 
|  | // to the content. | 
|  | void dump(std::ostream& out) const; | 
|  |  | 
|  | private: | 
|  | void computeWidth(const std::vector<std::string>& v); | 
|  | std::vector<size_t> mWidths; | 
|  | std::vector<TextTableRow> mTable; | 
|  | }; | 
|  |  | 
|  | } // namespace lshal | 
|  | } // namespace android | 
|  |  | 
|  | #endif // FRAMEWORK_NATIVE_CMDS_LSHAL_TEXT_TABLE_H_ |