t_c_array.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
  2. * This file is part of clib library
  3. * Copyright (C) 2011 Avinash Dongre ( dongre.avinash@gmail.com )
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a copy
  6. * of this software and associated documentation files (the "Software"), to deal
  7. * in the Software without restriction, including without limitation the rights
  8. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. * copies of the Software, and to permit persons to whom the Software is
  10. * furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be included in
  13. * all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. * THE SOFTWARE.
  22. ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
  23. #include "c_lib.h"
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <stdio.h>
  27. #include <assert.h>
  28. static int
  29. compare_e ( void *left, void *right ) {
  30. int *l = (int*) left;
  31. int *r = (int*) right;
  32. return *l == *r ;
  33. }
  34. static void
  35. free_e ( void *ptr ) {
  36. if ( ptr )
  37. free ( ptr);
  38. }
  39. static void
  40. print_e ( void *ptr ){
  41. if ( ptr )
  42. printf ( "%d\n", *(int*)ptr);
  43. }
  44. static void
  45. test_with_int() {
  46. int size = 10;
  47. int i = 0;
  48. int rc ;
  49. void* p_rv = (void* )0;
  50. int rv = 0;
  51. struct clib_array* myArray = new_clib_array (8,compare_e,NULL);
  52. assert ( clib_true == empty_clib_array( myArray ));
  53. for ( i = 0; i <= size; i++) {
  54. push_back_clib_array ( myArray, &i ,sizeof(int));
  55. }
  56. assert ( clib_false == empty_clib_array( myArray ));
  57. assert ( size + 1 == size_clib_array( myArray ));
  58. for ( i = 0; i <= size; i++) {
  59. rc = element_at_clib_array ( myArray, i , &p_rv );
  60. rv = *(int*)p_rv;
  61. assert ( rv == i );
  62. free ( p_rv );
  63. }
  64. rc = front_clib_array ( myArray, &p_rv );
  65. rv = *(int*)p_rv;
  66. assert ( rv == 0 );
  67. free ( p_rv );
  68. rc = back_clib_array( myArray, &p_rv );
  69. rv = *(int*)p_rv;
  70. assert ( rv == size );
  71. free ( p_rv );
  72. remove_clib_array( myArray, 0 );
  73. assert ( size == size_clib_array( myArray ));
  74. rc = element_at_clib_array ( myArray, 0 , &p_rv );
  75. rv = *(int*)p_rv;
  76. assert ( rv == 1 );
  77. free ( p_rv );
  78. size = size_clib_array( myArray );
  79. remove_clib_array( myArray, size/2 );
  80. assert ( size - 1 == size_clib_array( myArray ));
  81. rc = element_at_clib_array ( myArray, size/2 , &p_rv );
  82. rv = *(int*)p_rv;
  83. assert ( rv == size/2 + 2 );
  84. free ( p_rv );
  85. size = size_clib_array( myArray );
  86. remove_clib_array( myArray, size - 1);
  87. assert ( size - 1 == size_clib_array( myArray ));
  88. size = size_clib_array( myArray );
  89. rc = element_at_clib_array ( myArray, size - 1, &p_rv );
  90. rv = *(int*)p_rv;
  91. assert ( rv == 9 );
  92. free ( p_rv );
  93. i = 900;
  94. insert_at_clib_array ( myArray, 5, &i, sizeof(int));
  95. rc = element_at_clib_array ( myArray, 5 , &p_rv );
  96. rv = *(int*)p_rv;
  97. assert ( rv == i );
  98. free ( p_rv );
  99. rc = element_at_clib_array ( myArray, 6 , &p_rv );
  100. rv = *(int*)p_rv;
  101. assert ( rv == 7 );
  102. free ( p_rv );
  103. for ( i = 0; i < size_clib_array(myArray ); i++){
  104. rc = element_at_clib_array ( myArray, i , &p_rv );
  105. print_e ( p_rv);
  106. free ( p_rv );
  107. }
  108. delete_clib_array ( myArray );
  109. }
  110. static void
  111. test_with_pointers() {
  112. int size = 10;
  113. int i = 0;
  114. int *rv, rc ;
  115. void* p_rv = (void* )0;
  116. struct clib_array* myArray = new_clib_array (8,compare_e,free_e);
  117. assert ( clib_true == empty_clib_array( myArray ));
  118. for ( i = 0; i < size; i++) {
  119. int *v = ( int*) malloc ( sizeof(int));
  120. memcpy ( v, &i, sizeof(int));
  121. push_back_clib_array ( myArray, v ,sizeof(int*));
  122. free ( v );
  123. }
  124. assert ( clib_false == empty_clib_array( myArray ));
  125. assert ( size == size_clib_array( myArray ));
  126. for ( i = 0; i < size; i++) {
  127. rc = element_at_clib_array ( myArray, i , &p_rv );
  128. rv = (int*) p_rv;
  129. assert ( *rv == i );
  130. free ( p_rv);
  131. }
  132. rc = front_clib_array ( myArray, &p_rv );
  133. rv = (int*) p_rv;
  134. assert ( *rv == 0 );
  135. free ( p_rv);
  136. rc = back_clib_array( myArray, &p_rv );
  137. rv = (int*) p_rv;
  138. assert ( *rv == size - 1);
  139. free ( p_rv);
  140. remove_clib_array( myArray, 0 );
  141. assert ( size - 1 == size_clib_array( myArray ));
  142. rc = element_at_clib_array ( myArray, 0 , &p_rv );
  143. rv = (int*) p_rv;
  144. assert ( *rv == 1 );
  145. free ( p_rv);
  146. size = size_clib_array( myArray );
  147. remove_clib_array( myArray, size/2 );
  148. assert ( size - 1 == size_clib_array( myArray ));
  149. rc = element_at_clib_array ( myArray, size/2 , &p_rv );
  150. rv = (int*) p_rv;
  151. assert ( *rv == size/2 + 2 );
  152. free ( p_rv);
  153. size = size_clib_array( myArray );
  154. remove_clib_array( myArray, size - 1);
  155. assert ( size - 1 == size_clib_array( myArray ));
  156. size = size_clib_array( myArray );
  157. rc = element_at_clib_array ( myArray, size - 1, &p_rv );
  158. rv = (int*) p_rv;
  159. assert ( *rv == 8 );
  160. free ( p_rv);
  161. delete_clib_array ( myArray );
  162. }
  163. static void
  164. test_with_strings() {
  165. int size = 10;
  166. char *input_array[11];
  167. int i = 0;
  168. char *rv, rc ;
  169. void* p_rv = (void* )0;
  170. struct clib_array* myArray = new_clib_array (8,compare_e,free_e);
  171. assert ( clib_true == empty_clib_array( myArray ));
  172. input_array[0] = "STRING_0";
  173. input_array[1] = "STRING_1";
  174. input_array[2] = "STRING_2";
  175. input_array[3] = "STRING_3";
  176. input_array[4] = "STRING_4";
  177. input_array[5] = "STRING_5";
  178. input_array[6] = "STRING_6";
  179. input_array[7] = "STRING_7";
  180. input_array[8] = "STRING_8";
  181. input_array[9] = "STRING_9";
  182. input_array[10] = "STRING_10";
  183. for ( i = 0; i < size; i++) {
  184. char *v = clib_strdup ( input_array[i]);
  185. push_back_clib_array ( myArray ,v, strlen(v) + 1 );
  186. free ( v );
  187. }
  188. assert ( clib_false == empty_clib_array( myArray ));
  189. assert ( size == size_clib_array( myArray ));
  190. for ( i = 0; i < size; i++) {
  191. rc = element_at_clib_array ( myArray, i , &p_rv );
  192. rv = (char*)p_rv;
  193. assert ( strcmp( rv, input_array[i]) == 0);
  194. free ( p_rv );
  195. }
  196. rc = front_clib_array ( myArray, &p_rv );
  197. rv = (char*)p_rv;
  198. assert ( strcmp( rv, input_array[0]) == 0);
  199. free ( p_rv );
  200. rc = back_clib_array( myArray, &p_rv );
  201. rv = (char*)p_rv;
  202. assert ( strcmp( rv, input_array[size - 1]) == 0);
  203. free ( p_rv );
  204. remove_clib_array( myArray, 0 );
  205. assert ( size - 1 == size_clib_array( myArray ));
  206. rc = element_at_clib_array ( myArray, 0 , &p_rv );
  207. rv = (char*)p_rv;
  208. assert ( strcmp( rv, input_array[1]) == 0);
  209. free ( p_rv );
  210. size = size_clib_array( myArray );
  211. remove_clib_array( myArray, size/2 );
  212. rc = element_at_clib_array ( myArray, size/2 , &p_rv );
  213. rv = (char*)p_rv;
  214. assert ( strcmp( rv, input_array[size/2 + 2]) == 0);
  215. free ( p_rv );
  216. size = size_clib_array( myArray );
  217. remove_clib_array( myArray, size - 1);
  218. assert ( size - 1 == size_clib_array( myArray ));
  219. size = size_clib_array( myArray );
  220. rc = element_at_clib_array ( myArray, size - 1, &p_rv );
  221. rv = (char*)p_rv;
  222. assert ( strcmp( rv, input_array[8]) == 0);
  223. free ( p_rv );
  224. delete_clib_array ( myArray );
  225. }
  226. static struct clib_array*
  227. create_array() {
  228. int size = 10;
  229. int i = 0;
  230. int rc ;
  231. void* p_rv = (void* )0;
  232. int rv = 0;
  233. struct clib_array* myArray = new_clib_array (8,compare_e,NULL);
  234. assert ( clib_true == empty_clib_array( myArray ));
  235. for ( i = 0; i < size; i++) {
  236. push_back_clib_array ( myArray, &i ,sizeof(int));
  237. }
  238. assert ( clib_false == empty_clib_array( myArray ));
  239. assert ( size == size_clib_array( myArray ));
  240. for ( i = 0; i < size; i++) {
  241. rc = element_at_clib_array ( myArray, i , &p_rv );
  242. rv = *(int*)p_rv;
  243. assert ( rv == i );
  244. free ( p_rv );
  245. }
  246. return myArray;
  247. }
  248. static void
  249. test_for_each_array(){
  250. struct clib_array* pArray = create_array();
  251. struct clib_object *temp;
  252. for_each_clib_array( pArray, print_e);
  253. temp = pArray->pElements[5];
  254. pArray->pElements[5] = pArray->pElements[8];
  255. pArray->pElements[8] = temp;
  256. for_each_clib_array( pArray, print_e);
  257. delete_clib_array ( pArray );
  258. }
  259. void
  260. test_clib_array(){
  261. test_with_int();
  262. test_with_pointers();
  263. test_with_strings();
  264. printf ( "---------------------------------\n");
  265. test_for_each_array();
  266. }