mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-06-04 08:29:44 -04:00
constexpr: resign ourselves to gcc dropping void -> T support
This commit is contained in:
parent
96d3187f3e
commit
ad4c794aea
16 changed files with 201 additions and 290 deletions
|
@ -355,9 +355,9 @@ namespace ams::gpio::driver::board::nintendo::nx::impl {
|
|||
PadInfo m_info;
|
||||
PadStatus m_status;
|
||||
public:
|
||||
using InterruptListTraits = util::IntrusiveListMemberTraitsDeferredAssert<&TegraPad::m_interrupt_list_node>;
|
||||
using InterruptListTraits = util::IntrusiveListMemberTraits<&TegraPad::m_interrupt_list_node>;
|
||||
using InterruptList = typename InterruptListTraits::ListType;
|
||||
friend class util::IntrusiveList<TegraPad, util::IntrusiveListMemberTraitsDeferredAssert<&TegraPad::m_interrupt_list_node>>;
|
||||
friend class util::IntrusiveList<TegraPad, util::IntrusiveListMemberTraits<&TegraPad::m_interrupt_list_node>>;
|
||||
public:
|
||||
TegraPad() : Pad(), m_interrupt_list_node(), m_info(), m_status() { /* ... */ }
|
||||
|
||||
|
|
|
@ -54,9 +54,9 @@ namespace ams::i2c::driver::board::nintendo::nx::impl {
|
|||
DeviceCode m_device_code;
|
||||
util::IntrusiveListNode m_bus_accessor_list_node;
|
||||
public:
|
||||
using BusAccessorListTraits = util::IntrusiveListMemberTraitsDeferredAssert<&I2cBusAccessor::m_bus_accessor_list_node>;
|
||||
using BusAccessorListTraits = util::IntrusiveListMemberTraits<&I2cBusAccessor::m_bus_accessor_list_node>;
|
||||
using BusAccessorList = typename BusAccessorListTraits::ListType;
|
||||
friend class util::IntrusiveList<I2cBusAccessor, util::IntrusiveListMemberTraitsDeferredAssert<&I2cBusAccessor::m_bus_accessor_list_node>>;
|
||||
friend class util::IntrusiveList<I2cBusAccessor, util::IntrusiveListMemberTraits<&I2cBusAccessor::m_bus_accessor_list_node>>;
|
||||
public:
|
||||
I2cBusAccessor()
|
||||
: m_registers(nullptr), m_speed_mode(SpeedMode_Fast), m_user_count(0), m_user_count_mutex(),
|
||||
|
|
|
@ -38,51 +38,51 @@ namespace ams::lmem::impl {
|
|||
void *end;
|
||||
};
|
||||
|
||||
constexpr inline bool IsValidHeapHandle(HeapHandle handle) {
|
||||
inline bool IsValidHeapHandle(HeapHandle handle) {
|
||||
return handle->magic == ExpHeapMagic;
|
||||
}
|
||||
|
||||
constexpr inline ExpHeapHead *GetExpHeapHead(HeapHead *heap_head) {
|
||||
inline ExpHeapHead *GetExpHeapHead(HeapHead *heap_head) {
|
||||
return std::addressof(heap_head->impl_head.exp_heap_head);
|
||||
}
|
||||
|
||||
constexpr inline const ExpHeapHead *GetExpHeapHead(const HeapHead *heap_head) {
|
||||
inline const ExpHeapHead *GetExpHeapHead(const HeapHead *heap_head) {
|
||||
return std::addressof(heap_head->impl_head.exp_heap_head);
|
||||
}
|
||||
|
||||
constexpr inline HeapHead *GetHeapHead(ExpHeapHead *exp_heap_head) {
|
||||
inline HeapHead *GetHeapHead(ExpHeapHead *exp_heap_head) {
|
||||
return util::GetParentPointer<&HeapHead::impl_head>(util::GetParentPointer<&ImplementationHeapHead::exp_heap_head>(exp_heap_head));
|
||||
}
|
||||
|
||||
constexpr inline const HeapHead *GetHeapHead(const ExpHeapHead *exp_heap_head) {
|
||||
inline const HeapHead *GetHeapHead(const ExpHeapHead *exp_heap_head) {
|
||||
return util::GetParentPointer<&HeapHead::impl_head>(util::GetParentPointer<&ImplementationHeapHead::exp_heap_head>(exp_heap_head));
|
||||
}
|
||||
|
||||
constexpr inline void *GetExpHeapMemoryStart(ExpHeapHead *exp_heap_head) {
|
||||
inline void *GetExpHeapMemoryStart(ExpHeapHead *exp_heap_head) {
|
||||
return reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(exp_heap_head) + sizeof(ImplementationHeapHead));
|
||||
}
|
||||
|
||||
constexpr inline void *GetMemoryBlockStart(ExpHeapMemoryBlockHead *head) {
|
||||
inline void *GetMemoryBlockStart(ExpHeapMemoryBlockHead *head) {
|
||||
return reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(head) + sizeof(*head));
|
||||
}
|
||||
|
||||
constexpr inline const void *GetMemoryBlockStart(const ExpHeapMemoryBlockHead *head) {
|
||||
inline const void *GetMemoryBlockStart(const ExpHeapMemoryBlockHead *head) {
|
||||
return reinterpret_cast<const void *>(reinterpret_cast<uintptr_t>(head) + sizeof(*head));
|
||||
}
|
||||
|
||||
constexpr inline void *GetMemoryBlockEnd(ExpHeapMemoryBlockHead *head) {
|
||||
inline void *GetMemoryBlockEnd(ExpHeapMemoryBlockHead *head) {
|
||||
return reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(GetMemoryBlockStart(head)) + head->block_size);
|
||||
}
|
||||
|
||||
constexpr inline const void *GetMemoryBlockEnd(const ExpHeapMemoryBlockHead *head) {
|
||||
inline const void *GetMemoryBlockEnd(const ExpHeapMemoryBlockHead *head) {
|
||||
return reinterpret_cast<const void *>(reinterpret_cast<uintptr_t>(GetMemoryBlockStart(head)) + head->block_size);
|
||||
}
|
||||
|
||||
constexpr inline ExpHeapMemoryBlockHead *GetHeadForMemoryBlock(const void *block) {
|
||||
inline ExpHeapMemoryBlockHead *GetHeadForMemoryBlock(const void *block) {
|
||||
return reinterpret_cast<ExpHeapMemoryBlockHead *>(reinterpret_cast<uintptr_t>(block) - sizeof(ExpHeapMemoryBlockHead));
|
||||
}
|
||||
|
||||
constexpr inline bool IsValidUsedMemoryBlock(const HeapHead *heap, const void *block) {
|
||||
inline bool IsValidUsedMemoryBlock(const HeapHead *heap, const void *block) {
|
||||
/* Block must fall within the heap range. */
|
||||
if (heap != nullptr) {
|
||||
if (block < heap->heap_start || heap->heap_end <= block) {
|
||||
|
@ -106,7 +106,7 @@ namespace ams::lmem::impl {
|
|||
return true;
|
||||
}
|
||||
|
||||
constexpr inline u16 GetMemoryBlockAlignmentPadding(const ExpHeapMemoryBlockHead *block_head) {
|
||||
inline u16 GetMemoryBlockAlignmentPadding(const ExpHeapMemoryBlockHead *block_head) {
|
||||
return static_cast<u16>((block_head->attributes >> 8) & 0x7F);
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@ namespace ams::lmem::impl {
|
|||
block_head->attributes |= static_cast<decltype(block_head->attributes)>(padding & 0x7F) << 8;
|
||||
}
|
||||
|
||||
constexpr inline u16 GetMemoryBlockGroupId(const ExpHeapMemoryBlockHead *block_head) {
|
||||
inline u16 GetMemoryBlockGroupId(const ExpHeapMemoryBlockHead *block_head) {
|
||||
return static_cast<u16>(block_head->attributes & 0xFF);
|
||||
}
|
||||
|
||||
|
@ -124,7 +124,7 @@ namespace ams::lmem::impl {
|
|||
block_head->attributes |= static_cast<decltype(block_head->attributes)>(group_id & 0xFF);
|
||||
}
|
||||
|
||||
constexpr inline AllocationDirection GetMemoryBlockAllocationDirection(const ExpHeapMemoryBlockHead *block_head) {
|
||||
inline AllocationDirection GetMemoryBlockAllocationDirection(const ExpHeapMemoryBlockHead *block_head) {
|
||||
return static_cast<AllocationDirection>((block_head->attributes >> 15) & 1);
|
||||
}
|
||||
|
||||
|
@ -138,7 +138,7 @@ namespace ams::lmem::impl {
|
|||
out->end = GetMemoryBlockEnd(head);
|
||||
}
|
||||
|
||||
constexpr inline AllocationMode GetAllocationModeImpl(const ExpHeapHead *head) {
|
||||
inline AllocationMode GetAllocationModeImpl(const ExpHeapHead *head) {
|
||||
return static_cast<AllocationMode>(head->mode);
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace ams::os::impl {
|
|||
static constexpr s32 WaitInvalid = -3;
|
||||
static constexpr s32 WaitCancelled = -2;
|
||||
static constexpr s32 WaitTimedOut = -1;
|
||||
using MultiWaitList = util::IntrusiveListMemberTraits<&MultiWaitHolderBase::m_multi_wait_node>::ListType;
|
||||
using MultiWaitList = util::IntrusiveListMemberTraitsByNonConstexprOffsetOf<&MultiWaitHolderBase::m_multi_wait_node>::ListType;
|
||||
private:
|
||||
MultiWaitList m_multi_wait_list;
|
||||
MultiWaitHolderBase *m_signaled_holder;
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace ams::os::impl {
|
|||
|
||||
class MultiWaitObjectList {
|
||||
public:
|
||||
using ListType = util::IntrusiveListMemberTraits<&MultiWaitHolderBase::m_object_list_node>::ListType;
|
||||
using ListType = util::IntrusiveListMemberTraitsByNonConstexprOffsetOf<&MultiWaitHolderBase::m_object_list_node>::ListType;
|
||||
private:
|
||||
ListType m_object_list;
|
||||
public:
|
||||
|
|
|
@ -34,20 +34,22 @@ namespace ams::os::impl {
|
|||
private:
|
||||
friend class util::IntrusiveList<ThreadType, ThreadListTraits>;
|
||||
|
||||
static constexpr util::IntrusiveListNode &GetNode(ThreadType &parent) {
|
||||
static util::IntrusiveListNode &GetNode(ThreadType &parent) {
|
||||
return GetReference(parent.all_threads_node);
|
||||
}
|
||||
|
||||
static constexpr util::IntrusiveListNode const &GetNode(ThreadType const &parent) {
|
||||
static util::IntrusiveListNode const &GetNode(ThreadType const &parent) {
|
||||
return GetReference(parent.all_threads_node);
|
||||
}
|
||||
|
||||
static constexpr size_t Offset = OFFSETOF(ThreadType, all_threads_node);
|
||||
|
||||
static ThreadType &GetParent(util::IntrusiveListNode &node) {
|
||||
return *reinterpret_cast<ThreadType *>(reinterpret_cast<char *>(std::addressof(node)) - OFFSETOF(ThreadType, all_threads_node));
|
||||
return *reinterpret_cast<ThreadType *>(reinterpret_cast<char *>(std::addressof(node)) - Offset);
|
||||
}
|
||||
|
||||
static ThreadType const &GetParent(util::IntrusiveListNode const &node) {
|
||||
return *reinterpret_cast<const ThreadType *>(reinterpret_cast<const char *>(std::addressof(node)) - OFFSETOF(ThreadType, all_threads_node));
|
||||
return *reinterpret_cast<const ThreadType *>(reinterpret_cast<const char *>(std::addressof(node)) - Offset);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue