audio_trans/orm_lib/inc/drogon/orm/FunctionTraits.h

116 lines
2.9 KiB
C++

/**
*
* FunctionTraits.h
* An Tao
*
* Copyright 2018, An Tao. All rights reserved.
* https://github.com/an-tao/drogon
* Use of this source code is governed by a MIT license
* that can be found in the License file.
*
* Drogon
*
*/
#pragma once
#include <exception>
#include <string>
#include <tuple>
#include <type_traits>
namespace drogon
{
namespace orm
{
class Result;
class DrogonDbException;
namespace internal
{
template <typename>
struct FunctionTraits;
template <>
struct FunctionTraits<void (*)()>
{
using result_type = void;
template <std::size_t Index>
using argument = void;
static const std::size_t arity = 0;
static const bool isSqlCallback = false;
static const bool isExceptCallback = false;
};
// functor,lambda
template <typename Function>
struct FunctionTraits : public FunctionTraits<decltype(
&std::remove_reference<Function>::type::operator())>
{
};
template <typename ClassType, typename ReturnType, typename... Arguments>
struct FunctionTraits<ReturnType (ClassType::*)(Arguments...) const>
: FunctionTraits<ReturnType (*)(Arguments...)>
{
};
template <typename ClassType, typename ReturnType, typename... Arguments>
struct FunctionTraits<ReturnType (ClassType::*)(Arguments...)>
: FunctionTraits<ReturnType (*)(Arguments...)>
{
};
template <>
struct FunctionTraits<void (*)(const Result &)>
: public FunctionTraits<void (*)()>
{
static const bool isSqlCallback = true;
static const bool isStepResultCallback = false;
static const bool isExceptCallback = false;
};
template <>
struct FunctionTraits<void (*)(const DrogonDbException &)>
: public FunctionTraits<void (*)()>
{
static const bool isExceptCallback = true;
static const bool isSqlCallback = false;
static const bool isStepResultCallback = false;
static const bool isPtr = false;
};
template <>
struct FunctionTraits<void (*)(const std::exception_ptr &)>
: public FunctionTraits<void (*)()>
{
static const bool isExceptCallback = true;
static const bool isSqlCallback = false;
static const bool isStepResultCallback = false;
static const bool isPtr = true;
};
template <typename ReturnType, typename... Arguments>
struct FunctionTraits<ReturnType (*)(bool, Arguments...)>
: FunctionTraits<ReturnType (*)(Arguments...)>
{
static const bool isSqlCallback = true;
static const bool isStepResultCallback = true;
};
template <typename ReturnType, typename... Arguments>
struct FunctionTraits<ReturnType (*)(Arguments...)>
{
using result_type = ReturnType;
template <std::size_t Index>
using argument =
typename std::tuple_element<Index, std::tuple<Arguments...>>::type;
static const std::size_t arity = sizeof...(Arguments);
// static const bool isSqlCallback = false;
static const bool isSqlCallback = true;
static const bool isStepResultCallback = true;
};
} // namespace internal
} // namespace orm
} // namespace drogon