tarray.c 13.3 KB
Newer Older
H
more  
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

S
tarray  
Shengliang Guan 已提交
16
#define _DEFAULT_SOURCE
H
more  
hzcheng 已提交
17
#include "tarray.h"
18
#include "tcoding.h"
H
more  
hzcheng 已提交
19

20 21
// todo refactor API

22
SArray* taosArrayInit(size_t size, size_t elemSize) {
H
Haojun Liao 已提交
23 24 25 26
  if (elemSize == 0) {
    terrno = TSDB_CODE_INVALID_PARA;
    return NULL;
  }
H
more  
hzcheng 已提交
27 28 29 30 31

  if (size < TARRAY_MIN_SIZE) {
    size = TARRAY_MIN_SIZE;
  }

wafwerar's avatar
wafwerar 已提交
32
  SArray* pArray = taosMemoryMalloc(sizeof(SArray));
H
more  
hzcheng 已提交
33
  if (pArray == NULL) {
34
    terrno = TSDB_CODE_OUT_OF_MEMORY;
H
more  
hzcheng 已提交
35 36 37
    return NULL;
  }

H
Haojun Liao 已提交
38
  pArray->size = 0;
wafwerar's avatar
wafwerar 已提交
39
  pArray->pData = taosMemoryCalloc(size, elemSize);
H
more  
hzcheng 已提交
40
  if (pArray->pData == NULL) {
41
    terrno = TSDB_CODE_OUT_OF_MEMORY;
wafwerar's avatar
wafwerar 已提交
42
    taosMemoryFree(pArray);
H
more  
hzcheng 已提交
43 44 45 46 47 48 49 50
    return NULL;
  }

  pArray->capacity = size;
  pArray->elemSize = elemSize;
  return pArray;
}

51
SArray* taosArrayInit_s(size_t elemSize, size_t initialSize) {
H
Haojun Liao 已提交
52 53 54 55 56 57
  SArray* pArray = taosMemoryMalloc(sizeof(SArray));
  if (pArray == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return NULL;
  }

H
Haojun Liao 已提交
58
  pArray->size = initialSize;
H
Haojun Liao 已提交
59 60 61 62 63 64 65 66 67 68 69 70
  pArray->pData = taosMemoryCalloc(initialSize, elemSize);
  if (pArray->pData == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    taosMemoryFree(pArray);
    return NULL;
  }

  pArray->capacity = initialSize;
  pArray->elemSize = elemSize;
  return pArray;
}

H
hjxilinx 已提交
71
static int32_t taosArrayResize(SArray* pArray) {
H
more  
hzcheng 已提交
72 73 74 75 76
  assert(pArray->size >= pArray->capacity);

  size_t size = pArray->capacity;
  size = (size << 1u);

wafwerar's avatar
wafwerar 已提交
77
  void* tmp = taosMemoryRealloc(pArray->pData, size * pArray->elemSize);
H
hjxilinx 已提交
78 79
  if (tmp == NULL) {  // reallocate failed, the original buffer remains
    return -1;
H
more  
hzcheng 已提交
80 81 82 83
  }

  pArray->pData = tmp;
  pArray->capacity = size;
S
tarray  
Shengliang Guan 已提交
84

H
hjxilinx 已提交
85
  return 0;
H
more  
hzcheng 已提交
86 87
}

L
Liu Jicong 已提交
88 89
int32_t taosArrayEnsureCap(SArray* pArray, size_t newCap) {
  if (newCap > pArray->capacity) {
H
Hongze Cheng 已提交
90
    size_t tsize = (pArray->capacity << 1u);
L
Liu Jicong 已提交
91
    while (newCap > tsize) {
H
Hongze Cheng 已提交
92 93 94
      tsize = (tsize << 1u);
    }

wafwerar's avatar
wafwerar 已提交
95
    pArray->pData = taosMemoryRealloc(pArray->pData, tsize * pArray->elemSize);
H
Hongze Cheng 已提交
96
    if (pArray->pData == NULL) {
L
Liu Jicong 已提交
97
      return -1;
H
hjxilinx 已提交
98
    }
H
Hongze Cheng 已提交
99 100

    pArray->capacity = tsize;
H
more  
hzcheng 已提交
101
  }
L
Liu Jicong 已提交
102 103 104
  return 0;
}

