Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,336 changes: 1,667 additions & 669 deletions docs/prj/Chevron_diagrams.drawio

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
Binary file not shown.
24 changes: 12 additions & 12 deletions include/chevron/function.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,43 +14,43 @@
#ifndef CHEVRON_LIB_HDR_FUNCTION_INCLUDE_H_
#define CHEVRON_LIB_HDR_FUNCTION_INCLUDE_H_

#include "chevron/model/function/func_args.hpp"
#include "chevron/model/function/func_pointer.hpp"
#include "chevron/utility/function/func_args.hpp"
#include "chevron/utility/function/callable.hpp"
#include <string>

namespace chevron
{

/*! @brief Callable function that accepts no arguments and returns void. */
using VoidReturnNoArgs = FuncPtr<void>;
using VoidReturnNoArgs = Callable<void>;

/*! @brief Callable function that accepts no arguments and returns a boolean. */
using BoolReturnNoArgs = FuncPtr<bool>;
using BoolReturnNoArgs = Callable<bool>;

/*! @brief Callable function that accepts no arguments and returns a character. */
using CharReturnNoArgs = FuncPtr<char>;
using CharReturnNoArgs = Callable<char>;

/*! @brief Callable function that accepts no arguments and returns an integer. */
using IntReturnNoArgs = FuncPtr<int>;
using IntReturnNoArgs = Callable<int>;

/*! @brief Callable function that accepts no arguments and returns a float. */
using FloatReturnNoArgs = FuncPtr<float>;
using FloatReturnNoArgs = Callable<float>;

/*! @brief Callable function that accepts no arguments and returns a double. */
using DoubleReturnNoArgs = FuncPtr<double>;
using DoubleReturnNoArgs = Callable<double>;

/*! @brief Callable function that accepts no arguments and returns a const char pointer. */
using CstrReturnNoArgs = FuncPtr<const char*>;
using CstrReturnNoArgs = Callable<const char*>;

/*! @brief Callable function that accepts no arguments and returns a string. */
using StringReturnNoArgs = FuncPtr<std::string>;
using StringReturnNoArgs = Callable<std::string>;

/*! @brief Callable function that accepts no arguments and returns size_t. */
using SizeReturnNoArgs = FuncPtr<size_t>;
using SizeReturnNoArgs = Callable<size_t>;

/*! @brief Callable function that accepts no arguments and returns specified type. */
template <typename ReturnT>
using NoArgsReturn = FuncPtr<ReturnT>;
using NoArgsReturn = Callable<ReturnT>;

} // namespace chevron

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,43 @@
// [ISJTB-CXX-XL20260108-000003]

/*!
* @file func_pointer.hpp
* @file callable.hpp
*
* @brief
* Provides declaration of callable function pointer.
*
* @author
* Jamon T. Bailey
*
* @date 01-15-2026
*/

#ifndef CHEVRON_LIB_H_FUNCTION_POINTER_H_
#define CHEVRON_LIB_H_FUNCTION_POINTER_H_
#ifndef CHEVRON_LIB_HDR_FUNCTION_POINTER_H_
#define CHEVRON_LIB_HDR_FUNCTION_POINTER_H_

#include <functional>
#include "chevron/model/function/func_args.hpp"
#include "chevron/model/function/type_traits.hpp"
#include "chevron/utility/function/func_args.hpp"
#include "chevron/utility/function/type_traits.hpp"

