-- This file is part of Hoppy.
--
-- Copyright 2015-2021 Bryan Gardiner <bog@khumba.net>
--
-- 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.

-- | Bindings for @std@ that aren't in other modules.
module Foreign.Hoppy.Generator.Std (
  ValueConversion (..),
  mod_std,
  c_string,
  ) where

import Foreign.Hoppy.Generator.Spec
import Foreign.Hoppy.Generator.Std.String (c_string)
import Foreign.Hoppy.Generator.Std.Wstring (c_wstring)

{-# ANN module "HLint: ignore Use camelCase" #-}

-- | Specifies how values in a collection should be converted when converting
-- the collection as a whole.
data ValueConversion =
    ConvertPtr
    -- ^ A C++ value of type @t@ will convert to a foreign value of type
    -- @'Foreign.Hoppy.Generator.Types.ptrT' t@.
  | ConvertValue
    -- ^ A C++ value of type @t@ will convert to a foreign value of type @t@.
    -- For an object type ('Foreign.Hoppy.Generator.Types.objT'), the class must
    -- have conversions ('ClassConversion').
  deriving (ValueConversion
ValueConversion -> ValueConversion -> Bounded ValueConversion
forall a. a -> a -> Bounded a
maxBound :: ValueConversion
$cmaxBound :: ValueConversion
minBound :: ValueConversion
$cminBound :: ValueConversion
Bounded, Int -> ValueConversion
ValueConversion -> Int
ValueConversion -> [ValueConversion]
ValueConversion -> ValueConversion
ValueConversion -> ValueConversion -> [ValueConversion]
ValueConversion
-> ValueConversion -> ValueConversion -> [ValueConversion]
(ValueConversion -> ValueConversion)
-> (ValueConversion -> ValueConversion)
-> (Int -> ValueConversion)
-> (ValueConversion -> Int)
-> (ValueConversion -> [ValueConversion])
-> (ValueConversion -> ValueConversion -> [ValueConversion])
-> (ValueConversion -> ValueConversion -> [ValueConversion])
-> (ValueConversion
    -> ValueConversion -> ValueConversion -> [ValueConversion])
-> Enum ValueConversion
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: ValueConversion
-> ValueConversion -> ValueConversion -> [ValueConversion]
$cenumFromThenTo :: ValueConversion
-> ValueConversion -> ValueConversion -> [ValueConversion]
enumFromTo :: ValueConversion -> ValueConversion -> [ValueConversion]
$cenumFromTo :: ValueConversion -> ValueConversion -> [ValueConversion]
enumFromThen :: ValueConversion -> ValueConversion -> [ValueConversion]
$cenumFromThen :: ValueConversion -> ValueConversion -> [ValueConversion]
enumFrom :: ValueConversion -> [ValueConversion]
$cenumFrom :: ValueConversion -> [ValueConversion]
fromEnum :: ValueConversion -> Int
$cfromEnum :: ValueConversion -> Int
toEnum :: Int -> ValueConversion
$ctoEnum :: Int -> ValueConversion
pred :: ValueConversion -> ValueConversion
$cpred :: ValueConversion -> ValueConversion
succ :: ValueConversion -> ValueConversion
$csucc :: ValueConversion -> ValueConversion
Enum, ValueConversion -> ValueConversion -> Bool
(ValueConversion -> ValueConversion -> Bool)
-> (ValueConversion -> ValueConversion -> Bool)
-> Eq ValueConversion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ValueConversion -> ValueConversion -> Bool
$c/= :: ValueConversion -> ValueConversion -> Bool
== :: ValueConversion -> ValueConversion -> Bool
$c== :: ValueConversion -> ValueConversion -> Bool
Eq, Eq ValueConversion
Eq ValueConversion
-> (ValueConversion -> ValueConversion -> Ordering)
-> (ValueConversion -> ValueConversion -> Bool)
-> (ValueConversion -> ValueConversion -> Bool)
-> (ValueConversion -> ValueConversion -> Bool)
-> (ValueConversion -> ValueConversion -> Bool)
-> (ValueConversion -> ValueConversion -> ValueConversion)
-> (ValueConversion -> ValueConversion -> ValueConversion)
-> Ord ValueConversion
ValueConversion -> ValueConversion -> Bool
ValueConversion -> ValueConversion -> Ordering
ValueConversion -> ValueConversion -> ValueConversion
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ValueConversion -> ValueConversion -> ValueConversion
$cmin :: ValueConversion -> ValueConversion -> ValueConversion
max :: ValueConversion -> ValueConversion -> ValueConversion
$cmax :: ValueConversion -> ValueConversion -> ValueConversion
>= :: ValueConversion -> ValueConversion -> Bool
$c>= :: ValueConversion -> ValueConversion -> Bool
> :: ValueConversion -> ValueConversion -> Bool
$c> :: ValueConversion -> ValueConversion -> Bool
<= :: ValueConversion -> ValueConversion -> Bool
$c<= :: ValueConversion -> ValueConversion -> Bool
< :: ValueConversion -> ValueConversion -> Bool
$c< :: ValueConversion -> ValueConversion -> Bool
compare :: ValueConversion -> ValueConversion -> Ordering
$ccompare :: ValueConversion -> ValueConversion -> Ordering
$cp1Ord :: Eq ValueConversion
Ord, Int -> ValueConversion -> ShowS
[ValueConversion] -> ShowS
ValueConversion -> String
(Int -> ValueConversion -> ShowS)
-> (ValueConversion -> String)
-> ([ValueConversion] -> ShowS)
-> Show ValueConversion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ValueConversion] -> ShowS
$cshowList :: [ValueConversion] -> ShowS
show :: ValueConversion -> String
$cshow :: ValueConversion -> String
showsPrec :: Int -> ValueConversion -> ShowS
$cshowsPrec :: Int -> ValueConversion -> ShowS
Show)

-- | Include @std::string@.
mod_std :: Module
mod_std :: Module
mod_std = HasCallStack =>
Module -> StateT Module (Either String) () -> Module
Module -> StateT Module (Either String) () -> Module
moduleModify' (String -> String -> String -> Module
makeModule String
"std" String
"std.hpp" String
"std.cpp") (StateT Module (Either String) () -> Module)
-> StateT Module (Either String) () -> Module
forall a b. (a -> b) -> a -> b
$
  [Export] -> StateT Module (Either String) ()
forall (m :: * -> *).
(MonadError String m, MonadState Module m) =>
[Export] -> m ()
moduleAddExports
  [ Class -> Export
forall a. Exportable a => a -> Export
Export Class
c_string
  , Class -> Export
forall a. Exportable a => a -> Export
Export Class
c_wstring
  ]