diff --git a/include/cppast/cpp_entity_kind.hpp b/include/cppast/cpp_entity_kind.hpp index c23a4bb..b36dcba 100644 --- a/include/cppast/cpp_entity_kind.hpp +++ b/include/cppast/cpp_entity_kind.hpp @@ -46,6 +46,7 @@ namespace cppast template_template_parameter_t, alias_template_t, + function_template_t, count, }; diff --git a/include/cppast/cpp_function.hpp b/include/cppast/cpp_function.hpp index a7458b3..1ebc10d 100644 --- a/include/cppast/cpp_function.hpp +++ b/include/cppast/cpp_function.hpp @@ -112,6 +112,13 @@ namespace cppast return std::move(function); } + /// \returns The finished function without registering it. + /// \notes This is intended for templated functions only. + std::unique_ptr finish() + { + return std::move(function); + } + protected: basic_builder() = default; ~basic_builder() noexcept = default; diff --git a/include/cppast/cpp_function_template.hpp b/include/cppast/cpp_function_template.hpp new file mode 100644 index 0000000..de0f846 --- /dev/null +++ b/include/cppast/cpp_function_template.hpp @@ -0,0 +1,42 @@ +// Copyright (C) 2017 Jonathan Müller +// This file is subject to the license terms in the LICENSE file +// found in the top-level directory of this distribution. + +#ifndef CPPAST_CPP_FUNCTION_TEMPLATE_HPP_INCLUDED +#define CPPAST_CPP_FUNCTION_TEMPLATE_HPP_INCLUDED + +#include +#include + +namespace cppast +{ + /// A [cppast::cpp_entity]() modelling a function template. + class cpp_function_template final : public cpp_template + { + public: + /// Builder for [cppast::cpp_function_template](). + class builder : public basic_builder + { + public: + using basic_builder::basic_builder; + }; + + /// A reference to the function that is being templated. + const cpp_function_base& function() const noexcept + { + return static_cast(*begin()); + } + + private: + cpp_function_template(std::unique_ptr func) + : cpp_template(std::unique_ptr(func.release())) + { + } + + cpp_entity_kind do_get_entity_kind() const noexcept override; + + friend basic_builder; + }; +} // namespace cppast + +#endif // CPPAST_CPP_FUNCTION_TEMPLATE_HPP_INCLUDED diff --git a/src/cpp_entity_kind.cpp b/src/cpp_entity_kind.cpp index 7986c0d..76d19df 100644 --- a/src/cpp_entity_kind.cpp +++ b/src/cpp_entity_kind.cpp @@ -69,6 +69,8 @@ const char* cppast::to_string(cpp_entity_kind kind) noexcept case cpp_entity_kind::alias_template_t: return "alias template"; + case cpp_entity_kind::function_template_t: + return "function template"; case cpp_entity_kind::count: break; @@ -108,6 +110,7 @@ bool cppast::is_type(cpp_entity_kind kind) noexcept case cpp_entity_kind::non_type_template_parameter_t: case cpp_entity_kind::template_template_parameter_t: case cpp_entity_kind::alias_template_t: + case cpp_entity_kind::function_template_t: case cpp_entity_kind::count: break; } @@ -120,6 +123,7 @@ bool cppast::is_template(cpp_entity_kind kind) noexcept switch (kind) { case cpp_entity_kind::alias_template_t: + case cpp_entity_kind::function_template_t: return true; case cpp_entity_kind::file_t: diff --git a/src/cpp_function_template.cpp b/src/cpp_function_template.cpp new file mode 100644 index 0000000..0ad122b --- /dev/null +++ b/src/cpp_function_template.cpp @@ -0,0 +1,14 @@ +// Copyright (C) 2017 Jonathan Müller +// This file is subject to the license terms in the LICENSE file +// found in the top-level directory of this distribution. + +#include + +#include + +using namespace cppast; + +cpp_entity_kind cpp_function_template::do_get_entity_kind() const noexcept +{ + return cpp_entity_kind::function_template_t; +} diff --git a/src/visitor.cpp b/src/visitor.cpp index b3015fb..828ca89 100644 --- a/src/visitor.cpp +++ b/src/visitor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,8 @@ bool detail::visit(const cpp_entity& e, detail::visitor_callback_t cb, void* fun return handle_container(e, cb, functor); case cpp_entity_kind::alias_template_t: return handle_container(e, cb, functor); + case cpp_entity_kind::function_template_t: + return handle_container(e, cb, functor); case cpp_entity_kind::namespace_alias_t: case cpp_entity_kind::using_directive_t: