Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1983)

Side by Side Diff: third_party/sqlite/sqlite-src-3100200/src/bitvec.c

Issue 1610543003: [sql] Import reference version of SQLite 3.10.2. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 ** 2008 February 16 2 ** 2008 February 16
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
(...skipping 23 matching lines...) Expand all
34 ** start of a transaction, and is thus usually less than a few thousand, 34 ** start of a transaction, and is thus usually less than a few thousand,
35 ** but can be as large as 2 billion for a really big database. 35 ** but can be as large as 2 billion for a really big database.
36 */ 36 */
37 #include "sqliteInt.h" 37 #include "sqliteInt.h"
38 38
39 /* Size of the Bitvec structure in bytes. */ 39 /* Size of the Bitvec structure in bytes. */
40 #define BITVEC_SZ 512 40 #define BITVEC_SZ 512
41 41
42 /* Round the union size down to the nearest pointer boundary, since that's how 42 /* Round the union size down to the nearest pointer boundary, since that's how
43 ** it will be aligned within the Bitvec struct. */ 43 ** it will be aligned within the Bitvec struct. */
44 #define BITVEC_USIZE (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(B itvec*)) 44 #define BITVEC_USIZE \
45 (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(Bitvec*))
45 46
46 /* Type of the array "element" for the bitmap representation. 47 /* Type of the array "element" for the bitmap representation.
47 ** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE. 48 ** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE.
48 ** Setting this to the "natural word" size of your CPU may improve 49 ** Setting this to the "natural word" size of your CPU may improve
49 ** performance. */ 50 ** performance. */
50 #define BITVEC_TELEM u8 51 #define BITVEC_TELEM u8
51 /* Size, in bits, of the bitmap element. */ 52 /* Size, in bits, of the bitmap element. */
52 #define BITVEC_SZELEM 8 53 #define BITVEC_SZELEM 8
53 /* Number of elements in a bitmap array. */ 54 /* Number of elements in a bitmap array. */
54 #define BITVEC_NELEM (BITVEC_USIZE/sizeof(BITVEC_TELEM)) 55 #define BITVEC_NELEM (BITVEC_USIZE/sizeof(BITVEC_TELEM))
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 p->iSize = iSize; 120 p->iSize = iSize;
120 } 121 }
121 return p; 122 return p;
122 } 123 }
123 124
124 /* 125 /*
125 ** Check to see if the i-th bit is set. Return true or false. 126 ** Check to see if the i-th bit is set. Return true or false.
126 ** If p is NULL (if the bitmap has not been created) or if 127 ** If p is NULL (if the bitmap has not been created) or if
127 ** i is out of range, then return false. 128 ** i is out of range, then return false.
128 */ 129 */
129 int sqlite3BitvecTest(Bitvec *p, u32 i){ 130 int sqlite3BitvecTestNotNull(Bitvec *p, u32 i){
130 if( p==0 ) return 0; 131 assert( p!=0 );
131 if( i>p->iSize || i==0 ) return 0;
132 i--; 132 i--;
133 if( i>=p->iSize ) return 0;
133 while( p->iDivisor ){ 134 while( p->iDivisor ){
134 u32 bin = i/p->iDivisor; 135 u32 bin = i/p->iDivisor;
135 i = i%p->iDivisor; 136 i = i%p->iDivisor;
136 p = p->u.apSub[bin]; 137 p = p->u.apSub[bin];
137 if (!p) { 138 if (!p) {
138 return 0; 139 return 0;
139 } 140 }
140 } 141 }
141 if( p->iSize<=BITVEC_NBIT ){ 142 if( p->iSize<=BITVEC_NBIT ){
142 return (p->u.aBitmap[i/BITVEC_SZELEM] & (1<<(i&(BITVEC_SZELEM-1))))!=0; 143 return (p->u.aBitmap[i/BITVEC_SZELEM] & (1<<(i&(BITVEC_SZELEM-1))))!=0;
143 } else{ 144 } else{
144 u32 h = BITVEC_HASH(i++); 145 u32 h = BITVEC_HASH(i++);
145 while( p->u.aHash[h] ){ 146 while( p->u.aHash[h] ){
146 if( p->u.aHash[h]==i ) return 1; 147 if( p->u.aHash[h]==i ) return 1;
147 h = (h+1) % BITVEC_NINT; 148 h = (h+1) % BITVEC_NINT;
148 } 149 }
149 return 0; 150 return 0;
150 } 151 }
151 } 152 }
153 int sqlite3BitvecTest(Bitvec *p, u32 i){
154 return p!=0 && sqlite3BitvecTestNotNull(p,i);
155 }
152 156
153 /* 157 /*
154 ** Set the i-th bit. Return 0 on success and an error code if 158 ** Set the i-th bit. Return 0 on success and an error code if
155 ** anything goes wrong. 159 ** anything goes wrong.
156 ** 160 **
157 ** This routine might cause sub-bitmaps to be allocated. Failing 161 ** This routine might cause sub-bitmaps to be allocated. Failing
158 ** to get the memory needed to hold the sub-bitmap is the only 162 ** to get the memory needed to hold the sub-bitmap is the only
159 ** that can go wrong with an insert, assuming p and i are valid. 163 ** that can go wrong with an insert, assuming p and i are valid.
160 ** 164 **
161 ** The calling function must ensure that p is a valid Bitvec object 165 ** The calling function must ensure that p is a valid Bitvec object
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 Bitvec *pBitvec = 0; 338 Bitvec *pBitvec = 0;
335 unsigned char *pV = 0; 339 unsigned char *pV = 0;
336 int rc = -1; 340 int rc = -1;
337 int i, nx, pc, op; 341 int i, nx, pc, op;
338 void *pTmpSpace; 342 void *pTmpSpace;
339 343
340 /* Allocate the Bitvec to be tested and a linear array of 344 /* Allocate the Bitvec to be tested and a linear array of
341 ** bits to act as the reference */ 345 ** bits to act as the reference */
342 pBitvec = sqlite3BitvecCreate( sz ); 346 pBitvec = sqlite3BitvecCreate( sz );
343 pV = sqlite3MallocZero( (sz+7)/8 + 1 ); 347 pV = sqlite3MallocZero( (sz+7)/8 + 1 );
344 pTmpSpace = sqlite3_malloc(BITVEC_SZ); 348 pTmpSpace = sqlite3_malloc64(BITVEC_SZ);
345 if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; 349 if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end;
346 350
347 /* NULL pBitvec tests */ 351 /* NULL pBitvec tests */
348 sqlite3BitvecSet(0, 1); 352 sqlite3BitvecSet(0, 1);
349 sqlite3BitvecClear(0, 1, pTmpSpace); 353 sqlite3BitvecClear(0, 1, pTmpSpace);
350 354
351 /* Run the program */ 355 /* Run the program */
352 pc = 0; 356 pc = 0;
353 while( (op = aOp[pc])!=0 ){ 357 while( (op = aOp[pc])!=0 ){
354 switch( op ){ 358 switch( op ){
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 } 402 }
399 403
400 /* Free allocated structure */ 404 /* Free allocated structure */
401 bitvec_end: 405 bitvec_end:
402 sqlite3_free(pTmpSpace); 406 sqlite3_free(pTmpSpace);
403 sqlite3_free(pV); 407 sqlite3_free(pV);
404 sqlite3BitvecDestroy(pBitvec); 408 sqlite3BitvecDestroy(pBitvec);
405 return rc; 409 return rc;
406 } 410 }
407 #endif /* SQLITE_OMIT_BUILTIN_TEST */ 411 #endif /* SQLITE_OMIT_BUILTIN_TEST */
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3100200/src/backup.c ('k') | third_party/sqlite/sqlite-src-3100200/src/btmutex.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698