From a9bc9a1c9b9f3102a92a485e8b6753e1c3c98f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Sun, 5 Feb 2017 21:48:55 +0100 Subject: [PATCH] Add cpp_dependent_type --- include/cppast/cpp_type.hpp | 46 +++++++++++++++++++++++++++++++++++++ src/cpp_type.cpp | 21 +++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/include/cppast/cpp_type.hpp b/include/cppast/cpp_type.hpp index b9ce686..3572a48 100644 --- a/include/cppast/cpp_type.hpp +++ b/include/cppast/cpp_type.hpp @@ -30,6 +30,8 @@ namespace cppast template_parameter, template_instantiation, + dependent, + unexposed, }; @@ -174,6 +176,50 @@ namespace cppast cpp_type_ref entity_; }; + class cpp_template_parameter_type; + class cpp_template_instantiation_type; + + /// A [cppast::cpp_type]() that depends on another type. + class cpp_dependent_type final : public cpp_type + { + public: + /// \returns A newly created type dependent on a [cppast::cpp_template_parameter_type](). + static std::unique_ptr build( + std::string name, std::unique_ptr dependee); + + /// \returns A newly created type dependent on a [cppast::cpp_template_instantiation_type](). + static std::unique_ptr build( + std::string name, std::unique_ptr dependee); + + /// \returns The name of the dependent type. + /// \notes It does not include a scope. + const std::string& name() const noexcept + { + return name_; + } + + /// \returns A reference to the [cppast::cpp_type]() it depends one. + /// \notes This is either [cppast::cpp_template_parameter_type]() or [cppast:cpp_template_instantiation_type](). + const cpp_type& dependee() const noexcept + { + return *dependee_; + } + + private: + cpp_dependent_type(std::string name, std::unique_ptr dependee) + : name_(std::move(name)), dependee_(std::move(dependee)) + { + } + + cpp_type_kind do_get_kind() const noexcept override + { + return cpp_type_kind::dependent; + } + + std::string name_; + std::unique_ptr dependee_; + }; + /// The kinds of C++ cv qualifiers. enum cpp_cv { diff --git a/src/cpp_type.cpp b/src/cpp_type.cpp index 9d5e074..ccfef06 100644 --- a/src/cpp_type.cpp +++ b/src/cpp_type.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using namespace cppast; @@ -16,6 +17,20 @@ bool detail::cpp_type_ref_predicate::operator()(const cpp_entity& e) return is_type(e.kind()); } +std::unique_ptr cpp_dependent_type::build( + std::string name, std::unique_ptr dependee) +{ + return std::unique_ptr( + new cpp_dependent_type(std::move(name), std::move(dependee))); +} + +std::unique_ptr cpp_dependent_type::build( + std::string name, std::unique_ptr dependee) +{ + return std::unique_ptr( + new cpp_dependent_type(std::move(name), std::move(dependee))); +} + namespace { bool can_compose(const cpp_type& type) @@ -99,6 +114,12 @@ bool cppast::is_valid(const cpp_type& type) noexcept return is_valid(obj.object_type()); } + case cpp_type_kind::dependent: + { + auto& dep = static_cast(type); + return is_valid(dep.dependee()); + } + case cpp_type_kind::builtin: case cpp_type_kind::user_defined: case cpp_type_kind::template_parameter: