// // Copyright 2020 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // InfoLog.h: Defines the gl::InfoLog class to handle the logs generated when // compiling/linking shaders so useful error messages can be returned to the caller. #ifndef LIBANGLE_INFOLOG_H_ #define LIBANGLE_INFOLOG_H_ namespace gl { class InfoLog : angle::NonCopyable { public: InfoLog(); ~InfoLog(); size_t getLength() const; void getLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; void appendSanitized(const char *message); void reset(); // This helper class ensures we append a newline after writing a line. class StreamHelper : angle::NonCopyable { public: StreamHelper(StreamHelper &&rhs) : mStream(rhs.mStream) { rhs.mStream = nullptr; } StreamHelper &operator=(StreamHelper &&rhs) { std::swap(mStream, rhs.mStream); return *this; } ~StreamHelper() { // Write newline when destroyed on the stack if (mStream && !mStream->str().empty()) { (*mStream) << std::endl; } } template StreamHelper &operator<<(const T &value) { (*mStream) << value; return *this; } private: friend class InfoLog; StreamHelper(std::stringstream *stream) : mStream(stream) { ASSERT(stream); } std::stringstream *mStream; }; template StreamHelper operator<<(const T &value) { ensureInitialized(); StreamHelper helper(mLazyStream.get()); helper << value; return helper; } std::string str() const { return mLazyStream ? mLazyStream->str() : ""; } bool empty() const; private: void ensureInitialized() { if (!mLazyStream) { mLazyStream.reset(new std::stringstream()); } } std::unique_ptr mLazyStream; }; } // namespace gl #endif // LIBANGLE_INFOLOG_H_