S
tarray  
Shengliang Guan 已提交
105
void* taosArrayAddBatch(SArray* pArray, const void* pData, int32_t nEles) {
L
Liu Jicong 已提交
106
  if (pData == NULL) {
L
Liu Jicong 已提交
107 108 109
    return NULL;
  }

S
tarray  
Shengliang Guan 已提交
110
  if (taosArrayEnsureCap(pArray, pArray->size + nEles) != 0) {
L
Liu Jicong 已提交
111 112
    return NULL;
  }
H
more  
hzcheng 已提交
113 114

  void* dst = TARRAY_GET_ELEM(pArray, pArray->size);
H
Hongze Cheng 已提交
115
  memcpy(dst, pData, pArray->elemSize * nEles);
H
more  
hzcheng 已提交
116

H
Hongze Cheng 已提交
117
  pArray->size += nEles;
H
more  
hzcheng 已提交
118 119 120
  return dst;
}

S
tarray  
Shengliang Guan 已提交
121
void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*)) {
122 123 124 125 126 127
  size_t size = pArray->size;
  if (size <= 1) {
    return;
  }

  int32_t pos = 0;
S
tarray  
Shengliang Guan 已提交
128
  for (int32_t i = 1; i < size; ++i) {
129 130 131 132 133 134 135 136 137 138 139 140 141
    char* p1 = taosArrayGet(pArray, pos);
    char* p2 = taosArrayGet(pArray, i);

    if (comparFn(p1, p2) == 0) {
      // do nothing
    } else {
      if (pos + 1 != i) {
        void* p = taosArrayGet(pArray, pos + 1);
        if (fp != NULL) {
          fp(p);
        }

        taosArraySet(pArray, pos + 1, p2);
142 143
        memset(TARRAY_GET_ELEM(pArray, i), 0, pArray->elemSize);
	pos += 1;
144 145 146 147 148 149 150
      } else {
        pos += 1;
      }
    }
  }

  if (fp != NULL) {
S
tarray  
Shengliang Guan 已提交
151
    for (int32_t i = pos + 1; i < pArray->size; ++i) {
152 153 154 155 156 157 158 159
      void* p = taosArrayGet(pArray, i);
      fp(p);
    }
  }

  pArray->size = pos + 1;
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
void taosArrayRemoveDuplicateP(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*)) {
  size_t size = pArray->size;
  if (size <= 1) {
    return;
  }

  int32_t pos = 0;
  for (int32_t i = 1; i < size; ++i) {
    char* p1 = taosArrayGet(pArray, pos);
    char* p2 = taosArrayGet(pArray, i);

    if (comparFn(p1, p2) == 0) {
      // do nothing
    } else {
      if (pos + 1 != i) {
175
        void* p = taosArrayGetP(pArray, pos + 1);
176 177 178 179 180
        if (fp != NULL) {
          fp(p);
        }

        taosArraySet(pArray, pos + 1, p2);
181 182
        memset(TARRAY_GET_ELEM(pArray, i), 0, pArray->elemSize);
	pos += 1;
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
      } else {
        pos += 1;
      }
    }
  }

  if (fp != NULL) {
    for (int32_t i = pos + 1; i < pArray->size; ++i) {
      void* p = taosArrayGetP(pArray, i);
      fp(p);
    }
  }

  pArray->size = pos + 1;
}

H
Haojun Liao 已提交
199
void* taosArrayAddAll(SArray* pArray, const SArray* pInput) {
200 201 202 203 204
  if (pInput) {
    return taosArrayAddBatch(pArray, pInput->pData, (int32_t)taosArrayGetSize(pInput));
  } else {
    return NULL;
  }
H
Haojun Liao 已提交
205 206
}

H
Hongze Cheng 已提交
207 208 209 210 211 212 213 214
void* taosArrayReserve(SArray* pArray, int32_t num) {
  if (taosArrayEnsureCap(pArray, pArray->size + num) != 0) {
    return NULL;
  }

  void* dst = TARRAY_GET_ELEM(pArray, pArray->size);
  pArray->size += num;

H
Hongze Cheng 已提交
215 216
  memset(dst, 0, num * pArray->elemSize);

H
Hongze Cheng 已提交
217 218 219
  return dst;
}

