Files
LayaNative2.0/Conch/source/webglPlus/JSObjBase.h
T
2020-11-11 16:17:13 +08:00

175 lines
5.0 KiB
C++

#ifndef __JSOBJECT_BASE_NODE_H___
#define __JSOBJECT_BASE_NODE_H___
#include <vector>
#include <string>
#include <functional>
namespace laya
{
class JCListNode
{
public:
JCListNode* _Prev;
JCListNode* _Next;
int id; // for debug
JCListNode() {
_Prev = _Next = this;
static int n = 0;
id = n++;
}
virtual ~JCListNode() {
//如果在链表上则删除
JCListNode* pPrev = _Prev;
JCListNode* pNext = _Next;
pPrev->_Next = _Next;
pNext->_Prev = _Prev;
_Next = this;
_Prev = this;
}
inline bool notInChain() {
return _Prev == this && _Next == this;
}
};
/**
* @brief 因为stl的list在删除对象的时候不太方便,需要遍历找到iterator,所以先自己写一个
*/
class JCSimpList
{
protected:
JCListNode* pHead; //pHead只是表示头,不是有效内容
int nSize;
public:
JCSimpList() {
pHead = new JCListNode();
nSize = 0;
}
~JCSimpList() {
delete pHead;
pHead = 0;
nSize = 0;
}
int size() {
return nSize;
}
//这个不要了使用了。因为与stl的标准不一致。
JCListNode* getHead() {
return pHead;
}
//begin是有效值。除非整个list没有内容,那他等于end()
JCListNode* begin() {
return pHead->_Next;
}
//end是无效值。就是指向pHead
JCListNode* end() {
return pHead;
}
void push_back(JCListNode* pNode) {
JCListNode* pTail = pHead->_Prev;
if (pTail == pNode)
return;
pTail->_Next = pNode;
pNode->_Prev = pTail;
pNode->_Next = pHead;
pHead->_Prev = pNode;
nSize++;
}
JCListNode* pop_back() {
JCListNode* pTail = pHead->_Prev;
JCListNode* pPrev = pTail->_Prev;
//pnext = phead
pPrev->_Next = pHead;
pHead->_Prev = pPrev;
pTail->_Next = pTail;
pTail->_Prev = pTail;
nSize--;
if (nSize<0)nSize = 0;
return pTail;
}
void push_front(JCListNode* pNode) {
if (pNode == pHead->_Next)
return;
pNode->_Next = pHead->_Next;
pHead->_Next->_Prev = pNode;
pHead->_Next = pNode;
pNode->_Prev = pHead;
nSize++;
}
JCListNode* pop_front() {
JCListNode* pDel = pHead->_Next;
pDel->_Next->_Prev = pHead;
pHead->_Next = pDel->_Next;
pDel->_Prev = pDel;
pDel->_Next = pDel;
nSize--;
if (nSize<0)nSize = 0;
return pDel;
}
//返回下一个节点
JCListNode* delNode(JCListNode* pNode) {
if (pNode->notInChain())
return NULL;
JCListNode* pPrev = pNode->_Prev;
JCListNode* pNext = pNode->_Next;
pPrev->_Next = pNode->_Next;
pNext->_Prev = pNode->_Prev;
pNode->_Next = pNode;
pNode->_Prev = pNode;
nSize--;
if (nSize<0)nSize = 0;
return pNext;
}
void clear() {
}
};
struct JsObjClassInfo {
const char* ClassName;
const JsObjClassInfo* ParentClass;
const unsigned int ClsID;
void* objTemplate;
};
/*
js对象对应的c端对象。
所有导出给js的对象都要从这个继承
并且在创建和删除的时候进行管理
*/
class JSObjNode :public JCListNode {
public:
static JsObjClassInfo JSCLSINFO;
static JCSimpList* s_pListJSObj; //属于本线程的所有的js对象
JSObjNode();
virtual ~JSObjNode(); //这个会引入虚函数表,不知道有没有问题
const JsObjClassInfo* m_pClsInfo;// const char* m_pClassName;
//cls是不是从自己继承的
bool IsSubClass(JsObjClassInfo* cls) {
const JsObjClassInfo* cur = (const JsObjClassInfo*)cls;
while (cur) {
if (cur->ClsID == m_pClsInfo->ClsID)
return true;
cur = cur->ParentClass;
}
return false;
}
};
extern unsigned int gnJSClsID;
#define ADDJSCLSINFO(cls,par) JsObjClassInfo cls::JSCLSINFO = { #cls,&par::JSCLSINFO,gnJSClsID++,0 };
template<class T>
bool IsSubClass(JsObjClassInfo* cls) {
const JsObjClassInfo* cur = (const JsObjClassInfo*)cls;
while (cur) {
if (cur->ClsID == T::JSCLSINFO.ClsID)
return true;
cur = cur->ParentClass;
}
return false;
}
}
#endif
//-----------------------------END FILE--------------------------------