ifndef OROGEN_<%= typekit.name %>_OPAQUE_FWD_HPP define OROGEN_<%= typekit.name %>_OPAQUE_FWD_HPP

<% types_containing_opaques = type_sets.types.find_all { |t| t.contains_opaques? && !t.opaque? } %> <% all_types = type_sets.opaque_types.map { |op| op.type } + types_containing_opaques

all_types.dup.each do |type|
    all_types << typekit.intermediate_type_for(type)
end
all_types.map! do |type|
    while type <= Typelib::ArrayType
        type = type.deference
    end
    type
end
need_full_definition, forward_declared = all_types.partition do |type|
    type.name =~ /</ || (type.opaque? && type.metadata.get('opaque_is_typedef').include?('1'))
end

%>

<%= includes = need_full_definition.inject(Set.new) do |all, type|

   all |= typekit.include_for_type(type).to_set
end
typekit.cxx_gen_includes(*includes)

%>

<% current_namespace = '/' %> <% forward_declared.sort_by(&:name).each do |type| %> <%= RTT_CPP.adapt_namespace(current_namespace, type.namespace) %> <% current_namespace = type.namespace %> class <%= type.basename %>; <% end %> <%= RTT_CPP.adapt_namespace(current_namespace, '/') %>

endif