// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file has been auto-generated by {{code_generator}}. DO NOT MODIFY!

#ifndef {{macro_guard}}
#define {{macro_guard}}

{% for filename in header_includes %}
#include "{{filename}}"
{% endfor %}

namespace blink {

{% for decl in header_forward_decls %}
class {{decl}};
{% endfor %}

{% for container in containers %}
class {{container.cpp_class}} final {
    ALLOW_ONLY_INLINE_ALLOCATION();
public:
    {{container.cpp_class}}();
    bool isNull() const { return m_type == SpecificTypeNone; }

    {% for member in container.members %}
    bool is{{member.type_name}}() const { return m_type == {{member.specific_type_enum}}; }
    {{member.rvalue_cpp_type}} getAs{{member.type_name}}();
    void set{{member.type_name}}({{member.rvalue_cpp_type}});

    {% endfor %}
    {% if container.needs_trace %}
    void trace(Visitor*);

    {% endif %}
private:
    enum SpecificTypes {
        SpecificTypeNone,
        {% for member in container.members %}
        {{member.specific_type_enum}},
        {% endfor %}
    };
    SpecificTypes m_type;

    {% for member in container.members %}
    {{member.cpp_type}} m_{{member.cpp_name}};
    {% endfor %}
};

class V8{{container.cpp_class}} final {
public:
    static void toImpl(v8::Isolate*, v8::Handle<v8::Value>, {{container.cpp_class}}&, ExceptionState&);
};

v8::Handle<v8::Value> toV8({{container.cpp_class}}&, v8::Handle<v8::Object>, v8::Isolate*);

template <class CallbackInfo>
inline void v8SetReturnValue(const CallbackInfo& callbackInfo, {{container.cpp_class}}& impl)
{
    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
}

{% endfor %}
} // namespace blink

#endif // {{macro_guard}}
