whisper-large-v3-mlx
/
lib
/python3.11
/site-packages
/mlx
/include
/metal_cpp
/Foundation
/NSObject.hpp
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
// | |
// Foundation/NSObject.hpp | |
// | |
// Copyright 2020-2023 Apple Inc. | |
// | |
// Licensed under the Apache License, Version 2.0 (the "License"); | |
// you may not use this file except in compliance with the License. | |
// You may obtain a copy of the License at | |
// | |
// http://www.apache.org/licenses/LICENSE-2.0 | |
// | |
// Unless required by applicable law or agreed to in writing, software | |
// distributed under the License is distributed on an "AS IS" BASIS, | |
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
// See the License for the specific language governing permissions and | |
// limitations under the License. | |
// | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
namespace NS | |
{ | |
template <class _Class, class _Base = class Object> | |
class _NS_EXPORT Referencing : public _Base | |
{ | |
public: | |
_Class* retain(); | |
void release(); | |
_Class* autorelease(); | |
UInteger retainCount() const; | |
}; | |
template <class _Class, class _Base = class Object> | |
class Copying : public Referencing<_Class, _Base> | |
{ | |
public: | |
_Class* copy() const; | |
}; | |
template <class _Class, class _Base = class Object> | |
class SecureCoding : public Referencing<_Class, _Base> | |
{ | |
}; | |
class Object : public Referencing<Object, objc_object> | |
{ | |
public: | |
UInteger hash() const; | |
bool isEqual(const Object* pObject) const; | |
class String* description() const; | |
class String* debugDescription() const; | |
protected: | |
friend class Referencing<Object, objc_object>; | |
template <class _Class> | |
static _Class* alloc(const char* pClassName); | |
template <class _Class> | |
static _Class* alloc(const void* pClass); | |
template <class _Class> | |
_Class* init(); | |
template <class _Dst> | |
static _Dst bridgingCast(const void* pObj); | |
static class MethodSignature* methodSignatureForSelector(const void* pObj, SEL selector); | |
static bool respondsToSelector(const void* pObj, SEL selector); | |
template <typename _Type> | |
static constexpr bool doesRequireMsgSendStret(); | |
template <typename _Ret, typename... _Args> | |
static _Ret sendMessage(const void* pObj, SEL selector, _Args... args); | |
template <typename _Ret, typename... _Args> | |
static _Ret sendMessageSafe(const void* pObj, SEL selector, _Args... args); | |
private: | |
Object() = delete; | |
Object(const Object&) = delete; | |
~Object() = delete; | |
Object& operator=(const Object&) = delete; | |
}; | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class, class _Base /* = Object */> | |
_NS_INLINE _Class* NS::Referencing<_Class, _Base>::retain() | |
{ | |
return Object::sendMessage<_Class*>(this, _NS_PRIVATE_SEL(retain)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class, class _Base /* = Object */> | |
_NS_INLINE void NS::Referencing<_Class, _Base>::release() | |
{ | |
Object::sendMessage<void>(this, _NS_PRIVATE_SEL(release)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class, class _Base /* = Object */> | |
_NS_INLINE _Class* NS::Referencing<_Class, _Base>::autorelease() | |
{ | |
return Object::sendMessage<_Class*>(this, _NS_PRIVATE_SEL(autorelease)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class, class _Base /* = Object */> | |
_NS_INLINE NS::UInteger NS::Referencing<_Class, _Base>::retainCount() const | |
{ | |
return Object::sendMessage<UInteger>(this, _NS_PRIVATE_SEL(retainCount)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class, class _Base /* = Object */> | |
_NS_INLINE _Class* NS::Copying<_Class, _Base>::copy() const | |
{ | |
return Object::sendMessage<_Class*>(this, _NS_PRIVATE_SEL(copy)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Dst> | |
_NS_INLINE _Dst NS::Object::bridgingCast(const void* pObj) | |
{ | |
return (__bridge _Dst)pObj; | |
return (_Dst)pObj; | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <typename _Type> | |
_NS_INLINE constexpr bool NS::Object::doesRequireMsgSendStret() | |
{ | |
constexpr size_t kStructLimit = (sizeof(std::uintptr_t) << 1); | |
return sizeof(_Type) > kStructLimit; | |
return false; | |
constexpr size_t kStructLimit = sizeof(std::uintptr_t); | |
return std::is_class(_Type) && (sizeof(_Type) > kStructLimit); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <> | |
_NS_INLINE constexpr bool NS::Object::doesRequireMsgSendStret<void>() | |
{ | |
return false; | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <typename _Ret, typename... _Args> | |
_NS_INLINE _Ret NS::Object::sendMessage(const void* pObj, SEL selector, _Args... args) | |
{ | |
if constexpr (std::is_floating_point<_Ret>()) | |
{ | |
using SendMessageProcFpret = _Ret (*)(const void*, SEL, _Args...); | |
const SendMessageProcFpret pProc = reinterpret_cast<SendMessageProcFpret>(&objc_msgSend_fpret); | |
return (*pProc)(pObj, selector, args...); | |
} | |
else | |
if constexpr (doesRequireMsgSendStret<_Ret>()) | |
{ | |
using SendMessageProcStret = void (*)(_Ret*, const void*, SEL, _Args...); | |
const SendMessageProcStret pProc = reinterpret_cast<SendMessageProcStret>(&objc_msgSend_stret); | |
_Ret ret; | |
(*pProc)(&ret, pObj, selector, args...); | |
return ret; | |
} | |
else | |
{ | |
using SendMessageProc = _Ret (*)(const void*, SEL, _Args...); | |
const SendMessageProc pProc = reinterpret_cast<SendMessageProc>(&objc_msgSend); | |
return (*pProc)(pObj, selector, args...); | |
} | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
_NS_INLINE NS::MethodSignature* NS::Object::methodSignatureForSelector(const void* pObj, SEL selector) | |
{ | |
return sendMessage<MethodSignature*>(pObj, _NS_PRIVATE_SEL(methodSignatureForSelector_), selector); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
_NS_INLINE bool NS::Object::respondsToSelector(const void* pObj, SEL selector) | |
{ | |
return sendMessage<bool>(pObj, _NS_PRIVATE_SEL(respondsToSelector_), selector); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <typename _Ret, typename... _Args> | |
_NS_INLINE _Ret NS::Object::sendMessageSafe(const void* pObj, SEL selector, _Args... args) | |
{ | |
if ((respondsToSelector(pObj, selector)) || (nullptr != methodSignatureForSelector(pObj, selector))) | |
{ | |
return sendMessage<_Ret>(pObj, selector, args...); | |
} | |
if constexpr (!std::is_void<_Ret>::value) | |
{ | |
return 0; | |
} | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class> | |
_NS_INLINE _Class* NS::Object::alloc(const char* pClassName) | |
{ | |
return sendMessage<_Class*>(objc_lookUpClass(pClassName), _NS_PRIVATE_SEL(alloc)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class> | |
_NS_INLINE _Class* NS::Object::alloc(const void* pClass) | |
{ | |
return sendMessage<_Class*>(pClass, _NS_PRIVATE_SEL(alloc)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
template <class _Class> | |
_NS_INLINE _Class* NS::Object::init() | |
{ | |
return sendMessage<_Class*>(this, _NS_PRIVATE_SEL(init)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
_NS_INLINE NS::UInteger NS::Object::hash() const | |
{ | |
return sendMessage<UInteger>(this, _NS_PRIVATE_SEL(hash)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
_NS_INLINE bool NS::Object::isEqual(const Object* pObject) const | |
{ | |
return sendMessage<bool>(this, _NS_PRIVATE_SEL(isEqual_), pObject); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
_NS_INLINE NS::String* NS::Object::description() const | |
{ | |
return sendMessage<String*>(this, _NS_PRIVATE_SEL(description)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
_NS_INLINE NS::String* NS::Object::debugDescription() const | |
{ | |
return sendMessageSafe<String*>(this, _NS_PRIVATE_SEL(debugDescription)); | |
} | |
//------------------------------------------------------------------------------------------------------------------------------------------------------------- | |