void v_dataViewSampleRemove( v_dataViewSample sample) { v_dataViewInstance instance; assert(C_TYPECHECK(sample,v_dataViewSample)); instance = v_dataViewInstance(v_readerSample(sample)->instance); CHECK_INSTANCE(instance); if (instance->sampleCount > 1) { if (sample->next != NULL) { v_dataViewSample(sample->next)->prev = sample->prev; } else { v_dataViewInstanceTemplate(instance)->sample = sample->prev; } if (sample->prev != NULL) { v_dataViewSample(sample->prev)->next = sample->next; } sample->prev = NULL; sample->next = NULL; c_free(sample); } instance->sampleCount--; if (instance->sampleCount > 0) { CHECK_INSTANCE(instance); } else { CHECK_ZERO_INSTANCE(instance); } }
v_dataViewSample v_dataViewSampleNew( v_dataViewInstance instance, v_readerSample masterSample) { v_dataView dataView; v_dataViewSample sample; assert(instance != NULL); assert(masterSample != NULL); assert(C_TYPECHECK(masterSample,v_readerSample)); dataView = v_dataView(instance->dataView); #ifdef _EXTENT_ sample = v_dataViewSample(c_extentCreate(dataView->sampleExtent)); #else sample = v_dataViewSample(c_new(dataView->sampleType)); #endif if (sample) { v_readerSample(sample)->instance = (c_voidp)instance; v_readerSample(sample)->sampleState = 0; v_dataViewSampleList(sample)->next = NULL; v_dataViewSampleList(sample)->prev = NULL; sample->prev = NULL; v_dataViewSampleTemplate(sample)->sample = c_keep(masterSample); } else { OS_REPORT(OS_ERROR, "v_dataViewSampleNew",0, "Failed to allocate v_dataViewSample."); } return sample; }
void v_dataViewInstanceWrite( v_dataViewInstance instance, v_dataViewSample sample, v_dataViewSample position) { v_dataViewSample head, *sampleptr; assert (instance != NULL && C_TYPECHECK (instance, v_dataViewInstance)); assert (sample != NULL && C_TYPECHECK (sample, v_dataViewSample)); if (position != NULL) { assert (C_TYPECHECK (position, v_dataViewSample)); } head = v_dataViewInstanceTemplate(instance)->sample; /* Keep alive view sample must be discarded, but only after the new * view sample is inserted. */ if (instance->sampleCount == 0) { assert (position == NULL); assert(head == NULL); sampleptr = &v_dataViewInstanceTemplate(instance)->sample; sample->next = sample; sample->prev = NULL; (*sampleptr) = sample; } else if (position == NULL) { assert(head); /* "normal" use case, append sample to list */ sampleptr = (v_dataViewSample *)&head->next; sample->next = (*sampleptr); sample->prev = NULL; (*sampleptr)->prev = sample; (*sampleptr) = sample; } else { assert (position->next != NULL); assert(head); sample->next = position->next; if (position == head) { sampleptr = &v_dataViewInstanceTemplate(instance)->sample; /* verify previous pointer of tail sample is correct */ assert (v_dataViewSample(head->next)->prev == NULL); (*sampleptr)->next = sample; } else { sampleptr = (v_dataViewSample *)&position->next; (*sampleptr)->prev = sample; } sample->prev = position; (*sampleptr) = sample; } instance->sampleCount++; }
void v_dataReaderSampleEmptyViews( v_dataReaderSample sample) { v_dataViewSampleList viewSample; assert(sample != NULL); assert(C_TYPECHECK(sample, v_dataReaderSample)); viewSample = v_readerSample(sample)->viewSamples; while (viewSample != NULL) { v_dataViewSampleListRemove(viewSample); v_dataViewSampleRemove(v_dataViewSample(viewSample)); viewSample = v_readerSample(sample)->viewSamples; } }
void v_dataReaderSampleWipeViews( v_dataReaderSample sample) { v_dataViewSampleList viewSample; v_dataViewInstance instance; assert(sample != NULL); assert(C_TYPECHECK(sample, v_dataReaderSample)); viewSample = v_readerSample(sample)->viewSamples; while (viewSample != NULL) { instance = v_readerSample(viewSample)->instance; v_dataViewSampleListRemove(viewSample); v_dataViewSampleRemove(v_dataViewSample(viewSample)); v_dataViewInstanceRemove(instance); viewSample = v_readerSample(sample)->viewSamples; } }