From d089dd97b76bbbada9b2d8d55330840da84de8c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Mon, 30 Jan 2017 16:56:36 +0100 Subject: [PATCH] Add cpp_template_parameter_type --- include/cppast/cpp_template_parameter.hpp | 46 +++++++++++++++++++++++ include/cppast/cpp_type.hpp | 2 + src/cpp_template_parameter.cpp | 5 +++ 3 files changed, 53 insertions(+) diff --git a/include/cppast/cpp_template_parameter.hpp b/include/cppast/cpp_template_parameter.hpp index 8217b98..54ec1b7 100644 --- a/include/cppast/cpp_template_parameter.hpp +++ b/include/cppast/cpp_template_parameter.hpp @@ -78,6 +78,52 @@ namespace cppast cpp_template_keyword keyword_; }; + /// \exclude + namespace detail + { + struct cpp_template_parameter_ref_predicate + { + bool operator()(const cpp_entity& e); + }; + } // namespace detail + + /// Reference to a [cppast::cpp_template_type_parameter](). + using cpp_template_type_parameter_ref = + basic_cpp_entity_ref; + + /// A [cppast::cpp_type]() defined by a [cppast::cpp_template_type_parameter](). + class cpp_template_parameter_type final : public cpp_type + { + public: + /// \returns A newly created parameter type. + static std::unique_ptr build( + cpp_template_type_parameter_ref parameter) + { + return std::unique_ptr( + new cpp_template_parameter_type(std::move(parameter))); + } + + /// \returns A reference to the [cppast::cpp_template_type_parameter]() this type refers to. + const cpp_template_type_parameter_ref& entity() const noexcept + { + return parameter_; + } + + private: + cpp_template_parameter_type(cpp_template_type_parameter_ref parameter) + : parameter_(std::move(parameter)) + { + } + + cpp_type_kind do_get_kind() const noexcept override + { + return cpp_type_kind::template_parameter; + } + + cpp_template_type_parameter_ref parameter_; + }; + /// A [cppast::cpp_entity]() modelling a non-type template parameter. class cpp_non_type_template_parameter final : public cpp_template_parameter, public cpp_variable_base diff --git a/include/cppast/cpp_type.hpp b/include/cppast/cpp_type.hpp index c54edd0..741c5aa 100644 --- a/include/cppast/cpp_type.hpp +++ b/include/cppast/cpp_type.hpp @@ -27,6 +27,8 @@ namespace cppast member_function, member_object, + template_parameter, + unexposed, }; diff --git a/src/cpp_template_parameter.cpp b/src/cpp_template_parameter.cpp index e1248a7..1370d47 100644 --- a/src/cpp_template_parameter.cpp +++ b/src/cpp_template_parameter.cpp @@ -35,6 +35,11 @@ cpp_entity_kind cpp_template_type_parameter::do_get_entity_kind() const noexcept return cpp_entity_kind::template_type_parameter_t; } +bool detail::cpp_template_parameter_ref_predicate::operator()(const cpp_entity& e) +{ + return e.kind() == cpp_entity_kind::template_type_parameter_t; +} + std::unique_ptr cpp_non_type_template_parameter::build( const cpp_entity_index& idx, cpp_entity_id id, std::string name, std::unique_ptr type, bool is_variadic, std::unique_ptr default_value)