@@ -74,6 +74,7 @@ void* XArray_Init(xarray_t *pArr, xpool_t *pPool, size_t nSize, uint8_t nFixed)
7474 pArr -> nAlloc = 0 ;
7575 pArr -> nUsed = 0 ;
7676 pArr -> pPool = pPool ;
77+ pArr -> nOwnPool = 0 ;
7778
7879 if (nSize )
7980 {
@@ -88,6 +89,22 @@ void* XArray_Init(xarray_t *pArr, xpool_t *pPool, size_t nSize, uint8_t nFixed)
8889 return pArr -> pData ;
8990}
9091
92+ void * XArray_InitPool (xarray_t * pArr , size_t nPoolSize , size_t nSize , uint8_t nFixed )
93+ {
94+ xpool_t * pPool = XPool_Create (nPoolSize );
95+ if (pPool == NULL ) return NULL ;
96+
97+ void * pData = XArray_Init (pArr , pPool , nSize , nFixed );
98+ if (nSize && pData == NULL )
99+ {
100+ XPool_Destroy (pPool );
101+ return NULL ;
102+ }
103+
104+ pArr -> nOwnPool = 1 ;
105+ return pData ;
106+ }
107+
91108xarray_t * XArray_New (xpool_t * pPool , size_t nSize , uint8_t nFixed )
92109{
93110 xarray_t * pArr = (xarray_t * )xalloc (pPool , sizeof (xarray_t ));
@@ -103,6 +120,22 @@ xarray_t* XArray_New(xpool_t *pPool, size_t nSize, uint8_t nFixed)
103120 return pArr ;
104121}
105122
123+ xarray_t * XArray_NewPool (size_t nPoolSize , size_t nSize , uint8_t nFixed )
124+ {
125+ xpool_t * pPool = XPool_Create (nPoolSize );
126+ if (pPool == NULL ) return NULL ;
127+
128+ xarray_t * pArr = XArray_New (pPool , nSize , nFixed );
129+ if (nSize && pArr == NULL )
130+ {
131+ XPool_Destroy (pPool );
132+ return NULL ;
133+ }
134+
135+ pArr -> nOwnPool = 1 ;
136+ return pArr ;
137+ }
138+
106139void XArray_Clear (xarray_t * pArr )
107140{
108141 if (pArr -> pData != NULL )
@@ -115,22 +148,27 @@ void XArray_Clear(xarray_t *pArr)
115148 }
116149 }
117150
151+ if (pArr -> nOwnPool ) XPool_Reset (pArr -> pPool );
118152 pArr -> eStatus = XARRAY_STATUS_EMPTY ;
119153 pArr -> nUsed = 0 ;
120154}
121155
122156void XArray_Destroy (xarray_t * pArr )
123157{
124158 XArray_Clear (pArr );
159+
125160 xpool_t * pPool = pArr -> pPool ;
161+ uint8_t nOwnPool = pArr -> nOwnPool ;
126162
127163 xfree (pPool , pArr -> pData );
128164 pArr -> pData = NULL ;
129165 pArr -> nSize = 0 ;
130166 pArr -> nFixed = 0 ;
167+ pArr -> pPool = NULL ;
168+ pArr -> nOwnPool = 0 ;
131169
132- if (pArr -> nAlloc )
133- xfreen ( pPool , pArr , sizeof ( xarray_t ) );
170+ if (pArr -> nAlloc ) xfreen ( pPool , pArr , sizeof ( xarray_t ));
171+ if ( nOwnPool ) XPool_Destroy ( pPool );
134172}
135173
136174void XArray_Free (xarray_t * * ppArr )
0 commit comments