namespace chevron
{

/*! @brief Base specialization template. */
template <typename ReturnT, typename ArgsClass = FuncArgs<>>
class FuncPtr;
class Callable;

/*!
* @brief
* Function pointer.
*
* @details
* N/A
* N/a
*/
template <typename ReturnT, typename... ArgsT>
class FuncPtr<ReturnT, FuncArgs<ArgsT...>> {
class Callable<ReturnT, FuncArgs<ArgsT...>> {
// ===================================================================================== //
// <> chevron::Callable | TYPE ALIASES
// ===================================================================================== //
public:
/*! @brief Function return type. */
using ReturnType = ReturnT;
Expand All @@ -42,19 +50,21 @@ class FuncPtr<ReturnT, FuncArgs<ArgsT...>> {
/*! @brief Specialized standard library function pointer type. */
using StdFunc = std::function<ReturnT(ArgsT...)>;

FuncPtr() noexcept = default;
// ===================================================================================== //
// <> chevron::Callable | CONSTRUCTORS / DESTRUCTOR
// ===================================================================================== //

/*! @brief Construct from a free function, lambda, or functor. */
template <typename Function>
requires std::is_invocable_r_v<ReturnType, Function, ArgsT...>
explicit FuncPtr(Function&& callable) : funcPtr{std::forward<Function>(callable)}
explicit Callable(Function&& callable) : funcPtr{std::forward<Function>(callable)}
{
//
}

/*! @brief Construct from a member method of a class instance. */
template <typename ClassType, typename Method>
FuncPtr(ClassType* instance, Method method)
Callable(ClassType* instance, Method method)
{
if (instance && method) {
this->funcPtr = [instance, method](ArgsT... args) -> ReturnType
Expand All @@ -64,25 +74,13 @@ class FuncPtr<ReturnT, FuncArgs<ArgsT...>> {
}
}

~FuncPtr() noexcept = default;
Callable() noexcept = default;

/*! @brief Execute function with specified arguments. */
ReturnType operator()(ArgsT... arg) const
{
return this->funcPtr(std::forward<ArgsT>(arg)...);
}
~Callable() noexcept = default;

/*! @brief Execute function with specified arguments. */
ReturnType operator()(Arguments& arguments)
{
return std::apply(this->funcPtr, arguments.argsTuple());
}

/*! @brief Verify presence of callable function. */
[[nodiscard]] explicit operator bool() const noexcept
{
return !!this->funcPtr;
}
// ===================================================================================== //
// <> chevron::Callable | [PUBLIC] MEMBER METHODS
// ===================================================================================== //

/*!
* @brief
Expand Down Expand Up @@ -132,43 +130,73 @@ class FuncPtr<ReturnT, FuncArgs<ArgsT...>> {
return false;
}

/* ------------------------------------------------------------------------------------- */
// > chevron::Callable | OPERATORS
/* ------------------------------------------------------------------------------------- */

/*! @brief Execute function with specified arguments. */
ReturnType operator()(ArgsT... arg) const
{
return this->funcPtr(std::forward<ArgsT>(arg)...);
}

/*! @brief Execute function with specified arguments. */
ReturnType operator()(Arguments& arguments)
{
return std::apply(this->funcPtr, arguments.argsTuple());
}

/*! @brief Verify presence of callable function. */
[[nodiscard]] explicit operator bool() const noexcept
{
return !!this->funcPtr;
}

// ===================================================================================== //
// <> chevron::Callable | [PRIVATE] ATTRIBUTES
// ===================================================================================== //
private:
/*! @brief Function pointer. */
StdFunc funcPtr;
};

// ===================================================================================== //
// <> chevron::Callable | DEDUCTION GUIDES
// ===================================================================================== //

/*! @details Free function deduction guide. */
template <typename ReturnT, typename... ArgsT>
FuncPtr(ReturnT (*)(ArgsT...)) -> FuncPtr<ReturnT, FuncArgs<ArgsT...>>;
Callable(ReturnT (*)(ArgsT...)) -> Callable<ReturnT, FuncArgs<ArgsT...>>;

/*! @details Non-const member function deduction guide. */
template <typename ClassType, typename ReturnT, typename... ArgsT>
FuncPtr(ClassType*, ReturnT (ClassType::*)(ArgsT...)) -> FuncPtr<ReturnT, FuncArgs<ArgsT...>>;
Callable(ClassType*, ReturnT (ClassType::*)(ArgsT...))
-> Callable<ReturnT, FuncArgs<ArgsT...>>;

/*! @details Const member function deduction guide. */
template <typename ClassType, typename ReturnT, typename... ArgsT>
FuncPtr(ClassType*, ReturnT (ClassType::*)(ArgsT...) const)
-> FuncPtr<ReturnT, FuncArgs<ArgsT...>>;
Callable(ClassType*, ReturnT (ClassType::*)(ArgsT...) const)
-> Callable<ReturnT, FuncArgs<ArgsT...>>;

/*! @details Lambda and functor deduction guide. */
template <typename Function>
FuncPtr(Function&&) -> FuncPtr<
Callable(Function&&) -> Callable<
typename model::traits::callable_signature<std::decay_t<Function>>::ReturnType,
model::traits::to_funcargs_t<
typename model::traits::callable_signature<std::decay_t<Function>>::ArgsTuple>>;

// TODO: Lambda and functor deduction guide only works
// when directly naming `FuncPtr` with it's fully
// when directly naming `Callable` with it's fully
// qualified name. Other instantiations do not
// appear to exhibit this behavior in identical
// circumstances.

// NOTE: Is this because there is no `FuncPtr` constructor
// NOTE: Is this because there is no `Callable` constructor
// that can construct a call to the `::operator()`
// method of the lambda/functor? Perhaps the sole
// reliance on the guide to properly make the
// appropriate type is the issue here.

} // namespace chevron

#endif // CHEVRON_LIB_H_FUNCTION_POINTER_H_
#endif // CHEVRON_LIB_HDR_FUNCTION_POINTER_H_
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
* Defines function pointer related entity concepts.
*/

#ifndef CHEVRON_LIB_H_FUNCTION_CONCEPTS_H_
#define CHEVRON_LIB_H_FUNCTION_CONCEPTS_H_
#ifndef CHEVRON_LIB_HDR_FUNCTION_CONCEPTS_H_
#define CHEVRON_LIB_HDR_FUNCTION_CONCEPTS_H_

#include <concepts>
#include <type_traits>
Expand All @@ -26,4 +26,4 @@ concept is_valid_args_index = Index >= 0 && Index < sizeof...(ArgsT);

} // namespace chevron::model::concepts

#endif // CHEVRON_LIB_H_FUNCTION_CONCEPTS_H_
#endif // CHEVRON_LIB_HDR_FUNCTION_CONCEPTS_H_
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,21 @@
* @file func_args.hpp
*
* @brief
* Provides declaration of function argument structure.
*
* @author
* Jamon T. Bailey
*
* @date 01-15-2026
*/

#ifndef CHEVRON_LIB_H_FUNCTION_ARGUMENTS_H_
#define CHEVRON_LIB_H_FUNCTION_ARGUMENTS_H_
#ifndef CHEVRON_LIB_HDR_FUNCTION_ARGUMENTS_H_
#define CHEVRON_LIB_HDR_FUNCTION_ARGUMENTS_H_

#include <tuple>
#include <type_traits>
#include <utility>
#include "chevron/model/function/concepts.hpp"
#include "chevron/utility/function/concepts.hpp"

namespace chevron
{
Expand All @@ -30,10 +36,17 @@ namespace chevron
*/
template <typename... ArgsT>
class FuncArgs {
// ===================================================================================== //
// <> chevron::FuncArgs | TYPE ALIASES
// ===================================================================================== //
public:
/*! @brief Argument types pack. */
using Types = std::tuple<ArgsT...>;

// ===================================================================================== //
// <> chevron::FuncArgs | CONSTRUCTORS / DESTRUCTOR
// ===================================================================================== //

/*! @brief Default construct all function arguments. */
constexpr FuncArgs() noexcept((std::is_nothrow_default_constructible_v<ArgsT> && ...))
requires(std::is_default_constructible_v<ArgsT> && ...)
Expand All @@ -49,15 +62,20 @@ class FuncArgs {
(std::is_constructible_v<ArgsT, IncomingArgsT &&> && ...) &&
(!std::is_same_v<std::remove_cvref_t<IncomingArgsT>, FuncArgs> && ...)
)
constexpr explicit FuncArgs(IncomingArgsT&&... arg
) noexcept((std::is_nothrow_constructible_v<IncomingArgsT> && ...))
constexpr explicit FuncArgs(IncomingArgsT&&... arg) noexcept(
(std::is_nothrow_constructible_v<IncomingArgsT> && ...)
)
: args{std::forward<IncomingArgsT>(arg)...}
{
//
}

~FuncArgs() noexcept = default;

// ===================================================================================== //
// <> chevron::FuncArgs | [PUBLIC] MEMBER METHODS
// ===================================================================================== //

/*! @brief Get argument at specified index. */
template <std::size_t Index>
requires(model::concepts::is_valid_args_index<Index, ArgsT...>)
Expand Down Expand Up @@ -86,11 +104,18 @@ class FuncArgs {
return this->args;
}

// ===================================================================================== //
// <> chevron::FuncArgs | [PRIVATE] ATTRIBUTES
// ===================================================================================== //
private:
/*! @brief Pre-defined arguments tuple. */
Types args;
};

// ===================================================================================== //
// <> chevron::FuncArgs | TYPE TRAIT UTILITIES
// ===================================================================================== //

namespace model::traits
{

Expand All @@ -110,6 +135,10 @@ using to_funcargs_t = to_funcargs<T>::type;

} // namespace model::traits

// ===================================================================================== //
// <> chevron::FuncArgs | DEDUCTION GUIDES
// ===================================================================================== //

/*! @details Function argument deduction guide. */
template <typename... ArgsT>
FuncArgs(ArgsT&&...) -> FuncArgs<std::decay_t<ArgsT>...>;
Expand All @@ -119,4 +148,4 @@ FuncArgs() -> FuncArgs<>;

} // namespace chevron

#endif // CHEVRON_LIB_H_FUNCTION_ARGUMENTS_H_
#endif // CHEVRON_LIB_HDR_FUNCTION_ARGUMENTS_H_
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
* Defines function related entity type traits.
*/

#ifndef CHEVRON_LIB_H_FUNCTION_TYPE_TRAITS_H_
#define CHEVRON_LIB_H_FUNCTION_TYPE_TRAITS_H_
#ifndef CHEVRON_LIB_HDR_FUNCTION_TYPE_TRAITS_H_
#define CHEVRON_LIB_HDR_FUNCTION_TYPE_TRAITS_H_

#include <concepts>
#include <type_traits>
Expand Down Expand Up @@ -69,4 +69,4 @@ struct callable_signature<ReturnT (*)(ArgsT...)> {

} // namespace chevron::model::traits

#endif // CHEVRON_LIB_H_FUNCTION_TYPE_TRAITS_H_
#endif // CHEVRON_LIB_HDR_FUNCTION_TYPE_TRAITS_H_
Loading
Loading