Skip to content

Commit fe00489

Browse files
committed
Progress
1 parent 950cfc2 commit fe00489

493 files changed

Lines changed: 21000 additions & 3643 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/extract_env.ml

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,8 @@ let spec_header si () =
772772
template <typename T> struct is_unique_ptr<std::unique_ptr<T>> : std::true_type { using element_type = T; };\n\n\
773773
template <typename T> struct is_shared_ptr : std::false_type {};\n\
774774
template <typename T> struct is_shared_ptr<std::shared_ptr<T>> : std::true_type { using element_type = T; };\n\n\
775+
template <typename T> struct is_optional : std::false_type {};\n\
776+
template <typename T> struct is_optional<std::optional<T>> : std::true_type { using element_type = T; };\n\n\
775777
template <typename T>\n\
776778
auto clone_value(const T& x) { return x; }\n\n\
777779
template <typename T>\n\
@@ -807,15 +809,33 @@ let spec_header si () =
807809
\ return std::make_unique<Inner>(x->clone());\n\
808810
\ }\n\
809811
\ } else {\n\
810-
\ if constexpr (std::is_same_v<Inner, SourceBare>) {\n\
812+
\ if constexpr (requires { x.clone(); }) {\n\
811813
\ return std::make_unique<Inner>(x.clone());\n\
814+
\ } else if constexpr (std::is_same_v<Inner, SourceBare>) {\n\
815+
\ if constexpr (requires { x.clone(); }) {\n\
816+
\ return std::make_unique<Inner>(x.clone());\n\
817+
\ } else {\n\
818+
\ return std::make_unique<Inner>(x);\n\
819+
\ }\n\
812820
\ } else\n\
813821
\ if constexpr (requires { x.template clone_as<Inner>(); }) {\n\
814822
\ return std::make_unique<Inner>(x.template clone_as<Inner>());\n\
815823
\ } else {\n\
816-
\ return std::make_unique<Inner>(x.clone());\n\
824+
\ if constexpr (requires { x.clone(); }) {\n\
825+
\ return std::make_unique<Inner>(x.clone());\n\
826+
\ } else {\n\
827+
\ return std::make_unique<Inner>(x);\n\
828+
\ }\n\
817829
\ }\n\
818830
\ }\n\
831+
\ } else if constexpr (is_optional<TargetBare>::value) {\n\
832+
\ using Inner = typename is_optional<TargetBare>::element_type;\n\
833+
\ if constexpr (is_optional<SourceBare>::value) {\n\
834+
\ if (!x) return std::nullopt;\n\
835+
\ return Target{clone_as_value<Inner>(*x)};\n\
836+
\ } else {\n\
837+
\ return Target{clone_as_value<Inner>(x)};\n\
838+
\ }\n\
819839
\ } else if constexpr (is_shared_ptr<TargetBare>::value) {\n\
820840
\ using Inner = typename is_shared_ptr<TargetBare>::element_type;\n\
821841
\ if constexpr (is_shared_ptr<SourceBare>::value) {\n\
@@ -849,9 +869,16 @@ let spec_header si () =
849869
\ } else if constexpr (is_unique_ptr<SourceBare>::value) {\n\
850870
\ using SourceInner = typename is_unique_ptr<SourceBare>::element_type;\n\
851871
\ if constexpr (std::is_same_v<TargetBare, SourceInner>) {\n\
852-
\ return x ? x->clone() : Target{};\n\
872+
\ if (!x) return Target{};\n\
873+
\ if constexpr (requires { x->clone(); }) {\n\
874+
\ return x->clone();\n\
875+
\ } else {\n\
876+
\ return *x;\n\
877+
\ }\n\
853878
\ } else if constexpr (requires { x->template clone_as<TargetBare>(); }) {\n\
854879
\ return x->template clone_as<TargetBare>();\n\
880+
\ } else if constexpr (requires { x->clone(); }) {\n\
881+
\ return x->clone();\n\
855882
\ } else {\n\
856883
\ return Target(*x);\n\
857884
\ }\n\

0 commit comments

Comments
 (0)