{#
 # Copyright 2016 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.
 #}
/*
 * Copyright {{today.year}} 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.
 */

// This file has been auto-generated by {{code_generator}}. DO NOT MODIFY!
// Auto-generated from template: {{cc_template_path}}

// clang-format off

{% if conditional %}
#if defined({{conditional}})

{% endif %}
{% block includes %}
#include "{{header_file}}"

#include "base/debug/trace_event.h"
#include "cobalt/base/polymorphic_downcast.h"
#include "cobalt/script/global_environment.h"
#include "cobalt/script/opaque_handle.h"
#include "cobalt/script/script_object.h"
{% for include in implementation_includes %}
#include "{{include}}"
{% endfor %}
{% endblock includes %}

namespace {
{% block using_directives %}
using cobalt::{{components|join('::')}}::{{impl_class}};
using cobalt::{{components|join('::')}}::{{binding_class}};
{% for used_class in forward_declarations %}
{% if used_class.conditional %}
#if defined({{used_class.conditional}})
{% endif %}
using {{used_class.fully_qualified_name}};
{% if used_class.conditional %}
#endif  // defined({{used_class.conditional}})
{% endif %}
{% endfor %}
using cobalt::script::CallbackInterfaceTraits;
using cobalt::script::GlobalEnvironment;
using cobalt::script::OpaqueHandle;
using cobalt::script::OpaqueHandleHolder;
using cobalt::script::ScriptObject;
using cobalt::script::Wrappable;
{% endblock using_directives %}
{% if enumerations|length %}
{% block enumeration_declarations %}
{% endblock enumeration_declarations %}
{% endif %}
{% block top_level_unnamed_namespace %}
{% endblock top_level_unnamed_namespace %}
}  // namespace

namespace cobalt {
{% for component in components %}
namespace {{component}} {
{% endfor %}

{% block implementation %}
{% endblock implementation %}

{% for component in components|reverse %}
}  // namespace {{component}}
{% endfor %}
{% if is_global_interface %}

namespace script {

template<>
void GlobalEnvironment::CreateGlobalObject<{{impl_class}}>(
    const scoped_refptr<{{impl_class}}>& global_interface,
    EnvironmentSettings* environment_settings) {
{% block create_global_object_impl %}
{% endblock create_global_object_impl %}
}

// MSVS compiler does not need this explicit instantiation, and generates a
// compiler error.
#if !defined(_MSC_VER)
// Explicitly instantiate the template function for template type {{impl_class}}
// This is needed to prevent link errors when trying to resolve the template
// instantiation.
template
void GlobalEnvironment::CreateGlobalObject<{{impl_class}}>(
    const scoped_refptr<{{impl_class}}>& global_interface,
    EnvironmentSettings* environment_settings);
#endif

}  // namespace script
{% endif %}
}  // namespace cobalt
{% if enumerations|length %}

namespace {
{% block enumeration_definitions %}
{% endblock enumeration_definitions %}
}  // namespace
{% endif %}
{% if conditional %}
#endif  // defined({{conditional}})
{% endif %}
