// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// 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.

// clang-format off

// This file has been auto-generated by bindings/code_generator_cobalt.py. DO NOT MODIFY!
// Auto-generated from template: bindings/templates/dictionary.h.template

#ifndef DictionaryWithDictionaryMember_h
#define DictionaryWithDictionaryMember_h

#include <string>

#include "base/optional.h"
#include "cobalt/script/array_buffer.h"
#include "cobalt/script/array_buffer_view.h"
#include "cobalt/script/script_value.h"
#include "cobalt/script/sequence.h"
#include "cobalt/script/typed_arrays.h"
#include "cobalt/script/value_handle.h"
#include "cobalt/bindings/testing/test_dictionary.h"

using cobalt::bindings::testing::TestDictionary;

namespace cobalt {
namespace bindings {
namespace testing {

class DictionaryWithDictionaryMember {
 public:
  DictionaryWithDictionaryMember() {
    has_nested_dictionary_ = false;
    nested_dictionary_ = TestDictionary();
  }

  DictionaryWithDictionaryMember(const DictionaryWithDictionaryMember& other) {
    has_nested_dictionary_ = other.has_nested_dictionary_;
    nested_dictionary_ = other.nested_dictionary_;
  }

  DictionaryWithDictionaryMember& operator=(const DictionaryWithDictionaryMember& other) {
    has_nested_dictionary_ = other.has_nested_dictionary_;
    nested_dictionary_ = other.nested_dictionary_;
    return *this;
  }

  bool has_nested_dictionary() const {
    return has_nested_dictionary_;
  }
  TestDictionary nested_dictionary() const {
    DCHECK(has_nested_dictionary_);
    return nested_dictionary_;
  }
  void set_nested_dictionary(TestDictionary value) {
    has_nested_dictionary_ = true;
    nested_dictionary_ = value;
  }


 private:
  bool has_nested_dictionary_;
  TestDictionary nested_dictionary_;
};

// This ostream override is necessary for MOCK_METHODs commonly used
// in idl test code
inline std::ostream& operator<<(
    std::ostream& stream, const cobalt::bindings::testing::DictionaryWithDictionaryMember& in) {
  SB_UNREFERENCED_PARAMETER(in);
  stream << "[DictionaryWithDictionaryMember]";
  return stream;
}

}  // namespace cobalt
}  // namespace bindings
}  // namespace testing

#endif  // DictionaryWithDictionaryMember_h
