update pvD array handling

Interface only uses shared_vector<const T>
storage also uses only const.
This commit is contained in:
Michael Davidsaver
2013-07-25 17:22:16 -04:00
parent 569bd3b681
commit 9ac030169a
2 changed files with 26 additions and 39 deletions

View File

@@ -379,7 +379,7 @@ public:
* @param count The number of elements.
*/
template<typename T>
inline void putArray(T* values, std::size_t count);
inline void putArray(const T* values, std::size_t count);
/**
* Get an array of type {@code T} from the byte buffer.
* The position is adjusted.
@@ -842,7 +842,7 @@ private:
}
template<typename T>
inline void ByteBuffer::putArray(T* values, std::size_t count)
inline void ByteBuffer::putArray(const T* values, std::size_t count)
{
// this avoids int8 specialization, compiler will take care if optimization, -O2 or more
if (sizeof(T) == 1)

View File

@@ -1022,11 +1022,9 @@ namespace detail {
virtual ~PVVectorStorage(){};
// Primative array manipulations
protected:
//! unchecked reference to writable data
//! Please consider the view() method instead of viewUnsafe().
virtual const svector& viewUnsafe() const = 0;
public:
//! Fetch a read-only view of the current array data
virtual const_svector view() const = 0;
/** Exchange our contents for the provided.
*
@@ -1038,32 +1036,15 @@ namespace detail {
* Before you call this directly, consider using
* the reuse(), or replace() methods.
*/
virtual void swap(svector& other) = 0;
virtual void swap(const_svector& other) = 0;
//! Discard current contents and replaced with the provided.
//! Fails for Immutable arrays
//! calls postPut()
virtual void replace(const const_svector& next)
{
svector temp(const_shared_vector_cast<T>(next));
this->swap(temp);
this->postPut();
}
// methods from PVArray
virtual size_t getLength() const {return viewUnsafe().size();}
virtual size_t getCapacity() const {return viewUnsafe().capacity();}
virtual void replace(const const_svector& next) = 0;
// Derived operations
//! Fetch a read-only view of the current array data
inline const_svector view() const
{
const_svector newref(this->viewUnsafe());
return newref;
}
/** Remove and return the current array data
* or an unique copy if shared.
*
@@ -1074,10 +1055,9 @@ namespace detail {
*/
inline svector reuse()
{
svector result;
const_svector result;
this->swap(result);
result.make_unique();
return result;
return thaw(result);
}
/**
@@ -1111,16 +1091,14 @@ namespace detail {
{
from += fromOffset;
svector temp;
this->swap(temp);
svector temp(this->reuse());
if(temp.size() < length+offset)
temp.resize(length+offset);
else
temp.make_unique();
std::copy(from, from + length, temp.begin() + offset);
this->swap(temp);
this->postPut();
this->replace(freeze(temp));
return length;
}
@@ -1143,12 +1121,13 @@ namespace detail {
vector& vref = *value.get();
typename svector::shared_pointer_type p(&vref[0],
detail::shared_ptr_vector_deletor<T>(value));
svector temp(p, 0, std::min(length, vref.size()));
const_svector temp(p, 0, std::min(length, vref.size()));
this->swap(temp);
}
pointer get() const {
return this->viewUnsafe().data();
pointer get() const USAGE_DEPRECATED {
// evil unsafe cast!
return (pointer)this->view().data();
}
vector const & getVector() USAGE_ERROR("No longer implemented. Replace with view()");
@@ -1255,6 +1234,10 @@ public:
* Destructor
*/
virtual ~PVValueArray() {}
virtual size_t getLength() const {return value.size();}
virtual size_t getCapacity() const {return value.capacity();}
/**
* Set the array capacity.
* @param capacity The length.
@@ -1289,8 +1272,12 @@ public:
*/
virtual void compress();
virtual const svector& viewUnsafe() const { return value; }
virtual void swap(svector &other);
virtual const_svector view() const { return value; }
virtual void swap(const_svector &other);
virtual void replace(const const_svector &other) {
value = other;
PVField::postPut();
}
virtual void serialize(ByteBuffer *pbuffer,
SerializableControl *pflusher) const;
@@ -1309,7 +1296,7 @@ protected:
{}
private:
StructureArrayConstPtr structureArray;
svector value;
const_svector value;
friend class PVDataCreate;
};