// 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_SPV_FAIL_STREAM_H_
#define SRC_READER_SPV_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_SPV_FAIL_STREAM_H_
