/* * Copyright (C) 2018 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 ANDROID_APEXD_STRING_LOG_H_ #define ANDROID_APEXD_STRING_LOG_H_ // Simple helper class to create strings similar to LOGs. // Usage sample: // std::string msg = StringLog() << "Hello " << std::hex << 1234; #include <cstring> #include <iomanip> #include <iostream> #include <sstream> #include <errno.h> template <typename T> class BaseStringLog { public: BaseStringLog() {} // Pipe in values. template <class U> T& operator<<(const U& t) { os_stream << t; return static_cast<T&>(*this); } // Pipe in modifiers. T& operator<<(std::ostream& (*f)(std::ostream&)) { os_stream << f; return static_cast<T&>(*this); } // Get the current string. // NOLINTNEXTLINE(google-explicit-constructor) operator std::string() const { return os_stream.str(); } private: std::ostringstream os_stream; }; class StringLog : public BaseStringLog<StringLog> {}; class PStringLog : public BaseStringLog<PStringLog> { public: PStringLog() : errno_(errno) {} // Get the current string. // NOLINTNEXTLINE(google-explicit-constructor) operator std::string() const { return (BaseStringLog::operator std::string()) .append(": ") .append(strerror(errno_)); } private: int errno_; }; #endif // ANDROID_APEXD_STRING_LOG_H_