weixin_48148422's avatar
weixin_48148422 已提交
220
void* taosArrayPop(SArray* pArray) {
221
  if (pArray->size == 0) {
weixin_48148422's avatar
weixin_48148422 已提交
222
    return NULL;
H
more  
hzcheng 已提交
223
  }
H
Haojun Liao 已提交
224

H
more  
hzcheng 已提交
225
  pArray->size -= 1;
weixin_48148422's avatar
weixin_48148422 已提交
226
  return TARRAY_GET_ELEM(pArray, pArray->size);
H
more  
hzcheng 已提交
227 228
}

229
void* taosArrayGet(const SArray* pArray, size_t index) {
230 231 232
  if (NULL == pArray) {
    return NULL;
  }
H
Haojun Liao 已提交
233 234 235 236 237 238

  if (index >= pArray->size) {
    uError("index is out of range, current:%"PRIzu" max:%d", index, pArray->capacity);
    return NULL;
  }

H
more  
hzcheng 已提交
239 240 241
  return TARRAY_GET_ELEM(pArray, index);
}

242
void* taosArrayGetP(const SArray* pArray, size_t index) {
H
Haojun Liao 已提交
243 244 245 246 247
  void** p = taosArrayGet(pArray, index);
  if (p == NULL) {
    return NULL;
  }
  return *p;
H
hjxilinx 已提交
248 249
}

H
Haojun Liao 已提交
250 251 252 253 254 255 256
void* taosArrayGetLast(const SArray* pArray) {
  if (pArray->size == 0) {
    return NULL;
  }

  return TARRAY_GET_ELEM(pArray, pArray->size - 1);
}
H
Haojun Liao 已提交
257

L
Liu Jicong 已提交
258
size_t taosArrayGetSize(const SArray* pArray) {
S
Shengliang Guan 已提交
259 260 261
  if (pArray == NULL) {
    return 0;
  }
H
Hongze Cheng 已提交
262
  return TARRAY_SIZE(pArray);
S
Shengliang Guan 已提交
263
}
H
more  
hzcheng 已提交
264

H
hjxilinx 已提交
265
void* taosArrayInsert(SArray* pArray, size_t index, void* pData) {
H
more  
hzcheng 已提交
266
  if (pArray == NULL || pData == NULL) {
H
hjxilinx 已提交
267
    return NULL;
H
more  
hzcheng 已提交
268 269 270
  }

  if (index >= pArray->size) {
H
hjxilinx 已提交
271
    return taosArrayPush(pArray, pData);
H
more  
hzcheng 已提交
272 273 274
  }

  if (pArray->size >= pArray->capacity) {
H
hjxilinx 已提交
275
    int32_t ret = taosArrayResize(pArray);
S
tarray  
Shengliang Guan 已提交
276

H
hjxilinx 已提交
277 278 279
    if (ret < 0) {
      return NULL;
    }
H
more  
hzcheng 已提交
280 281 282 283
  }

  void* dst = TARRAY_GET_ELEM(pArray, index);

S
Shengliang Guan 已提交
284 285
  int32_t remain = (int32_t)(pArray->size - index);
  memmove((char*)dst + pArray->elemSize, (char*)dst, pArray->elemSize * remain);
H
more  
hzcheng 已提交
286 287 288
  memcpy(dst, pData, pArray->elemSize);

  pArray->size += 1;
S
tarray  
Shengliang Guan 已提交
289

H
hjxilinx 已提交
290
  return dst;
H
more  
hzcheng 已提交
291 292
}

H
Hongze Cheng 已提交
293
void taosArraySet(SArray* pArray, size_t index, void* pData) {
H
refact  
Hongze Cheng 已提交
294 295 296 297
  assert(index < pArray->size);
  memcpy(TARRAY_GET_ELEM(pArray, index), pData, pArray->elemSize);
}

