/*
 * Copyright 2017 Google Inc. 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 TestDictionary_h
#define TestDictionary_h

#include <string>

#include "base/optional.h"
#include "cobalt/script/script_value.h"
#include "cobalt/script/sequence.h"
#include "cobalt/script/value_handle.h"
#include "cobalt/bindings/testing/arbitrary_interface.h"

using cobalt::bindings::testing::ArbitraryInterface;

namespace cobalt {
namespace bindings {
namespace testing {

class TestDictionary {
 public:
  TestDictionary() {
    has_boolean_member_ = false;
    boolean_member_ = bool();
    has_short_clamp_member_ = false;
    short_clamp_member_ = int16_t();
    has_long_member_ = false;
    long_member_ = int32_t();
    has_double_member_ = false;
    double_member_ = double();
    has_string_member_ = false;
    string_member_ = std::string();
    has_interface_member_ = false;
    interface_member_ = scoped_refptr<ArbitraryInterface>();
    member_with_default_ = 5;
    has_non_default_member_ = false;
    non_default_member_ = int32_t();
    has_any_member_ = false;
  }

  TestDictionary(const TestDictionary& other) {
    has_boolean_member_ = other.has_boolean_member_;
    boolean_member_ = other.boolean_member_;
    has_short_clamp_member_ = other.has_short_clamp_member_;
    short_clamp_member_ = other.short_clamp_member_;
    has_long_member_ = other.has_long_member_;
    long_member_ = other.long_member_;
    has_double_member_ = other.has_double_member_;
    double_member_ = other.double_member_;
    has_string_member_ = other.has_string_member_;
    string_member_ = other.string_member_;
    has_interface_member_ = other.has_interface_member_;
    interface_member_ = other.interface_member_;
    member_with_default_ = other.member_with_default_;
    has_non_default_member_ = other.has_non_default_member_;
    non_default_member_ = other.non_default_member_;
    if (other.any_member_with_default_) {
      any_member_with_default_.reset(
          new script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference(
              other.any_member_with_default_->referenced_value()));
    }
    has_any_member_ = other.has_any_member_;
    if (other.any_member_) {
      any_member_.reset(
          new script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference(
              other.any_member_->referenced_value()));
    }
  }

  TestDictionary& operator=(const TestDictionary& other) {
    has_boolean_member_ = other.has_boolean_member_;
    boolean_member_ = other.boolean_member_;
    has_short_clamp_member_ = other.has_short_clamp_member_;
    short_clamp_member_ = other.short_clamp_member_;
    has_long_member_ = other.has_long_member_;
    long_member_ = other.long_member_;
    has_double_member_ = other.has_double_member_;
    double_member_ = other.double_member_;
    has_string_member_ = other.has_string_member_;
    string_member_ = other.string_member_;
    has_interface_member_ = other.has_interface_member_;
    interface_member_ = other.interface_member_;
    member_with_default_ = other.member_with_default_;
    has_non_default_member_ = other.has_non_default_member_;
    non_default_member_ = other.non_default_member_;
    if (other.any_member_with_default_) {
      any_member_with_default_.reset(
          new script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference(
                other.any_member_with_default_->referenced_value()));
    } else {
      any_member_with_default_.reset();
    }
    has_any_member_ = other.has_any_member_;
    if (other.any_member_) {
      any_member_.reset(
          new script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference(
                other.any_member_->referenced_value()));
    } else {
      any_member_.reset();
    }
    return *this;
  }

  bool has_boolean_member() const {
    return has_boolean_member_;
  }
  bool boolean_member() const {
    DCHECK(has_boolean_member_);
    return boolean_member_;
  }
  void set_boolean_member(bool value) {
    has_boolean_member_ = true;
    boolean_member_ = value;
  }

  bool has_short_clamp_member() const {
    return has_short_clamp_member_;
  }
  int16_t short_clamp_member() const {
    DCHECK(has_short_clamp_member_);
    return short_clamp_member_;
  }
  void set_short_clamp_member(int16_t value) {
    has_short_clamp_member_ = true;
    short_clamp_member_ = value;
  }

  bool has_long_member() const {
    return has_long_member_;
  }
  int32_t long_member() const {
    DCHECK(has_long_member_);
    return long_member_;
  }
  void set_long_member(int32_t value) {
    has_long_member_ = true;
    long_member_ = value;
  }

  bool has_double_member() const {
    return has_double_member_;
  }
  double double_member() const {
    DCHECK(has_double_member_);
    return double_member_;
  }
  void set_double_member(double value) {
    has_double_member_ = true;
    double_member_ = value;
  }

  bool has_string_member() const {
    return has_string_member_;
  }
  const std::string& string_member() const {
    DCHECK(has_string_member_);
    return string_member_;
  }
  void set_string_member(const std::string& value) {
    has_string_member_ = true;
    string_member_ = value;
  }

  bool has_interface_member() const {
    return has_interface_member_;
  }
  const scoped_refptr<ArbitraryInterface>& interface_member() const {
    DCHECK(has_interface_member_);
    return interface_member_;
  }
  void set_interface_member(const scoped_refptr<ArbitraryInterface>& value) {
    has_interface_member_ = true;
    interface_member_ = value;
  }

  bool has_member_with_default() const {
    return true;
  }
  int32_t member_with_default() const {
    return member_with_default_;
  }
  void set_member_with_default(int32_t value) {
    member_with_default_ = value;
  }

  bool has_non_default_member() const {
    return has_non_default_member_;
  }
  int32_t non_default_member() const {
    DCHECK(has_non_default_member_);
    return non_default_member_;
  }
  void set_non_default_member(int32_t value) {
    has_non_default_member_ = true;
    non_default_member_ = value;
  }

  bool has_any_member_with_default() const {
    return true;
  }
  const ::cobalt::script::ScriptValue<::cobalt::script::ValueHandle>* any_member_with_default() const {
    if (!any_member_with_default_) {
      return NULL;
    }
    return &(any_member_with_default_->referenced_value());
  }
  void set_any_member_with_default(const ::cobalt::script::ScriptValue<::cobalt::script::ValueHandle>* value) {
    if (value) {
      any_member_with_default_.reset(
          new script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference(*value));
    } else {
      any_member_with_default_.reset();
    }
  }

  bool has_any_member() const {
    return has_any_member_;
  }
  const ::cobalt::script::ScriptValue<::cobalt::script::ValueHandle>* any_member() const {
    DCHECK(has_any_member_);
    if (!any_member_) {
      return NULL;
    }
    return &(any_member_->referenced_value());
  }
  void set_any_member(const ::cobalt::script::ScriptValue<::cobalt::script::ValueHandle>* value) {
    has_any_member_ = true;
    if (value) {
      any_member_.reset(
          new script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference(*value));
    } else {
      any_member_.reset();
    }
  }

 private:
  bool has_boolean_member_;
  bool boolean_member_;
  bool has_short_clamp_member_;
  int16_t short_clamp_member_;
  bool has_long_member_;
  int32_t long_member_;
  bool has_double_member_;
  double double_member_;
  bool has_string_member_;
  std::string string_member_;
  bool has_interface_member_;
  scoped_refptr<ArbitraryInterface> interface_member_;
  int32_t member_with_default_;
  bool has_non_default_member_;
  int32_t non_default_member_;
  scoped_ptr<script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference> any_member_with_default_;
  bool has_any_member_;
  scoped_ptr<script::ScriptValue<::cobalt::script::ValueHandle>::StrongReference> any_member_;
};

// 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::TestDictionary& in) {
  UNREFERENCED_PARAMETER(in);
  stream << "[TestDictionary]";
  return stream;
}

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

#endif  // TestDictionary_h
