content: -- Copyright (c) Microsoft. All rights reserved.
  -- Licensed under the MIT license. See LICENSE file in the project root for full license information.
  
  {-# LANGUAGE QuasiQuotes, OverloadedStrings, RecordWildCards #-}
  
  module Language.Bond.Codegen.Cpp.Apply_h (apply_h) where
  
  import System.FilePath
  import Prelude
  import Data.Text.Lazy (Text)
  import Text.Shakespeare.Text
  import Language.Bond.Syntax.Types
  import Language.Bond.Util
  import Language.Bond.Codegen.Util
  import Language.Bond.Codegen.TypeMapping
  import Language.Bond.Codegen.Cpp.ApplyOverloads
  
  -- | Codegen template for generating /base_name/_apply.h containing declarations of
  -- <https://microsoft.github.io/bond/manual/bond_cpp.html#optimizing-build-time Apply>
  -- function overloads for the specified protocols.
  apply_h :: [Protocol]   -- ^ List of protocols for which @Apply@ overloads should be generated
          -> Maybe String -- ^ Optional attribute to decorate the @Apply@ function declarations
          -> MappingContext -> String -> [Import] -> [Declaration] -> (String, Text)
  apply_h protocols export_attribute cpp file imports declarations = ("_apply.h", [lt|
  #pragma once
  
  #include "#{file}_types.h"
  #include <bond/core/bond.h>
  #include <bond/stream/output_buffer.h>
  #{newlineSep 0 includeImport imports}
  
  namespace bond
  {
      #{newlineSepEnd 1 (applyOverloads protocols cpp export_attr extern) declarations}
  } // namespace bond
  |])
    where
      includeImport (Import path) = [lt|#include "#{dropExtension (slashForward path)}_apply.h"|]
  
      export_attr = optional (\a -> [lt|#{a}|]) export_attribute
  
      extern = "extern "
  
  