mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-04 22:19:02 +00:00
memory-wip branch merged
This commit is contained in:
commit
367b8e7129
17 changed files with 1203 additions and 150 deletions
|
|
@ -825,6 +825,7 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/*
|
||||
template<typename T>
|
||||
class MemoryAllocator
|
||||
{
|
||||
|
|
@ -934,6 +935,7 @@ public:
|
|||
return (NT*)(m_ptr + offset);
|
||||
}
|
||||
};
|
||||
*/
|
||||
|
||||
typedef mem_t<u8, u32> mem8_t;
|
||||
typedef mem_t<u16, u32> mem16_t;
|
||||
|
|
@ -957,3 +959,5 @@ typedef mem_list_ptr_t<u16, u32> mem16_ptr_t;
|
|||
typedef mem_list_ptr_t<u32, u32> mem32_ptr_t;
|
||||
typedef mem_list_ptr_t<u64, u32> mem64_ptr_t;
|
||||
|
||||
#include "vm.h"
|
||||
|
||||
|
|
|
|||
44
rpcs3/Emu/Memory/vm.cpp
Normal file
44
rpcs3/Emu/Memory/vm.cpp
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
#include "stdafx.h"
|
||||
|
||||
namespace vm
|
||||
{
|
||||
//TODO
|
||||
bool check_addr(u32 addr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool map(u32 addr, u32 size, u32 flags)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool unmap(u32 addr, u32 size, u32 flags)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
u32 alloc(u32 size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void unalloc(u32 addr)
|
||||
{
|
||||
}
|
||||
|
||||
u32 read32(u32 addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool read32(u32 addr, u32& value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool write32(u32 addr, u32 value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
31
rpcs3/Emu/Memory/vm.h
Normal file
31
rpcs3/Emu/Memory/vm.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
#pragma once
|
||||
|
||||
namespace vm
|
||||
{
|
||||
bool check_addr(u32 addr);
|
||||
bool map(u32 addr, u32 size, u32 flags);
|
||||
bool unmap(u32 addr, u32 size = 0, u32 flags = 0);
|
||||
u32 alloc(u32 size);
|
||||
void unalloc(u32 addr);
|
||||
|
||||
template<typename T>
|
||||
T* get_ptr(u32 addr)
|
||||
{
|
||||
return (T*)&Memory[addr];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T& get_ref(u32 addr)
|
||||
{
|
||||
return (T&)Memory[addr];
|
||||
}
|
||||
|
||||
//TODO
|
||||
u32 read32(u32 addr);
|
||||
bool read32(u32 addr, u32& value);
|
||||
bool write32(u32 addr, u32 value);
|
||||
}
|
||||
|
||||
#include "vm_ptr.h"
|
||||
#include "vm_ref.h"
|
||||
#include "vm_var.h"
|
||||
386
rpcs3/Emu/Memory/vm_ptr.h
Normal file
386
rpcs3/Emu/Memory/vm_ptr.h
Normal file
|
|
@ -0,0 +1,386 @@
|
|||
#pragma once
|
||||
|
||||
namespace vm
|
||||
{
|
||||
template<typename T, int lvl = 1, typename AT = u32>
|
||||
class ptr
|
||||
{
|
||||
AT m_addr;
|
||||
|
||||
public:
|
||||
ptr operator++ (int)
|
||||
{
|
||||
AT result = m_addr;
|
||||
m_addr += sizeof(AT);
|
||||
return { result };
|
||||
}
|
||||
|
||||
ptr& operator++ ()
|
||||
{
|
||||
m_addr += sizeof(AT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr operator-- (int)
|
||||
{
|
||||
AT result = m_addr;
|
||||
m_addr -= sizeof(AT);
|
||||
return { result };
|
||||
}
|
||||
|
||||
ptr& operator-- ()
|
||||
{
|
||||
m_addr -= sizeof(AT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr& operator += (int count)
|
||||
{
|
||||
m_addr += count * sizeof(AT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr& operator -= (int count)
|
||||
{
|
||||
m_addr -= count * sizeof(AT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr operator + (int count) const
|
||||
{
|
||||
return { m_addr + count * sizeof(AT) };
|
||||
}
|
||||
|
||||
ptr operator - (int count) const
|
||||
{
|
||||
return { m_addr - count * sizeof(AT) };
|
||||
}
|
||||
|
||||
__forceinline ptr<T, lvl - 1, AT>& operator *()
|
||||
{
|
||||
return get_ref<ptr<T, lvl - 1, AT>>(m_addr);
|
||||
}
|
||||
|
||||
__forceinline const ptr<T, lvl - 1, AT>& operator *() const
|
||||
{
|
||||
return get_ref<const ptr<T, lvl - 1, AT>>(m_addr);
|
||||
}
|
||||
|
||||
__forceinline ptr<T, lvl - 1, AT>& operator [](int index)
|
||||
{
|
||||
return get_ref<ptr<T, lvl - 1, AT>>(m_addr + sizeof(AT) * index);
|
||||
}
|
||||
|
||||
__forceinline const ptr<T, lvl - 1, AT>& operator [](int index) const
|
||||
{
|
||||
return get_ref<const ptr<T, lvl - 1, AT>>(m_addr + sizeof(AT) * index);
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return m_addr != 0;
|
||||
}
|
||||
|
||||
AT addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return Memory.IsGoodAddr(m_addr, sizeof(AT));
|
||||
}
|
||||
|
||||
static ptr make(u32 addr)
|
||||
{
|
||||
return (ptr&)addr;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, typename AT>
|
||||
class ptr<T, 1, AT>
|
||||
{
|
||||
AT m_addr;
|
||||
|
||||
public:
|
||||
__forceinline T* operator -> ()
|
||||
{
|
||||
return get_ptr<T>(m_addr);
|
||||
}
|
||||
|
||||
__forceinline const T* operator -> () const
|
||||
{
|
||||
return get_ptr<const T>(m_addr);
|
||||
}
|
||||
|
||||
ptr operator++ (int)
|
||||
{
|
||||
AT result = m_addr;
|
||||
m_addr += sizeof(T);
|
||||
return { result };
|
||||
}
|
||||
|
||||
ptr& operator++ ()
|
||||
{
|
||||
m_addr += sizeof(T);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr operator-- (int)
|
||||
{
|
||||
AT result = m_addr;
|
||||
m_addr -= sizeof(T);
|
||||
return { result };
|
||||
}
|
||||
|
||||
ptr& operator-- ()
|
||||
{
|
||||
m_addr -= sizeof(T);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr& operator += (int count)
|
||||
{
|
||||
m_addr += count * sizeof(T);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr& operator -= (int count)
|
||||
{
|
||||
m_addr -= count * sizeof(T);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ptr operator + (int count) const
|
||||
{
|
||||
return { m_addr + count * sizeof(T) };
|
||||
}
|
||||
|
||||
ptr operator - (int count) const
|
||||
{
|
||||
return { m_addr - count * sizeof(T) };
|
||||
}
|
||||
|
||||
__forceinline T& operator *()
|
||||
{
|
||||
return get_ref<T>(m_addr);
|
||||
}
|
||||
|
||||
__forceinline const T& operator *() const
|
||||
{
|
||||
return get_ref<T>(m_addr);
|
||||
}
|
||||
|
||||
__forceinline T& operator [](int index)
|
||||
{
|
||||
return get_ref<T>(m_addr + sizeof(T) * index);
|
||||
}
|
||||
|
||||
__forceinline const T& operator [](int index) const
|
||||
{
|
||||
return get_ref<const T>(m_addr + sizeof(T) * index);
|
||||
}
|
||||
|
||||
/*
|
||||
operator ref<T>()
|
||||
{
|
||||
return { m_addr };
|
||||
}
|
||||
|
||||
operator const ref<T>() const
|
||||
{
|
||||
return { m_addr };
|
||||
}
|
||||
*/
|
||||
|
||||
AT addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return m_addr != 0;
|
||||
}
|
||||
|
||||
T* get_ptr() const
|
||||
{
|
||||
return vm::get_ptr<T>(m_addr);
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return Memory.IsGoodAddr(m_addr, sizeof(T));
|
||||
}
|
||||
|
||||
static ptr make(u32 addr)
|
||||
{
|
||||
return (ptr&)addr;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename AT>
|
||||
class ptr<void, 1, AT>
|
||||
{
|
||||
AT m_addr;
|
||||
|
||||
public:
|
||||
AT addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
void* get_ptr() const
|
||||
{
|
||||
return vm::get_ptr<void>(m_addr);
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return Memory.IsGoodAddr(m_addr);
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return m_addr != 0;
|
||||
}
|
||||
|
||||
static ptr make(u32 addr)
|
||||
{
|
||||
return (ptr&)addr;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename RT, typename AT>
|
||||
class ptr<RT(*)(), 1, AT>
|
||||
{
|
||||
AT m_addr;
|
||||
|
||||
__forceinline RT call_func(bool is_async) const
|
||||
{
|
||||
Callback cb;
|
||||
cb.SetAddr(m_addr);
|
||||
return (RT)cb.Branch(!is_async);
|
||||
}
|
||||
|
||||
public:
|
||||
typedef RT(*type)();
|
||||
|
||||
__forceinline RT operator()() const
|
||||
{
|
||||
return call_func(false);
|
||||
}
|
||||
|
||||
__forceinline void async() const
|
||||
{
|
||||
call_func(true);
|
||||
}
|
||||
|
||||
AT addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
type get_ptr() const
|
||||
{
|
||||
return *((type*)vm::get_ptr<void*>(m_addr));
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return Memory.IsGoodAddr(m_addr);
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return m_addr != 0;
|
||||
}
|
||||
|
||||
static ptr make(u32 addr)
|
||||
{
|
||||
return (ptr&)addr;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename AT, typename RT, typename ...T>
|
||||
class ptr<RT(*)(T...), 1, AT>
|
||||
{
|
||||
AT m_addr;
|
||||
|
||||
__forceinline RT call_func(bool is_async, T... args) const
|
||||
{
|
||||
template<typename T>
|
||||
struct _func_arg
|
||||
{
|
||||
__forceinline static u64 get_value(const T& arg)
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, typename AT>
|
||||
struct _func_arg<ptr<T, AT>>
|
||||
{
|
||||
__forceinline static u64 get_value(const ptr<T, AT> arg)
|
||||
{
|
||||
return arg.addr();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, typename AT>
|
||||
struct _func_arg<ref<T, AT>>
|
||||
{
|
||||
__forceinline static u64 get_value(const ref<T, AT> arg)
|
||||
{
|
||||
return arg.addr();
|
||||
}
|
||||
};
|
||||
|
||||
Callback cb;
|
||||
cb.SetAddr(m_addr);
|
||||
cb.Handle(_func_arg<T>::get_value(args)...);
|
||||
return (RT)cb.Branch(!is_async);
|
||||
}
|
||||
|
||||
public:
|
||||
typedef RT(*type)(T...);
|
||||
|
||||
__forceinline RT operator()(T... args) const
|
||||
{
|
||||
return call_func(false, args...);
|
||||
}
|
||||
|
||||
__forceinline void async(T... args) const
|
||||
{
|
||||
call_func(true, args...);
|
||||
}
|
||||
|
||||
AT addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
type get_ptr() const
|
||||
{
|
||||
return *((type*)vm::get_ptr<void*>(m_addr));
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return Memory.IsGoodAddr(m_addr);
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return m_addr != 0;
|
||||
}
|
||||
|
||||
static ptr make(u32 addr)
|
||||
{
|
||||
return (ptr&)addr;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, int lvl = 1, typename AT = u32>
|
||||
class beptr : public ptr<T, lvl, be_t<AT>> {};
|
||||
}
|
||||
63
rpcs3/Emu/Memory/vm_ref.h
Normal file
63
rpcs3/Emu/Memory/vm_ref.h
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
#pragma once
|
||||
|
||||
namespace vm
|
||||
{
|
||||
template<typename T, typename AT = u32>
|
||||
class _ref_base
|
||||
{
|
||||
AT m_addr;
|
||||
|
||||
public:
|
||||
operator T&()
|
||||
{
|
||||
return get_ref<T>(m_addr);
|
||||
}
|
||||
|
||||
operator const T&() const
|
||||
{
|
||||
return get_ref<const T>(m_addr);
|
||||
}
|
||||
|
||||
AT addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return Memory.IsGoodAddr(m_addr, sizeof(T));
|
||||
}
|
||||
|
||||
static ref make(u32 addr)
|
||||
{
|
||||
return (ref&)addr;
|
||||
}
|
||||
};
|
||||
|
||||
//BE reference to LE data
|
||||
template<typename T, typename AT = u32> class brefl : public _ref_base<T, be_t<AT>> {};
|
||||
|
||||
//BE reference to BE data
|
||||
template<typename T, typename AT = u32> class brefb : public _ref_base<be_t<T>, be_t<AT>> {};
|
||||
|
||||
//LE reference to BE data
|
||||
template<typename T, typename AT = u32> class lrefb : public _ref_base<be_t<T>, AT> {};
|
||||
|
||||
//LE reference to LE data
|
||||
template<typename T, typename AT = u32> class lrefl : public _ref_base<T, AT> {};
|
||||
|
||||
namespace ps3
|
||||
{
|
||||
//default reference for HLE functions (LE reference to BE data)
|
||||
template<typename T, typename AT = u32> class ref : public lrefb {};
|
||||
|
||||
//default reference for HLE structures (BE reference to BE data)
|
||||
template<typename T, typename AT = u32> class bref : public brefb {};
|
||||
}
|
||||
|
||||
namespace psv
|
||||
{
|
||||
//default reference for HLE functions & structures (LE reference to LE data)
|
||||
template<typename T, typename AT = u32> class ref : public lrefl {};
|
||||
}
|
||||
}
|
||||
503
rpcs3/Emu/Memory/vm_var.h
Normal file
503
rpcs3/Emu/Memory/vm_var.h
Normal file
|
|
@ -0,0 +1,503 @@
|
|||
#pragma once
|
||||
|
||||
namespace vm
|
||||
{
|
||||
template<typename T>
|
||||
class var
|
||||
{
|
||||
u32 m_addr;
|
||||
u32 m_size;
|
||||
u32 m_align;
|
||||
T* m_ptr;
|
||||
|
||||
public:
|
||||
var(u32 size = sizeof(T), u32 align = sizeof(T))
|
||||
: m_size(size)
|
||||
, m_align(align)
|
||||
{
|
||||
alloc();
|
||||
}
|
||||
|
||||
var(const var& r)
|
||||
: m_size(r.m_size)
|
||||
, m_align(r.m_align)
|
||||
{
|
||||
alloc();
|
||||
*m_ptr = *r.m_ptr;
|
||||
}
|
||||
|
||||
~var()
|
||||
{
|
||||
dealloc();
|
||||
}
|
||||
|
||||
void alloc()
|
||||
{
|
||||
m_addr = Memory.Alloc(size(), m_align);
|
||||
m_ptr = Memory.IsGoodAddr(m_addr, size()) ? get_ptr<T>(m_addr) : nullptr;
|
||||
}
|
||||
|
||||
void dealloc()
|
||||
{
|
||||
if (check())
|
||||
{
|
||||
Memory.Free(m_addr);
|
||||
m_addr = 0;
|
||||
m_ptr = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
static var make(u32 addr, u32 size = sizeof(T), u32 align = sizeof(T))
|
||||
{
|
||||
var res;
|
||||
|
||||
res.m_addr = addr;
|
||||
res.m_size = size;
|
||||
res.m_align = align;
|
||||
res.m_ptr = Memory.IsGoodAddr(addr, size) ? get_ptr<T>(addr) : nullptr;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
T* operator -> ()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T* operator -> () const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T* get_ptr()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T* get_ptr() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T& value()
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
const T& value() const
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
u32 addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
u32 size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return m_ptr != nullptr;
|
||||
}
|
||||
|
||||
/*
|
||||
operator const ref<T>() const
|
||||
{
|
||||
return addr();
|
||||
}
|
||||
*/
|
||||
|
||||
operator T&()
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
operator const T&() const
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class var<T[]>
|
||||
{
|
||||
u32 m_addr;
|
||||
u32 m_count;
|
||||
u32 m_size;
|
||||
u32 m_align;
|
||||
T* m_ptr;
|
||||
|
||||
public:
|
||||
var(u32 count, u32 size = sizeof(T), u32 align = sizeof(T))
|
||||
: m_count(count)
|
||||
, m_size(size)
|
||||
, m_align(align)
|
||||
{
|
||||
alloc();
|
||||
}
|
||||
|
||||
~var()
|
||||
{
|
||||
dealloc();
|
||||
}
|
||||
|
||||
var(const var& r)
|
||||
: m_size(r.m_size)
|
||||
, m_align(r.m_align)
|
||||
{
|
||||
alloc();
|
||||
memcpy(m_ptr, r.m_ptr, size());
|
||||
}
|
||||
|
||||
void alloc()
|
||||
{
|
||||
m_addr = Memory.Alloc(size(), m_align);
|
||||
m_ptr = Memory.IsGoodAddr(m_addr, size()) ? get_ptr<T>(m_addr) : nullptr;
|
||||
}
|
||||
|
||||
void dealloc()
|
||||
{
|
||||
if (check())
|
||||
{
|
||||
Memory.Free(m_addr);
|
||||
m_addr = 0;
|
||||
m_ptr = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
static var make(u32 addr, u32 count, u32 size = sizeof(T), u32 align = sizeof(T))
|
||||
{
|
||||
var res;
|
||||
|
||||
res.m_addr = addr;
|
||||
res.m_count = count;
|
||||
res.m_size = size;
|
||||
res.m_align = align;
|
||||
res.m_ptr = Memory.IsGoodAddr(addr, size * count) ? get_ptr<T>(addr) : nullptr;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
T* begin()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T* begin() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T* end()
|
||||
{
|
||||
return m_ptr + count();
|
||||
}
|
||||
|
||||
const T* end() const
|
||||
{
|
||||
return m_ptr + count();
|
||||
}
|
||||
|
||||
T* operator -> ()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T& get()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T& get() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T* operator -> () const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
uint addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
uint size() const
|
||||
{
|
||||
return m_count * m_size;
|
||||
}
|
||||
|
||||
uint count() const
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return Memory.IsGoodAddr(m_addr, size());
|
||||
}
|
||||
|
||||
template<typename T1>
|
||||
operator const T1() const
|
||||
{
|
||||
return T1(*m_ptr);
|
||||
}
|
||||
|
||||
template<typename T1>
|
||||
operator T1()
|
||||
{
|
||||
return T1(*m_ptr);
|
||||
}
|
||||
|
||||
operator const T&() const
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
operator T&()
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
operator const T*() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
operator T*()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T& operator [](int index)
|
||||
{
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
const T& operator [](int index) const
|
||||
{
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
T& at(uint index)
|
||||
{
|
||||
if (index >= count())
|
||||
throw std::out_of_range(std::to_string(index) + " >= " + count());
|
||||
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
const T& at(uint index) const
|
||||
{
|
||||
if (index >= count())
|
||||
throw std::out_of_range(std::to_string(index) + " >= " + count());
|
||||
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
T* ptr()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T* ptr() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
/*
|
||||
operator const ptr<T>() const
|
||||
{
|
||||
return addr();
|
||||
}
|
||||
*/
|
||||
template<typename NT>
|
||||
NT* To(uint offset = 0)
|
||||
{
|
||||
return (NT*)(m_ptr + offset);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, int _count>
|
||||
class var<T[_count]>
|
||||
{
|
||||
u32 m_addr;
|
||||
u32 m_size;
|
||||
u32 m_align;
|
||||
T* m_ptr;
|
||||
|
||||
public:
|
||||
var(u32 size = sizeof(T), u32 align = sizeof(T))
|
||||
: m_size(size)
|
||||
, m_align(align)
|
||||
{
|
||||
alloc();
|
||||
}
|
||||
|
||||
~var()
|
||||
{
|
||||
dealloc();
|
||||
}
|
||||
|
||||
var(const var& r)
|
||||
: m_size(r.m_size)
|
||||
, m_align(r.m_align)
|
||||
{
|
||||
alloc();
|
||||
memcpy(m_ptr, r.m_ptr, size());
|
||||
}
|
||||
|
||||
void alloc()
|
||||
{
|
||||
m_addr = Memory.Alloc(size(), m_align);
|
||||
m_ptr = Memory.IsGoodAddr(m_addr, size()) ? get_ptr<T>(m_addr) : nullptr;
|
||||
}
|
||||
|
||||
void dealloc()
|
||||
{
|
||||
if (check())
|
||||
{
|
||||
Memory.Free(m_addr);
|
||||
m_addr = 0;
|
||||
m_ptr = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
T* operator -> ()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T* begin()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T* begin() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T* end()
|
||||
{
|
||||
return m_ptr + count();
|
||||
}
|
||||
|
||||
const T* end() const
|
||||
{
|
||||
return m_ptr + count();
|
||||
}
|
||||
|
||||
T& get()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T& get() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T* operator -> () const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
uint addr() const
|
||||
{
|
||||
return m_addr;
|
||||
}
|
||||
|
||||
__forceinline uint count() const
|
||||
{
|
||||
return _count;
|
||||
}
|
||||
|
||||
uint size() const
|
||||
{
|
||||
return _count * m_size;
|
||||
}
|
||||
|
||||
bool check() const
|
||||
{
|
||||
return m_ptr != nullptr;
|
||||
}
|
||||
|
||||
template<typename T1>
|
||||
operator const T1() const
|
||||
{
|
||||
return T1(*m_ptr);
|
||||
}
|
||||
|
||||
template<typename T1>
|
||||
operator T1()
|
||||
{
|
||||
return T1(*m_ptr);
|
||||
}
|
||||
|
||||
operator const T&() const
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
operator T&()
|
||||
{
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
operator const T*() const
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
operator T*()
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T& operator [](uint index)
|
||||
{
|
||||
assert(index < count());
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
const T& operator [](uint index) const
|
||||
{
|
||||
assert(index < count());
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
T& at(uint index)
|
||||
{
|
||||
if (index >= count())
|
||||
throw std::out_of_range(std::to_string(index) + " >= " + count());
|
||||
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
const T& at(uint index) const
|
||||
{
|
||||
if (index >= count())
|
||||
throw std::out_of_range(std::to_string(index) + " >= " + count());
|
||||
|
||||
return *(T*)((u8*)m_ptr + (m_size < m_align ? m_align : m_size) * index);
|
||||
}
|
||||
|
||||
/*
|
||||
operator const ptr<T>() const
|
||||
{
|
||||
return addr();
|
||||
}
|
||||
*/
|
||||
template<typename NT>
|
||||
NT* To(uint offset = 0)
|
||||
{
|
||||
return (NT*)(m_ptr + offset);
|
||||
}
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue