| // |
| // 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) << std::endl; |
| } |
| } |
| |
| template <typename T> |
| 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 <typename T> |
| 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<std::stringstream> mLazyStream; |
| }; |
| |
| } // namespace gl |
| |
| #endif // LIBANGLE_INFOLOG_H_ |