L
Liu Jicong 已提交
298 299 300
void taosArrayPopFrontBatch(SArray* pArray, size_t cnt) {
  assert(cnt <= pArray->size);
  pArray->size = pArray->size - cnt;
L
Liu Jicong 已提交
301
  if (pArray->size == 0 || cnt == 0) {
L
Liu Jicong 已提交
302 303
    return;
  }
L
Liu Jicong 已提交
304
  memmove(pArray->pData, (char*)pArray->pData + cnt * pArray->elemSize, pArray->size * pArray->elemSize);
L
Liu Jicong 已提交
305 306
}

L
Liu Jicong 已提交
307 308 309 310 311
void taosArrayPopTailBatch(SArray* pArray, size_t cnt) {
  assert(cnt <= pArray->size);
  pArray->size = pArray->size - cnt;
}

312 313
void taosArrayRemove(SArray* pArray, size_t index) {
  assert(index < pArray->size);
S
tarray  
Shengliang Guan 已提交
314

315 316 317 318
  if (index == pArray->size - 1) {
    taosArrayPop(pArray);
    return;
  }
S
tarray  
Shengliang Guan 已提交
319

320
  size_t remain = pArray->size - index - 1;
S
tarray  
Shengliang Guan 已提交
321 322
  memmove((char*)pArray->pData + index * pArray->elemSize, (char*)pArray->pData + (index + 1) * pArray->elemSize,
          remain * pArray->elemSize);
323 324 325
  pArray->size -= 1;
}

H
Hongze Cheng 已提交
326 327 328 329 330 331 332 333 334 335 336 337 338 339
void taosArrayRemoveBatch(SArray* pArray, size_t index, size_t num, FDelete fp) {
  ASSERT(index + num <= pArray->size);

  if (fp) {
    for (int32_t i = 0; i < num; i++) {
      fp(taosArrayGet(pArray, index + i));
    }
  }

  memmove((char*)pArray->pData + index * pArray->elemSize, (char*)pArray->pData + (index + num) * pArray->elemSize,
          (pArray->size - index - num) * pArray->elemSize);
  pArray->size -= num;
}

H
Haojun Liao 已提交
340
SArray* taosArrayFromList(const void* src, size_t size, size_t elemSize) {
H
Haojun Liao 已提交
341 342 343 344
  if (elemSize <= 0) {
    terrno = TSDB_CODE_INVALID_PARA;
    return NULL;
  }
H
Haojun Liao 已提交
345

H
Haojun Liao 已提交
346
  SArray* pDst = taosArrayInit(size, elemSize);
H
Haojun Liao 已提交
347 348 349 350
  memcpy(pDst->pData, src, elemSize * size);
  pDst->size = size;

  return pDst;
351 352
}

H
Haojun Liao 已提交
353
SArray* taosArrayDup(const SArray* pSrc, __array_item_dup_fn_t fn) {
S
tarray  
Shengliang Guan 已提交
354
  if (pSrc->size == 0) {  // empty array list
H
hjxilinx 已提交
355 356
    return taosArrayInit(8, pSrc->elemSize);
  }
S
tarray  
Shengliang Guan 已提交
357

H
hjxilinx 已提交
358
  SArray* dst = taosArrayInit(pSrc->size, pSrc->elemSize);
S
tarray  
Shengliang Guan 已提交
359

H
Haojun Liao 已提交
360 361 362 363 364
  if (fn == NULL) {
    memcpy(dst->pData, pSrc->pData, pSrc->elemSize * pSrc->size);
  } else {
    ASSERT(pSrc->elemSize == sizeof(void*));

H
Hongze Cheng 已提交
365
    for (int32_t i = 0; i < pSrc->size; ++i) {
H
Haojun Liao 已提交
366
      void* p = fn(taosArrayGetP(pSrc, i));
H
Hongze Cheng 已提交
367
      memcpy(((char*)dst->pData) + i * dst->elemSize, &p, dst->elemSize);
H
Haojun Liao 已提交
368 369 370
    }
  }

H
hjxilinx 已提交
371
  dst->size = pSrc->size;
H
Haojun Liao 已提交
372

H
hjxilinx 已提交
373 374 375
  return dst;
}

weixin_48148422's avatar
weixin_48148422 已提交
376
void taosArrayClear(SArray* pArray) {
S
Shengliang Guan 已提交
377
  if (pArray == NULL) return;
weixin_48148422's avatar
weixin_48148422 已提交
378 379 380
  pArray->size = 0;
}

