Add cpp_function_types.hpp
This commit is contained in:
parent
5dd5fe4c42
commit
78d546f09c
3 changed files with 240 additions and 0 deletions
207
include/cppast/cpp_function_types.hpp
Normal file
207
include/cppast/cpp_function_types.hpp
Normal file
|
|
@ -0,0 +1,207 @@
|
||||||
|
// Copyright (C) 2017 Jonathan Müller <jonathanmueller.dev@gmail.com>
|
||||||
|
// 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_TYPES_HPP_INCLUDED
|
||||||
|
#define CPPAST_CPP_FUNCTION_TYPES_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <cppast/cpp_type.hpp>
|
||||||
|
|
||||||
|
namespace cppast
|
||||||
|
{
|
||||||
|
/// A [cppast::cpp_type]() that is a function.
|
||||||
|
///
|
||||||
|
/// A function pointer is created by wrapping it in [cppast::cpp_pointer_type]().
|
||||||
|
class cpp_function_type final : public cpp_type
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Builds a [cppast::cpp_function_type]().
|
||||||
|
class builder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// \effects Sets the return type.
|
||||||
|
explicit builder(std::unique_ptr<cpp_type> return_type)
|
||||||
|
: func_(new cpp_function_type(std::move(return_type)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \effects Adds an argument type.
|
||||||
|
void add_argument(std::unique_ptr<cpp_type> arg)
|
||||||
|
{
|
||||||
|
func_->arguments_.push_back(*func_, std::move(arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \effects Adds an ellipsis, marking it as variadic.
|
||||||
|
void variadic()
|
||||||
|
{
|
||||||
|
func_->variadic_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns The finished [cppast::cpp_function_type]().
|
||||||
|
std::unique_ptr<cpp_function_type> finish()
|
||||||
|
{
|
||||||
|
return std::move(func_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<cpp_function_type> func_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// \returns A reference to the return [cppast::cpp_type]().
|
||||||
|
const cpp_type& return_type() const noexcept
|
||||||
|
{
|
||||||
|
return *return_type_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns An iteratable object iterating over the argument types.
|
||||||
|
detail::iteratable_intrusive_list<cpp_type> argument_types() const noexcept
|
||||||
|
{
|
||||||
|
return type_safe::ref(arguments_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns Whether or not the function is variadic (C-style ellipsis).
|
||||||
|
bool is_variadic() const noexcept
|
||||||
|
{
|
||||||
|
return variadic_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
cpp_function_type(std::unique_ptr<cpp_type> return_type)
|
||||||
|
: return_type_(std::move(return_type)), variadic_(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
cpp_type_kind do_get_kind() const noexcept override
|
||||||
|
{
|
||||||
|
return cpp_type_kind::function;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<cpp_type> return_type_;
|
||||||
|
detail::intrusive_list<cpp_type> arguments_;
|
||||||
|
bool variadic_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A [cppast::cpp_type]() that is a member function.
|
||||||
|
///
|
||||||
|
/// A member function with cv qualifier is created by wrapping it in [cppast::cpp_cv_qualified_type]().
|
||||||
|
/// A member function with reference qualifier is created by wrapping it in [cppast::cpp_reference_type]().
|
||||||
|
/// A member function pointer is created by wrapping it in [cppast::cpp_pointer_type]().
|
||||||
|
class cpp_member_function_type final : public cpp_type
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Builds a [cppast::cpp_member_function_type]().
|
||||||
|
class builder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// \effects Sets the class and return type.
|
||||||
|
builder(std::unique_ptr<cpp_type> class_type, std::unique_ptr<cpp_type> return_type)
|
||||||
|
: func_(new cpp_member_function_type(std::move(class_type), std::move(return_type)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \effects Adds an argument type.
|
||||||
|
void add_argument(std::unique_ptr<cpp_type> arg)
|
||||||
|
{
|
||||||
|
func_->arguments_.push_back(*func_, std::move(arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \effects Adds an ellipsis, marking it as variadic.
|
||||||
|
void variadic()
|
||||||
|
{
|
||||||
|
func_->variadic_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns The finished [cppast::cpp_member_function_type]().
|
||||||
|
std::unique_ptr<cpp_member_function_type> finish()
|
||||||
|
{
|
||||||
|
return std::move(func_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<cpp_member_function_type> func_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// \returns A reference to the class [cppast::cpp_type]().
|
||||||
|
const cpp_type& class_type() const noexcept
|
||||||
|
{
|
||||||
|
return *class_type_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns A reference to the return [cppast::cpp_type]().
|
||||||
|
const cpp_type& return_type() const noexcept
|
||||||
|
{
|
||||||
|
return *object_type_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns An iteratable object iterating over the argument types.
|
||||||
|
detail::iteratable_intrusive_list<cpp_type> argument_types() const noexcept
|
||||||
|
{
|
||||||
|
return type_safe::ref(arguments_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns Whether or not the function is variadic (C-style ellipsis).
|
||||||
|
bool is_variadic() const noexcept
|
||||||
|
{
|
||||||
|
return variadic_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
cpp_member_function_type(std::unique_ptr<cpp_type> class_type,
|
||||||
|
std::unique_ptr<cpp_type> return_type)
|
||||||
|
: class_type_(std::move(class_type)), object_type_(std::move(return_type)), variadic_(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
cpp_type_kind do_get_kind() const noexcept override
|
||||||
|
{
|
||||||
|
return cpp_type_kind::member_function;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<cpp_type> class_type_, object_type_;
|
||||||
|
detail::intrusive_list<cpp_type> arguments_;
|
||||||
|
bool variadic_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A [cppast::cpp_type]() that is a member object.
|
||||||
|
///
|
||||||
|
/// A member object pointer is created by wrapping it in [cppast::cpp_pointer_type]().
|
||||||
|
class cpp_member_object_type final : public cpp_type
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// \returns A newly created member object type.
|
||||||
|
static std::unique_ptr<cpp_member_object_type> build(std::unique_ptr<cpp_type> class_type,
|
||||||
|
std::unique_ptr<cpp_type> object_type)
|
||||||
|
{
|
||||||
|
return std::unique_ptr<cpp_member_object_type>(
|
||||||
|
new cpp_member_object_type(std::move(class_type), std::move(object_type)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns A reference to the class [cppast::cpp_type]().
|
||||||
|
const cpp_type& class_type() const noexcept
|
||||||
|
{
|
||||||
|
return *class_type_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \returns A reference to the object [cppast::cpp_type]().
|
||||||
|
const cpp_type& object_type() const noexcept
|
||||||
|
{
|
||||||
|
return *object_type_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
cpp_member_object_type(std::unique_ptr<cpp_type> class_type,
|
||||||
|
std::unique_ptr<cpp_type> object_type)
|
||||||
|
: class_type_(std::move(class_type)), object_type_(std::move(object_type))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
cpp_type_kind do_get_kind() const noexcept override
|
||||||
|
{
|
||||||
|
return cpp_type_kind::member_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<cpp_type> class_type_, object_type_;
|
||||||
|
};
|
||||||
|
} // namespace cppast
|
||||||
|
|
||||||
|
#endif // CPPAST_CPP_FUNCTION_TYPES_HPP_INCLUDED
|
||||||
|
|
@ -23,6 +23,9 @@ namespace cppast
|
||||||
reference,
|
reference,
|
||||||
|
|
||||||
array,
|
array,
|
||||||
|
function,
|
||||||
|
member_function,
|
||||||
|
member_object,
|
||||||
|
|
||||||
unexposed,
|
unexposed,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,36 @@ namespace cppast
|
||||||
std::unique_ptr<T> first_;
|
std::unique_ptr<T> first_;
|
||||||
type_safe::optional_ref<T> last_;
|
type_safe::optional_ref<T> last_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class iteratable_intrusive_list
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
iteratable_intrusive_list(type_safe::object_ref<const intrusive_list<T>> list)
|
||||||
|
: list_(list)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty() const noexcept
|
||||||
|
{
|
||||||
|
return list_->empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
using iterator = typename intrusive_list<T>::const_iterator;
|
||||||
|
|
||||||
|
iterator begin() const noexcept
|
||||||
|
{
|
||||||
|
return list_->begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator end() const noexcept
|
||||||
|
{
|
||||||
|
return list_->end();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
type_safe::object_ref<const intrusive_list<T>> list_;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
} // namespace cppast::detail
|
} // namespace cppast::detail
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue