Esempio n. 1
0
void PVUnionArray::serialize(ByteBuffer *pbuffer,
        SerializableControl *pflusher, size_t offset, size_t count) const {

    const_svector temp(view());
    temp.slice(offset, count);

    ArrayConstPtr array = this->getArray();
    if (array->getArraySizeType() != Array::fixed)
        SerializeHelper::writeSize(temp.size(), pbuffer, pflusher);
    else if (count != array->getMaximumCapacity())
        throw std::length_error("fixed array cannot be partially serialized");

    for(size_t i = 0; i<count; i++) {
        if(pbuffer->getRemaining()<1)
            pflusher->flushSerializeBuffer();

        if(temp[i].get()==NULL) {
            pbuffer->putByte(0);
        }
        else {
            pbuffer->putByte(1);
            temp[i]->serialize(pbuffer, pflusher);
        }
    }
}
Esempio n. 2
0
	Value array_get(ArrayConstPtr array, int32_t idx) {
		if (idx >= array->size())
			return NULL;
		if (idx < 0)
			idx += array->size();
		if (idx < 0)
			return NULL;
		return (*array)[idx];
	}
Esempio n. 3
0
DefaultPVArray<T>::DefaultPVArray(ScalarArrayConstPtr const & scalarArray)
: PVValueArray<T>(scalarArray),
    value()
  
{
    ArrayConstPtr array = this->getArray();
    if (array->getArraySizeType() == Array::fixed)
    {
        // this->setLength(array->getMaximumCapacity());
        this->setCapacityMutable(false);
    }
}
Esempio n. 4
0
	size_t array_get_all(ArrayConstPtr array, Value* out_values, size_t max) {		
		size_t i;
		for (i = 0; i < array->size() && i < max; ++i) {
			out_values[i] = (*array)[i];
		}
		return i;
	}
Esempio n. 5
0
void DefaultPVArray<T>::serialize(ByteBuffer *pbuffer,
        SerializableControl *pflusher, size_t offset, size_t count) const
{
    //TODO: avoid incrementing the ref counter...
    const_svector temp(value);
    temp.slice(offset, count);
    count = temp.size();

    ArrayConstPtr array = this->getArray();
    if (array->getArraySizeType() != Array::fixed)
        SerializeHelper::writeSize(count, pbuffer, pflusher);
    else if (count != array->getMaximumCapacity())
        throw std::length_error("fixed array cannot be partially serialized");

    const T* cur = temp.data();

    // try to avoid copying into the buffer
    // this is only possible if we do not need to do endian-swapping
    if (!pbuffer->reverse<T>())
        if (pflusher->directSerialize(pbuffer, (const char*)cur, count, sizeof(T)))
            return;

    while(count) {
        const size_t empty = pbuffer->getRemaining();
        const size_t space_for = empty/sizeof(T);

        if(space_for==0) {
            pflusher->flushSerializeBuffer();
            // Can we be certain that more space is now free???
            // If not then we spinnnnnnnnn
            continue;
        }

        const size_t n2send = std::min(count, space_for);

        pbuffer->putArray(cur, n2send);
        cur += n2send;
        count -= n2send;
    }
}
Esempio n. 6
0
	size_t array_size(ArrayConstPtr array) {
		return array->size();
	}