D
dapan1121 已提交
381 382 383 384 385 386 387 388 389 390 391 392 393 394
void taosArrayClearEx(SArray* pArray, void (*fp)(void*)) {
  if (pArray == NULL) return;
  if (fp == NULL) {
    pArray->size = 0;
    return;
  }

  for (int32_t i = 0; i < pArray->size; ++i) {
    fp(TARRAY_GET_ELEM(pArray, i));
  }

  pArray->size = 0;
}

R
root 已提交
395 396 397 398 399 400 401 402 403 404 405 406 407 408
void taosArrayClearP(SArray* pArray, FDelete fp) {
  if (pArray == NULL) return;
  if (fp == NULL) {
    pArray->size = 0;
    return;
  }

  for (int32_t i = 0; i < pArray->size; ++i) {
    fp(*(void**)TARRAY_GET_ELEM(pArray, i));
  }

  pArray->size = 0;
}

H
Hongze Cheng 已提交
409 410
void* taosArrayDestroy(SArray* pArray) {
  if (pArray) {
wafwerar's avatar
wafwerar 已提交
411 412
    taosMemoryFree(pArray->pData);
    taosMemoryFree(pArray);
H
more  
hzcheng 已提交
413 414
  }

H
Hongze Cheng 已提交
415
  return NULL;
H
more  
hzcheng 已提交
416
}
weixin_48148422's avatar
weixin_48148422 已提交
417

418
void taosArrayDestroyP(SArray* pArray, FDelete fp) {
L
Liu Jicong 已提交
419 420 421 422 423
  if (pArray) {
    for (int32_t i = 0; i < pArray->size; i++) {
      fp(*(void**)TARRAY_GET_ELEM(pArray, i));
    }
    taosArrayDestroy(pArray);
424 425 426 427
  }
}

void taosArrayDestroyEx(SArray* pArray, FDelete fp) {
H
Haojun Liao 已提交
428 429 430 431
  if (pArray == NULL) {
    return;
  }

H
Haojun Liao 已提交
432
  if (fp == NULL) {
H
Haojun Liao 已提交
433 434
    taosArrayDestroy(pArray);
    return;
H
Haojun Liao 已提交
435 436
  }

S
tarray  
Shengliang Guan 已提交
437
  for (int32_t i = 0; i < pArray->size; ++i) {
H
Haojun Liao 已提交
438 439 440 441 442 443
    fp(TARRAY_GET_ELEM(pArray, i));
  }

  taosArrayDestroy(pArray);
}

444
void taosArraySort(SArray* pArray, __compar_fn_t compar) {
wafwerar's avatar
wafwerar 已提交
445
  taosSort(pArray->pData, pArray->size, pArray->elemSize, compar);
weixin_48148422's avatar
weixin_48148422 已提交
446 447
}

S
tarray  
Shengliang Guan 已提交
448
void* taosArraySearch(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags) {
H
refact  
Hongze Cheng 已提交
449
  return taosbsearch(key, pArray->pData, pArray->size, pArray->elemSize, comparFn, flags);
weixin_48148422's avatar
weixin_48148422 已提交
450 451
}

S
tarray  
Shengliang Guan 已提交
452
int32_t taosArraySearchIdx(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags) {
L
Liu Jicong 已提交
453
  void* item = taosArraySearch(pArray, key, comparFn, flags);
L
Liu Jicong 已提交
454
  return item == NULL ? -1 : (int32_t)((char*)item - (char*)pArray->pData) / pArray->elemSize;
L
Liu Jicong 已提交
455 456
}

S
tarray  
Shengliang Guan 已提交
457 458
static int32_t taosArrayPartition(SArray* pArray, int32_t i, int32_t j, __ext_compar_fn_t fn, const void* userData) {
  void* key = taosArrayGetP(pArray, i);
459
  while (i < j) {
S
tarray  
Shengliang Guan 已提交
460 461 462 463 464
    while (i < j && fn(taosArrayGetP(pArray, j), key, userData) >= 0) {
      j--;
    }
    if (i < j) {
      void* a = taosArrayGetP(pArray, j);
465 466
      taosArraySet(pArray, i, &a);
    }
S
tarray  
Shengliang Guan 已提交
467 468 469
    while (i < j && fn(taosArrayGetP(pArray, i), key, userData) <= 0) {
      i++;
    }
470
    if (i < j) {
S
tarray  
Shengliang Guan 已提交
471
      void* a = taosArrayGetP(pArray, i);
472 473 474
      taosArraySet(pArray, j, &a);
    }
  }
S
tarray  
Shengliang Guan 已提交
475
  taosArraySet(pArray, i, &key);
476 477 478
  return i;
}

