Hhehongzhemockcpp patch
af7c8d3c创建于 2025年12月26日历史提交

#include <limits>
#include <mockcpp/types/AnyCast.h>

MOCKCPP_NS_START

///////////////////////////////////////////////////////
template <typename ValueType>
ValueType* type_any_cast(AnyBase* op)
{
   return 0;
}

///////////////////////////////////////////////////////
template <typename Unsigned, typename Signed, typename BaseType>
Unsigned* unsigned_type_any_cast(AnyBase* op)
{
   Unsigned *p = 0;
   if((p = __any_cast<Unsigned>(op)) ||
      (p = (Unsigned*)type_any_cast<BaseType>(op))
   )
   {
      return p;
   }

   Signed* ps = 0;
   if((ps = __any_cast<Signed>(op)) && (*ps) > 0)
   {
      return (Unsigned*)ps;
   }

   return 0;
}

///////////////////////////////////////////////////////
template <typename Signed, typename BaseType >
Signed* signed_type_any_cast(AnyBase* op)
{
   Signed *p = 0;

   (p = __any_cast<Signed>(op)) ||
   (p = (Signed*)type_any_cast<BaseType>(op));

   return p;
}

///////////////////////////////////////////////////////
template <>
char* type_any_cast<char>(AnyBase* op)
{
   return signed_type_any_cast<char, void>(op);
}

///////////////////////////////////////////////////////
template <>
short* type_any_cast<short>(AnyBase* op)
{
   return signed_type_any_cast<short, char>(op);
}

///////////////////////////////////////////////////////
template <>
int* type_any_cast<int>(AnyBase* op)
{
   return signed_type_any_cast<int, short>(op);
}

///////////////////////////////////////////////////////
template <>
long* type_any_cast<long>(AnyBase* op)
{
   return signed_type_any_cast<long, int>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned char* type_any_cast<unsigned char>(AnyBase* op)
{
   return unsigned_type_any_cast<unsigned char, char, void>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned short* type_any_cast<unsigned short>(AnyBase* op)
{
   return unsigned_type_any_cast<unsigned short, short, unsigned char>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned int* type_any_cast<unsigned int>(AnyBase* op)
{
   return unsigned_type_any_cast<unsigned int, int, unsigned short>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned long* type_any_cast<unsigned long>(AnyBase* op)
{
   return unsigned_type_any_cast<unsigned long, long, unsigned int>(op);
}

///////////////////////////////////////////////////////
template <typename ValueType>
ValueType* scope_check_any_cast(AnyBase* op)
{
   ValueType* v = type_any_cast<ValueType>(op);
   if(v != 0)
   {
      return v;
   }

   unsigned long* ul = type_any_cast<unsigned long>(op);
   if(ul  && ((*ul) <= (unsigned long)std::numeric_limits<ValueType>::max()))
   {
      return (ValueType*)ul;
   }

   long* l = type_any_cast<long>(op);
   if(l  && (((*l) <= (long)std::numeric_limits<ValueType>::max()) && 
              (*l) >= (long)std::numeric_limits<ValueType>::min()))
   {
      return (ValueType*)l;
   }

   return 0;
}

///////////////////////////////////////////////////////
template <>
char* any_cast<char>(AnyBase* op)
{
   return scope_check_any_cast<char>(op);
}

///////////////////////////////////////////////////////
template <>
short* any_cast<short>(AnyBase* op)
{
   return scope_check_any_cast<short>(op);
}

///////////////////////////////////////////////////////
template <>
int* any_cast<int>(AnyBase* op)
{
   return scope_check_any_cast<int>(op);
}

///////////////////////////////////////////////////////
template <>
long* any_cast<long>(AnyBase* op)
{
   return scope_check_any_cast<long>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned char* any_cast<unsigned char>(AnyBase* op)
{
   return scope_check_any_cast<unsigned char>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned short* any_cast<unsigned short>(AnyBase* op)
{
   return scope_check_any_cast<unsigned short>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned int* any_cast<unsigned int>(AnyBase* op)
{
   return scope_check_any_cast<unsigned int>(op);
}

///////////////////////////////////////////////////////
template <>
unsigned long* any_cast<unsigned long>(AnyBase* op)
{
   return scope_check_any_cast<unsigned long>(op);
}

MOCKCPP_NS_END