// Copyright 2013 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.

{%- if variant -%}
{%-   set variant_path = "%s-%s"|format(module.path, variant) -%}
{%- else -%}
{%-   set variant_path = module.path -%}
{%- endif -%}

{%- set header_guard = "%s_H_"|format(
        variant_path|upper|replace("/","_")|replace(".","_")|
            replace("-", "_")) %}

{%- macro namespace_begin() %}
{%-   for namespace in namespaces_as_array %}
namespace {{namespace}} {
{%-   endfor %}
{%-   if variant %}
namespace {{variant}} {
{%-   endif %}
{%- endmacro %}

{%- macro namespace_end() %}
{%-   if variant %}
}  // namespace {{variant}}
{%-   endif %}
{%-   for namespace in namespaces_as_array|reverse %}
}  // namespace {{namespace}}
{%-   endfor %}
{%- endmacro %}

#ifndef {{header_guard}}
#define {{header_guard}}

#include <stdint.h>

#include <limits>
#include <type_traits>
#include <utility>

#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"
#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
#include "mojo/public/cpp/bindings/associated_interface_request.h"
#include "mojo/public/cpp/bindings/clone_traits.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/lib/equals_traits.h"
#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
#include "mojo/public/cpp/bindings/lib/union_accessor.h"
#include "mojo/public/cpp/bindings/native_struct.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
#include "mojo/public/cpp/bindings/union_traits.h"
#include "{{module.path}}-shared.h"
{%- for import in imports %}
{%-   if variant %}
#include "{{"%s-%s.h"|format(import.module.path, variant)}}"
{%-   else %}
#include "{{import.module.path}}.h"
{%-   endif %}
{%- endfor %}
{%- if not for_blink %}
#include <string>
#include <vector>
{%- else %}
{# hash_util.h includes template specializations that should be present for
   every use of {Inlined}StructPtr. #}
#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
#include "third_party/WebKit/Source/wtf/HashFunctions.h"
#include "third_party/WebKit/Source/wtf/Optional.h"
#include "third_party/WebKit/Source/wtf/text/WTFString.h"
{%- endif %}

{%- for header in extra_public_headers %}
#include "{{header}}"
{%- endfor %}

{%- if export_header %}
#include "{{export_header}}"
{%- endif %}

{#--- WTF enum hashing #}
{%- from "enum_macros.tmpl" import enum_hash_blink%}
{%- if for_blink %}
{%-   for enum in all_enums %}
{%-     if not enum|is_native_only_kind %}
{{enum_hash_blink(enum)}}
{%-     endif %}
{%-   endfor %}
{%- endif %}

{{namespace_begin()}}

{#--- Enums #}
{%- if variant %}
{%-   for enum in enums %}
using {{enum.name}} = {{enum.name}};  // Alias for definition in the parent namespace.
{%-   endfor %}
{%- endif %}

{#--- Constants #}
{%- for constant in module.constants %}
{{constant|format_constant_declaration}};
{%- endfor %}

{#--- Interface Forward Declarations -#}
{%  for interface in interfaces %}
class {{interface.name}};
using {{interface.name}}Ptr = mojo::InterfacePtr<{{interface.name}}>;
using {{interface.name}}PtrInfo = mojo::InterfacePtrInfo<{{interface.name}}>;
using ThreadSafe{{interface.name}}Ptr =
    mojo::ThreadSafeInterfacePtr<{{interface.name}}>;
using {{interface.name}}Request = mojo::InterfaceRequest<{{interface.name}}>;
using {{interface.name}}AssociatedPtr =
    mojo::AssociatedInterfacePtr<{{interface.name}}>;
using ThreadSafe{{interface.name}}AssociatedPtr =
    mojo::ThreadSafeAssociatedInterfacePtr<{{interface.name}}>;
using {{interface.name}}AssociatedPtrInfo =
    mojo::AssociatedInterfacePtrInfo<{{interface.name}}>;
using {{interface.name}}AssociatedRequest =
    mojo::AssociatedInterfaceRequest<{{interface.name}}>;
{%  endfor %}

{#--- Struct Forward Declarations -#}
{%  for struct in structs %}
{%-   if struct|is_native_only_kind %}
using {{struct.name}} = mojo::NativeStruct;
using {{struct.name}}Ptr = mojo::NativeStructPtr;
{%-   else %}
class {{struct.name}};
{%-     if struct|should_inline %}
using {{struct.name}}Ptr = mojo::InlinedStructPtr<{{struct.name}}>;
{%-     else %}
using {{struct.name}}Ptr = mojo::StructPtr<{{struct.name}}>;
{%-     endif %}
{%-   endif %}
{%  endfor %}

{#--- Union Forward Declarations -#}
{%  for union in unions %}
class {{union.name}};
{%    if union|should_inline_union %}
typedef mojo::InlinedStructPtr<{{union.name}}> {{union.name}}Ptr;
{%    else %}
typedef mojo::StructPtr<{{union.name}}> {{union.name}}Ptr;
{%    endif %}
{%- endfor %}

{#--- Interfaces -#}
{%  for interface in interfaces %}
{%    include "interface_declaration.tmpl" %}
{%- endfor %}

{#--- Interface Proxies -#}
{%  for interface in interfaces %}
{%    include "interface_proxy_declaration.tmpl" %}
{%- endfor %}

{#--- Interface Stubs -#}
{%  for interface in interfaces %}
{%    include "interface_stub_declaration.tmpl" %}
{%- endfor %}

{#--- Interface Request Validators -#}
{%  for interface in interfaces %}
{%    include "interface_request_validator_declaration.tmpl" %}
{%- endfor %}

{#--- Interface Response Validators -#}
{%  for interface in interfaces if interface|has_callbacks %}
{%    include "interface_response_validator_declaration.tmpl" %}
{%- endfor %}

{#--- NOTE: Unions and non-inlined structs may have pointers to inlined structs,
      so we need to fully define inlined structs ahead of the others. #}

{#--- Inlined structs #}
{%  for struct in structs %}
{%    if struct|should_inline and not struct|is_native_only_kind %}
{%      include "wrapper_class_declaration.tmpl" %}
{%    endif %}
{%- endfor %}

{#--- Unions must be declared before non-inlined structs because they can be
      members of structs. #}
{#--- Unions #}
{%  for union in unions %}
{%    include "wrapper_union_class_declaration.tmpl" %}
{%- endfor %}

{#--- Non-inlined structs #}
{%  for struct in structs %}
{%    if not struct|should_inline and not struct|is_native_only_kind %}
{%      include "wrapper_class_declaration.tmpl" %}
{%    endif %}
{%- endfor %}

{%- for union in unions %}
{%    include "wrapper_union_class_template_definition.tmpl" %}
{%- endfor %}

{%- for struct in structs %}
{%-   if not struct|is_native_only_kind %}
{%      include "wrapper_class_template_definition.tmpl" %}
{%-   endif %}
{%- endfor %}

{{namespace_end()}}

namespace mojo {

{#--- Struct Serialization Helpers -#}
{%  for struct in structs %}
{%-   if not struct|is_native_only_kind %}
{%      include "struct_traits_declaration.tmpl" %}
{%-   endif %}
{%- endfor %}

{#--- Union Serialization Helpers -#}
{%  if unions %}
{%-   for union in unions %}
{%      include "union_traits_declaration.tmpl" %}
{%-   endfor %}
{%- endif %}

}  // namespace mojo

#endif  // {{header_guard}}