dengyihao's avatar
dengyihao 已提交
479
static void taosArrayQuicksortImpl(SArray* pArray, int32_t low, int32_t high, __ext_compar_fn_t fn, const void* param) {
480
  if (low < high) {
S
tarray  
Shengliang Guan 已提交
481
    int32_t idx = taosArrayPartition(pArray, low, high, fn, param);
dengyihao's avatar
dengyihao 已提交
482 483
    taosArrayQuicksortImpl(pArray, low, idx - 1, fn, param);
    taosArrayQuicksortImpl(pArray, idx + 1, high, fn, param);
S
tarray  
Shengliang Guan 已提交
484
  }
485 486
}

S
tarray  
Shengliang Guan 已提交
487
static void taosArrayQuickSort(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
488
  if (pArray->size <= 1) {
489
    return;
S
tarray  
Shengliang Guan 已提交
490
  }
dengyihao's avatar
dengyihao 已提交
491
  taosArrayQuicksortImpl(pArray, 0, (int32_t)(taosArrayGetSize(pArray) - 1), fn, param);
492
}
S
tarray  
Shengliang Guan 已提交
493 494

static void taosArrayInsertSort(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
495
  if (pArray->size <= 1) {
496
    return;
S
tarray  
Shengliang Guan 已提交
497 498 499
  }
  for (int32_t i = 1; i <= pArray->size - 1; ++i) {
    for (int32_t j = i; j > 0; --j) {
500
      if (fn(taosArrayGetP(pArray, j), taosArrayGetP(pArray, j - 1), param) == -1) {
S
tarray  
Shengliang Guan 已提交
501 502
        void* a = taosArrayGetP(pArray, j);
        void* b = taosArrayGetP(pArray, j - 1);
503 504 505 506 507 508 509
        taosArraySet(pArray, j - 1, &a);
        taosArraySet(pArray, j, &b);
      } else {
        break;
      }
    }
  }
510
  return;
S
tarray  
Shengliang Guan 已提交
511 512
}

513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode) {
  int32_t tlen = 0;
  int32_t sz = pArray->size;
  tlen += taosEncodeFixedI32(buf, sz);
  for (int32_t i = 0; i < sz; i++) {
    void* data = taosArrayGetP(pArray, i);
    tlen += encode(buf, data);
  }
  return tlen;
}

void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t dataSz) {
  int32_t sz;
  buf = taosDecodeFixedI32(buf, &sz);
  *pArray = taosArrayInit(sz, sizeof(void*));
  for (int32_t i = 0; i < sz; i++) {
    void* data = taosMemoryCalloc(1, dataSz);
    buf = decode(buf, data);
L
Liu Jicong 已提交
531
    taosArrayPush(*pArray, &data);
532 533 534 535
  }
  return (void*)buf;
}

536
// todo remove it
S
tarray  
Shengliang Guan 已提交
537 538 539 540
// order array<type *>
void taosArraySortPWithExt(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
  taosArrayGetSize(pArray) > 8 ? taosArrayQuickSort(pArray, fn, param) : taosArrayInsertSort(pArray, fn, param);
}
L
Liu Jicong 已提交
541

dengyihao's avatar
dengyihao 已提交
542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
void taosArraySwap(SArray* a, SArray* b) {
  if (a == NULL || b == NULL) return;
  size_t t = a->size;
  a->size = b->size;
  b->size = t;

  uint32_t cap = a->capacity;
  a->capacity = b->capacity;
  b->capacity = cap;

  uint32_t elem = a->elemSize;
  a->elemSize = b->elemSize;
  b->elemSize = elem;

  void* data = a->pData;
  a->pData = b->pData;
  b->pData = data;
}