| // Copyright 2020 The Tint Authors | |
| // | |
| // 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 SRC_READER_SPIRV_FAIL_STREAM_H_ | |
| #define SRC_READER_SPIRV_FAIL_STREAM_H_ | |
| #include <ostream> | |
| namespace tint { | |
| namespace reader { | |
| namespace spirv { | |
| /// A FailStream object accumulates values onto a given std::ostream, | |
| /// and can be used to record failure by writing the false value | |
| /// to given a pointer-to-bool. | |
| class FailStream { | |
| public: | |
| /// Creates a new fail stream | |
| /// @param status_ptr where we will write false to indicate failure. Assumed | |
| /// to be a valid pointer to bool. | |
| /// @param out output stream where a message should be written to explain | |
| /// the failure | |
| FailStream(bool* status_ptr, std::ostream* out) | |
| : status_ptr_(status_ptr), out_(out) {} | |
| /// Copy constructor | |
| /// @param other the fail stream to clone | |
| FailStream(const FailStream& other) = default; | |
| /// Converts to a boolean status. A true result indicates success, | |
| /// and a false result indicates failure. | |
| /// @returns the status | |
| operator bool() const { return *status_ptr_; } | |
| /// Returns the current status value. This can be more readable | |
| /// the conversion operator. | |
| /// @returns the status | |
| bool status() const { return *status_ptr_; } | |
| /// Records failure. | |
| /// @returns a FailStream | |
| FailStream& Fail() { | |
| *status_ptr_ = false; | |
| return *this; | |
| } | |
| /// Appends the given value to the message output stream. | |
| /// @param val the value to write to the output stream. | |
| /// @returns this object | |
| template <typename T> | |
| FailStream& operator<<(const T& val) { | |
| *out_ << val; | |
| return *this; | |
| } | |
| private: | |
| bool* status_ptr_; | |
| std::ostream* out_; | |
| }; | |
| } // namespace spirv | |
| } // namespace reader | |
| } // namespace tint | |
| #endif // SRC_READER_SPIRV_FAIL_STREAM_H_ |