blob: ed4274afc2bd0557173f402562c360a9c660093a [file] [log] [blame]
#ifndef _GEMFIRE_VECTORT_HPP_
#define _GEMFIRE_VECTORT_HPP_
/*=========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
*========================================================================
*/
#include "gfcpp_globals.hpp"
#include "VectorOfSharedBase.hpp"
#include "Cacheable.hpp"
#include "CacheableKey.hpp"
/** @file
*/
namespace gemfire {
/** Vector template type class */
template < class PTR_TYPE > class VectorT
{
private:
VectorOfSharedBase m_vector;
public:
/** Interface of an iterator for <code>VectorT</code>.*/
class Iterator
{
private:
VectorOfSharedBase::Iterator m_iter;
inline Iterator( const VectorOfSharedBase::Iterator& iter )
: m_iter( iter ) { }
// Never defined.
Iterator( );
public:
inline const PTR_TYPE operator * ( ) const
{
return staticCast<PTR_TYPE>( *m_iter );
}
inline Iterator& operator ++ ( )
{
++m_iter;
return *this;
}
inline void operator ++ ( int )
{
m_iter++;
}
inline bool operator == ( const Iterator& other ) const
{
return ( m_iter == other.m_iter );
}
inline bool operator != ( const Iterator& other ) const
{
return ( m_iter != other.m_iter );
}
friend class VectorT;
};
/** return the size of the vector. */
inline int32_t size( ) const
{
return static_cast<int32_t> (m_vector.size());
}
/** synonym for size. */
inline int32_t length( ) const
{
return static_cast<int32_t> (m_vector.size());
}
/** return the largest possible size of the vector. */
inline int32_t max_size( ) const
{
return static_cast<int32_t> (m_vector.max_size());
}
/** return the number of elements allocated for this vector. */
inline int32_t capacity( ) const
{
return static_cast<int32_t> (m_vector.capacity());
}
/** return true if the vector's size is 0. */
inline bool empty( ) const
{
return m_vector.empty();
}
/** Return the n'th element */
inline PTR_TYPE operator [] ( int32_t n )
{
return staticCast<PTR_TYPE>( m_vector[n] );
}
/** Return the n'th element */
inline const PTR_TYPE operator [] ( int32_t n ) const
{
return staticCast<PTR_TYPE>( m_vector[n] );
}
/** Return the n'th element with bounds checking. */
inline PTR_TYPE at( int32_t n )
{
return staticCast<PTR_TYPE>( m_vector.at( n ) );
}
/** Return the n'th element with bounds checking. */
inline const PTR_TYPE at( int32_t n ) const
{
return staticCast<PTR_TYPE>( m_vector.at( n ) );
}
/** Get an iterator pointing to the start of vector. */
inline Iterator begin( ) const
{
return Iterator( m_vector.begin( ) );
}
/** Get an iterator pointing to the end of vector. */
inline Iterator end( ) const
{
return Iterator( m_vector.end( ) );
}
/** Create an empty vector. */
inline VectorT( )
: m_vector( )
{
}
/** Create a vector with n elements allocated */
inline VectorT( int32_t n )
: m_vector( n )
{
}
/** Create a vector with n copies of t */
inline VectorT( int32_t n, const PTR_TYPE& t )
: m_vector( n, t )
{
}
/** copy constructor */
inline VectorT( const VectorT& other )
: m_vector( other.m_vector )
{
}
/** destructor, sets all SharedPtr elements to NULLPTR */
inline ~VectorT( )
{
// destructor of m_vector field does all the work.
}
/** assignment operator */
inline VectorT& operator = ( const VectorT& other )
{
m_vector = other.m_vector;
return *this;
}
/** reallocate a vector to hold n elements. */
inline void reserve( int32_t n )
{
m_vector.reserve( n );
}
/** returns the first element. */
inline PTR_TYPE front( )
{
return staticCast<PTR_TYPE>( m_vector.front( ) );
}
/** returns the first element. */
inline const PTR_TYPE front( ) const
{
return staticCast<PTR_TYPE>( m_vector.front( ) );
}
/** returns the last element. */
inline PTR_TYPE back( )
{
return staticCast<PTR_TYPE>( m_vector.back( ) );
}
/** returns the last element. */
inline const PTR_TYPE back( ) const
{
return staticCast<PTR_TYPE>( m_vector.back( ) );
}
/** insert a new element at the end. */
inline void push_back( const PTR_TYPE& e )
{
m_vector.push_back( e );
}
/** removes the last element. */
inline void pop_back( )
{
m_vector.pop_back();
}
/** swaps the contents of two vectors. */
inline void swap( VectorT& other )
{
m_vector.swap( other.m_vector );
}
/** erases all elements. */
inline void clear( )
{
m_vector.clear();
}
/** inserts or erases elements at the end such that size becomes n.
* Not to be confused with reserve which simply allocates the space,
* resize fills the space with active elements. */
inline void resize(int32_t n, const PTR_TYPE& t = NULLPTR)
{
m_vector.resize( n, t );
}
/** insert object at the given position. */
inline void insert( int32_t index, const PTR_TYPE& t )
{
m_vector.insert( index, t );
}
/** Removes the object at the specified index from a vector. */
inline void erase( int32_t index )
{
m_vector.erase( index );
}
};
typedef VectorT<CacheablePtr> _VectorOfCacheable;
typedef VectorT<CacheableKeyPtr> _VectorOfCacheableKey;
typedef VectorT<RegionEntryPtr> VectorOfRegionEntry;
typedef VectorT<RegionPtr> VectorOfRegion;
typedef VectorT<CacheableStringPtr> VectorOfCacheableString;
typedef VectorT< CqListenerPtr > VectorOfCqListener;
typedef VectorT< CqQueryPtr > VectorOfCqQuery;
/**
* A vector of <code>Cacheable</code> objects that also extends
* <code>SharedBase</code> for smart pointers.
*/
class CPPCACHE_EXPORT VectorOfCacheable :
public _VectorOfCacheable, public SharedBase
{
public:
/** Iterator class for the vector. */
typedef _VectorOfCacheable::Iterator Iterator;
/** Create an empty vector. */
inline VectorOfCacheable() :
_VectorOfCacheable() { }
/** Create a vector with n elements allocated. */
inline VectorOfCacheable(int32_t n) :
_VectorOfCacheable(n) { }
/** Create a vector with n copies of t. */
inline VectorOfCacheable(int32_t n, const CacheablePtr& t ) :
_VectorOfCacheable(n, t) { }
/** Copy constructor. */
inline VectorOfCacheable(const VectorOfCacheable& other) :
_VectorOfCacheable(other) { }
private:
const VectorOfCacheable& operator=( const VectorOfCacheable& );
};
/**
* A vector of <code>CacheableKey</code> objects that also extends
* <code>SharedBase</code> for smart pointers.
*/
class CPPCACHE_EXPORT VectorOfCacheableKey :
public _VectorOfCacheableKey, public SharedBase
{
public:
/** Iterator class for the vector. */
typedef _VectorOfCacheableKey::Iterator Iterator;
/** Create an empty vector. */
inline VectorOfCacheableKey() :
_VectorOfCacheableKey() { }
/** Create a vector with n elements allocated */
inline VectorOfCacheableKey(int32_t n) :
_VectorOfCacheableKey(n) { }
/** Create a vector with n copies of t */
inline VectorOfCacheableKey(int32_t n, const CacheableKeyPtr& t ) :
_VectorOfCacheableKey(n, t) { }
/** Copy constructor */
inline VectorOfCacheableKey(const VectorOfCacheableKey& other) :
_VectorOfCacheableKey(other) { }
private:
const VectorOfCacheableKey& operator=( const VectorOfCacheableKey& );
};
typedef SharedPtr<VectorOfCacheable> VectorOfCacheablePtr;
typedef SharedPtr<VectorOfCacheableKey> VectorOfCacheableKeyPtr;
}
#endif