/** * Delete the element at the begin of queue. */ void queue_pop(queue_t* pque_queue) { assert(pque_queue != NULL); #ifdef CSTL_QUEUE_LIST_SEQUENCE list_pop_front(&pque_queue->_t_sequence); #else deque_pop_front(&pque_queue->_t_sequence); #endif }
void pop_front_check_counting_reverse(size_t item_size, deque_t* d, int num) { int i; int j; ssize_t sz = deque_size(item_size, d); assert(item_size == 4); assert(sz >= num); for( i = num - 1; i >= 0; i-- ) { assert(deque_size(item_size, d) > 0); j = 0; deque_it_get_cur(4, deque_begin(d), &j); assert( j == i ); deque_pop_front(4, d); } }
void pop_front_check_constant(size_t item_size, deque_t* d, int num, int val) { int i; int j; ssize_t sz = deque_size(item_size, d); assert(item_size == 4); assert(sz >= num); for( i = 0; i < num; i++ ) { assert(deque_size(item_size, d) > 0); j = 0; deque_it_get_cur(4, deque_begin(d), &j); assert( j == val ); deque_pop_front(4, d); } }
qioerr qbuffer_pop_front(qbuffer_t* buf) { qbytes_t* bytes; int64_t skip; int64_t len; qbuffer_iter_t chunk; if ( qbuffer_num_parts(buf) == 0 ) QIO_RETURN_CONSTANT_ERROR(EINVAL, "cannot pop from empty buffer"); chunk = qbuffer_begin(buf); qbuffer_iter_get(chunk, qbuffer_end(buf), &bytes, &skip, &len); deque_pop_front(sizeof(qbuffer_part_t), &buf->deque); buf->offset_start += len; return 0; }
err_t qbuffer_pop_front(qbuffer_t* buf) { qbytes_t* bytes; int64_t skip; int64_t len; qbuffer_iter_t chunk; if ( qbuffer_num_parts(buf) == 0 ) return EINVAL; chunk = qbuffer_begin(buf); qbuffer_iter_get(chunk, qbuffer_end(buf), &bytes, &skip, &len); deque_pop_front(sizeof(qbuffer_part_t), &buf->deque); buf->offset_start += len; return 0; }
void qbuffer_trim_back(qbuffer_t* buf, int64_t remove_bytes) { int64_t new_end = buf->offset_end - remove_bytes; if( remove_bytes == 0 ) return; assert( remove_bytes > 0 ); assert( new_end >= buf->offset_start ); // Go through the deque removing entire parts. while( deque_size(sizeof(qbuffer_part_t), &buf->deque) > 0 ) { // Get the last part. qbuffer_part_t* qbp = (qbuffer_part_t*) deque_it_get_cur_ptr( sizeof(qbuffer_part_t), deque_last(sizeof(qbuffer_part_t), &buf->deque)); if( qbp->end_offset > new_end ) { // we might remove it entirely, or maybe // we just adjust its length and skip. if( qbp->end_offset - qbp->len_bytes >= new_end ) { qbytes_t* bytes = qbp->bytes; // starts entirely after new_end, remove the chunk. // Remove it from the deque deque_pop_front(sizeof(qbuffer_part_t), &buf->deque); // release the bytes. qbytes_release(bytes); } else { // Keep only a part of this chunk. int64_t remove_here = qbp->end_offset - new_end; qbp->len_bytes -= remove_here; qbp->end_offset -= remove_here; break; // this is the last one. } } else { break; // we're past } } // Now set the new offset. buf->offset_end = new_end; // invalidate cached entries. qbuffer_clear_cached(buf); }
void qbuffer_trim_front(qbuffer_t* buf, int64_t remove_bytes) { int64_t new_start = buf->offset_start + remove_bytes; if( remove_bytes == 0 ) return; assert( remove_bytes > 0 ); assert( new_start <= buf->offset_end ); while( deque_size(sizeof(qbuffer_part_t), &buf->deque) > 0 ) { // Get the first part. qbuffer_part_t* qbp = (qbuffer_part_t*) deque_it_get_cur_ptr( sizeof(qbuffer_part_t), deque_begin(& buf->deque)); if( qbp->end_offset - qbp->len_bytes < new_start ) { // we might remove it entirely, or maybe // we just adjust its length and skip. if( qbp->end_offset <= new_start ) { qbytes_t* bytes = qbp->bytes; // ends entirely before new_start, remove the chunk. // Remove it from the deque deque_pop_front(sizeof(qbuffer_part_t), &buf->deque); // release the bytes. qbytes_release(bytes); } else { // Keep only a part of this chunk. int64_t remove_here = new_start - (qbp->end_offset - qbp->len_bytes); qbp->skip_bytes += remove_here; qbp->len_bytes -= remove_here; break; // this is the last one. } } else { break; // we're past } } // Now set the new offset. buf->offset_start = new_start; // invalidate cached entries. qbuffer_clear_cached(buf); }
int main() { const char *output[] = {"EsaY", "YasE", "aYsE", "asYE"}; const char *input = "EasY"; const char *pinput; /* point to input */ const char *poutput; /* point to output */ size_t i; for (i = 0; i < SIZE(output); i++) { pinput = input; poutput = output[i]; printf("for pattern %s:\n", poutput); for (; *poutput != '\0';) { if (!deque_empty() && deque_front() == *poutput) { printf("+\t%c\n", deque_pop_front()); poutput++; } else if (!deque_empty() && deque_back() == *poutput) { printf("*\t%c\n", deque_pop_back()); poutput++; } else { /* the deque is empty or not the first or last */ if (islower(*pinput)) { deque_push_back(*pinput++); } else if (isupper(*pinput)) { deque_push_front(*pinput++); } else if (*pinput == '\0') { printf("unable to generate such pattern\n"); break; } } } putchar('\n'); } return 0; }
void simple_test( void){ deque dq; double a; int i, status; fprintf( stdout, "Testing deque_allocate: " ); dq = deque_alloc(); if( dq != NULL ){ fprintf( stdout, "success!\n"); }else{ fprintf( stdout, "failed!\n"); } fprintf( stdout, "Testing deque_empty: "); if( deque_empty( dq) ){ fprintf( stdout, "success!\n"); }else{ fprintf( stdout, "failed!\n"); } a = 2.5; fprintf( stdout, "Testing deque_push_back, value=%1.2g: ", a); if( deque_push_back( dq, a ) == DEQUE_SUCCESS ){ fprintf( stdout, "success!\n"); }else{ fprintf( stdout, "failed!\n"); } a = 3.14159; fprintf( stdout, "Testing deque_peek_back: "); if( deque_peek_back( dq, &a) == DEQUE_SUCCESS ){ fprintf( stdout, "success!, value=%1.2g\n", a); }else{ fprintf( stdout, "failed, value=%1.2g\n", a); } fprintf( stdout, "Testing deque_size: "); fprintf( stdout, "size=%d\n", deque_size( dq)); fprintf( stdout, "Testing deque_pop_back: "); a = 3.14159; if( deque_pop_back( dq, &a) == DEQUE_SUCCESS ){ fprintf( stdout, "success!, value=%1.2g\n", a); }else{ fprintf( stdout, "failed!, value=%1.2g\n", a); } a = 3.14159; fprintf( stdout, "Testing deque_pop_back on empty deque: "); if( deque_pop_back( dq, &a) != DEQUE_EMPTY ){ fprintf( stdout, "failed!, value=%1.2g\n", a); }else{ fprintf( stdout, "success!,\n"); fprintf( stdout, " caught empty deque, value=%1.2g\n", a); } a = 2.5; fprintf( stdout, "Testing deque_push_front, value=%1.2g: ", a); if( deque_push_front( dq, a ) == DEQUE_SUCCESS ){ fprintf( stdout, "success!\n"); }else{ fprintf( stdout, "failed!\n"); } a = 3.14159; fprintf( stdout, "Testing deque_peek_front: "); if( deque_peek_front( dq, &a) == DEQUE_SUCCESS ){ fprintf( stdout, "success!, value=%1.2g\n", a); }else{ fprintf( stdout, "failed, value=%1.2g\n", a); } fprintf( stdout, "Testing deque_size: "); fprintf( stdout, "size=%d\n", deque_size( dq)); fprintf( stdout, "Testing deque_pop_front: "); a = 3.14159; if( deque_pop_front( dq, &a) == DEQUE_SUCCESS ){ fprintf( stdout, "success!, value=%1.2g\n", a); }else{ fprintf( stdout, "failed!, value=%1.2g\n", a); } a = 3.14159; fprintf( stdout, "Testing deque_pop_front on empty deque: "); if( deque_pop_front( dq, &a) != DEQUE_EMPTY ){ fprintf( stdout, "failed!, value=%1.2g\n", a); }else{ fprintf( stdout, "success!,\n"); fprintf( stdout, " caught empty deque, value=%1.2g\n", a); } fprintf( stdout, "Testing deque_get_item: "); for( i=0; i<5; i++ ){ a = (double) i + 0.545; if( deque_push_back( dq, a) != DEQUE_SUCCESS ){ fprintf( stderr, "deque push back failed!\n" ); deque_free( dq); return; } a = (-1. - (double) i) + 0.545; if( deque_push_front( dq, a) != DEQUE_SUCCESS ){ fprintf( stderr, "deque push front failed!\n" ); deque_free( dq); return; } } for( i=0; i<10; i++){ status = deque_get_item( dq, i, &a); if( status != DEQUE_SUCCESS || a != (-5. + (double) i) + 0.545 ){ fprintf( stderr, "deque get_item failed!\n" ); deque_free( dq); return; } } a = 3.14159; status = deque_get_item( dq, 11, &a); if( status != DEQUE_OUT_OF_BOUNDS || a != 3.14159 ){ fprintf( stderr, "deque get_item out of bounds failed!\n"); deque_free( dq); } fprintf( stdout, "success!\n"); deque_free( dq); }
void big_test( int num){ int center, front, back, i, sw, status, fsize; double *vals, *pvals, tmp; clock_t start, stop, diff; int msecs; deque dq; dq = deque_alloc(); vals = (double *) malloc( 2*num*sizeof(double)); pvals = (double *) malloc( 2*num*sizeof(double)); for( i=0; i<2*num; i++){ vals[i] = (double) rand() / (double) RAND_MAX; } front = 0; back = 0; center = num; fprintf( stdout, "Testing deque_push_back and front %d times\n", num/2); start = clock(); for( i=0; i<num/2; i++){ if( rand() % 2 == 0 ){ deque_push_back( dq, vals[center+back] ); back++; }else{ front--; deque_push_front( dq, vals[center+front] ); } } stop = clock(); diff = stop-start; msecs = (int) diff * 1000 / CLOCKS_PER_SEC; fprintf( stdout, " succeeded in %u ms\n", msecs); fprintf( stdout, "Testing deque_push(pop)_back(front) %d times\n", num); start = clock(); for( i=0; i<num; i++){ sw = rand() % 4; switch( sw ){ case 0: status = deque_push_back( dq, vals[center+back]); back++; break; case 1: front--; status = deque_push_front( dq, vals[center+front]); break; case 2: back--; status = deque_pop_back( dq, &tmp); break; case 3: status = deque_pop_front( dq, &tmp); front++; break; default: status = 1; tmp = 1; } if( status != DEQUE_SUCCESS ){ fprintf( stderr, " error at op i=%d\n", i); free( pvals); free( vals); deque_free( dq); return; } } stop = clock(); diff = stop-start; msecs = (int) diff * 1000 / CLOCKS_PER_SEC; fprintf( stdout, " succeeded in %u ms\n", msecs); fsize = deque_size( dq); fprintf( stdout, "Testing deque_get_item %d times\n", fsize); start = clock(); for( i=0; i<fsize; i++){ deque_get_item( dq, i, &(pvals[i])); } stop = clock(); for( i=0; i<fsize; i++){ if( pvals[i] != vals[center+front+i] ){ fprintf( stderr, " obtained value error! at item %d\n", i); free( pvals); free( vals); deque_free( dq); return; } } diff = stop-start; msecs = (int) diff * 1000 / CLOCKS_PER_SEC; fprintf( stdout, " succeeded in %u ms\n", msecs); fprintf( stdout, "Testing deque_pop_front %d times\n", fsize); start = clock(); for( i=0; i<fsize; i++){ deque_pop_front( dq, &(pvals[i])); } stop = clock(); for( i=0; i<fsize; i++){ if( pvals[i] != vals[center+front+i] ){ fprintf( stderr, " obtained value error! at item %d\n", i); free( pvals); free( vals); deque_free( dq); return; } } diff = stop-start; msecs = (int) diff * 1000 / CLOCKS_PER_SEC; fprintf( stdout, " succeeded in %u ms\n", msecs); free( pvals); free( vals); deque_free( dq); }