get the simple and iteration unit tests to pass
This commit is contained in:
parent
57741a94d9
commit
690304f9bc
5 changed files with 125 additions and 18 deletions
|
|
@ -125,6 +125,7 @@ namespace lumiera {
|
||||||
LUMIERA_ERROR_DECLARE (LIFECYCLE); ///< Lifecycle assumptions violated
|
LUMIERA_ERROR_DECLARE (LIFECYCLE); ///< Lifecycle assumptions violated
|
||||||
LUMIERA_ERROR_DECLARE (WRONG_TYPE); ///< runtime type mismatch
|
LUMIERA_ERROR_DECLARE (WRONG_TYPE); ///< runtime type mismatch
|
||||||
LUMIERA_ERROR_DECLARE (ITER_EXHAUST); ///< end of sequence reached
|
LUMIERA_ERROR_DECLARE (ITER_EXHAUST); ///< end of sequence reached
|
||||||
|
LUMIERA_ERROR_DECLARE (CAPACITY); ///< predefined fixed storage capacity
|
||||||
LUMIERA_ERROR_DECLARE (INDEX_BOUNDS); ///< index out of bounds
|
LUMIERA_ERROR_DECLARE (INDEX_BOUNDS); ///< index out of bounds
|
||||||
LUMIERA_ERROR_DECLARE (BOTTOM_VALUE); ///< invalid or NIL value
|
LUMIERA_ERROR_DECLARE (BOTTOM_VALUE); ///< invalid or NIL value
|
||||||
LUMIERA_ERROR_DECLARE (UNCONNECTED); ///< missing connection
|
LUMIERA_ERROR_DECLARE (UNCONNECTED); ///< missing connection
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,7 @@ namespace lumiera {
|
||||||
LUMIERA_ERROR_DEFINE (LIFECYCLE, "Lifecycle assumptions violated");
|
LUMIERA_ERROR_DEFINE (LIFECYCLE, "Lifecycle assumptions violated");
|
||||||
LUMIERA_ERROR_DEFINE (WRONG_TYPE, "runtime type mismatch");
|
LUMIERA_ERROR_DEFINE (WRONG_TYPE, "runtime type mismatch");
|
||||||
LUMIERA_ERROR_DEFINE (ITER_EXHAUST, "end of sequence reached");
|
LUMIERA_ERROR_DEFINE (ITER_EXHAUST, "end of sequence reached");
|
||||||
|
LUMIERA_ERROR_DEFINE (CAPACITY, "predefined fixed storage capacity");
|
||||||
LUMIERA_ERROR_DEFINE (INDEX_BOUNDS, "index out of bounds");
|
LUMIERA_ERROR_DEFINE (INDEX_BOUNDS, "index out of bounds");
|
||||||
LUMIERA_ERROR_DEFINE (BOTTOM_VALUE, "invalid or NIL value");
|
LUMIERA_ERROR_DEFINE (BOTTOM_VALUE, "invalid or NIL value");
|
||||||
LUMIERA_ERROR_DEFINE (UNCONNECTED, "missing connection");
|
LUMIERA_ERROR_DEFINE (UNCONNECTED, "missing connection");
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,8 @@
|
||||||
**
|
**
|
||||||
** - TODO: retro-fit with RefArray interface
|
** - TODO: retro-fit with RefArray interface
|
||||||
**
|
**
|
||||||
|
** @warning deliberately \em not threadsafe
|
||||||
|
**
|
||||||
** @see ScopedCollection_test
|
** @see ScopedCollection_test
|
||||||
** @see scoped-ptrvect.hpp quite similar, but using individual heap pointers
|
** @see scoped-ptrvect.hpp quite similar, but using individual heap pointers
|
||||||
*/
|
*/
|
||||||
|
|
@ -55,6 +57,7 @@
|
||||||
namespace lib {
|
namespace lib {
|
||||||
|
|
||||||
namespace error = lumiera::error;
|
namespace error = lumiera::error;
|
||||||
|
using error::LUMIERA_ERROR_CAPACITY;
|
||||||
using error::LUMIERA_ERROR_INDEX_BOUNDS;
|
using error::LUMIERA_ERROR_INDEX_BOUNDS;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -75,9 +78,10 @@ namespace lib {
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper to hold one Child object.
|
* Storage Frame to hold one Child object.
|
||||||
* The storage will be an heap allocated
|
* The storage will be an heap allocated
|
||||||
* array of such Wrapper objects.
|
* array of such Wrapper objects.
|
||||||
|
* @note doesn't manage the Child
|
||||||
*/
|
*/
|
||||||
class ElementHolder
|
class ElementHolder
|
||||||
: boost::noncopyable
|
: boost::noncopyable
|
||||||
|
|
@ -86,11 +90,6 @@ namespace lib {
|
||||||
mutable char buf_[siz];
|
mutable char buf_[siz];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ElementHolder () { }
|
|
||||||
~ElementHolder ()
|
|
||||||
{
|
|
||||||
destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
I&
|
I&
|
||||||
accessObj() const
|
accessObj() const
|
||||||
|
|
@ -198,12 +197,19 @@ namespace lib {
|
||||||
/* ==== internal callback API for the iterator ==== */
|
/* ==== internal callback API for the iterator ==== */
|
||||||
|
|
||||||
friend void
|
friend void
|
||||||
iterNext (const ScopedCollection*, const I* & pos)
|
iterNext (const ScopedCollection*, I* & pos)
|
||||||
{
|
{
|
||||||
ElementHolder* & storageLocation = reinterpret_cast<ElementHolder* &> (pos);
|
ElementHolder* & storageLocation = reinterpret_cast<ElementHolder* &> (pos);
|
||||||
++storageLocation;
|
++storageLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
friend void
|
||||||
|
iterNext (const ScopedCollection*, const I* & pos)
|
||||||
|
{
|
||||||
|
const ElementHolder* & storageLocation = reinterpret_cast<const ElementHolder* &> (pos);
|
||||||
|
++storageLocation;
|
||||||
|
}
|
||||||
|
|
||||||
/** Implementation of Iteration-logic: detect iteration end.
|
/** Implementation of Iteration-logic: detect iteration end.
|
||||||
* @note the problem here is that this implementation chooses
|
* @note the problem here is that this implementation chooses
|
||||||
* to use two representations of "bottom" (end, invalid).
|
* to use two representations of "bottom" (end, invalid).
|
||||||
|
|
@ -212,8 +218,9 @@ namespace lib {
|
||||||
* iteration end by internal logic (\c numberz_.end() ), we
|
* iteration end by internal logic (\c numberz_.end() ), we
|
||||||
* immediately transform this into the official "bottom"
|
* immediately transform this into the official "bottom"
|
||||||
*/
|
*/
|
||||||
|
template<typename POS>
|
||||||
friend bool
|
friend bool
|
||||||
hasNext (const ScopedCollection* src, const I* & pos)
|
hasNext (const ScopedCollection* src, POS & pos)
|
||||||
{
|
{
|
||||||
REQUIRE (src);
|
REQUIRE (src);
|
||||||
if ((pos) && (pos < src->_access_end()))
|
if ((pos) && (pos < src->_access_end()))
|
||||||
|
|
@ -224,8 +231,8 @@ namespace lib {
|
||||||
return false;
|
return false;
|
||||||
} }
|
} }
|
||||||
|
|
||||||
I* _access_begin() { return &elements_[0]; }
|
I* _access_begin() const { return & elements_[0].accessObj(); }
|
||||||
I* _access_end() { return &elements_[level_]; }
|
I* _access_end() const { return & elements_[level_].accessObj(); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -292,6 +299,98 @@ namespace lib {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** push a new element of default type
|
||||||
|
* to the end of this container
|
||||||
|
* @note EX_STRONG */
|
||||||
|
I& appendNewElement() { return appendNew<I>(); }
|
||||||
|
|
||||||
|
|
||||||
|
template< class TY >
|
||||||
|
TY& //_________________________________________
|
||||||
|
appendNew () ///< add object of type TY, using 0-arg ctor
|
||||||
|
{
|
||||||
|
__ensureSufficientCapacity();
|
||||||
|
TY& newElm = elements_[level_].template create<TY>();
|
||||||
|
++level_;
|
||||||
|
return newElm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template< class TY
|
||||||
|
, typename A1
|
||||||
|
>
|
||||||
|
TY& //_________________________________________
|
||||||
|
appendNew (A1& a1) ///< add object of type TY, using 1-arg ctor
|
||||||
|
{
|
||||||
|
__ensureSufficientCapacity();
|
||||||
|
TY& newElm = elements_[level_].template create<TY>(a1);
|
||||||
|
++level_;
|
||||||
|
return newElm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template< class TY
|
||||||
|
, typename A1
|
||||||
|
, typename A2
|
||||||
|
>
|
||||||
|
TY& //_________________________________________
|
||||||
|
appendNew (A1& a1, A2& a2) ///< add object of type TY, using 2-arg ctor
|
||||||
|
{
|
||||||
|
__ensureSufficientCapacity();
|
||||||
|
TY& newElm = elements_[level_].template create<TY>(a1,a2);
|
||||||
|
++level_;
|
||||||
|
return newElm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template< class TY
|
||||||
|
, typename A1
|
||||||
|
, typename A2
|
||||||
|
, typename A3
|
||||||
|
>
|
||||||
|
TY& //_________________________________________
|
||||||
|
appendNew (A1& a1, A2& a2, A3& a3) ///< add object of type TY, using 3-arg ctor
|
||||||
|
{
|
||||||
|
__ensureSufficientCapacity();
|
||||||
|
TY& newElm = elements_[level_].template create<TY>(a1,a2,a3);
|
||||||
|
++level_;
|
||||||
|
return newElm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template< class TY
|
||||||
|
, typename A1
|
||||||
|
, typename A2
|
||||||
|
, typename A3
|
||||||
|
, typename A4
|
||||||
|
>
|
||||||
|
TY& //_________________________________________
|
||||||
|
appendNew (A1& a1, A2& a2, A3& a3, A4& a4) ///< add object of type TY, using 4-arg ctor
|
||||||
|
{
|
||||||
|
__ensureSufficientCapacity();
|
||||||
|
TY& newElm = elements_[level_].template create<TY>(a1,a2,a3,a4);
|
||||||
|
++level_;
|
||||||
|
return newElm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template< class TY
|
||||||
|
, typename A1
|
||||||
|
, typename A2
|
||||||
|
, typename A3
|
||||||
|
, typename A4
|
||||||
|
, typename A5
|
||||||
|
>
|
||||||
|
TY& //_________________________________________
|
||||||
|
appendNew (A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) ///< add object of type TY, using 5-arg ctor
|
||||||
|
{
|
||||||
|
__ensureSufficientCapacity();
|
||||||
|
TY& newElm = elements_[level_].template create<TY>(a1,a2,a3,a4,a5);
|
||||||
|
++level_;
|
||||||
|
return newElm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* === Element access and iteration === */
|
/* === Element access and iteration === */
|
||||||
|
|
||||||
I&
|
I&
|
||||||
|
|
@ -319,7 +418,7 @@ namespace lib {
|
||||||
|
|
||||||
size_t size () const { return level_; }
|
size_t size () const { return level_; }
|
||||||
// size_type max_size () const { return _Vec::max_size(); }
|
// size_type max_size () const { return _Vec::max_size(); }
|
||||||
// size_type capacity () const { return _Vec::capacity(); }
|
size_t capacity () const { return capacity_; }
|
||||||
bool empty () const { return 0 == level_; }
|
bool empty () const { return 0 == level_; }
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -330,6 +429,13 @@ namespace lib {
|
||||||
// {
|
// {
|
||||||
// UNIMPLEMENTED("raw element access");
|
// UNIMPLEMENTED("raw element access");
|
||||||
// }
|
// }
|
||||||
|
void
|
||||||
|
__ensureSufficientCapacity()
|
||||||
|
{
|
||||||
|
if (level_ >= capacity_)
|
||||||
|
throw error::State ("ScopedCollection exceeding the initially defined capacity"
|
||||||
|
, LUMIERA_ERROR_CAPACITY);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@
|
||||||
** - TODO: detaching of objects...
|
** - TODO: detaching of objects...
|
||||||
** - TODO: retro-fit with RefArray interface
|
** - TODO: retro-fit with RefArray interface
|
||||||
**
|
**
|
||||||
|
** @warning deliberately \em not threadsafe
|
||||||
|
**
|
||||||
** @see scoped-ptrvect-test.cpp
|
** @see scoped-ptrvect-test.cpp
|
||||||
** @see scoped-holder.hpp
|
** @see scoped-holder.hpp
|
||||||
** @see gui::DisplayService usage example
|
** @see gui::DisplayService usage example
|
||||||
|
|
|
||||||
|
|
@ -137,9 +137,8 @@ namespace test{
|
||||||
{
|
{
|
||||||
CHECK (0 == Dummy::checksum());
|
CHECK (0 == Dummy::checksum());
|
||||||
{
|
{
|
||||||
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #877
|
|
||||||
CollD coll(50);
|
CollD coll(50);
|
||||||
for (int i=0; i<coll.capacity(); ++i)
|
for (uint i=0; i<coll.capacity(); ++i)
|
||||||
coll.appendNew<Dummy>(i);
|
coll.appendNew<Dummy>(i);
|
||||||
|
|
||||||
int check=0;
|
int check=0;
|
||||||
|
|
@ -154,8 +153,9 @@ namespace test{
|
||||||
|
|
||||||
|
|
||||||
// Test the const iterator
|
// Test the const iterator
|
||||||
|
CollD const& const_coll (coll);
|
||||||
check = 0;
|
check = 0;
|
||||||
CollD::const_iterator cii = coll.begin();
|
CollD::const_iterator cii = const_coll.begin();
|
||||||
while (cii)
|
while (cii)
|
||||||
{
|
{
|
||||||
CHECK (check == cii->getVal());
|
CHECK (check == cii->getVal());
|
||||||
|
|
@ -176,7 +176,6 @@ namespace test{
|
||||||
VERIFY_ERROR (ITER_EXHAUST, ++ii );
|
VERIFY_ERROR (ITER_EXHAUST, ++ii );
|
||||||
VERIFY_ERROR (ITER_EXHAUST, ++cii );
|
VERIFY_ERROR (ITER_EXHAUST, ++cii );
|
||||||
|
|
||||||
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #877
|
|
||||||
}
|
}
|
||||||
CHECK (0 == Dummy::checksum());
|
CHECK (0 == Dummy::checksum());
|
||||||
}
|
}
|
||||||
|
|
@ -185,7 +184,6 @@ namespace test{
|
||||||
void
|
void
|
||||||
building_RAII_Style()
|
building_RAII_Style()
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED ("building all at once");
|
|
||||||
CHECK (0 == Dummy::checksum());
|
CHECK (0 == Dummy::checksum());
|
||||||
{
|
{
|
||||||
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #877
|
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #877
|
||||||
|
|
@ -252,7 +250,6 @@ namespace test{
|
||||||
void
|
void
|
||||||
building_StackStyle()
|
building_StackStyle()
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED ("pushing new objects successively");
|
|
||||||
CHECK (0 == Dummy::checksum());
|
CHECK (0 == Dummy::checksum());
|
||||||
{
|
{
|
||||||
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #877
|
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #877
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue